feat: Markdown→LaTeX w PDF + dopracowanie kosmogramu (PRE-24, PRE-12 etap 4)
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 10m34s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m35s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 35s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 19s
build-render / build (push) Successful in 45s
build / build (push) Successful in 50s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m46s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m33s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 28s
Testy / Kontrola składni wszystkich warstw (push) Successful in 21s
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 10m34s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m35s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 35s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 19s
build-render / build (push) Successful in 45s
build / build (push) Successful in 50s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 10m46s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m33s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 28s
Testy / Kontrola składni wszystkich warstw (push) Successful in 21s
Dwie rzeczy w jednym PR (na prośbę).
1) MARKDOWN → LATEX w raporcie PDF (usługa render). Tekst od AI to markdown —
świetny w przeglądarce, ale w PDF `**gwiazdki**` i `## kratki` to dosłowny szum.
Nowy markdown_to_latex zamienia je na PRAWDZIWE formatowanie: nagłówki (degradowane
o poziom, żeby wpadły pod nasz \section „Interpretacja natalna", nie obok),
pogrubienia, kursywy, kod, listy punktowe i numerowane, linki (zostaje sam tekst,
URL bezużyteczny w druku).
Skaner liniowy, nie regex na całości — listy i akapity są wielolinijkowe.
Ucieczka znaków LaTeXa działa TAKŻE wewnątrz formatowania: `**wzrost 50%**` daje
`\textbf{wzrost 50\%}`, a nie zakomentowaną resztę linii. Sprawdzone na wrogim
tekście — `\end{document}` i `\input{}` w treści nie wyrywają się z dokumentu
nawet zawinięte w pogrubienie.
2) KOSMOGRAM — etap 4 (dopracowanie):
- Lots na kole: Fortuna ⊗ (jedyny Lot ze standardowym glifem) na promieniu POD
pierścieniem planet i w akcencie — od razu widać, że to punkt wyliczony, nie
ciało. Loty bez glifu (Spirit, Eros…) pomijamy, żeby nie zaśmiecać.
- Tooltipy: natywny <title> w SVG (bez JS-a). Obiekt → nazwa, pozycja, dom,
retrogradacja. Linia aspektu → „Słońce trygon Mars · orb 0.20°" (polskie nazwy
tylko do dymka; obliczenia trzymają angielskie). Fortuna → nazwa i pozycja.
- Stopnie cuspów przy szprychach. W whole sign cuspy są na 0° znaku — wtedy
pomijamy dwanaście zbędnych zer; w systemach kwadratowych (porphyry) stopień
realnie coś mówi, więc go pokazujemy.
Wszystko działa też w motywie druku (PDF): sprawdzone, że mimo Lotów, dymków
i cuspów SVG nadal nie ma zmiennych CSS.
Weryfikacja wizualna (porphyry): Fortuna przy AC, 12 stopni cuspów, 38 dymków
(24 aspekty + 13 obiektów + Fortuna). Testy: +12 markdown (render), +7 etap 4
(prezentacja). Całość: prezentacja 145, render 27.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit was merged in pull request #37.
This commit is contained in:
@@ -269,3 +269,71 @@ def test_print_theme_aspect_colors_have_no_css_vars():
|
||||
svg = chartwheel.render(_chart_with_aspects(), theme="print")
|
||||
assert "var(--" not in svg
|
||||
assert "#a83232" in svg # square napięty w wariancie druku
|
||||
|
||||
|
||||
# ─────────────────────────── etap 4: dopracowanie ────────────────────────
|
||||
|
||||
def test_objects_have_hover_tooltips():
|
||||
"""Najechanie na glif pokazuje nazwę, pozycję, dom i retrogradację (natywny
|
||||
<title> w SVG — bez JS-a)."""
|
||||
chart = _chart_with_objects()
|
||||
for p in chart["positions"]: # fixture jest minimalny; dodaj etykiety
|
||||
p["in_sign"] = "Tau 10°"
|
||||
p["house"] = 9
|
||||
svg = chartwheel.render(chart)
|
||||
assert "<title>" in svg
|
||||
assert "Sun · Tau 10° · dom 9" in svg # nazwa + pozycja + dom w dymku
|
||||
|
||||
|
||||
def test_retrograde_object_says_so_in_tooltip():
|
||||
svg = chartwheel.render(_chart_with_objects()) # Mercury jest Rx
|
||||
assert "retrogradacja" in svg
|
||||
|
||||
|
||||
def test_aspect_lines_have_polish_tooltips():
|
||||
svg = chartwheel.render(_chart_with_aspects())
|
||||
assert "trygon" in svg # Sun–Mars trine
|
||||
assert "kwadratura" in svg # Moon–Mars square
|
||||
assert "orb" in svg
|
||||
|
||||
|
||||
def test_part_of_fortune_is_drawn():
|
||||
"""Fortuna (⊗) na kole — jedyny Lot ze standardowym glifem."""
|
||||
chart = _chart_with_objects()
|
||||
chart["lots"] = [
|
||||
{"name": "Fortune", "longitude": 120.14, "glyph": "⊗", "in_sign": "Leo 0°", "house": 1},
|
||||
{"name": "Spirit", "longitude": 137.66, "glyph": None, "in_sign": "Leo 17°"},
|
||||
]
|
||||
svg = chartwheel.render(chart)
|
||||
assert "⊗" in svg
|
||||
assert "Fortune · " in svg # dymek Lota
|
||||
|
||||
|
||||
def test_lots_without_glyph_are_skipped():
|
||||
"""Loty bez standardowego symbolu (Spirit, Eros…) nie zaśmiecają koła."""
|
||||
chart = _chart_with_objects()
|
||||
chart["lots"] = [{"name": "Spirit", "longitude": 137.66, "glyph": None}]
|
||||
before = chartwheel.render(chart).count("<text")
|
||||
chart["lots"] = []
|
||||
after = chartwheel.render(chart).count("<text")
|
||||
assert before == after # Spirit nic nie dorysował
|
||||
|
||||
|
||||
def test_cusp_degrees_shown_for_quadrant_hidden_for_whole_sign():
|
||||
"""Whole sign: cuspy na 0° znaku → pomijamy zbędne zera. System kwadratowy:
|
||||
stopnie realnie coś mówią, więc je pokazujemy."""
|
||||
whole = _sample_chart() # cuspy na 0/30/60…
|
||||
assert chartwheel.render(whole).count('font-size="6.5"') == 0
|
||||
quad = _sample_chart()
|
||||
for i, c in enumerate(quad["cusps"]): # przesuń cuspy poza granice znaków
|
||||
c["decimal"] = (c["decimal"] + 12.5) % 360.0
|
||||
assert chartwheel.render(quad).count('font-size="6.5"') == 12
|
||||
|
||||
|
||||
def test_print_theme_survives_stage4_features():
|
||||
"""Motyw druku (PDF) nadal bez zmiennych CSS mimo Lotów, dymków i cuspów."""
|
||||
chart = _chart_with_aspects()
|
||||
chart["lots"] = [{"name": "Fortune", "longitude": 120.0, "glyph": "⊗", "in_sign": "Leo 0°"}]
|
||||
svg = chartwheel.render(chart, theme="print")
|
||||
assert "var(--" not in svg
|
||||
assert "⊗" in svg and "<title>" in svg
|
||||
|
||||
Reference in New Issue
Block a user