<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</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ri }|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|| rd| j }n| j}| j| |rd| _|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|rd | _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|rd1|kr|d1 d k	r| j%o|d1 j&d r| jj| |d1 | _d| _| j'rd2|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(ry"|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rd:|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pd+}| 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rt=|}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|
rd| _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|rd| _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 rtjdd|}|r|d dkrd| _	|dd }| r| rdS | j
r|jd r|jd	 rd| }| 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rd| _	d| _d| _|dkrd| _| 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  qW 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| rt|| 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rt|| j| jsd}|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"   
<       