U
    ?e                     @   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   s8   t f | j}|r.|j}|| d|kr.|d= d |_|S )NZcbDefn)r   __dict__update
bulletText)selfkwargsnd r+   5/tmp/pip-unpacked-wheel-35p66c5k/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	underline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borderLeftWidthrD   borderLeftColorrC   borderLeftStyleborderRightWidthborderRightColorborderRightStyleborderTopWidthborderTopColorborderTopStyleborderBottomWidthborderBottomColorborderBottomStyle
whiteSpacebulletFontNameZzoom)stylefragr+   r+   r,   getParaFragH   sL    
ri   c                 C   s*   t  | }|jr| S tt| j S d S N)urlparseschemestrr   parentresolve)pathpartsr+   r+   r,   
getDirName   s    
rr   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|kr8i i fS |d }t|dd }|dk}|s||dkr|t| j	d| t|d	d
 dk}|d }g }	t
|d tr|D ]}
t
|
tr|	|
 qn
|	| |	D ]6}| j	j|| j	jjd}| s| j	j||||d qi i fS )z
        Embed fonts
        *r   srczfont-familyzfont-weightrM   )rR   Zbolder500Z600Z700Z800Z900z)@fontface, unknown value font-weight '%s'z
font-stylerL   )rS   Zobliquerelative)rR   rS   )rulesetselectorlistvaluesrm   getlowerlogwarningc
isinstanceappendr   	cssParserrootPathZnotFoundloadFont)r'   declarationsresultdatanamesZfweightrR   rS   uriZfontspartfontru   r+   r+   r,   
atFontFace   s>    



 zpisaCSSBuilder.atFontFaceFNr   r   c                 C   s   | j }|sd|  }|ddr2|d |d f}t||d |d \}}}	}
|rn|d |d||||	|
|fS ||dd |d||||	|
|fS )Nz-pdf-frame-%dZis_landscapeFrN   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   sb   |sdd }t |ttfkrF|D ]"}||kr<|||   S |  S n||krZ||| S |S d S )Nc                 S   s   | S rj   r+   )r   r+   r+   r,   func       z)pisaCSSBuilder._getFromData.<locals>.func)typer{   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< |rht|d t|d g|d	< |rxt||d
< |rt||d< |rt||d< |S )Nzbackground-object-positionzbackground-heightzbackground-widthzbackground-opacityzbackground-page-steprN   stepr   object_positionrF   rG   opacity)r}   r   r   )r'   r   devr   rF   rG   r   r+   r+   r,   get_background_context   s    z%pisaCSSBuilder.get_background_contextc           #      C   sv  | j }|pd}||jkr,t| j d| | |ddt}| |ddt}| |ddt}	| |ddt}
| |dd t}| |d	dt}d
D ].}||kr|j| j	||d||j
d  qqg }g }|jD ]Z\}}}}}}}}| |d|t}| |d|t}| |d|	t}| |d|
t}| |d|t}| |d	|t}|sP|r`t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|< || q|| q|dd } | |}!| r^| j j| | j jjd} |st|d | j	||d||j
d\}}}}}}}}t|||||j
\}}}}|dks|dkrt|d |s|rt }nt||d}|t|||||||	|
||d
 t|||j
d}"||"_| |"_|j|"_|!|"_|rR|"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bottomrG   rF   T)r   r   r   )rG   )colorrG   rN   z<Negative width or height of frame. Check @frame definitions.)idZleftPaddingZrightPaddingZbottomPaddingZ
topPaddingZshowBoundaryzbackground-imagerw   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_widthpropr   Z
staticListfnameZstaticr   r   r   r   r   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   s|   |rt|  | dg|}|d }|rtz| d }W n  tk
rT   | d }Y nX | jj| j||| jj	d i i fS )Nrt   r   rN   )r   )
ry   rz   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,   rs      s   )

~rs   c                   @   s   e Zd Zdd ZdS )pisaCSSParserc              
   C   s   d }| j }| jj|| j d}|s$d S | j rJt| j jrJt| j || _ nt|j| _ z| |	 }|| _ W n* t
k
r } zt| W 5 d }~X Y nX |S )Nrw   )r   r   r   rk   rl   urljoinrr   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                   @   s<   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   s
   d| _ d S NrL   r   r'   argsr(   r+   r+   r,   __init__  s    zPageNumberText.__init__c                 C   s   | j jd k	rt| j j| _dS NF)flowablepagerm   r   r'   keyr+   r+   r,   __contains__  s    zPageNumberText.__contains__c                 C   s   | j gS rj   r   r'   rP   r+   r+   r,   split  s    zPageNumberText.splitc                 C   s   | j s| j S | j | S rj   r   r'   indexr+   r+   r,   __getitem__  s    zPageNumberText.__getitem__c                 C   s
   || _ d S rj   r   r'   r   r+   r+   r,   setFlowable  s    zPageNumberText.setFlowablec                 C   s   | j S rj   r   r'   r+   r+   r,   __str__  s    zPageNumberText.__str__N)	r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   r     s   r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )PageCountTextc                 O   s
   d| _ d S r   r   r   r+   r+   r,   r     s    zPageCountText.__init__c                 C   s   | j S rj   r   r   r+   r+   r,   r     s    zPageCountText.__str__c                 C   s   | j jd k	rt| j j| _dS r   )r   Z	pagecountrm   r   r   r+   r+   r,   r     s    zPageCountText.__contains__c                 C   s   | j gS rj   r   r   r+   r+   r,   r     s    zPageCountText.splitc                 C   s   | j s| j S | j | S rj   r   r   r+   r+   r,   r     s    zPageCountText.__getitem__c                 C   s
   || _ d S rj   r   r   r+   r+   r,   r     s    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 )rm   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dMd>d?ZdNdAdBZ dOdCdDZ!dPdFdGZ"dS )Q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 | _|pd| _t| j}|jstt| j   | _t!| j| _"t#ddddtd| _$d S )N)rp   storyrP   r   r   r   r   
anchorFragZ
anchorNamefragList
fragAnchor	fragStackT)Z_copy)nodeindexing_storyr   ZkeepInFrameIndexZ	tableDataimage)errwarnuidctrZlistCounterr   )rP   cssTextcssDefaultTextrL   )r   r   	imageDataFZ12pt	default%dZltr	__dummy__)authortitlesubjectkeywordsr   )%copyr!   r   ZDEFAULT_FONTfontListutilZget_default_asian_fontasianFontListr   capacityr    toc
multiBuildr   r   r   ZbaseFontSizeri   r   r   rh   	fragBlock	fragStripforcedirpathCallbackZpathDocumentrk   rl   rm   r   absolutero   rr   pathDirectorydictmeta)r'   rp   debugr  rq   r+   r+   r,   r     sP      

zpisaContext.__init__c                 C   s   |dkrd| j _|| _d S )NrK   T)rh   rK   r	  )r'   r	  r+   r+   r,   setDir  s    zpisaContext.setDirc                 C   s   |  j d7  _ | j S )NrN   )r   r   r+   r+   r,   r     s    zpisaContext.UIDc                 C   sN   |  }|dr|dd }|dr4|dd }|  j|  d 7  _d S Nz	<![CDATA[	   z<!--   
)strip
startswithr   r'   valuer+   r+   r,   addCSS  s    

zpisaContext.addCSSc                 C   sN   |  }|dr|dd }|dr4|dd }|  j|  d 7  _d S r  )r  r  r   r  r+   r+   r,   addDefaultCSS  s    

zpisaContext.addDefaultCSSc                 C   s   dd l }tdddg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   |   S rj   _cr   r+   r+   r,   <lambda>  r   z&pisaContext.parseCSS.<locals>.<lambda>c                 S   s   |   S rj   r  r   r+   r+   r,   r    r   )Z	userAgentuser)weakrefrs   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 rj   )r   r   )r'   r   r+   r+   r,   addStory"  s    zpisaContext.addStoryNc                 C   s.   |d k	r|ng }t  |t  | j | _}|S rj   )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pF|j	|_|j|_
|jd krj|jrj|j|_|jd kr|jr|j|_|jd kr|jr|j|_|jd kr|jr|j|_t|j	|j|j|_	|S )Nr   )rJ   )rQ   rT   rV   rA   r5   r6   r7   r8   r9   rU   rX   r?   rE   ra   r_   r`   rd   rb   rc   r[   rY   rZ   r^   r\   r]   r=   r>   r;   r<   r:   g      ?)r   r   rJ   r   maxr3   r4   rT   rf   rQ   ZbulletFontSizer`   r_   rU   rc   rb   rZ   rY   r]   r\   r   rR   rS   )r'   r   rg   r+   r+   r,   toParagraphStyle*  s.    
 
 	zpisaContext.toParagraphStylec              	   C   s   g }t dD ]V}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   
attributesr!   r$  Z
CSSCollectZcssAttrZCSS2Fragr)  rh   r   r  ZlevelStylesr&  r   )r'   ZstylesiZpstyler+   r+   r,   addTOCV  s"    zpisaContext.addTOCc                 C   s   | j st | _d| _ d S )NT)r  r   r   r   r+   r+   r,   addPageCounth  s    zpisaContext.addPageCountc                 C   s   t  }|| |S rj   )r   r   )r'   flowZpcr+   r+   r,   getPageCountm  s    
zpisaContext.getPageCountc                 C   s   t  }|| |S rj   )r   r   )r'   r1  Zpgnumberr+   r+   r,   addPageNumberr  s    
zpisaContext.addPageNumberc                 C   s   d S rj   r+   )r'   fragsrg   r+   r+   r,   dumpParaw  s    zpisaContext.dumpParaFc                 C   s  |p| j }d| _ t| j}d}| jD ]2}t|j|j|j }t||j|j |}||_q$|sp| j	
 r| jr| j}| |}|jr||_nt|j|j|j |_t|j}d |_|st| j| j dkr| jr| j| jd jdd n"| j }	d|	_d|	_	| j|	 | | j| j | t| drZ| d}
t| j	|
}|d krZ|| _	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   rL   )rP   rO   language)r4  r&   r	  r(  Zalignr   )Zside)&r  r   r   r   rW   rT   r4   r(  r3   rP   r  r  r)  r   r&   lenr   r   r-   rh   rQ   r5  hasattr__getattribute__r   r   r	  rH   r@   rI   rJ   ZautoLeadingr   r   r   r}   r&  	clearFrag)r'   r  Z	rfragListZ
maxLeadingrh   r3   r   rg   r&   Zblankr6  Zdetect_language_resultparar+   r+   r,   addParaz  s    


  
 
 




zpisaContext.addParac                 C   s   g | _ d| _d| _d S )NTrL   )r   r  rP   r   r+   r+   r,   r:    s    zpisaContext.clearFragc                 K   s   | j jf |S rj   rh   r-   r'   kwr+   r+   r,   copyFrag  s    zpisaContext.copyFragc                 K   s   | j jf || _ | j S rj   r=  r>  r+   r+   r,   newFrag  s    zpisaContext.newFragc                 C   s<   |j r,|j dr,| j||j dd  f | j| d S )N#rN   )rB   r  r   r   r   )r'   rh   r+   r+   r,   _appendFrag  s    zpisaContext._appendFragrL   c                 C   sF  | j   }}|jdkr.|jdkr.d|_d|_|jrV|j t |_t|jt d|_n$|jrz|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rztd	|D ]}|  j|7  _d
|ksd|kr0| }d|_d|_| | q|dd}td|D ],}| }|dkrbt}||_| | qHqntdt d |D ]}| }|tkrd| _t|_|  j|7  _| | ntdd| d  dd |_t| |j}|r||_| jr$|j |_|jr$d| _|  j|j7  _| | qd S )NrN   r         ­rL   u   Â r#   prez(\r\n|\n|\r)r  	z        z(\ )r   ()Tr   r   F)rh   r-   r.   r/   rT   subFractionr0   r(  	sizeDeltasuperFractionr   rQ   rR   rS   rf   r   r   r   rP   rC  replaceNBSPre   rer   Z	lineBreakr  r   r   r  lstrip)r'   rP   rh   ZbaseFragZlanguage_checkr+   r+   r,   addFrag  sz      
   

 zpisaContext.addFragc                 C   s   | j | j |   d S rj   )r   r   rh   rA  r   r+   r+   r,   pushFrag.  s    zpisaContext.pushFragc                 C   s   | j  | _d S rj   )r   poprh   r   r+   r+   r,   pullFrag2  s    zpisaContext.pullFragr*  c                 C   s6   z"t d| j  d | W S    Y dS X d S )Nr   rL   )reprr   r   Ztoxmlr   )r'   lr+   r+   r,   _getFragment6  s    "zpisaContext._getFragmentc                 C   s   dS )Nr   r+   r   r+   r+   r,   _getLineNumber<  s    zpisaContext._getLineNumberc                 C   s   dt || df S )Nz%s
%s2   )rm   rX  )r'   msgr+   r+   r,   context?  s    zpisaContext.contextc                 G   s`   |  j d7  _ | jtjj|  t|| df z| 	|| W S    | 	| Y S X d S NrN   rZ  )
r   r   r   r!   r   ZPML_WARNINGrY  rm   rX  r\  r'   r[  r   r+   r+   r,   r   D  s    zpisaContext.warningc                 G   s`   |  j d7  _ | jtjj|  t|| df z| 	|| W S    | 	| Y S X d S r]  )
r   r   r   r!   r   Z	PML_ERRORrY  rm   rX  r\  r^  r+   r+   r,   errorM  s    zpisaContext.errorc                 C   s"   |dkrdS t ||p| j| jdS )z-
        Returns a file name or None
        N)callback)r   r  r
  )r'   r   rx   r+   r+   r,   r   V  s    zpisaContext.getFile	helveticac                 C   s   t |tk	r"t|}| d}|D ]X}t|}|  }|| jkr`| j|d}t| n| j	|d}|dk	r&|  S q&| j	|dS )z 
        Name of a font
        ,N)
r   ListTyperm   r  r   r~   r  r}   r   r   )r'   r   r   r   r   r+   r+   r,   getFontName^  s    


zpisaContext.getFontNamec                 C   sF   |d k	r|ng }t || jt | < |D ]}t || jt |< q*d S rj   )rm   r   r~   )r'   Zfontnamealiasr   r+   r+   r,   registerFontr  s    zpisaContext.registerFontWinAnsiEncodingc                 C   st  |rp|rp|}|j }td| t|tr@|dr@|d}t|tkrR|}ndd |	dD }dd |D }|}|d }	|	d	}
d	
|
d d
 |
d
  }}| }|dkrRd|	||f }|| jkrt| d| nj| }t||}t| dD ]6}dD ]*}d|	||f | jkrt|	||| qq| |	||g  n|dkr`|dkr| }t|d |jd}| }n"| }t|d |jd}| }d|	||f }|| jkrt| d|	 nt||}|j}t| t|||}t| dD ]6}dD ]*}d|	||f | jkrt|	||| qq| |	|||g  nt| d d S )NzLoad font %rrB  c                 s   s   | ]}|r|   V  qd S rj   )r~   r  .0r   r+   r+   r,   	<genexpr>  s      z'pisaContext.loadFont.<locals>.<genexpr>rb  c                 S   s   g | ]}t |qS r+   )rm   rh  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   rN   )afmpfbrm  z.pfb)basepathz.afmz*Repeated font embed for %s, skip new embedzwrong attributes for <pdf:font>)r   r   r  r   rm   r  r  r   rc  r   r   r~   r   r   ZgetNamedFiler	   r   rf  r   r   ro  ZEmbeddedType1Facer   ZregisterTypeFaceZFont)r'   r   ru   encodingrR   rS   fileZ	fontAliasZffnamerQ   rq   baseNamesuffixZfullFontNamefilenamerm  Ztfilern  faceZfontNameOriginalZjustFontr+   r+   r,   r   y  s    






   




  
    
zpisaContext.loadFont)r   r   )N)F)rL   N)r*  )N)ra  )N)rg  r   r   )#r   r   r   __doc__r   r  r   r  r  r%  r&  r'  r)  r/  r0  r2  r3  r5  r<  r:  r@  rA  rC  rR  rS  rU  rX  rY  r\  r   r_  r   rd  rf  r   r+   r+   r+   r,   r     s@   
.	
,
U
M
		


r   )Nr   loggingosrP  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   rk   r   Z	TupleTyper{   rc  ZwarnOnMissingFontGlyphs	getLoggerr   rL  rK  rM  rO  r-   ri   rr   Z
CSSBuilderrs   Z	CSSParserr   r   r   r   objectr   r+   r+   r+   r,   <module>   sN   0
9 j