
    0i2                       d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZmZ  G d
 de      ZddZddZddZddZd ZdddZ	 	 	 	 d	 	 	 	 	 	 	 	 	 ddZddZddZddZd dZd!dZy)"uD  TürkPatent DOCX builder — in-memory, returns bytes.

Format kuralları reference-scripts/build_turkpatent_separate_docs.py ile aynı:
- 20/25/20/20 mm kenar marjları
- 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ı
    )annotationsN)	TypedDict)Document)WD_ALIGN_PARAGRAPHWD_LINE_SPACING)OxmlElement)qn)MmPtc                  6    e Zd ZU ded<   ded<   ded<   ded<   y)		ClaimDictintnumberstrtypez
int | NoneparenttextN)__name__
__module____qualname____annotations__     8/var/www/ai.patentyazar.com/app/services/docx/builder.pyr   r      s    K
I
Ir   r   c                ,   | j                   }t        d      }|j                  t        d      d       |j                  t        d      d       |j                  t        d      d       |j                  t        d      d	       |j	                  |       y
)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_numberingr&   !   sj    ooGm,KOOB{OS)OOByM3'OOB{OY/OOB|$e,NN;r   c                V   | j                   d   }t        j                  |_        |j	                         }t        d      }|j                  t        d      d       t        d      }|j                  t        d      d       d|_        t        d      }|j                  t        d      d	       |j                  j                  |       |j                  j                  |       |j                  j                  |       d
|j                  _        t        d      |j                  _        y)u3   Alt ortalanmış sayfa numarası (Word PAGE field).r   z	w:fldCharzw:fldCharTypebeginzw:instrTextz	xml:spacepreservePAGEendTimes New Roman   N)
paragraphsr   CENTER	alignmentadd_runr   r!   r	   r   _rr"   fontnamer   size)footerprunr(   instrr+   s         r   _add_page_numberr:   ,   s    !A$++AK
))+C$E	IIb!7+&E	IIboz*EJ
k
"CGGB'FFMM%FFMM%FFMM#%CHHMrFCHHMr   c                    | j                   d   }d|j                  _        t        d      |j                  _        |j
                  }t        j                  |_        t        d      |_	        t        d      |_
        y )NNormalr,      r   )stylesr3   r4   r   r5   paragraph_formatr   ONE_POINT_FIVEline_spacing_rulespace_beforespace_after)docstylepfs      r   _set_base_stylerG   ?   sY    JJx E'EJJOfEJJO			B*99BeBOUBNr   c                   t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        t        d      | _        y )Ni)           
   )	r
   page_height
page_width
top_marginleft_marginright_marginbottom_marginheader_distancefooter_distance)r#   s    r   _set_marginsrU   I   sb    S'GCGBGR&Gb6GrFG fG fGr   c                     t               } t        |        | j                  d   }t        |       t	        |       t        |j                         | S )Nr   )r   rG   sectionsrU   r&   r:   r6   )rD   r#   s     r   _new_docrX   U   s?    
*CCll1oG W^^$Jr   c                   | j                         }t        d      |j                  _        t        d      |j                  _        |j                  |      }d|_        d|j                  _        |dk(  rt        d      |j                  _	        |S |dk(  rt        d      |j                  _	        |S t        d      |j                  _	        |S )	Nr=      Tr,               )
add_paragraphr   r?   rB   rC   r1   boldr3   r4   r5   )rD   r   levelr7   r8   s        r   _add_headingrb   _   s    A&(fA#%'UA"
))D/CCH%CHHMz2
 H	 
!2 H 2Hr   c                   | j                         }|rt        j                  |_        n|rt        j                  |_        |j
                  }t        j                  |_        t        d      |_
        t        d      |_        |j                  |      }d|j                  _        t        |      |j                  _        ||_        |S )Nr   rZ   r,   )r_   r   r/   r0   JUSTIFYr?   r   r@   rA   r   rB   rC   r1   r3   r4   r5   r`   )	rD   r   justifycenterr`   size_ptr7   rF   r8   s	            r   	_add_pararh   o   s     	A(//	(00	
		B*99BeBOUBN
))D/C%CHHMwKCHHMCHHr   c                    t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } | S )u5   Bold/italic/kod/link markdown'ı düz metne çevirir.z\*\*([^*]+)\*\*z\1z(?<!\*)\*([^*]+)\*(?!\*)z	`([^`]+)`z\[([^\]]+)\]\([^)]+\))resub)r   s    r   _clean_inline_markdownrl      sR    66$eT2D66-ud;D66,t,D66*E48DKr   c                   | j                         }g d}g dfd}|D ]\  }|j                         }|j                  d      r |        | }0|r3t        j                  d|      }|ra |        t        |j                  d            }|j                  d      j                         }j                  dt        |d       |f       |s |        |j                  d	      r1 |        |dd
 j                         }	j                  dd|	z   f       |j                  d      r6|j                  d      j                         }
|
rj                  d|
f       ?|dv r	 |        Lj                  |       _  |        S )uC   Markdown'ı (kind, text) listesine çevir. kind: h1-h6 | p | quote.Fc                 x    r7dj                        j                         } | rj                  d| f       g y y )N r7   )joinstripr"   )tbuffer_paraouts    r   
flush_paraz#_parse_markdown.<locals>.flush_para   s:    %++-A

C8$K	 r   z```z^(#{1,6})\s+(.*)r[   r]   hrZ   )z- z*    • Nr7   rw   >z> quote)z---z***returnNone)
splitlinesrq   
startswithrj   matchlengroupr"   minlstriprstrip)mdlinesin_coderu   rawstrippedmra   r   bulletcontentrs   rt   s              @@r   _parse_markdownr      su   MMOE!#CGK  %%99;u%L!kGHH(#.L
OE771:##%DJJ!CqM?+T23L34Lab\'')FJJVf_-.s#ood+224G

GW-.~%L8$K%%N LJr   c                   t               }t        |dd       t        || dddd       t        |      D ]t  \  }}t	        |      j                         }|s"|j                  d      r1t        |d         }t        ||t        d	t        |d
                   d|dv sit        ||       v t        j                         }|j                  |       |j                         S )uE   Tarifname.docx — markdown içinden üretir, in-memory bytes döner.u
   TARİFNAMEr[   ra   Tr^   Frf   r`   rg   re   rv   r]      )r7   ry   )rX   rb   rh   r   rl   rq   r~   r   maxr   ioBytesIOsavegetvalue)titlemarkdownrD   kindr   cleanra   buffers           r   build_description_docxr      s    
*Cl!,c5D"eL%h/ "
d&t,224??3QLEe3q#eQ-+@A^#c5!" ZZ\FHHV??r   c                   t               }t        |dd       t        || dddd       d}|D ]&  }|d	   d
k(  r|d   }t        ||d    d|d           ( |}t        j                         }|j                  |       |j                         S )uB   Istemler.docx — yapılandırılmış claims listesinden üretir.u	   İSTEMLERr[   r   Tr^   Fr   Nr   independentr   z. r   )rX   rb   rh   r   r   r   r   )r   claimsrD   current_independentclaim_r   s          r   build_claims_docxr      s    
*Ck+c5D"eL '+ >=M)"'/#%/*"U6]O<=	> 	AZZ\FHHV??r   c                    t               }t        |dd       t        || dddd       t        ||j                                t	        j
                         }|j                  |       |j                         S )uM   Ozet.docx — tek paragraf, 150 kelime altı olmalı (aramada uyarı değil).u   ÖZETr[   r   Tr^   Fr   )rX   rb   rh   rq   r   r   r   r   )r   abstractrD   r   s       r   build_abstract_docxr      s\    
*CgQ'c5D"eLc8>>#$ZZ\FHHV??r   rz   )r[   )r   r   ra   r   )TFFr=   )
r   r   re   boolrf   r   r`   r   rg   r   )r   r   r{   r   )r   r   r{   zlist[tuple[str, str]])r   r   r   r   r{   bytes)r   r   r   zlist[ClaimDict]r{   r   )r   r   r   r   r{   r   ) __doc__
__future__r   r   rj   typingr   docxr   docx.enum.textr   r   	docx.oxmlr   docx.oxml.nsr	   docx.sharedr
   r   r   r&   r:   rG   rU   rX   rb   rh   rl   r   r   r   r   r   r   r   <module>r      s    # 	 	   > !  	  &	%& 
  	
  07z**	r   