Ë
    IB™jéF  ã                   óh   — d dl Z d dlZd dlmc mZ d„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zy)é    Nc                 ó  — d| j                   v r|| j                   d   }g }|j                  d«      D ]8  }|j                  «       }|j                  d«      rŒ%|sŒ(|j	                  |«       Œ: dj                  |«      | j                   d<   yy)z1
    Remove root SVG background-color style.
    Ústyleú;zbackground-color:ú; N)ÚattribÚsplitÚstripÚ
startswithÚappendÚjoin)Úrootr   ÚpartsÚitems       ú5/var/www/html/Astrologybackend/backend/chart_utils.pyÚ_clean_root_backgroundr      sƒ   € ð �$—+‘+ÑØ—‘˜GÑ$ˆØˆà—K‘K Ó$ò 	#ˆDØ—:‘:“<ˆDØ�‰Ð2Ô3ØÚØ—‘˜TÕ"ð	#ð  $Ÿy™y¨Ó/ˆ�‰�GÒð ó    c                 ó*  — t        | «      D ]…  }|j                  j                  «       }|j                  d«      s4|j                  d«      s#|j                  d«      s|j                  d«      sŒb|j	                  t        j                  |«      «       Œ‡ y)zu
    Keep defs/style/metadata/desc because glyphs, fonts, symbols,
    gradients, and styles may depend on them.
    Údefsr   ÚmetadataÚdescN)ÚlistÚtagÚlowerÚendswithr   ÚcopyÚdeepcopy)r   Únew_rootÚchildr   s       r   Ú_copy_svg_defs_and_stylesr      sn   € ô
 �d“ò 	2ˆØ�i‰i�o‰oÓˆð �L‰L˜Ô Ø�|‰|˜GÔ$Ø�|‰|˜JÔ'Ø�|‰|˜FÕ#à�O‰OœDŸM™M¨%Ó0Õ1ñ	2r   c                 ó¨  — | j                  d|«      D ]½  }|j                  j                  dd«      }d|v r}g }|j                  d«      D ]I  }|j	                  «       }|j                  d«      r|j                  d«       Œ6|sŒ9|j                  |«       ŒK dj                  |«      |j                  d<   d|j                  v sŒ¯d	|j                  d<   Œ¿ y
)z?
    Remove solid fill from wheel background circles only.
    z.//svg:circler   Ú zfill:r   z	fill:noner   ÚfillÚnoneN)Úfindallr   Úgetr   r	   r
   r   r   )ÚgroupÚnsÚcircler   r   r   s         r   Ú_remove_background_from_circlesr)   )   s¾   € ð —-‘- °Ó4ò +ˆØ—‘×!Ñ! '¨2Ó.ˆà�eÑØˆEàŸ™ CÓ(ò '�Ø—z‘z“|�à—?‘? 7Ô+Ø—L‘L Õ-ÚØ—L‘L Õ&ð'ð &*§Y¡Y¨uÓ%5ˆF�M‰M˜'Ñ"à�V—]‘]Ò"Ø$*ˆF�M‰M˜&Ò!ñ#+r   c                 ó®   — |D ]P  }| j                  d|«      D ]9  }|j                  j                  |«      |k(  sŒ"t        j                  |«      c c S  ŒR y)z8
    Find Kerykeion SVG group by kr:node attribute.
    z.//svg:gN)r$   r   r%   r   r   )r   r'   Úkr_node_attrÚ
node_namesÚ	node_nameÚgs         r   Ú_find_kerykeion_noder/   A   sV   € ð  ò (ˆ	Ø—‘˜j¨"Ó-ò 	(ˆAØ�x‰x�|‰|˜LÓ)¨YÓ6Ü—}‘} QÓ'Ô'ñ	(ð(ð
 r   c                 óœ  — 	 t        j                  | «      }|j                  «       }t        j                  d|j
                  «      }|r|j                  d«      nd}t        j                  d|«       t        j                  dd«       t        j                  dd«       d	|i}d
}t        j                  |j
                  |j                  «      }|j                  dd«       |j                  dd«       |j                  dd«       |j                  dd«       t        |«       t        ||«       t        |||dg«      }	|	€t        d«       yd|	j                  v rd|	j                  d<   t        |	|«       |j!                  |	«       t        j"                  |«      j%                  |dd¬«       y# t&        $ r}
t        d|
«       Y d}
~
yd}
~
ww xY w)zw
    Birth chart wheel extractor.

    Keeps only:
    kr:node="Full_Wheel"

    Output:
    clean wheel-only SVG.
    ú\{(.*)\}é   úhttp://www.w3.org/2000/svgr!   Úxlinkúhttp://www.w3.org/1999/xlinkÚkrúhttps://www.kerykeion.net/Úsvgú {https://www.kerykeion.net/}nodeÚviewBoxz0 0 480 480Úwidthú100%ÚheightÚpreserveAspectRatioúxMidYMid meetÚ
Full_WheelNzFull_Wheel not foundFÚ	transformúutf-8T©ÚencodingÚxml_declarationzBirth chart extract error:©ÚETÚparseÚgetrootÚreÚmatchr   r&   Úregister_namespaceÚElementr   Úsetr   r   r/   Úprintr)   r   ÚElementTreeÚwriteÚ	Exception)Úfull_svgÚ
output_svgÚtreer   ÚmÚsvg_nsr'   r+   r   Ú
full_wheelÚes              r   Úextract_wheelrZ   M   s‘  € ð4Ü�x‰x˜Ó!ˆØ�|‰|‹~ˆä�H‰H�[ $§(¡(Ó+ˆÙ �—‘˜”Ð&Bˆä
×Ñ˜b &Ô)Ü
×Ñ˜gÐ'EÔFÜ
×Ñ˜dÐ$@ÔAà�Vˆ_ˆØ9ˆä—:‘:˜dŸh™h¨¯©Ó4ˆà�‰�Y Ô.Ø�‰�W˜fÔ%Ø�‰�X˜vÔ&Ø�‰Ð*¨OÔ<ä˜xÔ(Ü! $¨Ô1ä)ØØØØˆNó	
ˆ
ð ÐÜÐ(Ô)Øà˜*×+Ñ+Ñ+Ø-/ˆJ×Ñ˜kÑ*ä'¨
°BÔ7à�‰˜
Ô#ä
�‰�xÓ ×&Ñ&ØØØ ð 	'ô 	
ð øäò ÜÐ*¨AÔ.Üûðús   ‚EF, Å
A!F, Æ,	GÆ5GÇGc                 ó  — 	 t        j                  | «      }|j                  «       }t        j                  d|j
                  «      }|r|j                  d«      nd}t        j                  d|«       t        j                  dd«       t        j                  dd«       d	|i}d
}t        j                  |j
                  |j                  «      }|j                  dd«       |j                  dd«       |j                  dd«       |j                  dd«       t        |«       t        ||«       t        |||g d¢«      }	|	€t        d«       yd|	j                  v rd|	j                  d<   t        |	|«       t        j                  d|› d�«      }
|
j                  dd«       |
j!                  |	«       |j!                  |
«       t        j"                  |«      j%                  |dd¬«       y# t&        $ r}t        d|«       Y d}~yd}~ww xY w)a  
    Synastry chart wheel extractor.

    It removes:
    - left details
    - right tables
    - aspect grid table
    - planet position tables

    Keeps only wheel group from Kerykeion SVG.

    Output:
    charts/synastry-chart/person_synastry_chart.svg
    r1   r2   r3   r!   r4   r5   r6   r7   r8   r9   r:   z0 0 600 600r;   r<   r=   r>   r?   )r@   ÚSynastry_WheelÚWheelÚChart_WheelNzSynastry wheel group not foundFrA   ú{ú}gztranslate(60, 40) scale(1.0)rB   TrC   zSynastry extract error:rF   )rS   rT   rU   r   rV   rW   r'   r+   r   Úsynastry_wheelÚwrapperrY   s               r   Úextract_synastry_wheelrc   Ž   sÌ  € ðBÜ�x‰x˜Ó!ˆØ�|‰|‹~ˆä�H‰H�[ $§(¡(Ó+ˆÙ �—‘˜”Ð&Bˆä
×Ñ˜b &Ô)Ü
×Ñ˜gÐ'EÔFÜ
×Ñ˜dÐ$@ÔAà�Vˆ_ˆØ9ˆä—:‘:˜dŸh™h¨¯©Ó4ˆð 	�‰�Y Ô.Ø�‰�W˜fÔ%Ø�‰�X˜vÔ&Ø�‰Ð*¨OÔ<ä˜xÔ(Ü! $¨Ô1ô .ØØØòó	

ˆð Ð!ÜÐ2Ô3Øð ˜.×/Ñ/Ñ/Ø13ˆN×!Ñ! +Ñ.ä'¨¸Ô;ô —*‘*˜r & ¨Ð-Ó.ˆØ�‰�KÐ!?Ô@Ø�‰�~Ô&à�‰˜Ô ä
�‰�xÓ ×&Ñ&ØØØ ð 	'ô 	
ð øäò ÜÐ'¨Ô+Üûðús   ‚EG) ÅBG) Ç)	HÇ2HÈHc                 óþ  — 	 t        j                  | «      }|j                  «       }t        j                  d|j
                  «      }|r|j                  d«      nd}t        j                  d|«       t        j                  dd«       t        j                  dd«       d	|i}d
}t        j                  |j
                  |j                  «      }|j                  dd«       |j                  dd«       |j                  dd«       |j                  dd«       t        |«       t        ||«       t        |||g d¢«      }	|	€t        d«       yd|	j                  v rd|	j                  d<   t        j                  d|› d�«      }
|
j                  dd«       |
j                  |	«       |j                  |
«       t        j                   |«      j#                  |dd¬«       y# t$        $ r}t        d|«       Y d}~yd}~ww xY w)zÜ
    Composite chart wheel extractor.

    Removes:
    - title
    - side panels
    - tables
    - aspect lists

    Keeps:
    - wheel
    - zodiac signs
    - planets
    - houses
    - aspect lines
    - colors
    r1   r2   r3   r!   r4   r5   r6   r7   r8   r9   r:   ú0 0 640 640r;   r<   r=   r>   r?   )r@   ÚComposite_Wheelr]   r^   NzComposite wheel group not foundFrA   r_   r`   útranslate(55, 45) scale(1.08)rB   TrC   zComposite chart extract error:©rG   rH   rI   rJ   rK   r   r&   rL   rM   r   rN   r   r   r/   rO   r   rP   rQ   rR   )rS   rT   rU   r   rV   rW   r'   r+   r   Úcomposite_wheelrb   rY   s               r   Úextract_composite_wheelrj   á   s»  € ð$?Ü�x‰x˜Ó!ˆØ�|‰|‹~ˆä�H‰H�[ $§(¡(Ó+ˆÙ �—‘˜”Ð&Bˆä
×Ñ˜b &Ô)Ü
×Ñ˜gÐ'EÔFÜ
×Ñ˜dÐ$@ÔAà�Vˆ_ˆØ9ˆä—:‘:˜dŸh™h¨¯©Ó4ˆà�‰�Y Ô.Ø�‰�W˜fÔ%Ø�‰�X˜vÔ&Ø�‰Ð*¨OÔ<ä˜xÔ(Ü! $¨Ô1ä.ØØØòó	

ˆð Ð"ÜÐ3Ô4Øà˜/×0Ñ0Ñ0Ø24ˆO×"Ñ" ;Ñ/ô —*‘*˜r & ¨Ð-Ó.ˆØ�‰�KÐ!@ÔAØ�‰�Ô'à�‰˜Ô ä
�‰�xÓ ×&Ñ&ØØØ ð 	'ô 	
ð øäò ÜÐ.°Ô2Üûðúó   ‚EG ÅBG Ç	G<Ç&G7Ç7G<c                 óþ  — 	 t        j                  | «      }|j                  «       }t        j                  d|j
                  «      }|r|j                  d«      nd}t        j                  d|«       t        j                  dd«       t        j                  dd«       d	|i}d
}t        j                  |j
                  |j                  «      }|j                  dd«       |j                  dd«       |j                  dd«       |j                  dd«       t        |«       t        ||«       t        |||g d¢«      }	|	€t        d«       yd|	j                  v rd|	j                  d<   t        j                  d|› d�«      }
|
j                  dd«       |
j                  |	«       |j                  |
«       t        j                   |«      j#                  |dd¬«       y# t$        $ r}t        d|«       Y d}~yd}~ww xY w)ad  
    Solar Return / Transit dual-wheel extractor.

    Removes:
    - top title
    - left natal/transit details
    - right planet tables
    - house position comparison
    - bottom transit aspects table

    Keeps:
    - chart wheel
    - zodiac signs
    - planets
    - house lines/numbers
    - aspect lines
    - degree marks
    - wheel colors
    r1   r2   r3   r!   r4   r5   r6   r7   r8   r9   r:   z0 0 620 620r;   r<   r=   r>   r?   )r@   ÚTransit_Wheelr\   r]   r^   Nz"Solar Return wheel group not foundFrA   r_   r`   ztranslate(35, 25) scale(1.05)rB   TrC   z!Solar Return chart extract error:rh   )rS   rT   rU   r   rV   rW   r'   r+   r   Úsolar_wheelrb   rY   s               r   Úextract_solar_return_wheelro   4  sÂ  € ð(DÜ�x‰x˜Ó!ˆØ�|‰|‹~ˆä�H‰H�[ $§(¡(Ó+ˆÙ �—‘˜”Ð&Bˆä
×Ñ˜b &Ô)Ü
×Ñ˜gÐ'EÔFÜ
×Ñ˜dÐ$@ÔAà�Vˆ_ˆØ9ˆä—:‘:˜dŸh™h¨¯©Ó4ˆð 	�‰�Y Ô.Ø�‰�W˜fÔ%Ø�‰�X˜vÔ&Ø�‰Ð*¨OÔ<ä˜xÔ(Ü! $¨Ô1ä*ØØØòó	
ˆð ÐÜÐ6Ô7Øð ˜+×,Ñ,Ñ,Ø.0ˆK×Ñ˜{Ñ+ô
 —*‘*˜r & ¨Ð-Ó.ˆð 	�‰�KÐ!@ÔAØ�‰�{Ô#à�‰˜Ô ä
�‰�xÓ ×&Ñ&ØØØ ð 	'ô 	
ð øäò ÜÐ1°1Ô5Üûðúrk   c                 ó@  ‡— 	 t        j                  | «      }|j                  «       }t        j                  d|j
                  «      }|r|j                  d«      nd}t        j                  d|«       t        j                  dd«       t        j                  dd«       d	|i}d
Šˆfd„} ||g d¢«      }|€t        d«       yd|j                  v rd|j                  d<   t        j                  |j
                  |j                  «      }	|	j                  dd«       |	j                  dd«       |	j                  dd«       |	j                  dd«       	 t        |	«       	 t        ||	«       t        j                  d|› d�«      }
|
j                  dd«       |
j                  |«       |	j                  |
«       t        j                   |	«      j#                  |dd¬«       y# t        $ r Y Œ�w xY w# t        $ r Y Œ�w xY w# t        $ r}t        d|«       Y d}~yd}~ww xY w)aO  
    Extract ONLY the Lunar Return wheel from a full Kerykeion dual-wheel SVG.

    Removes:
    - title
    - left natal/transit details
    - right tables
    - bottom aspect table

    Keeps:
    - wheel
    - zodiac signs
    - planets
    - house lines / house numbers
    - aspect lines
    - degree marks
    - wheel colors
    r1   r2   r3   r!   r4   r5   r6   r7   r8   r9   c                 óž   •— | j                  «       D ]9  }|j                  j                  ‰d«      }||v sŒ$t        j                  |«      c S  y )Nr!   )Úiterr   r%   r   r   )Ú	root_nodeÚ
candidatesÚelemr-   r+   s       €r   Úfind_kerykeion_nodez7extract_lunar_return_wheel.<locals>.find_kerykeion_node¯  sI   ø€ Ø!Ÿ™Ó(ò /�Ø ŸK™KŸO™O¨L¸"Ó=�	Ø 
Ò*ÜŸ=™=¨Ó.Ò.ð/ð r   ©rm   r@   r\   r]   r^   Nz"Lunar Return wheel group not foundFrA   r:   re   r;   r<   r=   r>   r?   r_   r`   rg   rB   TrC   z!Lunar Return chart extract error:)rG   rH   rI   rJ   rK   r   r&   rL   rO   r   rM   rN   r   rR   r   r   rP   rQ   )rS   rT   rU   r   rV   rW   r'   rv   Úlunar_wheelr   rb   rY   r+   s               @r   Úextract_lunar_return_wheelry   Ž  sö  ø€ ð&PÜ�x‰x˜Ó!ˆØ�|‰|‹~ˆä�H‰H�[ $§(¡(Ó+ˆÙ �—‘˜”Ð&Bˆä
×Ñ˜b &Ô)Ü
×Ñ˜gÐ'EÔFÜ
×Ñ˜dÐ$@ÔAà�Vˆ_ˆØ9ˆô	ñ *Øòó	
ˆð ÐÜÐ6Ô7Øð ˜+×,Ñ,Ñ,Ø.0ˆK×Ñ˜{Ñ+ô —:‘:˜dŸh™h¨¯©Ó4ˆØ�‰�Y Ô.Ø�‰�W˜fÔ%Ø�‰�X˜vÔ&Ø�‰Ð*¨OÔ<ð	Ü" 8Ô,ð
	Ü% d¨HÔ5ô
 —*‘*˜r & ¨Ð-Ó.ˆð 	�‰�KÐ!@ÔAØ�‰�{Ô#à�‰˜Ô ä
�‰�xÓ ×&Ñ&ØØØ ð 	'ô 	
ð øô3 ò 	Ùð	ûô ò 	Ùð	ûô* ò ÜÐ1°1Ô5Üûðúsb   ƒB?G> ÃBG> ÅG  ÅG/ Å+A4G> Ç 	G,Ç)G> Ç+G,Ç,G> Ç/	G;Ç8G> Ç:G;Ç;G> Ç>	HÈHÈHc                 óþ  — 	 t        j                  | «      }|j                  «       }t        j                  d|j
                  «      }|r|j                  d«      nd}t        j                  d|«       t        j                  dd«       t        j                  dd«       d	|i}d
}t        j                  |j
                  |j                  «      }|j                  dd«       |j                  dd«       |j                  dd«       |j                  dd«       t        |«       t        ||«       t        |||g d¢«      }	|	€t        d«       yd|	j                  v rd|	j                  d<   t        j                  d|› d�«      }
|
j                  dd«       |
j                  |	«       |j                  |
«       t        j                   |«      j#                  |dd¬«       y# t$        $ r}t        d|«       Y d}~yd}~ww xY w)a»  
    Transit chart wheel extractor.

    Removes:
    - title
    - left details
    - right planet tables
    - bottom aspect tables

    Keeps only:
    - transit/natal wheel
    - zodiac signs
    - planets
    - houses
    - aspect lines
    - degree marks
    - wheel colors

    Usage:
        extract_transit_wheel(
            "charts/transit/full_transit_chart.svg",
            "charts/transit/transit_chart_wheel.svg"
        )
    r1   r2   r3   r!   r4   r5   r6   r7   r8   r9   r:   re   r;   r<   r=   r>   r?   rw   NzTransit wheel group not foundFrA   r_   r`   rg   rB   TrC   zTransit chart extract error:rh   )rS   rT   rU   r   rV   rW   r'   r+   r   Útransit_wheelrb   rY   s               r   Úextract_transit_wheelr|   ó  sÂ  € ð2FÜ�x‰x˜Ó!ˆØ�|‰|‹~ˆä�H‰H�[ $§(¡(Ó+ˆÙ �—‘˜”Ð&Bˆä
×Ñ˜b &Ô)Ü
×Ñ˜gÐ'EÔFÜ
×Ñ˜dÐ$@ÔAà�Vˆ_ˆØ9ˆä—:‘:˜dŸh™h¨¯©Ó4ˆð 	�‰�Y Ô.Ø�‰�W˜fÔ%Ø�‰�X˜vÔ&Ø�‰Ð*¨OÔ<ä˜xÔ(Ü! $¨Ô1ä,ØØØòó	
ˆð Ð ÜÐ1Ô2Øð ˜-×.Ñ.Ñ.Ø02ˆM× Ñ  Ñ-ô —*‘*˜r & ¨Ð-Ó.ˆð
 	�‰�KÐ!@ÔAØ�‰�}Ô%à�‰˜Ô ä
�‰�xÓ ×&Ñ&ØØØ ð 	'ô 	
ð øäò ÜÐ,¨aÔ0Üûðúrk   c                 óþ  — 	 t        j                  | «      }|j                  «       }t        j                  d|j
                  «      }|r|j                  d«      nd}t        j                  d|«       t        j                  dd«       t        j                  dd«       d	|i}d
}t        j                  |j
                  |j                  «      }|j                  dd«       |j                  dd«       |j                  dd«       |j                  dd«       t        |«       t        ||«       t        |||g d¢«      }	|	€t        d«       yd|	j                  v rd|	j                  d<   t        j                  d|› d�«      }
|
j                  dd«       |
j                  |	«       |j                  |
«       t        j                   |«      j#                  |dd¬«       y# t$        $ r}t        d|«       Y d}~yd}~ww xY w)a0  
    Progressed chart wheel extractor.

    Removes:
    - title
    - left natal/transit details
    - right planet tables
    - bottom aspect tables

    Keeps only:
    - progressed/natal wheel
    - zodiac signs
    - planets
    - houses
    - aspect lines
    - degree marks
    - wheel colors
    r1   r2   r3   r!   r4   r5   r6   r7   r8   r9   r:   re   r;   r<   r=   r>   r?   rw   Nz Progressed wheel group not foundFrA   r_   r`   rg   rB   TrC   zProgressed chart extract error:rh   )rS   rT   rU   r   rV   rW   r'   r+   r   Úprogressed_wheelrb   rY   s               r   Úextract_progressed_wheelr   U  s½  € ð&;Ü�x‰x˜Ó!ˆØ�|‰|‹~ˆä�H‰H�[ $§(¡(Ó+ˆÙ �—‘˜”Ð&Bˆä
×Ñ˜b &Ô)Ü
×Ñ˜gÐ'EÔFÜ
×Ñ˜dÐ$@ÔAà�Vˆ_ˆØ9ˆä—:‘:˜dŸh™h¨¯©Ó4ˆØ�‰�Y Ô.Ø�‰�W˜fÔ%Ø�‰�X˜vÔ&Ø�‰Ð*¨OÔ<ä˜xÔ(Ü! $¨Ô1ä/ØØØòó	
Ðð Ð#ÜÐ4Ô5ØàÐ*×1Ñ1Ñ1Ø35Ð×#Ñ# KÑ0ä—*‘*˜r & ¨Ð-Ó.ˆØ�‰�KÐ!@ÔAØ�‰Ð'Ô(à�‰˜Ô ä
�‰�xÓ ×&Ñ&ØØØ ð 	'ô 	
ð øäò ÜÐ/°Ô3Üûðúrk   )r   rJ   Úxml.etree.ElementTreeÚetreerP   rG   r   r   r)   r/   rZ   rc   rj   ro   ry   r|   r   © r   r   ú<module>rƒ      sT   ðÛ Û 	ß "Ð "ò0ò$2ò"+ò0	ò>òBQòfQòfXòtcòJ_óDNr   