§
    �ØjÛ  ã                   ó0   — d Z ddlmZmZ d„ Zdedefd„ZdS )a  
Custom feature computation for PyMuPDF extraction results.

This module computes additional features (char_count, word_count, etc.) from
PyMuPDF's text extraction results. These features are computed separately from
PyMuPDF's native features to enable caching in prepare_data.py.
é    )ÚDictÚListc                 óˆ  — | rt          | ¦  «        nd}t          |¦  «        }|                     ¦   «         r!t          |                     ¦   «         ¦  «        nd}|                     d¦  «        |                     d¦  «        z   |                     d¦  «        z   }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }	t          d	„ |D ¦   «         ¦  «        }
t          |¦  «        d
k    r|d         |d         z
  nd}t          |¦  «        d
k    r|d         |d         z
  nd}|dk    r|dk    r||z  nd}|                     dd¦  «        }|                     d|¦  «        }|                     d|¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|dk    r||z  n|}|dk    r||z  n|}|}|                     dd¦  «        }|                     dd¦  «        }|dk    r||z  nd}|dk    r||z  nd}|                     dd¦  «        }i d|“d|“d|“d|“d |“d!|	“d"|
“d|“d|“d|“d|“d|“d|“d#|“d$|“d%|“d&|“||||||d'œ¥S )(a	  
    Compute custom features from text string and bbox.

    Args:
        text: Text string from PyMuPDF
        bbox: Bounding box [x0, y0, x1, y1]
        existing_features: Existing features dict from PyMuPDF

    Returns:
        Dict of computed features
    Ú r   ú.ú!ú?c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)Úisdigit©Ú.0Úcs     ú /Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf/layout/presidio/feature_computation.pyú	<genexpr>z-compute_features_from_text.<locals>.<genexpr>   s*   è è € Ð4Ð4 a�a—i’i‘k”kÐ4Ð4Ð4Ð4Ð4Ð4ó    c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   )Úisupperr   s     r   r   z-compute_features_from_text.<locals>.<genexpr>   s*   è è € Ð6Ð6¨˜Ÿ	š	™œÐ6Ð6Ð6Ð6Ð6Ð6r   c              3   ó   K  — | ]}|d v V — Œ	dS )z.,!?;:()[]{}"'/-N© r   s     r   r   z-compute_features_from_text.<locals>.<genexpr>    s(   è è € ÐGÐG¸˜AÐ!4Ð4ÐGÐGÐGÐGÐGÐGr   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S r   )Úisspacer   s     r   r   z-compute_features_from_text.<locals>.<genexpr>!   s*   è è € Ð9Ð9¨1˜1Ÿ9š9™;œ;Ð9Ð9Ð9Ð9Ð9Ð9r   é   é   ç        é   é   g      ð?Ú	font_sizeg      (@Úfont_size_maxÚfont_size_minÚfont_size_varianceÚis_boldÚ	is_italicÚis_underlineÚ	num_linesÚavg_line_spacingÚfirst_line_indentÚfont_color_grayscaleÚ
char_countÚ
word_countÚsentence_countÚdigit_countÚcapital_countÚpunctuation_countÚwhitespace_countÚblock_widthÚblock_heightÚaspect_ratioÚtext_density©r(   Úavg_line_heightr&   Úavg_line_lengthÚmax_line_lengthr'   )ÚstrÚlenÚstripÚsplitÚcountÚsumÚget)ÚtextÚbboxÚexisting_featuresÚtext_strr)   r*   r+   r,   r-   r.   r/   r0   r1   Ú
block_arear   r   r    r!   r"   r#   r$   r%   r5   r6   r7   r&   r'   r2   r3   r(   s                                 r   Úcompute_features_from_textrD      sµ  € ð !Ð(�s�4‰yŒyˆy b€Hõ �X‘”€JØ*2¯.ª.Ñ*:Ô*:ÐA•�X—^’^Ñ%Ô%Ñ&Ô&Ð&À€JØ—^’^ CÑ(Ô(¨8¯>ª>¸#Ñ+>Ô+>Ñ>ÀÇÂÐPSÑATÔATÑT€NÝÐ4Ð4¨8Ð4Ñ4Ô4Ñ4Ô4€KÝÐ6Ð6¨XÐ6Ñ6Ô6Ñ6Ô6€MÝÐGÐG¸hÐGÑGÔGÑGÔGÐÝÐ9Ð9°Ð9Ñ9Ô9Ñ9Ô9Ðõ (+¨4¡y¤y°A¢~ ~�$�q”'˜D œGÑ#Ð#¸3€KÝ(+¨D©	¬	°Qª¨�4˜”7˜T !œWÑ$Ð$¸C€LØ/:¸Qª¨À<ÐRSÒCSÐCS�˜|Ñ+Ð+ÐY\€Jð "×%Ò% k°4Ñ8Ô8€IØ%×)Ò)¨/¸9ÑEÔE€MØ%×)Ò)¨/¸9ÑEÔE€MØ*×.Ò.Ð/CÀSÑIÔIÐØ×#Ò# I¨qÑ1Ô1€GØ!×%Ò% k°1Ñ5Ô5€IØ$×(Ò(¨¸Ñ;Ô;€Lð "×%Ò% k°1Ñ5Ô5€IØ2;¸a²-°-�l YÑ.Ð.À\€OØ09¸A²°�j 9Ñ,Ð,À:€OØ €OØ(×,Ò,Ð-?ÀÑEÔEÐØ)×-Ò-Ð.AÀ3ÑGÔGÐð 2>ÀÒ1AÐ1A�; Ñ-Ð-Às€LØ.8¸1ªn¨n�: 
Ñ*Ð*À#€LØ,×0Ò0Ð1GÈÑMÔMÐðØ�jðà�jðð 	˜.ðð 	�{ð	ð
 	˜ðð 	Ð.ðð 	Ð,ðð 	˜ðð 	˜ðð 	Ð0ðð 	�7ðð 	�Yðð 	˜ðð 	�{ðð 	˜ðð  	˜ð!ð" 	˜ð#ð$ !5Ø*Ø,Ø*Ø*Ø.ð/ð ð ð r   ÚresultÚreturnc                 óô  — |                       dg ¦  «        }|                       dg ¦  «        }|                       dg ¦  «        }|r|s| S 	 |ržt          |¦  «        t          |¦  «        k    r~t          |¦  «        D ]m\  }}|t          |¦  «        k    r nT|t          |¦  «        k     r||         ng d¢}||         }t          |||¦  «        }||                              |¦  «         Œnnvt          t          |¦  «        ¦  «        D ]Y}||                              i dd“dd“dd“d	d“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dddddddœ¥¦  «         ŒZn# t          $ r
}	Y d}	~	nd}	~	ww xY w| S )a  
    Add custom features to PyMuPDF extraction result.
    This allows features to be cached along with PyMuPDF data.

    Args:
        result: Dict with 'bboxes', 'custom_features', 'text' keys

    Returns:
        Modified result dict with custom features added
    Úcustom_featuresÚbboxesr?   )r   r   r   r   r)   r   r*   r+   r,   r-   r.   r/   r   r   r    r!   r"   r#   r$   r0   r1   r2   r3   r4   N)r>   r9   Ú	enumeraterD   ÚupdateÚrangeÚ	Exception)
rE   Úcustom_features_listÚpymupdf_bboxesÚpymupdf_textsÚir?   r@   rA   ÚfeaturesÚes
             r   Úadd_custom_features_to_resultrT   Y   sy  € ð "Ÿ:š:Ð&7¸Ñ<Ô<ÐØ—Z’Z ¨"Ñ-Ô-€NØ—J’J˜v rÑ*Ô*€Màð  ~ð ØˆðØð 	�S Ñ/Ô/µ3Ð7KÑ3LÔ3LÒLÐLÝ$ ]Ñ3Ô3ð 
9ð 
9‘��4Ø�Ð0Ñ1Ô1Ò1Ð1Ø�Eð -.µ°NÑ0CÔ0CÒ,CÐ,C�~ aÔ(Ð(ÈÈÈ�Ø$8¸Ô$;Ð!õ 6°d¸DÐBSÑTÔT�Ø$ QÔ'×.Ò.¨xÑ8Ô8Ð8Ð8øõ �3Ð3Ñ4Ô4Ñ5Ô5ð 
ð 
�Ø$ QÔ'×.Ò.ð 	0Ø  !ð	0Ø%1°1ð	0Ø6FÈð	0à! 1ð	0à&5°qð	0à:MÈqð	0ð '¨ð	0ð ,;¸Cð	0ð BQÐRUð	0ð )¨#ð		0ð 09¸!ð		0ð >IÈ!ð		0ð
 # Að	0ð
 (5°cð	0ð
 <JÈ3ð	0ð # Cð	0ð *8¸ð	0ð WZØ'*ÀÐX[Ø'(¸sð	0ð 	0ð 	0ñ 	ô 	ð 	ð 	øøõ ð ð ð ð 	ˆˆˆˆøøøøðøøøð
 €Ms   Á
DE! Å!
E5Å0E5N)Ú__doc__Útypingr   r   rD   rT   r   r   r   ú<module>rW      sh   ððð ð Ð Ð Ð Ð Ð Ð Ð ðJð Jð JðZ2¨$ð 2°4ð 2ð 2ð 2ð 2ð 2ð 2r   