o
    c                     @   s  d dl Z d dlZd dl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 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZmZmZ d dlZd dlZd dlmZm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3 d dl4m5Z6 e7Z8e9Z:d e_;e<dZ=dZ>dZ?dZ@dZAdd ZBeBe_Bdd ZCdd ZDG dd de-jEZFG dd de-jGZHG dd dZIG d d! d!ZJd"d# ZKG d$d% d%eLZMdS )&    N)Path)rl_settings)TA_LEFT)
addMapping)A4)ParagraphStyle)
pdfmetrics)TTFont)FrameShowBoundaryValue)ParaFragps2tttt2ps)getFilepisaFileObject)
arabic_format
copy_attrsfrag_text_language_checkgetColor	getCoordsgetFrameDimensionsgetSizeset_asian_fonts	set_valuegetFloat)css)PmlPageCountPmlPageTemplatePmlParagraphPmlParagraphAndImagePmlTableOfContents	xhtml2pdf   g?    c                 K   s<   t di | j}|r|j}|| d|v r|d= d |_|S )NZcbDefn )r   __dict__update
bulletText)selfkwargsndr$   r$   /xhtml2pdf/context.pyclone9   s   
r-   c                 C   s   t  }t|dd t|dd  t|dd d|_d|_t| j\|_|_|_| j|_| j|_d|_	d	|_
t|_d
|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_d|_d|_d|_|S )N)subsuperriseZ	underlineZstrikegreekleadingleadingSpacespaceBefore
spaceAfter
leftIndentrightIndentfirstLineIndentborderPaddingpaddingLeftpaddingRight
paddingToppaddingBottombulletIndentZinsideStaticFrameoutlineLevelr   )	backColorZvAlignlinkborderStyleborderColorZlistStyleTypeZlistStyleImagewordWrapheightwidthr'   )Z
pageNumberZ	pageCountoutlineoutlineOpenkeepWithNextrtlF zTimes-Romannormalz150%   	Helveticag      ?)r   r   textfontNamer   bolditalicfontSize	textColorletterSpacingleadingSourcer   	alignmentZborderWidthborderLeftWidthrC   borderLeftColorrB   borderLeftStyleborderRightWidthborderRightColorborderRightStyleborderTopWidthborderTopColorborderTopStyleborderBottomWidthborderBottomColorborderBottomStyle
whiteSpacebulletFontNameZzoom)stylefragr$   r$   r,   getParaFragH   sL   
rh   c                 C   s&   t  | }|jr
| S tt| j S N)urlparseschemestrr   parentresolve)pathpartsr$   r$   r,   
getDirName   s   
rq   c                   @   s@   e Zd Zdd ZdddZddd	Zd
d Zdd Zdd ZdS )pisaCSSBuilderc                 C   s  |  | dg|}t|d  d }d|vri i fS |d }t|dd }|dv }|s>|dkr>t| j	d| t|d	d
 dv }|d }g }	t
|d trf|D ]}
t
|
tre|	|
 qY|	| |	D ]}| j	j|| j	jjd}| s| j	j||||d qmi i fS )z
        Embed fonts
        *r   srczfont-familyzfont-weightrL   )rQ   Zbolder500Z600Z700Z800Z900z)@fontface, unknown value font-weight '%s'z
font-stylerK   )rR   Zobliquerelative)rQ   rR   N)rulesetselectorlistvaluesrl   getlowerlogwarningc
isinstanceappendr   	cssParserrootPathZnotFoundloadFont)r(   declarationsresultdatanamesZfweightrQ   rR   uriZfontspartfontrt   r$   r$   r,   
atFontFace   s@   




zpisaCSSBuilder.atFontFaceFNr   r   c                 C   s   | j }|sd|  }|ddr|d |d f}t||d |d \}}}	}
|r7|d |d||||	|
|fS ||dd |d||||	|
|fS )Nz-pdf-frame-%dZis_landscapeFrM   r   z-pdf-frame-borderz-pdf-frame-content)r   UIDr|   r   )r(   namer   firstbordersizer   xywhr$   r$   r,   _pisaAddFrame   s   zpisaCSSBuilder._pisaAddFramec                 C   s`   |sdd }t |ttfv r$|D ]}||v r|||   S |  S d S ||v r.||| S |S )Nc                 S   s   | S ri   r$   )r   r$   r$   r,   func   s    z)pisaCSSBuilder._getFromData.<locals>.func)typerz   tuple)r(   r   attrdefaultr   ar$   r$   r,   _getFromData   s   zpisaCSSBuilder._getFromDatac                 C   s   i }| dd }| dd }| dd }| dd }t| dd|d< |r4t|d t|d g|d	< |r<t||d
< |rDt||d< |rLt||d< |S )Nzbackground-object-positionzbackground-heightzbackground-widthzbackground-opacityzbackground-page-steprM   stepr   object_positionrE   rF   opacity)r|   r   r   )r(   r   devr   rE   rF   r   r$   r$   r,   get_background_context   s   z%pisaCSSBuilder.get_background_contextc           #      C   sj  | j }|pd}||jv rt| j d| | |ddt}| |ddt}| |ddt}	| |ddt}
| |dd t}| |d	dt}d
D ]}||v r_|j| j	||d||j
d  q`qHg }g }|jD ]\}}}}}}}}| |d|t}| |d|t}| |d|	t}| |d|
t}| |d|t}| |d	|t}|s|rtt|d}nt||d}|rt||j
d |j
d \}}}}t|||||j
\}}}}|dks|dkrt| j d t||||||||||d
}|r
g |_|g|j|g  |j|< || qg|| qg|dd } | |}!| r)| j j| | j jjd} |st|d | j	||d||j
d\}}}}}}}}t|||||j
\}}}}|dks^|dkrft|d |sl|rpt }nt||d}|t|||||||	|
||d
 t|||j
d}"||"_| |"_|j|"_|!|"_|r|"j|"_|"|j|< d |_g |_g |_i i fS )Nbodyz&template '%s' has already been definedzpadding-topr   zpadding-leftzpadding-rightzpadding-bottom)zborder-top-colorzborder-bottom-colorzborder-left-colorzborder-right-color)zborder-top-widthzborder-bottom-widthzborder-left-widthzborder-right-width)

margin-topmargin-leftmargin-rightmargin-bottomtopleftrightZbottomrF   rE   T)r   r   r   )rF   )ZcolorrF   rM   z<Negative width or height of frame. Check @frame definitions.)idZleftPaddingZrightPaddingZbottomPaddingZ
topPaddingZshowBoundaryzbackground-imagerv   zCmissing explicit frame definition for content or just static framesz;Negative width or height of frame. Check @page definitions.)r   framespagesize) r   templateListr~   r   r   r   r   	frameListr   r   pageSizer   intr   r   r
   ZpisaStaticStoryframeStaticr|   r   r   r   r   r   ZpisaStaticListZpisaBackgroundpisaBackgroundListZbackgroundContextZ	LANDSCAPEZpageorientationtemplateframeStaticList)#r(   r   Z
pseudopager   ZisLandscapeZ
pageBorderr   Zpadding_topZpadding_leftZpadding_rightZpadding_bottomZborder_colorZborder_widthZpropr   Z
staticListfnamestaticr   r   r   r   r   ZfdataZfpadding_topZfpadding_leftZfpadding_rightZfpadding_bottomZfborder_colorZfborder_widthZframe_borderframeZ
backgroundZbackground_contextptr$   r$   r,   atPage   s   

	

	
zpisaCSSBuilder.atPagec                 C   sz   |r9|  | dg|}|d }|r9z| d }W n ty)   | d }Y nw | jj| j||| jj	d i i fS )Nrs   r   rM   )r   )
rx   ry   r{   	Exceptionpopitemr   r   r   r   r   )r(   r   r   r   r   r$   r$   r,   atFramea  s   zpisaCSSBuilder.atFrame)FNr   )NN)	__name__
__module____qualname__r   r   r   r   r   r   r$   r$   r$   r,   rr      s    
)
~rr   c                   @   s   e Zd Zdd ZdS )pisaCSSParserc              
   C   s   d }| j }| jj|| j d}|sd S | j r%t| j jr%t| j || _ nt|j| _ z| |	 }|| _ W |S  t
yO } zt| W Y d }~|S d }~ww )Nrv   )r   r   r   rj   rk   urljoinrq   r   parseZgetDatar   print)r(   ZcssResourceNamer   ZoldRootPathZcssFileer$   r$   r,   parseExternalt  s"   zpisaCSSParser.parseExternalN)r   r   r   r   r$   r$   r$   r,   r   r  s    r   c                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )PageNumberTextc                 O   
   d| _ d S NrK   r   r(   argsr)   r$   r$   r,   __init__     
zPageNumberText.__init__c                 C      | j jd urt| j j| _dS NF)flowableZpagerl   r   r(   keyr$   r$   r,   __contains__     zPageNumberText.__contains__c                 C      | j gS ri   r   r(   rO   r$   r$   r,   split     zPageNumberText.splitc                 C      | j s| j S | j | S ri   r   r(   indexr$   r$   r,   __getitem__     
zPageNumberText.__getitem__c                 C   
   || _ d S ri   r   r(   r   r$   r$   r,   setFlowable  r   zPageNumberText.setFlowablec                 C      | j S ri   r   r(   r$   r$   r,   __str__     zPageNumberText.__str__N)	r   r   r   r   r   r   r   r   r   r$   r$   r$   r,   r     s    r   c                   @   r   )PageCountTextc                 O   r   r   r   r   r$   r$   r,   r     r   zPageCountText.__init__c                 C   r   ri   r   r   r$   r$   r,   r     r   zPageCountText.__str__c                 C   r   r   )r   Z	pagecountrl   r   r   r$   r$   r,   r     r   zPageCountText.__contains__c                 C   r   ri   r   r   r$   r$   r,   r     r   zPageCountText.splitc                 C   r   ri   r   r   r$   r$   r,   r     r   zPageCountText.__getitem__c                 C   r   ri   r   r   r$   r$   r,   r     r   zPageCountText.setFlowableN)	r   r   r   r   r   r   r   r   r   r$   r$   r$   r,   r     s    r   c                 C   s.   t | d}dt|}|d d d }|S )N )rl   r   joinreversed)Zsentencewordsreverse_sentencer$   r$   r,   r     s   r   c                   @   s  e Zd ZdZdHddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dIddZdd Zdd Zdd Zdd Zdd Zdd  ZdJd"d#Zd$d% Zd&d' Zd(d) Zd*d+ ZdKd-d.Zd/d0 Zd1d2 ZdLd4d5Zd6d7 Zd8d9 Zd:d; Zd<d= ZdId>d?ZdMdAdBZ dIdCdDZ!dNdFdGZ"dS )OpisaContextzZ
    Helper class for creation of reportlab story and container for
    various data.
    r   r   c                 C   s  t  tjj| _t  tj | _t| dg dd t| dd  t| dd t| dd t| d	i dd || _	t
 | _d
| _t| _td| _ttd|    | _| _d| _d
| _d| _d | _|pbd| _t| j}|jsytt| j   | _t!| j| _"t#ddddtd| _$d S )N)ro   storyrO   r~   r   r   r   
anchorFragZ
anchorNamefragList
fragAnchor	fragStackT)Z_copy)nodeindexing_storyr   ZkeepInFrameIndexZ	tableDataimage)errwarnuidctrZlistCounterr   )rO   cssTextcssDefaultTextrK   )r   r   	imageDataFZ12pt	default%dZltrZ	__dummy__)authortitlesubjectkeywordsr   )%copyr!   r   ZDEFAULT_FONTfontListutilZget_default_asian_fontasianFontListr   capacityr    toc
multiBuildr   r   r   ZbaseFontSizerh   r   r   rg   	fragBlock	fragStripforcedirpathCallbackZpathDocumentrj   rk   rl   r   absolutern   rq   pathDirectorydictmeta)r(   ro   debugr	  rp   r$   r$   r,   r     sL   

zpisaContext.__init__c                 C   s   |dkrd| j _|| _d S )NrJ   T)rg   rJ   r  )r(   r  r$   r$   r,   setDir  s   
zpisaContext.setDirc                 C   s   |  j d7  _ | j S )NrM   )r   r   r$   r$   r,   r     s   zpisaContext.UIDc                 C   N   |  }|dr|dd }|dr|dd }|  j|  d 7  _d S Nz	<![CDATA[	   z<!--   
)strip
startswithr   r(   valuer$   r$   r,   addCSS     

zpisaContext.addCSSc                 C   r  r  )r  r  r   r  r$   r$   r,   addDefaultCSS  r"  zpisaContext.addDefaultCSSc                 C   s   dd l }tg dd| _|| | j_tdd t_t| j| _| j	| j_
|| | j_tdd t_| j| j| _| j| j| _tj| j| jd| _| j| j_d S )Nr   )allr   Zpdf)Z	mediumSetc                 S      |   S ri   _cr   r$   r$   r,   <lambda>      z&pisaContext.parseCSS.<locals>.<lambda>c                 S   r%  ri   r&  r   r$   r$   r,   r(    r)  )Z	userAgentuser)weakrefrr   Z
cssBuilderrefr'  propertyr   r   r   r  r   r   r   r   r   Z
cssDefaultZCSSCascadeStrategyZ
cssCascadeparser)r(   r+  r$   r$   r,   parseCSS	  s   
zpisaContext.parseCSSc                 C   s   | j | d S ri   )r   r   )r(   r   r$   r$   r,   addStory"     zpisaContext.addStoryNc                 C   s.   |d ur|ng }t  |t  | j| _}|S ri   )r  r   )r(   r   r$   r$   r,   	swapStory%  s   zpisaContext.swapStoryc                 C   s   t d|   |jd}t||d t|j|j |jd |_|jp#|j	|_|j|_
|jd u r5|jr5|j|_|jd u rA|jrA|j|_|jd u rM|jrM|j|_|jd u rY|jrY|j|_t|j	|j|j|_	|S )Nr   )rI   )rP   rS   rU   r@   r4   r5   r6   r7   r8   rT   rW   r>   rD   r`   r^   r_   rc   ra   rb   rZ   rX   rY   r]   r[   r\   r<   r=   r:   r;   r9   g      ?)r   r   rI   r   maxr2   r3   rS   re   rP   ZbulletFontSizer_   r^   rT   rb   ra   rY   rX   r\   r[   r   rQ   rR   )r(   r   rf   r$   r$   r,   toParagraphStyle*  s*   	zpisaContext.toParagraphStylec              	   C   s   g }t dD ]+}d| | jjd< tj| j| | _tj| dddddd | | j	}|
| q|| j_| | j d | _d S )N   zpdftoclevel%dclassr   )r   r   r   r   T)ranger   Z
attributesr!   r.  Z
CSSCollectZcssAttrZCSS2Fragr4  rg   r   r
  ZlevelStylesr0  r   )r(   ZstylesiZpstyler$   r$   r,   addTOCV  s"   
zpisaContext.addTOCc                 C   s   | j st | _d| _ d S d S )NT)r  r   r   r   r$   r$   r,   addPageCounth  s   
zpisaContext.addPageCountc                 C      t  }|| |S ri   )r   r   )r(   flowZpcr$   r$   r,   getPageCountm     
zpisaContext.getPageCountc                 C   r;  ri   )r   r   )r(   r<  Zpgnumberr$   r$   r,   addPageNumberr  r>  zpisaContext.addPageNumberc                 C   s   d S ri   r$   )r(   fragsrf   r$   r$   r,   dumpParaw     zpisaContext.dumpParaFc                 C   s  |p| j }d| _ t| j}d}| jD ]}t|j|j|j }t||j|j |}||_q|s6| j	
 r| jr| j}| |}|jrE||_nt|j|j|j |_t|j}d |_|set| j| j dkr| jrv| j| jd jdd n| j }	d|	_d|	_	| j|	 | | j| j | t| dr| d}
t| j	|
}|d kr|| _	t| j	|| j| j || jd}|j|_|j|_|j|_|j|_d	|_| j rt!|| j | j"#d
dd}| $| g | _d |_d | _ i | _"| %  d S )NFr   r   rK   )rO   rN   language)r@  r'   r  r3  Zalignr   )Zside)&r  r   r   r   rV   rS   r3   r3  r2   rO   r  r  r4  r  r'   lenr   r   r-   rg   rP   rA  hasattr__getattribute__r   r   r  rG   r?   rH   rI   ZautoLeadingr   r   r   r|   r0  	clearFrag)r(   r  Z	rfragListZ
maxLeadingrg   r2   r   rf   r'   ZblankrC  Zdetect_language_resultZparar$   r$   r,   addParaz  s~   








zpisaContext.addParac                 C   s   g | _ d| _d| _d S )NTrK   )r   r  rO   r   r$   r$   r,   rG    r   zpisaContext.clearFragc                 K   s   | j jdi |S Nr$   rg   r-   r(   kwr$   r$   r,   copyFrag  s   zpisaContext.copyFragc                 K   s   | j jdi || _ | j S rI  rJ  rK  r$   r$   r,   newFrag  s   zpisaContext.newFragc                 C   s<   |j r|j dr| j||j dd  f | j| d S )N#rM   )rA   r  r   r   r   )r(   rg   r$   r$   r,   _appendFrag  s   zpisaContext._appendFragrK   c                 C   s8  | j   }}|jdkr|jdkrd|_d|_|jr+|j t |_t|jt d|_n|jr=|jt	 |_t|jt d|_t
|j|j|j |_|_t|ttfr[||_| | d S |dddtdt}|jdkrtd	|D ]B}|  j|7  _d
|v sd|v r| }d|_d|_| | qt|dd}td|D ]}| }|dkrt}||_| | qqtd S tdt d |D ]V}| }|tkrd| _t|_|  j|7  _| | qdd| d  dd |_t| |j}|r||_| jr|j |_|jrd| _|  j|j7  _| | qd S )NrM   r         ­rK   u   Â r#   prez(\r\n|\n|\r)r  	z        z(\ )r   ()Tr   r   F)rg   r-   r.   r/   rS   subFractionr0   r3  	sizeDeltasuperFractionr   rP   rQ   rR   re   r   r   r   rO   rP  replaceNBSPrd   rer   Z	lineBreakr  r   r   r  lstrip)r(   rO   rg   ZbaseFragZlanguage_checkr$   r$   r,   addFrag  sr   

 zpisaContext.addFragc                 C   s   | j | j |   d S ri   )r   r   rg   rN  r   r$   r$   r,   pushFrag.  s   zpisaContext.pushFragc                 C   s   | j  | _d S ri   )r   poprg   r   r$   r$   r,   pullFrag2  r1  zpisaContext.pullFragr5  c                 C   s0   zt d| j  d | W S    Y dS )Nr   rK   )reprr   r   Ztoxmlr   )r(   lr$   r$   r,   _getFragment6  s   "zpisaContext._getFragmentc                 C   s   dS )Nr   r$   r   r$   r$   r,   _getLineNumber<  rB  zpisaContext._getLineNumberc                 C   s   dt || df S )Nz%s
%s2   )rl   re  )r(   msgr$   r$   r,   context?  s   zpisaContext.contextc                 G   Z   |  j d7  _ | jtjj|  t|| df z| 	|| W S    | 	| Y S NrM   rg  )
r   r~   r   r!   r   ZPML_WARNINGrf  rl   re  ri  r(   rh  r   r$   r$   r,   r   D     zpisaContext.warningc                 G   rj  rk  )
r   r~   r   r!   r   Z	PML_ERRORrf  rl   re  ri  rl  r$   r$   r,   errorM  rm  zpisaContext.errorc                 C   s"   |du rdS t ||p| j| jdS )z-
        Returns a file name or None
        N)callback)r   r  r  )r(   r   rw   r$   r$   r,   r   V  s   zpisaContext.getFile	helveticac                 C   s   t |turt|}| d}|D ],}t|}|  }|| jv r0| j|d}t| n| j	|d}|dur?|  S q| j	|dS )z 
        Name of a font
        ,N)
r   ListTyperl   r  r   r}   r  r|   r   r  )r(   r   r   r   r   r$   r$   r,   getFontName^  s   

zpisaContext.getFontNamec                 C   sF   |d ur|ng }t || jt | < |D ]}t || jt |< qd S ri   )rl   r  r}   )r(   Zfontnamealiasr   r$   r$   r,   registerFontr  s
   zpisaContext.registerFontWinAnsiEncodingc                 C   sv  |r7|r9|}|j }td| t|tr |dr |d}t|tu r)|}n
dd |	dD }dd |D }|}|d }	|	d	}
d	
|
d d
 |
d
 }}| }|dv rd|	||f }|| jv rrt| d| d S | }t||}t| dD ]}dD ]}d|	||f | jvrt|	||| qq| |	||g  d S |dv r-|dkr| }t|d |jd}| }n| }t|d |jd}| }d|	||f }|| jv rt| d|	 d S t||}|j}t| t|||}t| dD ]}dD ]}d|	||f | jvrt|	||| q	q| |	|||g  d S t| d d S d S d S )NzLoad font %rrO  c                 s   s     | ]}|r|   V  qd S ri   )r}   r  .0r   r$   r$   r,   	<genexpr>  s    z'pisaContext.loadFont.<locals>.<genexpr>rq  c                 S   s   g | ]}t |qS r$   )rl   rw  r$   r$   r,   
<listcomp>  s    z(pisaContext.loadFont.<locals>.<listcomp>r   .r   )ZttcZttfz%s_%d%dz+Repeated font embed for %s, skip new embed )r   rM   )afmpfbr|  z.pfb)basepathz.afmz*Repeated font embed for %s, skip new embedzwrong attributes for <pdf:font>)r   r~   r  r   rl   r  r  r   rr  r   r   r}   r  r   ZgetNamedFiler	   r   ru  r   r   r~  ZEmbeddedType1Facer   ZregisterTypeFaceZFont)r(   r   rt   encodingrQ   rR   fileZ	fontAliasZffnamerP   rp   ZbaseNamesuffixZfullFontNamefilenamer|  Ztfiler}  ZfaceZfontNameOriginalZjustFontr$   r$   r,   r   y  s   











zpisaContext.loadFont)r   r   ri   )F)rK   N)r5  )rp  )rv  r   r   )#r   r   r   __doc__r   r  r   r!  r#  r/  r0  r2  r4  r9  r:  r=  r?  rA  rH  rG  rM  rN  rP  r_  r`  rb  re  rf  ri  r   rn  r   rs  ru  r   r$   r$   r$   r,   r     sB    
.	
,
U
M
	
	

r   )Nr  loggingosr]  pathlibr   Z	reportlabr   Zreportlab.lib.enumsr   Zreportlab.lib.fontsr   Zreportlab.lib.pagesizesr   Zreportlab.lib.stylesr   Zreportlab.pdfbaser   Zreportlab.pdfbase.ttfontsr	   Zreportlab.platypus.framesr
   r   Zreportlab.platypus.paraparserr   r   r   Zxhtml2pdf.defaultr!   Zxhtml2pdf.parserZxhtml2pdf.filesr   r   Zxhtml2pdf.utilr   r   r   r   r   r   r   r   r   r   Zxhtml2pdf.w3cr   Zxhtml2pdf.xhtml2pdf_reportlabr   r   r   r   r    urllib.parser   rj   r   Z	TupleTyperz   rr  ZwarnOnMissingFontGlyphs	getLoggerr~   rY  rX  rZ  r\  r-   rh   rq   Z
CSSBuilderrr   Z	CSSParserr   r   r   r   objectr   r$   r$   r$   r,   <module>   sP   0
9 j