§
    �Øj—-  ã                   óÊ   — d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	  e
h d£¦  «        Z e¦   «         Z G d	„ d
e¦  «        Zdedefd„Zdefd„Zdefd„Zdedefd„Zd„ ZdS )a   ChunkedDocument: the return type of to_chunks.

A Sequence[Chunk] carrying the element registry, the table/figure/section
views (bidirectionally linked to chunks), a section hierarchy tree,
ingestion diagnostics, and cheap re-chunking from retained units.
é    N)ÚSequence)Úfields)ÚMappingProxyTypeé   )ÚSectionNode>   Ú
max_tokensÚ
min_tokensÚ
table_modeÚmerge_small_chunksÚbreakpoint_thresholdÚrespect_section_startsc            	       ó   — e Zd ZdZdddddddddœd„Zd„ Zd„ Zd	„ Zed
e	fd„¦   «         Z
ed
efd„¦   «         Zed
efd„¦   «         Zefdefd„Zddœded
efd„Zddœded
efd„Zd„ Zed
efd„¦   «         Zddœdedz  fd„Zddœdedz  fd„ZdS )ÚChunkedDocumenta!  Retrieval-ready chunks plus document-level structure.

    - Sequence protocol: ``len(cd)``, ``cd[i]``, iteration, slicing.
    - ``elements``: every layout box the parser saw (header/footer included),
      addressable as ``p{page}.b{box}``.
    - ``tables`` / ``figures`` / ``sections``: views linked to chunks both
      ways (view.chunk_id(s) <-> chunk.metadata.table_ids/figure_ids/
      section_id).
    - ``hierarchy``: sections as a tree of SectionNode (root level 0).
    - ``diagnostics``: structured input for an ingestion gate.
    © Nr   )ÚelementsÚtablesÚfiguresÚsectionsÚparamsÚdocÚ	all_unitsÚheader_footer_excludedc                óì  — t          |¦  «        | _        t          |¦  «        | _        t          |¦  «        | _        t          |¦  «        | _        t          |¦  «        | _        t          t          |pi ¦  «        ¦  «        | _	        || _
        t          |¦  «        | _        |	| _        d | _        d | _        d | _        | j        D ]-}
|
j        \  }}t          | j        ||…         ¦  «        |
_        Œ.d S ©N)ÚtupleÚ_chunksÚlistr   r   r   r   r   Údictr   Ú_docÚ
_all_unitsÚ_header_footer_excludedÚ_textÚ_by_idÚ
_hierarchyÚelement_spanÚ	_elements)ÚselfÚchunksr   r   r   r   r   r   r   r   ÚsÚloÚhis                ú¢/Users/tedpeters/Documents/Projects/Claude Projects/Misc Tools/notename-sheets/.venv/lib/python3.11/site-packages/pymupdf4llm/helpers/chunking/chunked_document.pyÚ__init__zChunkedDocument.__init__,   sÕ   € õ ˜V‘}”}ˆŒÝ˜X™œˆŒÝ˜6‘l”lˆŒÝ˜G‘}”}ˆŒÝ˜X™œˆŒÝ&¥t¨F¨L°bÑ'9Ô'9Ñ:Ô:ˆŒØˆŒ	Ý˜y™/œ/ˆŒØ'=ˆÔ$ØˆŒ
ØˆŒØˆŒð ”ð 	6ð 	6ˆAØ”^‰FˆB�Ý ¤¨b°¨eÔ 4Ñ5Ô5ˆAŒKˆKð	6ð 	6ó    c                 ó*   — t          | j        ¦  «        S r   )Úlenr   ©r'   s    r,   Ú__len__zChunkedDocument.__len__D   s   € Ý�4”<Ñ Ô Ð r.   c                 óz   — t          |t          ¦  «        rt          | j        |         ¦  «        S | j        |         S r   )Ú
isinstanceÚslicer   r   )r'   Úindexs     r,   Ú__getitem__zChunkedDocument.__getitem__G   s6   € Ý�e�UÑ#Ô#ð 	-Ý˜œ UÔ+Ñ,Ô,Ð,ØŒ|˜EÔ"Ð"r.   c           
      ó°   — dt          | j        ¦  «        › dt          | j        ¦  «        › dt          | j        ¦  «        › dt          | j        ¦  «        › d�	S )NzChunkedDocument(chunks=z	, tables=z
, figures=z, sections=ú))r0   r   r   r   r   r1   s    r,   Ú__repr__zChunkedDocument.__repr__L   sl   € ð2­#¨d¬lÑ*;Ô*;ð 2ð 2Ý˜dœkÑ*Ô*ð2ð 2Ý69¸$¼,Ñ6GÔ6Gð2ð 2å ¤Ñ.Ô.ð2ð 2ð 2ð 	3r.   Úreturnc                 ó   — | j         S )z=The chunks as a tuple (== tuple(self)); explicit-access form.©r   r1   s    r,   r(   zChunkedDocument.chunksQ   s   € ð Œ|Ðr.   c                 óp   — | j         €)d                     d„ | j        D ¦   «         ¦  «        | _         | j         S )z6All chunk text joined in reading order (lazy, cached).Nz

c              3   ó$   K  — | ]}|j         V — Œd S r   )Útext)Ú.0Úcs     r,   ú	<genexpr>z'ChunkedDocument.text.<locals>.<genexpr>\   s$   è è € Ð$BÐ$B° Q¤VÐ$BÐ$BÐ$BÐ$BÐ$BÐ$Br.   )r"   Újoinr   r1   s    r,   r@   zChunkedDocument.textX   s8   € ð Œ:ÐØŸšÐ$BÐ$B°T´\Ð$BÑ$BÔ$BÑBÔBˆDŒJØŒzÐr.   c                 óÚ  — | j         €Þt          ¦   «         }|g}| j        D ]¾}t          |j        |j        |j        ¬¦  «        }t          |¦  «        dk    rS|d         j        |j        k    r=|                     ¦   «          t          |¦  «        dk    r|d         j        |j        k    °=|d         j         	                    |¦  «         | 	                    |¦  «         Œ¿|| _         | j         S )z5Sections nested as a tree; the root node has level 0.N)ÚtitleÚlevelÚ
section_idr   éÿÿÿÿ)
r$   r   r   rF   rG   Úidr0   ÚpopÚchildrenÚappend)r'   ÚrootÚstackr)   Únodes        r,   Ú	hierarchyzChunkedDocument.hierarchya   sÞ   € ð Œ?Ð"Ý‘=”=ˆDØ�FˆEØ”]ð #ð #�Ý"¨¬¸¼Ø./¬dð4ñ 4ô 4�å˜%‘j”j 1’n�n¨¨r¬¬¸A¼GÒ)CÐ)CØ—I’I‘K”K�Kõ ˜%‘j”j 1’n�n¨¨r¬¬¸A¼GÒ)CÐ)Cà�b”	Ô"×)Ò)¨$Ñ/Ô/Ð/Ø—’˜TÑ"Ô"Ð"Ð"Ø"ˆDŒOØŒÐr.   rJ   c                 óZ  — | j         €Wi }| j        D ]}|||j        <   Œ| j        | j        | j        fD ]}|D ]}|||j        <   ŒŒ| j        D ]}|||j        <   Œ|| _         |r | j                              |t          ¦  «        nt          }|t          u r|t          u rt          |¦  «        ‚|S |S )z�Look up any public id: c{n}, t{n}, f{n}, s{n}, p{page}.b{box}.

        Raises KeyError for an unknown id unless *default* is given.
        )
r#   r   rJ   r   r   r   r   ÚgetÚ_MISSINGÚKeyError)	r'   rJ   Údefaultr6   rB   ÚgroupÚitemÚelÚfounds	            r,   rS   zChunkedDocument.gets   sÜ   € ð
 Œ;ÐØˆEØ”\ð  ð  �Ø��a”d‘�Øœ+ t¤|°T´]ÐCð *ð *�Ø!ð *ð *�DØ%)�E˜$œ'‘N�Nð*à”mð "ð "�Ø!��b”e‘�ØˆDŒKà13ÐA�”—’ ¥HÑ-Ô-Ð-½ˆØ•HÐÐØ�(Ð"Ð"Ý˜r‘l”lÐ"ØˆNØˆr.   T©Úinclude_taggedr\   c                ó*   ‡— ˆfd„| j         D ¦   «         S )u>   Chunks as flat, json-safe, payload-ready dicts (schema Â§4.5).c                 ó0   •— g | ]}t          |‰¦  «        ‘ŒS r   )Ú_chunk_to_dict)rA   rB   r\   s     €r,   ú
<listcomp>z,ChunkedDocument.to_dicts.<locals>.<listcomp>Ž   s#   ø€ ÐHÐHÐH°a•˜q .Ñ1Ô1ÐHÐHÐHr.   r=   )r'   r\   s    `r,   Úto_dictszChunkedDocument.to_dictsŒ   s   ø€ àHÐHÐHÐH¸4¼<ÐHÑHÔHÐHr.   c                ó„   — |                      dt          ¦  «         t          j        |                      |¬¦  «        fi |¤ŽS )NrV   r[   )Ú
setdefaultÚ_json_defaultÚjsonÚdumpsra   )r'   r\   Újson_kwargss      r,   Úto_jsonzChunkedDocument.to_json�   sJ   € Ø×Ò˜y­-Ñ8Ô8Ð8ÝŒzØ�MŠM¨ˆMÑ8Ô8ð
ð 
àð
ð 
ð 	
r.   c                 óî   — t          |¦  «        t          z
  }|r5t          dt          t          ¦  «        › dt          |¦  «        › d�¦  «        ‚ddlm} i | j        ¥|¥} || j        | j        |¦  «        S )uH  Re-run assembly from retained units with new budget params.

        Only assembly-tier parameters are accepted (REASSEMBLY_PARAMS);
        substrate parameters (sentence_splitter, header_footer_mode,
        tokenizer, weights) and parse options raise ValueError â€” call
        to_chunks() on a new parse for those.
        zreassemble_chunks only accepts z; z require a new to_chunks() callr   )Ú_chunk_units)	ÚsetÚREASSEMBLY_PARAMSÚ
ValueErrorÚsortedÚ rj   r   r   r    )r'   r   Úunknownrj   Úmergeds        r,   Úreassemble_chunksz!ChunkedDocument.reassemble_chunks™   s¤   € õ �f‘+”+Õ 1Ñ1ˆØð 	ÝðDµ&Õ9JÑ2KÔ2Kð Dð DÝ˜'‘?”?ðDð Dð Dñô ð ð 	#Ð"Ð"Ð"Ð"Ð"à*�D”KÐ* 6Ð*ˆØˆ|˜DœI t¤¸Ñ?Ô?Ð?r.   c                 óü  — | j         rd„ | j         j        D ¦   «         ng }t          ¦   «         }| j        D ]$}|                     t          |¦  «        ¦  «         Œ%g }| j        sf| j        s|                     d¦  «         nIt          d„ | j        D ¦   «         ¦  «        r|                     d¦  «         n|                     d¦  «         t          | j        ¦  «        t          | j
        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          |¦  «        t          t          |¦  «        |z
  ¦  «        |d„ | j        D ¦   «         d„ | j        D ¦   «         | j        dœS )	a  Structured ingestion-gate input, derived from the registry.

        Consumers decide PROCEED/HOLD/REJECT; this only reports facts:
        counts, zero-chunk causes, text-less figures (OCR candidates),
        degenerate tables, and header/footer exclusions.
        c                 ó   — g | ]	}|j         ‘Œ
S r   )Úpage_number)rA   Úps     r,   r`   z/ChunkedDocument.diagnostics.<locals>.<listcomp>¶   s   € Ð8Ð8Ð8 1�”Ð8Ð8Ð8r.   Úno_text_extractedc              3   ó$   K  — | ]}|j         V — Œd S r   )Úis_header_footer)rA   Úus     r,   rC   z.ChunkedDocument.diagnostics.<locals>.<genexpr>¿   s%   è è € ÐAÐA¨A�QÔ'ÐAÐAÐAÐAÐAÐAr.   Úall_units_header_footerÚall_units_filteredc                 ó*   — g | ]}|j         °	|j        ‘ŒS r   )Úhas_textrJ   )rA   Úfs     r,   r`   z/ChunkedDocument.diagnostics.<locals>.<listcomp>Í   s0   € ð %8ð %8ð %8¨aØ,-¬Jð%8 Q¤Tð %8ð %8ð %8r.   c                 óN   — g | ]"}|j                              ¦   «         °|j        ‘Œ#S r   )r@   ÚstriprJ   )rA   Úts     r,   r`   z/ChunkedDocument.diagnostics.<locals>.<listcomp>Ï   s8   € ð "9ð "9ð "9¨1Ø)*¬¯ª©¬ð"9 !¤$ð "9ð "9ð "9r.   )Úchunk_countÚelement_countÚtable_countÚfigure_countÚsection_countÚ
page_countÚpages_without_chunksÚzero_chunk_causesÚfigures_without_textÚdegenerate_tablesr   )r   Úpagesrk   r   ÚupdateÚ_chunk_pagesr    rM   Úallr0   r   r   r   r   rn   r!   )r'   r�   Úpages_with_chunksrB   rŠ   s        r,   ÚdiagnosticszChunkedDocument.diagnostics®   s–  € ð =A¼IÐMÐ8Ð8¨¬	¬Ð8Ñ8Ô8Ð8È2ˆÝ™EœEÐØ”ð 	6ð 	6ˆAØ×$Ò$¥\°!¡_¤_Ñ5Ô5Ð5Ð5àÐØŒ|ð 	?Ø”?ð ?Ø!×(Ò(Ð)<Ñ=Ô=Ð=Ð=ÝÐAÐA°´ÐAÑAÔAÑAÔAð ?Ø!×(Ò(Ð)BÑCÔCÐCÐCà!×(Ò(Ð)=Ñ>Ô>Ð>õ ˜tœ|Ñ,Ô,Ý  ¤Ñ/Ô/Ý˜tœ{Ñ+Ô+Ý ¤Ñ-Ô-Ý  ¤Ñ/Ô/Ý˜e™*œ*Ý$*­3¨u©:¬:Ð8IÑ+IÑ$JÔ$JØ!2ð%8ð %8°4´<ð %8ñ %8ô %8ð"9ð "9°´ð "9ñ "9ô "9à&*Ô&Bð
ð 
ð 	
r.   )Údoc_idr“   c                ó:   ‡‡— ddl mŠ ˆˆfd„| j        D ¦   «         S )zChunks as langchain Documents (requires langchain-core).

        See :meth:`to_llama_nodes` for what *doc_id* is for.
        r   )ÚDocumentc           	      óv   •— g | ]5} ‰t          |j        ‰¦  «        |j        t          |¦  «        ¬ ¦  «        ‘Œ6S ))rJ   Úpage_contentÚmetadata©Ú
_export_idrJ   r@   Ú_export_metadata)rA   rB   r•   r“   s     €€r,   r`   z:ChunkedDocument.to_langchain_documents.<locals>.<listcomp>Ý   sZ   ø€ ð 
ð 
ð 
ð ð ˆH�
 1¤4¨Ñ0Ô0Ø"#¤&Ý.¨qÑ1Ô1ð3ñ 3ô 3ð
ð 
ð 
r.   )Úlangchain_core.documentsr•   r   )r'   r“   r•   s    `@r,   Úto_langchain_documentsz&ChunkedDocument.to_langchain_documentsÖ   sL   øø€ ð
 	6Ð5Ð5Ð5Ð5Ð5ð
ð 
ð 
ð 
ð 
ð ”\ð	
ñ 
ô 
ð 	
r.   c                ó:   ‡‡— ddl mŠ ˆˆfd„| j        D ¦   «         S )uö  Chunks as llama-index TextNodes (requires llama-index-core).

        Chunk ids are document-local ("c0" starts every document), so two
        documents in one store collide on the exported id and the later
        write replaces the earlier record. Pass *doc_id* â€” any stable
        per-document key â€” to export ``"{doc_id}:{chunk.id}"`` instead.

        The chunk's own id is always in ``metadata["chunk_id"]``, so a
        retrieved record still addresses ``ChunkedDocument.get()``.
        r   )ÚTextNodec           	      óv   •— g | ]5} ‰t          |j        ‰¦  «        |j        t          |¦  «        ¬ ¦  «        ‘Œ6S ))Úid_r@   r˜   r™   )rA   rB   rŸ   r“   s     €€r,   r`   z2ChunkedDocument.to_llama_nodes.<locals>.<listcomp>ñ   sY   ø€ ð 
ð 
ð 
ð ð ˆH� A¤D¨&Ñ1Ô1¸¼Ý.¨qÑ1Ô1ð3ñ 3ô 3ð
ð 
ð 
r.   )Úllama_index.core.schemarŸ   r   )r'   r“   rŸ   s    `@r,   Úto_llama_nodeszChunkedDocument.to_llama_nodesä   sL   øø€ ð 	5Ð4Ð4Ð4Ð4Ð4ð
ð 
ð 
ð 
ð 
ð ”\ð
ñ 
ô 
ð 	
r.   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   r2   r7   r:   Úpropertyr   r(   Ústrr@   r   rQ   rT   rS   Úboolr   ra   rh   rr   r   r’   r�   r£   r   r.   r,   r   r      s  € € € € € ð
ð 
ð ,.°bÀ"Ø T¨t¸rØ()ð6ð 6ð 6ð 6ð 6ð0!ð !ð !ð#ð #ð #ð
3ð 3ð 3ð
 ð˜ð ð ð ñ „Xðð ð�cð ð ð ñ „Xðð ð˜;ð ð ð ñ „Xðð" $,ð ð �cð ð ð ð ð2 26ð Ið Ið I¨$ð I¸$ð Ið Ið Ið Ið 15ð 
ð 
ð 
¨ð 
Èð 
ð 
ð 
ð 
ð@ð @ð @ð* ð#
˜Tð #
ð #
ð #
ñ „Xð#
ðN >Bð 
ð 
ð 
°°d±
ð 
ð 
ð 
ð 
ð 6:ð 
ð 
ð 
¨¨d©
ð 
ð 
ð 
ð 
ð 
ð 
r.   r   Úchunk_idr;   c                 ó   — |r|› d| › �n| S )z8Store-facing id: document-scoped when a doc_id is given.ú:r   )r«   r“   s     r,   rš   rš   ø   s    € à%+Ð9ˆfÐ!Ð!�xÐ!Ð!Ð!°Ð9r.   c                 óF   — t          | d¦  «        d         }| j        |d<   |S )z?Framework metadata: the ChunkMetadata fields plus the chunk id.Fr˜   r«   )r_   rJ   )Úchunkr˜   s     r,   r›   r›   ý   s'   € å˜e UÑ+Ô+¨JÔ7€HØ œ8€HˆZÑØ€Or.   c                 óh  — d„ | j         j        D ¦   «         }| j         j        D ]X}|                     d¦  «        d         }	 |                     t          |dd…         ¦  «        ¦  «         ŒI# t          $ r Y ŒUw xY w|s4t          t          | j         j	        | j         j
        dz   ¦  «        ¦  «        }|S )aH  Pages that actually put content into *chunk*.

    ``page_start..page_end`` is a span, not a coverage claim: a chunk
    bridging pages 1 and 3 says nothing about page 2, so counting the span
    would hide an empty page from ``pages_without_chunks``. The pages come
    from the chunk's own bbox/element addresses instead.
    c                 ó"   — h | ]}|¯|d          ’ŒS )r   r   )rA   Úbs     r,   ú	<setcomp>z_chunk_pages.<locals>.<setcomp>  s!   € Ð6Ð6Ð6�a°AÐ6ˆQˆqŒTÐ6Ð6Ð6r.   z.br   r   N)r˜   ÚbboxesÚelement_idsÚ	partitionÚaddÚintrm   rk   ÚrangeÚ
page_startÚpage_end)r¯   r�   ÚelementÚpages       r,   r�   r�     sÌ   € ð 7Ð6˜5œ>Ô0Ð6Ñ6Ô6€EØ”>Ô-ð ð ˆØ× Ò  Ñ&Ô& qÔ)ˆð	Ø�IŠI•c˜$˜q˜r˜rœ(‘m”mÑ$Ô$Ð$Ð$øÝð 	ð 	ð 	ØˆHð	øøøàð 8Ý•E˜%œ.Ô3Øœ.Ô1°AÑ5ñ7ô 7ñ 8ô 8ˆà€Ls   Á*A,Á,
A9Á8A9r\   c                 óˆ   ‡ — ‰ j         ‰ j        ‰ j        ˆ fd„t          ‰ j        ¦  «        D ¦   «         dœ}|r
‰ j        |d<   |S )Nc                 óP   •— i | ]"}|j         t          ‰j        |j         ¦  «        “Œ#S r   )ÚnameÚgetattrr˜   )rA   r   r¯   s     €r,   ú
<dictcomp>z"_chunk_to_dict.<locals>.<dictcomp>  s;   ø€ ð 
ð 
ð 
àð ŒF•G˜EœN¨A¬FÑ3Ô3ð
ð 
ð 
r.   )rJ   r@   Úcontent_hashr˜   Útagged_content)rJ   r@   rÃ   r   r˜   rÄ   )r¯   r\   Úds   `  r,   r_   r_     sl   ø€ àŒhØ”
ØÔ*ð
ð 
ð 
ð 
å˜EœNÑ+Ô+ð
ñ 
ô 
ð		ð 	€Að ð 3Ø#Ô2ˆÐ
ÑØ€Hr.   c                 ó¶   — t          | t          ¦  «        rd S t          | t          ¦  «        rt          | ¦  «        S t	          dt          | ¦  «        ›�¦  «        ‚)Nznot JSON serializable: )r4   Úbytesr   r   Ú	TypeErrorÚtype)Úos    r,   rd   rd   (  sS   € Ý�!•UÑÔð ØˆtÝ�!•UÑÔð Ý�A‰wŒwˆÝ
Ð9­d°1©g¬gÐ9Ð9Ñ
:Ô
:Ð:r.   )r§   re   Úcollections.abcr   Údataclassesr   Útypesr   Úmodelsr   Ú	frozensetrl   ÚobjectrT   r   r©   rš   r   r›   rk   r�   rª   r_   rd   r   r.   r,   ú<module>rÑ      sX  ððð ð €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð ð �Ið ð ð ñ ô Ð ð ˆ6‰8Œ8€ðV
ð V
ð V
ð V
ð V
�hñ V
ô V
ð V
ðr:˜ð :¨ð :ð :ð :ð :ð
˜tð ð ð ð ð˜3ð ð ð ð ð*¨$ð °4ð ð ð ð ð;ð ;ð ;ð ;ð ;r.   