o
    FzcqV                     @   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=i d?e
d@dAdBdCe
dDdEdFdGe
dHdIdJdKe
dLdMdNdOe
dPdPdPdQe
d dJdJdRe
dSdJdTdUe
dHdJdJdVe
dWdXdYdZe
d[d[d\d]e
dJd^d_d`e
d d d dae
dJdMdbdce
d d dJdde
dedfdgdhe
didjdjdke
dldmdni doe
d@dAdBdpe
dqdqdqdre
dPdPdPdse
d d d dte
dudvdwdxe
dqdqdqdye
dSdJd dze
d{d|d}d~e
dJdSdde
dddde
dJdId\de
d\ddde
d dJdJde
d d dde
d ddde
dmddde
dddi de
d dd de
dddde
dddde
dd dde
dddde
dJdd de
dddde
dd d de
dddde
dddde
dddde
dddde
dddde
d ddde
dd dde
dJddde
d ddJi de
d|d|d|de
d|d|d|de
d}ddJde
dddde
dJdLdHde
dddde
dJd dJde
d\d\d\de
dIdIdJde
dJdNd de
ddidȃde
dddʃde
dPdPdPde
d dd de
ddJdde
dddʃde
dDdEdFi de
dqdqdqde
dHdJdHde
dJd|dԃde
d@dAdBde
dPdPdPde
d@dAdBde
dbddكde
dd d܃de
dqdqdރde
d d d de
dJdJdHde
dHddde
dddLde
dJdHd[de
ddd de
dJdLdbde
dddi de
dHddʃde
ddJdJde
dLdLd{de
dddde
dddde
dddde
dJddde
dJdwdde
dddde
dnddLde
dddde
dddde
dd_dld e
dJdJdde
d dJd de
ddbdde
dLdHdi de
dJd dJde
dd d de
ddbdde
d d dbd	e
d
ddde
dddde
dddde
dddde
d dLdde
dddde
dddde
d@dAdBde
d d d de
dddde
d[dJdLd e
dJd^d!d"e
dJd^d#i d$e
dJdld΃d%e
d d dʃd&e
d'd[dd(e
ddd d)e
dd*d+d,e
dJdid d-e
dJd.d d/e
dǐdd0d1e
dd2dd3e
d4d5d4d6e
d7ddd8e
dddd9e
dJd:d;d<e
dJdǐd=d>e
dbdd?d@e
dJdAdBdCe
dDdwdDi dEe
ddddFe
dd dʃdGe
dJd d dHe
ddddIe
dJd|d!dKe
dd.dLdMe
dLdʐdNdOe
dPdQdRdSe
d@dAdBdTe
dUddVdWe
dJd[ddXe
dwdYdZd[e
dAdAdAd\e
dnddMd]e
d^d_dbd`e
ddddae
dddi dbe
dJdLdLdce
d dJdSdde
deddԃdfe
d{dddge
d ddʃdhe
ddddie
djdjdjdke
d@dAdBdle
dqdqdqdme
d@dAdBdne
dPdPdPdoe
dJdpdqdre
dsddtdue
ddddve
d[dlddwe
dJdJdJdxe
d[d[d[e
dqdqdqe
d d d e
d d d e
dJdJd e
ddbddyZ>dzd{ Z?d|d} Z@d~d ZAdd ZBdd 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   /xhtml2pdf/util.py__init__>   s   
zmemoized.__init__c                 O   sh   t | }||f}z|| jvr| j|i |}|| j|< | j| W S  ty3   | j|i | Y S w 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'   limitZ_typevaluetbZ_listr   r   r   ErrorMsgS   s   

r0   c                 C   s   t | ttfvr| gS t| S r   )typelistr   )r.   r   r   r   toListb   s   r3   c                 C   s`   |}|D ])\}}|}|du rg }nt |ts|g}||v 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   )
isinstancer2   insertsetattr)objkeysZ	containerr   extrasZcpextras	reportlabcssr   r   r   transform_attrsh   s   
r<   c                 C   sT   |D ]%}t ||rt||nd}|du r!t|tr!||v r!|| }t| || qdS )zr
    Allows copy a list of attributes from object2 to object1.
    Useful for copy ccs attributes to fragment
    N)hasattrgetattrr4   dictr6   )Zobj1Zobj2attrsattrr.   r   r   r   
copy_attrs   s   rB   Fc                 C   s&   |D ]}|r
t |}t| || qdS )z;
    Allows set the same value to a list of attributes
    N)r   r6   )r7   r@   r.   Z_copyrA   r   r   r   	set_value   s
   rC   c                 C   s   | du rdS t | tr| S t|   } | dks| dkr|S | tv r't|  S | drMt| dkrMd| d  | d  | d  | d  | d  | d  } nt	| rid	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      g | ]}t |qS r   )int.0xr   r   r   
<listcomp>       zgetColor.<locals>.<listcomp>z#%02x%02x%02x)r4   r   strstriplowerCOLOR_BY_NAME
startswithlenrgb_researchgroupsr   )r.   defaultrgbr   r   r   getColor   s0   


r^   c                 C   s   | rt |  dvr| S |S )N)rD   ZhiddenrQ   rS   r.   rZ   r   r   r   getBorderStyle   s   ra   g      $@gUUUUUU?g      ?g      ?g      ?g      ?g      ?g      ?       @)1zxx-smallzx-small2Z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u r|W S t | tu r| W S t| trt| W S t | ttfv r+d| } t|  	 
dd} | dd dkrLt| dd  t W S | dd dkrat| dd  t W S | dd dkrvt| dd  t W S | dd d	krt| dd  W S | dd d
krt| dd  d W S | dd dkrt| dd  t W S | dv rW 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rt| dd  |d  W S | dd dkr|t| dd   d W S | dv r|W S | tv r:|r0tt|t|   W S tt|t|   W S | tv rV|rLtt|t|   W S tt|t|   W S tt|t|  W S zt| } W n tyy   td|  | Y W S w td| W S  ty   tjd||dd | Y S w )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)rD   0z0.0autorj   remZemexrb   r&   %g      Y@)ZnormalZinheritzgetSize: Not a float %rr   zgetSize %r %rrG   )r)   )r1   floatr4   rK   r   r2   r,   rQ   rR   rS   replacer
   ro   r   dpi96_relativeSizeTablemaxMIN_FONT_SIZE_absoluteSizeTable
ValueErrorlogwarning	Exception)r.   ZrelativebaserZ   originalr   r   r   getSize   sp   






r   c                 C   s   |\}}| dk r||  } |dk r|| }|dur:|dur:|dkr&||  | }|dkr0|| | }| || | ||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   )rN   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.
    rF   zbox not defined right wayc                 S   rJ   r   r   rM   posr   r   r   rO   L  rP   zgetBox.<locals>.<listcomp>NrQ   splitrV   r   r   )boxr   rN   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
| v r^t| d
 }d| v rNt| d }|||  }nd| v r^t| d }|||  }d| v rt| d }	d| v ryt| d }|||	  }nd	| v rt| 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-boxrF   c                 S   rJ   r   r   rL   r   r   r   rO   W  rP   z&getFrameDimensions.<locals>.<listcomp>topr   leftbottomrightheightwidthz
margin-topzmargin-leftzmargin-bottomzmargin-rightN)getrV   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
    rH   zposition not defined right wayc                 S   rJ   r   r   r   r   r   r   rO   ~  rP   zgetPos.<locals>.<listcomp>Nr   )positionr   rN   r   r   r   r   getPosv  s
   r   c                 C   s   t |  dv S )z Is it a boolean? )r   yesrc   trueNr_   sr   r   r   getBool  s   r   c                 C   s   zt | } W | S    Y | S r   )rx   r   r   r   r   getFloat  s   
r   c                   C   s   t d7 a tt S )z Unique ID rG   N)_uidrQ   r   r   r   r   getUID  s   r   )r   centermiddler   Zjustifyc                 C   s   t t|  |S r   )_alignmentsr   rQ   rS   r`   r   r   r   getAlign  s   r   z2^data:(?P<mime>[a-z]+/[a-z]+);base64,(?P<data>.*)$Zactiveborder         Zactivecaption
   $   j   Z	alicebluegx!?gy=?rG   Zantiquewhiteg/R(__?g<E~}?g!r?Zappworkspace   ZaquaZ
aquamarineg{H?gฌ?ZazureZ
background:   n      Zbeigeg]P?g]3f?ZbisquegJzZ?gRz?ZblackZblanchedalmondg Q?ZblueZ
bluevioletg)TPQ?g}͑?gec]\?Zbrowngr?g<?Z	burlywoodgH]?gk?gCo?Z
buttonfaceZbuttonhighlight   ZbuttonshadowZ
buttontextZ	cadetblueg?g
(?g?ZcaptiontextZ
chartreuseZ	chocolategI}YZ?g([Z?gx!?Zcoralg?Zcornflowerblueg.py?g	F?gQ<?ZcornsilkZcrimsongv?gx!?ZcyanZdarkblueg%c\qq?ZdarkcyanZdarkgoldenrodgT g?g#~?Zdarkgrayg̒ 55?Z	darkgreenZdarkgreyZ	darkkhakig%?gRb?g<H?ZdarkmagentaZdarkolivegreengF]kSU?g噗?Z
darkorangeg2d?Z
darkorchidg333333?gz?g?ZdarkredZ
darksalmong46<=?g4?g?Zdarkseagreeng׃I?g9̗?Zdarkslateblueg[;Q?g%W@?Zdarkslategrayg
(?ZdarkslategreyZdarkturquoisegO)?gkGq::?Z
darkvioletgb[>?g!\zz?ZdeeppinkgOsr?Zdeepskyblueg?ZdimgrayZdimgreyZ
dodgerblueg[;Q?Z	firebrickg3UV?g =E?ZfloralwhiteZforestgreenZfuchsiaZ	gainsboroZ
ghostwhiteZgoldZ	goldenrodgip[[?gj?Zgrayg3ۃ?ZgraytextZgreenZgreenyellowgb?ZgreyZ	highlightZhighlighttextZhoneydewZhotpinkgٕ?ZinactiveborderZinactivecaptionZinactivecaptiontextZ	indianredgT:?Zindigog.M?gkzPP?Zinfobackground   ZinfotextZivoryZkhakig P?ZlavenderZlavenderblushZ	lawngreeng1w-!?gf?ZlemonchiffonZ	lightblueg	y?Z
lightcoralZ	lightcyang\T?ZlightgoldenrodyellowZ	lightgrayZ
lightgreeng*?Z	lightgreyZ	lightpinkgͪ?g88?ZlightsalmonZlightseagreeng]QJVU?ZlightskyblueZlightslategraygC?g	^?ZlightslategreyZlightsteelblueg~?ZlightyellowZlimeZ	limegreenZlinenZmagentaZmaroonZmediumaquamarineg?Z
mediumblueZmediumorchidg WW?ZmediumpurplegPl?g x|{?Zmediumseagreeng(Bvv?g~qJ[\?Zmediumslateblueg(?gù?Zmediumspringgreeng:TS?ZmediumturquoiseZmediumvioletredg?g<?gpx?ZmenuZmenutextZmidnightbluegz?Z	mintcreamZ	mistyroseg/[<<?ZmoccasingO=බ?ZnavajowhiteZnavyZoldlacegJo	?ZoliveZ	olivedrabgAGZ?g2d?ZorangeZ	orangeredg)TPQ?Zorchidg<H?Zpalegoldenrodg8G?Z	palegreengͮ{+?g?Zpaleturquoiseg.!?ZpalevioletredZ
papayawhipg<f2?gp{?Z	peachpuffgf67?ZperugZ?ZpinkgA)Z?g3xy?Zplumg÷n?Z
powderblueZpurpleZredZ	rosybrownZ	royalbluegkzPP?Zsaddlebrowng9]?ZsalmongJzZ?Z
sandybrowngx'?g%?gX9?Z	scrollbarZseagreengT:?g?ZseashellZsiennag<$?g
?ZsilverZskyblueZ	slatebluegps?gٕ?Z	slategrayZ	slategreyZsnowZspringgreenZ	steelblueg2d?tanZtealZthistleZthreeddarkshadow@   Z
threedfaceZthreedhighlightZthreedlightshadowZthreedshadowZtomatogbg
?g*SA?Z	turquoisegj?gù?ZvioletZwheatZwhiteZ
whitesmoke)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   )rM   iZlower_font_listZupper_font_listr   r   
<dictcomp>e  s    z*get_default_asian_font.<locals>.<dictcomp>)
r   r:   pdfbase_cidfontdatadefaultUnicodeEncodingsr8   appendrS   rangerV   )	font_dictfontsZfontZdefault_asian_fontr   r   r   get_default_asian_font[  s   
r   c                 C   s4   t tjjj}| }| |v rtt|  d S d S r   )	r   r:   r   r   r   r8   r   ZregisterFontr   )Zfontnamer   r   r   r   r   set_asian_fontsj  s
   r   c                 C   s   t jj}| |v r
| S d S r   )r   rZ   ZDEFAULT_LANGUAGE_LIST)nameZasian_language_listr   r   r   detect_languageq  s   r   c                 C   s"   t |dv rt| }t|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 d S )Nr   )r=   __getattribute__r   )contextZ	frag_textr   Zdetect_language_resultr   r   r   frag_text_language_check  s   


r   r   )F)r   Nrj   )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   compilerW   	getLoggerr   ZpypdfZreportlab.graphicsr   r   objectr   r0   r3   r<   rB   rC   r^   ra   ro   rz   r~   r{   r}   r   r   r   r   r   r   r   r   r   r   r   MDOTALLZ_rx_dataurirT   r   r   r   r   r   r   r   r   r   <module>   s  
#
J

&
		
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                 	  
                                               !  "  #  $  %  &  '  (  )  *  +  
,


 
 4