3 Ÿ”Œ]€ã@s dZddlZddlZddlZddljZddlm Z ddl m Z ddl m Z mZmZmZmZmZmZmZmZmZmZmZmZdZGd d „d ejjƒZdd d „Z dS)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éãé écsÒeZdZddejf‡fdd„ Z‡fdd„Zdd„Zd d „Z‡fd d „Z d d„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd.d"d#„Zd/d$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Z‡ZS)0Ú HTML2TextNÚcs tƒjdd�d|_d|_d|_tj|_tj|_ tj |_ ||_ tj |_tj|_tj|_tj|_tj|_tj|_tj|_tj|_tj|_tj|_ tj!|_"tj#|_$d|_%d|_&d|_'d|_(tj)|_*tj+|_,d|_-tj.|_/tj0|_1tj2|_3tj4|_5tj6|_7d|_8tj9|_:tj;|_<|dk�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 tjdd <dS) zË Input parameters: out: possible custom replacement for self.outtextf (which appends lines of text). baseurl: base URL of the document we process F)Zconvert_charrefsrÚ*Ú_z**NTz^[a-zA-Z+]+://rz _place_holder;Únbsp)eÚsuperÚ__init__Ú split_next_tdÚtd_countÚ table_startrZ UNICODE_SNOBÚ unicode_snobZ ESCAPE_SNOBÚ escape_snobZLINKS_EACH_PARAGRAPHÚlinks_each_paragraphÚ body_widthZSKIP_INTERNAL_LINKSÚskip_internal_linksZ INLINE_LINKSÚ inline_linksZ PROTECT_LINKSÚ protect_linksZGOOGLE_LIST_INDENTÚgoogle_list_indentZIGNORE_ANCHORSÚ ignore_linksZ IGNORE_IMAGESÚ ignore_imagesZIMAGES_AS_HTMLÚimages_as_htmlZ IMAGES_TO_ALTÚ images_to_altZIMAGES_WITH_SIZEÚimages_with_sizeZIGNORE_EMPHASISÚignore_emphasisZ BYPASS_TABLESÚ bypass_tablesZ IGNORE_TABLESÚ ignore_tablesÚ google_docÚ ul_item_markÚ emphasis_markÚ strong_markZSINGLE_LINE_BREAKÚsingle_line_breakZUSE_AUTOMATIC_LINKSÚuse_automatic_linksÚhide_strikethroughZ MARK_CODEÚ mark_codeZWRAP_LIST_ITEMSÚwrap_list_itemsZ WRAP_LINKSÚ wrap_linksZ PAD_TABLESÚ pad_tablesZDEFAULT_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”   zHTML2Text.__init__cs|jddƒ}tƒj|ƒdS)Nzz )ÚreplacerÚfeed)reÚdata)rgrhrirk|s zHTML2Text.feedcCs8|j|ƒ|jdƒ|j|jƒƒ}|jr0t|ƒS|SdS)Nr)rkÚoptwrapÚcloser8r)rerlZmarkdownrhrhriÚhandle€s   zHTML2Text.handlecCs"|jj|ƒ|r|ddk|_dS)NéÚ éÿÿÿÿ)r?ÚappendrT)reÚsrhrhrir=‰s zHTML2Text.outtextfcsZtƒjƒ|jƒ|jddd�dj|jƒ}|jr@tjj d}nd}|j d|ƒ}g|_|S)NrÚend)Úforceznbsp;ú z _place_holder;) rrnÚpbrÚoÚjoinr?rÚhtmlÚentitiesÚhtml5rj)reZouttextr)rgrhrirnŽs   zHTML2Text.closecCs|j|j|ƒdƒdS)NT)Ú handle_dataÚcharref)reÚcrhrhriÚhandle_charref¢szHTML2Text.handle_charrefcCs|j|ƒ}|r|j|dƒdS)NT)Ú entityrefr~)rer€ÚrefrhrhriÚhandle_entityref¥s zHTML2Text.handle_entityrefcCs|j||dd�dS)NT)rC)Ú handle_tag)reÚtagÚattrsrhrhriÚhandle_starttag±szHTML2Text.handle_starttagcCs|j|ddd�dS)NF)rC)r…)rer†rhrhriÚ handle_endtag´szHTML2Text.handle_endtagcCs†d|kr dSd}xpt|jƒD]b\}}d|krv|d|dkrvd|ksLd|krrd|krvd|krv|d|dkrvd}nd}|r|SqWdS)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)rer‡ÚmatchÚirErhrhriÚ previousIndex·szHTML2Text.previousIndexc Csæt|ƒ}t|ƒ}d|ko|j}d}x$tjD]}||ko<||k}|r*Pq*Wd|koVd|k} t|ƒopt|ƒ op|j } |�r|s„| s„| r’|jd7_|r¤|jd7_| rÂ|j|j ƒ|j d7_ |rà|j|j ƒ|j d7_ | �râ|jdƒ|j d7_ d|_ nÜ|�s| �s| �r,|jd8_d|_ | �rZ|j �rJ|j d8_ n |jdƒd|_ |�r„|j �rx|j d8_ n |j|j ƒ| �r®|j �r¢|j d8_ n |j|j ƒ|�sº| �rÎ|j �rÎ|jdƒ|�râ|jd8_dS) z/ Handles various text emphases z line-throughFÚitalicrpú`TrwN)r r4rZBOLD_TEXT_STYLE_VALUESrrOrYr@ryr0rZr1rQrD) rerCÚ tag_styleÚ parent_styleZ tag_emphasisZparent_emphasisZ strikethroughZboldZ bold_markerr�ZfixedrhrhriÚhandle_emphasisÓs^          zHTML2Text.handle_emphasiscCsô ||_|dkri}nt|ƒ}|jdk r>|j||||ƒdkr>dS|rx|jdk rx|d^krx|dksb|jrx|jdƒd|_d |_|jrði}|r¼|jrš|jd_d }t ||j |ƒ}|jj |||fƒn4|jrÌ|jj ƒndiif\}}}|jrð|jd`d }t |ƒ�r0|jƒ|�r&d|_|jt |ƒd d ƒn d |_dS|dak�r‚|j�rf|�r\t|ƒ�r\|jƒn|jƒn|j�rz|dk�rzn|jƒ|dk�r´|�r´|jdk�rª|jdƒn |jdƒ|dk�rÞ|�rÞ|jƒ|jdƒ|jƒ|dbk�r |�rþ|jd 7_n|jd 8_|dk�r:|�r,|jd 7_n|jd 8_|dck�rJd|_|dk�rœ|�r†|jƒ|jddd�d|_|jd 7_n|jd 8_|jƒdd„}|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|d8|d1<|j1d9ƒ�pN|j2}|j3�st|j4�rðd:|k�std;|k�rð|jd<|d8d=ƒd:|k�rª|jd>|d:d=ƒd;|k�rÊ|jd?|d;d=ƒ|�râ|jd@|d=ƒ|jdAƒdS|jdk �r\|j}|j0�rFt)|ƒ|k�rF|j5j6|ƒ�rF|jd2t)|ƒd3ƒd |_dS|jdƒd|_d |_|j0�rt|jt)|ƒƒn¸|jdBt)|ƒd7ƒ|j(�rÄ|j1d1ƒ�p d+}|jdCt)t7j8|j9|ƒƒdDƒnh|j+|ƒ}|dk �rä|j,|}n.|j-d 7_-|j-|d4<|j.|d5<|j,j |ƒ|jdt/|d4ƒd7ƒ|dk�rD|�rD|jƒ|dk�r^| �r^|j:ƒ|dEk�rx|�rx|jdFƒ|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 |jdJƒd|_ z Zhrz* * *ÚheadÚscriptÚbodyrNz> )rvcSs|jotjd|jdƒS)Nz[^\s]rprr)rbrIr�)rerhrhriÚno_preceding_space|sz0HTML2Text.handle_tag..no_preceding_spaceÚemrŽÚuÚstrongÚbÚdelÚstrikertz ~~z~~ÚkbdrQÚttr‘Úabbrrr‹ÚqcSs@tj|j|ƒ}|jƒr dj|ƒnd}|jdjt|ƒ|d�ƒdS)Nz "{}"rz]({url}{title}))Úurlr‹)ÚurlparseÚurljoinr_ÚstripÚformatryr)reÚlinkr‹r«rhrhriÚlink_url¹sz&HTML2Text.handle_tag..link_urlrErŠú<ú>ÚcountrBz][ú]ÚsrcÚaltÚwidthZheightz )rer†r‡rCr“r’Zdummyr rYr£r¦r±rEr‹rŽr·rŠZ list_styleZnumbering_startr¿Ú nest_countrhrhrir…s$                                                                             zHTML2Text.handle_tagcCs|jdkrd|_dS)zPretty print has a line breakrrpN)rA)rerhrhrirx•s z HTML2Text.pbrcCs|jr dnd|_dS)z Set pretty print to 1 or 2 linesrpršN)r2rA)rerhrhrir•šsz HTML2Text.pcCs|jƒd|_dS)z Soft breaksz N)rxrS)rerhrhrirÇžszHTML2Text.soft_brFc CsF|jdk r|j|7_|j�sB|jrT|jƒ}|jrF|jp>|j rF|}|dkrTd|_|r�|j r�tjdd|ƒ}|r�|ddkr�d|_ |dd…}| r | r dS|j rÜ|j dƒ rÆ|j d ƒ rÆd|}|j rÜ|j d ƒd|_d |j}|oø|oø|dd k �r|j�r|d7}|j�rX|j�s&|d 7}x tt|jƒƒD]}|d 7}�q6W|jdd|ƒ}|j �rxd |_ |j�rx|jdƒ}|j�r’d |_ d|_d |_|dk�r²d|_|j dƒd |_ |j�rà|j |jd||jƒd |_ d|_|j �r|j�sú|j dƒd |_ |j�rÞ|jdk�r|j�s&|dk�rÞ|dk�r:|j dƒg}x‚|jD]x}|j|dk�r²|j dt|dƒdtj|j|dƒƒd|k�r¦|j d|ddƒ|j dƒn |j|ƒ�qFW|j|k�rØ|j dƒ||_|j�r$|dk�r$x2|jj ƒD]$\} } |j d| d| dƒ�qüWd|_|j |ƒ|jd7_dS)z6 Deal with indentation and whitespace Nrrz\s+rwTrprqz z [code]r³z FruršrBz [r´z]: rŠr‹z (rºz *[)!r]r@r.ÚlstriprZrOrQrIÚsubrDrPrÈr5r>rArNrMÚrangerÍrjrCrSrTrEr rBrÊr¬r­r_rsr^Úitems) rerlÚpuredatarvZlstripped_dataZbqrŽZnewar°r©Z definitionrhrhriry£s’              (      z HTML2Text.ocCs |sdS|jr$|jƒ}d|_d|_n:|jr^tjd|dƒrXt|jƒ rX|jdkrXd|}d|_|jrt|jj t |ƒƒ|j dk rÐ|j }||krº|j j|ƒrº|j rº|jd |d ƒd|_dS|jd ƒd|_ d|_|j rô|j rô| rôt||jd �}||_|j|dd �dS)NFTz[^\s.!?]rrErQrOrwr²r³r™)Zsnob)rÓ)rErQrO)r`r®rarIr�r rcrVrWÚupdaterrGrKr3ryrHrQrOrrrb)rerlZ entity_charrŠrhrhrir~s:     zHTML2Text.handle_datac Csb|ddkr t|dd…dƒ}nt|ƒ}|j r@|tkr@t|Syt|ƒStk r\dSXdS)NrÚxÚXrpér)rÕrÖ)ÚintrrÚchrÚ ValueError)rer½r€rhrhrir=s zHTML2Text.charrefc Csd|j r|tjkrtj|Sytjj|d}Wntk rLd|dSX|dkr`tj|S|S)Nú;ú&r)rrrdr{r|r}rÉ)rer€Zchrhrhrir‚Ks zHTML2Text.entityrefcCs*d}d|kr&t|ddd…ƒ|j}|S)zq Calculate the nesting count of google doc lists :type style: dict :rtype: int rz margin-leftNršéþÿÿÿ)rØr%)rerVrÎrhrhrirÌTszHTML2Text.google_nest_countcCs|js |Sd}d}|jsd|_xä|jdƒD]Ö}t|ƒdkrèt||j|jƒsÊd}|jd|jƒrdd}n|jdƒrrd}t ||jd|d�}|dj |ƒ7}|j dƒrª|d 7}d }qæ|r¼|d7}d }qæ|d 7}d }nt j j|ƒsæ||d7}d }q*|d kr*|d7}|d 7}q*W|S) zi Wrap all paragraphs in the provided text. :type text: str :rtype: str rrFrqz z z> )Zbreak_long_wordsZsubsequent_indentz rpz rš)r!r7r#ÚsplitrÍrr6rÈr/rrzÚendswithrZRE_SPACEr�)reÚtextÚresultÚnewlinesZparaÚindentÚwrappedrhrhrirmbsF      zHTML2Text.optwrap)FF)F)Ú__name__Ú __module__Ú __qualname__rÚ BODY_WIDTHrrkror=rnr�r„rˆr‰r�r”r…rxr•rÇryr~rr‚rÌrmÚ __classcell__rhrh)rgrir!s.Z    G} o + rrcCs$|dkrtj}t||d�}|j|ƒS)N)r_rf)rrèrro)r{r_rfÚhrhrhriÚ html2textŸs rë)rrr)rN)Ú__doc__Z html.entitiesr{Z html.parserrIZ urllib.parseÚparser¬ÚtextwraprrërZhtml2text.utilsrrrrrr r r r r rrrÚ __version__ÚparserZ HTMLParserrrhrhrhriÚs"   <