
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
Ÿ”Œ]€  ã               @   s    d Z ddlZddlZddlZddljZddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZ dZG d	d
„ d
ejjƒZddd„Z
dS )z>html2text: Turn HTML into equivalent Markdown-structured text.é    N)Úwrap)Úconfig)Údumb_css_parserÚelement_styleÚ	escape_mdÚescape_md_sectionÚgoogle_fixed_width_fontÚgoogle_has_heightÚgoogle_list_styleÚgoogle_text_emphasisÚhnÚlist_numbering_startÚpad_tables_in_textÚskipwrapÚunifiable_néã  é	   é   c                   sÒ   e Zd Zddejf‡ fdd„	Z‡ fdd„Zdd„ Zd	d
„ Z‡ fdd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd.d"d#„Zd/d$d%„Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Z‡  ZS )0Ú	HTML2TextNÚ c                s
  t ƒ jdd� d| _d| _d| _tj| _tj| _	tj
| _|| _tj| _tj| _tj| _tj| _tj| _tj| _tj| _tj| _tj| _tj| _ tj!| _"tj#| _$d| _%d| _&d| _'d| _(tj)| _*tj+| _,d| _-tj.| _/tj0| _1tj2| _3tj4| _5tj6| _7d| _8tj9| _:tj;| _<|dk�r| j=| _>n|| _>g | _?d| _@d| _Ad| _Bd| _Cd| _Dg | _Eg | _Fd| _Gd| _HtIjJd	ƒ| _Kd| _Lg | _Md| _Nd| _Od| _Pd| _Qd| _Rd
| _Sd| _Td| _Ud| _Vi | _Wg | _Xd| _Yd| _Zd| _[d| _\d| _]i | _^|| __d| _`d| _ad| _bd| _cdtjdd< dS )zË
        Input parameters:
            out: possible custom replacement for self.outtextf (which
                 appends lines of text).
            baseurl: base URL of the document we process
        F)Zconvert_charrefsr   Ú*Ú_z**NTz^[a-zA-Z+]+://r   z&nbsp_place_holder;Únbsp)eÚsuperÚ__init__Úsplit_next_tdÚtd_countÚtable_startr   ZUNICODE_SNOBÚunicode_snobZESCAPE_SNOBÚescape_snobZLINKS_EACH_PARAGRAPHÚlinks_each_paragraphÚ
body_widthZSKIP_INTERNAL_LINKSÚskip_internal_linksZINLINE_LINKSÚinline_linksZPROTECT_LINKSÚprotect_linksZGOOGLE_LIST_INDENTÚgoogle_list_indentZIGNORE_ANCHORSÚignore_linksZIGNORE_IMAGESÚignore_imagesZIMAGES_AS_HTMLÚimages_as_htmlZIMAGES_TO_ALTÚimages_to_altZIMAGES_WITH_SIZEÚimages_with_sizeZIGNORE_EMPHASISÚignore_emphasisZBYPASS_TABLESÚbypass_tablesZIGNORE_TABLESÚignore_tablesÚ
google_docÚul_item_markÚemphasis_markÚstrong_markZSINGLE_LINE_BREAKÚsingle_line_breakZUSE_AUTOMATIC_LINKSÚuse_automatic_linksÚhide_strikethroughZ	MARK_CODEÚ	mark_codeZWRAP_LIST_ITEMSÚwrap_list_itemsZ
WRAP_LINKSÚ
wrap_linksZ
PAD_TABLESÚ
pad_tablesZDEFAULT_IMAGE_ALTÚdefault_image_altÚtag_callbackZ
OPEN_QUOTEÚ
open_quoteZCLOSE_QUOTEÚclose_quoteÚouttextfÚoutÚouttextlistÚquietÚp_pÚoutcountÚstartÚspaceÚaÚastackÚmaybe_automatic_linkÚ
empty_linkÚreÚcompileÚabsolute_url_matcherÚacountÚlistÚ
blockquoteÚpreÚstartpreÚcodeÚquoteÚ	br_toggleÚ	lastWasNLÚlastWasListÚstyleÚ	style_defÚ	tag_stackÚemphasisÚdrop_white_spaceÚinheaderÚ
abbr_titleÚ	abbr_dataÚ	abbr_listÚbaseurlÚstressedÚpreceding_stressedÚpreceding_dataÚcurrent_tagÚ	UNIFIABLE)Úselfr>   r_   Ú	bodywidth)Ú	__class__© ú/usr/lib/python3.6/__init__.pyr   "   s”    

zHTML2Text.__init__c                s   |j ddƒ}tƒ j|ƒ d S )Nz</' + 'script>z	</ignore>)Úreplacer   Úfeed)re   Údata)rg   rh   ri   rk   |   s    zHTML2Text.feedc             C   s8   | j |ƒ | j dƒ | j| jƒ ƒ}| jr0t|ƒS |S d S )Nr   )rk   ÚoptwrapÚcloser8   r   )re   rl   Zmarkdownrh   rh   ri   Úhandle€   s    

zHTML2Text.handlec             C   s"   | j j|ƒ |r|d dk| _d S )Né   Ú
éÿÿÿÿ)r?   ÚappendrT   )re   Úsrh   rh   ri   r=   ‰   s    zHTML2Text.outtextfc                sZ   t ƒ jƒ  | jƒ  | jddd� dj| jƒ}| jr@tjj	d }nd}|j
d|ƒ}g | _|S )Nr   Úend)Úforceznbsp;ú z&nbsp_place_holder;)r   rn   ÚpbrÚoÚjoinr?   r   ÚhtmlÚentitiesÚhtml5rj   )re   Zouttextr   )rg   rh   ri   rn   Ž   s    
zHTML2Text.closec             C   s   | j | j|ƒdƒ d S )NT)Úhandle_dataÚcharref)re   Úcrh   rh   ri   Úhandle_charref¢   s    zHTML2Text.handle_charrefc             C   s   | j |ƒ}|r| j|dƒ d S )NT)Ú	entityrefr~   )re   r€   Úrefrh   rh   ri   Úhandle_entityref¥   s    
zHTML2Text.handle_entityrefc             C   s   | j ||dd� d S )NT)rC   )Ú
handle_tag)re   ÚtagÚattrsrh   rh   ri   Úhandle_starttag±   s    zHTML2Text.handle_starttagc             C   s   | j |d dd� d S )NF)rC   )r…   )re   r†   rh   rh   ri   Úhandle_endtag´   s    zHTML2Text.handle_endtagc             C   s†   d|krdS d}xpt | jƒD ]b\}}d|krv|d |d krvd|ksLd|krrd|krvd|krv|d |d krvd}nd}|r|S qW dS )zÍ
        :type attrs: dict

        :returns: The index of certain set of attributes (of a link) in the
        self.a list. If the set of attributes is not found, returns None
        :rtype: int
        ÚhrefNFÚtitleT)Ú	enumeraterE   )re   r‡   ÚmatchÚirE   rh   rh   ri   ÚpreviousIndex·   s    zHTML2Text.previousIndexc             C   sæ  t |ƒ}t |ƒ}d|ko| j}d}x$tjD ]}||ko<||k}|r*P q*W d|koVd|k}	t|ƒopt|ƒ op| j }
|�r|s„|	s„|
r’|  jd7  _|r¤|  jd7  _|	rÂ| j| j	ƒ |  j
d7  _
|rà| j| jƒ |  j
d7  _
|
�râ| jdƒ |  j
d7  _
d| _nÜ|�s|	�s|
�r,|  jd8  _d| _|
�rZ| j
�rJ|  j
d8  _
n
| jdƒ d| _|�r„| j
�rx|  j
d8  _
n| j| jƒ |	�r®| j
�r¢|  j
d8  _
n| j| j	ƒ |�sº|	�rÎ| j �rÎ| jdƒ |�râ|  jd8  _dS )	z/
        Handles various text emphases
        zline-throughFÚitalicrp   ú`Trw   N)r   r4   r   ZBOLD_TEXT_STYLE_VALUESr   rO   rY   r@   ry   r0   rZ   r1   rQ   rD   )re   rC   Ú	tag_styleÚparent_styleZtag_emphasisZparent_emphasisZstrikethroughZboldZbold_markerr�   Zfixedrh   rh   ri   Úhandle_emphasisÓ   s^    



zHTML2Text.handle_emphasisc             C   sô  || _ |d kri }nt|ƒ}| jd k	r>| j| |||ƒdkr>d S |rx| jd k	rx|d^krx|dksb| jrx| jdƒ d | _d	| _| jrði }|r¼| jrš| jd_ d }t	|| j
|ƒ}| jj|||fƒ n4| jrÌ| jjƒ nd i i f\}}}| jrð| jd` d }t|ƒ�r0| jƒ  |�r&d| _| jt|ƒd d ƒ n
d	| _d S |dak�r‚| j�rf|�r\t|ƒ�r\| jƒ  n| jƒ  n| j�rz|dk�rzn| jƒ  |dk�r´|�r´| jdk�rª| jdƒ n
| jdƒ |dk�rÞ|�rÞ| jƒ  | jdƒ | jƒ  |dbk�r|�rþ|  jd
7  _n|  jd
8  _|dk�r:|�r,|  jd
7  _n|  jd
8  _|dck�rJd| _|dk�rœ|�r†| jƒ  | jddd� d| _|  jd
7  _n|  jd
8  _| jƒ  dd„ }|ddk�rð| j �rð|�rÔ|| ƒ�rÔd| j }n| j}| j|ƒ |�rðd| _|dek�r<| j �r<|�r || ƒ�r d| j }	n| j}	| j|	ƒ |�r<d| _|dfk�rv|�r\|| ƒ�r\d$}
nd%}
| j|
ƒ |�rvd| _| j�r”| j�s”| j|||ƒ |dgk�r¼| j �r¼| jd)ƒ | j | _|d*k�r|�rîd | _d+| _d,|k�r|d, | _n&| jd k	�r| j| j | j< d | _d | _|d-k�rJ| j!�s4| j| j"ƒ n| j| j#ƒ | j! | _!dhd.d/„}|d0k�r| j$ �r|�rêd1|k�rÚ|d1 d k	�rÚ| j%�oš|d1 j&dƒ �rÚ| jj|ƒ |d1 | _d| _| j'�ræd2|d1  d3 |d1< n| jjd ƒ �n| j�r| jjƒ }| j�r| j �rd | _nð|�r| j�r:| jdƒ d	| _d | _| j(�ržy"|d, �rV|d, nd+}t)|ƒ}W n& t*k
�rŠ   || |d1 d+ƒ Y nX || |d1 |ƒ nh| j+|ƒ}|d k	�r¾| j,| }n.|  j-d
7  _-| j-|d4< | j.|d5< | j,j|ƒ | jd6t/|d4 ƒ d7 ƒ |dk�r,|�r,| j �r,d8|k�r,| j0�s>|d8 |d1< |j1d9ƒ�pN| j2}| j3�st| j4�rðd:|k�std;|k�rð| jd<|d8  d= ƒ d:|k�rª| jd>|d:  d= ƒ d;|k�rÊ| jd?|d;  d= ƒ |�râ| jd@| d= ƒ | jdAƒ d S | jd k	�r\| j}| j0�rFt)|ƒ|k�rF| j5j6|ƒ�rF| jd2t)|ƒ d3 ƒ d	| _d S | jdƒ d | _d	| _| j0�rt| jt)|ƒƒ n¸| jdBt)|ƒ d7 ƒ | j(�rÄ|j1d1ƒ�p d+}| jdCt)t7j8| j9|ƒƒ dD ƒ nh| j+|ƒ}|d k	�rä| j,| }n.|  j-d
7  _-| j-|d4< | j.|d5< | j,j|ƒ | jdt/|d4 ƒ d7 ƒ |dk�rD|�rD| jƒ  |dk�r^| �r^| j:ƒ  |dEk�rx|�rx| jdFƒ |dEk�r’| �r’| j:ƒ  |dik�	r(| j; �r¸| j< �r¸| jƒ  |�rð| j�rÐt=|ƒ}n|}t>|ƒ}| j;j||dIœƒ n0| j;�	r | j;jƒ  | j �	r | j; �	r | jdJƒ d| _<nd	| _<|dKk�	rê| j:ƒ  |�	rê| j;�	rZ| j;dj }n
dHddIœ}| j�	rx| j?|ƒ}n
t@| j;ƒ}| jdL| ƒ |dM dHk�	r°| j| jAd ƒ n4|dM dGk�	rä|dN  d
7  < | jt/|dN ƒdO ƒ d| _|dkk�r²| jB�
r|dQk�r²|�
rn| jƒ  n �n–| jC�
r’|�
r2| jƒ  |dlk�
rf|�
rT| jdTjD|ƒƒ n| jdUjD|ƒƒ n(|�
r~| jdVjD|ƒƒ n| jdWjD|ƒƒ �n |dPk�
rö|�
rÐd| _E| jF�
rö| jd2tGjH d3 ƒ | jdƒ n&| jF�
rö| jdXtGjH d3 ƒ | jdƒ |dmk�r|�r| jI�r| jdYƒ d| _I|dQk�r4|�r4d| _J|dQk�rT| �rTd	| _I| jƒ  |dQk�r”| �r”| jE�r”| jdZjKd[g| jJ ƒƒ | jƒ  d	| _E|dnk�r²|�r²|  jJd
7  _J|d\k�rð|�rÐd| _Ld| _nd	| _| jM�rè| jNd]ƒ | jƒ  d S )oNTÚpÚdivrV   ÚdlÚdtZimgú[Frp   é   ú#rw   Úbrr   z  
> z  
Zhrz* * *ÚheadÚscriptÚbodyrN   z> )rv   c             S   s   | j otjd| j d ƒS )Nz[^\s]rp   rr   )rb   rI   r�   )re   rh   rh   ri   Úno_preceding_space|  s    z0HTML2Text.handle_tag.<locals>.no_preceding_spaceÚemrŽ   ÚuÚstrongÚbÚdelÚstrikert   z ~~z~~ÚkbdrQ   Úttr‘   Úabbrr   r‹   Úqc             S   s@   t j| j|ƒ}|jƒ r dj|ƒnd}| jdjt|ƒ|d�ƒ d S )Nz "{}"r   z]({url}{title}))Úurlr‹   )ÚurlparseÚurljoinr_   ÚstripÚformatry   r   )re   Úlinkr‹   r«   rh   rh   ri   Úlink_url¹  s    z&HTML2Text.handle_tag.<locals>.link_urlrE   rŠ   ú<ú>ÚcountrB   z][ú]ÚsrcÚaltÚwidthZheightz
<img src='z' zwidth='zheight='zalt='z/>z![ú(ú)Zddz    ÚolÚul)ÚnameÚnumrq   Úliz  r½   r¾   z. ÚtableÚtrÚtdÚthz<{}>

z
</{}>z<{}>z</{}>z</z| ú|z---rO   z
[/code])r•   r–   rV   r—   r˜   rr   rr   )r•   r–   )r�   rV   rž   )rŸ   )r¡   rŽ   r¢   )r£   r¤   )r¥   r¦   rt   )r§   rQ   r¨   )r   )r»   r¼   rr   )rÀ   rÁ   rÂ   rÃ   )rÂ   rÃ   )rÂ   rÃ   )rÂ   rÃ   )Orc   Údictr:   rG   r'   ry   rH   r.   rX   r   rW   rs   Úpopr   r•   r[   r	   Úsoft_brrF   rN   r@   rV   rC   r+   r0   r`   r1   r”   rO   rQ   r\   r]   r^   rR   r;   r<   r&   r"   Ú
startswithr$   r#   r   ÚKeyErrorr�   rE   rL   rB   Ústrr)   Úgetr9   r(   r*   rK   r�   r¬   r­   r_   rx   rM   rU   r
   r   Úgoogle_nest_countÚlenr/   r-   r,   r¯   r   r8   r   ZTABLE_MARKER_FOR_PADr   r   rz   rP   r5   r>   )re   r†   r‡   rC   r“   r’   Zdummyr    rY   r£   r¦   r±   rE   r‹   rŽ   r·   rŠ   Z
list_styleZnumbering_startr¿   Ú
nest_countrh   rh   ri   r…     s$   


 






















































zHTML2Text.handle_tagc             C   s   | j dkrd| _ dS )zPretty print has a line breakr   rp   N)rA   )re   rh   rh   ri   rx   •  s    
zHTML2Text.pbrc             C   s   | j r
dnd| _dS )z Set pretty print to 1 or 2 linesrp   rš   N)r2   rA   )re   rh   rh   ri   r•   š  s    zHTML2Text.pc             C   s   | j ƒ  d| _dS )zSoft breaksz  N)rx   rS   )re   rh   rh   ri   rÇ   ž  s    zHTML2Text.soft_brFc             C   sF  | j dk	r|  j |7  _ | j�sB| jrT|jƒ }| jrF| jp>| j rF|}|dkrTd| _|r�| j r�tjdd|ƒ}|r�|d dkr�d| _	|dd… }| r | r dS | j
rÜ|jdƒ rÆ|jd	ƒ rÆd| }| jrÜ| jd
ƒ d| _d| j }|oø|oø|d dk �r| j�r|d7 }| j�rX| j�s&|d7 }x tt| jƒƒD ]}|d7 }�q6W |jdd| ƒ}| j
�rxd| _
| j�rx|jdƒ}| j�r’d| _	d| _d| _|dk�r²d| _| jdƒ d| _	| j�rà| j| jd | | j ƒ d| _	d| _| j	�r | j�sú| jdƒ d| _	| j�rÞ| jdk�r| j�s&|dk�rÞ|dk�r:| jdƒ g }x‚| jD ]x}| j|d k�r²| jdt|d ƒ d tj| j|d ƒ ƒ d|k�r¦| jd|d  d ƒ | jdƒ n
|j|ƒ �qFW | j|k�rØ| jdƒ || _| j�r$|dk�r$x2| jj ƒ D ]$\}	}
| jd|	 d |
 d ƒ �qüW d| _| j|ƒ |  jd7  _dS )z6
        Deal with indentation and whitespace
        Nr   r   z\s+rw   Trp   rq   z
z
[code]r³   z    Fru   rš   rB   z   [r´   z]: rŠ   r‹   z (rº   z  *[)!r]   r@   r.   ÚlstriprZ   rO   rQ   rI   ÚsubrD   rP   rÈ   r5   r>   rA   rN   rM   ÚrangerÍ   rj   rC   rS   rT   rE   r    rB   rÊ   r¬   r­   r_   rs   r^   Úitems)re   rl   Úpuredatarv   Zlstripped_dataZbqrŽ   Znewar°   r©   Z
definitionrh   rh   ri   ry   £  s’    


 





(

 
zHTML2Text.oc             C   s  |sd S | j r$|jƒ }d| _ d| _n:| jr^tjd|d ƒrXt| jƒ rX| jdkrXd| }d| _| jrt| jj	t
|ƒƒ | jd k	rÐ| j}||krº| jj|ƒrº| jrº| jd	| d
 ƒ d| _d S | jdƒ d | _d| _| j rô| j rô| rôt|| jd�}|| _| j|dd� d S )NFTz[^\s.!?]r   rE   rQ   rO   rw   r²   r³   r™   )Zsnob)rÓ   )rE   rQ   rO   )r`   r®   ra   rI   r�   r   rc   rV   rW   Úupdater   rG   rK   r3   ry   rH   rQ   rO   r   r   rb   )re   rl   Zentity_charrŠ   rh   rh   ri   r~     s:    


zHTML2Text.handle_datac             C   sb   |d dkr t |dd … dƒ}nt |ƒ}| j r@|tkr@t| S yt|ƒS  tk
r\   dS X d S )Nr   ÚxÚXrp   é   r   )rÕ   rÖ   )Úintr   r   ÚchrÚ
ValueError)re   r½   r€   rh   rh   ri   r   =  s    zHTML2Text.charrefc             C   sd   | j  r|tjkrtj| S ytjj|d  }W n tk
rL   d| d S X |dkr`tj| S |S )Nú;ú&r   )r   r   rd   r{   r|   r}   rÉ   )re   r€   Zchrh   rh   ri   r‚   K  s    
zHTML2Text.entityrefc             C   s*   d}d|kr&t |d dd… ƒ| j }|S )zq
        Calculate the nesting count of google doc lists

        :type style: dict

        :rtype: int
        r   zmargin-leftNrš   éþÿÿÿ)rØ   r%   )re   rV   rÎ   rh   rh   ri   rÌ   T  s    zHTML2Text.google_nest_countc             C   s  | j s
|S d}d}| jsd| _xä|jdƒD ]Ö}t|ƒdkrèt|| j| jƒsÊd}|jd| j ƒrdd}n|jdƒrrd}t	|| j d|d�}|dj
|ƒ7 }|jdƒrª|d	7 }d
}qæ|r¼|d7 }d
}qæ|d7 }d}ntjj|ƒsæ||d 7 }d
}q*|dk r*|d7 }|d
7 }q*W |S )zi
        Wrap all paragraphs in the provided text.

        :type text: str

        :rtype: str
        r   r   Frq   z  z    z> )Zbreak_long_wordsZsubsequent_indentz  
rp   z

rš   )r!   r7   r#   ÚsplitrÍ   r   r6   rÈ   r/   r   rz   Úendswithr   ZRE_SPACEr�   )re   ÚtextÚresultÚnewlinesZparaÚindentÚwrappedrh   rh   ri   rm   b  sF    

zHTML2Text.optwrap)FF)F)Ú__name__Ú
__module__Ú__qualname__r   Ú
BODY_WIDTHr   rk   ro   r=   rn   r�   r„   rˆ   r‰   r�   r”   r…   rx   r•   rÇ   ry   r~   r   r‚   rÌ   rm   Ú__classcell__rh   rh   )rg   ri   r   !   s.   Z	G  }
o
+	r   r   c             C   s$   |d krt j}t||d�}|j| ƒS )N)r_   rf   )r   rè   r   ro   )r{   r_   rf   Úhrh   rh   ri   Ú	html2textŸ  s    rë   )r   r   r   )r   N)Ú__doc__Zhtml.entitiesr{   Zhtml.parserrI   Zurllib.parseÚparser¬   Útextwrapr   rë   r   Zhtml2text.utilsr   r   r   r   r   r	   r
   r   r   r   r   r   r   Ú__version__ÚparserZ
HTMLParserr   rh   rh   rh   ri   Ú<module>   s"   
<       