o
    ðù‹i#  ã                   @   sd   d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 dddd	œZ
d
ZdZG dd„ deƒZdS )é    )ÚdeepcopyN)ÚElement)Úetree)ÚZipFileÚZIP_DEFLATEDz<http://schemas.openxmlformats.org/wordprocessingml/2006/mainz;http://schemas.openxmlformats.org/markup-compatibility/2006z<http://schemas.openxmlformats.org/package/2006/content-types)ÚwÚmcÚct)zPapplication/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xmlzIapplication/vnd.openxmlformats-officedocument.wordprocessingml.header+xmlzIapplication/vnd.openxmlformats-officedocument.wordprocessingml.footer+xmlzKapplication/vnd.openxmlformats-officedocument.wordprocessingml.settings+xmlc                   @   s\   e Zd Zddd„Zdd„ Zdd„ Zdd	d
„Zdd„ Zddd„Zdd„ Z	dd„ Z
ddd„ZdS )Ú	MailMergeFc              
      s\  t |ƒ| _i | _d | _d | _|| _t | j d¡¡}| 	dt
 ¡D ]%}|jdt
  }|tv r9|  |¡\}| j|< q!|tkrF|  |¡\| _| _q!g }t dtj¡}| j ¡ D ]«}| 	dt
 ¡D ]/‰tˆƒD ](\}	}
|
jdt
 krpqd|
jdt
  }| |¡}|d u rqdtd| d	¡d
ˆ|	< qdq^| 	dt
 ¡D ]j‰tˆƒ‰ t‡ fdd„ˆ 	dt
 ¡D ƒ‡ fdd„ˆ 	dt
 ¡D ƒdd„ ˆ 	dt
 ¡D ƒƒ}|D ]9\}}}| |j¡}|d u rÕqÅtd| d	¡d
ˆ|< d|_| ¡ }ˆ|  t|ƒ¡ |‡fdd„t||ƒD ƒ7 }qÅq•qU|D ]
\‰}
ˆ |
¡ q| jr*| j ¡ }| dt
 ¡}|d ur,| |¡ d S d S d S )Nz[Content_Types].xmlz{%(ct)s}OverrideÚContentTypez/ MERGEFIELD +"?([^ ]+?)"? +(|\\\* MERGEFORMAT )z.//{%(w)s}fldSimple/..z{%(w)s}fldSimplez{%(w)s}instrÚ
MergeFieldé   )Únamez.//{%(w)s}instrText/../..c                    ó   g | ]}ˆ   |¡‘qS © ©Úindex©Ú.0Úe©Úchildrenr   úI/opt/alphahud/venv/lib/python3.10/site-packages/tushare/util/mailmerge.pyÚ
<listcomp>9   ó    z&MailMerge.__init__.<locals>.<listcomp>z7{%(w)s}r/{%(w)s}fldChar[@{%(w)s}fldCharType="begin"]/..c                    r   r   r   r   r   r   r   r   ;   r   z5{%(w)s}r/{%(w)s}fldChar[@{%(w)s}fldCharType="end"]/..c                 S   s   g | ]}|‘qS r   r   r   r   r   r   r   =   s    z{%(w)s}r/{%(w)s}instrTextÚ	MergeTextc                    s   g | ]
}ˆ ˆ |d   f‘qS )r   r   )r   Úi)Úparentr   r   r   M   s    ÿz{%(w)s}mailMerge) r   ÚzipÚpartsÚsettingsÚ_settings_infoÚremove_empty_tablesr   ÚparseÚopenÚfindallÚ
NAMESPACESÚattribÚCONTENT_TYPES_PARTSÚ_MailMerge__get_tree_of_fileÚCONTENT_TYPE_SETTINGSÚreÚcompileÚIÚvaluesÚ	enumerateÚtagÚmatchr   ÚgroupÚlistÚtextÚ	getparentÚextendÚrangeÚremoveÚgetrootÚfind)ÚselfÚfiler"   Úcontent_typesÚtypeÚziÚ	to_deleteÚrÚpartÚidxÚchildÚinstrÚmÚfieldsÚ	idx_beginÚidx_endÚblockÚsettings_rootÚ
mail_merger   )r   r   r   Ú__init__   sz   
€
ø

ÿ
ÿÿû	
ÿôõ

üzMailMerge.__init__c                 C   s<   |j dt   dd¡d }| j |¡}|t | j |¡¡fS )NÚPartNameú/r   )r'   r&   Úsplitr   Úgetinfor   r#   r$   )r;   r<   Úfnr?   r   r   r   Ú__get_tree_of_fileZ   s   zMailMerge.__get_tree_of_filec                 C   s¶   |   ¡ D ]}| jdi |di¤Ž qt|dtƒ}| jjD ]9}|| jv r4t | j|  	¡ ¡}| 
|j|¡ q|| jkrIt | j 	¡ ¡}| 
|j|¡ q| 
|j| j |¡¡ q| ¡  d S )NÚ r   r   )Úget_merge_fieldsÚmerger   r   r   Úfilelistr   r   Útostringr9   ÚwritestrÚfilenamer!   r    ÚreadÚclose)r;   r<   ÚfieldÚoutputr?   Úxmlr   r   r   Úwrite_   s   

zMailMerge.writeNc                 C   sB   |s| j  ¡ }tƒ }|D ]}| d¡D ]
}| |jd ¡ qq|S )Nz.//MergeFieldr   )r   r.   Úsetr%   Úaddr'   )r;   r   rG   rB   Úmfr   r   r   rU   p   s   
ÿzMailMerge.get_merge_fieldsc                 C   sØ   | j  ¡ D ]d}| ¡ }|j}|dt ks|dt krqg }|D ]}| |¡ | |¡ qt|ƒD ]8\}}|dkrJtdt ƒ}	d|	j	dt < | |	¡ g }
|D ]}t
|ƒ}| |¡ |
 |¡ qN| j|
fi |¤Ž q0qdS )z¡
        Duplicate template page. Creates a copy of the template for each item
        in the list, does a merge, and separates the them by page breaks.
        z
{%(w)s}ftrz
{%(w)s}hdrr   ú	{%(w)s}brÚpagez{%(w)s}typeN)r   r.   r9   r0   r&   r8   Úappendr/   r   r'   r   rV   )r;   ÚreplacementsrB   Úrootr0   r   rD   r   ÚreplÚ	pagebreakr   Ú
child_copyr   r   r   Úmerge_pagesy   s,   


ôôzMailMerge.merge_pagesc                 K   sT   |s| j  ¡ }| ¡ D ]\}}t|tƒr|  ||¡ q|D ]	}|  |||¡ qqd S ©N)r   r.   ÚitemsÚ
isinstancer3   Ú
merge_rowsÚ_MailMerge__merge_field)r;   r   rg   r]   ÚreplacementrB   r   r   r   rV   ˜   s   

ÿüzMailMerge.mergec                 C   s
  |  d| ¡D ]{}t|ƒ}| ¡  dt |_| |¡ |d u r!|nt|ƒ}g }|p*d}| dd¡ d¡}t	|ƒD ]#\}}	t
dt ƒ}
|	|
_| |
¡ |t|ƒd k r[| t
dt ƒ¡ q8| d	¡}|d ur}| |¡}t|ƒD ]}| ||¡ qn| |¡ q| |¡ qd S )
Nú.//MergeField[@name="%s"]z{%(w)s}rrT   úÚ
z{%(w)s}tr   rd   r   )r%   r3   Úclearr&   r0   r6   ÚstrÚreplacerP   r/   r   r4   rf   Úlenr:   r   ÚreversedÚinsertr8   )r;   rB   r]   r4   rc   r   ÚnodesÚ
text_partsr   Ú	text_partÚ	text_nodeÚphr   Únoder   r   r   Ú__merge_field£   s0   


€

äzMailMerge.__merge_fieldc           
      C   s   |   |¡\}}}|d urDt|ƒdkr6||= t|ƒD ]\}}t|ƒ}| j|gfi |¤Ž | || |¡ qd S | jrF| ¡ }	|	 |¡ d S d S d S )Nr   )	Ú_MailMerge__find_row_anchorry   r/   r   rV   r{   r"   r5   r8   )
r;   ÚanchorÚrowsÚtablerC   Útemplater   Úrow_dataÚrowr   r   r   r   rp   Â   s   ýô
zMailMerge.merge_rowsc                 C   sj   |s| j  ¡ }|D ])}| dt ¡D ]}t|ƒD ]\}}| d| ¡d ur0|||f      S qqq	dS )Nz.//{%(w)s}tblrs   )NNN)r   r.   r%   r&   r/   r:   )r;   r]   r   rB   r†   rC   r‰   r   r   r   Ú__find_row_anchorÒ   s   
ÿÿÿzMailMerge.__find_row_anchor)Frm   )Ú__name__Ú
__module__Ú__qualname__rM   r)   r`   rU   rl   rV   rq   rp   rƒ   r   r   r   r   r
      s    
C
	
r
   )Úcopyr   r+   Ú
lxml.etreer   Úlxmlr   Úzipfiler   r   r&   r(   r*   Úobjectr
   r   r   r   r   Ú<module>   s    ý