U
    =gg                     @  sz  U d dl mZ 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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK d dlLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZT d dlUmVZV d dlWmXZXmYZY eZe[Z\i a]de^d< e_dej`ejaB ZbG dd decZddd Zedf g ZheifddZjejejkjljm_jddiZndd Zodd Zpdd Zqd d! Zrd"d# Zsd$d%d&d'Ztd0d(d)Zud1d,d-ZvevZwd.d/ ZxexZydS )2    )annotationsN)Node)treebuilders)
FrameBreakNextPageTemplate)KeepInFrame	PageBreak)BOOLBOXCOLORFILEFONTINTMUSTPOSSIZESTRINGTAGS)pisaTempFile)	TableDatapisaTagTABLE	pisaTagTD	pisaTagTH	pisaTagTR)&pisaTagpisaTagApisaTagBODY	pisaTagBRpisaTagCANVAS
pisaTagDIVpisaTagFONT	pisaTagH1	pisaTagH2	pisaTagH3	pisaTagH4	pisaTagH5	pisaTagH6	pisaTagHR
pisaTagIMGpisaTagINPUT	pisaTagLIpisaTagMETA	pisaTagOLpisaTagPpisaTagPDFBARCODEpisaTagPDFFONTpisaTagPDFFRAMEpisaTagPDFLANGUAGEpisaTagPDFNEXTFRAMEpisaTagPDFNEXTPAGEpisaTagPDFNEXTTEMPLATEpisaTagPDFPAGECOUNTpisaTagPDFPAGENUMBERpisaTagPDFSPACERpisaTagPDFTEMPLATEpisaTagPDFTOCpisaTagSTYLE
pisaTagSUB
pisaTagSUPpisaTagTEXTAREApisaTagTITLE	pisaTagUL)getAligngetBoolgetBoxgetColorgetPosgetSizetoListtransform_attrs)cssDOMElementInterface)PmlLeftPageBreakPmlRightPageBreakzdict[str, dict]CSSAttrCachezhttps?://[^/]+(.*)c                   @  s   e Zd Zdd ZdS )AttrContainerc                 C  s0   zt | |W S  tk
r*   | |  Y S X d S N)dict__getattr__	Exception)selfname rS   4/tmp/pip-unpacked-wheel-d1lgvatt/xhtml2pdf/parser.pyrO   p   s    zAttrContainer.__getattr__N)__name__
__module____qualname__rO   rS   rS   rS   rT   rL   o   s   rL   c                 C  sd  i }|rn|  D ]\\}}zt||t|< W q tk
rj } z tjd|||dd |||< W 5 d }~X Y qX qi }|tkr\t| \}}	t|	d< |	  D ]\}}d ||< t|tr|d t	kr||krt
| 
d| d ||< q|||d }
|d }|d }n||d }
d }|
d k	rt|tr`|
  }
|
|krRt
| 
d|t| |}
n|tkr|
  }
|
d	d
ddt|hk}
n|tkrzt|
}
W n( tk
r   t
| 
d| Y nX n|tkrt|
| j}
nj|tkr t|
| j}
nR|tkrt|
}
n>|tkr(t|
}
n*|tkr>| |
}
n|tkrR| |
}
|
||< qt |S )Nz%%s during string conversion for %s=%sTexc_info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strrP   logdebugr   r   
isinstancetupler   warninggetliststriplowerreprr	   r   rE   r
   rB   ZpageSizer   rD   r   intr   rC   r   getFiler   getFontNamerL   )ctag
attributesattrskveZnattrsblockZadefnvZdflrS   rS   rT   pisaGetAttributesw   s        














rx   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 n4 tk
r   |j| j pndd  }| _Y nX ||kr|| }|dkrt	| j
dr| j
|||}n|tk	r|S d| d}t||d k	r|| j |< |S )N r   Zinherit
getCSSAttrz2Could not find inherited CSS attribute value for '')cssAttrsZfindStyleFor
cssElementLookupErrorZcssStylerP   parserZparseInlineZgetStyleAttrhasattr
parentNoderz   NotImplemented)rQ   
cssCascadeattrNamedefaultresultstylemsgrS   rS   rT   rz      s4    




rz   Zbgcolorbackground-colorc                 C  s2   t D ](}||krt | | kr|| | t | < q| S rM   )nonStandardAttrNames)ro   _nodeZattrListattrrS   rS   rT   mapNonStandardAttrs'  s    r   c              	   C  st   d } }}| j  D ]0\}}|dkr,|}q|dkr:|}q|dkr|}qt| j d| j  d| d| d| 	S )Nry   classrZ   r   #)rq   r`   rZ   r   tagNamerj   )nodeZ_clZ_idZ_strs   rt   rS   rS   rT   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 ]P}z| |j|||< W qb tk
r } ztjd||dd W 5 d }~X Y qbX qb| jt|< | jS )Nr   htmlz%r during CSS attr '%s'TrX   )cssr   r   r   r   rj   rK   rg   r|   rH   ZCSSDOMElementInterfacer}   	attrNamesrz   r   rP   rb   rc   )r   ro   keyZCachedCSSAttrZ
cssAttrMapZcssAttrNameru   rS   rS   rT   
CSSCollect:  s(    
&
r   c                 C  s   t | tr|  S | d  S )Nr   )rd   ra   rj   )sequencerS   rS   rT   rj   Z  s    
rj   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-sizery   g      ?zline-heightzletter-spacingz-pdf-line-spacingzfont-weight>   500bolder700bold600800900r[   r   ztext-decoration	underlinezline-throughnonez
font-style>   italic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 rM   rS   )xrS   rS   rT   <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))cssAttrrC   fragZ	textColorZ	backColorrn   ZfontNamemaxrE   joinZfontSizeZbaseFontSizeleadingZleadingSourceZletterSpacingZleadingSpacerj   r   rF   rg   r   striker   ra   Z
whiteSpacer@   	alignmentZvAlignr   	TypeErrorr   endswithfloatr   rG   ZbulletIndentZ
leftIndentZrightIndentZlistStyleTyperm   ZlistStyleImage)ro   kwisBlockr   valuer   rS   rS   rT   CSS2Frag`  s    













""  r   Fcollectc                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| | jD ]"} t| ||d}|r||7 }q|S )zCollect all CSS definitions.ry   >   r   linkc                 S  s   g | ]}|  r|  qS rS   )ri   ).0r   rS   rS   rT   
<listcomp>
  s      zpisaPreLoop.<locals>.<listcomp>,type>   ry   text/cssallprintZpdfr   Tr   r   Z
stylesheetz
@import "{}" {};)nodeTyper   	TEXT_NODEdataELEMENT_NODEr   rj   rx   rq   mediasplitrg   
childNodespisaPreLoopZaddCSShrefrelformatr   )r   contextr   r   rR   r   r   r   rS   rS   rT   r     s>    



r   c                 K  sh  |d krg }|s ddddd}n
t  |}| jtjkrF|| j n| jtjkrF| jdd	 | _| jdkrvd S t  || jf}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|||d 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r6t|jd ! 	 }|dkr2|}nd}d |jkrVt"d#|jd  }d!|jkrvt"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.||_-|r\|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| qLd S )%Nr   )r   r   r   r   :ry   >   scriptr   r[         Fdisplayinlinerv   z-pdf-next-pagez-pdf-page-breakbeforez-pdf-frame-breakafterTzpage-break-beforealwaysrightleftzpage-break-afterr   )r   ))ZkeepWithNextz-pdf-keep-with-next)outlinez-pdf-outlinez-pdf-outline-levelz-pdf-word-wrapz-pdf-keep-in-frame-mode>   shrinkoverflowerrortruncater   z-pdf-keep-in-frame-max-widthz-pdf-keep-in-frame-max-heightz	pisaTag%srZ   )contentZmaxWidthZ	maxHeightmode)5copyr   r   r   ZaddFragr   r   r   replacerj   rx   rq   r   r   r   r   rg   ZaddParaZaddStoryr   ra   r   r   rJ   rI   ZpushFragr   rG   r   rA   rl   ZoutlineLevelZwordWrapri   rE   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framerS   rS   rT   r   #  s   



 










r   ry   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 information, 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)rK   rb   rf   html5libZXHTMLParserr   getTreeBuilder
HTMLParserrd   ra   encoder   r   parsewriteZtoprettyxmlZaddDefaultCSSr   ZparseCSSr   )	srcr   Zdefault_cssxhtmlr   Z
xml_outputr   Zparser_kwargsdocumentrS   rS   rT   
pisaParser  s*    





r  c                  O  s   d|d< t | |S )NTr  )HTML2PDF)ar   rS   rS   rT   	XHTML2PDFA  s    r	  )N)ry   Fr   N)z
__future__r   r   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.filesr   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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   Zxhtml2pdf.utilr@   rA   rB   rC   rD   rE   rF   rG   Zxhtml2pdf.w3crH   Zxhtml2pdf.xhtml2pdf_reportlabrI   rJ   	getLoggerrU   rb   rK   __annotations__compileMIZrxhttpstriprN   rL   rx   ri   r   r   r   rz   r   minidomElementr   r   r   r   rj   r   r   r   r  r  r	  ZXML2PDFrS   rS   rS   rT   <module>   sV    4((

Q7!   $
 b    
=