U
    ?eal                     @   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Zd dlmZ d dl	m
Z
m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mZ d dlmZmZmZ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+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF d d	lGmHZH d d
lImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQ d dlRmSZS d dlTmUZUmVZV i aWeXdZYeZdej[ej\B Z]G dd de^Z_dd Z`da b ZcedfddZeeeejfjgjh_eddiZidd Zjdd Zkdd Zldd Zmd d! Znd-d#d$Zod.d%d&Zpd/d)d*ZqeqZrd+d, ZsesZtdS )0    N)Node)treebuilders)
FrameBreakNextPageTemplate)KeepInFrame	PageBreak)BOOLBOXCOLORFILEFONTINTMUSTPOSSIZESTRINGTAGS)	TableDatapisaTagTABLE	pisaTagTD	pisaTagTR	pisaTagTH)%
pisaTagIMGpisaTagPDFLANGUAGEpisaTagPDFNEXTPAGEpisaTagpisaTagApisaTagBODY	pisaTagBR
pisaTagDIVpisaTagFONT	pisaTagH1	pisaTagH2	pisaTagH3	pisaTagH4	pisaTagH5	pisaTagH6	pisaTagHR	pisaTagLIpisaTagMETA	pisaTagOLpisaTagPpisaTagPDFBARCODEpisaTagPDFFONTpisaTagPDFFRAMEpisaTagPDFNEXTFRAMEpisaTagPDFNEXTTEMPLATEpisaTagPDFPAGECOUNTpisaTagPDFPAGENUMBERpisaTagPDFSPACERpisaTagPDFTEMPLATEpisaTagPDFTOCpisaTagSTYLE
pisaTagSUB
pisaTagSUPpisaTagTITLE	pisaTagULpisaTagINPUTpisaTagTEXTAREA)pisaTempFile)getAligngetBoolgetBoxgetColorgetPosgetSizetoListtransform_attrs)cssDOMElementInterface)PmlLeftPageBreakPmlRightPageBreakZ	xhtml2pdfzhttps?://[^/]+(.*)c                   @   s   e Zd Zdd ZdS )AttrContainerc                 C   s(   zt | |W S    | |  Y S X d S N)dict__getattr__)selfname rO   4/tmp/pip-unpacked-wheel-35p66c5k/xhtml2pdf/parser.pyrL   \   s    zAttrContainer.__getattr__N)__name__
__module____qualname__rL   rO   rO   rO   rP   rI   Z   s   rI   c              
   C   s2  i }|rD|  D ]2\}}zt||t|< W q   |||< Y qX qi }|tkr*t| \}}t|d< |  D ]\}}d ||< t|tkr|d tkr||krt| d| d ||< qn|	||d }	|d }
|d }n|	|d }	d }
|	d k	rnt|t
kr8|	  }	|	|kr t| d|t| |
}	n|tkrf|	  }	|	dddd	t|fk}	n|tkrzt|	}	W n   t| d
| Y nX n|tkrt|	| j}	nj|tkrt|	| j}	nR|tkrt|	}	n>|tkrt|	}	n*|tkr| |	}	n|tkr | |	}	|	||< qnt|S )Nid   zAttribute '%s' must be set!r   z4Attribute '%s' of wrong value, allowed is one of: %s1yyestruez#Attribute '%s' expects a size value)itemsstrr   r   typetupler   logwarninggetliststriplowerreprr   r   rC   r	   r@   ZpageSizer   rB   r   intr
   rA   r   getFiler   getFontNamerI   )ctag
attributesattrskvZnattrsblockZadefnvZdflrO   rO   rP   pisaGetAttributesc   st    
















rp   a  
    color
    font-family
    font-size
    font-weight
    font-style
    text-decoration
    line-height
    letter-spacing
    background-color
    display
    margin-left
    margin-right
    margin-top
    margin-bottom
    padding-left
    padding-right
    padding-top
    padding-bottom
    border-top-color
    border-top-style
    border-top-width
    border-bottom-color
    border-bottom-style
    border-bottom-width
    border-left-color
    border-left-style
    border-left-width
    border-right-color
    border-right-style
    border-right-width
    text-align
    vertical-align
    width
    height
    zoom
    page-break-after
    page-break-before
    list-style-type
    list-style-image
    white-space
    text-indent
    -pdf-page-break
    -pdf-frame-break
    -pdf-next-page
    -pdf-keep-with-next
    -pdf-outline
    -pdf-outline-level
    -pdf-outline-open
    -pdf-line-spacing
    -pdf-keep-in-frame-mode
    -pdf-word-wrap
    c                 C   s   || j kr| j | S z|| j||}W n tk
r@   d }Y nX z
| j}W n,   |j| j pfdd  }| _Y nX ||kr|| }|dkrt| j	dr| j	
|||}n|tk	r|S td|f |d k	r|| j |< |S )N r   Zinherit
getCSSAttrz5Could not find inherited CSS attribute value for '%s')cssAttrsZfindStyleFor
cssElementLookupErrorZcssStyleparserZparseInlineZgetStyleAttrhasattr
parentNoderr   NotImplemented)rM   
cssCascadeattrNamedefaultresultstylerO   rO   rP   rr      s6    




rr   Zbgcolorbackground-colorc                 C   s2   t D ](}||krt | | kr|| | t | < q| S rJ   )nonStandardAttrNames)rh   nZattrListattrrO   rO   rP   mapNonStandardAttrs  s    r   c                 C   sf   d } }}| j  D ]0\}}|dkr,|}q|dkr:|}q|dkr|}qdt| j| j |||f S )Nrq   classrT   r~   z%s#%s#%s#%s#%s)rj   rZ   rT   rx   tagNamerc   )nodeZ_clZ_idZ_strl   rm   rO   rO   rP   getCSSAttrCacheKey  s    r   c              	   C   s   |j rt| }t| jdrH| jj dkrHt|d }|d k	rH|| _|S t	
| | _i | _i }tD ]@}z| |j|||< W qb tk
r   tjd|dd Y qbX qb| jt|< | jS )Nr   htmlzCSS error '%s'rU   )exc_info)cssr   rw   rx   r   rc   CSSAttrCacher`   rs   rF   ZCSSDOMElementInterfacert   	attrNamesrr   rz   	Exceptionr^   debug)r   rh   _keyZCachedCSSAttrZ
cssAttrMapZcssAttrNamerO   rO   rP   
CSSCollect#  s*     
r   c                 C   s"   t | tr|  S | d  S d S )Nr   )
isinstancer[   rc   )sequencerO   rO   rP   rc   C  s    
rc   c                 C   s  d| j krt| j d d| j_d| j kr<t| j d d| j_d| j krZ| | j d | j_d| j krttd	| j d | jj
| jd| j_
d	| j krd	| j d	 }t|| jj
| j_|| j_nt| jj| jj
| j_d
| j kr| j d
 | j_d| j krtd	| j d | j_d| j krJt| j d }|dkrBd| j_nd| j_t| j ddD ]D}d|krrd| j_d|krd| j_d|kr\d| j_d| j_q\d| j krt| j d }|dkrd| j_nd| j_d| j krt| j d  | j_d| j krt| j d | j_d| j kr2| j d | j_d| j krzd	t| j d | j_W n2 tk
r   d	t| j d d | j_Y nX | jjdkrd | j_d| j krzd	t| j d | j_W n2 tk
r   d	t| j d d | j_Y nX | jjdkrd | j_d| j krbd	t| j d }|drVt |d d d }t || j_!|r@t"| jd | j t| jj
d! d"| j kr|d" | j_#|d"  t| j d" | jj
7  < |d" | j_$d#| j kr|d#  t| j d# | jj
7  < |d# | j_%d$| j kr t| j d$  | j_&d%| j kr@| '| j d% | j_(|r`t"| jd&| j t| jj
d! |rt"| jd'| j t| jj
d! t"| jd(| j d)d*  t"| jd+| j t d S ),Ncolorz#000000r   z#ffffffzfont-familyz	font-sizerq   g      ?zline-heightzletter-spacingz-pdf-line-spacingzfont-weight)boldZbolder500Z600Z700Z800Z900rU   r   ztext-decoration	underlinezline-throughnonez
font-style)italicZobliquezwhite-spacez
text-alignzvertical-alignheight)autowidthzoom%g      Y@))ZspaceBefore
margin-top)Z
spaceAftermargin-bottom)ZfirstLineIndentztext-indent)extrasmargin-leftmargin-rightzlist-style-typezlist-style-image))Z
paddingTopzpadding-top)ZpaddingBottomzpadding-bottom)ZpaddingLeftzpadding-left)ZpaddingRightzpadding-right))ZborderTopWidthzborder-top-width)ZborderBottomWidthzborder-bottom-width)ZborderLeftWidthzborder-left-width)ZborderRightWidthzborder-right-width))ZborderTopStylezborder-top-style)ZborderBottomStylezborder-bottom-style)ZborderLeftStylezborder-left-style)ZborderRightStylezborder-right-stylec                 S   s   | S rJ   rO   )xrO   rO   rP   <lambda>      zCSS2Frag.<locals>.<lambda>))ZborderTopColorzborder-top-color)ZborderBottomColorzborder-bottom-color)ZborderLeftColorzborder-left-color)ZborderRightColorzborder-right-color))cssAttrrA   fragZ	textColorZ	backColorrg   ZfontNamemaxrC   joinZfontSizeZbaseFontSizeleadingZleadingSourceZletterSpacingZleadingSpacerc   r   rD   r`   r   striker   r[   Z
whiteSpacer>   	alignmentZvAlignr   	TypeErrorr   endswithfloatr   rE   ZbulletIndentZ
leftIndentZrightIndentZlistStyleTyperf   ZlistStyleImage)rh   kwisBlockr   valuer   rO   rO   rP   CSS2FragJ  s    



 









""

 
r   Fc                 C   s*  d}| j tjkr|r| j}n| j tjkr| j }|dkrt||| j}dd |j	 
dD }|dd dkr|rd|ksd	|ksd
|kr|dkr| jD ]} |t| |dd7 }q|| dS |dkr|jr|j dkr|d|jd|f  | jD ]"} t| ||d}|r||7 }q|S )z%
    Collect all CSS definitions
    rq   )r~   linkc                 S   s   g | ]}|  r|  qS rO   )rb   ).0r   rO   rO   rP   
<listcomp>  s    zpisaPreLoop.<locals>.<listcomp>,r\   )rq   ztext/cssallprintZpdfr~   T)collectr   Z
stylesheetz
@import "%s" %s;)nodeTyper   	TEXT_NODEdataELEMENT_NODEr   rc   rp   rj   mediasplitr`   
childNodespisaPreLoopZaddCSShrefrelr   )r   contextr   r   rN   r   r   r}   rO   rO   rP   r     sB    



r   c                 K   sf  |d krg }|s ddddd}n
t  |}| jtjkrF|| j n| jtjkrD| jdd	 | _| jdkrvd S t  || jg }t
|| j| j}t| ||_t|j| ||_| |_d}d}d}d	}d	}	t	|jd
d}
|
dk}|r|  d|jkr|tt|jd  d|jkrJt|jd 	 dkrJ|t  d|jkrt|jd 	 dkrz|t  t|jd 	 dkrd}	d|jkr&t|jd 	 dkr|t  t|jd 	 dkr|t  |t  t|jd 	 dkr&|t  |t  d|jkrt|jd 	 dkrN|}t|jd 	 dkrj|}t|jd 	 dkr|}|
dkrd S |  t||| t|jd|jt d|jkrt|jd |j_d|jkr|jd |j_ d }d}d}d|jkr4t|jd ! 	 }|dkr0|}nd}d|jkrTt"d#|jd }d |jkrtt"d#|jd  }|d k	o|j$d k}|rt%|j&|_$t' d!| jdd(  d }d }|d"d }|j)|d }|r|j j*d7  _*|+ }|d k	r|| |}|,| t  |j |_-}| j.D ]}t/|||f| q,||_-|rZ|0| |r|  |r|t  ||kr|t  ||kr|t  |	r|t  |r|j&|j$d  }|j&d |j$ |_&|j&1t2||||d# d |_$|r:|  |D ]}|j&|_3q|+| |j j*d8  _*|4  n| j.D ]} t/| ||f| qJd S )$Nr   )r   r   r   r   :rq   )r~   scriptrU         Fdisplayinlinern   z-pdf-next-pagez-pdf-page-breakbeforez-pdf-frame-breakafterTzpage-break-beforealwaysrightleftzpage-break-afterr   ))ZkeepWithNextz-pdf-keep-with-next)outlinez-pdf-outlinez-pdf-outline-levelz-pdf-word-wrapz-pdf-keep-in-frame-mode)shrinkerrorZoverflowtruncater   z-pdf-keep-in-frame-max-widthz-pdf-keep-in-frame-max-heightz	pisaTag%srT   )contentZmaxWidthZ	maxHeightmode)5copyr   r   r   ZaddFragr   r   r   replacerc   rp   rj   r   r   r   r   r`   ZaddParaZaddStoryr   r[   r   r   rH   rG   ZpushFragr   rE   r   r?   re   ZoutlineLevelZwordWraprb   rC   r   ZkeepInFrameIndexlenZstoryglobalsupperZframeStaticZinsideStaticFrameZ	swapStorystart	fragBlockr   pisaLoopendappendr   ZpisaStaticStoryZpullFrag)r   r   pathr   r   Z
PAGE_BREAKZPAGE_BREAK_RIGHTZPAGE_BREAK_LEFTZpageBreakAfterZframeBreakAfterr   r   ZkeepInFrameModeZkeepInFrameMaxWidthZkeepInFrameMaxHeightr   ZkeepInFrameklassobjZ	elementIdZstaticFrameZoldStoryr   ZnnodeZsubstoryframerO   rO   rP   r     s    














r   rq   utf8c           	      C   s   i a |r&td tjtdd}ntjtdd}i }t| t	rn|sNd}| 
|} t| |jd} ||d< |j| f|}|r||j|d |r|| t|| |  t|| |S )z
    - Parse HTML and get miniDOM
    - Extract CSS informations, add default CSS, parse CSS
    - Handle the document DOM itself and build reportlab story
    - Return Context object
    z5xhtml parameter will be removed on next release 0.2.8dom)treezutf-8)capacitytransport_encoding)encoding)r   r^   r_   html5libZXHTMLParserr   getTreeBuilder
HTMLParserr   r[   encoder=   r   parsewriteZtoprettyxmlZaddDefaultCSSr   ZparseCSSr   )	srcr   Zdefault_cssxhtmlr   Z
xml_outputrv   Zparser_kwargsdocumentrO   rO   rP   
pisaParser  s2    	





r   c                  O   s   d|d< t | |S )NTr   )HTML2PDF)ar   rO   rO   rP   	XHTML2PDF#  s    r   )F)N)rq   Fr   N)ur   loggingreZxml.dom.minidomxmlxml.domr   r   r   Zreportlab.platypus.doctemplater   r   Zreportlab.platypus.flowablesr   r   Zxhtml2pdf.defaultr   r	   r
   r   r   r   r   r   r   r   r   Zxhtml2pdf.tablesr   r   r   r   r   Zxhtml2pdf.tagsr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   Zxhtml2pdf.filesr=   Zxhtml2pdf.utilr>   r?   r@   rA   rB   rC   rD   rE   Zxhtml2pdf.w3crF   Zxhtml2pdf.xhtml2pdf_reportlabrG   rH   r   	getLoggerr^   compileMIZrxhttpstriprK   rI   rp   rb   r   r   ry   rr   r   minidomElementr   r   r   r   rc   r   r   r   r   r   r   ZXML2PDFrO   rO   rO   rP   <module>   sN   4((
	M7    
'
 `
9