o
    Fzcal                     @   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 N)dict__getattr__)selfname rO   /xhtml2pdf/parser.pyrL   \   s   zAttrContainer.__getattr__N)__name__
__module____qualname__rL   rO   rO   rO   rP   rI   Z   s    rI   c              
   C   s  i }|r |  D ]\}}z
t||t|< W q   |||< Y qi }|tv rt| \}}t|d< |  D ]\}}d ||< t|tkrl|d tkr[||vr[t| d| d ||< q5|	||d }	|d }
|d }n|	|d }	d }
|	d urt|t
kr|	  }	|	|vrt| d|t| |
}	nk|tkr|	  }	|	dddd	t|fv }	nU|tkrzt|	}	W nJ   t| d
| Y n<|tkrt|	| j}	n1|tkrt|	| j}	n&|tkrt|	}	n|tkrt|	}	n|tkr| |	}	n
|tkr| |	}	|	||< q5t|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   sx   








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 v r
| j | S z
|| j||}W n ty   d }Y nw z| j}W n   |j| j p2dd  }| _Y ||v rB|| }|dkrbt| j	drU| j	
|||}n|tur[|S td|f |d urk|| 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      s8   



rr   Zbgcolorbackground-colorc                 C   s2   t D ]}||v rt | | vr|| | t | < q| S rJ   )nonStandardAttrNames)rh   nZattrListattrrO   rO   rP   mapNonStandardAttrs  s
   r   c                 C   sf   d } }}| j  D ]\}}|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 rUt| }t| jdr$| jj dkr$t|d }|d ur$|| _|S t	
| | _i | _i }tD ]}z| |j|||< W q1 tyO   tjd|dd Y q1w | 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 )Nr   )
isinstancer[   rc   )sequencerO   rO   rP   rc   C  s   
rc   c                 C   s  d| j v rt| j d d| j_d| j v rt| j d d| j_d| j v r-| | j d | j_d| j v rFttd	| j d | jj
| jd| j_
d	| j v rad	| j d	 }t|| jj
| j_|| j_nt| jj| jj
| j_d
| j v rx| j d
 | j_d| j v rtd	| j d | j_d| j v rt| j d }|dv rd| j_nd| j_t| j ddD ]}d|v rd| j_d|v rd| j_d|v rd| j_d| j_qd| j v rt| j d }|dv rd| j_nd| j_d| j v rt| j d  | j_d| j v rt| j d | j_d| j v r| j d | j_d| j v rGzd	t| j d | j_W n ty;   d	t| j d d | j_Y nw | jjdv rGd | j_d| j v rzd	t| j d | j_W n tys   d	t| j d d | j_Y nw | jjdv rd | j_d| j v rd	t| j d }|drt |d d d }t || j_!|rt"| jd | j t| jj
d! d"| j v r|d" | j_#|d"  t| j d" | jj
7  < |d" | j_$d#| j v r|d#  t| j d# | jj
7  < |d# | j_%d$| j v rt| j d$  | j_&d%| j v r| '| j d% | j_(|r$t"| jd&| j t| jj
d! |rJt"| jd'| j t| jj
d! t"| jd(| j d)d*  t"| jd+| j t d S d S ),NZ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>  s    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   Z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}np| j tjkr~| j }|dv r~t||| j}dd |j	 
dD }|dd dv r~|rId|v sId	|v sId
|v r~|dkrc| jD ]} |t| |dd7 }qP|| 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;N)nodeTyper   	TEXT_NODEdataELEMENT_NODEr   rc   rp   rj   mediasplitr`   
childNodespisaPreLoopZaddCSSZhrefrelr   )r   contextr   r   rN   r   r   r}   rO   rO   rP   r     sD   



r   c                 K   s`  |d u rg }|sddddd}nt  |}| jtjkr#|| j d S | jtjkr| jdd	 | _| jdv r;d S t  || jg }t
|| j| j}t| ||_t|j| ||_| |_d}d}d}d	}d	}	t	|jd
d}
|
dk}|r;|  d|jv r|tt|jd  d|jv rt|jd 	 dkr|t  d|jv rt|jd 	 dkr|t  t|jd 	 dkrd}	d|jv 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v r;t|jd 	 dkr|}t|jd 	 dkr-|}t|jd 	 dkr;|}|
dkrBd S |  t||| t|jd|jt d|jv rdt|jd |j_d|jv rq|jd |j_ d }d}d}d|jv rt|jd ! 	 }|dv r|}nd}d|jv rt"d#|jd }d |jv rt"d#|jd  }|d uo|j$d u }|rt%|j&|_$t' d!| jdd(  d }d }|d"d }|j)|d }|r|j j*d7  _*|+ }|d ur|| |}|,| t  |j |_-}| j.D ]}t/|||fi | q||_-|r'|0| |rV|  |rM|t  ||krB|t  ||krM|t  |	rV|t  |ry|j&|j$d  }|j&d |j$ |_&|j&1t2||||d# d |_$|r|  |D ]}|j&|_3q|+| |j j*d8  _*|4  d S | j.D ]} t/| ||fi | qd S )$Nr   )r   r   r   r   :rq   )r~   scriptrU         FdisplayZ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	r7|s'd}| 
|} t| |jd} ||d< |j| fi |}|rK||j|d |rR|| 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)capacityZtransport_encoding)encodingN)r   r^   r_   html5libZXHTMLParserr   ZgetTreeBuilderZ
HTMLParserr   r[   encoder=   r   parsewriteZtoprettyxmlZaddDefaultCSSr   ZparseCSSr   )	srcr   Zdefault_cssxhtmlr   Z
xml_outputrv   Zparser_kwargsZdocumentrO   rO   rP   
pisaParser  s2   	





r   c                  O   s   d|d< t | i |S )NTr   )HTML2PDF)ar   rO   rO   rP   	XHTML2PDF#  s   r   )FrJ   )rq   Fr   N)ur   loggingreZxml.dom.minidomxmlZ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   ZminidomZElementr   r   r   r   rc   r   r   r   r   r   r   ZXML2PDFrO   rO   rO   rP   <module>   sR   4((
	M47   

' 
`9