U
    ?eqV                     @   s	  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlZed	Ze d
Zd dlZd dlm Z  d dlm!Z! G dd de"Z#dd Z$dd Z%dddZ&dd Z'dddZ(e#dddZ)dddZ*ed Z+de Z,d d d d!d!d"d"d#d#d$d$d%d%d&d&d'Z-d#d!d&d%d$d#d!d d(d)	Z.d"Z/e#dd+d,Z0e#d-d. Z1e#d/d0 Z2d1d2 Z3e#d3d4 Z4d5d6 Z5d7d8 Z6d a7d9d: Z8eeeeed;Z9efd<d=Z:ed>ej;ej<B Z=e
d?d@dAe
dBdCdDe
dEdFdGe
dHdIdJe
dKdKdKe
d dGdGe
dLdGdMe
dEdGdGe
dNdOdPe
dQdQdRe
dGdSdTe
d d d e
dGdIdUe
d d dGe
dVdWdXe
dYdZdZe
d[d\d]e
d?d@dAe
d^d^d^e
dKdKdKe
d d d e
d_d`dae
d^d^d^e
dLdGd e
dbdcdde
dGdLdee
dfdgdhe
dGdFdRe
dRdidje
d dGdGe
d d dke
d dkdke
d\dldme
dndndne
d dfd e
dndndne
dodpdqe
dkd dke
drdqdse
dGdtd e
dudvdwe
dkd d e
dxdydze
d{d|d{e
d}d~dke
dsdde
dsdde
d dde
dd de
dGdide
d ddGe
dcdcdce
dcdcdce
ddddGe
ddde
dGdHdEe
ddkde
dGd dGe
dRdRdRe
dFdFdGe
dGdJd e
ddYde
ddde
dKdKdKe
d dd e
ddGdse
ddde
dBdCdDe
d^d^d^e
dEdGdEe
dGdcde
d?d@dAe
dKdKdKe
d?d@dAe
dUdde
dd de
d^d^de
d d d e
dGdGdEe
dEddte
dddHe
dGdEdQe
ddd e
dGdHdUe
ddde
dEdde
ddGdGe
dHdHdbe
ddde
ddde
ddde
dGdde
dGdadze
ddde
d]ddHe
dddue
dddue
ddTd[e
dGdGde
d dGd e
dvdUdve
dHdEde
dGd dGe
dd d e
ddUde
d d dUe
ddrde
ddde
djdde
ddde
d dHde
d}ddwe
ddde
d?d@dAe
d d d e
ddde
dQdGdHe
dGdSde
dGdSde
dGd[de
d d de
ddQde
ddd e
dqdde
dGdYd e
dGdd e
ddde
ddde
ddde
ddde
ddde
dGdde
dGdde
dUdde
dGdde
ddade
ddde
dd de
dGd d e
d|d{d{e
ddcde
dkdde
dHdde
ddde
d?d@dAe
ddkdăe
dGdQde
daddƃe
ddde
d]ddIe
dddUe
ddde
ddde
dGdHdHe
d dGdLe
ddde
dbddte
d dde
ddde
dddʃe
d?d@dAe
d^d^d^e
d?d@dAe
dKdKdKe
dGdd̃e
ddd΃e
ddde
dQd[de
dGdGdGe
dQdQdQe
d^d^d^e
d d d e
d d d e
dGdGd e
ddUdvdϜZ>ddф Z?ddӄ Z@ddՄ ZAddׄ ZBddل ZCdS )    N)copy)get_display)ColortoColor)	TA_CENTER
TA_JUSTIFYTA_LEFTTA_RIGHT)cminch)
pdfmetrics)UnicodeCIDFontzS^.*?rgb[a]?[(]([0-9]+).*?([0-9]+).*?([0-9]+)(?:.*?(?:[01]\.(?:[0-9]+)))?[)].*?[ ]*$	xhtml2pdf)renderPM)	renderSVGc                   @   s    e Zd ZdZdd Zdd ZdS )memoizeda  
    A kwargs-aware memoizer, better than the one in python :)

    Don't pass in too large kwargs, since this turns them into a tuple of
    tuples. Also, avoid mutable types (as usual for memoizers)

    What this does is to create a dictionnary of {(*parameters):return value},
    and uses it as a cache for subsequent calls to the same method.
    It is especially useful for functions that don't rely on external variables
    and that are called often. It's a perfect match for our getSize etc...
    c                 C   s$   i | _ || _| jj| _| jj| _d S N)cachefunc__doc____name__)selfr    r   2/tmp/pip-unpacked-wheel-35p66c5k/xhtml2pdf/util.py__init__>   s    
zmemoized.__init__c                 O   sf   t | }||f}z,|| jkr6| j||}|| j|< | j| W S  tk
r`   | j|| Y S X d S r   )tupleitemsr   r   	TypeError)r   argskwargsZ	args_pluskeyresr   r   r   __call__D   s    

zmemoized.__call__N)r   
__module____qualname__r   r   r"   r   r   r   r   r   0   s   r   c                  C   sT   ddl } d}t \}}}| ||| || }ddd|dd |d f  S )z2
    Helper to get a nice traceback as string
    r   NzTraceback (innermost last):
z%-20s %s )	tracebacksysexc_info	format_tbformat_exception_onlyjoin)r'   limit_typevaluetbZ_listr   r   r   ErrorMsgS   s    

r1   c                 C   s   t | ttfkr| gS t| S r   )typelistr   )r/   r   r   r   toListb   s    r4   c                 C   s`   |}|D ]R\}}|}|dkr"g }nt |ts2|g}||kr|d||  t| |||  qdS )a&  
    Allows to apply one function to set of keys cheching if key is in container,
    also trasform ccs key to report lab keys.

    extras = Are extra params for func, it will be call like func(*[param1, param2])

    obj = frag
    keys = [(reportlab, css), ... ]
    container = cssAttr
    Nr   )
isinstancer3   insertsetattr)objkeys	containerr   extrasZcpextras	reportlabcssr   r   r   transform_attrsh   s    
r>   c                 C   sT   |D ]J}t ||rt||nd}|dkrBt|trB||krB|| }t| || qdS )zr
    Allows copy a list of attributes from object2 to object1.
    Useful for copy ccs attributes to fragment
    N)hasattrgetattrr5   dictr7   )Zobj1obj2attrsattrr/   r   r   r   
copy_attrs   s
    rE   Fc                 C   s&   |D ]}|rt |}t| || qdS )z;
    Allows set the same value to a list of attributes
    N)r   r7   )r8   rC   r/   Z_copyrD   r   r   r   	set_value   s    rF   c                 C   s   | dkrdS t | tr| S t|   } | dks:| dkr>|S | tkrNt|  S | drt| dkrd| d  | d  | d  | d  | d  | d  } n8t	| rd	d
 t	| 
 D \}}}d|||f } n t| |S )z[
    Convert to color value.
    This returns a Color object instance from a text bit.
    NZtransparentnone#            c                 S   s   g | ]}t |qS r   )int.0xr   r   r   
<listcomp>   s     zgetColor.<locals>.<listcomp>z#%02x%02x%02x)r5   r   strstriplowerCOLOR_BY_NAME
startswithlenrgb_researchgroupsr   )r/   defaultrgbr   r   r   getColor   s.    

r_   c                 C   s   | rt |  dkr| S |S )N)rG   hiddenrR   rT   r/   r[   r   r   r   getBorderStyle   s    rc   g      $@gUUUUUU?g      ?g      ?g      ?g      ?g      ?g      ?       @)1zxx-smallzx-small2small3Zmedium4Zlarge5zx-large6zxx-large7z	xxx-largeg      ?)	ZlargerZsmallerz+4z+3z+2z+1z-1z-2z-3        c              	   C   s@  z| }| dkr|W S t | tkr(| W S t| tr<t| W S t | ttfkrVd| } t|  	 
dd} | dd dkrt| dd  t W S | dd dkrt| dd  t W S | dd dkrt| dd  t W S | dd d	krt| dd  W S | dd d
kr@t| dd  d W S | dd dkrlt| dd  t W S | dkr|W dS |r| dd dkrt| dd  | W S | dd dkrt| dd  | W S | dd dkr
t| dd  |d  W S | dd dkr:|t| dd   d W S | dkrJ|W S | tkr|rntt|t|   W S tt|t|   W S | tkr|rtt|t|   W S tt|t|   W S tt|t|  W S zt| } W n( tk
r   td|  | Y W S X td| W S  tk
r:   tjd||dd | Y S X dS )a  
    Converts strings to standard sizes.
    That is the function taking a string of CSS size ('12pt', '1cm' and so on)
    and converts it into a float in a standard unit (in our case, points).

    >>> getSize('12pt')
    12.0
    >>> getSize('1cm')
    28.346456692913385
    N ,.r
   mminptZpcg      (@Zpx)rG   0z0.0autorm   rememexrd   r&   %g      Y@)normalZinheritzgetSize: Not a float %rr   zgetSize %r %rrJ   )r)   )r2   floatr5   rM   r   r3   r,   rR   rS   rT   replacer
   rr   r   dpi96_relativeSizeTablemaxMIN_FONT_SIZE_absoluteSizeTable
ValueErrorlogwarning	Exception)r/   relativebaser[   originalr   r   r   getSize   sl    






r   c                 C   s   |\}}| dk r||  } |dk r(|| }|dk	rt|dk	rt|dkrL||  | }|dkr`|| | }| || | ||fS | || fS )z
    As a stupid programmer I like to use the upper left
    corner of the document as the 0,0 coords therefore
    we need to do some fancy calculations
    r   Nr   )rP   ywhpagesizeZaxZayr   r   r   	getCoords+  s    r   c                 C   sF   t |  } t| dkr tddd | D \}}}}t|||||S )z
    Parse sizes by corners in the form:
    <X-Left> <Y-Upper> <Width> <Height>
    The last to values with negative values are interpreted as offsets form
    the right and lower border.
    rI   zbox not defined right wayc                 S   s   g | ]}t |qS r   r   rO   posr   r   r   rQ   L  s     zgetBox.<locals>.<listcomp>rR   splitrW   r   r   )boxr   rP   r   r   r   r   r   r   getBoxA  s
    r   c           
      C   s  |  dg }t|dkr&dd |D S t|  dd}t|  dd}t|  dd}t|  d	d}d
| krt| d
 }d| krt| d }|||  }n d| krt| d }|||  }d| krt| d }	d| krt| d }|||	  }n"d	| krt| d	 }|||	  }|t|  dd7 }|t|  dd7 }|t|  dd7 }|t|  dd7 }|||  }	|||  }|||	|fS )zeCalculate dimensions of a frame

    Returns left, top, width and height of the frame in points.
    z-pdf-frame-boxrI   c                 S   s   g | ]}t |qS r   r   rN   r   r   r   rQ   W  s     z&getFrameDimensions.<locals>.<listcomp>topr   leftbottomrightheightwidthz
margin-topzmargin-leftzmargin-bottomzmargin-right)getrW   r   )
dataZ
page_widthZpage_heightr   r   r   r   r   r   r   r   r   r   getFrameDimensionsP  s<    

r   c                 C   sB   t |  } t| dkr tddd | D \}}t||dd|S )z
    Pair of coordinates
    rK   zposition not defined right wayc                 S   s   g | ]}t |qS r   r   r   r   r   r   rQ   ~  s     zgetPos.<locals>.<listcomp>Nr   )positionr   rP   r   r   r   r   getPosv  s
    r   c                 C   s   t |  dkS )z Is it a boolean? )r   yesre   truera   sr   r   r   getBool  s    r   c                 C   s   zt | } W n   Y nX | S r   )r}   r   r   r   r   getFloat  s
    r   c                   C   s   t d7 a tt S )z Unique ID rJ   )_uidrR   r   r   r   r   getUID  s    r   )r   centerZmiddler   Zjustifyc                 C   s   t t|  |S r   )_alignmentsr   rR   rT   rb   r   r   r   getAlign  s    r   z2^data:(?P<mime>[a-z]+/[a-z]+);base64,(?P<data>.*)$         
   $   j   gx!?gy=?rJ   g/R(__?g<E~}?g!r?   g{H?gฌ?:   n      g]P?g]3f?gJzZ?gRz?g Q?g)TPQ?g}͑?gec]\?gr?g<?gH]?gk?gCo?   g?g
(?g?gI}YZ?g([Z?gx!?g?g.py?g	F?gQ<?gv?gx!?g%c\qq?gT g?g#~?g̒ 55?g%?gRb?g<H?gF]kSU?g噗?g2d?g333333?gz?g?g46<=?g4?g?g׃I?g9̗?g[;Q?g%W@?g
(?gO)?gkGq::?gb[>?g!\zz?gOsr?g?g[;Q?g3UV?g =E?gip[[?gj?g3ۃ?gb?gٕ?gT:?g.M?gkzPP?   g P?g1w-!?gf?g	y?g\T?g*?gͪ?g88?g]QJVU?gC?g	^?g~?g?g WW?gPl?g x|{?g(Bvv?g~qJ[\?g(?gù?g:TS?g?g<?gpx?gz?g/[<<?gO=බ?gJo	?gAGZ?g2d?g)TPQ?g<H?g8G?gͮ{+?g?g.!?g<f2?gp{?gf67?gZ?gA)Z?g3xy?g÷n?gkzPP?g9]?gJzZ?gx'?g%?gX9?gT:?g?g<$?g
?gps?gٕ?g2d?@   gbg
?g*SA?gj?gù?)ZactiveborderZactivecaptionZ	aliceblueZantiquewhiteZappworkspaceZaquaZ
aquamarineZazureZ
backgroundZbeigeZbisqueZblackZblanchedalmondZblueZ
bluevioletZbrownZ	burlywoodZ
buttonfaceZbuttonhighlightZbuttonshadowZ
buttontextZ	cadetblueZcaptiontextZ
chartreuseZ	chocolateZcoralZcornflowerblueZcornsilkZcrimsonZcyanZdarkblueZdarkcyanZdarkgoldenrodZdarkgrayZ	darkgreenZdarkgreyZ	darkkhakiZdarkmagentaZdarkolivegreenZ
darkorangeZ
darkorchidZdarkredZ
darksalmonZdarkseagreenZdarkslateblueZdarkslategrayZdarkslategreyZdarkturquoiseZ
darkvioletZdeeppinkZdeepskyblueZdimgrayZdimgreyZ
dodgerblueZ	firebrickZfloralwhiteZforestgreenZfuchsiaZ	gainsboroZ
ghostwhiteZgoldZ	goldenrodZgrayZgraytextZgreenZgreenyellowZgreyZ	highlightZhighlighttextZhoneydewZhotpinkZinactiveborderZinactivecaptionZinactivecaptiontextZ	indianredZindigoZinfobackgroundZinfotextZivoryZkhakiZlavenderZlavenderblushZ	lawngreenZlemonchiffonZ	lightblueZ
lightcoralZ	lightcyanZlightgoldenrodyellowZ	lightgrayZ
lightgreenZ	lightgreyZ	lightpinkZlightsalmonZlightseagreenZlightskyblueZlightslategrayZlightslategreyZlightsteelblueZlightyellowZlimeZ	limegreenZlinenZmagentaZmaroonZmediumaquamarineZ
mediumblueZmediumorchidZmediumpurpleZmediumseagreenZmediumslateblueZmediumspringgreenZmediumturquoiseZmediumvioletredmenuZmenutextZmidnightblueZ	mintcreamZ	mistyroseZmoccasinZnavajowhiteZnavyZoldlaceZoliveZ	olivedrabZorangeZ	orangeredZorchidZpalegoldenrodZ	palegreenZpaleturquoiseZpalevioletredZ
papayawhipZ	peachpuffZperuZpinkZplumZ
powderblueZpurpleZredZ	rosybrownZ	royalblueZsaddlebrownZsalmonZ
sandybrownZ	scrollbarZseagreenZseashellZsiennaZsilverZskyblueZ	slateblueZ	slategrayZ	slategreyZsnowZspringgreenZ	steelbluetanZtealZthistleZthreeddarkshadowZ
threedfaceZthreedhighlightZthreedlightshadowZthreedshadowZtomatoZ	turquoiseZvioletZwheatZwhiteZ
whitesmokeZwindowZwindowframeZ
windowtextZyellowZyellowgreenc                     s`   g  g t tjjj} |  }|D ]}|  |  q" fddtt	 D }|S )Nc                    s   i | ]} | | qS r   r   )rO   iZlower_font_listZupper_font_listr   r   
<dictcomp>e  s      z*get_default_asian_font.<locals>.<dictcomp>)
r   r<   pdfbase_cidfontdatadefaultUnicodeEncodingsr9   appendrT   rangerW   )	font_dictfontsfontZdefault_asian_fontr   r   r   get_default_asian_font[  s    
r   c                 C   s0   t tjjj}| }| |kr,tt|  d S r   )	r   r<   r   r   r   r9   r   ZregisterFontr   )Zfontnamer   r   r   r   r   set_asian_fontsj  s    r   c                 C   s   t jj}| |kr| S d S r   )r   r[   ZDEFAULT_LANGUAGE_LIST)nameZasian_language_listr   r   r   detect_languageq  s    r   c                 C   s&   t |dkrt| }t|S d S d S )N)arabichebrewZpersianZurduZpashtoZsindhi)r   arabic_reshaperZreshaper   )textlanguagearr   r   r   arabic_formatw  s    
r   c                 C   s*   t | dr&| d}t||}|r&|S d S )Nr   )r?   __getattribute__r   )contextZ	frag_textr   Zdetect_language_resultr   r   r   frag_text_language_check  s
    


r   )N)F)N)N)r   Nrm   )Dloggingrer(   r   r   r<   Zreportlab.pdfbase._cidfontdataZbidi.algorithmr   Zreportlab.lib.colorsr   r   Zreportlab.lib.enumsr   r   r   r	   Zreportlab.lib.unitsr
   r   Zreportlab.pdfbaser   Zreportlab.pdfbase.cidfontsr   Zxhtml2pdf.defaultr   compilerX   	getLoggerr   ZpypdfZreportlab.graphicsr   r   objectr   r1   r4   r>   rE   rF   r_   rc   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   MDOTALLZ_rx_dataurirU   r   r   r   r   r   r   r   r   r   <module>   s  
#



J

&
	 















































































































































































  4