+
    .zj*!                    H   R t ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
Ht ^ RIHt ^ RIHt ^ RIHtHt ^ R	IHtHtHt  ! R
 R]4      tR R ltR R ltR R ltR$R R lltR R ltR%R R lltR&R R lltR R ltR R lt R$R R llt!R$R  R! llt"R$R" R# llt#R# )'u  Patent ofisi DOCX builder — in-memory, returns bytes.

Biçim kuralları `office_spec.py`'den gelir (TR / EP / US); ortak iskelet
reference-scripts/build_turkpatent_separate_docs.py ile aynı:
- Ofise göre sayfa boyutu ve kenar marjları (TR/EP A4, US letter)
- Times New Roman 12pt, 1.5 satır aralığı
- Her 5 satırda sol kenar satır numarası (restart=newPage)
- PAGE field alt ortalanmış sayfa numarası

Başlıklar ofisin dilindedir: TARİFNAME / DESCRIPTION gibi.
)annotationsN)	TypedDict)Document)WD_ALIGN_PARAGRAPHWD_LINE_SPACING)OxmlElement)qn)MmPt)Jurisdiction
OfficeSpecget_office_specc                  @    ] tR t^t$ R]R&   R]R&   R]R&   R]R&   RtR	# )
	ClaimDictintnumberstrtypez
int | Noneparenttext N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       [/Users/zincirx/Documents/projelerim/patentyazar/backend-python/app/services/docx/builder.pyr   r      s    K
I
Ir   r   c                   V ^8  d   QhRR/#    returnNoner   )formats   "r   __annotate__r%   &   s        D  r   c                .   V P                   p\        R4      pVP                  \        R4      R4       VP                  \        R4      R4       VP                  \        R4      R4       VP                  \        R4      R	4       VP	                  V4       R
# )u?   Her 5 satırda sol kenar satır numarası, her sayfada restart.zw:lnNumTypez	w:countBy5zw:start1z	w:restartnewPagez
w:distance360N)_sectPrr   setr   append)sectionsect_prln_num_types   &  r   _add_line_numberingr1   &   sj    ooGm,KOOB{OS)OOByM3'OOB{OY/OOB|$e,NN;r   c                   V ^8  d   QhRR/# r    r   )r$   s   "r   r%   r%   1   s       r   c                `   V P                   ^ ,          p\        P                  Vn        VP	                  4       p\        R4      pVP                  \        R4      R4       \        R4      pVP                  \        R4      R4       RVn        \        R4      pVP                  \        R4      R4       VP                  P                  V4       VP                  P                  V4       VP                  P                  V4       R	VP                  n        \        ^4      VP                  n        R
# )u3   Alt ortalanmış sayfa numarası (Word PAGE field).z	w:fldCharzw:fldCharTypebeginzw:instrTextz	xml:spacepreservePAGEendTimes New RomanN)
paragraphsr   CENTER	alignmentadd_runr   r,   r   r   _rr-   fontnamer
   size)footerprunr4   instrr7   s   &     r   _add_page_numberrE   1   s    !A$++AK
))+C$E	IIb!7+&E	IIboz*EJ
k
"CGGB'FFMM%FFMM%FFMM#%CHHMrFCHHMr   c                   V ^8  d   QhRR/# r    r   )r$   s   "r   r%   r%   D   s      D r   c                   V P                   R ,          pRVP                  n        \        ^4      VP                  n        VP
                  p\        P                  Vn        \        ^ 4      Vn	        \        ^ 4      Vn
        R# )Normalr8   N)stylesr>   r?   r
   r@   paragraph_formatr   ONE_POINT_FIVEline_spacing_rulespace_beforespace_after)docstylepfs   &  r   _set_base_stylerR   D   sY    JJx E'EJJOfEJJO			B*99BeBOUBNr   c                    V ^8  d   QhRRRR/# )r!   speczOfficeSpec | Noner"   r#   r   )r$   s   "r   r%   r%   N   s     % % 1 %T %r   c                   T;'       g    \        \        P                  4      pVP                  p\	        VP
                  4      V n        \	        VP                  4      V n        \	        VP                  4      V n
        \	        VP                  4      V n        \	        VP                  4      V n        \	        VP                  4      V n        \	        ^
4      V n        \	        ^
4      V n        R# )u   Metin sayfası boyutu + kenar boşlukları (ofise göre).

`spec` verilmezse TR'ye düşer — `amendment.py` bu helper'ı ofis
bilgisi olmadan da çağırıyor.
N)r   r   TRtext_marginsr	   page_height_mmpage_heightpage_width_mm
page_widthtop
top_marginleftleft_marginrightright_marginbottombottom_marginheader_distancefooter_distance)r.   rT   ms   && r   _set_marginsrg   N   s     33?<??3DAT001GD../GAEEGQVV*Gagg;GqxxLG fG fGr   c                   V ^8  d   QhRR/# )r!   rT   r   r   )r$   s   "r   r%   r%   `   s      : r   c                    \        4       p\        V4       VP                  ^ ,          p\        W 4       V P                  '       d   \        V4       \        VP                  4       V# )    )r   rR   sectionsrg   line_numberingr1   rE   rA   )rT   rO   r.   s   &  r   _new_docrm   `   sK    
*CCll1oGG$W^^$Jr   c                    V ^8  d   QhRRRR/# )r!   r   r   levelr   r   )r$   s   "r   r%   r%   k   s      C  r   c                   V P                  4       p\        ^4      VP                  n        \        ^4      VP                  n        VP                  V4      pRVn        RVP                  n        V^8X  d   \        ^4      VP                  n	        V# V^8X  d   \        ^4      VP                  n	        V# \        ^4      VP                  n	        V# )   Tr8   )
add_paragraphr
   rJ   rM   rN   r<   boldr>   r?   r@   )rO   r   ro   rB   rC   s   &&&  r   _add_headingrt   k   s    A&(fA#%'UA"
))D/CCH%CHHMz2
 H	 
!2 H 2Hr   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r!   r   r   justifyboolcenterrs   size_ptr   r   )r$   s   "r   r%   r%   {   s<      
  	
  r   c                   V P                  4       pV'       d   \        P                  Vn        MV'       d   \        P                  Vn        VP
                  p\        P                  Vn        \        ^ 4      Vn
        \        ^4      Vn        VP                  V4      pRVP                  n        \        V4      VP                  n        WHn        V# )rj   r8   )rr   r   r:   r;   JUSTIFYrJ   r   rK   rL   r
   rM   rN   r<   r>   r?   r@   rs   )	rO   r   rv   rx   rs   ry   rB   rQ   rC   s	   &&&&&&   r   	_add_parar|   {   s     	A(//	(00	
		B*99BeBOUBN
))D/C%CHHMwKCHHMHHr   c                    V ^8  d   QhRRRR/# )r!   r   r   r"   r   )r$   s   "r   r%   r%      s        r   c                    \         P                  ! RRV 4      p \         P                  ! RRV 4      p \         P                  ! RRV 4      p \         P                  ! RRV 4      p V # )u5   Bold/italic/kod/link markdown'ı düz metne çevirir.z\*\*([^*]+)\*\*z\1z(?<!\*)\*([^*]+)\*(?!\*)z	`([^`]+)`z\[([^\]]+)\]\([^)]+\))resub)r   s   &r   _clean_inline_markdownr      sR    66$eT2D66-ud;D66,t,D66*E48DKr   c                    V ^8  d   QhRRRR/# )r!   mdr   r"   zlist[tuple[str, str]]r   )r$   s   "r   r%   r%      s     7 7 7 5 7r   c                  aa V P                  4       p. oRp. oR VV3R llpV EF  pVP                  4       pVP                  R4      '       d   V! 4        V'       * pK;  V'       d   KE  \        P                  ! RV4      pV'       dc   V! 4        \        VP                  ^4      4      pVP                  ^4      P                  4       pSP                  R\        V^4       2V34       K  V'       g
   V! 4        K  VP                  R4      '       d<   V! 4        VR,          P                  4       p	SP                  R	RV	,           34       EK)  VP                  R
4      '       d>   VP                  R4      P                  4       p
V
'       d   SP                  RV
34       EK}  VR9   d   V! 4        EK  SP                  V4       EK  	  V! 4        S# )uC   Markdown'ı (kind, text) listesine çevir. kind: h1-h6 | p | quote.Fc                   V ^8  d   QhRR/# r    r   )r$   s   "r   r%   %_parse_markdown.<locals>.__annotate__   s       r   c                    < S'       d?   R P                  S4      P                  4       p V '       d   SP                  RV 34       . oR# R# ) rB   N)joinstripr-   )tbuffer_paraouts    r   
flush_para#_parse_markdown.<locals>.flush_para   s:    %++-A

C8$K	 r   z```z^(#{1,6})\s+(.*)h   • :r!   NNrB   >z> quote)z- z* r   )z---z***)
splitlinesr   
startswithr   matchlengroupr-   minlstriprstrip)r   linesin_coder   rawstrippedrf   ro   r   bulletcontentr   r   s   &          @@r   _parse_markdownr      s|   MMOE!#CGK  99;u%%L!kGHH(#.L
OE771:##%DJJ!CqM?+T23L344Lb\'')FJJVf_-.s##ood+224G

GW-.~%L8$K N LJr   c               (    V ^8  d   QhRRRRRRRR/# )r!   titler   markdownjurisdictionJurisdiction | str | Noner"   bytesr   )r$   s   "r   r%   r%      s0       , 	r   c                   \        V4      p\        V4      p\        WCP                  ^R7       \	        W@RR^RR7       \        V4       F  w  rV\        V4      P                  4       pV'       g   K(  VP                  R4      '       d6   \        V^,          4      p\        WG\        ^\        V^4      4      R7       Kt  VR9   g   K}  \	        WG4       K  	  \        P                  ! 4       p	VP                  V	4       V	P                  4       # )uI   Tarifname/Description DOCX — markdown içinden, in-memory bytes döner.ro   TFrx   rs   ry   rv   r   )rB   r   )r   rm   rt   heading_descriptionr|   r   r   r   r   r   maxr   ioBytesIOsavegetvalue)
r   r   r   rT   rO   kindr   cleanro   buffers
   &&&       r   build_description_docxr      s     <(D
4.C..a8cD"eL%h/
&t,224??3QLE3q#eQ-+@A^#c! 0 ZZ\FHHV??r   c               (    V ^8  d   QhRRRRRRRR/# )	r!   r   r   claimszlist[ClaimDict]r   r   r"   r   r   )r$   s   "r   r%   r%      s0       , 	r   c           	     l   \        V4      p\        V4      p\        WCP                  ^R7       \	        W@RR^RR7       RpV F8  pVR,          R8X  d
   VR,          p\	        WFR,           R	VR
,           24       K:  	  Tp\
        P                  ! 4       pVP                  V4       VP                  4       # )uJ   İstemler/Claims DOCX — yapılandırılmış claims listesinden üretir.r   TFr   Nr   independentr   z. r   )	r   rm   rt   heading_claimsr|   r   r   r   r   )	r   r   r   rT   rO   current_independentclaim_r   s	   &&&      r   build_claims_docxr      s     <(D
4.C))3cD"eL '+=M)"'/#/*"U6]O<=	  	AZZ\FHHV??r   c               (    V ^8  d   QhRRRRRRRR/# )r!   r   r   abstractr   r   r"   r   r   )r$   s   "r   r%   r%     s0       , 	r   c           	        \        V4      p\        V4      p\        WCP                  ^R7       \	        W@RR^RR7       \	        WAP                  4       4       \        P                  ! 4       pVP                  V4       VP                  4       # )u   Özet/Abstract DOCX — tek paragraf, 150 kelime sınırı her üç ofiste de
geçerli (TPMK kılavuzu, Rule 47(4) EPC, 37 CFR 1.72(b)).r   TFr   )
r   rm   rt   heading_abstractr|   r   r   r   r   r   )r   r   r   rT   rO   r   s   &&&   r   build_abstract_docxr     sj     <(D
4.C++15cD"eLc>>#$ZZ\FHHV??r   )N)   )TFFrq   )$__doc__
__future__r   r   r   typingr   docxr   docx.enum.textr   r   	docx.oxmlr   docx.oxml.nsr   docx.sharedr	   r
   app.services.docx.office_specr   r   r   r   r1   rE   rR   rg   rm   rt   r|   r   r   r   r   r   r   r   r   <module>r      s{   
 # 	 	   > !   S S	  &%$ 07z44 r   