
     hn                        d dl 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mZm	Z	 d dl
mZmZmZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZmZ g d	Z G d
 de      Z G d de      Z G d de      Zd Zd Z  e       d d       Z! e       d        Z"d Z# ejH                  d      Z% ejH                  dejL                        Z' ejH                  dejP                  ejR                  z        Z* ejH                  d      Z+ ejH                  dejX                        Z-g dZ. G d de/      Z0d!dZ1e2dk(  r!dZ e0e      Z3 e4e3jc                                yy)"    N)OrderedDict)escapeunescape)urljoinurlparseunquote)etreeCSSSelector)function_cache)csstext_to_pairsmerge_styles)PremailerError	Premailer	transformc                       e Zd Zy)r   N__name__
__module____qualname__     S/var/www/api/v1/venv_getwork_v1/lib/python3.12/site-packages/premailer/premailer.pyr   r          r   r   c                       e Zd Zy)ExternalNotFoundErrorNr   r   r   r   r   r      r   r   r   c                       e Zd Zy)ExternalFileLoadingErrorNr   r   r   r   r   r      r   r   r   c                 P    dj                  d | j                  d      D              S )z,makes every property in a string !important.;c              3   L   K   | ]  }|j                  d       sd|z  n|  yw)
!importantz%s !importantN)endswith).0ps     r   	<genexpr>z!make_important.<locals>.<genexpr>$   s-       A $%::l#;!B s   "$)joinsplit)bulks    r   make_importantr*   "   s(    88 C  r   c                      t        d      |       }|sKt        j                  d      } t        d      |       d   }|j                         j	                  d|       |S |d   S )z=Ensures that `root` contains a <head> element and returns it.headbodyr   )_create_cssselectorr	   Element	getparentinsert)rootr,   r-   s      r   get_or_create_headr3   *   sa    &v&t,D}}V$*"6*4034(Awr   c                 0    t        j                  | |      S )a  
    This function will cache the result from cssutils
    It is a big gain when number of rules is big
    Maximum cache entries are 1000. This is mainly for
    protecting memory leak in case something gone wild.
    Be aware that you can turn the cache off in Premailer

    Args:
        css_body(str): css rules in string format
        validate(bool): if cssutils should validate

    Returns:
        cssutils.css.cssstylesheet.CSSStyleSheet

    validate)cssutilsparseString)css_bodyr6   s     r   _cache_parse_css_stringr:   6   s    " 8<<r   c                     t        |       S Nr
   )selectors    r   r.   r.   J   s    x  r   c                 4    d }t         j                  ||       S )z.Capitalize float and margin CSS property namesc                     dj                  | j                  d      j                         | j                  d      | j                  d            S )Nz
{0}:{1}{2}propertyvalue
terminator)formatgroup
capitalizematchs    r   _capitalize_propertyz5capitalize_float_margin.<locals>._capitalize_propertyR   sB    ""KK
#..0KK KK%
 	
r   )_lowercase_margin_float_rulesub)r9   rH   s     r   capitalize_float_marginrK   O   s    
 (++,@(KKr   z(^|\s)\wz\<\!\[CDATA\[(.*?)\]\]\>zr(?P<property>margin(-(top|bottom|left|right))?|float)
        :
        (?P<value>.*?)
        (?P<terminator>$|;)z\s*!importantz!^#([0-9a-f])([0-9a-f])([0-9a-f])$)z:last-childz:first-child
:nth-childc                       e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZd ZddZd Zd Z	e
d	        Zdd
Zd Zd Zy)r   zdata-premailerNc                 Z   || _         || _        || _        || _        || _        || _        || _        || _        |
| _        || _	        |	| _
        t        |t              r|g}|| _        t        |t              r|g}|| _        || _        || _        || _        |g }|| _        || _        || _        || _        || _        || _        || _        || _        || _        |xs t6        | _        |rt:        j<                  j?                  |       |r t:        j<                  jA                  |       y y r<   )!htmlbase_urldisable_link_rewritespreserve_internal_linkspreserve_inline_attachmentspreserve_handlebar_syntaxexclude_pseudoclasseskeep_style_tagsremove_classesrK   include_star_selectors
isinstancestrexternal_stylescss_textstrip_importantmethod	base_pathdisable_basic_attributesdisable_validationcache_css_parsingdisable_leftover_cssalign_floating_imagesremove_unset_propertiesallow_networkallow_insecure_sslallow_loading_external_filesrequestssessionr7   log
addHandlersetLevel)selfrO   rP   rQ   rR   rS   rT   rU   rV   rX   rW   rK   r]   r[   r\   r^   r_   r`   ra   rb   cssutils_logging_handlercssutils_logging_levelrc   rd   re   rf   rg   rh   rj   s                                r   __init__zPremailer.__init__r   s7   > 	  &;"'>$+F()B&%:"  /,'>$&<#os+./O.h$ zH ."#+')$(@%"4!2$8!%:"'>$*"4,H)*(#LL##$<=!LL!!"89 "r   c                 b    | j                   rt        ||      S t        j                  ||      S )Nr5   )rb   r:   r7   r8   )rn   r9   r6   s      r   _parse_css_stringzPremailer._parse_css_string   s+    !!*8hGG##Hx@@r   c                 <     fdfd}g }g }|s||fS  j                  | j                         }|D ]  }|j                  |j                  k(  r|j	                  |       /|j                  |j
                  k7  rI|j                  j                         D cg c]  }|j                  dk7  r| }	}|j                  j                         D cg c]  }|j                  dk(  r| }
} ||	      } ||
      } ||	|
z         }d |j                  j                  d      D        }|D ]  }d|v r> j                  r2d|j                  dd      d   z   t        vr|j	                  ||f       Ed	|v r j                  sV|j                  d      rh|j                  d
      }|j                  d      }t!        t"        j%                  |            }d|fd|ffD ]-  \  }}|s	|||||t!        |      f}|j	                  |||f       /   ||fS c c}w c c}w )aA  Returns a list of rules to apply to this doc and a list of rules
        that won't be used because e.g. they are pseudoclasses. Rules
        look like: (specificity, selector, bulk)
        for example: ((0, 1, 0, 0, 0), u'.makeblue', u'color:blue').
        The bulk of the rule should not end in a semicolon.
        c                     j                   s| j                  dk7  r&dj                  | j                  | j                        S dj                  | j                  | j                        S )N	importantz{0}:{1}z{0}:{1} !important)r]   priorityrC   namerA   )proprn   s    r   format_css_propertyz9Premailer._parse_style_rules.<locals>.format_css_property   sM    ##t}}'C ''		4::>>+22499djjIIr   c                 8    dj                  fd| D              S )zAccepts a list of cssutils Property objects and returns
            a semicolon delimitted string like 'color: red; font-size: 12px'
            r    c              3   .   K   | ]  } |        y wr<   r   )r$   ry   rz   s     r   r&   zLPremailer._parse_style_rules.<locals>.join_css_properties.<locals>.<genexpr>   s     M*$/5*s   )r'   )
propertiesrz   s    r   join_css_propertiesz9Premailer._parse_style_rules.<locals>.join_css_properties   s     88M*MMMr   r5   rv   c              3      K   | ]C  }|j                         r1|j                         j                  d       s|j                          E yw)@N)strip
startswith)r$   xs     r   r&   z/Premailer._parse_style_rules.<locals>.<genexpr>   s:      5A779QWWY%9%9#%> 	5s   A	A,:   *#.r   )rs   ra   type
MEDIA_RULEappend
STYLE_RULEstylegetPropertiesrw   selectorTextr(   rU   FILTER_PSEUDOSELECTORSrX   r   countlen_element_selector_regexfindall)rn   r9   ruleset_indexr~   leftoverrulessheetrulery   normal_propertiesimportant_propertiesbulk_normalbulk_importantbulk_all	selectorsr=   id_countclass_countelement_countis_importantr)   specificityrz   s   `                     @r   _parse_style_ruleszPremailer._parse_style_rules   sZ   	J	N (?"&&xd>U>U:U&VDyyDOO+%yyDOO+
 !JJ446!6D==K/ 6  ! !JJ446$6D==K/ 6 ! $ ..?@K01EFN*+<?S+STH**005I
 &8O22hnnS!4Q77?UU OOXx$89H_T-H-H((- $>>#.&nnS1 #$;$C$CH$M N -.~+>K@P*Q&L$ $ #%%E
#K LL+x!>? +R/ &A J hw!
$s   HHc                    || j                   t        d      || j                   t        d      || j                   }t        |d      r|j                         }|}|}n| j                  dk(  rt        j                  dd      }nt        j                         }|j                         }| j                  rt        j                  dd	 |      }t        j                  ||      j                         }|j                         }|j                  |j                  j                         r|n|}|J | j"                  rd}	nt%        |      }	g }
d
}dg}| j&                  r|j)                  d        t+        dj-                  |            |      D ]"  }|j.                  j1                  d      }|r|dvr&|j.                  j1                  | j2                        }|rC|dk(  r|j.                  | j2                  = jt5        j6                  d| j2                  d|d       |j8                  dk(  }|r|j:                  }n,|j.                  j1                  d      }| j=                  |      }| j?                  ||      \  }}|dz  }|
jA                  |       |jC                         }|s| jD                  r|r|}n$t        jF                  d      }d|j.                  d<   | jD                  r||_        n| jI                  |      |_        | jJ                  r%tL        j                  d|j:                        |_        | j                  dk(  r$t        jN                  |j:                        |_        |r|jQ                  |       |jS                  |       | jD                  r|r|jS                  |       % | jT                  rG| j&                  r;| jT                  D ],  }| j=                  |      }| jW                  |||
|	       |dz  }. | jX                  r*| jX                  D ]  }| jW                  |||
|	       |dz  } |
j[                  t]        j^                  d
             i }|
D ]  \  }}}|}d}d|v rt        j`                  d|d      \  }}d|z  }|tb        v s|j                  d      rd}n|}|sJ t+        |      } ||      }te        |      sotg        || jh                         }|D ]H  } tk        |       }!|!|vr	| g g d||!<   ||!   d   j)                  |       ||!   d   j)                  |       J  |jm                         D ]l  \  }}to        |d    j.                  j1                  dd      |d   |d   | jp                  !      }"|"r|"|d    j.                  d<   | js                  |d    |"d"#       n | jt                  r3|jw                  d$      D ]  } | jC                         }#|#j.                  d%= ! | jx                  r>|jw                  d&      D ]*  } ty        |       }$|$| jC                         j.                  d<   , | jz                  rv|jw                  d'      D ]b  } t}        j~                  | j.                  d         }%|%j                  d(k(  rd(| j.                  d)<   D|%j                  d*k(  sTd*| j.                  d)<   d | j                  r| j                  st        | j                        j                  st        d+      d,D ]  }&|jw                  d-|&z        D ]  } | jC                         }#|#j.                  |&   }'|&dk(  r| j                  r|'j                  d.      rE|&d/k(  r| j                  r|'j                  d0      rh|&dk(  r|'j                  d1      rt        | j                  |'      |#j.                  |&<     t        |d      r|S |j                  d2| j                         |j                  d3|       |j                  d4d5       t        j                  |fi |j                  |d4         }(| j                  dk(  rt        j                  d6 |(      }(| j                  rt        j                  d7d8 |(      }(|(S )9zUchange the html and return it with CSS turned into style
        attributes.
        NzCan't pass html argument twicez must pass html as first argumentgetroottreexmlF)ns_cleanresolve_entitiesz="{{(.*?)}}"c                 F    dt        | j                         d         z   dz   S Nz="{{r   z}}")r   groupsrF   s    r   <lambda>z%Premailer.transform.<locals>.<lambda>]  s    &6%,,.2C+D"Du"Lr   r   r   zlink[rel~=stylesheet]r   media)allscreenignorezUnrecognized z attribute ()hrefr   text/cssr    )keyr   z:%srL   r5   )itemclassesr   r   r   )re   T)forcez//@classclassz//@stylez//img[@style]rightalignleftzBase URL must have a scheme)r   srcz//@%sr   r   zcid:ztel:r^   pretty_printencodingutf-8c                 *    d| j                  d      z  S )Nz/*<![CDATA[*/%s/*]]>*/r   )rD   )ms    r   r   z%Premailer.transform.<locals>.<lambda>0  s    6Cr   z="%7B%7B(.+?)%7D%7D"c                 X    dt        t        | j                         d               z   dz   S r   )r   r   r   rF   s    r   r   z%Premailer.transform.<locals>.<lambda>7  s$    &8GELLN1<M4N+O"ORW"Wr   )MrO   	TypeErrorhasattrr   r^   r	   	XMLParser
HTMLParserr   rT   rerJ   
fromstringgetrootr   docinfodoctyperc   r3   rf   r   r.   r'   attribgetattribute_namewarningswarntagtext_load_externalr   extendr0   rV   r/   _css_rules_to_stringr]   _importantsCDATAaddpreviousremover[   _process_css_textr\   sortoperator
itemgetterr(   r   r   r   ra   iditemsr   re   _style_to_basic_html_attributesrW   xpathrK   rd   r7   
parseStylefloatrP   rQ   r   scheme
ValueErrorrR   rS   r   
setdefaulttostringdecode_cdata_regex))rn   rO   r   kwargsr2   pagetreeparserstrippedr,   r   indexcssselectorelementr   data_attributeis_styler9   r   these_rulesthese_leftoverparent_of_elementr   	stylefileelements_r=   new_selectorclass_selr   processed_styler   item_idfinal_styleparentmangled	image_cssattrurlouts)                                            r   r   zPremailer.transform+  s    		 5<==\dii/>??\99D4'##%DDD{{e#%%P))+zz|H6 --66#L ##Hf5AACD<<>D $..t||/C/CD4$D$$D%d+D
 i67A*388K+@A$GG NN&&w/E&77$^^//0C0CDN!X-t':':;MM..@
 {{g-H"<<~~))&1..t4*.*A*A(E*R'KQJELL% ' 1 1 3!5!5#E!MM'2E+5ELL(''!)EJ!%!:!:>!JEJ''!,UZZ!@EJ;;%'!&UZZ!8EJ''.%,,W5))!((1i Hn D$6$6!11	..y9&&xtD
 2 == MM&&xtD
 * 	

x**1-
. "'Ax#LFh')xxXq'A$f//63D3D\3R'O8%h/CIE5z"2(?(?$?# "D hGh.59bSU,V)W%g.55oFW%i077? "+ #(B #..*JAw&&&**7B7 	"(,(D(D	K  3>&&w/00D 1  + 

:.)MM'* / ''

:.1$73: ''0 / %%

?3$//G0DE	??g-+2DKK(__.+1DKK( 4 ==!;!;DMM*11 !>??' JJw~6D!^^-F ---C 88NN3/  <<NN62 v~#..*@ *1$--*EFMM$'# 7 (( 4'Kh4nl;j'2..0077z8JKC{{e#"&&CS
 --ff+W
 Jr   c                     | j                   j                  || j                         }|j                          |j                  S )N)verify)rj   r   rg   raise_for_statusr   )rn   r  responses      r   _load_external_urlzPremailer._load_external_url<  s:    <<##CD4K4K0K#L!!#}}r   c                    |j                  d      r%| j                  rd| j                  v rd|z   }nd|z   }|j                  d      s|j                  d      r| j                  |      }|S | j                  st	        dj                  |            |}t        j                  j                  | j                  xs t        j                        }t        j                  j                  |      s=t        j                  j                  t        j                  j                  ||            }t        j                  j                  |      r2t        j                  |d      5 }|j!                         }d	d	d	       |S | j                  r't#        | j                  |      }| j%                  |      S t'        |      # 1 sw Y   S xY w)
z<loads an external stylesheet from a remote url or local pathz//zhttps://zhttps:zhttp:zhttp://zEUnable to load external file {!r} because it's explicitly not allowedr   )r   N)r   rP   r  rh   r   rC   ospathabspathr_   curdirisabsr'   existscodecsopenreadr   r   r   )rn   r  r9   r   r_   fs         r   r   zPremailer._load_externalA  sV   >>$}}t}}!<nm>>)$z(B..s3H( ' 22*6#; 
 I(C"))DI77==+GGOOBGGLLI,NO	ww~~i([[W= vvxH >  dmmS1**3//+I66 > s   !F::Gc                 2    t         j                  d|       }|S )zFix background colors for Lotus Notes

        Notes which fails to handle three character ``bgcolor`` codes well.
        see <https://github.com/peterbe/premailer/issues/114>z#\1\1\2\2\3\3)_short_color_codesrJ   )color_valueretvals     r   	six_colorzPremailer.six_colora  s     $''(8+Fr   c                 P   |j                  d      r:|j                  d      |j                  d      k(  r|j                  d      d   dd }t               }|j                  d      D cg c]1  }t        |j                  d            dk(  s!|j                  d      3 c}D ]  \  }}|j	                         }|d	k(  r|j	                         |d
<   /|dk(  r|j	                         |d<   H|dk(  r5d|j                         vr#| j                  |j	                               |d<   |dk(  s|dk(  s|j	                         }|j                  d      r|dd }|||<    |j                         D ]3  \  }}||j                  v r|r|| j                  v r%||j                  |<   5 yc c}w )a0  given an element and styles like
        'background-color:red; font-family:Arial' turn some of that into HTML
        attributes. like 'bgcolor', etc.

        Note, the style_content can contain pseudoclasses like:
        '{color:red; border:1px solid green} :visited{border:1px solid green}'
        }{r   r   Nr    r      z
text-alignr   zvertical-alignvalignzbackground-colortransparentbgcolorwidthheightpx)r   r(   r   r   r   lowerr  r#   r   r   r`   )rn   r   style_contentr   
attributesr   r   rA   s           r   r   z)Premailer._style_to_basic_html_attributesl  s    s#(;(;C(@MDWDWE
 )
 *//4Q7;M ]
"/"5"5c":
":Qc!''#,>OST>TAGGCL":
JC ))+Cl"&+kkm
7#((',{{}
8$**}EKKM/Q
 )-u{{}(E
9%3(?>>$'!#2JE"'
3'
* %**,JCw~~%$777 "'GNN3 -+
s   )"F#F#c                 8   g }|D ]  }t        |t              r&|\  }}|j                  |dt        |      d       :|j                  D ]  }t        |t
        j                  j                  j                  t
        j                  j                  j                  f      rV|j                  j                         D ]-  }|j                  j                  |d      df|j                  |<   /  |j                  |j                          dj                  |      S )z.given a list of css rules returns a css stringz {r   Fr"   
)rY   tupler   r*   cssRulesr7   css
csscomment
CSSCommentcssunknownruleCSSUnknownRuler   keysgetPropertyValuecssTextr'   )rn   r   linesr   kvr   r   s           r   r   zPremailer._css_rules_to_string  s    D$&1!^A->?@ !MMD!$LL33>>$LL77FF !#zz0 JJ77UC(+

3  1 * T\\*) * yyr   c                 2   | j                  ||      \  }}|j                  |       |o|s| j                  r`t        j                  d      }d|j
                  d<   | j                  r||_        n| j                  |      |_        |j                  |       yyy)zprocesses the given css_text by adding rules that can be
        in-lined to the given rules list and adding any that cannot
        be in-lined to the given `<head>` element.
        Nr   r   r   )	r   r   rV   r	   r/   r   r   r   r   )rn   r\   r   r   r,   r   r   r   s           r   r   zPremailer._process_css_text  s    
 '+&=&=h&N#^[!43G3GMM'*E#-ELL ##%
!66~F
KK 4Hr   )NNFFTFTFFFFTNNrO   NNFTNNFTTTFFNT)NTF)r   r   r   r   rq   rs   r   r   r  r   staticmethodr  r   r   r   r   r   r   r   r   n   s    %N # %$("'"$ %!% !%#"" $ %*;P:dA_BOb
@  +(Z 4r   r   c                 :    t        di |j                  | |      S )N)r   r   )r   r   )rO   r   r   s      r   r   r     s     v((L(IIr   __main__a  <html>
        <head>
        <title>Test</title>
        <style>
        h1, h2 { color:red; }
        strong {
          text-decoration:none
          }
        p { font-size:2px }
        p.footer { font-size: 1px}
        </style>
        </head>
        <body>
        <h1>Hi!</h1>
        <p><strong>Yes!</strong></p>
        <p class="footer" style="color:red">Feetnuts</p>
        </body>
        </html>r=  r>  )5r  r   r  r   r   collectionsr   rO   r   r   urllib.parser   r   r   r7   ri   lxmlr	   lxml.cssselectr   premailer.cacher   premailer.merge_styler   r   __all__	Exceptionr   r   r   r   r*   r3   r:   r.   rK   compiler   DOTALLr   
IGNORECASEVERBOSErI   r   Ir  r   objectr   r   r   r%   printr   r   r   <module>rQ     se     	 	  # ! 3 3    & * @ 7	Y 		J 		y 		 = =& ! !
L %"**[1 rzz5ryyA)rzz MMBJJ   bjj)*RZZ DbddK  G S	 S	lJ zD$ 	$A	!++-) r   