o f'ha@sdZdZddlZddlZddlZddlZddlmZmZm Z m Z ddl m Z ddl mZddlmZmZGdd d e jjZGd d d e jjZGd d d e jjZdS)a/ Simple HyperText Markup Language document tree Writer. The output conforms to the XHTML version 1.0 Transitional DTD (*almost* strict). The output contains a minimum of formatting information. The cascading style sheet "html4css1.css" is required for proper viewing with a modern graphical browser. reStructuredTextN)frontendnodeswritersio) writer_aux) _html_base)PIL url2pathnamec@s&eZdZdZ dgZdeej e ej eej ej e dgZ dZej eej e eZddded ged d fd d gddejdfdd edgddejedfddgddejdfddgddd fd!e d"gd#eje d$fd%d&gd'd(d)d*fd+d,gd-d)ejd.fd/d0gd-d)ejd.fd1d2gd3d4gd4d5d6d7fd8d9ggd:d;d5d*fdd?gd@dd fdAdBgddejdfdCdDgdEdd fdFdGgdHdejdfdIdJgdKdd fdLdMgdNdOifdPdQgdNdRifdSdTgdUddejdVfdWdXgdejdYfffZdZZd[d\ZdS)]Writer)htmlhtml4 html4css1xhtmlxhtml10z html4css1.css.html5_polyglotz template.txtzHTML-Specific OptionsNz)defaultmetavarzhComma separated list of stylesheet URLs. Overrides previous --stylesheet and --stylesheet-path settings.z --stylesheetzstylesheet_path)r overrides validatorzComma separated list of stylesheet paths. Relative paths are expanded if a matching file is found in the --stylesheet-dirs. With --link-stylesheet, the path is rewritten relative to the output HTML file. Default: "%s",z--stylesheet-pathz stylesheet)rrrrzEmbed the stylesheet(s) in the output HTML file. The stylesheet files must be accessible during processing. This is the default.z--embed-stylesheet store_true)ractionrzNLink to the stylesheet(s) in the output HTML file. Default: embed stylesheets.z--link-stylesheetembed_stylesheet store_false)destrzComma-separated list of directories where stylesheets are found. Used by --stylesheet-path when expanding relative path arguments. Default: "%s"z--stylesheet-dirsz)rrrz|Specify the initial header level. Default is 1 for "

". Does not affect document title & subtitle (see --no-doc-title).z--initial-header-levelz 1 2 3 4 5 61z)choicesrrzSpecify the maximum width (in characters) for one-column field names. Longer field names will span an entire row of the table used to render the field list. Default is 14 characters. Use 0 for "no limit".z--field-name-limit)rrrzSpecify the maximum width (in characters) for options in option lists. Longer options will span an entire row of the table used to render the option list. Default is 14 characters. Use 0 for "no limit".z--option-limitz[Format for footnote references: one of "superscript" or "brackets". Default is "brackets".z--footnote-references superscriptbracketsztrim_footnote_reference_space)r!rrrz{Format for block quote attributions: one of "dash" (em-dash prefix), "parentheses"/"parens", or "none". Default is "dash".z --attributiondash parenthesesparensnoner'zpRemove extra vertical whitespace between items of "simple" bullet lists and enumerated lists. Default: enabled.z--compact-listsz3Disable compact simple bullet and enumerated lists.z--no-compact-lists compact_listszXRemove extra vertical whitespace between items of simple field lists. Default: enabled.z--compact-field-listsz#Disable compact simple field lists.z--no-compact-field-listscompact_field_listszZEmbed images in the output HTML file, if the image files are accessible during processing.z--embed-imagesrzd?Z%d@dAZ&dBdCZ'dDdEZ(dFdGZ)dHdIZ*dJdKZ+dLdMZ,dNdOZ-dPdQZ.dRdSZ/dTdUZ0dVdWZ1dXdYZ2dZd[d\Z3d]d^Z4d_d`Z5dadbZ6dcddZ7dedfZ8dgdhZ9didjZ:dkdlZ;dmdnZdsdtZ?dudvZ@dwdxZAdydzZBd{d|ZCd}d~ZDddZEddZFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRdS)r2aH The html4css1 writer has been optimized to produce visually compact lists (less vertical whitespace). HTML's mixed content models allow list items to contain "
  • body elements

  • " or "
  • just text
  • " or even "
  • text

    and body elements

    combined
  • ", each with different effects. It would be best to stick with strict body elements in list items, but they affect vertical spacing in older browsers (although they really shouldn't). The html5_polyglot writer solves this using CSS2. Here is an outline of the optimization: - Check for and omit

    tags in "simple" lists: list items contain either a single paragraph, a nested simple list, or a paragraph followed by a nested simple list. This means that this list can be compact: - Item 1. - Item 2. But this list cannot be compact: - Item 1. This second paragraph forces space between list items. - Item 2. - In non-list contexts, omit

    tags on a paragraph if that paragraph is the only child of its parent (footnotes & citations are allowed a label first). - Regardless of the above, in definitions, table cells, field bodies, option descriptions, and list items, mark the first child with 'class="first"' and the last child with 'class="last"'. The stylesheet sets the margins (top & bottom respectively) to 0 for these elements. The ``no_compact_lists`` setting (``--no-compact-lists`` command-line option) disables list whitespace optimization. zz zC zO  )z—r.)())r.r.r&cCs ||dd||dddS)Nfirstrlast)set_class_on_childr5noder6r6r7set_first_lastszHTMLTranslator.set_first_lastcCs,|j|ddd|j|j|ddddS)NaddressF)metapreCLASS)visit_docinfo_itembodyappendstarttagrWr6r6r7 visit_addressszHTMLTranslator.visit_addresscCs2|ddd|j||d||dS)Nclassesr admonitiondiv)insertr`rarbrYrWr6r6r7visit_admonitionszHTMLTranslator.visit_admonitioncCs8t|jtjr|jr|jddSdS||ddS)Nz
    author) isinstanceparentrauthorsauthor_in_authorsr`rar_rWr6r6r7 visit_authors zHTMLTranslator.visit_authorcCs$t|jtjr d|_dS|dS)NT)rjrkrrlrmdepart_docinfo_itemrWr6r6r7 depart_authors  zHTMLTranslator.depart_authorcCs||dd|_dS)NrlF)r_rmrWr6r6r7 visit_authorss  zHTMLTranslator.visit_authorscCs |dSr0)rorWr6r6r7depart_authorss zHTMLTranslator.depart_authorscCs&|j||jj|jddS)Nstub)colspecsrarkstubs attributesgetrWr6r6r7 visit_colspecs zHTMLTranslator.visit_colspeccCst|jdddtjr dSd|jjdvs#d|jjvr%d|jjdvr%dStdd|jD}|j | |d |jD]}t |d d |d }|j |j |d d|dq<|j ddS)NFT)descendsiblingszcolwidths-autordzcolwidths-givencss|]}|dVqdS)colwidthNr6).0rXr6r6r7 sz0HTMLTranslator.depart_colspec..colgroupr{gY@g?colz%i%%)widthz )rj next_nodercolspecrksettings table_stylesumrtr`rarbintemptytag)r5rX total_widthr{r6r6r7depart_colspec s    zHTMLTranslator.depart_colspeccCs<d|dvp|jjod|dvo|jp|jdgkp||S)Ncompactrdopencontents)rr+compact_simple topic_classescheck_simple_listrWr6r6r7is_compactable!s   zHTMLTranslator.is_compactablec C6|j|j|ddddd|jd||dS)Ntablezdocutils citationvoidr*r^framerulesK r`rarbfootnote_backrefsrWr6r6r7visit_citation+  zHTMLTranslator.visit_citationcC|jddSNz r`rarWr6r6r7depart_citation4zHTMLTranslator.depart_citationcCs*|jd|j|j|dddddS)Nz- : spanr. classifierr]r`rarbrWr6r6r7visit_classifier9s zHTMLTranslator.visit_classifiercCs0|jd|j||dd||dS)Nz ddr.r`rarbrYrWr6r6r7visit_definition>s zHTMLTranslator.visit_definitioncC|j|j|ddddS)Ndlr>r]rrWr6r6r7visit_definition_listDz$HTMLTranslator.visit_definition_listcCs$|j||dd||dS)Ntdr.rrWr6r6r7visit_descriptionHsz HTMLTranslator.visit_descriptioncCr)NzrrWr6r6r7depart_descriptionLrz!HTMLTranslator.depart_descriptionc CsD|jt|j|j|j|ddddd|jdd|_dS)Nrdocinforr*rzR T)contextralenr`rb in_docinforWr6r6r7 visit_docinfoPs  zHTMLTranslator.visit_docinfocCs6|jdd|_|j}|j|d|_g|_dS)N F)r`rarrpopr)r5rXstartr6r6r7depart_docinfoZs   zHTMLTranslator.depart_docinfoTcCs|rd|||f}|||j||dd|jd|jj|t|rQt |dt j r>|dddt |dt j rS|ddd dSdSdS) Nz trr.z&%s: rrdrSrUrT) attvalastextadd_metar`rarblanguagelabelsrrjrElement)r5rXnamer[meta_tagr6r6r7r_as   z!HTMLTranslator.visit_docinfo_itemcCr)Nz rr4r6r6r7roorz"HTMLTranslator.depart_docinfo_itemcCr)Nr\z doctest-blockr]rrWr6r6r7visit_doctest_blocksrz"HTMLTranslator.visit_doctest_blockcCs6tjj||t|dkr|jd||dS)NrrO)rrr2 visit_entryrr`rarYrWr6r6r7rws  zHTMLTranslator.visit_entrycCsi}d|vr |d|d<d|vr|d|d<|j}|j|j|jfd|_|||_|jr=|s=|ddd|d<|j|j|dfi|dS)z The 'start' attribute does not conform to HTML 4.01's strict.dtd, but cannot be emulated in CSS1 (HTML 5 reincludes it). renumtypeclassNr.z simpleol) rrra compact_prrwstripr`rb)r5rXattsold_compact_simpler6r6r7visit_enumerated_list~s     z$HTMLTranslator.visit_enumerated_listcCs"|j\|_|_|jddS)Nz )rrrrr`rarWr6r6r7depart_enumerated_listsz%HTMLTranslator.depart_enumerated_listcCs|j|j|dddddS)Nrr.fieldr]rrWr6r6r7 visit_fieldszHTMLTranslator.visit_fieldcCrN rrWr6r6r7 depart_fieldrzHTMLTranslator.depart_fieldcCsr|j|j|dddd||dd|j}|js.t|jtjs.|j |t |jdkr7||dd dSdS) Nrr.z field-bodyr]rSrrrTrU) r`rarbrVrkcompact_field_listrjrrindexr)r5rXrr6r6r7visit_field_bodys zHTMLTranslator.visit_field_bodycCr)Nz rrWr6r6r7depart_field_bodyrz HTMLTranslator.depart_field_bodyc Cs|j|j|jfd|_d|dvrd|_n |jjr$d|dvr$d|_|jr[|D]1}|d}t|tjs7Jdd|D}t |dksZt |d krUt|dtj tj fsZd |_nq)|j |j |d d d dd|j ddS)NrrdTrrUcSsg|] }t|tjs|qSr6)rjr Invisibler|nr6r6r7 s  z3HTMLTranslator.visit_field_list..rrFrrr*zdocutils field-list)rrr^zK )rrarrrr,rjr field_bodyr paragraph line_blockr`rb)r5rXrrchildrenr6r6r7visit_field_lists4     zHTMLTranslator.visit_field_listcCs"|jd|j\|_|_dSNr)r`rarrrrrWr6r6r7depart_field_list z HTMLTranslator.depart_field_listc Csi}|jr d|d<nd|d<|jjr3t||jjkr3d|d<|jd|j|jddd d d n|jd|j |j|d dfi|dS) Nz docinfo-namerz field-namecolspanrrr.rr]z th) rrfield_name_limitrrrrarbrkr`r5rXrr6r6r7visit_field_names    "zHTMLTranslator.visit_field_namecCs"|jd|j|jdS)Nz:r`rarrrWr6r6r7depart_field_namerz HTMLTranslator.depart_field_namec Cr)Nrzdocutils footnoterr*rrrrWr6r6r7visit_footnoterzHTMLTranslator.visit_footnotecCsg}|d}|jjrQ|rQt|dkr)|jd|jd|jd|dn7t|dD] \}}|d||fq.|jdd ||jddg7_n|jd|jddg7_t|dkr||sq|dd d |d d d dSdS)Nbackrefsrr.z!rz'%sz(%s) , rdrSrUrT)rfootnote_backlinksrrra enumeraterD)r5rX backlinksribackrefr6r6r7rs,      z HTMLTranslator.footnote_backrefscCrrrrWr6r6r7depart_footnoterzHTMLTranslator.depart_footnotec Csjd|d}|jj}|dkrd}|jdn|dksJd}|jd|j|j|d |d |d dS) N#refidr$[]r#zazfootnote-reference)r^href)rfootnote_referencesrrar`rb)r5rXrformatsuffixr6r6r7visit_footnote_reference s    z'HTMLTranslator.visit_footnote_referencecCs|j|jddS)NrrrWr6r6r7depart_footnote_referencez(HTMLTranslator.depart_footnote_referencecCdSr0r6rWr6r6r7visit_generatedzHTMLTranslator.visit_generatedz image/svg+xmlzapplication/x-shockwave-flash)z.svgz.swfc Csi}|d}tj|d}||jvr!||d<|j||d<n ||d<|d||d<d|vr7|d|d<d|vrA|d|d<d |vrtrd|vrOd|vs|jjrt |}z tj | t }Wn ttfyoYn'w|jj|d d d|vrd |jd |d<d|vrd |jd|d<~dD]*}||vrtd||}|sJdt|dt|d d|df||<qg} dD]$}||vrtd||r||d7<| d|||f||=q| rd| |d<t|jtjst|jtjrt|jjtjsd} nd} d|vr d|d|d<||jvrA|j |j!|ddfi||d|d| dS|j |j"|d| fi|dS) Nurirdatatypesrcaltrheightscale\/z%dpxr)rrz([0-9.]+)(\S*)$z%s%sdrz ^[0-9.]+$pxz%s: %s; styler. alignalign-%srobjectz img)#r@rAsplitextlowerobject_image_typesrwr rfile_insertion_enabledr ImagerencodesysgetfilesystemencodingIOErrorUnicodeEncodeErrorrecord_dependenciesaddreplacesizerematchfloatgrouprarDrjrkr TextElement referencer`rbr) r5rXrrext imagepathratt_namer$rrr6r6r7 visit_image&s           "zHTMLTranslator.visit_imagecCrr0r6rWr6r6r7 depart_imagegrzHTMLTranslator.depart_imagecCs(|j|j|dd|jdddS)Nrz%s[labelr])r`rarbrrrWr6r6r7 visit_labells zHTMLTranslator.visit_labelcCs$|jd|j|jfdS)Nz]%s%srrWr6r6r7 depart_labelps$zHTMLTranslator.depart_labelcCs8|j||ddt|r|ddddSdS)Nlir.rrdrS)r`rarbrrWr6r6r7visit_list_itemtszHTMLTranslator.visit_list_itemcCs|dg}d|vr dd|D|d<|j||dddS|j|j|dddd|}|j|D];}|rY|j |rO|jd | |q7|j| |q7|d vrd|j|q7|jd t |d d q7|jdt j )NrdcodecSsg|]}|dkr|qS)r3r6)r|clsr6r6r7rsz0HTMLTranslator.visit_literal..r.ttzdocutils literalr]z%s)rrrOrrz)rwr`rarbrwords_and_spacesfindallrin_word_wrap_pointsearchrrrSkipNode)r5rXrdtexttokenr6r6r7 visit_literal{s*   zHTMLTranslator.visit_literalcCr)Nr\z literal-blockr]rrWr6r6r7visit_literal_blockrz"HTMLTranslator.visit_literal_blockcCr)Nz rrWr6r6r7depart_literal_blockrz#HTMLTranslator.depart_literal_blockcCs~i}|jjrt||jjkrd|d<|jdn|jd|j|j|dfddi||jd|jd dS) Nrrz  r.rr^z option-groupzr)r option_limitrrrrar`rbrr6r6r7visit_option_groups  z!HTMLTranslator.visit_option_groupcCs,|j|jd|j|jdS)Nz )rrr`rarWr6r6r7depart_option_groups  z"HTMLTranslator.depart_option_groupc Cs,|j|j|ddddd|jddS)Nrzdocutils option-listrr*rzH rrWr6r6r7visit_option_lists  z HTMLTranslator.visit_option_listcCrrrrWr6r6r7depart_option_listrz!HTMLTranslator.depart_option_listcCs|j||dddS)Nrr.rrWr6r6r7visit_option_list_itemrz%HTMLTranslator.visit_option_list_itemcCrrrrWr6r6r7depart_option_list_itemrz&HTMLTranslator.depart_option_list_itemcCst|jtjst|jtjrdS|D]\}}||r0|dkr-|gdgdgddgfvs0dSqt|jdtj}|jj|dD]}t|tj rKqB||urQndSt dd|jD}|j sk|j sk|j rm|d krmd SdS) zU Determine if the

    tags around paragraph ``node`` can be omitted. FrdrSrTrNcSs"g|] }t|tjtjfs|qSr6)rjrrr.rr6r6r7rs  z>HTMLTranslator.should_be_compact_paragraph..rT)rjrkrdocumentcompoundattlistis_not_defaultr.rrrrrr)r5rXkeyvaluerSchild parent_lengthr6r6r7should_be_compact_paragraphs6    z*HTMLTranslator.should_be_compact_paragraphcCs@||r |jddS|j||dd|jddS)Nr.p

    )rOrrar`rbrWr6r6r7visit_paragraphs zHTMLTranslator.visit_paragraphcCs|j|jdSr0rrWr6r6r7depart_paragraphszHTMLTranslator.depart_paragraphcCs,|j|j|ddd||d|_dS)Nrfsidebarr]T)r`rarbrY in_sidebarrWr6r6r7 visit_sidebars   zHTMLTranslator.visit_sidebarcCFt|jtjr|j|j|dddddS|j||dddS)Nrr. subscriptr]subrjrkr literal_blockr`rarbrWr6r6r7visit_subscript  zHTMLTranslator.visit_subscriptcC.t|jtjr|jddS|jddS)Nzrjrkrr[r`rarWr6r6r7depart_subscriptzHTMLTranslator.depart_subscriptc Cst|jtjr|j|j|dddd|jddSt|jtjr>|j|j|dddd|jdt |j|_ dSt|jtj rod |j |j d }|j|j||dd d|jid dd d|jd |dSdS)NrPr.zsidebar-subtitler]rQh2subtitlez

    zh%srzsection-subtitlerz )rjrkrrTr`rarbrrGrin_document_titlesection section_levelinitial_header_level)r5rXtagr6r6r7visit_subtitles$ zHTMLTranslator.visit_subtitlecCs`|j|j|jr.|j|jd|_d|_|j|j|j|j|jdd=dSdS)NrUr) r`rarrrerdbody_pre_docinfoextend html_subtitlerWr6r6r7depart_subtitleszHTMLTranslator.depart_subtitlecCrW)Nrr.r#r]suprZrWr6r6r7visit_superscriptr]z HTMLTranslator.visit_superscriptcCr^)Nr_rr`rWr6r6r7depart_superscript&rbz!HTMLTranslator.depart_superscriptc Cs|j|j|ddd|jdd}t|drH|d}t|dkr+d|d }nd}g}|D]}|d ||f|d7}q1d d |}|d rTd|d }nd}|jd|d|d||d||fdS)Nrfzsystem-messager]z

    r.rrz%; backlinkrz%sz; backlinks: %srlinez , line %sz=System Message: %s/%s (%s%s)%s

    rlevelsource)r`rarbrrDhasattrr)r5rX backref_textrrrrrrr6r6r7visit_system_message-s2       z#HTMLTranslator.visit_system_messagecCs|j|jd|_ddi}d|jjg}d|vr!|d|dd|vr-d|d|d <|j|j|d fd d |i|dS) NTborderrr>rrrz width: %srrr^r)rrarrrr`rbrD)r5rXrrdr6r6r7 visit_tableHs zHTMLTranslator.visit_tablecCs|j|_|jddS)Nz )rrrr`rarWr6r6r7 depart_tableTs zHTMLTranslator.depart_tablecCr)NtbodytopvalignrrWr6r6r7 visit_tbodyYrzHTMLTranslator.visit_tbodycCr)Nz rrWr6r6r7 depart_tbody\rzHTMLTranslator.depart_tbodycCr)Ntheadbottomr}rrWr6r6r7 visit_thead`rzHTMLTranslator.visit_theadcCr)Nz rrWr6r6r7 depart_theadcrzHTMLTranslator.depart_theadN)T)Sr9r:r;__doc__doctype content_typecontent_type_mathmldictrr2special_charactersattribution_formatsrYrcrhrnrprqrrrxrrrrrrrrrrrr_rorrrrrrrrrrrrrrrrrrrr,r-r/r0r2r=r>r?rArBrCrDrErFrOrRrSrVr\rarjrnrprqrwryrzrrrrr6r6r6r7r2s.        A    r2c@s0eZdZdZddZddZddZdd Zd S) SimpleListCheckerz Raise `nodes.NodeFound` if non-simple list item is encountered. Here "simple" means a list item containing nothing other than a single paragraph, a simple list, or a paragraph followed by a simple list. cCsxg}|jD] }t|tjs||q|r1t|dtjr1t|dtjs-t|dtjr1|t |dkr9dStj )NrrUr) rrjrrrar bullet_listenumerated_listrr NodeFound)r5rXrrMr6r6r7r2ps    z!SimpleListChecker.visit_list_itemcCtjr0)rr:rWr6r6r7rRz!SimpleListChecker.visit_paragraphcCrr0rrrWr6r6r7rrz'SimpleListChecker.visit_definition_listcCrr0rrWr6r6r7rrzSimpleListChecker.visit_docinfoN)r9r:r;rr2rRrrr6r6r6r7rgs  r)r __docformat__os.pathr@r#rr>rrrrdocutils.transformsrdocutils.writersrdocutils.writers._html_baser r r r2rr6r6r6r7s&   L