U
    =gX                     @  sL	  U 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 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eZ e!dZ"G dd dZ#ddddddddZ$dddZ%dd Z&ddddZ'e#dddZ(dd d!Z)ed" Z*d#e+d$< d%e Z,d#e+d&< d'd'd'd(d(d)d)d*d*d+d+d,d,d-d-d.Z-d/e+d0< d*d(d-d,d+d*d(d'd1d2	Z.d/e+d3< d)Z/d#e+d4< e#dd6d7d#d#d8d9d:Z0e#d;d< Z1e#d=d> Z2d#d#d?d@dAdBZ3e#dCdD Z4dEdF Z5dGdH Z6eeeeedIZ7efdJdKZ8e!dLej9ej:B Z;edMdNdOedPdQdRedSdTdUedVdWdXedYdYdYed dUdUedZdUd[edSdUdUed\d]d^ed_d_d`edUdadbed d d edUdWdced d dUedddedfedgdhdhedidjdkedMdNdOedldldledYdYdYed d d edmdndoedldldledZdUd edpdqdredUdZdsedtdudvedUdTd`ed`dwdxed dUdUed d dyed dydyedjdzd{ed|d|d|ed dtd ed|d|d|ed}d~dedyd dyedddedUdd edddedyd d edddedddedddyedddeddded ddedd dedUdwded ddUedqdqdqedqdqdqedrddUedddedUdVdSeddydedUd dUed`d`d`edTdTdUedUdXd eddgdedddedYdYdYed dd eddUdedddedPdQdRedldldledSdUdSedUdqdedMdNdOedYdYdYedMdNdOedcddedd dedldlded d d edUdUdSedSddedddVedUdSd_eddd edUdVdcedddedSddeddUdUedVdVdpedddedddedddedUddedUdodedddedkddVedddedddeddbdiedUdUded dUd eddcdedVdSdedUd dUedd d eddcded d dcedddedddedxddeddded dVdedddedddedMdNdOed d d eddded_dUdVedUdadedUdadedUdided d dedd_deddd edddedUdgd edUdd edddedddedddedddedddedUddŃedUddƃedcddǃedUddɃeddodʃedddedd dedUd d edddeddqdedydd̃edVdd̓edddЃedMdNdOeddyd҃edUd_dedoddԃedddȃedkddWedddcedddedddedUdVdVed dUdZedddedpdded ddedddeddd؃edMdNdOedldldledMdNdOedYdYdYedUddڃeddd܃eddded_didedUdUdUed_d_d_edldldled d d ed d d edUdUd eddcddݜZ<dd߄ Z=dd Z>dd Z?dd Z@dd ZAG dd deBZCdS )    )annotationsN)copy)Any)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]+)))?[)].*?[ ]*$c                   @  s&   e Zd ZdZdd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 dictionary 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...
    None)returnc                 C  s$   i | _ || _| jj| _| jj| _d S N)cachefunc__doc____name__)selfr    r   2/tmp/pip-unpacked-wheel-d1lgvatt/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__@   s    

zMemoized.__call__N)r   
__module____qualname__r   r   r#   r   r   r   r   r   -   s   r   T)
cast_tupler   boollist)valuer&   r   c                C  s*   |rt tfnt f}t| |r$t | S | gS r   )r(   r   
isinstance)r)   r&   clsr   r   r   toListO   s    r,   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 checking if key is in container,
    also transform 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   )r*   r(   insertsetattr)objkeys	containerr   extrasZcpextrasZreportlab_keycssr   r   r   transform_attrsT   s    
r4   c                 C  sT   |D ]J}t ||rt||nd}|dkrBt|trB||krB|| }t| || qdS )zs
    Allows copy a list of attributes from object2 to object1.
    Useful for copy ccs attributes to fragment.
    N)hasattrgetattrr*   dictr.   )Zobj1obj2attrsattrr)   r   r   r   
copy_attrsl   s
    r;   F)do_copyc                C  s&   |D ]}|rt |}t| || qdS )z2Allows set the same value to a list of attributes.N)r   r.   )r/   r9   r)   r<   r:   r   r   r   	set_valuex   s    r=   c                 C  s  | dkrdS t | tr| S t|   } t| dkr:|S | dkrF|S | tkrVt|  S | drt| dkrd| d  | d  | d  | d  | d  | d  } n\t	| rz:d	d
 t	| 
 D \}}}d|d|d|d} W q tk
r   Y qX n t| |S )z
    Convert to color value.
    This returns a Color object instance from a text bit.
    Mitigation for ReDoS attack applied by limiting input length and validating input.
    Nd   >   transparentnone#            c                 s  s   | ]}t |V  qd S r   )int).0xr   r   r   	<genexpr>   s     zgetColor.<locals>.<genexpr>Z02x)r*   r   strstriplowerlenCOLOR_BY_NAME
startswithrgb_rematchgroups
ValueErrorr   )r)   defaultrgbr   r   r   getColor   s(    
6
rX   c                 C  s   | rt |  dkr| S |S )N>   r@   hiddenrJ   rL   r)   rT   r   r   r   getBorderStyle   s    r\   g      $@floatMMgUUUUUU?DPI96g      ?g      ?g      ?g      ?g      ?g      ?       @)1zxx-smallzx-small2small3Zmedium4Zlarge5zx-large6zxx-large7z	xxx-largezdict[str, float]ABSOLUTE_SIZE_TABLEg      ?)	ZlargerZsmallerz+4z+3z+2z+1z-1z-2z-3RELATIVE_SIZE_TABLEMIN_FONT_SIZE        zstr | float | list | tuplez
int | None)r)   baserT   r   c              	   C  s  z| }| dkr|W S t | tr&| W S t | tr:t| W S t | ttfrRd| } t|   	dd} | 
drt| dd  t W S | 
drt| dd  t W S | 
drt| dd  t W S | 
d	rt| dd  W S | 
d
rt| dd  d W S | 
drBt| dd  t W S | dkrRW dS |r| 
dr~t| dd  | W S | 
drt| dd  | W S | 
drt| dd  |d  W S | 
dr|t| dd   d W S | dkr|W S | tkr@|r,tt|t|   W S tt|t|   W S | tkrx|rdt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>   autor@   00.0rl   rememexr`   %g      Y@>   normalinheritzgetSize: Not a float %rr   zgetSize %r %rT)exc_info)r*   r]   rF   r   r(   joinrJ   rK   rL   replaceendswithr   r^   r   r_   rj   maxrk   ri   rS   logwarning	Exception)r)   relativerm   rT   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   )rH   ywhpagesizeZaxZayr   r   r   	getCoords  s    r   c                 C  sJ   t |  } t| dkr$d}t|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.
    rB   zbox not defined right wayc                 s  s   | ]}t |V  qd S r   r   rG   posr   r   r   rI   @  s     zgetBox.<locals>.<genexpr>rJ   splitrM   RuntimeErrorr   )boxr   msgrH   r   r   r   r   r   r   getBox4  s    r   z!tuple[float, float, float, float])
page_widthpage_heightr   c           
      C  s  |  dg }t|dkrDt|d t|d t|d t|d f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r6t| d }	d| krt| d }|||	  }n"d
| kr6t| d
 }|||	  }|t|  dd7 }|t|  dd7 }|t|  dd7 }|t|  dd7 }|||  }	|||  }|||	|fS )zk
    Calculate dimensions of a frame.

    Returns left, top, width and height of the frame in points.
    z-pdf-frame-boxrB   r   rC   rD   rE   topleftbottomrightheightwidthz
margin-topzmargin-leftzmargin-bottomzmargin-right)getrM   r   )
datar   r   r   r   r   r   r   r   r   r   r   r   getFrameDimensionsD  s<    ,


r   c                 C  sF   t |  } t| dkr$d}t|dd | D \}}t||dd|S )zPair of coordinates.rD   zposition not defined right wayc                 s  s   | ]}t |V  qd S r   r   r   r   r   r   rI   t  s     zgetPos.<locals>.<genexpr>Nr   )positionr   r   rH   r   r   r   r   getPosm  s    r   c                 C  s   t |  dkS )zIs it a boolean?.>   trueyesra   r   rZ   sr   r   r   getBoolx  s    r   c              
   C  s*   t t t| W  5 Q R  S Q R X d S r   )
contextlibsuppressr   r]   r   r   r   r   getFloat}  s    r   )r   centerZmiddler   Zjustifyc                 C  s   t t|  |S r   )
ALIGNMENTSr   rJ   rL   r[   r   r   r   getAlign  s    r   z2^data:(?P<mime>[a-z]+/[a-z]+);base64,(?P<data>.*)$         
   $   j   gx!?gy=?rC   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   )rG   iZlower_font_listZupper_font_listr   r   
<dictcomp>P  s      z*get_default_asian_font.<locals>.<dictcomp>)
r   	reportlabpdfbase_cidfontdatadefaultUnicodeEncodingsr0   appendrL   rangerM   )	font_dictfontsfontr   r   r   get_default_asian_fontF  s    
r   c                 C  s0   t tjjj}| }| |kr,tt|  d S r   )	r   r   r   r   r   r0   r   ZregisterFontr   )Zfontnamer   r   r   r   r   set_asian_fontsS  s    r   c                 C  s   t jj}| |kr| S d S r   )	xhtml2pdfrT   ZDEFAULT_LANGUAGE_LIST)nameZasian_language_listr   r   r   detect_languageZ  s    r   c                 C  s"   t |dkrt| }t|S d S )N>   hebrewarabicsindhipashtourdupersian)r   arabic_reshaperZreshaper   )textlanguagearr   r   r   arabic_formata  s    
r   c                 C  s.   t | dr*| d}t||}|r&|S d S d S )Nr   )r5   __getattribute__r   )contextZ	frag_textr   Zdetect_language_resultr   r   r   frag_text_language_checkr  s    


r   c                   @  s   e Zd ZdS )ImageWarningN)r   r$   r%   r   r   r   r   r   |  s   r   )N)N)N)r   Nrl   )D
__future__r   r   loggingrer   typingr   r   r   Zreportlab.pdfbase._cidfontdataZbidir   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   	getLoggerr   r   compilerP   r   r,   r4   r;   r=   rX   r\   r^   __annotations__r_   ri   rj   rk   r   r   r   r   r   r   r   r   r   MDOTALLZ_rx_dataurirN   r   r   r   r   r   r   r   r   r   r   r   <module>   s   
	"
$
   N

)

	 















































































































































































  4
