o
    &zhX                     @  s  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dd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/d0Z-d1e+d2< d,d*d/d.d-d,d*d)d3d4	Z.d1e+d5< d+Z/d%e+d6< e#	 		7ddd<d=Z0e#d>d? Z1e#d@dA Z2ddEdFZ3e#dGdH Z4dIdJ Z5dKdL Z6eeeeedMZ7efdNdOZ8e!dPej9ej:B Z;i dQedRdSdTdUedVdWdXdYedZd[d\d]ed^d_d`daedbdbdbdced d\d\ddeded\dfdgedZd\d\dhedidjdkdledmdmdndoed\dpdqdred d d dsed\d_dtdued d d\dvedwdxdydzed{d|d|d}ed~ddi dedRdSdTdeddddedbdbdbded d d deddddeddddeded\d dedddded\deddedddded\d[dndednddded d\d\ded d dded dddeddddedddi ded dd deddddeddddedd ddedddded\dd deddddedd d deddddeddddeddddeddddedddded ddÃdedd dƃded\ddȃded dd\i deddddeddddeddd\dedddуded\d^dZdedddуded\d d\dedndndnded[d[d\ded\d`d dedd{dڃdeddd܃dedbdbdbded dd dedd\ddeddd܃dedVdWdXi deddddedZd\dZded\dddedRdSdTdedbdbdbdedRdSdTdedtdddedd ddedddded d d ded\d\dZdedZdddeddd^ded\dZdmdeddd ded\d^dtdedddi dedZdd܃dedd\d\d ed^d^ddedddƃdedΐdd΃dedddƃded\ddded\ddd	eddАd
deddd^deddddeddddeddqd~ded\d\dded d\d deddtdded^dZdi ded\d d\dedd d deddtd
ded d dtdedddƃdedȐddd edd!d"d#ed$d%dd&ed d^d'd(edddd)ed*d+d,d-edRdSdTd.ed d d d/ed0d0dd1edmd\d^d2ed\dpd3d4ed\dpd5i d6ed\d~dd7ed d d܃d8ed9dmdd:eddd d;edd<d=d>ed\d{d d?ed\d@d dAedِddBdCeddDd
dEedFdGdFdHedIdddJedddȃdKed\dLdMdNed\dِdOdPedtd,dQdRed\dSdTdUedVddVi dWeddddXedd d܃dYed\d d dZedddd[ed\dd3d]edd@d^d_ed^dܐd`daedbdcdddeedRdSdTdfedgddhdied\dmddjeddkdldmedSdSdSdneddd_doedpdqdtdreddd΃dseddd΃i dted\d^d^dued d\dedvedwdddxeddddyed dd܃dzedddd{ed|d|d|d}edRdSdTd~eddddedRdSdTdedbdbdbded\dddeddddeddddedmd~d!ded\d\d\dedmdmdmeddded d d ed d d ed\d\d ed'dtddZ<dd Z=dd Z>dd Z?dd Z@dd ZAG dd 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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...
    returnNonec                 C  s$   i | _ || _| jj| _| jj| _d S N)cachefunc__doc____name__)selfr    r   I/var/www/html/kangema/venv/lib/python3.10/site-packages/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kwargs	args_pluskeyresr   r   r   __call__@   s   

zMemoized.__call__N)r   r   )r   
__module____qualname__r   r   r$   r   r   r   r   r   -   s    
r   T)
cast_tuplevaluer   r'   boolr   listc                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 ])\}}|}|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 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   extrascpextrasreportlab_keycssr   r   r   transform_attrsT   s   
r7   c                 C  sT   |D ]%}t ||rt||nd}|du r!t|tr!||v r!|| }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/   )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/   )r0   r=   r(   r@   r>   r   r   r   	set_valuex   s
   rA   c                 C  s  | du rdS t | tr| S t|   } t| dkr|S | dv r#|S | tv r+t|  S | drQt| dkrQd| d  | d  | d  | d  | d  | d  } n-t	| r}zd	d
 t	| 
 D \}}}d|d|d|d} W n
 ty|   Y nw 	 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   >   nonetransparent#            c                 s      | ]}t |V  qd S r   )int).0xr   r   r   	<genexpr>       zgetColor.<locals>.<genexpr>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

r_   c                 C  s   | rt |  dvr| S |S )N>   rC   hiddenrQ   rS   r(   r[   r   r   r   getBorderStyle   s   rc   g      $@floatMMgUUUUUU?DPI96g      ?g      ?g      ?g      ?g      ?g      ?       @)1zxx-smallzx-small2small3medium4large5zx-large6zxx-large7z	xxx-largezdict[str, float]ABSOLUTE_SIZE_TABLEg      ?)	largersmallerz+4z+3z+2z+1z-1z-2z-3RELATIVE_SIZE_TABLEMIN_FONT_SIZE        str | float | list | tuplebase
int | Noner[   c              	   C  s  z\| }| du r|W S t | tr| W S t | trt| W S t | ttfr)d| } t|   	dd} | 
drGt| dd  t W S | 
drYt| dd  t W S | 
drkt| dd  t W S | 
d	r{t| dd  W S | 
d
rt| dd  d W S | 
drt| dd  t W S | dv rW dS |r>| 
drt| 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v r|W S | tv r|rtt|t|   W S tt|t|   W S | tv r4|r*tt|t|   W S tt|t|   W S tt|t|  W S zt| } W n tyW   td|  | Y W S w td| W S  tyr   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ptpcg      (@px>   0.00autorC   rw   rememexrg   %g      Y@>   normalinheritzgetSize: Not a float %rr   zgetSize %r %rT)exc_info)r+   rd   rK   r   r*   joinrQ   rR   rS   replaceendswithr   re   r   rf   ru   maxrv   rr   rZ   logwarning	Exception)r(   relativery   r[   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   )rM   ywhpagesizeax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.
    rF   zbox not defined right wayc                 s  rJ   r   r   rL   posr   r   r   rN   @  rO   zgetBox.<locals>.<genexpr>rQ   splitrT   RuntimeErrorr   )boxr   msgrM   r   r   r   r   r   r   getBox4  s   r   
page_widthpage_height!tuple[float, float, float, float]c           
      C  s  |  dg }t|dkr"t|d t|d t|d t|d fS t|  dd}t|  dd}t|  d	d}t|  d
d}d| v rmt| d }d| v r]t| d }|||  }nd	| v rmt| d	 }|||  }d| v rt| d }	d| v rt| d }|||	  }nd
| v rt| 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-boxrF   r   rG   rH   rI   topleftbottomrightheightwidthz
margin-topzmargin-leftzmargin-bottomzmargin-right)getrT   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.rH   zposition not defined right wayc                 s  rJ   r   r   r   r   r   r   rN   t  rO   zgetPos.<locals>.<genexpr>Nr   )positionr   r   rM   r   r   r   r   getPosm  s   r   c                 C  s   t |  dv S )zIs it a boolean?.>   rh   r   yestruera   sr   r   r   getBoolx  s   r   c                 C  s6   t t t| W  d    S 1 sw   Y  d S r   )
contextlibsuppressr   rd   r   r   r   r   getFloat}  s   $r   )r   centermiddler   justifyc                 C  s   t t|  |S r   )
ALIGNMENTSr   rQ   rS   rb   r   r   r   getAlign  s   r   z2^data:(?P<mime>[a-z]+/[a-z]+);base64,(?P<data>.*)$activeborder         activecaption
   $   j   	alicebluegx!?gy=?rG   antiquewhiteg/R(__?g<E~}?g!r?appworkspace   aqua
aquamarineg{H?gฌ?azure
background:   n      beigeg]P?g]3f?bisquegJzZ?gRz?blackblanchedalmondg Q?blue
bluevioletg)TPQ?g}͑?gec]\?browngr?g<?	burlywoodgH]?gk?gCo?
buttonfacebuttonhighlight   buttonshadow
buttontext	cadetblueg?g
(?g?captiontext
chartreuse	chocolategI}YZ?g([Z?gx!?coralg?cornflowerblueg.py?g	F?gQ<?cornsilkcrimsongv?gx!?cyandarkblueg%c\qq?darkcyandarkgoldenrodgT g?g#~?darkgrayg̒ 55?	darkgreendarkgrey	darkkhakig%?gRb?g<H?darkmagentadarkolivegreengF]kSU?g噗?
darkorangeg2d?
darkorchidg333333?gz?g?darkred
darksalmong46<=?g4?g?darkseagreeng׃I?g9̗?darkslateblueg[;Q?g%W@?darkslategrayg
(?darkslategreydarkturquoisegO)?gkGq::?
darkvioletgb[>?g!\zz?deeppinkgOsr?deepskyblueg?dimgraydimgrey
dodgerblueg[;Q?	firebrickg3UV?g =E?floralwhiteforestgreenfuchsia	gainsboro
ghostwhitegold	goldenrodgip[[?gj?grayg3ۃ?graytextgreengreenyellowgb?grey	highlighthighlighttexthoneydewhotpinkgٕ?inactiveborderinactivecaptioninactivecaptiontext	indianredgT:?indigog.M?gkzPP?infobackground   infotextivorykhakig P?lavenderlavenderblush	lawngreeng1w-!?gf?lemonchiffon	lightblueg	y?
lightcoral	lightcyang\T?lightgoldenrodyellow	lightgray
lightgreeng*?	lightgrey	lightpinkgͪ?g88?lightsalmonlightseagreeng]QJVU?lightskybluelightslategraygC?g	^?lightslategreylightsteelblueg~?lightyellowlime	limegreenlinenmagentamaroonmediumaquamarineg?
mediumbluemediumorchidg WW?mediumpurplegPl?g x|{?mediumseagreeng(Bvv?g~qJ[\?mediumslateblueg(?gù?mediumspringgreeng:TS?mediumturquoisemediumvioletredg?g<?gpx?menumenutextmidnightbluegz?	mintcream	mistyroseg/[<<?moccasingO=බ?navajowhitenavyoldlacegJo	?olive	olivedrabgAGZ?g2d?orange	orangeredg)TPQ?orchidg<H?palegoldenrodg8G?	palegreengͮ{+?g?paleturquoiseg.!?palevioletred
papayawhipg<f2?gp{?	peachpuffgf67?perugZ?pinkgA)Z?g3xy?plumg÷n?
powderbluepurplered	rosybrown	royalbluegkzPP?saddlebrowng9]?salmongJzZ?
sandybrowngx'?g%?gX9?	scrollbarseagreengT:?g?seashellsiennag<$?g
?silverskyblue	slatebluegps?gٕ?	slategray	slategreysnowspringgreen	steelblueg2d?tantealthistlethreeddarkshadow@   
threedfacethreedhighlightthreedlightshadowthreedshadowtomatogbg
?g*SA?	turquoisegj?gù?violetwheatwhite
whitesmoke)windowwindowframe
windowtextyellow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   )rL   ilower_font_listupper_font_listr   r   
<dictcomp>P  s    z*get_default_asian_font.<locals>.<dictcomp>)
r   	reportlabpdfbase_cidfontdatadefaultUnicodeEncodingsr1   appendrS   rangerT   )	font_dictfontsfontr   r  r   get_default_asian_fontF  s   
r  c                 C  s4   t tjjj}| }| |v rtt|  d S d S r   )	r   r  r  r  r  r1   r   registerFontr   )fontnamer  r  r   r   r   set_asian_fontsS  s
   r  c                 C  s   t jj}| |v r
| S d S r   )	xhtml2pdfr[   DEFAULT_LANGUAGE_LIST)nameasian_language_listr   r   r   detect_languageZ  s   r  c                 C  s"   t |dv rt| }t|S d S )N>   urduarabichebrewpashtosindhipersian)r  arabic_reshaper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  )r8   __getattribute__r  )context	frag_textr  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  )r(   r   r'   r)   r   r*   r   )r   Nrw   )r(   rx   ry   rz   r[   rd   r   rd   )r   rd   r   rd   r   r   )D
__future__r   r   loggingrer   typingr   r  r  reportlab.pdfbase._cidfontdatabidir   reportlab.lib.colorsr   r   reportlab.lib.enumsr   r	   r
   r   reportlab.lib.unitsr   r   reportlab.pdfbaser   reportlab.pdfbase.cidfontsr   xhtml2pdf.defaultr  	getLoggerr   r   compilerW   r   r-   r7   r?   rA   r_   rc   re   __annotations__rf   rr   ru   rv   r   r   r   r   r   r   r   r   r   MDOTALL_rx_dataurirU   r  r  r  r  r  r   r  r   r   r   r   <module>   s  
	"$N

)

		
 !"#$%&'()*+,-./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
