You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
(106) |
May
(215) |
Jun
(104) |
Jul
(290) |
Aug
(351) |
Sep
(245) |
Oct
(289) |
Nov
(184) |
Dec
(113) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(179) |
Feb
(88) |
Mar
(77) |
Apr
(70) |
May
(107) |
Jun
(288) |
Jul
(115) |
Aug
(67) |
Sep
(91) |
Oct
(34) |
Nov
(31) |
Dec
(61) |
2004 |
Jan
(54) |
Feb
(17) |
Mar
(102) |
Apr
(152) |
May
(178) |
Jun
(377) |
Jul
(136) |
Aug
(37) |
Sep
(196) |
Oct
(142) |
Nov
(119) |
Dec
(58) |
2005 |
Jan
(51) |
Feb
(76) |
Mar
(220) |
Apr
(132) |
May
(134) |
Jun
(230) |
Jul
(142) |
Aug
(58) |
Sep
(71) |
Oct
(76) |
Nov
(129) |
Dec
(117) |
2006 |
Jan
(94) |
Feb
(30) |
Mar
(97) |
Apr
(63) |
May
(63) |
Jun
(62) |
Jul
(23) |
Aug
(40) |
Sep
(47) |
Oct
(40) |
Nov
(23) |
Dec
(21) |
2007 |
Jan
(57) |
Feb
(65) |
Mar
(77) |
Apr
(23) |
May
(118) |
Jun
(127) |
Jul
(87) |
Aug
(33) |
Sep
(26) |
Oct
(8) |
Nov
(4) |
Dec
(25) |
2008 |
Jan
(16) |
Feb
(18) |
Mar
(16) |
Apr
(4) |
May
(22) |
Jun
(20) |
Jul
(38) |
Aug
(14) |
Sep
(18) |
Oct
(68) |
Nov
(16) |
Dec
(95) |
2009 |
Jan
(28) |
Feb
(16) |
Mar
(8) |
Apr
(44) |
May
(35) |
Jun
(41) |
Jul
(63) |
Aug
(40) |
Sep
(38) |
Oct
(41) |
Nov
(17) |
Dec
(9) |
2010 |
Jan
(9) |
Feb
(3) |
Mar
(71) |
Apr
(20) |
May
(15) |
Jun
(16) |
Jul
(33) |
Aug
(13) |
Sep
(39) |
Oct
(30) |
Nov
(25) |
Dec
(20) |
2011 |
Jan
(213) |
Feb
(252) |
Mar
(24) |
Apr
(24) |
May
(20) |
Jun
(21) |
Jul
(37) |
Aug
(18) |
Sep
(28) |
Oct
(65) |
Nov
(22) |
Dec
(48) |
2012 |
Jan
(35) |
Feb
(39) |
Mar
(17) |
Apr
(9) |
May
(37) |
Jun
(31) |
Jul
(23) |
Aug
(14) |
Sep
(16) |
Oct
(15) |
Nov
(5) |
Dec
(43) |
2013 |
Jan
(15) |
Feb
(19) |
Mar
(26) |
Apr
(13) |
May
(9) |
Jun
(11) |
Jul
(32) |
Aug
(9) |
Sep
(6) |
Oct
|
Nov
(13) |
Dec
(5) |
2014 |
Jan
(2) |
Feb
(3) |
Mar
(1) |
Apr
|
May
(2) |
Jun
(4) |
Jul
(18) |
Aug
|
Sep
|
Oct
(3) |
Nov
(4) |
Dec
(2) |
2015 |
Jan
(3) |
Feb
(25) |
Mar
(49) |
Apr
(28) |
May
(13) |
Jun
(2) |
Jul
(2) |
Aug
(14) |
Sep
(9) |
Oct
(6) |
Nov
|
Dec
(2) |
2016 |
Jan
(2) |
Feb
(1) |
Mar
|
Apr
|
May
(12) |
Jun
|
Jul
(17) |
Aug
(7) |
Sep
(3) |
Oct
(2) |
Nov
(5) |
Dec
(28) |
2017 |
Jan
(11) |
Feb
(6) |
Mar
(10) |
Apr
(10) |
May
(34) |
Jun
(32) |
Jul
(15) |
Aug
(28) |
Sep
(8) |
Oct
(10) |
Nov
(14) |
Dec
(2) |
2018 |
Jan
(8) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(5) |
Jul
(7) |
Aug
|
Sep
(1) |
Oct
|
Nov
(15) |
Dec
|
2019 |
Jan
|
Feb
(7) |
Mar
(2) |
Apr
(2) |
May
(2) |
Jun
(2) |
Jul
(48) |
Aug
(73) |
Sep
(22) |
Oct
(8) |
Nov
(16) |
Dec
(26) |
2020 |
Jan
(30) |
Feb
(13) |
Mar
(15) |
Apr
(6) |
May
(1) |
Jun
(3) |
Jul
(12) |
Aug
(18) |
Sep
(18) |
Oct
(5) |
Nov
(9) |
Dec
(16) |
2021 |
Jan
(13) |
Feb
(17) |
Mar
(19) |
Apr
(70) |
May
(43) |
Jun
(27) |
Jul
(18) |
Aug
(15) |
Sep
(16) |
Oct
(37) |
Nov
(38) |
Dec
(11) |
2022 |
Jan
(73) |
Feb
(18) |
Mar
(36) |
Apr
(6) |
May
(8) |
Jun
(33) |
Jul
(22) |
Aug
|
Sep
(6) |
Oct
(71) |
Nov
(91) |
Dec
(26) |
2023 |
Jan
(12) |
Feb
(5) |
Mar
(5) |
Apr
(34) |
May
(29) |
Jun
(27) |
Jul
(3) |
Aug
(17) |
Sep
(11) |
Oct
(4) |
Nov
(34) |
Dec
(7) |
2024 |
Jan
(16) |
Feb
(27) |
Mar
(60) |
Apr
(57) |
May
(55) |
Jun
(50) |
Jul
(36) |
Aug
(108) |
Sep
(23) |
Oct
|
Nov
|
Dec
|
From: <mi...@us...> - 2024-09-23 22:37:03
|
Revision: 9939 http://sourceforge.net/p/docutils/code/9939 Author: milde Date: 2024-09-23 22:37:00 +0000 (Mon, 23 Sep 2024) Log Message: ----------- Update/fix "standard" functional test sample. Fix a factual error (footnotes must be indented at least 1 space, not 3). Reword HTML-centric descriptions -- we use the sample for several writer tests. Revert change of expected pseudo-xml sample extension from "txt" to "rst" (side-effect of the switch to "rst" extension for rst sources). Modified Paths: -------------- trunk/docutils/test/functional/expected/footnotes_html5.html trunk/docutils/test/functional/expected/latex_memoir.tex trunk/docutils/test/functional/expected/odt_footnotes.odt trunk/docutils/test/functional/expected/standalone_rst_docutils_xml.xml trunk/docutils/test/functional/expected/standalone_rst_html4css1.html trunk/docutils/test/functional/expected/standalone_rst_html5.html trunk/docutils/test/functional/expected/standalone_rst_latex.tex trunk/docutils/test/functional/expected/standalone_rst_xetex.tex trunk/docutils/test/functional/input/data/standard.rst trunk/docutils/test/functional/input/odt_footnotes.rst trunk/docutils/test/functional/tests/standalone_rst_pseudoxml.py Added Paths: ----------- trunk/docutils/test/functional/expected/standalone_rst_pseudoxml.txt Removed Paths: ------------- trunk/docutils/test/functional/expected/standalone_rst_pseudoxml.rst Modified: trunk/docutils/test/functional/expected/footnotes_html5.html =================================================================== --- trunk/docutils/test/functional/expected/footnotes_html5.html 2024-09-23 22:36:47 UTC (rev 9938) +++ trunk/docutils/test/functional/expected/footnotes_html5.html 2024-09-23 22:37:00 UTC (rev 9939) @@ -19,7 +19,7 @@ <span class="label"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></span> <span class="backrefs">(<a role="doc-backlink" href="#footnote-reference-1">1</a>,<a role="doc-backlink" href="#footnote-reference-5">2</a>)</span> <p>A footnote contains body elements, consistently indented by at -least 3 spaces.</p> +least 1 space.</p> <p>This is the footnote's second paragraph.</p> </aside> <aside class="footnote superscript" id="label" role="doc-footnote"> Modified: trunk/docutils/test/functional/expected/latex_memoir.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_memoir.tex 2024-09-23 22:36:47 UTC (rev 9938) +++ trunk/docutils/test/functional/expected/latex_memoir.tex 2024-09-23 22:37:00 UTC (rev 9939) @@ -708,7 +708,7 @@ % \DUfootnotetext{footnote-1}{footnote-reference-1}{1}{% A footnote contains body elements, consistently indented by at -least 3 spaces. +least 1 space. This is the footnote's second paragraph. } @@ -1481,7 +1481,7 @@ A Unicode example: -(Substitution definitions are not visible in the HTML source.) +(Substitution definitions are only visible in the rST source.) \section{2.16 Comments% @@ -1498,7 +1498,7 @@ % % Comments may contain non-ASCII characters: ä ö ü æ ø å -(View the HTML source to see the comment.) +(View the HTML/LaTeX/... source to see the comment.) \section{2.17 Raw text% Modified: trunk/docutils/test/functional/expected/odt_footnotes.odt =================================================================== (Binary files differ) Modified: trunk/docutils/test/functional/expected/standalone_rst_docutils_xml.xml =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_docutils_xml.xml 2024-09-23 22:36:47 UTC (rev 9938) +++ trunk/docutils/test/functional/expected/standalone_rst_docutils_xml.xml 2024-09-23 22:37:00 UTC (rev 9939) @@ -693,7 +693,7 @@ <footnote backrefs="footnote-reference-1 footnote-reference-5 footnote-reference-9" ids="footnote-1" names="1"> <label>1</label> <paragraph>A footnote contains body elements, consistently indented by at - least 3 spaces.</paragraph> + least 1 space.</paragraph> <paragraph>This is the footnote's second paragraph.</paragraph> </footnote> <footnote auto="1" backrefs="footnote-reference-3 footnote-reference-6" ids="label" names="label"> @@ -1387,7 +1387,7 @@ <substitution_definition names="EXAMPLE"><image alt="EXAMPLE" uri="../../../docs/user/rst/images/biohazard.png"></image></substitution_definition> <paragraph>A Unicode example:</paragraph> <substitution_definition ltrim="1" names="heart" rtrim="1">♥</substitution_definition> - <paragraph>(Substitution definitions are not visible in the HTML source.)</paragraph> + <paragraph>(Substitution definitions are only visible in the rST source.)</paragraph> </section> <section ids="comments" names="comments"> <title auto="1" refid="toc-entry-35"><generated classes="sectnum">2.16 </generated>Comments</title> @@ -1399,7 +1399,7 @@ Double-dashes -- "--" -- must be escaped somehow in HTML output. Comments may contain non-ASCII characters: ä ö ü æ ø å</comment> - <paragraph>(View the HTML source to see the comment.)</paragraph> + <paragraph>(View the HTML/LaTeX/... source to see the comment.)</paragraph> </section> <section ids="raw-text" names="raw\ text"> <title auto="1" refid="toc-entry-36"><generated classes="sectnum">2.17 </generated>Raw text</title> Modified: trunk/docutils/test/functional/expected/standalone_rst_html4css1.html =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_html4css1.html 2024-09-23 22:36:47 UTC (rev 9938) +++ trunk/docutils/test/functional/expected/standalone_rst_html4css1.html 2024-09-23 22:37:00 UTC (rev 9939) @@ -476,7 +476,7 @@ <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label">[1]</td><td><em>(<a class="fn-backref" href="#footnote-reference-1">1</a>, <a class="fn-backref" href="#footnote-reference-5">2</a>, <a class="fn-backref" href="#footnote-reference-9">3</a>)</em> <p>A footnote contains body elements, consistently indented by at -least 3 spaces.</p> +least 1 space.</p> <p class="last">This is the footnote's second paragraph.</p> </td></tr> </tbody> @@ -1053,7 +1053,7 @@ <h2><a class="toc-backref" href="#toc-entry-34">2.15 Substitution Definitions</a></h2> <p>An inline image (<img alt="EXAMPLE" src="../../../docs/user/rst/images/biohazard.png" />) example:</p> <p>A Unicode example:</p> -<p>(Substitution definitions are not visible in the HTML source.)</p> +<p>(Substitution definitions are only visible in the rST source.)</p> </div> <div class="section" id="comments"> <h2><a class="toc-backref" href="#toc-entry-35">2.16 Comments</a></h2> @@ -1065,7 +1065,7 @@ Double-dashes - - "- -" - - must be escaped somehow in HTML output. Comments may contain non-ASCII characters: ä ö ü æ ø å --> -<p>(View the HTML source to see the comment.)</p> +<p>(View the HTML/LaTeX/... source to see the comment.)</p> </div> <div class="section" id="raw-text"> <h2><a class="toc-backref" href="#toc-entry-36">2.17 Raw text</a></h2> Modified: trunk/docutils/test/functional/expected/standalone_rst_html5.html =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_html5.html 2024-09-23 22:36:47 UTC (rev 9938) +++ trunk/docutils/test/functional/expected/standalone_rst_html5.html 2024-09-23 22:37:00 UTC (rev 9939) @@ -483,7 +483,7 @@ <span class="label"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></span> <span class="backrefs">(<a role="doc-backlink" href="#footnote-reference-1">1</a>,<a role="doc-backlink" href="#footnote-reference-5">2</a>,<a role="doc-backlink" href="#footnote-reference-9">3</a>)</span> <p>A footnote contains body elements, consistently indented by at -least 3 spaces.</p> +least 1 space.</p> <p>This is the footnote's second paragraph.</p> </aside> <aside class="footnote brackets" id="label" role="doc-footnote"> @@ -1065,7 +1065,7 @@ <h3><a class="toc-backref" href="#toc-entry-34" role="doc-backlink"><span class="sectnum">2.15 </span>Substitution Definitions</a></h3> <p>An inline image (<img alt="EXAMPLE" src="../../../docs/user/rst/images/biohazard.png" />) example:</p> <p>A Unicode example:</p> -<p>(Substitution definitions are not visible in the HTML source.)</p> +<p>(Substitution definitions are only visible in the rST source.)</p> </section> <section id="comments"> <h3><a class="toc-backref" href="#toc-entry-35" role="doc-backlink"><span class="sectnum">2.16 </span>Comments</a></h3> @@ -1077,7 +1077,7 @@ Double-dashes - - "- -" - - must be escaped somehow in HTML output. Comments may contain non-ASCII characters: ä ö ü æ ø å --> -<p>(View the HTML source to see the comment.)</p> +<p>(View the HTML/LaTeX/... source to see the comment.)</p> </section> <section id="raw-text"> <h3><a class="toc-backref" href="#toc-entry-36" role="doc-backlink"><span class="sectnum">2.17 </span>Raw text</a></h3> Modified: trunk/docutils/test/functional/expected/standalone_rst_latex.tex =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2024-09-23 22:36:47 UTC (rev 9938) +++ trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2024-09-23 22:37:00 UTC (rev 9939) @@ -710,7 +710,7 @@ % \DUfootnotetext{footnote-1}{footnote-reference-1}{1}{% A footnote contains body elements, consistently indented by at -least 3 spaces. +least 1 space. This is the footnote’s second paragraph. } @@ -1504,7 +1504,7 @@ A Unicode example: -(Substitution definitions are not visible in the HTML source.) +(Substitution definitions are only visible in the rST source.) \subsection{2.16 Comments% @@ -1521,7 +1521,7 @@ % % Comments may contain non-ASCII characters: ä ö ü æ ø å -(View the HTML source to see the comment.) +(View the HTML/LaTeX/… source to see the comment.) \subsection{2.17 Raw text% Deleted: trunk/docutils/test/functional/expected/standalone_rst_pseudoxml.rst =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_pseudoxml.rst 2024-09-23 22:36:47 UTC (rev 9938) +++ trunk/docutils/test/functional/expected/standalone_rst_pseudoxml.rst 2024-09-23 22:37:00 UTC (rev 9939) @@ -1,2439 +0,0 @@ -<document ids="restructuredtext-test-document doctitle" names="restructuredtext\ test\ document doctitle" source="functional/input/standalone_rst_pseudoxml.rst" title="reStructuredText Test Document"> - <title> - reStructuredText Test Document - <subtitle ids="examples-of-syntax-constructs subtitle" names="examples\ of\ syntax\ constructs subtitle"> - Examples of Syntax Constructs - <meta content="reStructuredText, test, parser" name="keywords"> - <meta content="A test document, containing at least one example of each reStructuredText construct." lang="en" name="description"> - <decoration> - <header> - <paragraph> - Document header - <footer> - <paragraph> - Document footer - <docinfo> - <author> - David Goodger - <address xml:space="preserve"> - 123 Example Street - Example, EX Canada - A1B 2C3 - <contact> - <reference refuri="mailto:go...@py..."> - go...@py... - <authors> - <author> - Me - <author> - Myself - <author> - I - <organization> - humankind - <date> - Now, or yesterday. Or maybe even - <emphasis> - before - yesterday. - <status> - This is a "work in progress" - <revision> - is managed by a version control system. - <version> - 1 - <copyright> - This document has been placed in the public domain. You - may do with it as you wish. You may copy, modify, - redistribute, reattribute, sell, buy, rent, lease, - destroy, or improve it, quote it at length, excerpt, - incorporate, collate, fold, staple, or mutilate it, or do - anything else to it that your or anyone else's heart - desires. - <field classes="field-name"> - <field_name> - field name - <field_body> - <paragraph> - This is a "generic bibliographic field". - <field classes="field-name-2"> - <field_name> - field name "2" - <field_body> - <paragraph> - Generic bibliographic fields may contain multiple body elements. - <paragraph> - Like this. - <topic classes="dedication"> - <title> - Dedication - <paragraph> - For Docutils users & co-developers. - <topic classes="abstract"> - <title> - Abstract - <paragraph> - This is a test document, containing at least one example of each - reStructuredText construct. - <comment xml:space="preserve"> - This is a comment. Note how any initial comments are moved by - transforms to after the document title, subtitle, and docinfo. - <target refid="doctitle"> - <comment xml:space="preserve"> - Above is the document title, and below is the subtitle. - They are transformed from section titles after parsing. - <target refid="subtitle"> - <comment xml:space="preserve"> - bibliographic fields (which also require a transform): - <raw format="latex" xml:space="preserve"> - \pagebreak[4] % start ToC on new page - <topic classes="contents" ids="table-of-contents" names="table\ of\ contents"> - <title> - Table of Contents - <bullet_list classes="auto-toc"> - <list_item> - <paragraph> - <reference ids="toc-entry-1" refid="structural-elements"> - <generated classes="sectnum"> - 1 - Structural Elements - <bullet_list classes="auto-toc"> - <list_item> - <paragraph> - <reference ids="toc-entry-2" refid="section-title"> - <generated classes="sectnum"> - 1.1 - Section Title - <list_item> - <paragraph> - <reference ids="toc-entry-3" refid="empty-section"> - <generated classes="sectnum"> - 1.2 - Empty Section - <list_item> - <paragraph> - <reference ids="toc-entry-4" refid="transitions"> - <generated classes="sectnum"> - 1.3 - Transitions - <list_item> - <paragraph> - <reference ids="toc-entry-5" refid="body-elements"> - <generated classes="sectnum"> - 2 - Body Elements - <bullet_list classes="auto-toc"> - <list_item> - <paragraph> - <reference ids="toc-entry-6" refid="paragraphs"> - <generated classes="sectnum"> - 2.1 - Paragraphs - <bullet_list classes="auto-toc"> - <list_item> - <paragraph> - <reference ids="toc-entry-7" refid="inline-markup"> - <generated classes="sectnum"> - 2.1.1 - Inline Markup - <list_item> - <paragraph> - <reference ids="toc-entry-8" refid="bullet-lists"> - <generated classes="sectnum"> - 2.2 - Bullet Lists - <list_item> - <paragraph> - <reference ids="toc-entry-9" refid="enumerated-lists"> - <generated classes="sectnum"> - 2.3 - Enumerated Lists - <list_item> - <paragraph> - <reference ids="toc-entry-10" refid="definition-lists"> - <generated classes="sectnum"> - 2.4 - Definition Lists - <list_item> - <paragraph> - <reference ids="toc-entry-11" refid="field-lists"> - <generated classes="sectnum"> - 2.5 - Field Lists - <list_item> - <paragraph> - <reference ids="toc-entry-12" refid="option-lists"> - <generated classes="sectnum"> - 2.6 - Option Lists - <list_item> - <paragraph> - <reference ids="toc-entry-13" refid="literal-blocks"> - <generated classes="sectnum"> - 2.7 - Literal Blocks - <list_item> - <paragraph> - <reference ids="toc-entry-14" refid="line-blocks"> - <generated classes="sectnum"> - 2.8 - Line Blocks - <list_item> - <paragraph> - <reference ids="toc-entry-15" refid="block-quotes"> - <generated classes="sectnum"> - 2.9 - Block Quotes - <list_item> - <paragraph> - <reference ids="toc-entry-16" refid="doctest-blocks"> - <generated classes="sectnum"> - 2.10 - Doctest Blocks - <list_item> - <paragraph> - <reference ids="toc-entry-17" refid="footnotes"> - <generated classes="sectnum"> - 2.11 - Footnotes - <list_item> - <paragraph> - <reference ids="toc-entry-18" refid="citations"> - <generated classes="sectnum"> - 2.12 - Citations - <list_item> - <paragraph> - <reference ids="toc-entry-19" refid="targets"> - <generated classes="sectnum"> - 2.13 - Targets - <bullet_list classes="auto-toc"> - <list_item> - <paragraph> - <reference ids="toc-entry-20" refid="duplicate-target-names"> - <generated classes="sectnum"> - 2.13.1 - Duplicate Target Names - <list_item> - <paragraph> - <reference ids="toc-entry-21" refid="duplicate-target-names-1"> - <generated classes="sectnum"> - 2.13.2 - Duplicate Target Names - <list_item> - <paragraph> - <reference ids="toc-entry-22" refid="directives"> - <generated classes="sectnum"> - 2.14 - Directives - <bullet_list classes="auto-toc"> - <list_item> - <paragraph> - <reference ids="toc-entry-23" refid="document-parts"> - <generated classes="sectnum"> - 2.14.1 - Document Parts - <list_item> - <paragraph> - <reference ids="toc-entry-24" refid="images-and-figures"> - <generated classes="sectnum"> - 2.14.2 - Images and Figures - <list_item> - <paragraph> - <reference ids="toc-entry-25" refid="tables"> - <generated classes="sectnum"> - 2.14.3 - Tables - <list_item> - <paragraph> - <reference ids="toc-entry-26" refid="admonitions"> - <generated classes="sectnum"> - 2.14.4 - Admonitions - <list_item> - <paragraph> - <reference ids="toc-entry-27" refid="topics-sidebars-and-rubrics"> - <generated classes="sectnum"> - 2.14.5 - Topics, Sidebars, and Rubrics - <list_item> - <paragraph> - <reference ids="toc-entry-28" refid="target-footnotes"> - <generated classes="sectnum"> - 2.14.6 - Target Footnotes - <list_item> - <paragraph> - <reference ids="toc-entry-29" refid="replacement-text"> - <generated classes="sectnum"> - 2.14.7 - Replacement Text - <list_item> - <paragraph> - <reference ids="toc-entry-30" refid="compound-paragraph"> - <generated classes="sectnum"> - 2.14.8 - Compound Paragraph - <list_item> - <paragraph> - <reference ids="toc-entry-31" refid="parsed-literal-blocks"> - <generated classes="sectnum"> - 2.14.9 - Parsed Literal Blocks - <list_item> - <paragraph> - <reference ids="toc-entry-32" refid="code"> - <generated classes="sectnum"> - 2.14.10 - Code - <list_item> - <paragraph> - <reference ids="toc-entry-33" refid="meta"> - <generated classes="sectnum"> - 2.14.11 - Meta - <list_item> - <paragraph> - <reference ids="toc-entry-34" refid="substitution-definitions"> - <generated classes="sectnum"> - 2.15 - Substitution Definitions - <list_item> - <paragraph> - <reference ids="toc-entry-35" refid="comments"> - <generated classes="sectnum"> - 2.16 - Comments - <list_item> - <paragraph> - <reference ids="toc-entry-36" refid="raw-text"> - <generated classes="sectnum"> - 2.17 - Raw text - <list_item> - <paragraph> - <reference ids="toc-entry-37" refid="container"> - <generated classes="sectnum"> - 2.18 - Container - <list_item> - <paragraph> - <reference ids="toc-entry-38" refid="colspanning-tables"> - <generated classes="sectnum"> - 2.19 - Colspanning tables - <list_item> - <paragraph> - <reference ids="toc-entry-39" refid="rowspanning-tables"> - <generated classes="sectnum"> - 2.20 - Rowspanning tables - <list_item> - <paragraph> - <reference ids="toc-entry-40" refid="complex-tables"> - <generated classes="sectnum"> - 2.21 - Complex tables - <list_item> - <paragraph> - <reference ids="toc-entry-41" refid="list-tables"> - <generated classes="sectnum"> - 2.22 - List Tables - <list_item> - <paragraph> - <reference ids="toc-entry-42" refid="error-handling"> - <generated classes="sectnum"> - 3 - Error Handling - <section ids="structural-elements" names="structural\ elements"> - <title auto="1" refid="toc-entry-1"> - <generated classes="sectnum"> - 1 - Structural Elements - <section ids="section-title" names="section\ title"> - <title auto="1" refid="toc-entry-2"> - <generated classes="sectnum"> - 1.1 - Section Title - <subtitle ids="section-subtitle" names="section\ subtitle"> - Section Subtitle - <paragraph> - Lone subsections are converted to a section subtitle by a transform - activated with the - <literal> - --section-subtitles - command line option or the - <literal> - sectsubtitle-xform - configuration value. - <section ids="empty-section" names="empty\ section"> - <title auto="1" refid="toc-entry-3"> - <generated classes="sectnum"> - 1.2 - Empty Section - <section ids="transitions" names="transitions"> - <title auto="1" refid="toc-entry-4"> - <generated classes="sectnum"> - 1.3 - Transitions - <paragraph> - Here's a transition: - <transition> - <paragraph> - It divides the section. Transitions may also occur between sections: - <transition> - <section ids="body-elements" names="body\ elements"> - <title auto="1" refid="toc-entry-5"> - <generated classes="sectnum"> - 2 - Body Elements - <section ids="paragraphs" names="paragraphs"> - <title auto="1" refid="toc-entry-6"> - <generated classes="sectnum"> - 2.1 - Paragraphs - <paragraph> - A paragraph. - <section ids="inline-markup" names="inline\ markup"> - <title auto="1" refid="toc-entry-7"> - <generated classes="sectnum"> - 2.1.1 - Inline Markup - <paragraph> - Paragraphs contain text and may contain inline markup: - <emphasis> - emphasis - , - <strong> - strong emphasis - , - <literal> - inline literals - , standalone hyperlinks - ( - <reference refuri="http://www.python.org"> - http://www.python.org - ), external hyperlinks ( - <reference name="Python" refuri="http://www.python.org/"> - Python - - <footnote_reference auto="1" ids="footnote-reference-10" refid="footnote-6"> - 5 - ), internal - cross-references ( - <reference name="example" refid="example"> - example - ), external hyperlinks with embedded URIs - ( - <reference name="Python web site" refuri="http://www.python.org"> - Python web site - ), - <reference anonymous="1" name="anonymous hyperlink references" refuri="http://www.python.org/"> - anonymous hyperlink - references - - <footnote_reference auto="1" ids="footnote-reference-14" refid="footnote-6"> - 5 - ( - <reference anonymous="1" name="a second reference" refuri="https://docutils.sourceforge.io/"> - a second reference - - <footnote_reference auto="1" ids="footnote-reference-15" refid="footnote-8"> - 7 - ), footnote references (manually - numbered - <footnote_reference ids="footnote-reference-1" refid="footnote-1"> - 1 - , anonymous auto-numbered - <footnote_reference auto="1" ids="footnote-reference-2" refid="footnote-2"> - 3 - , labeled auto-numbered - <footnote_reference auto="1" ids="footnote-reference-3" refid="label"> - 2 - , or symbolic - <footnote_reference auto="*" ids="footnote-reference-4" refid="footnote-3"> - * - ), citation references (see - <citation_reference ids="citation-reference-1" refid="cit2002"> - CIT2002 - ), - substitution references ( - <image alt="EXAMPLE" uri="../../../docs/user/rst/images/biohazard.png"> - & - a - <emphasis> - trimmed heart - - <literal> - (U+2665): - ♥ - ), and - <target ids="inline-hyperlink-targets" names="inline\ hyperlink\ targets"> - inline hyperlink targets - - (see - <reference name="Targets" refid="targets"> - Targets - below for a reference back to here). Character-level - inline markup is also possible (although exceedingly ugly!) in - <emphasis> - re - <literal> - Structured - <emphasis> - Text - . Problems are indicated by - <problematic ids="problematic-1" refid="system-message-1"> - |problematic| - text - (generated by processing errors; this one is intentional). Here is a - reference to the - <reference name="doctitle" refid="doctitle"> - doctitle - and the - <reference name="subtitle" refid="subtitle"> - subtitle - . - <target anonymous="1" ids="target-1" refuri="http://www.python.org/"> - <target anonymous="1" ids="target-2" refuri="https://docutils.sourceforge.io/"> - <paragraph> - The default role for interpreted text is - <title_reference> - Title Reference - . Here are - some explicit interpreted text roles: a PEP reference ( - <reference refuri="https://peps.python.org/pep-0287"> - PEP 287 - ); an - RFC reference ( - <reference refuri="https://tools.ietf.org/html/rfc2822.html"> - RFC 2822 - ); an abbreviation ( - <abbreviation> - abb. - ), an acronym - ( - <acronym> - reST - ), code ( - <literal classes="code"> - print "hello world" - ); a - <subscript> - subscript - ; - a - <superscript> - superscript - and explicit roles for - <title_reference> - Docutils - ' - <emphasis> - standard - - <strong> - inline - - <literal> - markup - . - <comment xml:space="preserve"> - DO NOT RE-WRAP THE FOLLOWING PARAGRAPH! - <paragraph> - Let's test wrapping and whitespace significance in inline literals: - <literal> - This is an example of --inline-literal --text, --including some-- - strangely--hyphenated-words. Adjust-the-width-of-your-browser-window - to see how the text is wrapped. -- ---- -------- Now note the - spacing between the words of this sentence (words - should be grouped in pairs). - <paragraph> - If the - <literal> - --pep-references - option was supplied, there should be a - live link to PEP 258 here. - <section ids="bullet-lists" names="bullet\ lists"> - <title auto="1" refid="toc-entry-8"> - <generated classes="sectnum"> - 2.2 - Bullet Lists - <bullet_list bullet="-"> - <list_item> - <paragraph> - A bullet list - <bullet_list bullet="+"> - <list_item> - <paragraph> - Nested bullet list. - <list_item> - <paragraph> - Nested item 2. - <list_item> - <paragraph> - Item 2. - <paragraph> - Paragraph 2 of item 2. - <bullet_list bullet="*"> - <list_item> - <paragraph> - Nested bullet list. - <list_item> - <paragraph> - Nested item 2. - <bullet_list bullet="-"> - <list_item> - <paragraph> - Third level. - <list_item> - <paragraph> - Item 2. - <list_item> - <paragraph> - Nested item 3. - <list_item> - <paragraph> - This nested list should be compacted by the HTML writer. - <target ids="target" names="target"> - <comment xml:space="preserve"> - Even if this item contains a target and a comment. - <section ids="enumerated-lists" names="enumerated\ lists"> - <title auto="1" refid="toc-entry-9"> - <generated classes="sectnum"> - 2.3 - Enumerated Lists - <enumerated_list enumtype="arabic" prefix="" suffix="."> - <list_item> - <paragraph> - Arabic numerals. - <enumerated_list enumtype="loweralpha" prefix="" suffix=")"> - <list_item> - <paragraph> - lower alpha) - <enumerated_list enumtype="lowerroman" prefix="(" suffix=")"> - <list_item> - <paragraph> - (lower roman) - <enumerated_list enumtype="upperalpha" prefix="" suffix="."> - <list_item> - <paragraph> - upper alpha. - <enumerated_list enumtype="upperroman" prefix="" suffix=")"> - <list_item> - <paragraph> - upper roman) - <list_item> - <paragraph> - Lists that don't start at 1: - <enumerated_list enumtype="arabic" prefix="" start="3" suffix="."> - <list_item> - <paragraph> - Three - <list_item> - <paragraph> - Four - <system_message level="1" line="8" source="functional/input/data/standard.rst" type="INFO"> - <paragraph> - Enumerated list start value not ordinal-1: "3" (ordinal 3) - <enumerated_list enumtype="upperalpha" prefix="" start="3" suffix="."> - <list_item> - <paragraph> - C - <list_item> - <paragraph> - D - <system_message level="1" line="8" source="functional/input/data/standard.rst" type="INFO"> - <paragraph> - Enumerated list start value not ordinal-1: "C" (ordinal 3) - <enumerated_list enumtype="lowerroman" prefix="" start="3" suffix="."> - <list_item> - <paragraph> - iii - <list_item> - <paragraph> - iv - <system_message level="1" line="8" source="functional/input/data/standard.rst" type="INFO"> - <paragraph> - Enumerated list start value not ordinal-1: "iii" (ordinal 3) - <section ids="definition-lists" names="definition\ lists"> - <title auto="1" refid="toc-entry-10"> - <generated classes="sectnum"> - 2.4 - Definition Lists - <definition_list> - <definition_list_item> - <term> - Term - <definition> - <paragraph> - Definition - <definition_list_item> - <term> - Term - <classifier> - classifier - <definition> - <paragraph> - Definition paragraph 1. - <paragraph> - Definition paragraph 2. - <definition_list_item> - <term> - Term - <definition> - <paragraph> - Definition - <definition_list_item> - <term> - Term - <classifier> - classifier one - <classifier> - classifier two - <definition> - <paragraph> - Definition - <section ids="field-lists" names="field\ lists"> - <title auto="1" refid="toc-entry-11"> - <generated classes="sectnum"> - 2.5 - Field Lists - <field_list> - <field> - <field_name> - what - <field_body> - <paragraph> - Field lists map field names to field bodies, like database - records. They are often part of an extension syntax. They are - an unambiguous variant of RFC 2822 fields. - <field> - <field_name> - how arg1 arg2 - <field_body> - <paragraph> - The field marker is a colon, the field name, and a colon. - <paragraph> - The field body may contain one or more body elements, indented - relative to the field marker. - <field> - <field_name> - credits - <field_body> - <paragraph classes="credits"> - This paragraph has the - <title_reference> - credits - class set. (This is actually not - about credits but just for ensuring that the class attribute - doesn't get stripped away.) - <section ids="option-lists" names="option\ lists"> - <title auto="1" refid="toc-entry-12"> - <generated classes="sectnum"> - 2.6 - Option Lists - <paragraph> - For listing command-line options: - <option_list> - <option_list_item> - <option_group> - <option> - <option_string> - -a - <description> - <paragraph> - command-line option "a" - <option_list_item> - <option_group> - <option> - <option_string> - -b - <option_argument delimiter=" "> - file - <description> - <paragraph> - options can have arguments - and long descriptions - <option_list_item> - <option_group> - <option> - <option_string> - --long - <description> - <paragraph> - options can be long, too - <option_list_item> - <option_group> - <option> - <option_string> - --input - <option_argument delimiter="="> - file - <description> - <paragraph> - long options can also have arguments - <option_list_item> - <option_group> - <option> - <option_string> - /V - <description> - <paragraph> - DOS/VMS-style option - <option_list_item> - <option_group> - <option> - <option_string> - --very-long-option - <description> - <paragraph> - The description can also start on the next line. - <paragraph> - The description may contain multiple body elements, - regardless of where it starts. - <option_list_item> - <option_group> - <option> - <option_string> - -x - <option> - <option_string> - -y - <option> - <option_string> - -z - <description> - <paragraph> - Multiple options are an "option group". - <option_list_item> - <option_group> - <option> - <option_string> - -v - <option> - <option_string> - --verbose - <description> - <paragraph> - Commonly-seen: short & long options. - <option_list_item> - <option_group> - <option> - <option_string> - -1 - <option_argument delimiter=" "> - file - <option> - <option_string> - --one - <option_argument delimiter="="> - file - <option> - <option_string> - --two - <option_argument delimiter=" "> - file - <description> - <paragraph> - Multiple options with arguments. - <option_list_item> - <option_group> - <option> - <option_string> - -f - <option_argument delimiter=" "> - <[path]file> - <description> - <paragraph> - Option argumens must start with a letter - or be wrapped in angle brackets. - <option_list_item> - <option_group> - <option> - <option_string> - -d - <option_argument delimiter=" "> - <src dest> - <description> - <paragraph> - Angle brackets are also required if an - option expects more than one argument. - <paragraph> - There must be at least two spaces between the option and the - description. - <section ids="literal-blocks" names="literal\ blocks"> - <title auto="1" refid="toc-entry-13"> - <generated classes="sectnum"> - 2.7 - Literal Blocks - <paragraph> - Literal blocks are indicated with a double-colon ("::") at the end of - the preceding paragraph (over there - <literal> - --> - ). They can be indented: - <literal_block xml:space="preserve"> - if literal_block: - text = 'is left as-is' - spaces_and_linebreaks = 'are preserved' - markup_processing = None - <paragraph> - Or they can be quoted without indentation: - <literal_block xml:space="preserve"> - >> Great idea! - > - > Why didn't I think of that? - <section ids="line-blocks" names="line\ blocks"> - <title auto="1" refid="toc-entry-14"> - <generated classes="sectnum"> - 2.8 - Line Blocks - <paragraph> - This section tests line blocks. Line blocks are body elements which - consist of lines and other line blocks. Nested line blocks cause - indentation. - <line_block> - <line> - This is a line block. It ends with a blank line. - <line_block> - <line> - New lines begin with a vertical bar ("|"). - <line> - Line breaks and initial indent are significant, and preserved. - <line_block> - <line> - Continuation lines are also possible. A long line that is intended - to wrap should begin with a space in place of the vertical bar. - <line> - The left edge of a continuation line need not be aligned with - the left edge of the text above it. - <line_block> - <line> - This is a second line block. - <line> - <line> - Blank lines are permitted internally, but they must begin with a "|". - <paragraph> - Another line block, surrounded by paragraphs: - <line_block> - <line> - And it's no good waiting by the window - <line> - It's no good waiting for the sun - <line> - Please believe me, the things you dream of - <line> - They don't fall in the lap of no-one - <paragraph> - Take it away, Eric the Orchestra Leader! - <block_quote> - <line_block> - <line> - A one, two, a one two three four - <line> - <line> - Half a bee, philosophically, - <line_block> - <line> - must, - <emphasis> - ipso facto - , half not be. - <line> - But half the bee has got to be, - <line_block> - <line> - <emphasis> - vis a vis - its entity. D'you see? - <line> - <line> - But can a bee be said to be - <line_block> - <line> - or not to be an entire bee, - <line_block> - <line> - when half the bee is not a bee, - <line_block> - <line> - due to some ancient injury? - <line> - <line> - Singing... - <paragraph> - A line block, like the following poem by Christian Morgenstern, can - also be centre-aligned: - <line_block classes="language-de align-center"> - <line> - <strong> - Die Trichter - <line> - <line> - Zwei Trichter wandeln durch die Nacht. - <line> - Durch ihres Rumpfs verengten Schacht - <line> - fließt weißes Mondlicht - <line> - still und heiter - <line> - auf ihren - <line> - Waldweg - <line> - u. s. - <line> - w. - <line> - <section ids="block-quotes" names="block\ quotes"> - <title auto="1" refid="toc-entry-15"> - <generated classes="sectnum"> - 2.9 - Block Quotes - <paragraph> - Block quotes consist of indented body elements: - <block_quote> - <paragraph> - My theory by A. Elk. Brackets Miss, brackets. This theory goes - as follows and begins now. All brontosauruses are thin at one - end, much much thicker in the middle and then thin again at the - far end. That is my theory, it is mine, and belongs to me and I - own it, and what it is too. - <attribution> - Anne Elk (Miss) - <paragraph> - The language of a quote (like any other object) can be specified by - a class attribute: - <comment xml:space="preserve"> - <block_quote classes="language-fr"> - <paragraph> - ReStructuredText est un langage de balisage léger utilisé - notamment dans la documentation du langage Python. - <section ids="doctest-blocks" names="doctest\ blocks"> - <title auto="1" refid="toc-entry-16"> - <generated classes="sectnum"> - 2.10 - Doctest Blocks - <doctest_block xml:space="preserve"> - >>> print 'Python-specific usage examples; begun with ">>>"' - Python-specific usage examples; begun with ">>>" - >>> print '(cut and pasted from interactive Python sessions)' - (cut and pasted from interactive Python sessions) - <section ids="footnotes" names="footnotes"> - <title auto="1" refid="toc-entry-17"> - <generated classes="sectnum"> - 2.11 - Footnotes - <footnote backrefs="footnote-reference-1 footnote-reference-5 footnote-reference-9" ids="footnote-1" names="1"> - <label> - 1 - <paragraph> - A footnote contains body elements, consistently indented by at - least 3 spaces. - <paragraph> - This is the footnote's second paragraph. - <footnote auto="1" backrefs="footnote-reference-3 footnote-reference-6" ids="label" names="label"> - <label> - 2 - <paragraph> - Footnotes may be numbered, either manually (as in - <footnote_reference ids="footnote-reference-5" refid="footnote-1"> - 1 - ) or - automatically using a "#"-prefixed label. This footnote has a - label so it can be referred to from multiple places, both as a - footnote reference ( - <footnote_reference auto="1" ids="footnote-reference-6" refid="label"> - 2 - ) and as a - <reference anonymous="1" name="hyperlink reference" refid="label"> - hyperlink reference - . - <target anonymous="1" ids="target-3" refid="label"> - <footnote auto="1" backrefs="footnote-reference-2" ids="footnote-2" names="3"> - <label> - 3 - <paragraph> - This footnote is numbered automatically and anonymously using a - label of "#" only. - <paragraph> - This is the second paragraph. - <paragraph> - And this is the third paragraph. - <footnote auto="*" backrefs="footnote-reference-4" ids="footnote-3"> - <label> - * - <paragraph> - Footnotes may also use symbols, specified with a "*" label. - ... [truncated message content] |
From: <mi...@us...> - 2024-09-23 22:36:50
|
Revision: 9938 http://sourceforge.net/p/docutils/code/9938 Author: milde Date: 2024-09-23 22:36:47 +0000 (Mon, 23 Sep 2024) Log Message: ----------- Revert [r9902] (right align code line numbers with CSS). The change in [r9902] has the side-effect of a spurious space before the first line of a code block without line nubers. Right-aligning via CSS is not required, as line numbers are already padded by the parser. Revert. Modified Paths: -------------- trunk/docutils/docutils/writers/html5_polyglot/minimal.css Modified: trunk/docutils/docutils/writers/html5_polyglot/minimal.css =================================================================== --- trunk/docutils/docutils/writers/html5_polyglot/minimal.css 2024-09-23 22:36:38 UTC (rev 9937) +++ trunk/docutils/docutils/writers/html5_polyglot/minimal.css 2024-09-23 22:36:47 UTC (rev 9938) @@ -1,4 +1,4 @@ -/* Minimal style sheet for the HTML output of Docutils. */ +t/* Minimal style sheet for the HTML output of Docutils. */ /* */ /* :Author: Günter Milde, based on html4css1.css by David Goodger */ /* :Id: $Id$ */ @@ -235,13 +235,10 @@ div.line-block { display: block; } div.line-block div.line-block, pre { margin-left: 2em; } -/* Code line numbers: align-right, don't copy with drag-and-drop */ +/* Code line numbers: don't copy with drag-and-drop */ pre.code .ln { display: none; } pre.code code:before { content: attr(data-lineno); - display: inline-block; - min-width: 1.8em; - text-align: right; font-size: small; color: gray; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-23 22:36:41
|
Revision: 9937 http://sourceforge.net/p/docutils/code/9937 Author: milde Date: 2024-09-23 22:36:38 +0000 (Mon, 23 Sep 2024) Log Message: ----------- LaTeX writer: stop requiring "ifthen.sty", fix Babel warning. Replace use of ``\ifthenelse`` from "ifthen.sty" with the eTeX primitive ``\ifdefined``. Mark the main language when loading "babel" to prevent a warning about another language being processed last. This happens when there is more than one language in the document as we put the main language also in the document options (for other packages to see). Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/RELEASE-NOTES.rst trunk/docutils/docs/user/latex.rst trunk/docutils/docutils/writers/latex2e/__init__.py trunk/docutils/docutils/writers/latex2e/docutils.sty trunk/docutils/test/functional/expected/cyrillic.tex trunk/docutils/test/functional/expected/latex_babel.tex trunk/docutils/test/functional/expected/latex_cornercases.tex trunk/docutils/test/functional/expected/latex_docinfo.tex trunk/docutils/test/functional/expected/latex_leavevmode.tex trunk/docutils/test/functional/expected/latex_literal_block.tex trunk/docutils/test/functional/expected/latex_literal_block_fancyvrb.tex trunk/docutils/test/functional/expected/latex_literal_block_listings.tex trunk/docutils/test/functional/expected/latex_literal_block_verbatim.tex trunk/docutils/test/functional/expected/latex_literal_block_verbatimtab.tex trunk/docutils/test/functional/expected/latex_memoir.tex trunk/docutils/test/functional/expected/standalone_rst_latex.tex trunk/docutils/test/functional/expected/standalone_rst_xetex.tex trunk/docutils/test/functional/expected/xetex-cyrillic.tex trunk/docutils/test/test_writers/test_latex2e.py trunk/docutils/test/test_writers/test_xetex_misc.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/HISTORY.rst 2024-09-23 22:36:38 UTC (rev 9937) @@ -162,6 +162,9 @@ move XeTeX-specific code to the "xetex" writer. - Don't wrap references with custom reference-label_ in a ``\hyperref`` command. + - Stop requiring "ifthen.sty". Replace use of ``\ifthenelse{\isundefined...`` + with the eTeX primitive ``\ifdefined``. + - Mark the main language when loading "babel". - Provide an "unknown_references_resolver" (cf. `docutils/TransformSpec`) for citation references resolved with BibTeX (cf. `use_bibtex`_ setting). Modified: trunk/docutils/RELEASE-NOTES.rst =================================================================== --- trunk/docutils/RELEASE-NOTES.rst 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/RELEASE-NOTES.rst 2024-09-23 22:36:38 UTC (rev 9937) @@ -198,6 +198,9 @@ command. The "hyperref" package generates hyperlinks for labels by default, so there is no change in the PDF (except for "ref*"). + Stop requiring "ifthen.sty". Replace use of + ``\ifthenelse{\isundefined...`` with the eTeX primitive ``\ifdefined``. + .. _reference-label: docs/user/config.html#reference-label HTML5: Modified: trunk/docutils/docs/user/latex.rst =================================================================== --- trunk/docutils/docs/user/latex.rst 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/docs/user/latex.rst 2024-09-23 22:36:38 UTC (rev 9937) @@ -379,7 +379,7 @@ Some customizations require commands at places other than the insertion point of stylesheets or depend on the deletion/replacement of parts of the document. This can be done via a custom template. See the `publisher -documentation`_ for a description of the document parts available in a +documentation`_ for a description of the `document parts`_ available in a template file. Option: @@ -396,8 +396,11 @@ --template=titlepage.tex .. _publisher documentation: ../api/publisher.html +.. _document parts: + ../api/publisher.html#parts-provided-by-the-xe-latex-writers .. _template: config.html#template-latex-writers + Raw LaTeX ````````` Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-23 22:36:38 UTC (rev 9937) @@ -435,7 +435,10 @@ def __call__(self): """Return the babel call with correct options and settings""" languages = sorted(self.otherlanguages.keys()) - languages.append(self.language or 'english') + if languages: + languages.append(f'main={self.language or "english"}') + else: + languages.append(self.language or 'english') self.setup = [r'\usepackage[%s]{babel}' % ','.join(languages)] # Deactivate "active characters" shorthands = [] @@ -456,7 +459,7 @@ self.setup.extend([r'\makeatletter', r' \addto\extrasbasque{\bbl@deactivate{~}}', r'\makeatother']) - if (languages[-1] == 'english' + if (languages[-1] == 'main=english' and 'french' in self.otherlanguages.keys()): self.setup += ['% Prevent side-effects if French hyphenation ' 'patterns are not loaded:', @@ -520,11 +523,12 @@ \floatplacement{figure}{H} % place figures here definitely""" PreambleCmds.linking = r"""%% hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[%s]{hyperref} \usepackage{bookmark} \urlstyle{same} %% normal text font (alternatives: tt, rm, sf) -}{}""" +\fi""" PreambleCmds.minitoc = r"""%% local table of contents \usepackage{minitoc}""" @@ -1254,7 +1258,6 @@ (self.documentoptions, settings.documentclass)] self.requirements = SortableDict() # made a list in depart_document() - self.requirements['__static'] = r'\usepackage{ifthen}' self.latex_preamble = [settings.latex_preamble] self.fallbacks = SortableDict() # made a list in depart_document() self.pdfsetup = [] # PDF properties (hyperref package) Modified: trunk/docutils/docutils/writers/latex2e/docutils.sty =================================================================== --- trunk/docutils/docutils/writers/latex2e/docutils.sty 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/docutils/writers/latex2e/docutils.sty 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,6 +1,6 @@ %% docutils.sty: macros for Docutils LaTeX output. %% -%% Copyright © 2020 Günter Milde +%% Copyright © 2020, 2024 Günter Milde %% Released under the terms of the `2-Clause BSD license`, in short: %% %% Copying and distribution of this file, with or without modification, @@ -8,7 +8,12 @@ %% notice and this notice are preserved. %% This file is offered as-is, without any warranty. +% docutils.sty +% ************ +% +% .. contents:: % .. include:: README.md +% :parser: commonmark % % Implementation % ============== @@ -17,7 +22,7 @@ \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{docutils} - [2021/05/18 macros for Docutils LaTeX output] + [2024-09-23 macros for Docutils LaTeX output] % Helpers % ------- @@ -27,19 +32,23 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi % providelength:: % Provide a length variable and set default, if it is new -\providecommand*{\DUprovidelength}[2]{ - \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1 + \else + \newlength{#1}\setlength{#1}{#2}% + \fi } @@ -46,7 +55,7 @@ % Configuration defaults % ---------------------- % -% See `Docutils LaTeX Writer`_ for details. +% See `Generating LaTeX with Docutils`_ for details. % % abstract:: @@ -61,7 +70,7 @@ \renewenvironment{quote}{\begin{center}}{\end{center}}% } -% TODO: add \em to set dedication text in italics? +% .. TODO: add \em to set dedication text in italics? % % docinfo:: @@ -88,28 +97,30 @@ % admonition:: % admonition environment (specially marked topic) -\ifx\DUadmonition\undefined % poor man's "provideenvironment" - \newbox{\DUadmonitionbox} - \newenvironment{DUadmonition}% - {\begin{center} - \begin{lrbox}{\DUadmonitionbox} - \begin{minipage}{0.9\linewidth} - }% - { \end{minipage} - \end{lrbox} - \fbox{\usebox{\DUadmonitionbox}} - \end{center} - } +\ifdefined\DUadmonition +\else % poor man's "provideenvironment" + \newbox{\DUadmonitionbox} + \newenvironment{DUadmonition}% + {\begin{center} + \begin{lrbox}{\DUadmonitionbox} + \begin{minipage}{0.9\linewidth} + }% + { \end{minipage} + \end{lrbox} + \fbox{\usebox{\DUadmonitionbox}} + \end{center} + } \fi % fieldlist:: % field list environment (for separate configuration of `field lists`) -\ifthenelse{\isundefined{\DUfieldlist}}{ +\ifdefined\DUfieldlist +\else \newenvironment{DUfieldlist}% {\quote\description} {\enddescription\endquote} -}{} +\fi % footnotes:: @@ -141,15 +152,17 @@ % legend:: % legend environment (in figures and formal tables) -\ifthenelse{\isundefined{\DUlegend}}{ +\ifdefined\DUlegend +\else \newenvironment{DUlegend}{\small}{} -}{} +\fi % lineblock:: % line block environment \DUprovidelength{\DUlineblockindent}{2.5em} -\ifthenelse{\isundefined{\DUlineblock}}{ +\ifdefined\DUlineblock +\else \newenvironment{DUlineblock}[1]{% \list{}{\setlength{\partopsep}{\parskip} \addtolength{\partopsep}{\baselineskip} @@ -160,7 +173,7 @@ \raggedright } {\endlist} -}{} +\fi % optionlist:: @@ -167,7 +180,8 @@ % list of command line options \providecommand*{\DUoptionlistlabel}[1]{\bfseries #1 \hfill} \DUprovidelength{\DUoptionlistindent}{3cm} -\ifthenelse{\isundefined{\DUoptionlist}}{ +\ifdefined\DUoptionlist +\else \newenvironment{DUoptionlist}{% \list{}{\setlength{\labelwidth}{\DUoptionlistindent} \setlength{\rightmargin}{1cm} @@ -177,7 +191,7 @@ \renewcommand{\makelabel}{\DUoptionlistlabel}} } {\endlist} -}{} +\fi % rubric:: @@ -221,3 +235,9 @@ \hspace*{\fill}\hrulefill\hspace*{\fill} \vskip 0.5\baselineskip } + + +% .. References: +% +% .. _Generating LaTeX with Docutils: +% https://docutils.sourceforge.io/docs/user/latex.html Modified: trunk/docutils/test/functional/expected/cyrillic.tex =================================================================== --- trunk/docutils/test/functional/expected/cyrillic.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/cyrillic.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,9 +1,8 @@ \documentclass[a4paper,russian]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1,T2A]{fontenc} -\usepackage[english,russian]{babel} +\usepackage[english,main=russian]{babel} \setcounter{secnumdepth}{0} %%% Custom LaTeX preamble @@ -18,11 +17,12 @@ %%% Fallback definitions for Docutils-specific commands % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdflang={ru}, } Modified: trunk/docutils/test/functional/expected/latex_babel.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_babel.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_babel.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,9 +1,8 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} -\usepackage[basque,esperanto,estonian,galician,ngerman,english]{babel} +\usepackage[basque,esperanto,estonian,galician,ngerman,main=english]{babel} \AtBeginDocument{\shorthandoff{.<>}} \deactivatetilden % restore ~ in Galician \makeatletter @@ -24,11 +23,12 @@ %%% Fallback definitions for Docutils-specific commands % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi %%% Body \begin{document} Modified: trunk/docutils/test/functional/expected/latex_cornercases.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_cornercases.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_cornercases.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \DeclareUnicodeCharacter{21D4}{\ensuremath{\Leftrightarrow}} \DeclareUnicodeCharacter{2660}{\ensuremath{\spadesuit}} @@ -33,42 +32,49 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi % Provide a length variable and set default, if it is new -\providecommand*{\DUprovidelength}[2]{ - \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1 + \else + \newlength{#1}\setlength{#1}{#2}% + \fi } % admonition environment (specially marked topic) -\ifx\DUadmonition\undefined % poor man's "provideenvironment" - \newbox{\DUadmonitionbox} - \newenvironment{DUadmonition}% - {\begin{center} - \begin{lrbox}{\DUadmonitionbox} - \begin{minipage}{0.9\linewidth} - }% - { \end{minipage} - \end{lrbox} - \fbox{\usebox{\DUadmonitionbox}} - \end{center} - } +\ifdefined\DUadmonition +\else % poor man's "provideenvironment" + \newbox{\DUadmonitionbox} + \newenvironment{DUadmonition}% + {\begin{center} + \begin{lrbox}{\DUadmonitionbox} + \begin{minipage}{0.9\linewidth} + }% + { \end{minipage} + \end{lrbox} + \fbox{\usebox{\DUadmonitionbox}} + \end{center} + } \fi % legend environment (in figures and formal tables) -\ifthenelse{\isundefined{\DUlegend}}{ +\ifdefined\DUlegend +\else \newenvironment{DUlegend}{\small}{} -}{} +\fi % line block environment \DUprovidelength{\DUlineblockindent}{2.5em} -\ifthenelse{\isundefined{\DUlineblock}}{ +\ifdefined\DUlineblock +\else \newenvironment{DUlineblock}[1]{% \list{}{\setlength{\partopsep}{\parskip} \addtolength{\partopsep}{\baselineskip} @@ -79,12 +85,13 @@ \raggedright } {\endlist} -}{} +\fi % list of command line options \providecommand*{\DUoptionlistlabel}[1]{\bfseries #1 \hfill} \DUprovidelength{\DUoptionlistindent}{3cm} -\ifthenelse{\isundefined{\DUoptionlist}}{ +\ifdefined\DUoptionlist +\else \newenvironment{DUoptionlist}{% \list{}{\setlength{\labelwidth}{\DUoptionlistindent} \setlength{\rightmargin}{1cm} @@ -94,7 +101,7 @@ \renewcommand{\makelabel}{\DUoptionlistlabel}} } {\endlist} -}{} +\fi % title for topics, admonitions, unsupported section levels, and sidebar \providecommand*{\DUtitle}[1]{% @@ -110,11 +117,12 @@ } % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdftitle={Additional Tests for the LaTeX Writer}, } Modified: trunk/docutils/test/functional/expected/latex_docinfo.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_docinfo.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_docinfo.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} %%% Custom LaTeX preamble @@ -15,11 +14,12 @@ %%% Fallback definitions for Docutils-specific commands % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdfauthor={Foo Fred;Bar Barney} } Modified: trunk/docutils/test/functional/expected/latex_leavevmode.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_leavevmode.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_leavevmode.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{alltt} \usepackage{amsmath} @@ -27,17 +26,21 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi % Provide a length variable and set default, if it is new -\providecommand*{\DUprovidelength}[2]{ - \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1 + \else + \newlength{#1}\setlength{#1}{#2}% + \fi } \providecommand*{\DUCLASSabstract}{ @@ -45,18 +48,19 @@ } % admonition environment (specially marked topic) -\ifx\DUadmonition\undefined % poor man's "provideenvironment" - \newbox{\DUadmonitionbox} - \newenvironment{DUadmonition}% - {\begin{center} - \begin{lrbox}{\DUadmonitionbox} - \begin{minipage}{0.9\linewidth} - }% - { \end{minipage} - \end{lrbox} - \fbox{\usebox{\DUadmonitionbox}} - \end{center} - } +\ifdefined\DUadmonition +\else % poor man's "provideenvironment" + \newbox{\DUadmonitionbox} + \newenvironment{DUadmonition}% + {\begin{center} + \begin{lrbox}{\DUadmonitionbox} + \begin{minipage}{0.9\linewidth} + }% + { \end{minipage} + \end{lrbox} + \fbox{\usebox{\DUadmonitionbox}} + \end{center} + } \fi % width of docinfo table @@ -63,11 +67,12 @@ \DUprovidelength{\DUdocinfowidth}{0.9\linewidth} % field list environment (for separate configuration of `field lists`) -\ifthenelse{\isundefined{\DUfieldlist}}{ +\ifdefined\DUfieldlist +\else \newenvironment{DUfieldlist}% {\quote\description} {\enddescription\endquote} -}{} +\fi % numerical or symbol footnotes with hyperlinks and backlinks \providecommand*{\DUfootnotemark}[3]{% @@ -94,7 +99,8 @@ % line block environment \DUprovidelength{\DUlineblockindent}{2.5em} -\ifthenelse{\isundefined{\DUlineblock}}{ +\ifdefined\DUlineblock +\else \newenvironment{DUlineblock}[1]{% \list{}{\setlength{\partopsep}{\parskip} \addtolength{\partopsep}{\baselineskip} @@ -105,12 +111,13 @@ \raggedright } {\endlist} -}{} +\fi % list of command line options \providecommand*{\DUoptionlistlabel}[1]{\bfseries #1 \hfill} \DUprovidelength{\DUoptionlistindent}{3cm} -\ifthenelse{\isundefined{\DUoptionlist}}{ +\ifdefined\DUoptionlist +\else \newenvironment{DUoptionlist}{% \list{}{\setlength{\labelwidth}{\DUoptionlistindent} \setlength{\rightmargin}{1cm} @@ -120,7 +127,7 @@ \renewcommand{\makelabel}{\DUoptionlistlabel}} } {\endlist} -}{} +\fi % informal heading \providecommand*{\DUrubric}[1]{\subsubsection*{\emph{#1}}} @@ -133,11 +140,12 @@ \providecommand*{\DUroletitlereference}[1]{\textsl{#1}} % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdftitle={Styling of Elements in Definition- or Field-List}, pdfauthor={Hänsel;Gretel} Modified: trunk/docutils/test/functional/expected/latex_literal_block.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_literal_block.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_literal_block.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{alltt} \usepackage{amsmath} @@ -27,11 +26,12 @@ \settowidth{\ttemwidth}{\ttfamily M} % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi %%% Body \begin{document} Modified: trunk/docutils/test/functional/expected/latex_literal_block_fancyvrb.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_literal_block_fancyvrb.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_literal_block_fancyvrb.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{amsmath} \usepackage{color} @@ -27,11 +26,12 @@ \settowidth{\ttemwidth}{\ttfamily M} % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi %%% Body \begin{document} Modified: trunk/docutils/test/functional/expected/latex_literal_block_listings.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_literal_block_listings.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_literal_block_listings.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{amsmath} \usepackage{color} @@ -33,11 +32,12 @@ \settowidth{\ttemwidth}{\ttfamily M} % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi %%% Body \begin{document} Modified: trunk/docutils/test/functional/expected/latex_literal_block_verbatim.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_literal_block_verbatim.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_literal_block_verbatim.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{amsmath} \usepackage{color} @@ -26,11 +25,12 @@ \settowidth{\ttemwidth}{\ttfamily M} % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi %%% Body \begin{document} Modified: trunk/docutils/test/functional/expected/latex_literal_block_verbatimtab.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_literal_block_verbatimtab.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_literal_block_verbatimtab.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,7 +1,6 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{amsmath} \usepackage{color} @@ -27,11 +26,12 @@ \settowidth{\ttemwidth}{\ttfamily M} % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi %%% Body \begin{document} Modified: trunk/docutils/test/functional/expected/latex_memoir.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_memoir.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/latex_memoir.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,11 +1,10 @@ % generated by Docutils <https://docutils.sourceforge.io/> \documentclass[a4paper]{memoir} -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{alltt} \usepackage{amsmath} -\usepackage[british,french,ngerman,english]{babel} +\usepackage[british,french,ngerman,main=english]{babel} % Prevent side-effects if French hyphenation patterns are not loaded: \frenchbsetup{StandardLayout} \AtBeginDocument{\selectlanguage{english}\noextrasfrench} @@ -34,17 +33,21 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi % Provide a length variable and set default, if it is new -\providecommand*{\DUprovidelength}[2]{ - \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1 + \else + \newlength{#1}\setlength{#1}{#2}% + \fi } % abstract title @@ -78,11 +81,12 @@ \providecommand*{\DUtitleerror}[1]{\DUtitle{\color{red}#1}} % field list environment (for separate configuration of `field lists`) -\ifthenelse{\isundefined{\DUfieldlist}}{ +\ifdefined\DUfieldlist +\else \newenvironment{DUfieldlist}% {\quote\description} {\enddescription\endquote} -}{} +\fi % numerical or symbol footnotes with hyperlinks and backlinks \providecommand*{\DUfootnotemark}[3]{% @@ -108,13 +112,15 @@ } % legend environment (in figures and formal tables) -\ifthenelse{\isundefined{\DUlegend}}{ +\ifdefined\DUlegend +\else \newenvironment{DUlegend}{\small}{} -}{} +\fi % line block environment \DUprovidelength{\DUlineblockindent}{2.5em} -\ifthenelse{\isundefined{\DUlineblock}}{ +\ifdefined\DUlineblock +\else \newenvironment{DUlineblock}[1]{% \list{}{\setlength{\partopsep}{\parskip} \addtolength{\partopsep}{\baselineskip} @@ -125,12 +131,13 @@ \raggedright } {\endlist} -}{} +\fi % list of command line options \providecommand*{\DUoptionlistlabel}[1]{\bfseries #1 \hfill} \DUprovidelength{\DUoptionlistindent}{3cm} -\ifthenelse{\isundefined{\DUoptionlist}}{ +\ifdefined\DUoptionlist +\else \newenvironment{DUoptionlist}{% \list{}{\setlength{\labelwidth}{\DUoptionlistindent} \setlength{\rightmargin}{1cm} @@ -140,7 +147,7 @@ \renewcommand{\makelabel}{\DUoptionlistlabel}} } {\endlist} -}{} +\fi % informal heading \providecommand*{\DUrubric}[1]{\subsubsection*{\emph{#1}}} @@ -174,11 +181,12 @@ \vskip 0.5\baselineskip } % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdftitle={reStructuredText Test Document}, pdfkeywords={reStructuredText, test, parser}, Modified: trunk/docutils/test/functional/expected/standalone_rst_latex.tex =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -1,11 +1,10 @@ \documentclass[a4paper]{article} % generated by Docutils <https://docutils.sourceforge.io/> \usepackage{cmap} % fix search and cut-and-paste in Acrobat -\usepackage{ifthen} \usepackage[T1]{fontenc} \usepackage{alltt} \usepackage{amsmath} -\usepackage[british,french,ngerman,english]{babel} +\usepackage[british,french,ngerman,main=english]{babel} % Prevent side-effects if French hyphenation patterns are not loaded: \frenchbsetup{StandardLayout} \AtBeginDocument{\selectlanguage{english}\noextrasfrench} @@ -34,17 +33,21 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi % Provide a length variable and set default, if it is new -\providecommand*{\DUprovidelength}[2]{ - \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1 + \else + \newlength{#1}\setlength{#1}{#2}% + \fi } \providecommand*{\DUCLASSabstract}{ @@ -52,18 +55,19 @@ } % admonition environment (specially marked topic) -\ifx\DUadmonition\undefined % poor man's "provideenvironment" - \newbox{\DUadmonitionbox} - \newenvironment{DUadmonition}% - {\begin{center} - \begin{lrbox}{\DUadmonitionbox} - \begin{minipage}{0.9\linewidth} - }% - { \end{minipage} - \end{lrbox} - \fbox{\usebox{\DUadmonitionbox}} - \end{center} - } +\ifdefined\DUadmonition +\else % poor man's "provideenvironment" + \newbox{\DUadmonitionbox} + \newenvironment{DUadmonition}% + {\begin{center} + \begin{lrbox}{\DUadmonitionbox} + \begin{minipage}{0.9\linewidth} + }% + { \end{minipage} + \end{lrbox} + \fbox{\usebox{\DUadmonitionbox}} + \end{center} + } \fi % special topic for dedications @@ -81,11 +85,12 @@ \providecommand*{\DUCLASSerror}{\color{red}} % field list environment (for separate configuration of `field lists`) -\ifthenelse{\isundefined{\DUfieldlist}}{ +\ifdefined\DUfieldlist +\else \newenvironment{DUfieldlist}% {\quote\description} {\enddescription\endquote} -}{} +\fi % numerical or symbol footnotes with hyperlinks and backlinks \providecommand*{\DUfootnotemark}[3]{% @@ -111,13 +116,15 @@ } % legend environment (in figures and formal tables) -\ifthenelse{\isundefined{\DUlegend}}{ +\ifdefined\DUlegend +\else \newenvironment{DUlegend}{\small}{} -}{} +\fi % line block environment \DUprovidelength{\DUlineblockindent}{2.5em} -\ifthenelse{\isundefined{\DUlineblock}}{ +\ifdefined\DUlineblock +\else \newenvironment{DUlineblock}[1]{% \list{}{\setlength{\partopsep}{\parskip} \addtolength{\partopsep}{\baselineskip} @@ -128,12 +135,13 @@ \raggedright } {\endlist} -}{} +\fi % list of command line options \providecommand*{\DUoptionlistlabel}[1]{\bfseries #1 \hfill} \DUprovidelength{\DUoptionlistindent}{3cm} -\ifthenelse{\isundefined{\DUoptionlist}}{ +\ifdefined\DUoptionlist +\else \newenvironment{DUoptionlist}{% \list{}{\setlength{\labelwidth}{\DUoptionlistindent} \setlength{\rightmargin}{1cm} @@ -143,7 +151,7 @@ \renewcommand{\makelabel}{\DUoptionlistlabel}} } {\endlist} -}{} +\fi % informal heading \providecommand*{\DUrubric}[1]{\subsubsection*{\emph{#1}}} @@ -172,11 +180,12 @@ } % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdftitle={reStructuredText Test Document}, pdfkeywords={reStructuredText, test, parser}, Modified: trunk/docutils/test/functional/expected/standalone_rst_xetex.tex =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_xetex.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/standalone_rst_xetex.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -8,7 +8,6 @@ \DeclareTextCommand{\textquotedbl}{\UnicodeEncodingName}{% {\addfontfeatures{RawFeature=-tlig,Mapping=}\char34}}% \fi -\usepackage{ifthen} \usepackage{alltt} \usepackage{amsmath} \usepackage{polyglossia} @@ -48,11 +47,12 @@ {\end{list}}% } % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdftitle={reStructuredText Test Document}, pdfkeywords={reStructuredText, test, parser}, Modified: trunk/docutils/test/functional/expected/xetex-cyrillic.tex =================================================================== --- trunk/docutils/test/functional/expected/xetex-cyrillic.tex 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/functional/expected/xetex-cyrillic.tex 2024-09-23 22:36:38 UTC (rev 9937) @@ -8,7 +8,6 @@ \DeclareTextCommand{\textquotedbl}{\UnicodeEncodingName}{% {\addfontfeatures{RawFeature=-tlig,Mapping=}\char34}}% \fi -\usepackage{ifthen} \usepackage{polyglossia} \setdefaultlanguage{russian} \setotherlanguages{english} @@ -24,11 +23,12 @@ %%% Fallback definitions for Docutils-specific commands % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi \hypersetup{ pdflang={ru}, } Modified: trunk/docutils/test/test_writers/test_latex2e.py =================================================================== --- trunk/docutils/test/test_writers/test_latex2e.py 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/test_writers/test_latex2e.py 2024-09-23 22:36:38 UTC (rev 9937) @@ -124,8 +124,7 @@ parts = { 'head_prefix': r"""\documentclass[a4paper]{article} """, -'requirements': r"""\usepackage{ifthen} -\usepackage[T1]{fontenc} +'requirements': r"""\usepackage[T1]{fontenc} """, 'latex_preamble': r"""% PDF Standard Fonts \usepackage{mathptmx} % Times @@ -156,11 +155,12 @@ """, 'pdfsetup': r""" % hyperlinks: -\ifthenelse{\isundefined{\hypersetup}}{ +\ifdefined\hypersetup +\else \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} \usepackage{bookmark} \urlstyle{same} % normal text font (alternatives: tt, rm, sf) -}{} +\fi """, 'titledata': ''} @@ -227,9 +227,8 @@ samples_default['spanish_quote'] = [ [".. role:: language-es\n\nUnd damit :language-es:`basta`!", head_template.substitute(dict(parts, -requirements=r"""\usepackage{ifthen} -\usepackage[T1]{fontenc} -\usepackage[spanish,english]{babel} +requirements=r"""\usepackage[T1]{fontenc} +\usepackage[spanish,main=english]{babel} \AtBeginDocument{\shorthandoff{.<>}} """)) + r""" Und damit \foreignlanguage{spanish}{basta}! @@ -269,12 +268,13 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi % title for topics, admonitions, unsupported section levels, and sidebar @@ -989,12 +989,13 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi """ ) @@ -1101,12 +1102,13 @@ % class handling for environments (block-level elements) % \begin{DUclass}{spam} tries \DUCLASSspam and % \end{DUclass}{spam} tries \endDUCLASSspam -\ifx\DUclass\undefined % poor man's "provideenvironment" - \newenvironment{DUclass}[1]% - {% "#1" does not work in end-part of environment. - \def\DocutilsClassFunctionName{DUCLASS#1} +\ifdefined\DUclass +\else % poor man's "provideenvironment" + \newenvironment{DUclass}[1]% + {% "#1" does not work in end-part of environment. + \def\DocutilsClassFunctionName{DUCLASS#1} \csname \DocutilsClassFunctionName \endcsname}% - {\csname end\DocutilsClassFunctionName \endcsname}% + {\csname end\DocutilsClassFunctionName \endcsname}% \fi """) ) + r""" Modified: trunk/docutils/test/test_writers/test_xetex_misc.py =================================================================== --- trunk/docutils/test/test_writers/test_xetex_misc.py 2024-09-20 08:32:41 UTC (rev 9936) +++ trunk/docutils/test/test_writers/test_xetex_misc.py 2024-09-23 22:36:38 UTC (rev 9937) @@ -45,8 +45,11 @@ px_fallback = r""" % Provide a length variable and set default, if it is new -\providecommand*{\DUprovidelength}[2]{ - \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +\providecommand*{\DUprovidelength}[2]{% + \ifdefined#1 + \else + \newlength{#1}\setlength{#1}{#2}% + \fi } \DUprovidelength{\pdfpxdimen}{1bp} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-20 08:32:44
|
Revision: 9936 http://sourceforge.net/p/docutils/code/9936 Author: milde Date: 2024-09-20 08:32:41 +0000 (Fri, 20 Sep 2024) Log Message: ----------- Use `nodes.parse_measure()` in rST directive option conversion. Simplify `parsers.rst.directives.get_measure()` by using `nodes.parse_measure()`. Sort the list of supported length units in the order used in the rST specification (based on the CSS specification). Update and extend the lenght value handling tests. Clarify and test behaviour: * case of length units is preserved (in contrast to CSS) * the restriction of supported units is a rST feature while the Docutils Doctree allows any run of ASCII letters + {U+03BC} or a percent sign as units on attributes with value type "measure". Modified Paths: -------------- trunk/docutils/docutils/parsers/rst/directives/__init__.py trunk/docutils/test/test_nodes.py trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py trunk/docutils/test/test_parsers/test_rst/test_directives/test_images.py Modified: trunk/docutils/docutils/parsers/rst/directives/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/__init__.py 2024-09-20 08:32:28 UTC (rev 9935) +++ trunk/docutils/docutils/parsers/rst/directives/__init__.py 2024-09-20 08:32:41 UTC (rev 9936) @@ -244,26 +244,24 @@ return nonnegative_int(argument) -length_units = ['em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc'] +length_units = ['em', 'ex', 'in', 'cm', 'mm', 'pt', 'pc', 'px'] def get_measure(argument, units): """ - Check for a positive argument of one of the units and return a - normalized string of the form "<value><unit>" (without space in - between). - (Directive option conversion function.) + Check for a positive argument of one of the `units`. + Return a normalized string of the form "<value><unit>" + (without space inbetween). + To be called from directive option conversion functions. """ - match = re.match(r'^([0-9.]+) *(%s)$' % '|'.join(units), argument) - try: - float(match.group(1)) - except (AttributeError, ValueError): + value, unit = nodes.parse_measure(argument) + if value < 0 or unit not in units: raise ValueError( - 'not a positive measure of one of the following units:\n"%s"' - % '" "'.join(units)) - return match.group(1) + match.group(2) + 'not a positive number or measure of one of the following units:\n' + + ', '.join(u for u in units if u)) + return f'{value}{unit}' def length_or_unitless(argument: str) -> str: @@ -289,12 +287,11 @@ """ try: return get_measure(argument, length_units + ['%']) - except ValueError: + except ValueError as error: try: return get_measure(argument, ['']) + default except ValueError: - # raise ValueError with list of valid units: - return get_measure(argument, length_units + ['%']) + raise error def class_option(argument: str) -> list[str]: Modified: trunk/docutils/test/test_nodes.py =================================================================== --- trunk/docutils/test/test_nodes.py 2024-09-20 08:32:28 UTC (rev 9935) +++ trunk/docutils/test/test_nodes.py 2024-09-20 08:32:41 UTC (rev 9936) @@ -1172,10 +1172,21 @@ def test_validate_measure(self): # number (may be decimal fraction) + optional unit - self.assertEqual(nodes.validate_measure('8ex'), '8ex') + # internal whitespace is removed + self.assertEqual(nodes.validate_measure('8 ex'), '8ex') self.assertEqual(nodes.validate_measure('2'), '2') - # internal whitespace is removed + # unit is "%" or a run of ASCII letters plus "µ"; case is preserved self.assertEqual(nodes.validate_measure('3.5 %'), '3.5%') + self.assertEqual(nodes.validate_measure('300 µm'), '300µm') + self.assertEqual(nodes.validate_measure('4 kHz'), '4kHz') + # other characters and whitespace are not allowed in a unit identifier + with self.assertRaisesRegex(ValueError, 'no valid measure'): + nodes.validate_measure('3 micro-farads') + with self.assertRaisesRegex(ValueError, 'no valid measure'): + nodes.validate_measure('3 micro farads') + # a number is required + with self.assertRaisesRegex(ValueError, '"ex" is no valid measure'): + nodes.validate_measure('ex') # padding whitespace is not valid with self.assertRaisesRegex(ValueError, '"8ex " is no valid measure'): nodes.validate_measure('8ex ') Modified: trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py =================================================================== --- trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py 2024-09-20 08:32:28 UTC (rev 9935) +++ trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py 2024-09-20 08:32:41 UTC (rev 9936) @@ -82,9 +82,10 @@ def test_element_with_attributes(self): xml = ('<image align="left" alt="a barking dog" height="3ex"' - ' loading="embed" scale="3" uri="dog.jpg" width="4cm"/>') + ' loading="embed" scale="3" uri="dog.jpg" width="4.50 cm"/>') node = docutils_xml.parse_element(xml) - self.assertEqual(xml, str(node)) + # attribute values are normalized: + self.assertEqual(xml.replace('4.50 cm', '4.5cm'), str(node)) def test_element_with_invalid_attributes(self): """Silently accept invalid attribute names and values. @@ -91,13 +92,15 @@ Validation reports problems. """ - xml = ('<image breadth="3 cm" height="3 inch"/>') + xml = ('<image breadth="3 cm" height="three inch"/>') node = docutils_xml.parse_element(xml) - self.assertEqual(xml.replace('3 inch', '3inch'), str(node)) - with self.assertRaisesRegex(ValueError, - 'Element <image breadth="3 cm".*invalid:\n' - '.*"breadth" not one of "ids", ' - ): + self.assertEqual(xml, str(node)) + with self.assertRaisesRegex( + ValueError, + 'Element <image .*> invalid:\n' + ' Attribute "breadth" not one of "ids", .*, "loading".\n' + ' Attribute "height" has invalid value "three inch".\n' + ' "three inch" is no valid measure.'): node.validate() @@ -116,8 +119,8 @@ 'names': []} def test_alt(self): # CDATA (str) - xml = ('<image alt="a barking dog" align="left" height="3ex"' - ' loading="embed" scale="3" uri="dog.jpg" width="4cm"/>') + xml = ('<image alt="a barking dog" align="left" height="3 ex"' + ' loading="embed" scale="3" uri="dog.jpg" width="4 cm"/>') expected = {'alt': 'a barking dog', 'align': 'left', 'height': '3ex', Modified: trunk/docutils/test/test_parsers/test_rst/test_directives/test_images.py =================================================================== --- trunk/docutils/test/test_parsers/test_rst/test_directives/test_images.py 2024-09-20 08:32:28 UTC (rev 9935) +++ trunk/docutils/test/test_parsers/test_rst/test_directives/test_images.py 2024-09-20 08:32:41 UTC (rev 9936) @@ -23,6 +23,8 @@ class ParserTestCase(unittest.TestCase): + maxDiff = None + def test_parser(self): parser = Parser() settings = get_default_settings(Parser) @@ -170,14 +172,34 @@ <document source="test data"> <image height="100em" uri="picture.png" width="200px"> """], +# as in CSS3, units are case-insensitive (new in Docutils 0.22) ["""\ .. image:: picture.png + :width: 50 mm + :height: 100 em +""", +"""\ +<document source="test data"> + <image height="100em" uri="picture.png" width="50mm"> +"""], +# TODO: support CSS3 units (cf. [feature-requests:#57] +["""\ +.. image:: picture.png :width: 50% - :height: 10mm + :height: 10vh """, """\ <document source="test data"> - <image height="10mm" uri="picture.png" width="50%"> + <system_message level="3" line="1" source="test data" type="ERROR"> + <paragraph> + Error in "image" directive: + invalid option value: (option: "height"; value: '10vh') + not a positive number or measure of one of the following units: + em, ex, in, cm, mm, pt, pc, px. + <literal_block xml:space="preserve"> + .. image:: picture.png + :width: 50% + :height: 10vh """], ["""\ .. image:: picture.png @@ -190,8 +212,8 @@ <paragraph> Error in "image" directive: invalid option value: (option: "height"; value: \'40%\') - not a positive measure of one of the following units: - "em" "ex" "px" "in" "cm" "mm" "pt" "pc" "". + not a positive number or measure of one of the following units: + em, ex, in, cm, mm, pt, pc, px. <literal_block xml:space="preserve"> .. image:: picture.png :width: 50% @@ -207,8 +229,8 @@ <paragraph> Error in "image" directive: invalid option value: (option: "width"; value: \'20mc\') - not a positive measure of one of the following units: - "em" "ex" "px" "in" "cm" "mm" "pt" "pc" "%". + not a positive number or measure of one of the following units: + em, ex, in, cm, mm, pt, pc, px, %. <literal_block xml:space="preserve"> .. image:: picture.png :width: 20mc This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-20 08:32:30
|
Revision: 9935 http://sourceforge.net/p/docutils/code/9935 Author: milde Date: 2024-09-20 08:32:28 +0000 (Fri, 20 Sep 2024) Log Message: ----------- Update documentation around length specifications. Modified Paths: -------------- trunk/docutils/docs/index.rst trunk/docutils/docs/ref/rst/directives.rst trunk/docutils/docs/ref/rst/restructuredtext.rst trunk/docutils/docs/user/latex.rst trunk/docutils/docs/user/manpage.rst Modified: trunk/docutils/docs/index.rst =================================================================== --- trunk/docutils/docs/index.rst 2024-09-20 06:31:07 UTC (rev 9934) +++ trunk/docutils/docs/index.rst 2024-09-20 08:32:28 UTC (rev 9935) @@ -95,7 +95,7 @@ * `Docutils Mailing Lists <user/mailing-lists.html>`__ * `Docutils Link List <user/links.html>`__ -Writer-specific: +_`Writer-specific`: * `Docutils HTML Writers <user/html.html>`__ * `Easy Slide Shows With reStructuredText & S5 <user/slide-shows.html>`__ * `Docutils LaTeX Writer <user/latex.html>`__ Modified: trunk/docutils/docs/ref/rst/directives.rst =================================================================== --- trunk/docutils/docs/ref/rst/directives.rst 2024-09-20 06:31:07 UTC (rev 9934) +++ trunk/docutils/docs/ref/rst/directives.rst 2024-09-20 08:32:28 UTC (rev 9935) @@ -194,7 +194,7 @@ .. _HTML4: .. _html4 writer: ../../user/html.html#html4css1 .. _HTML5: -.. _html5 writer: ../../user/html.html#html5-polyglot +.. _html5 writer: ../../user/html.html#html5 .. _LaTeX: ../../user/latex.html#image-inclusion .. _ODT: ../../user/odt.html .. _manpage: ../../user/manpage.html @@ -289,9 +289,9 @@ ``scale`` : integer percentage (the "%" symbol is optional) The uniform scaling factor of the image. The default is "100 %", i.e. no scaling. - Docutils tries to determine dimensions from the image file - if no ``height`` or ``width`` options are specified - (requires the `Python Imaging Library`_). + If the output format does not support a scaling attribute (e.g. HTML), + the Docutils writer tries to determine missing size specifications from + the image file (requires the `Python Imaging Library`_). .. _target: @@ -312,8 +312,8 @@ The behaviour may change for the ODT and XML writers but images cannot be embedded in a LaTeX source. -.. [#] SVG images are directly included, other images are base64_ encoded - and included as a `data URI`_. +.. [#] The `HTML5 writer`_, embeds SVG images directly and other images + as base64_ encoded `data URI`_. .. _lazy loading attribute: https://html.spec.whatwg.org/multipage/ urls-and-fetching.html#lazy-loading-attributes @@ -1107,9 +1107,9 @@ "auto" delegates the determination of column widths to the backend (LaTeX, the HTML browser, ...). - .. TODO - Add option ``missing-cells`` with keywords "strict", "fill", "span"? - (cf. [feature-requests:#103]) +.. TODO + Add option ``missing-cells`` with keywords "strict", "fill", "span"? + (cf. [feature-requests:#103]) ---------------- @@ -2167,7 +2167,7 @@ .. image:: bild.png :alt: example picture - :name: my picture + :name: my picture is the recommended syntax alternative to a preceding `hyperlink target`_ :: @@ -2204,7 +2204,7 @@ A _`list of integers` may be comma- or whitespace-separated. :_`length`: number, optionally followed by one of the - supported `length units`_ + `supported length units`_ Handling of values without unit depends on the writer/output format. See the writer specific documentation in the `user doc`__ for details. @@ -2217,6 +2217,11 @@ The `root_prefix`_ configuration setting can be used to tell Docutils to interpret paths starting with "/" relative to a "project directory". +:_`percentage`: number followed by the percent sign '%' + + Percentage values are relative to other values, depending on the + context in which they occur. + :_`text`: free text Possible restrictions are given in parentheses. @@ -2241,8 +2246,7 @@ restructuredtext.html#external-hyperlink-targets .. _hyperlink references: restructuredtext.html#hyperlink-references .. _hyperlink target: restructuredtext.html#hyperlink-targets -.. _length units: restructuredtext.html#length-units -.. _percentage: restructuredtext.html#percentage-units +.. _supported length units: restructuredtext.html#length-units .. _reference name: .. _reference names: restructuredtext.html#reference-names .. _reStructuredText table: restructuredtext.html#tables Modified: trunk/docutils/docs/ref/rst/restructuredtext.rst =================================================================== --- trunk/docutils/docs/ref/rst/restructuredtext.rst 2024-09-20 06:31:07 UTC (rev 9934) +++ trunk/docutils/docs/ref/rst/restructuredtext.rst 2024-09-20 08:32:28 UTC (rev 9935) @@ -3072,55 +3072,66 @@ RFC3986_. -Units -===== +Measures and Units +================== -All measures consist of a positive floating point number in standard -(non-scientific) notation and a unit, possibly separated by one or -more spaces. +*Measures* consist of a positive floating point number in standard +(non-scientific) notation and an optional unit, possibly separated +by one or more spaces. -Units are only supported where explicitly mentioned in the reference -manuals. +Measures are only supported where explicitly mentioned in the reference +manuals (`directive option`_ values of type "length__" or "percentage__"). +In the `document tree`_, they are stored in attributes of type `measure`_. +.. _directive option: `directive options`_ +__ directives.html#length +__ directives.html#percentage + Length Units ------------ -The following length units are supported by the reStructuredText -parser: +The reStructuredText parser supports the `length units in CSS2`_. [#]_ +Unit identifiers are case-sensitive (in contrast to CSS): -* em (em unit, the element's font size) -* ex (ex unit, x-height of the element’s font) -* mm (millimeters; 1 mm = 1/1000 m) -* cm (centimeters; 1 cm = 10 mm) -* in (inches; 1 in = 2.54 cm = 96 px) -* px (pixels, 1 px = 1/96 in) [#]_ -* pt (points; 1 pt = 1/72 in) -* pc (picas; 1 pc = 1/6 in = 12 pt) +.. class:: align-center -This set corresponds to the `length units in CSS2`_ (a subset of `length -units in CSS3`_). +==== ======================= ================================ +em the element's font size +---- --------------------------------------------------------- +ex x-height of the element's font +---- --------------------------------------------------------- +cm centimeters 1 cm = 10 mm +mm millimeters 1 mm = 1/1000 m +in inches 1 in = 2.54 cm = 96 px +pc picas 1 pc = 1/6 in = 12 pt +pt points 1 pt = 1/72 in +px pixels 1 px = 3/4 pt = 1/96 in [#]_ +==== ======================= ================================ -.. [#] In LaTeX, the default definition is 1 px = 1/72 in (cf. `How to - configure the size of a pixel`_ in the LaTeX writer documentation). +The following are all valid length values: +"1.5em", "20 mm", ".5 in", "42". -The following are all valid length values: "1.5em", "20 mm", ".5in". +It is up to the processing system to provide a fallback/workaround or +raise an error if the output format does not support a unit or +values without unit. For the behaviour of the Docutils writers, +see the `writer documentation`_. -Length values without unit are completed with a writer-dependent -default (e.g. "px" with HTML, "pt" with `latex2e`). See the writer -specific documentation in the `user doc`__ for details. +.. [#] a subset of `length units in CSS3`_ +.. [#] In LaTeX, the default definition is 1 px = 1 pt = 1/72 in + (cf. section `Length units <../../user/latex.html#length-units>`__ + in the LaTeX writer documentation). .. _length units in CSS2: https://www.w3.org/TR/CSS2/syndata.html#length-units .. _length units in CSS3: https://www.w3.org/TR/css-values-3/#lengths -.. _How to configure the size of a pixel: - ../../user/latex.html#size-of-a-pixel -__ ../../index.html#introductory-tutorial-material-for-end-users +.. _XSL units: https://www.w3.org/TR/xsl/#d0e5752 -Percentage Units ----------------- +Percentage Unit +--------------- + Percentage values have a percent sign ("%") as unit. Percentage values are relative to other values, depending on the context in which they occur. @@ -3143,6 +3154,8 @@ .. _reStructuredText: https://docutils.sourceforge.io/rst.html .. _Docutils: https://docutils.sourceforge.io/ +.. _writer documentation: ../../index.html#writer-specific + .. _character_level_inline_markup: ../../user/config.html#character-level-inline-markup .. _footnote_references: @@ -3249,6 +3262,7 @@ .. _`<version>`: ../doctree.html#version .. _"classes" attribute: ../doctree.html#classes .. _identifier key: ../doctree.html#identifiers +.. _`measure`: ../doctree.html#measure .. _metadata title: ../doctree.html#title-attribute .. _Docutils Generic DTD: ../docutils.dtd @@ -3257,6 +3271,7 @@ ../../howto/i18n.html#docutils-language-module .. _PEP 258: ../../peps/pep-0258.html +.. _writer: .. _writers: ../../peps/pep-0258.html#writers .. _transforms: ../../api/transforms.html Modified: trunk/docutils/docs/user/latex.rst =================================================================== --- trunk/docutils/docs/user/latex.rst 2024-09-20 06:31:07 UTC (rev 9934) +++ trunk/docutils/docs/user/latex.rst 2024-09-20 08:32:28 UTC (rev 9935) @@ -86,44 +86,54 @@ .. _docutils.sty: https://ctan.org/pkg/docutils +.. _length unit: Length units ------------ -LaTeX supports all `length units`_ defined for Docutils plus the -following less common units: +The LaTeX writer supports all `reStructuredText length units`_ +with the following peculiarities: -.. class:: narrow +* In LaTeX, the size of the *pixel unit* `can be configured + <size of a "px"_>`__. It defaults to **1 px = 1/72 in** + while the `CSS3 pixel unit`_ is defined as 1 px = 1/96 in. -:dd: didôt (1 dd = 1238/1157 pt) -:cc: cîcero (1 cc = 12 dd) -:sp: scaled point (1sp = 1/65536pt) -:bp: "big" point (`DTP point`) (1 bp = 1/72 in) +* LaTeX uses "pt" for the `American point`_ (*TeX point*), 1 pt = 1/72.25 in. + The `DTP point`_ (*Postscript point*) used in CSS is available in LaTeX + as *big point*, 1 bp = 1/72 in. -The **default length unit** (added by the latex writer to length -values without unit) is the `DTP point` "bp". + Lengths specified in the source with unit "pt" are written with unit + "bp" by the LaTeX writer. In `raw LaTeX`_ and `custom style sheets`_, + the `DTP point` must be specified as "bp", while "pt" is interpreted as + `TeX point`. -.. attention:: Different definitions of the unit "pt"! +* The **default length unit** (added by the latex writer to length values + without unit) is the `DTP point` "**bp**". It will change to "px" in + Docutils 1.0. - * In Docutils (as well as CSS) the unit symbol "pt" denotes the - `Postscript point` (`DTP point`). +The TeX units: - * LaTeX uses "pt" for the typewriter's (or LaTeX) point, - which is unknown to Docutils and 0.3 % smaller. +.. class:: align-center - * The `DTP point` is available in LaTeX as "bp" (big point): +==== ========================= =================== + bp "big" point (`DTP point`) 1 bp = 1/72 in + cc cîcero 1 cc = 12 dd + dd didôt 1 dd = 1238/1157 pt + sp scaled point 1sp = 1/65536pt +==== ========================= =================== - 1 pt = 1/72.25 in < 1 bp = 1/72 in +can be used in `raw LaTeX`_ and `custom style sheets`_ but not in +reStructuredText. - Lengths specified in the document with unit "pt" will be given the - unit "bp" in the LaTeX source. +.. _CSS3 pixel unit: https://www.w3.org/TR/css-values-3/#px +.. _reStructuredText length units: + ../ref/rst/restructuredtext.html#length-units +.. _American point: + https://en.wikipedia.org/wiki/Point_(typography)#American_points +.. _DTP point: + https://en.wikipedia.org/wiki/Point_(typography)#Desktop_publishing_point - In `raw LaTeX`_ and `custom style sheets`_, the `DTP point` must be - specified as "bp", while "pt" is interpreted as `LaTeX point`. -.. _length units: ../ref/rst/restructuredtext.html#length-units - - PDF generation ============== @@ -444,7 +454,7 @@ (Command ``\DUadmonition`` with legacy-class-functions_.) Default: - Typeset in a frame (90 % of text width). + Typeset in a frame (90 % of text width). The admonition title is typeset with the ``\DUtitle`` command (see `titles`_). @@ -609,10 +619,10 @@ ``\DUdocinfowidth``: the width for the `docinfo` table. Default: - 90 % of text width: ``0.9\textwidth`` + 90 % of text width: ``0.9\textwidth`` Example: - set to 70 % of text width:: + set to 70 % of text width:: \newlength{\DUdocinfowidth} \setlength{\DUdocinfowidth}{0.7\textwidth} @@ -687,7 +697,7 @@ caption numberings. Some document classes (e.g. KOMA-script_) provide additional configuration. -Also see the related `LaTeX FAQ entry`__ +See also `The style of captions`_ in the LaTeX FAQ. Example :: @@ -697,9 +707,8 @@ .. _caption: https://ctan.org/pkg/caption .. _chngcntr: https://ctan.org/pkg/chngcntr -__ http://www.tex.ac.uk/cgi-bin/texfaq2html?label=running-nos +.. _The style of captions: https://texfaq.org/FAQ-captsty - figure placement ---------------- @@ -1203,7 +1212,6 @@ __ ../ref/rst/restructuredtext.html#line-blocks - line spacing ------------ @@ -1605,31 +1613,24 @@ __ https://docutils.sourceforge.io/docutils/docs/ref/rst/directives.html#sidebar -size of a pixel ---------------- +size of a "px" +-------------- -The *physical size* of a pixel depends on the resolution of the output -device and is usually specified in *dots per inch* (DPI). +The `length unit`_ "px" is `defined in pdfTeX and LuaTeX`__, the "XeTeX" +writer uses the ``\pdfpxdimen`` macro as workaround. -The *length unit* "px" is defined by the output format. For LaTeX, it is -`defined in pdfTeX and LuaTeX`__ (the `xetex` writer emulates this -definition). - Default: - 72 DPI, i.e. 1 px = 1/72 in. [#]_ + 1 px = 1/72 in Example: - Set the value to match the CSS definition + Set the value to match the `CSS3 pixel unit`_ 1 px = 1/96 in with the `LaTeX code`_:: \pdfpxdimen=1in - \divide\pdfpxdimen by 96 % 1/96 inch + \divide\pdfpxdimen by 96 -.. [#] The `CSS length unit ``px```_ defaults to 1/96 inch. - __ https://tex.stackexchange.com/questions/41370/ what-are-the-possible-dimensions-sizes-units-latex-understands -.. _CSS length unit ``px``: https://www.w3.org/TR/css-values-3/#px .. _reference pixel: https://www.w3.org/TR/css-values-3/#reference-pixel table style @@ -2004,23 +2005,15 @@ Why are my images too big? `````````````````````````` -HTML-browsers use the actual screen resolution (usually around -100 DPI). +In LaTeX, the size of the *pixel unit* defaults to 1 px = 1/72 in +while the `CSS3 pixel unit`_ is defined as 1 px = 1/96 in. -The CSS specification suggests: - - It is recommended that the reference pixel be the visual angle of one - pixel on a device with a pixel density of 96 DPI and a distance from the - reader of an arm's length. - - -- https://www.w3.org/TR/CSS2/syndata.html#length-units - This is why pixmap images without size specification or objects with a size -specified in ``px`` tend to come too large in the PDF. +specified in ``px`` tend to come out too large in the PDF. Solution: - Specify the image size in fixed units (``pt``, ``cm``, ``in``) or - configure the `size of a pixel`_ (length unit px). + Specify the image size in fixed `length units`_ (``pt``, ``cm``, ``in``, …) + or configure the `size of a "px"`_. Error ``illegal unit px`` @@ -2033,11 +2026,7 @@ `pdfTeX` is used also for conversion into DVI format in all modern LaTeX distributions (since ca. 2006). -If updating LaTeX is not an option, just remove the "px" from the length -specification. HTML/CSS will default to "px" while the `latexe2` writer -will add the fallback unit "bp". - Error ``Symbol \textcurrency not provided`` ... ``````````````````````````````````````````````` @@ -2048,15 +2037,13 @@ (textcomp) font family ptm in TS1 encoding. (textcomp) Default family used instead. -(which in case of font family "ptm" is a false positive). Add either +(which in case of font family "ptm" is a false positive). -:warn: turn the error in a warning, use the default symbol (bitmap), or -:force,almostfull: use the symbol provided by the font at the users - risk, +Add either ``warn`` (turn the error in a warning, use the default (bitmap) +symbol), or ``force,almostfull`` (use the symbol provided by the font at +the users risk) to the document options or use a different font package. -to the document options or use a different font package. - Warning: language … not supported ````````````````````````````````` Modified: trunk/docutils/docs/user/manpage.rst =================================================================== --- trunk/docutils/docs/user/manpage.rst 2024-09-20 06:31:07 UTC (rev 9934) +++ trunk/docutils/docs/user/manpage.rst 2024-09-20 08:32:28 UTC (rev 9935) @@ -146,14 +146,27 @@ offers opening the standard browser to that URI ... assuming OSC8 is supported. -References -========== -Consult man pages from section 7: *man*, *man-pages*, *groff_man* and -*groff_man_style*. +Limitations +=========== -.. [LMHT] `Linux Man Page Howto <https://tldp.org/HOWTO/Man-Page/>`__. +The "manpage" writer does not support all `Docutils Document Tree`_ elements +but a subset that is relevant for manual pages. +The output is pure text, images are not included. Instead, the text +description in their `"alt" attribute`_ is shown. + +.. TODO: a warning is given for image elements without `"alt" attribute`_. + +The "manpage" writer ignores element attributes specifying a measure_. + +.. _measure: ../ref/doctree.html#measure +.. _"alt" attribute: ../ref/doctree.html#alt + +.. groff supports the CSS2 units except "ex", "mm", and "px" + https://www.gnu.org/software/groff/manual/groff.html#Measurements + + Conventions =========== @@ -176,8 +189,9 @@ but this is not done on typesetting devices like printers. Check your output with a PostScript or PDF viewer before printing it. -* [LMHT]_ Filenames are always in italics, except in C language - preprocessor inclusions in the SYNOPSIS section. Use:: +* Filenames are always in italics, except in C language + preprocessor inclusions in the SYNOPSIS section. [LMHT]_ + Use:: .I /usr/include/stdio.h @@ -185,4 +199,14 @@ .B #include <stdio.h> + +References +========== + +Consult man pages from section 7: *man*, *man-pages*, *groff_man* and +*groff_man_style*. + +.. [LMHT] `Linux Man Page Howto <https://tldp.org/HOWTO/Man-Page/>`__. + .. _Docutils: https://docutils.sourceforge.io/ +.. _Docutils Document Tree: ../ref/doctree.html This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-20 06:31:15
|
Revision: 9934 http://sourceforge.net/p/docutils/code/9934 Author: milde Date: 2024-09-20 06:31:07 +0000 (Fri, 20 Sep 2024) Log Message: ----------- ODT writer: report warnings with source line. Add "base_node" argument to calls of `reporter.warning()` so that the warning is completed with the source line to blame. Modified Paths: -------------- trunk/docutils/docutils/writers/odf_odt/__init__.py Modified: trunk/docutils/docutils/writers/odf_odt/__init__.py =================================================================== --- trunk/docutils/docutils/writers/odf_odt/__init__.py 2024-09-20 06:30:59 UTC (rev 9933) +++ trunk/docutils/docutils/writers/odf_odt/__init__.py 2024-09-20 06:31:07 UTC (rev 9934) @@ -1556,10 +1556,12 @@ self.pending_ids += node['ids'] def default_visit(self, node) -> None: - self.document.reporter.warning('missing visit_%s' % (node.tagname, )) + self.document.reporter.warning(f'missing visit_{node.tagname}', + base_node=node) def default_departure(self, node) -> None: - self.document.reporter.warning('missing depart_%s' % (node.tagname, )) + self.document.reporter.warning(f'missing depart_{node.tagname}', + base_node=node) def visit_Text(self, node) -> None: # Skip nodes whose text has been processed in parent nodes. @@ -2135,7 +2137,7 @@ source = os.path.join(dirname, source) if not self.check_file_exists(source): self.document.reporter.warning( - f'Cannot find image file "{source}".') + f'Cannot find image file "{source}".', base_node=node) return if source in self.image_dict: filename, destination = self.image_dict[source] @@ -2151,7 +2153,8 @@ content = imgfile.read() except urllib.error.URLError as err: self.document.reporter.warning( - f'Cannot open image URL "{source}". {err}') + f'Cannot open image URL "{source}". {err}', + base_node=node) return with tempfile.NamedTemporaryFile('wb', delete=False) as imgfile2: @@ -2204,9 +2207,8 @@ size, unit = self.convert_to_cm(size) except ValueError as exp: self.document.reporter.warning( - 'Invalid %s for image: "%s". ' - 'Error: "%s".' % ( - attr, node.attributes[attr], exp)) + f'Invalid {attr} for image: "{node.attributes[attr]}". ' + f'Error: "{exp}".', base_node=node) size, unit = 0.5, 'cm' # fallback to avoid consequential error return size, unit @@ -2241,7 +2243,7 @@ scale = node.attributes['scale'] if scale < 1: self.document.reporter.warning( - 'scale out of range (%s), using 1.' % (scale, )) + f'scale out of range ({scale}), using 1.', base_node=node) scale = 1 scale = scale * 0.01 else: @@ -2256,9 +2258,10 @@ dpi = (96, 96) # image resolution in pixel per inch if width is None or height is None: if PIL is None: - raise RuntimeError( - 'image size not fully specified and PIL not installed') - # TODO: catch error and warn (similar to unsupported units). + self.document.reporter.warning( + 'image size not fully specified and PIL not installed', + base_node=node) + return '0.5cm', '0.5cm' # prevent consequential error filename, destination = self.image_dict[source] with PIL.Image.open(filename, 'r') as img: img_size = img.size @@ -2888,7 +2891,8 @@ }) else: self.document.reporter.warning( - 'References must have "refuri" or "refid" attribute.') + 'References must have "refuri" or "refid" attribute.', + base_node=node) if (self.in_table_of_contents and len(node.children) >= 1 and isinstance(node.children[0], docutils.nodes.generated)): @@ -2967,8 +2971,8 @@ # If we can't find the table style, issue warning # and use the default table style. self.document.reporter.warning( - 'Can\'t find table style "%s". Using default.' % ( - table_name, )) + f'Can\'t find table style "{table_name}". Using default.', + base_node=node) table_name = TABLENAMEDEFAULT table_style = self.table_styles.get(table_name) if table_style is None: @@ -2975,9 +2979,8 @@ # If we can't find the default table style, issue a warning # and use a built-in default style. self.document.reporter.warning( - 'Can\'t find default table style "%s". ' - 'Using built-in default.' % ( - table_name, )) + f'Can\'t find default table style "{table_name}". ' + 'Using built-in default.', base_node=node) table_style = BUILTIN_DEFAULT_TABLE_STYLE else: table_name = TABLENAMEDEFAULT @@ -2986,9 +2989,8 @@ # If we can't find the default table style, issue a warning # and use a built-in default style. self.document.reporter.warning( - 'Can\'t find default table style "%s". ' - 'Using built-in default.' % ( - table_name, )) + 'Can\'t find default table style "{table_name}". ' + 'Using built-in default.', base_node=node) table_style = BUILTIN_DEFAULT_TABLE_STYLE return table_style @@ -3157,10 +3159,9 @@ section_level = self.section_level if section_level > 7: self.document.reporter.warning( - 'Heading/section levels greater than 7 not supported.') - self.document.reporter.warning( + 'Heading/section levels greater than 7 not supported.' ' Reducing to heading level 7 for heading: "%s"' % ( - node.astext(), )) + node.astext(), ), base_node=node) section_level = 7 el1 = self.append_child( 'text:h', attrib={ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-20 06:31:01
|
Revision: 9933 http://sourceforge.net/p/docutils/code/9933 Author: milde Date: 2024-09-20 06:30:59 +0000 (Fri, 20 Sep 2024) Log Message: ----------- Revise/fix handling of length specification in the ODT writer. Use "px" as fallback unit for unitless image size attributes. Fix conversion factor of "pc" (pica) to "cm". Fix conversion of image width in "%" if the height is specified. Adjust fallback DPI value (currently not used) to match CSS units. Document that PIL/Pillow is always required if images are inserted without specifying width and height, also if "scale" is not used. Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/docs/user/odt.rst trunk/docutils/docutils/writers/odf_odt/__init__.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2024-09-19 10:20:44 UTC (rev 9932) +++ trunk/docutils/HISTORY.rst 2024-09-20 06:30:59 UTC (rev 9933) @@ -181,6 +181,13 @@ - `null.Writer.translate()` sets `self.output` to the empty string. +* docutils/writers/odf_odt/__init__.py + + - Use "px" as fallback unit for unitless image size attributes. + - Fix conversion factor of "pc" (pica) to "cm". + - Fix conversion of image width in "%" if the height is specified. + - Adjust fallback DPI value (currently not used) to match CSS units. + * tools/rst2odt.py - Use `core.publish_file()` instead of `core.publish_file_to_binary()`. Modified: trunk/docutils/docs/user/odt.rst =================================================================== --- trunk/docutils/docs/user/odt.rst 2024-09-19 10:20:44 UTC (rev 9932) +++ trunk/docutils/docs/user/odt.rst 2024-09-20 06:30:59 UTC (rev 9933) @@ -39,8 +39,8 @@ highlighting of code in literal blocks. See section `Syntax highlighting`_. -- Optional -- `Python Imaging Library`_ (PIL) is required if on an - image or figure directive, you specify ``scale`` but not ``width`` +- Optional -- `Python Imaging Library`_ (PIL/Pillow_) is required if + you use the image or figure directive but don't specify ``width`` and ``height``. See section `Images and figures`_. @@ -975,23 +975,21 @@ Images and figures ------------------ -If on the image or the figure directive you provide the scale option -but do not provide the width and height options, then ``odtwriter`` -will attempt to determine the size of the image using the `Python -Imaging Library`_ (PIL). If ``odtwriter`` cannot find and import +The ODT Writer only supports fixed `length units`_ ("cm", "mm", "in", +"pc", "pt", "px) for the size attributes "width", and "height". +The fallback unit (used for attribute values without unit) is "px". + +If on the image or the figure directive you do not provide the width +and height options, then ``odtwriter`` will attempt to determine the +size of the image using the Python Imaging Library (PIL/Pillow_). +If ``odtwriter`` cannot find and import the Python Imaging Library, it will raise an exception. If this ocurrs, you can fix it by doing one of the following: - Install the Python Imaging Library or -- Remove the ``scale`` option or - - Add both the ``width`` and the ``height`` options. -So, the rule is: if on any image or figure, you specify scale but -not both width and height, you must install the `Python Imaging -Library`_ library. - For more information about PIL, see: `Python Imaging Library`_. @@ -1188,6 +1186,8 @@ tools.html#rst2odt .. _reStructuredText: ../ref/rst/restructuredtext.html +.. _length units: + ../ref/rst/restructuredtext.html#length-units .. _`OpenDocument Text`: https://en.wikipedia.org/wiki/OpenDocument .. _LibreOffice: @@ -1196,3 +1196,4 @@ https://pygments.org/ .. _`Python Imaging Library`: https://en.wikipedia.org/wiki/Python_Imaging_Library +.. _`Pillow`: https://pypi.org/project/pillow/ Modified: trunk/docutils/docutils/writers/odf_odt/__init__.py =================================================================== --- trunk/docutils/docutils/writers/odf_odt/__init__.py 2024-09-19 10:20:44 UTC (rev 9932) +++ trunk/docutils/docutils/writers/odf_odt/__init__.py 2024-09-20 06:30:59 UTC (rev 9933) @@ -2207,6 +2207,7 @@ 'Invalid %s for image: "%s". ' 'Error: "%s".' % ( attr, node.attributes[attr], exp)) + size, unit = 0.5, 'cm' # fallback to avoid consequential error return size, unit def convert_to_cm(self, size): @@ -2223,13 +2224,15 @@ elif size.endswith('pt'): size = float(size[:-2]) * 0.035 # convert pt to cm elif size.endswith('pc'): - size = float(size[:-2]) * 2.371 # convert pc to cm + size = float(size[:-2]) * 0.423 # convert pc to cm elif size.endswith('mm'): size = float(size[:-2]) * 0.1 # convert mm to cm elif size.endswith('cm'): size = float(size[:-2]) + elif size[-1:] in '0123456789.': # no unit, use px + size = float(size) * 0.026 # convert px to cm else: - raise ValueError('unknown unit type') + raise ValueError('unit not supported with ODT') unit = 'cm' return size, unit @@ -2250,8 +2253,12 @@ scale = self.get_image_scale(node) width, width_unit = self.get_image_width_height(node, 'width') height, _ = self.get_image_width_height(node, 'height') - dpi = (72, 72) - if PIL is not None and source in self.image_dict: + dpi = (96, 96) # image resolution in pixel per inch + if width is None or height is None: + if PIL is None: + raise RuntimeError( + 'image size not fully specified and PIL not installed') + # TODO: catch error and warn (similar to unsupported units). filename, destination = self.image_dict[source] with PIL.Image.open(filename, 'r') as img: img_size = img.size @@ -2261,26 +2268,19 @@ iter(dpi) except TypeError: dpi = (dpi, dpi) - else: - img_size = None - if width is None or height is None: - if img_size is None: - raise RuntimeError( - 'image size not fully specified and PIL not installed') - if width is None: - width = img_size[0] - width = float(width) * 0.026 # convert px to cm + # TODO: use dpi when converting px to cm + if width is None: + width = img_size[0] * 0.026 # convert px to cm + if height is None and width_unit != '%': + height = img_size[1] * 0.026 # convert px to cm + if width_unit == '%': + factor = width + line_width = self.get_page_width() + width = factor * line_width if height is None: - height = img_size[1] - height = float(height) * 0.026 # convert px to cm - if width_unit == '%': - factor = width - image_width = img_size[0] - image_width = float(image_width) * 0.026 # convert px to cm - image_height = img_size[1] - image_height = float(image_height) * 0.026 # convert px to cm - line_width = self.get_page_width() - width = factor * line_width + # scale proportionally + image_width = img_size[0] * 0.026 # convert px to cm + image_height = img_size[1] * 0.026 # convert px to cm factor = (factor * line_width) / image_width height = factor * image_height width *= scale This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-19 10:20:46
|
Revision: 9932 http://sourceforge.net/p/docutils/code/9932 Author: milde Date: 2024-09-19 10:20:44 +0000 (Thu, 19 Sep 2024) Log Message: ----------- Revise/fix handling of length specifications. Don't use the generic number-formatter "g" to drop trailing zeroes in `nodes.validate_measure()` to avoid writing large values in scientific format (which is not supported in reStructuredText). Instead, `nodes.parse_measure()` returns an `int` if possible so that converting to `str` does not add a trailing zero in the first place. Refactor `writers._html_base.HTMLTranslator.image_size()`. (Using the "g"-formatter in the HTML writer is no problem, as the scientific format is valid in CSS and "style" attribute values.) Simplify `writers.latex2e.LaTeXTranslator.to_latex_length()`: Use `nodes.parse_measure()`. Move XeTeX-specific code to the "XeTeX" writer. Drop trailing zeroes. (Using "g" with percentage values is considered safe, as a "width" value larger than 10 000 000 % leads to output problems anyway.) Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/RELEASE-NOTES.rst trunk/docutils/docutils/nodes.py trunk/docutils/docutils/writers/_html_base.py trunk/docutils/docutils/writers/latex2e/__init__.py trunk/docutils/docutils/writers/xetex/__init__.py trunk/docutils/test/functional/expected/latex_cornercases.tex trunk/docutils/test/functional/expected/latex_memoir.tex trunk/docutils/test/functional/expected/standalone_rst_latex.tex trunk/docutils/test/functional/expected/standalone_rst_xetex.tex Added Paths: ----------- trunk/docutils/test/test_writers/test_xetex_misc.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/HISTORY.rst 2024-09-19 10:20:44 UTC (rev 9932) @@ -156,8 +156,10 @@ * docutils/writers/latex2e/__init__.py - - Remove optional argument `pxunit` of `LaTeXTranslator.to_latex_length()` - (ignored since at least 2012). + - `LaTeXTranslator.to_latex_length()`: + remove optional argument `pxunit` (ignored since at least 2012), + drop trailing zeroes from length values, + move XeTeX-specific code to the "xetex" writer. - Don't wrap references with custom reference-label_ in a ``\hyperref`` command. - Provide an "unknown_references_resolver" (cf. `docutils/TransformSpec`) @@ -179,7 +181,7 @@ - `null.Writer.translate()` sets `self.output` to the empty string. -* tools/rst2odt_prepstyles.py +* tools/rst2odt.py - Use `core.publish_file()` instead of `core.publish_file_to_binary()`. Modified: trunk/docutils/RELEASE-NOTES.rst =================================================================== --- trunk/docutils/RELEASE-NOTES.rst 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/RELEASE-NOTES.rst 2024-09-19 10:20:44 UTC (rev 9932) @@ -102,6 +102,11 @@ - Remove ``use_verbatim_when_possible`` setting (use literal_block_env_: verbatim) in Docutils 2.0. + - The `default length unit`__ will change from "bp" (DTP point) + to "px" (pixel unit) in Docutils 1.0. + + __ docs/user/latex.html#length-units + Misc ---- Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/docutils/nodes.py 2024-09-19 10:20:44 UTC (rev 9932) @@ -37,6 +37,7 @@ # import docutils.transforms # -> conditional import in document.__init__() if TYPE_CHECKING: + import numbers from collections.abc import (Callable, Iterable, Iterator, Mapping, Sequence) from types import ModuleType @@ -3074,7 +3075,7 @@ return '"%s"' % value -def parse_measure(measure: str) -> tuple[float, str]: +def parse_measure(measure: str) -> tuple[numbers.Rational, str]: """Parse a measure__, return value + optional unit. __ https://docutils.sourceforge.io/docs/ref/doctree.html#measure @@ -3083,7 +3084,10 @@ """ match = re.fullmatch('(-?[0-9.]+) *([a-zA-Zµ]*|%?)', measure) try: - value = float(match.group(1)) + try: + value = int(match.group(1)) + except ValueError: + value = float(match.group(1)) unit = match.group(2) except (AttributeError, ValueError): raise ValueError(f'"{measure}" is no valid measure.') @@ -3168,7 +3172,7 @@ __ https://docutils.sourceforge.io/docs/ref/doctree.html#measure """ value, unit = parse_measure(measure) - return f'{value:g}{unit}' + return f'{value}{unit}' def validate_NMTOKEN(value: str) -> str: Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/docutils/writers/_html_base.py 2024-09-19 10:20:44 UTC (rev 9932) @@ -40,9 +40,8 @@ from docutils.utils.math import (latex2mathml, math2html, tex2mathml_extern, unichar2tex, wrap_math_code, MathError) - if TYPE_CHECKING: - from numbers import Real + from docutils.transforms import Transform class Writer(writers.Writer): @@ -157,7 +156,7 @@ 'html_prolog', 'html_head', 'html_title', 'html_subtitle', 'html_body') - def get_transforms(self): + def get_transforms(self) -> list[type[Transform]]: return super().get_transforms() + [writer_aux.Admonitions] def translate(self) -> None: @@ -167,11 +166,10 @@ setattr(self, attr, getattr(visitor, attr)) self.output = self.apply_template() - def apply_template(self): + def apply_template(self) -> str: template_path = Path(self.document.settings.template) template = template_path.read_text(encoding='utf-8') - subs = self.interpolation_dict() - return template % subs + return template % self.interpolation_dict() def interpolation_dict(self): subs = {} @@ -416,36 +414,31 @@ def image_size(self, node: nodes.image) -> dict[str, str]: """Determine the image size from node arguments or the image file. + Return as dictionary of <img> attributes, + e.g., ``{height': '32', 'style': 'width: 4 em;'}``. + Auxiliary method called from `self.visit_image()`. - Provisional. """ - # List with optional width and height measures ((value, unit)-tuples) - measures: list[tuple[Real, str] | None] = [None, None] dimensions = ('width', 'height') - for i, dimension in enumerate(dimensions): + measures = {} # (value, unit)-tuples) for width and height + for dimension in dimensions: if dimension in node: - measures[i] = nodes.parse_measure(node[dimension]) - if None in measures and 'scale' in node: + measures[dimension] = nodes.parse_measure(node[dimension]) + if 'scale' in node and len(measures) < 2: # supplement with (unitless) values read from image file imgsize = self.read_size_with_PIL(node) if imgsize: - measures = [measure or (imgvalue, '') - for measure, imgvalue in zip(measures, imgsize)] - # scale values - factor = node.get('scale', 100) / 100 # scaling factor - if factor != 1: - measures = [(measure[0] * factor, measure[1]) - for measure in measures if measure] - # format as <img> attributes, - # use "width" and "hight" for unitless values and "style" else, - # e.g., height': '32' 'style': 'width: 4 em;'}``: - size_atts = {} # attributes "width", "height", or "style" + for dimension, value in zip(dimensions, imgsize): + if dimension not in measures: + measures[dimension] = (value, '') + # Scale and format as <img> attributes, + # use "width" and "hight" for unitless values and "style" else: + scaling_factor = node.get('scale', 100) / 100 + size_atts = {} declarations = [] # declarations for the "style" attribute - for dimension, measure in zip(dimensions, measures): - if measure is None: - continue - value, unit = measure + for dimension, (value, unit) in measures.items(): + value *= scaling_factor if unit: declarations.append(f'{dimension}: {value:g}{unit};') else: Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-19 10:20:44 UTC (rev 9932) @@ -2390,27 +2390,17 @@ self.requirements['~header'] = ''.join(self.out) self.pop_output_collector() - def to_latex_length(self, length_str): - """Convert `length_str` with rst length to LaTeX length + def to_latex_length(self, length_str: str) -> str: + """Convert "measure" `length_str` to LaTeX length specification. + + Note: the default length unit will change from "bp" + (Postscript point) to "px" in Docutils 1.0. """ - match = re.match(r'(\d*\.?\d*)\s*(\S*)', length_str) - if not match: - return length_str - value, unit = match.groups()[:2] - # no unit or "DTP" points (called 'bp' in TeX): - if unit in ('', 'pt'): - length_str = '%sbp' % value - # percentage: relate to current line width - elif unit == '%': - length_str = '%.3f\\linewidth' % (float(value)/100.0) - elif self.is_xetex and unit == 'px': - # XeTeX does not know the length unit px. - # Use \pdfpxdimen, the macro to set the value of 1 px in pdftex. - # This way, configuring works the same for pdftex and xetex. - if not self.fallback_stylesheet: - self.fallbacks['_providelength'] = PreambleCmds.providelength - self.fallbacks['px'] = '\n\\DUprovidelength{\\pdfpxdimen}{1bp}\n' - length_str = r'%s\pdfpxdimen' % value + value, unit = nodes.parse_measure(length_str) + if unit in ('', 'pt'): # no unit or "Postscript points" + return f'{value}bp' # LaTeX uses symbol "bp" + if unit == '%': # percentage: relate to current line width + return f'{value/100:g}\\linewidth' return length_str def visit_image(self, node) -> None: Modified: trunk/docutils/docutils/writers/xetex/__init__.py =================================================================== --- trunk/docutils/docutils/writers/xetex/__init__.py 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/docutils/writers/xetex/__init__.py 2024-09-19 10:20:44 UTC (rev 9932) @@ -24,6 +24,7 @@ from docutils import frontend from docutils.writers import latex2e +from docutils.writers.latex2e import PreambleCmds class Writer(latex2e.Writer): @@ -145,3 +146,18 @@ else: self.requirements['_inputenc'] = (r'\XeTeXinputencoding %s ' % self.latex_encoding) + + def to_latex_length(self, length_str: str) -> str: + """Convert "measure" `length_str` to LaTeX length specification. + + XeTeX does not know the length unit px. + Use ``\\pdfpxdimen``, the macro holding the value of 1 px in pdfTeX. + This way, configuring works the same for pdftex and xetex. + """ + length_str = super().to_latex_length(length_str) + if length_str.endswith('px'): + if not self.fallback_stylesheet: + self.fallbacks['_providelength'] = PreambleCmds.providelength + self.fallbacks['px'] = '\n\\DUprovidelength{\\pdfpxdimen}{1bp}\n' + return length_str.replace('px', '\\pdfpxdimen') + return length_str Modified: trunk/docutils/test/functional/expected/latex_cornercases.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_cornercases.tex 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/test/functional/expected/latex_cornercases.tex 2024-09-19 10:20:44 UTC (rev 9932) @@ -305,11 +305,11 @@ Image with 20\% width: -\includegraphics[width=0.200\linewidth]{../../../docs/user/rst/images/title.png} +\includegraphics[width=0.2\linewidth]{../../../docs/user/rst/images/title.png} Image with 100\% width: -\includegraphics[width=1.000\linewidth]{../../../docs/user/rst/images/title.png} +\includegraphics[width=1\linewidth]{../../../docs/user/rst/images/title.png} \section{Tables% @@ -548,7 +548,7 @@ The \DUroletitlereference{width} option overrides \textquotedbl{}auto\textquotedbl{} \DUroletitlereference{widths} as standard LaTeX tables don't have a global width setting: -\setlength{\DUtablewidth}{\dimexpr0.600\linewidth-5\arrayrulewidth\relax}% +\setlength{\DUtablewidth}{\dimexpr0.6\linewidth-5\arrayrulewidth\relax}% \begin{longtable}{|p{\DUcolumnwidth{0.400}}|p{\DUcolumnwidth{0.200}}|p{\DUcolumnwidth{0.200}}|p{\DUcolumnwidth{0.200}}|} \caption{This table has \DUroletitlereference{widths} \textquotedbl{}auto\textquotedbl{} (ignored) and \DUroletitlereference{width} 60\%.}\\ \hline Modified: trunk/docutils/test/functional/expected/latex_memoir.tex =================================================================== --- trunk/docutils/test/functional/expected/latex_memoir.tex 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/test/functional/expected/latex_memoir.tex 2024-09-19 10:20:44 UTC (rev 9932) @@ -816,7 +816,7 @@ An image directive (also clickable -{}- a hyperlink reference): -\hyperref[directives]{\includegraphics[width=0.700\linewidth]{../../../docs/user/rst/images/title.png}} +\hyperref[directives]{\includegraphics[width=0.7\linewidth]{../../../docs/user/rst/images/title.png}} Image with multiple IDs: @@ -858,7 +858,7 @@ Relative units allow adaption of the image to the screen or paper size. An image occupying 50\% of the line width: -\includegraphics[width=0.500\linewidth]{../../../docs/user/rst/images/title.png} +\includegraphics[width=0.5\linewidth]{../../../docs/user/rst/images/title.png} A \emph{figure} is an image with a caption and/or a legend. With page-based output media, figures might float to a different position if this helps the page @@ -1670,7 +1670,7 @@ Here's a list table exercising all features: \begin{DUclass}{test} -\setlength{\DUtablewidth}{0.950\linewidth}% +\setlength{\DUtablewidth}{0.95\linewidth}% \begin{longtable}{|p{0.133\DUtablewidth}|p{0.110\DUtablewidth}|p{0.249\DUtablewidth}|} \caption{list table with integral header}\\ \hline @@ -1832,7 +1832,7 @@ \begin{description} \item[{Math-Accents:}] \leavevmode -\setlength{\DUtablewidth}{1.000\linewidth}% +\setlength{\DUtablewidth}{1\linewidth}% \begin{longtable*}{p{0.315\DUtablewidth}p{0.315\DUtablewidth}p{0.315\DUtablewidth}} $\acute{a}$ \texttt{\textbackslash{}acute\{a\}} Modified: trunk/docutils/test/functional/expected/standalone_rst_latex.tex =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2024-09-19 10:20:44 UTC (rev 9932) @@ -817,7 +817,7 @@ An image directive (also clickable – a hyperlink reference): -\hyperref[directives]{\includegraphics[width=0.700\linewidth]{../../../docs/user/rst/images/title.png}} +\hyperref[directives]{\includegraphics[width=0.7\linewidth]{../../../docs/user/rst/images/title.png}} Image with multiple IDs: @@ -859,7 +859,7 @@ Relative units allow adaption of the image to the screen or paper size. An image occupying 50\% of the line width: -\includegraphics[width=0.500\linewidth]{../../../docs/user/rst/images/title.png} +\includegraphics[width=0.5\linewidth]{../../../docs/user/rst/images/title.png} A \emph{figure} is an image with a caption and/or a legend. With page-based output media, figures might float to a different position if this helps the page @@ -1692,7 +1692,7 @@ Here’s a list table exercising all features: \begin{DUclass}{test} -\setlength{\DUtablewidth}{0.950\linewidth}% +\setlength{\DUtablewidth}{0.95\linewidth}% \begin{longtable}{|p{0.133\DUtablewidth}|p{0.110\DUtablewidth}|p{0.249\DUtablewidth}|} \caption{list table with integral header}\\ \hline @@ -1854,7 +1854,7 @@ \begin{description} \item[{Math-Accents:}] \leavevmode -\setlength{\DUtablewidth}{1.000\linewidth}% +\setlength{\DUtablewidth}{1\linewidth}% \begin{longtable*}{p{0.315\DUtablewidth}p{0.315\DUtablewidth}p{0.315\DUtablewidth}} $\acute{a}$ \texttt{\textbackslash{}acute\{a\}} Modified: trunk/docutils/test/functional/expected/standalone_rst_xetex.tex =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_xetex.tex 2024-09-15 11:13:43 UTC (rev 9931) +++ trunk/docutils/test/functional/expected/standalone_rst_xetex.tex 2024-09-19 10:20:44 UTC (rev 9932) @@ -852,7 +852,7 @@ An image directive (also clickable – a hyperlink reference): -\hyperref[directives]{\includegraphics[width=0.700\linewidth]{../../../docs/user/rst/images/title.png}} +\hyperref[directives]{\includegraphics[width=0.7\linewidth]{../../../docs/user/rst/images/title.png}} Image with multiple IDs: @@ -894,7 +894,7 @@ Relative units allow adaption of the image to the screen or paper size. An image occupying 50\% of the line width: -\includegraphics[width=0.500\linewidth]{../../../docs/user/rst/images/title.png} +\includegraphics[width=0.5\linewidth]{../../../docs/user/rst/images/title.png} A \emph{figure} is an image with a caption and/or a legend. With page-based output media, figures might float to a different position if this helps the page @@ -1731,7 +1731,7 @@ Here’s a list table exercising all features: \begin{DUclass}{test} -\setlength{\DUtablewidth}{0.950\linewidth}% +\setlength{\DUtablewidth}{0.95\linewidth}% \begin{longtable}{|p{0.133\DUtablewidth}|p{0.110\DUtablewidth}|p{0.249\DUtablewidth}|} \caption{list table with integral header}\\ \hline @@ -1893,7 +1893,7 @@ \begin{description} \item[{Math-Accents:}] \leavevmode -\setlength{\DUtablewidth}{1.000\linewidth}% +\setlength{\DUtablewidth}{1\linewidth}% \begin{longtable*}{p{0.315\DUtablewidth}p{0.315\DUtablewidth}p{0.315\DUtablewidth}} $\acute{a}$ \texttt{\textbackslash{}acute\{a\}} Added: trunk/docutils/test/test_writers/test_xetex_misc.py =================================================================== --- trunk/docutils/test/test_writers/test_xetex_misc.py (rev 0) +++ trunk/docutils/test/test_writers/test_xetex_misc.py 2024-09-19 10:20:44 UTC (rev 9932) @@ -0,0 +1,78 @@ +#! /usr/bin/env python3 +# $Id$ +# Author: Günter Milde +# Maintainer: doc...@li... +# :Copyright: 2024 Günter Milde, +# :License: Released under the terms of the `2-Clause BSD license`_, in short: +# +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided the copyright +# notice and this notice are preserved. +# This file is offered as-is, without any warranty. +# +# .. _2-Clause BSD license: https://opensource.org/licenses/BSD-2-Clause + +""" +Miscellaneous XeTeX/LuaTeX writer tests. +""" + +from pathlib import Path +import sys +import unittest + + +if __name__ == '__main__': + # prepend the "docutils root" to the Python library path + # so we import the local `docutils` package. + sys.path.insert(0, str(Path(__file__).resolve().parents[2])) + +from docutils import core +from docutils.writers import xetex + +# TEST_ROOT is ./test/ from the docutils root +TEST_ROOT = Path(__file__).parents[1] +DATA_ROOT = TEST_ROOT / 'data' + +px_sample = """\ +.. image:: foo.pdf + :width: 250 px + :height: 50pt +""" + +px_body = r""" +\includegraphics[height=50bp,width=250\pdfpxdimen]{foo.pdf} +""" + +px_fallback = r""" +% Provide a length variable and set default, if it is new +\providecommand*{\DUprovidelength}[2]{ + \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{} +} + +\DUprovidelength{\pdfpxdimen}{1bp} + + +""" + + +class PublishTestCase(unittest.TestCase): + maxDiff = None + + settings = {'_disable_config': True, + # avoid latex writer future warnings: + 'use_latex_citations': False, + 'legacy_column_widths': False, + } + + def test_px_workaround(self): + """Check the workaround for length unit 'px' missing in XeTeX. + """ + parts = core.publish_parts(px_sample, + writer=xetex.Writer(), + settings_overrides=self.settings) + self.assertEqual(px_body, parts['body']) + self.assertEqual(px_fallback, parts['fallbacks']) + + +if __name__ == '__main__': + unittest.main() Property changes on: trunk/docutils/test/test_writers/test_xetex_misc.py ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-15 11:13:45
|
Revision: 9931 http://sourceforge.net/p/docutils/code/9931 Author: milde Date: 2024-09-15 11:13:43 +0000 (Sun, 15 Sep 2024) Log Message: ----------- HTML writers: Add "px" to unitless table "width" values. The table "width" attribute is of type "length", with optional unit. The writers must ensure there is a unit when converting a length to a HTML "style" attribute rule. For HTML writers, the default length unit is "px". Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/docutils/writers/_html_base.py trunk/docutils/docutils/writers/html4css1/__init__.py trunk/docutils/docutils/writers/html5_polyglot/__init__.py trunk/docutils/test/test_writers/test_html4css1.py trunk/docutils/test/test_writers/test_html5_polyglot.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2024-09-13 08:13:03 UTC (rev 9930) +++ trunk/docutils/HISTORY.rst 2024-09-15 11:13:43 UTC (rev 9931) @@ -147,10 +147,12 @@ - Make MathML the default math_output_. - Revise image size handling methods, use "width" and "height" attributes for unitless values. + - Add "px" to unitless table "width" values. * docutils/writers/html4css1/__init__.py - Keep default math_output_ value "HTML math.css". + - Add "px" to unitless table "width" values. * docutils/writers/latex2e/__init__.py Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2024-09-13 08:13:03 UTC (rev 9930) +++ trunk/docutils/docutils/writers/_html_base.py 2024-09-15 11:13:43 UTC (rev 9931) @@ -1693,7 +1693,10 @@ if 'align' in node: atts['classes'].append('align-%s' % node['align']) if 'width' in node: - atts['style'] = 'width: %s;' % node['width'] + width = node['width'] + if width[-1:] in '0123456789.': # unitless value + width += 'px' # add default length unit + atts['style'] = f'width: {width};' tag = self.starttag(node, 'table', **atts) self.body.append(tag) Modified: trunk/docutils/docutils/writers/html4css1/__init__.py =================================================================== --- trunk/docutils/docutils/writers/html4css1/__init__.py 2024-09-13 08:13:03 UTC (rev 9930) +++ trunk/docutils/docutils/writers/html4css1/__init__.py 2024-09-15 11:13:43 UTC (rev 9931) @@ -866,7 +866,10 @@ if 'align' in node: classes.append('align-%s' % node['align']) if 'width' in node: - atts['style'] = 'width: %s' % node['width'] + width = node['width'] + if width[-1:] in '0123456789.': # unitless value + width += 'px' # add default length unit + atts['style'] = f'width: {width}' self.body.append( self.starttag(node, 'table', CLASS=' '.join(classes), **atts)) Modified: trunk/docutils/docutils/writers/html5_polyglot/__init__.py =================================================================== --- trunk/docutils/docutils/writers/html5_polyglot/__init__.py 2024-09-13 08:13:03 UTC (rev 9930) +++ trunk/docutils/docutils/writers/html5_polyglot/__init__.py 2024-09-15 11:13:43 UTC (rev 9931) @@ -200,7 +200,7 @@ # use new HTML5 <figure> and <figcaption> elements def visit_figure(self, node) -> None: atts = {} - if node.get('width'): + if 'width' in node: atts['style'] = f"width: {node['width']}" if node.get('align'): atts['class'] = f"align-{node['align']}" Modified: trunk/docutils/test/test_writers/test_html4css1.py =================================================================== --- trunk/docutils/test/test_writers/test_html4css1.py 2024-09-13 08:13:03 UTC (rev 9930) +++ trunk/docutils/test/test_writers/test_html4css1.py 2024-09-15 11:13:43 UTC (rev 9931) @@ -183,6 +183,7 @@ ["""\ .. table:: :align: right + :width: 320 +-----+-----+ | 1 | 2 | @@ -191,7 +192,7 @@ +-----+-----+ """, """\ -<table border="1" class="docutils align-right"> +<table border="1" class="docutils align-right" style="width: 320px"> <colgroup> <col width="50%" /> <col width="50%" /> Modified: trunk/docutils/test/test_writers/test_html5_polyglot.py =================================================================== --- trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-13 08:13:03 UTC (rev 9930) +++ trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-15 11:13:43 UTC (rev 9931) @@ -218,6 +218,7 @@ ["""\ .. table:: :align: right + :width: 320 +-----+-----+ | 1 | 2 | @@ -226,7 +227,7 @@ +-----+-----+ """, """\ -<table class="align-right"> +<table class="align-right" style="width: 320px;"> <tbody> <tr><td><p>1</p></td> <td><p>2</p></td> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-13 08:13:06
|
Revision: 9930 http://sourceforge.net/p/docutils/code/9930 Author: milde Date: 2024-09-13 08:13:03 +0000 (Fri, 13 Sep 2024) Log Message: ----------- Use "unknown_reference_resolver" for LaTeX writer option "use-bibtex". The "latex" writer provides the (provisional) setting "use_bibtex" to defer the resolution of citation references to the backend (LaTeX/BibTeX/LaTeX). Use the `unknown_reference_resolvers` hook of the `TransformSpec` to mark citation references as resolved if BibTeX is used. Advantages: * replaces hard-coded special-case in `transforms.references.DanglingReferencesVisitor` introduced in [r9312], * provides a usage example, * tests the hook with the Docutils test suite without additional overhead. Update docstrings and comments. Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/docutils/__init__.py trunk/docutils/docutils/transforms/__init__.py trunk/docutils/docutils/transforms/references.py trunk/docutils/docutils/writers/latex2e/__init__.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2024-09-12 12:57:48 UTC (rev 9929) +++ trunk/docutils/HISTORY.rst 2024-09-13 08:13:03 UTC (rev 9930) @@ -158,6 +158,8 @@ (ignored since at least 2012). - Don't wrap references with custom reference-label_ in a ``\hyperref`` command. + - Provide an "unknown_references_resolver" (cf. `docutils/TransformSpec`) + for citation references resolved with BibTeX (cf. `use_bibtex`_ setting). .. _reference-label: docs/user/config.html#reference-label @@ -3856,9 +3858,9 @@ * docutils/transforms/__init__.py: - Added ``Transformer`` class and completed transform reform. - - Added unknown_reference_resolvers list for each transformer. This list holds - the list of functions provided by each component of the transformer that - help resolve references. + - Added unknown_reference_resolvers list for each transformer. + This list holds the list of functions provided by each component + of the transformer that help resolve references. * docutils/transforms/frontmatter.py: Modified: trunk/docutils/docutils/__init__.py =================================================================== --- trunk/docutils/docutils/__init__.py 2024-09-12 12:57:48 UTC (rev 9929) +++ trunk/docutils/docutils/__init__.py 2024-09-13 08:13:03 UTC (rev 9930) @@ -282,8 +282,11 @@ default_transforms: ClassVar[tuple[()]] = () unknown_reference_resolvers: Sequence[_UnknownReferenceResolver] = () - """List of functions to try to resolve unknown references. + """List of hook functions which assist in resolving references. + Override in subclasses to implement component-specific resolving of + unknown references. + Unknown references have a 'refname' attribute which doesn't correspond to any target in the document. Called when the transforms in `docutils.transforms.references` are unable to find a correct target. @@ -291,7 +294,7 @@ The list should contain functions which will try to resolve unknown references, with the following signature:: - def reference_resolver(node): + def reference_resolver(node: nodes.Element) -> bool: '''Returns boolean: true if resolved, false if not.''' If the function is able to resolve the reference, it should also remove @@ -301,13 +304,20 @@ node.resolved = True Each function must have a "priority" attribute which will affect the order - the unknown_reference_resolvers are run:: + the unknown_reference_resolvers are run + cf. ../docs/api/transforms.html#transform-priority-range-categories :: - reference_resolver.priority = 100 + reference_resolver.priority = 500 - This hook is provided for 3rd party extensions. - Example use case: the `MoinMoin - ReStructured Text Parser` - https://github.com/moinwiki/moin + Examples: + `writers.latex2e.Writer` defines a resolver to mark citation references + as resolved by BibTeX if the "use_bibtex" configuration setting is set. + + The `MoinMoin ReStructured Text Parser`__ provides a resolver for + "WikiWiki links" (currently only in the outdated 1.9 version). + + __ https://github.com/moinwiki/moin-1.9/blob/1.9.11/MoinMoin/parser/ + text_rst.py """ Modified: trunk/docutils/docutils/transforms/__init__.py =================================================================== --- trunk/docutils/docutils/transforms/__init__.py 2024-09-12 12:57:48 UTC (rev 9929) +++ trunk/docutils/docutils/transforms/__init__.py 2024-09-13 08:13:03 UTC (rev 9930) @@ -144,7 +144,7 @@ def populate_from_components(self, components) -> None: """ - Store each component's default transforms and reference resolvers + Store each component's default transforms and reference resolvers. Transforms are stored with default priorities for later sorting. "Unknown reference resolvers" are sorted and stored. @@ -161,7 +161,7 @@ resolvers.extend(component.unknown_reference_resolvers) self.sorted = False # sort transform list in self.apply_transforms() - # Sort and add helper functions to help resolve unknown references. + # Sort and add hook functions helping to resolve unknown references. def keyfun(f): return f.priority resolvers.sort(key=keyfun) Modified: trunk/docutils/docutils/transforms/references.py =================================================================== --- trunk/docutils/docutils/transforms/references.py 2024-09-12 12:57:48 UTC (rev 9929) +++ trunk/docutils/docutils/transforms/references.py 2024-09-13 08:13:03 UTC (rev 9930) @@ -888,37 +888,33 @@ return refname = node['refname'] id = self.document.nameids.get(refname) - if id is None: - for resolver_function in self.unknown_reference_resolvers: - if resolver_function(node): - break - else: - if (getattr(self.document.settings, 'use_bibtex', False) - and isinstance(node, nodes.citation_reference)): - # targets added from BibTeX database by LaTeX - node.resolved = True - return - if refname in self.document.nameids: - msg = self.document.reporter.error( - 'Duplicate target name, cannot be used as a unique ' - 'reference: "%s".' % (node['refname']), base_node=node) - else: - msg = self.document.reporter.error( - f'Unknown target name: "{node["refname"]}".', - base_node=node) - msgid = self.document.set_id(msg) - prb = nodes.problematic( - node.rawsource, node.rawsource, refid=msgid) - try: - prbid = node['ids'][0] - except IndexError: - prbid = self.document.set_id(prb) - msg.add_backref(prbid) - node.replace_self(prb) - else: + if id is not None: + # target found, set refid del node['refname'] node['refid'] = id self.document.ids[id].note_referenced_by(id=id) node.resolved = True + return + # Apply component-specific resolving functions (cf. TransformSpec): + for resolver_function in self.unknown_reference_resolvers: + if resolver_function(node): + return + # Report unresolved references: + if refname in self.document.nameids: + msg = self.document.reporter.error( + 'Duplicate target name, cannot be used as a unique ' + 'reference: "%s".' % (node['refname']), base_node=node) + else: + msg = self.document.reporter.error( + f'Unknown target name: "{node["refname"]}".', + base_node=node) + msgid = self.document.set_id(msg) + prb = nodes.problematic(node.rawsource, node.rawsource, refid=msgid) + try: + prbid = node['ids'][0] + except IndexError: + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + node.replace_self(prb) visit_footnote_reference = visit_citation_reference = visit_reference Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-12 12:57:48 UTC (rev 9929) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-13 08:13:03 UTC (rev 9930) @@ -253,7 +253,23 @@ def __init__(self) -> None: writers.Writer.__init__(self) self.translator_class = LaTeXTranslator + self.unknown_reference_resolvers = [self.bibtex_reference_resolver] + self.bibtex_reference_resolver.priority = 400 + @staticmethod + def bibtex_reference_resolver(node: nodes.Element) -> bool: + """Mark citation references as resolved if BibTeX is used. + + Cf. `TransformSpec.unknown_reference_resolvers`. + """ + if (isinstance(node, nodes.citation_reference) + and node.document.settings.use_bibtex): + del node['refname'] + node.resolved = True + return True + else: + return False + def get_transforms(self): # Override parent method to add latex-specific transforms return super().get_transforms() + [ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-12 12:57:50
|
Revision: 9929 http://sourceforge.net/p/docutils/code/9929 Author: milde Date: 2024-09-12 12:57:48 +0000 (Thu, 12 Sep 2024) Log Message: ----------- Fix test_writers html4css when PIL is installed. Fixup for [r9924]. Modified Paths: -------------- trunk/docutils/test/test_writers/test_html4css1.py Modified: trunk/docutils/test/test_writers/test_html4css1.py =================================================================== --- trunk/docutils/test/test_writers/test_html4css1.py 2024-09-11 07:20:07 UTC (rev 9928) +++ trunk/docutils/test/test_writers/test_html4css1.py 2024-09-12 12:57:48 UTC (rev 9929) @@ -39,10 +39,11 @@ # Pillow/PIL is optional: if PIL: - SCALING_OUTPUT = 'style="width: 32px; height: 32px;" ' + SCALING_OUTPUT = 'style="width: 32.0px; height: 32.0px;" ' else: SCALING_OUTPUT = '' + class Html5WriterPublishPartsTestCase(unittest.TestCase): """Test case for HTML5 writer via the publish_parts() interface.""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-11 07:20:10
|
Revision: 9928 http://sourceforge.net/p/docutils/code/9928 Author: milde Date: 2024-09-11 07:20:07 +0000 (Wed, 11 Sep 2024) Log Message: ----------- HTML5: use "width" and "height" for unitless image size values. Fixes [feature-requests:#102] The HTML `<img>` element supports "width" and "height" attributes to specify the size or ratio of an image. Values are restricted to integers (size in pixels). In Docutils, "width" and "hight" attributes also support a set of CSS compatible units. Therefore, all size values were passed to HTML via the common attribute "style". Using HTML "width" and "hight" attributes for values without unit provides a means to specify an image's *aspect ratio* without overriding a size declaration in a CSS style sheet. This change is not backported to the "html4css1" writer to keep the output backwards compatible. The provisional method `HTMLTranslator.image_size()` now returns a dictionary of attribute values. Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/RELEASE-NOTES.rst trunk/docutils/docs/user/html.rst trunk/docutils/docutils/writers/_html_base.py trunk/docutils/test/functional/expected/rst_html5_tuftig.html trunk/docutils/test/functional/expected/standalone_rst_html5.html trunk/docutils/test/test_writers/test_html5_polyglot.py trunk/docutils/test/test_writers/test_html5_polyglot_misc.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/HISTORY.rst 2024-09-11 07:20:07 UTC (rev 9928) @@ -145,6 +145,8 @@ * docutils/writers/_html_base.py - Make MathML the default math_output_. + - Revise image size handling methods, + use "width" and "height" attributes for unitless values. * docutils/writers/html4css1/__init__.py Modified: trunk/docutils/RELEASE-NOTES.rst =================================================================== --- trunk/docutils/RELEASE-NOTES.rst 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/RELEASE-NOTES.rst 2024-09-11 07:20:07 UTC (rev 9928) @@ -85,20 +85,6 @@ __ https://www.w3.org/TR/2014/REC-html5-20141028/grouping-content.html #the-blockquote-element - - Unitless image_ :width: and :hight: values and dimensions - read from the image due to a :scale: option will be written as - "width" and "hight" attributes instead of "style" rules to allow - specification of the aspect ratio to `prevent jank when loading - images`__ without overwriting an image size set in a CSS stylesheet - in Docutils 0.22 (cf. `feature-requests:102`__). - The current behaviour is kept for dimensions with units, so - users may specify, e.g. ``:width: 50px`` instead of ``:width: 50`` - to override CSS stylesheet rules. - - __ https://developer.mozilla.org/en-US/docs/Learn/Performance/Multimedia - #rendering_strategy_preventing_jank_when_loading_images - __ https://sourceforge.net/p/docutils/feature-requests/102/ - - Change the default value of the initial_header_level_ setting to None (<h2> if there is a document title, else <h1>) in Docutils 1.0. @@ -202,22 +188,30 @@ (See `command line interface`_ for the rationale.) Output changes - "manpage" writer: + LaTeX: + Don't wrap references with custom reference-label_ in a ``\hyperref`` + command. The "hyperref" package generates hyperlinks for labels by + default, so there is no change in the PDF (except for "ref*"). + + .. _reference-label: docs/user/config.html#reference-label + + HTML5: + Unitless image_ size measures__ are written as <img> "width" and + "hight" values instead of "style" rules. The current behaviour + is kept for values with units, so users may specify, e.g. ``:width: + 50px`` instead of ``:width: 50`` to override CSS stylesheet rules. + + __ docs/ref/doctree.html#measure + + manpage: Don't UPPERCASE section headings. - "null" writer: - output changed from None to the empty string. + null: + The "null" writer output changed from None to the empty string. `publish_string()` now returns a `bytes` or `str` instance for all writers (as documented). - "latex" writer: - Don't wrap references with custom reference-label_ in a ``\hyperref`` - command. The "hyperref" package generates hyperlinks for labels by - default, so there is no change in the PDF (except for "ref*"). - - .. _reference-label: docs/user/config.html#reference-label - New objects `parsers.docutils_xml` parser for `Docutils XML`_ (e.g., the output of the "xml" writer). Modified: trunk/docutils/docs/user/html.rst =================================================================== --- trunk/docutils/docs/user/html.rst 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/docs/user/html.rst 2024-09-11 07:20:07 UTC (rev 9928) @@ -52,6 +52,13 @@ better legibility. Adaption of the layout is possible with `custom style sheets`_. [#safetext]_ +Image_ size values with unit are converted to "style" rules, +values without unit are rounded to the nearest integer and +written as "width" and "height" attributes instead. +This allows the specification of the image's aspect ratio +(to `prevent jank when loading images`__) without overwriting +size declarations in a CSS stylesheet. + .. [#safetext] The validity of raw HTML and custom stylesheets must be ensured by the author. @@ -69,6 +76,9 @@ .. _custom style sheets: ../howto/html-stylesheets.html .. _viewable with any browser: http://www.anybrowser.org/campaign .. _Benefits of polyglot XHTML5: http://xmlplease.com/xhtml/xhtml5polyglot/ +.. _image: ../ref/rst/directives.html#image +__ https://developer.mozilla.org/en-US/docs/Learn/Performance/Multimedia + #rendering_strategy_preventing_jank_when_loading_images html4css1 Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/docutils/writers/_html_base.py 2024-09-11 07:20:07 UTC (rev 9928) @@ -413,7 +413,7 @@ text = str(text) return text.translate(self.special_characters) - def image_size(self, node: nodes.image) -> str: + def image_size(self, node: nodes.image) -> dict[str, str]: """Determine the image size from node arguments or the image file. Auxiliary method called from `self.visit_image()`. @@ -420,9 +420,6 @@ Provisional. """ - # TODO: Use "width" and "hight" for unitless integers? - # [feature-requests:#102] - # List with optional width and height measures ((value, unit)-tuples) measures: list[tuple[Real, str] | None] = [None, None] dimensions = ('width', 'height') @@ -440,10 +437,22 @@ if factor != 1: measures = [(measure[0] * factor, measure[1]) for measure in measures if measure] - # format as CSS declarations and return - return ' '.join(f'{dimension}: {measure[0]:g}{measure[1] or "px"};' - for dimension, measure in zip(dimensions, measures) - if measure) + # format as <img> attributes, + # use "width" and "hight" for unitless values and "style" else, + # e.g., height': '32' 'style': 'width: 4 em;'}``: + size_atts = {} # attributes "width", "height", or "style" + declarations = [] # declarations for the "style" attribute + for dimension, measure in zip(dimensions, measures): + if measure is None: + continue + value, unit = measure + if unit: + declarations.append(f'{dimension}: {value:g}{unit};') + else: + size_atts[dimension] = f'{round(value)}' + if declarations: + size_atts['style'] = ' '.join(declarations) + return size_atts def read_size_with_PIL(self, node) -> tuple[int, int] | None: # Try reading size from image file. @@ -501,6 +510,9 @@ style_att = dict((k.strip(), v.strip()) for k, p, v in style_att) style_att = ' '.join(f'{k}: {v};' for k, v in style_att.items()) svg.set('style', style_att) + for dimension in ('width', 'height'): + if dimension in atts: + svg.set(dimension, atts[dimension]) if 'classes' in atts or node['classes']: classes = svg.get('class', '').split() classes += node['classes'] + atts.get('classes', []) @@ -1169,10 +1181,9 @@ alt = node.get('alt', uri) mimetype = mimetypes.guess_type(uri)[0] element = '' # the HTML element (including potential children) - atts = {} # attributes for the HTML tag - size_declaration = self.image_size(node) - if size_declaration: - atts['style'] = size_declaration + # attributes for the HTML tag: + atts = self.image_size(node) + # alignment is handled by CSS rules if 'align' in node: atts['classes'] = [f"align-{node['align']}"] # ``:loading:`` option (embed, link, lazy), default from setting, Modified: trunk/docutils/test/functional/expected/rst_html5_tuftig.html =================================================================== --- trunk/docutils/test/functional/expected/rst_html5_tuftig.html 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/test/functional/expected/rst_html5_tuftig.html 2024-09-11 07:20:07 UTC (rev 9928) @@ -137,7 +137,7 @@ </section> </main> <footer> -<p><a class="reference external image-reference" href="http://www.w3.org/TR/html5/"><img alt="Conforms to HTML 5" src="http://www.w3.org/html/logo/badge/html5-badge-h-css3-semantics.png" style="width: 88px; height: 31px;" /></a> <a class="reference external image-reference" href="http://validator.w3.org/check?uri=referer"><img alt="Check validity!" src="https://www.w3.org/Icons/ValidatorSuite/vs-blue-190.png" style="width: 88px; height: 31px;" /></a> <a class="reference external image-reference" href="http://jigsaw.w3.org/css-validator/check/referer"><img alt="Valid CSS 2.1!" src="http://jigsaw.w3.org/css-validator/images/vcss" style="width: 88px; height: 31px;" /></a></p> +<p><a class="reference external image-reference" href="http://www.w3.org/TR/html5/"><img alt="Conforms to HTML 5" height="31" src="http://www.w3.org/html/logo/badge/html5-badge-h-css3-semantics.png" width="88" /></a> <a class="reference external image-reference" href="http://validator.w3.org/check?uri=referer"><img alt="Check validity!" height="31" src="https://www.w3.org/Icons/ValidatorSuite/vs-blue-190.png" width="88" /></a> <a class="reference external image-reference" href="http://jigsaw.w3.org/css-validator/check/referer"><img alt="Valid CSS 2.1!" height="31" src="http://jigsaw.w3.org/css-validator/images/vcss" width="88" /></a></p> </footer> </body> </html> Modified: trunk/docutils/test/functional/expected/standalone_rst_html5.html =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_html5.html 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/test/functional/expected/standalone_rst_html5.html 2024-09-11 07:20:07 UTC (rev 9928) @@ -614,7 +614,7 @@ media, figures might float to a different position if this helps the page layout.</p> <figure class="figclass1 figclass2"> -<img alt="reStructuredText, the markup syntax" class="class1 class2" src="../../../docs/user/rst/images/title.png" style="width: 258px;" /> +<img alt="reStructuredText, the markup syntax" class="class1 class2" src="../../../docs/user/rst/images/title.png" width="258" /> <figcaption> <p>Plaintext markup syntax and parser system.</p> <div class="legend"> @@ -1302,7 +1302,7 @@ <li><img alt="blue square" class="align-right" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAALElEQVR4nO3NMQEAMAjAsDFjvIhHFCbgSwU0kdXvsn96BwAAAAAAAAAAAIsNnEwBk52VRuMAAAAASUVORK5CYII=" /> <p>Embed images or defer fetching images with the <a class="reference external" href="https://docutils.sourceforge.io/docs/user/config.html#image-loading">image-loading</a> <a class="brackets" href="#footnote-9" id="footnote-reference-22" role="doc-noteref"><span class="fn-bracket">[</span>9<span class="fn-bracket">]</span></a> configuration setting or the "loading" option of the "image" directive.</p> -<img alt="../../../docs/user/rst/images/biohazard.png" class="align-right" loading="lazy" src="../../../docs/user/rst/images/biohazard.png" style="width: 16px; height: 16px;" /> +<img alt="../../../docs/user/rst/images/biohazard.png" class="align-right" height="16" loading="lazy" src="../../../docs/user/rst/images/biohazard.png" width="16" /> <p>Especially with "lazy" loading, it is strongly recommended to specify both width and height of the image to prevent content layout shifts or use the "scale" option to let the writer insert the size @@ -1930,7 +1930,7 @@ </main> <footer> <p>Document footer</p> -<p><a class="reference external image-reference" href="http://www.w3.org/TR/html5/"><img alt="Conforms to HTML 5" src="http://www.w3.org/html/logo/badge/html5-badge-h-css3-semantics.png" style="width: 88px; height: 31px;" /></a> <a class="reference external image-reference" href="http://validator.w3.org/check?uri=referer"><img alt="Check validity!" src="https://www.w3.org/Icons/ValidatorSuite/vs-blue-190.png" style="width: 88px; height: 31px;" /></a> <a class="reference external image-reference" href="http://jigsaw.w3.org/css-validator/check/referer"><img alt="Valid CSS 2.1!" src="http://jigsaw.w3.org/css-validator/images/vcss" style="width: 88px; height: 31px;" /></a></p> +<p><a class="reference external image-reference" href="http://www.w3.org/TR/html5/"><img alt="Conforms to HTML 5" height="31" src="http://www.w3.org/html/logo/badge/html5-badge-h-css3-semantics.png" width="88" /></a> <a class="reference external image-reference" href="http://validator.w3.org/check?uri=referer"><img alt="Check validity!" height="31" src="https://www.w3.org/Icons/ValidatorSuite/vs-blue-190.png" width="88" /></a> <a class="reference external image-reference" href="http://jigsaw.w3.org/css-validator/check/referer"><img alt="Valid CSS 2.1!" height="31" src="http://jigsaw.w3.org/css-validator/images/vcss" width="88" /></a></p> </footer> </body> </html> Modified: trunk/docutils/test/test_writers/test_html5_polyglot.py =================================================================== --- trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-11 07:20:07 UTC (rev 9928) @@ -47,13 +47,15 @@ if (tuple(int(i) for i in PIL.__version__.split('.')) >= (10, 3)): DUMMY_PNG_NOT_FOUND = ("[Errno 2] No such file or directory: '%s'" % Path('dummy.png').resolve()) - SCALING_OUTPUT = 'style="width: 32px; height: 32px;" ' + HEIGHT_ATTR = 'height="32" ' + WIDTH_ATTR = 'width="32" ' NO_PIL_SYSTEM_MESSAGE = '' else: REQUIRES_PIL = '\n Requires Python Imaging Library.' ONLY_LOCAL = 'Requires Python Imaging Library.' DUMMY_PNG_NOT_FOUND = 'Requires Python Imaging Library.' - SCALING_OUTPUT = '' + HEIGHT_ATTR = '' + WIDTH_ATTR = '' NO_PIL_SYSTEM_MESSAGE = ( '<aside class="system-message">\n' '<p class="system-message-title">System Message:' @@ -156,7 +158,7 @@ :align: left """, """\ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" style="width: 50%; height: 30px;" class="align-left"> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" style="width: 50%;" height="30" class="align-left"> <circle cx="5" cy="5" r="4" fill="lightblue" /> </svg> """], @@ -451,11 +453,11 @@ :scale: 100% .. figure:: /data/blue%20square.png """, -'<img alt="/data/blue%20square.png" src="data:image/png;base64,' +f'<img alt="/data/blue%20square.png" {HEIGHT_ATTR}src="data:image/png;base64,' 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAALElEQVR4nO3NMQ' 'EAMAjAsDFjvIhHFCbgSwU0kdXvsn96BwAAAAAAAAAAAIsNnEwBk52VRuMAAAAA' 'SUVORK5CYII="' -f' {SCALING_OUTPUT}/>\n{NO_PIL_SYSTEM_MESSAGE}' +f' {WIDTH_ATTR}/>\n{NO_PIL_SYSTEM_MESSAGE}' '<figure>\n' '<img alt="/data/blue%20square.png" src="data:image/png;base64,' 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAALElEQVR4nO3NMQ' Modified: trunk/docutils/test/test_writers/test_html5_polyglot_misc.py =================================================================== --- trunk/docutils/test/test_writers/test_html5_polyglot_misc.py 2024-09-11 07:19:52 UTC (rev 9927) +++ trunk/docutils/test/test_writers/test_html5_polyglot_misc.py 2024-09-11 07:20:07 UTC (rev 9928) @@ -243,7 +243,7 @@ class ImagesTestCase(unittest.TestCase): """Test image handling routines.""" - + maxDiff = None settings = frontend.get_default_settings(_html_base.Writer) document = utils.new_document('test data', settings) translator = _html_base.HTMLTranslator(document) @@ -250,24 +250,28 @@ svg_sample = """\ <?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" - style="background: blue; width: 5ex" viewBox="0 0 10 10"> + style="background: blue; width: 5ex; height: 3ex" viewBox="0 0 10 10"> <circle cx="5" cy="5" r="4" fill="lightblue" /> <!-- comments are ignored --> </svg> """ expected = """\ -<svg xmlns="http://www.w3.org/2000/svg" style="background: blue; width: 4em; height: 32px;" viewBox="0 0 10 10" class="test me"> +<svg xmlns="http://www.w3.org/2000/svg" style="background: blue; width: 4em; height: 3ex;" viewBox="0 0 10 10" height="32" class="test me"> <title>blue circle</title><circle cx="5" cy="5" r="4" fill="lightblue" /> \n\ </svg>""" def test_image_size(self): - image = nodes.image(height='3', width='4em') + # HTML attributes "width" and "height" take only integer values: + # -> height value is passed as "height" attribute, + # value with unit is passed via "style". + image = nodes.image(width='4em', height='3', scale=200) self.assertEqual(self.translator.image_size(image), - 'width: 4em; height: 3px;') - image = nodes.image(height='3', width='4em', scale=50) + {'height': '6', 'style': 'width: 8em;'}) + # "style" declaration also used for unitless non-interger value + image = nodes.image(width='4em', height='3', scale=50) self.assertEqual(self.translator.image_size(image), - 'width: 2em; height: 1.5px;') + {'style': 'width: 2em;', 'height': '2'}) def test_prepare_svg(self): # Internal method: the test is no guaranty for stability, @@ -274,7 +278,7 @@ # interface and behaviour may change without notice. image = nodes.image(height='32', width='4em', alt='blue circle', align='left', classes=['test', 'me']) - atts = {'style': self.translator.image_size(image)} + atts = self.translator.image_size(image) rv = self.translator.prepare_svg(self.svg_sample, image, atts) self.assertEqual(rv, self.expected) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-11 07:19:56
|
Revision: 9927 http://sourceforge.net/p/docutils/code/9927 Author: milde Date: 2024-09-11 07:19:52 +0000 (Wed, 11 Sep 2024) Log Message: ----------- Fix test samples containing installation-specific path. Use a relative path in the tests for external MathML converters to make tests independent of the installation-specific Docutils project root directory. Modified Paths: -------------- trunk/docutils/test/functional/expected/math_experiments_mathml_blahtexml.html trunk/docutils/test/functional/expected/math_experiments_mathml_pandoc.html trunk/docutils/test/functional/expected/math_experiments_mathml_ttm.html trunk/docutils/test/functional/expected/mathematics_mathml.html trunk/docutils/test/functional/expected/mathematics_mathml_blahtexml.html trunk/docutils/test/functional/expected/mathematics_mathml_pandoc.html trunk/docutils/test/functional/expected/mathematics_mathml_ttm.html trunk/docutils/test/test_utils/test_math/test_tex2mathml_extern.py Modified: trunk/docutils/test/functional/expected/math_experiments_mathml_blahtexml.html =================================================================== --- trunk/docutils/test/functional/expected/math_experiments_mathml_blahtexml.html 2024-09-11 07:19:41 UTC (rev 9926) +++ trunk/docutils/test/functional/expected/math_experiments_mathml_blahtexml.html 2024-09-11 07:19:52 UTC (rev 9927) @@ -126,7 +126,7 @@ <dd><p><span class="math problematic">\mathbfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 21)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 21)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathbfit"</p> </aside> @@ -135,7 +135,7 @@ <dd><p><span class="math problematic">\mathbb{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 23)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 23)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The symbol "x" is not available in the font "bb"</p> </aside> @@ -144,7 +144,7 @@ <dd><p><span class="math problematic">\mathcal{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 25)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 25)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The symbol "x" is not available in the font "cal"</p> </aside> @@ -153,7 +153,7 @@ <dd><p><span class="math problematic">\mathscr{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 27)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 27)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathscr"</p> </aside> @@ -162,7 +162,7 @@ <dd><p><span class="math problematic">\mathfrak{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 29)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 29)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The symbol "\Gamma" is not available in the font "frak"</p> </aside> @@ -197,7 +197,7 @@ <dd><p><span class="math problematic">\mathsfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 33)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 33)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathsfit"</p> </aside> @@ -206,7 +206,7 @@ <dd><p><span class="math problematic">\mathsfbfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 35)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 35)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathsfbfit"</p> </aside> @@ -215,7 +215,7 @@ <dd><p><span class="math problematic">\mathbfsfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 37)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 37)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathbfsfit"</p> </aside> @@ -314,13 +314,13 @@ \quad\mbox{as $n\to\infty$,} </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 69)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 69)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\coloneq"</p> </aside> <p>or, equivalently, letting <span class="math problematic">S_n\coloneq\sum_1^n X_k</span>,</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 75)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 75)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\coloneq"</p> </aside> @@ -332,7 +332,7 @@ for every $f\in\mathrm{b} \mathcal{C}(\mathbb{R})$.} </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 77)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 77)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The command "$" is illegal in text mode (perhaps you intended to use "\$" instead?)</p> </aside> @@ -567,7 +567,7 @@ \left( \intop_0^1 \right) </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 127)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 127)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\intop"</p> </aside> @@ -1026,7 +1026,7 @@ \left./ b \right\backslash \ \bigl/ b \Bigr\backslash \ \biggl/ b \Biggr\backslash </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 199)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 199)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\lgroup"</p> </aside> @@ -1097,7 +1097,7 @@ \left.\bracevert b \right\bracevert \ \bigl\bracevert b \Bigr\bracevert \ \biggl\bracevert b \Biggr\bracevert </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 224)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 224)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\arrowvert"</p> </aside> @@ -1106,7 +1106,7 @@ \sum\ \prod\ \coprod\ \bigwedge\ \bigvee\ \bigcap\ \bigcup\ \biguplus\ \bigsqcup\ \bigodot\ \bigoplus\ \bigotimes</span> and Display:</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 241)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 241)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\idotsint"</p> </aside> @@ -1116,7 +1116,7 @@ \biguplus\ \bigsqcup\ \bigodot\ \bigoplus\ \bigotimes </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 245)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 245)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\idotsint"</p> </aside> @@ -1127,7 +1127,7 @@ \bigvee^N\ \bigcup^N\ \bigsqcup^N\ \bigotimes^N </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 249)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 249)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\intop"</p> </aside> @@ -1139,7 +1139,7 @@ \bigotimes_1^N </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 254)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 254)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\intop"</p> </aside> @@ -1159,7 +1159,7 @@ to get the result of the accent macros <span class="math problematic">\text{\c{c} \'e \`e \"e \^e \~n \r{u} \v{z} \textcircled{c}}</span>.</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 266)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 266)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\c"</p> </aside> Modified: trunk/docutils/test/functional/expected/math_experiments_mathml_pandoc.html =================================================================== --- trunk/docutils/test/functional/expected/math_experiments_mathml_pandoc.html 2024-09-11 07:19:41 UTC (rev 9926) +++ trunk/docutils/test/functional/expected/math_experiments_mathml_pandoc.html 2024-09-11 07:19:52 UTC (rev 9927) @@ -66,7 +66,7 @@ <dd><p><span class="math problematic">\mathsfbfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 35)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 35)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\mathsfbfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma</p> <pre class="literal-block"> \quad \forall x \in \mathbb{R}}', rendering as TeX: @@ -139,7 +139,7 @@ c = \sqrt\frac{\sin(x)}{23}, </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 91)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 91)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math 'a = \sqrt 2 + x,\quad</p> <pre class="literal-block"> b = \sqrt{1+x^2},\quad @@ -151,7 +151,7 @@ </aside> <p>inline: <span class="math problematic">a = \sqrt 2 + x, b = \sqrt{1+x^2}, c = \sqrt\frac{\sin(x)}{23}</span>.</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 95)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 95)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math 'a = \sqrt 2 + x, b = \sqrt{1+x^2}, c = \sqrt\frac{\sin(x)}{23}', rendering as TeX:</p> <pre class="literal-block"> ^2}, c = \sqrt\frac{\sin(x)}{23} @@ -214,7 +214,7 @@ \left( \intop_0^1 \right) </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 127)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 127)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\begin{aligned}</p> <pre class="literal-block"> \left( 3 \right) @@ -285,7 +285,7 @@ \left( \sum_0^1 \right) \left( \frac{\frac1x}{\frac{1}{n}}\right)</annotation></semantics></math></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 177)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 177)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\Bigl(\text{Big}\Bigr)', rendering as TeX:</p> <pre class="literal-block"> \Bigl(\text{Big}\Bigr) @@ -324,7 +324,7 @@ \left./ b \right\backslash \ \bigl/ b \Bigr\backslash \ \biggl/ b \Biggr\backslash </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 199)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 199)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\left.\lgroup b \right\rgroup \ \bigl\lgroup b \Bigr\rgroup \ \biggl\lgroup b \Biggr\rgroup</p> <pre class="literal-block"> \quad @@ -354,7 +354,7 @@ \left.\bracevert b \right\bracevert \ \bigl\bracevert b \Bigr\bracevert \ \biggl\bracevert b \Biggr\bracevert </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 224)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 224)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\left.\arrowvert b \right\arrowvert \ \bigl\arrowvert b \Bigr\arrowvert \ \biggl\arrowvert b \Biggr\arrowvert</p> <pre class="literal-block"> \quad @@ -371,7 +371,7 @@ \sum\ \prod\ \coprod\ \bigwedge\ \bigvee\ \bigcap\ \bigcup\ \biguplus\ \bigsqcup\ \bigodot\ \bigoplus\ \bigotimes</span> and Display:</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 241)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 241)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\int\ \iint\ \iiint\ \iiiint\ \idotsint \oint\ \smallint\</p> <pre class="literal-block"> \sum\ \prod\ \coprod\ \bigwedge\ \bigvee\ \bigcap\ \bigcup\ \biguplus\ @@ -387,7 +387,7 @@ \biguplus\ \bigsqcup\ \bigodot\ \bigoplus\ \bigotimes </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 245)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 245)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\int\ \iint\ \iiint\ \iiiint\ \idotsint\ \oint\ \smallint\</p> <pre class="literal-block"> \sum\ \prod\ \coprod\ \bigwedge\ \bigvee\ \bigcap\ \bigcup\ @@ -404,7 +404,7 @@ \bigvee^N\ \bigcup^N\ \bigsqcup^N\ \bigotimes^N </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 249)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 249)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\int_1 f\ \intop_1 f\ \iint_1 f\ \smallint_1 f\ \sum_1\</p> <pre class="literal-block"> \prod_1\ \bigwedge_1\ \bigcap_1\ \biguplus_1\ \bigodot_1\ \int^N\ @@ -423,7 +423,7 @@ \bigotimes_1^N </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 254)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 254)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\int_1^N\ \intop_1^N\ \iint_1^N\ \iiint_1^N\ \iiiint_1^N\</p> <pre class="literal-block"> \idotsint_1^N\ \oint_1^N\ \smallint_1^N\ \sum_1^N\ \prod_1^N\ @@ -444,7 +444,7 @@ to get the result of the accent macros <span class="math problematic">\text{\c{c} \'e \`e \"e \^e \~n \r{u} \v{z} \textcircled{c}}</span>.</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 266)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 266)</p> <p>TeX to MathML converter `pandoc` failed:</p> <p>[WARNING] Could not convert TeX math '\text{\c{c} \'e \`e \"e \^e \~n \r{u} \v{z} \textcircled{c}}', rendering as TeX:</p> <pre class="literal-block"> 'e \`e \"e \^e \~n \r{u} \v{z} \textcirc Modified: trunk/docutils/test/functional/expected/math_experiments_mathml_ttm.html =================================================================== --- trunk/docutils/test/functional/expected/math_experiments_mathml_ttm.html 2024-09-11 07:19:41 UTC (rev 9926) +++ trunk/docutils/test/functional/expected/math_experiments_mathml_ttm.html 2024-09-11 07:19:52 UTC (rev 9927) @@ -22,7 +22,7 @@ <dd><p><span class="math problematic">V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 13)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 13)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -31,7 +31,7 @@ <dd><p><span class="math problematic">\mathrm{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 15)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 15)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -40,7 +40,7 @@ <dd><p><span class="math problematic">\mathbf{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 17)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 17)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -49,7 +49,7 @@ <dd><p><span class="math problematic">\mathit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 19)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 19)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -58,7 +58,7 @@ <dd><p><span class="math problematic">\mathbfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 21)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 21)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbfit in equation, Line 1. Unknown command \mathbb in equation, Line 1.</p> @@ -68,7 +68,7 @@ <dd><p><span class="math problematic">\mathbb{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 23)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 23)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1. Unknown command \mathbb in equation, Line 1.</p> @@ -78,7 +78,7 @@ <dd><p><span class="math problematic">\mathcal{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 25)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 25)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -87,7 +87,7 @@ <dd><p><span class="math problematic">\mathscr{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 27)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 27)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathscr in equation, Line 1. Unknown command \mathbb in equation, Line 1.</p> @@ -97,7 +97,7 @@ <dd><p><span class="math problematic">\mathfrak{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 29)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 29)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathfrak in equation, Line 1. Unknown command \mathbb in equation, Line 1.</p> @@ -107,7 +107,7 @@ <dd><p><span class="math problematic">\mathsf{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 31)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 31)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -116,7 +116,7 @@ <dd><p><span class="math problematic">\mathsfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 33)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 33)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathsfit in equation, Line 1. Unknown command \mathbb in equation, Line 1.</p> @@ -126,7 +126,7 @@ <dd><p><span class="math problematic">\mathsfbfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 35)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 35)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathsfbfit in equation, Line 1. Unknown command \mathbb in equation, Line 1.</p> @@ -136,7 +136,7 @@ <dd><p><span class="math problematic">\mathbfsfit{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 37)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 37)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbfsfit in equation, Line 1. Unknown command \mathbb in equation, Line 1.</p> @@ -146,7 +146,7 @@ <dd><p><span class="math problematic">\mathtt{V_R x \pm \cos(\alpha_\text{out}) \approx 3 \Gamma \quad \forall x \in \mathbb{R}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 39)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 39)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -165,7 +165,7 @@ <dt>bold-fraktur<span class="colon">:</span></dt> <dd><p><span class="math problematic">\boldsymbol{\mathfrak{V_R x}}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 54)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 54)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathfrak in equation, Line 1.</p> </aside> @@ -190,7 +190,7 @@ <mrow><mn>1</mn></mrow></math> on a probability space <span class="math problematic">(\Omega,\mathcal{F},\mathbb{P})</span>. Then</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 65)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 65)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1.</p> </aside> @@ -202,7 +202,7 @@ \quad\mbox{as $n\to\infty$,} </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 69)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 69)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1. Unknown command \mathfrak in equation, Line 1. @@ -210,7 +210,7 @@ </aside> <p>or, equivalently, letting <span class="math problematic">S_n\coloneq\sum_1^n X_k</span>,</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 75)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 75)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \coloneq in equation, Line 1.</p> </aside> @@ -222,7 +222,7 @@ for every $f\in\mathrm{b} \mathcal{C}(\mathbb{R})$.} </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 77)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 77)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \mathbb in equation, Line 1. Unknown command \mathbb in equation, Line 4.</p> @@ -377,7 +377,7 @@ \left( \intop_0^1 \right) </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 127)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 127)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown or ignored environment: \begin{align*} Line 1. Unknown command \left, (0 user-defined) Line 2. @@ -431,7 +431,7 @@ c & d \end{smallmatrix} \right) \left( \bigotimes \right)</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 170)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 170)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \binom in equation, Line 1. Unknown or ignored environment: \begin{smallmatrix} Line 1. @@ -511,7 +511,7 @@ \left.\lVert b \right\rVert \ \bigl\lVert b \Bigr\rVert \ \biggl\lVert b \Biggr\rVert </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 199)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 199)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \lvert in equation, Line 1. Unknown command \rvert in equation, Line 1. @@ -534,7 +534,7 @@ \left./ b \right\backslash \ \bigl/ b \Bigr\backslash \ \biggl/ b \Biggr\backslash </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 199)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 199)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \lgroup in equation, Line 1. Unknown command \rgroup in equation, Line 1. @@ -563,7 +563,7 @@ \left.\bracevert b \right\bracevert \ \bigl\bracevert b \Bigr\bracevert \ \biggl\bracevert b \Biggr\bracevert </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 224)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 224)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \arrowvert in equation, Line 1. Unknown command \arrowvert in equation, Line 1. @@ -589,7 +589,7 @@ \sum\ \prod\ \coprod\ \bigwedge\ \bigvee\ \bigcap\ \bigcup\ \biguplus\ \bigsqcup\ \bigodot\ \bigoplus\ \bigotimes</span> and Display:</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 241)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 241)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \iiiint in equation, Line 1. Unknown command \idotsint in equation, Line 1. @@ -601,7 +601,7 @@ \biguplus\ \bigsqcup\ \bigodot\ \bigoplus\ \bigotimes </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 245)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 245)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \iiiint in equation, Line 1. Unknown command \idotsint in equation, Line 1. @@ -614,7 +614,7 @@ \bigvee^N\ \bigcup^N\ \bigsqcup^N\ \bigotimes^N </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 249)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 249)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \intop in equation, Line 1. Unknown command \smallint in equation, Line 1. @@ -630,7 +630,7 @@ \bigotimes_1^N </pre> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 254)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 254)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \intop in equation, Line 1. Unknown command \iiiint in equation, Line 1. @@ -649,11 +649,11 @@ to get the result of the accent macros <span class="math problematic">\text{\c{c} \'e \`e \"e \^e \~n \r{u} \v{z} \textcircled{c}}</span>.</p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 266)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 266)</p> <p>'latin-1' codec can't encode character '\u016f' in position 19: ordinal not in range(256)</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/test/functional/input/data/math_experiments.rst</span>, line 266)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../functional/input/data/math_experiments.rst</span>, line 266)</p> <p>TeX to MathML converter `ttm` failed:</p> <p class="pre-wrap">Unknown command \r, (0 user-defined) Line 1. Unknown command \textcircled, (0 user-defined) Line 1.</p> Modified: trunk/docutils/test/functional/expected/mathematics_mathml.html =================================================================== --- trunk/docutils/test/functional/expected/mathematics_mathml.html 2024-09-11 07:19:41 UTC (rev 9926) +++ trunk/docutils/test/functional/expected/mathematics_mathml.html 2024-09-11 07:19:52 UTC (rev 9927) @@ -26,7 +26,7 @@ Attention: this is not a standalone document. --> <nav class="contents" id="contents" role="doc-toc"> -<p class="topic-title">Contents</p> +<p class="topic-title"><a class="reference internal" href="#top">Contents</a></p> <ul class="auto-toc simple"> <li><p><a class="reference internal" href="#inline-formulas-and-displayed-equations" id="toc-entry-1"><span class="sectnum">1 </span>Inline formulas and displayed equations</a></p></li> <li><p><a class="reference internal" href="#mathematical-symbols" id="toc-entry-2"><span class="sectnum">2 </span>Mathematical symbols</a></p> Modified: trunk/docutils/test/functional/expected/mathematics_mathml_blahtexml.html =================================================================== --- trunk/docutils/test/functional/expected/mathematics_mathml_blahtexml.html 2024-09-11 07:19:41 UTC (rev 9926) +++ trunk/docutils/test/functional/expected/mathematics_mathml_blahtexml.html 2024-09-11 07:19:52 UTC (rev 9927) @@ -26,7 +26,7 @@ Attention: this is not a standalone document. --> <nav class="contents" id="contents" role="doc-toc"> -<p class="topic-title">Contents</p> +<p class="topic-title"><a class="reference internal" href="#top">Contents</a></p> <ul class="auto-toc simple"> <li><p><a class="reference internal" href="#inline-formulas-and-displayed-equations" id="toc-entry-1"><span class="sectnum">1 </span>Inline formulas and displayed equations</a></p></li> <li><p><a class="reference internal" href="#mathematical-symbols" id="toc-entry-2"><span class="sectnum">2 </span>Mathematical symbols</a></p> @@ -457,17 +457,17 @@ </tbody> </table> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 150)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 150)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\dddot"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 150)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 150)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathring"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 151)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 151)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\ddddot"</p> </aside> @@ -600,17 +600,17 @@ </tbody> </table> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 165)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 165)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\underleftarrow"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 166)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 166)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\underrightarrow"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 167)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 167)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\underleftrightarrow"</p> </aside> @@ -1054,12 +1054,12 @@ </tbody> </table> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 224)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 224)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\lgroup"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 225)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 225)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\lmoustache"</p> </aside> @@ -1104,17 +1104,17 @@ </tbody> </table> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 234)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 234)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\arrowvert"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 235)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 235)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\Arrowvert"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 236)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 236)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\bracevert"</p> </aside> @@ -1593,7 +1593,7 @@ <span class="math problematic m">\varGamma\ \varDelta\ \varLambda\ \varPhi\ \varPi\ \varPsi\ \varSigma\ \varTheta\ \varUpsilon\ \varXi\ \varOmega</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 315)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 315)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\varGamma"</p> </aside> @@ -1825,7 +1825,7 @@ <p>The listing below shows the characters supported by Unicode and Docutils with <a class="reference external" href="https://docutils.sourceforge.io/docs/user/config.html#math-output">math_output</a> MathML. <a class="brackets" href="#italic-digits" id="footnote-reference-3" role="doc-noteref"><span class="fn-bracket">[</span>2<span class="fn-bracket">]</span></a></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 371)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 371)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathbfit"</p> </aside> @@ -1896,7 +1896,7 @@ <mn>0123456789</mn> </math></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 382)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 382)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Non-ASCII characters may only be used in text mode (try enclosing the problem characters in "\text{...}")</p> </aside> @@ -1917,7 +1917,7 @@ <mn>0123456789</mn> </math></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 386)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 386)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Non-ASCII characters may only be used in text mode (try enclosing the problem characters in "\text{...}")</p> </aside> @@ -1985,7 +1985,7 @@ <mn mathvariant="bold">0123456789</mn> </math></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 390)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 390)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Non-ASCII characters may only be used in text mode (try enclosing the problem characters in "\text{...}")</p> </aside> @@ -2109,12 +2109,12 @@ <dd><p><span class="math problematic m">\mathbfit{ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz}</span> <span class="math problematic m">\mathbfit{ΓΔΘΛΞΠΣΥΦΨΩ\ αβγδεζηθικλμνξπρςστυφχψω\ ϵϑϕϰϱϖ\ \partial∇}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 398)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 398)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathbfit"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 398)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 398)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathbfit"</p> </aside> @@ -2122,7 +2122,7 @@ <dt>mathcal:</dt> <dd><p><span class="math problematic m">\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 401)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 401)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The symbol "a" is not available in the font "cal"</p> </aside> @@ -2130,7 +2130,7 @@ <dt>mathscr:</dt> <dd><p><span class="math problematic m">\mathscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 403)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 403)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathscr"</p> </aside> @@ -2140,17 +2140,17 @@ <span class="math problematic m">\mathbb{ΓΠΣ\ γπ}</span> <span class="math problematic m">\mathbb{0123456789}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 405)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 405)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The symbol "a" is not available in the font "bb"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 405)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 405)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The symbol "\Gamma" is not available in the font "bb"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 405)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 405)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">The symbol "0" is not available in the font "bb"</p> </aside> @@ -2279,7 +2279,7 @@ <dt>mathsfit:</dt> <dd><p><span class="math problematic m">\mathsfit{ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 414)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 414)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathsfit"</p> </aside> @@ -2288,12 +2288,12 @@ <dd><p><span class="math problematic m">\mathsfbfit{ABCDEFGHIJKLMNOPQRSTUVWXYZ\ abcdefghijklmnopqrstuvwxyz}</span> <span class="math problematic m">\mathsfbfit{ΓΔΘΛΞΠΣΥΦΨΩ\ αβγδεζηθικλμνξπρςστυφχψω\ ϵϑϕϰϱϖ\ \partial∇}</span></p> <aside class="system-message"> -<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">/usr/local/src/docutils-git-svn/docutils/docs/ref/rst/mathematics.rst</span>, line 416)</p> +<p class="system-message-title">System Message: WARNING/2 (<span class="docutils literal">../../../docs/ref/rst/mathematics.rst</span>, line 416)</p> <p>TeX to MathML converter `blahtexml` failed:</p> <p class="pre-wrap">Unrecognised command "\mathsfbfit"</p> </aside> <aside class="system-message"> -<p class="system-message-title">System Message: WAR... [truncated message content] |
From: <mi...@us...> - 2024-09-11 07:19:43
|
Revision: 9926 http://sourceforge.net/p/docutils/code/9926 Author: milde Date: 2024-09-11 07:19:41 +0000 (Wed, 11 Sep 2024) Log Message: ----------- Fixes for "scale" attribute handling in ODT and LaTeX writer. Remove redundant code in the ODT writer: Scale is validated as "non-negative integer" by the parser. No need to validate again. Use the "generic" numeral format instead of "float" in the LaTeX writer (%f -> %g). Modified Paths: -------------- trunk/docutils/docutils/writers/latex2e/__init__.py trunk/docutils/docutils/writers/odf_odt/__init__.py Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-10 18:25:17 UTC (rev 9925) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2024-09-11 07:19:41 UTC (rev 9926) @@ -2435,7 +2435,7 @@ 'height=%s' % self.to_latex_length(attrs['height'])) if 'scale' in attrs: include_graphics_options.append( - 'scale=%f' % (attrs['scale'] / 100.0)) + 'scale=%g' % (attrs['scale'] / 100.0)) if 'width' in attrs: include_graphics_options.append( 'width=%s' % self.to_latex_length(attrs['width'])) Modified: trunk/docutils/docutils/writers/odf_odt/__init__.py =================================================================== --- trunk/docutils/docutils/writers/odf_odt/__init__.py 2024-09-10 18:25:17 UTC (rev 9925) +++ trunk/docutils/docutils/writers/odf_odt/__init__.py 2024-09-11 07:19:41 UTC (rev 9926) @@ -2236,14 +2236,8 @@ def get_image_scale(self, node): if 'scale' in node.attributes: scale = node.attributes['scale'] - try: - scale = int(scale) - except ValueError: + if scale < 1: self.document.reporter.warning( - 'Invalid scale for image: "%s"' % ( - node.attributes['scale'], )) - if scale < 1: # or scale > 100: - self.document.reporter.warning( 'scale out of range (%s), using 1.' % (scale, )) scale = 1 scale = scale * 0.01 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gr...@us...> - 2024-09-10 18:25:21
|
Revision: 9925 http://sourceforge.net/p/docutils/code/9925 Author: grubert Date: 2024-09-10 18:25:17 +0000 (Tue, 10 Sep 2024) Log Message: ----------- late commit to rename .txt to .rst Modified Paths: -------------- trunk/sandbox/infrastructure/README.rst trunk/sandbox/infrastructure/docutils-update.local trunk/sandbox/infrastructure/set_version.sh Added Paths: ----------- trunk/sandbox/infrastructure/crosstest/index.rst trunk/sandbox/infrastructure/releasing-log.rst trunk/sandbox/infrastructure/sdist-install-20240410.rst Removed Paths: ------------- trunk/sandbox/infrastructure/crosstest/index.txt trunk/sandbox/infrastructure/releasing-log.txt trunk/sandbox/infrastructure/sdist-install-20240410.txt Modified: trunk/sandbox/infrastructure/README.rst =================================================================== --- trunk/sandbox/infrastructure/README.rst 2024-09-10 18:17:15 UTC (rev 9924) +++ trunk/sandbox/infrastructure/README.rst 2024-09-10 18:25:17 UTC (rev 9925) @@ -12,7 +12,7 @@ The `infrastructure <.>`_ sandbox directory stores any scripts that are needed for the development of the Docutils project. -:`<releasing-log.txt>`_: What happend at release time ... what to do next time +:`<releasing-log.rst>`_: What happend at release time ... what to do next time better. :`<docutils-update.local>`_: The script to update the `web site`_ @@ -37,7 +37,7 @@ is not in use ... move to attic. :`<release.sh>`_: The script to make releases of Docutils. - For usage details see `release.txt`_ + For usage details see `release.rst`_ TODO : test. Allow release without testing, because tests must be done @@ -60,4 +60,4 @@ .. _web site: http://docutils.sourceforge.net/docs/dev/website.html .. _Docutils Subversion repository: http://docutils.sourceforge.net/docs/dev/repository.html -.. _release.txt: http://docutils.sourceforge.net/docs/dev/release.html +.. _release.rst: http://docutils.sourceforge.net/docs/dev/release.html Copied: trunk/sandbox/infrastructure/crosstest/index.rst (from rev 9924, trunk/sandbox/infrastructure/crosstest/index.txt) =================================================================== --- trunk/sandbox/infrastructure/crosstest/index.rst (rev 0) +++ trunk/sandbox/infrastructure/crosstest/index.rst 2024-09-10 18:25:17 UTC (rev 9925) @@ -0,0 +1,70 @@ +=================== +docutils cross test +=================== + +:Date: $Date$ + +Testing against/with/through several python installations. + +tox does this ... somehow ... trying to do it explicit. + +* test with PYTHONWARNINGS=default + + this shows deprecation warnings. + +* and LC_ALL=C + +Log +--- + +* setup a virtual environment with every python + include wheel + +* build a wheel with every python (in the venv ?) + + before build clean docutils:: + + find . -type f -name "*.pyc" -delete + + 3.7 and 3.10 fail : _ctypes missing + + 3.6 and 3.8 have the same md5sum, others differ. + +* missing _ctypes for 3.7 and 3.10 + + - install libffi-dev + + python 3.7 works + + but 3.10a6 fails building venv :: + + python3.10 -m venv a + Error: subprocess not supported for isolated subinterpreters + + find a + a/lib + a/lib/python3.10 + a/lib/python3.10/site-packages + a/lib64 + a/include + a/bin + a/bin/python3 + a/bin/python + a/bin/python3.10 + a/pyvenv.cfg + + For now skip 3.10 + +* test wheel from 3.7 in every venv + with + + export LC_ALL=C + export PYTHONPATH= + export PYTHONWARNINGS=default + +MAYBE + +* test every wheel in every venv + + + Deleted: trunk/sandbox/infrastructure/crosstest/index.txt =================================================================== --- trunk/sandbox/infrastructure/crosstest/index.txt 2024-09-10 18:17:15 UTC (rev 9924) +++ trunk/sandbox/infrastructure/crosstest/index.txt 2024-09-10 18:25:17 UTC (rev 9925) @@ -1,70 +0,0 @@ -=================== -docutils cross test -=================== - -:Date: $Date$ - -Testing against/with/through several python installations. - -tox does this ... somehow ... trying to do it explicit. - -* test with PYTHONWARNINGS=default - - this shows deprecation warnings. - -* and LC_ALL=C - -Log ---- - -* setup a virtual environment with every python - include wheel - -* build a wheel with every python (in the venv ?) - - before build clean docutils:: - - find . -type f -name "*.pyc" -delete - - 3.7 and 3.10 fail : _ctypes missing - - 3.6 and 3.8 have the same md5sum, others differ. - -* missing _ctypes for 3.7 and 3.10 - - - install libffi-dev - - python 3.7 works - - but 3.10a6 fails building venv :: - - python3.10 -m venv a - Error: subprocess not supported for isolated subinterpreters - - find a - a/lib - a/lib/python3.10 - a/lib/python3.10/site-packages - a/lib64 - a/include - a/bin - a/bin/python3 - a/bin/python - a/bin/python3.10 - a/pyvenv.cfg - - For now skip 3.10 - -* test wheel from 3.7 in every venv - with - - export LC_ALL=C - export PYTHONPATH= - export PYTHONWARNINGS=default - -MAYBE - -* test every wheel in every venv - - - Modified: trunk/sandbox/infrastructure/docutils-update.local =================================================================== --- trunk/sandbox/infrastructure/docutils-update.local 2024-09-10 18:17:15 UTC (rev 9924) +++ trunk/sandbox/infrastructure/docutils-update.local 2024-09-10 18:25:17 UTC (rev 9925) @@ -14,8 +14,8 @@ # # ATTENTION # -# Any .html document with a corresponding .rst or .txt file is regenerated -# if the .rst/.txt has changed, but no new .html files will be generated. +# Any .html document with a corresponding .rst file is regenerated +# if the .rst has changed, but no new .html files will be generated. # # ATTENTION # @@ -24,6 +24,8 @@ # add --smartquotes=true to convert smartquotes. # Maybe add special treatment and remove this general solution. # +# * Funny thing: sf hides README.rst and .txt files. +# # Options: # -f Do not give feedback. # -t Run the script in trace mode ("set -o xtrace"). Copied: trunk/sandbox/infrastructure/releasing-log.rst (from rev 9924, trunk/sandbox/infrastructure/releasing-log.txt) =================================================================== --- trunk/sandbox/infrastructure/releasing-log.rst (rev 0) +++ trunk/sandbox/infrastructure/releasing-log.rst 2024-09-10 18:25:17 UTC (rev 9925) @@ -0,0 +1,1871 @@ +Releasing +========= + +:Contact: gr...@us..., doc...@us... +:Revision: $Revision$ +:Date: $Date$ +:Copyright: This document has been placed in the public domain. + +Notes on what happend while releasing. + +Release 0.22b0.dev0 (2024-08-14) +================================ + +To test installing sdist from testpyi: failed flit is required to be +available on testpypi (IMHO). + +* Make a clean checkout of svn.code.sf.net/p/docutils/code/trunk/docutils + +* skip till + + Run tests :: + + export PYTHONWARNINGS=default + python3 test/alltests.py + + and with tox. + + ``export PYTHONWARNINGS=default`` prints DeprecationWarnings in python3. + + No warnings or errors. + +* Generate wheel and source-distribution:: + + python3 -m pip install build + python3 -m build . + + check file sizes: the 0.21.2 wheel was 574K the sdist 2,2M. + ... similar sizes. + +* Upload wheel and source to test.pypi. + + Set repository and key in ~/.pypirc with a <server-name> and + password token:: + + python3 -m twine upload --repository <server-name> dist/* + + Change directory outside of checkout and test in venv. + NOTE use --pre for prereleases:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --index-url https://test.pypi.org/simple/ --pre --no-deps docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + Ignore missing HISTORY.txt it is not in the wheel file. + if ok :: + + deactivate ; cd .. ; rm -r du3 + + Test the sdist:: + + python3 -m venv du3s ; cd du3s + export PYTHONPATH= ; . bin/activate + + pip install --index-url https://test.pypi.org/simple/ --no-binary docutils docutils + + sdist installation fails with subprocess not finding flit_core . + test.pypi has flit 3.5.1 but installs 0.5 preinstalling flit_core did not work + either ... why. + + Installing build into the venv did not help and flit neither. + +Release 0.21.2 (2024-04-23) +=========================== + +follow docs/dev/release.txt + +Release 0.21.1 (2024-04-10) +=========================== + +Because adding post-release numbers in a rush is not considered good +and on pypi it 0.21.post2 would be a new release anyway. + +follow docs/dev/release.txt + +everything fine till ... install sdist +-------------------------------------- + +The error :: + + pip install --index-url https://test.pypi.org/simple/ --no-deps --no-binary docutils -U docutils + Looking in indexes: https://test.pypi.org/simple/ + Requirement already satisfied: docutils in ./lib/python3.12/site-packages (0.21) + Collecting docutils + Using cached https://test-files.pythonhosted.org/packages/14/1c/642f839d386b7e88da5ed5d15ad9ae100bac9e86b4cb0781ebfebdc9c42f/docutils-0.21.1.tar.gz (2.2 MB) + Installing build dependencies ... error + error: subprocess-exited-with-error + + × pip subprocess to install build dependencies did not run successfully. + │ exit code: 1 + ╰─> [3 lines of output] + Looking in indexes: https://test.pypi.org/simple/ + ERROR: Could not find a version that satisfies the requirement flit_core<4,>=3.4 (from versions: none) + ERROR: No matching distribution found for flit_core<4,>=3.4 + [end of output] + + note: This error originates from a subprocess, and is likely not a problem with pip. + error: subprocess-exited-with-error + + × pip subprocess to install build dependencies did not run successfully. + │ exit code: 1 + ╰─> See above for output. + + note: This error originates from a subprocess, and is likely not a problem with pip. + +there is no "flit_core" on testpypi only "flit 0.5". +Preinstalling "flit_core 3.9" in the "venv" does not help either. + +Even with preinstalled flit_core 3.9 :: + + Using cached https://test-files.pythonhosted.org/docutils-0.21.1.tar.gz (2.2 MB) + Installing build dependencies ... error + error: subprocess-exited-with-error + + × pip subprocess to install build dependencies did not run successfully. + │ exit code: 1 + ╰─> [3 lines of output] + Looking in indexes: https://test.pypi.org/simple/ + ERROR: Could not find a version that satisfies the requirement flit_core<4,>=3.4 (from versions: none) + ERROR: No matching distribution found for flit_core<4,>=3.4 + [end of output] + + note: This error originates from a subprocess, and is likely not a problem with pip. + + (du3s) engelbert@ooney:~/projects/du3s$ pip list + Package Version + --------- ------- + docutils 0.21.1 + flit 3.2.0 + flit_core 3.9.0 + pip 24.0 + +Postbone to pypi. + +* retest wheel from test.pypi. + +Continue release.txt + +* Commit changes ... the changed version number. + +* If final release tag #.# (Note: only directory docutils is copied):: + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils \ + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-#.# \ + -m "tagging release #.#" + +* Rebuild wheel and source-distribution :: + + rm dist/* + python3 -m flit build + +* Now upload to pypi:: + + python3 -m twine upload --repository <server-name> dist/docutils-#.#* + +* Remove previous package from local cache:: + + find .cache/pip/wheels -name docutils\*whl -exec rm -v -i {} \; + +* test sdist:: + + pip install --no-binary docutils docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + Ignore missing pil. + + Note: + + ``--no-binary all`` did install docutils wheel. + +* test the binary: ok + +Continue to end. + + +Release 0.21 (2024-04-09) +========================= + +(follow docs/dev/release.txt) + +everything fine till ... +------------------------ + +preparing docs upload + + For final releases continue + + * upload source and generated html to sf-htdocs/#.# :: + + mkdir tmp1 + cd tmp1 + tar xzvf ../dist/docutils-0.21.tar.gz + cd docutils-#.#/ + python3 tools/buildhtml.py . + +the sdist only contains :: + + COPYING.txt docutils PKG-INFO pyproject.toml + +on 20.1 it was :: + + BUGS.txt docutils.conf install.py README.txt test + COPYING.txt docutils.egg-info licenses RELEASE-NOTES.txt THANKS.txt + docs FAQ.txt MANIFEST.in setup.cfg tools + docutils HISTORY.txt PKG-INFO setup.py tox.ini + +HACK for the release, check flit later. +Copy following files and directories from source directory:: + + BUGS.txt docutils.conf FAQ.txt HISTORY.txt licenses README.txt RELEASE-NOTES.txt + THANKS.txt + docs + tools + +Stop release process before uploading source tarball to sourceforge. + +"flit"'s ``--use-vcs`` only works for "git" and "hg", therefore not for us. + +* fix: pyproject.toml +* build new distribution: ``python -m flit build`` +* check sdist +* copy the sdist to docutils-0.21.post1.tar.gz +* and upload to pypi + + Error : only one sdist per release allowed. + +* Deleting the sdist in pypi-web-interface. +* upload again ... worked. + +* Upload to sourceforge.net + +* commit changes: pyproject.toml, docs/dev/release.txt + +* set version 0.22b.dev + +pip does not like the post1 +--------------------------- + +installing from source breaks :: + + pip install --no-binary docutils docutils + + Discarding ... docutils-0.21.post1.tar.gz has inconsistent version: + expected '0.21.post1', but metadata has '0.21' + +* patch VersionInfo to use serial for post# when releaselevel is "fimal". +* flit build:: + + 591K docutils-0.21.post2-py3-none-any.whl + 2,2M docutils-0.21.post2.tar.gz + +* upload to testpypi +* test :: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + +* test nobinary :: + + python3 -m venv du3p ; cd du3p + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-binary all docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + passes except the missing pil and pngs ... as usual. + +But consensus is 0.21.1 + + +Release 0.20.1 (2023-05-17) +=========================== + +(follow docs/dev/release.txt) + +* Make a clean checkout of svn.code.sf.net/p/docutils/code/trunk/docutils + to avoid having development files in the released packages. + +* Update RELEASE-NOTES.txt add section ``Release <version>``. + + Consult HISTORY.txt for important changes. + +* Change HISTORY.txt title ``Changes Since <previous release>`` to ``Release <version>``. + +* Set new version (replace ``<version>`` with the new version indentifier + and ``<docutils-repository-root>`` with the dir containing + ``HISTORY.txt`` and ``RELEASE-NOTES.txt``):: + + cd <docutils-repository-root> + ../sandbox/infrastructure/set_version.sh <version> + + Check what was changed by ``set_version.sh``. + + Run tests :: + + export PYTHONWARNINGS=default + python3 test/alltests.py + + or use tox. + In case of errors, clearing ``docutils/__pycache__`` may help. + + ``export PYTHONWARNINGS=default`` prints DeprecationWarnings in python3. + +* Generate wheel and source-distribution:: + + python3.11 setup.py sdist + python3.11 setup.py bdist_wheel + +* check sdist for html-files in docutils.egg-info. +* Upload wheel and source to test.pypi:: + + python3.11 -m twine upload --repository docutils_testpypi dist/docutils-0.20.1* + + *docutils_testpypi* is a repository configured in .pypirc. + + Test in venv. NOTE use --pre for prereleases:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --pre --no-deps docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + As expected HISTORY fails because it is not in the package. + + python -m pip uninstall docutils + deactivate ; cd .. ; rm -r du3 + +* Commit changes ... the changed version number. + +* tag #.# (Note: only directory docutils is copied):: + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils \ + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-#.# \ + -m "tagging release #.#" + +* Update your source directory. + + Nothing changed. + +* Now upload the same files to pypi:: + + python3.11 -m twine upload --repository docutils_pypi dist/docutils-0.20.1* + +* Remove previous package from local cache:: + + find .cache/pip/wheels -name docutils\*whl -exec rm -v -i {} \; + +* and test:: + + python3.11 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps docutils + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + python -m pip uninstall docutils + deactivate ; cd .. ; rm -r du3 + +* Notify to docutils-developer and user. + +* upload source and generated html to sf-htdocs/0.20.1 :: + + mkdir tmp1 + cd tmp1 + tar xzvf ../dist/docutils-0.20.1.tar.gz + cd docutils-0.20.1/ + python3.11 tools/buildhtml.py . + + check for html-files in docutils.egg-info/ ... None:: + + find . -name \*.pyc -exec rm -v {} \; + find . -name __pycache__ -exec rmdir -v {} \; + rm -r docutils.egg-info + rsync -e ssh -r -t ./ web.sourceforge.net:/home/project-web/docutils/htdocs/0.20.1 + +* Check web/index.txt for necessary corrections. +* Run sandbox/infrastructure/docutils-update.local to update web-content. +* Release to sourceforge. + + - Upload docutils-#.#.tar.gz and release notes to sourceforge. + - Select docutils-#.#.tar.gz as default for all OS. + +* set_version 0.20.2b.dev +* tox: py3.7 3.8 3.9 3.10 3.11 +* docutils/HISTORY.txt: add title "Changes Since 0.20.1" +* run sandbox/infrastructure/docutils-update.local + + +Release 0.20 (2023-05-09) +========================= + +(follow docs/dev/release.txt) + +release (2023-05-09) + +* Update RELEASE-NOTES.txt add section ``Release 0.20``. + + Changes were already done on canditate + +* Change HISTORY.txt title ``Release 0.20 (2023-05-09)``. + +* Set new version (replace ``<version>`` with the new version indentifier + and ``<docutils-repository-root>`` with the dir containing + ``HISTORY.txt`` and ``RELEASE-NOTES.txt``):: + + cd <docutils-repository-root> + ../sandbox/infrastructure/set_version.sh <version> + +* run tox 3.7 ... 3.11, run python3.12 alltests.py + + all OK. + +* Generate wheel and source-distribution:: + + python3 setup.py sdist + python3 setup.py bdist_wheel + +* Upload wheel and source to test.pypi:: + + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* + + Test in venv. :: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + python -m pip uninstall docutils + deactivate ; cd .. ; rm -r du3 + +* Commit changes ... the changed version number. + +* tag #.# (Note: only directory docutils is copied):: + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils \ + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-0.20 \ + -m "tagging release 0.20" + +* Update your source directory. +* Rebuild wheel and source-distribution :: + + python3 setup.py sdist + python3 setup.py bdist_wheel + +* Now upload to pypi:: + + python3 -m twine upload dist/docutils-0.20* + +* and test:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps docutils + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + deactivate ; cd .. ; rm -r du3 + +* Notify to docutils-developer and user. + +* upload source and generated html to sf-htdocs/#.# :: + + mkdir tmp1 + cd tmp1 + tar xzvf ../dist/docutils-0.20.tar.gz + cd docutils-0.20/ + python3 tools/buildhtml.py . + find . -name \*.pyc -exec rm -v {} \; + find . -name __pycache__ -exec rmdir -v {} \; + rm -r docutils.egg-info + rsync -e ssh -r -t ./ web.sourceforge.net:/home/project-web/docutils/htdocs/0.20 + +* Check web/index.txt for necessary corrections. Nothing changed. +* Run sandbox/infrastructure/docutils-update.local to update web-content. +* Release to sourceforge. + + - Upload docutils-0.20.tar.gz and release notes to sourceforge. + - Select docutils-0.20.tar.gz as default for all OS. + +* set_version 0.20.1b.dev +* run tox : OK +* docutils/HISTORY.txt: add title "Changes Since 0.20" +* commit +* run sandbox/infrastructure/docutils-update.local + +release candidate 1 (2023-05-04) +-------------------------------- + +* svn update +* run tox : py3.7 to py3.11 : OK +* run tests with 3.12.0a7 : OK + +* Update RELEASE-NOTES.txt add section ``Release <version>``. + + Consult HISTORY.txt for important changes. + +* Change HISTORY.txt title ``Changes Since <previous release>`` to ``Release <version>``. + +* Set new version with ``sandbox/infrastructure/set_version.sh <version>`` + + run tox (py3.7 to 3.11) + + Check docutils/__init__.py __version_info__ tuple. : OK + + Run tests :: + + export PYTHONWARNINGS=default + python3 test/alltests.py + + OK , no warnings (really no) + +* Generate wheel and source-distribution:: + + python3 setup.py sdist + python3 setup.py bdist_wheel + +* Upload wheel and source to test.pypi:: + + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* + +* Test in venv. NOTE use --pre for prereleases:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --pre --no-deps docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + HISTORY.txt is not installed with wheel. + + Clean up:: + + python -m pip uninstall docutils + deactivate ; cd .. ; rm -r du3 + +* Commit changes ... the changed version number. + +* Now upload to pypi:: + + python3 -m twine upload dist/docutils-0.20* + +* Remove previous package from local cache:: + + find .cache/pip/wheels -name docutils\*whl -exec rm -v -i {} \; + +* and test:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --pre --no-deps docutils + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + HISTORY.txt is missing. + + Clean up:: + + deactivate ; cd .. ; rm -r du3 + +* Notify to docutils-developer and user. + +* update web page. + +TODO on release tag the source + +Release 0.19 (2022-07-05) +========================= + +(follow docs/dev/release.txt) + +* svn update +* run tox +* run tests with py3.6 to 3.11 + +* Update RELEASE-NOTES.txt add section ``Release <version>``. + + Consult HISTORY.txt for important changes. + +* Change HISTORY.txt title ``Changes Since <previous release>`` to ``Release <version>``. + +* Set new version with ``sandbox/infrastructure/set_version.sh <version>`` + + Check what was changed with version control system by ``set_version.sh`` + + Change docutils/__init__.py __version_info__ tuple. + + Run tests :: + + export PYTHONWARNINGS=default + python3 test/alltests.py + + or use tox. + + ``export PYTHONWARNINGS=default`` prints DeprecationWarnings in python3. + +* Generate wheel and source-distribution:: + + python3 setup.py sdist + python3 setup.py bdist_wheel + +* Upload wheel and source to test.pypi:: + + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* + + Test in venv. NOTE use --pre for prereleases:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + python -m pip uninstall docutils + deactivate ; cd .. ; rm -r du3 + +* Commit changes ... the changed version number. + +* tag 0.## (Note: only directory docutils is copied):: + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils \ + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-0.19 \ + -m "tagging release 0.19" + +* Update your source directory. +* Rebuild wheel and source-distribution :: + + python3 setup.py sdist + python3 setup.py bdist_wheel + +* Now upload to pypi:: + + python3 -m twine upload dist/docutils-0.19* + +* Remove previous package from local cache:: + + find .cache/pip/wheels -name docutils\*whl -exec rm -v -i {} \; + +* and test:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps docutils + cp -Lr ../docutils-code/docutils/test . + python test/alltests.py + + deactivate ; cd .. ; rm -r du3 + +* Notify to docutils-developer and user. + +* upload source and generated html to sf-htdocs/0.19 :: + + mkdir tmp1 + cd tmp1 + tar xzvf ../dist/docutils-0.19.tar.gz + cd docutils-0.19/ + tools/buildhtml.py . + find . -name \*.pyc -exec rm -v {} \; + find . -name __pycache__ -exec rmdir -v {} \; + rm -r docutils.egg-info + rsync -e ssh -r -t ./ web.sourceforge.net:/home/project-web/docutils/htdocs/0.19 + +* Check web/index.txt for necessary corrections. +* Run sandbox/infrastructure/docutils-update.local to update web-content. +* Release to sourceforge. + + - Upload tar.gz and 0.19 release notes to sourceforge. + - Select docutils-0.19.tar.gz as default for all OS. + +* set_version 0.19.1b.dev +* test with py3 +* docutils/HISTORY.txt: add title "Changes Since 0.##" +* svn commit +* run sandbox/infrastructure/docutils-update.local + +Problems while releasing 0.19b1 +=============================== + +* If docutils is installed into virtual environment and + the test directory is copied from development directory + with ``cp -Lr ...``:: + + -L, --dereference + always follow symbolic links in SOURCE + + - finding ``HISTORY.txt`` in test_utils.py fails. + Create a HISTORY.txt file to avoid. + +setup.cfg contained the universal setting that generated py2py3 wheels. + +Release 0.19b1 (2022-06-21) +=========================== + +* run tox: +* set_version 0.19b1 +* tox again +* Generate universal wheel and source-distribution :: + + python3 setup.py sdist + python3 setup.py bdist_wheel + +* Upload universal wheel and source to test.pypi:: + + twine upload --repository-url https://test.pypi.org/legacy/ dist/docutils-0.19b* + +* test in venvs: ignore wrong paths and un-embedded images + +* upload to pypi:: + + twine upload dist/docutils-0.19* + +* and test: python uses the cached download from the previous test. + + - remove from pip cache:: + + find .cache/pip/wheels -name docutils\*whl + +ERROR (fixed in r9089) + + ``python3 setup.py bdist_wheel`` builds a docutils-0.19b1-py2.py3-none-any.whl + although python > 3.7 is required ... will this break python2 installations ? + + This happens with option universal and without and also if using *build*. + + Testing with python2.7 : only 0.18 is installed, even with --pre and -U. + + Locally cached wheels may pose a problem, though. + Cf. https://github.com/marshmallow-code/marshmallow/issues/1860 + +* set_version 0.19b2.dev and change __version_info_structure. +* tox +* commit +* Run sandbox/infrastructure/docutils-update.local to update web-content. + +Release 0.18.1 (2021-11-23) +=========================== + +follow docs/dev/release.txt + +Release 0.18.1b (2021-11-18) +============================ + +* run tox: passed 2.7, 3.5 ... 3.11 +* set_version 0.18.1b +* tox again +* commit : release 0.18.1b +* Generate universal wheel and source-distribution with py3.8:: + + python3 setup.py sdist + python3 setup.py bdist_wheel --universal + +* Upload universal wheel and source to test.pypi:: + + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/docutils-0.18.1b0* + +* test in venvs: ignore wrong paths and un-embedded images + +* upload to pypi:: + + python3.9 -m twine upload dist/docutils-0.18.1b0* + +* and test: Note python3 uses the cached download from the python2 test. + + - remove from pip cache:: + + find .cache/pip/wheels -name docutils\*whl + +* set_version 0.18.1b1.dev +* tox +* commit +* Run sandbox/infrastructure/docutils-update.local to update web-content. + +Release 0.18 (2021-10-26) +========================= + +* beta is out for three weeks. +* announce soft freeze on dev-mail. +* run tox: passed 2.7, 3.5 ... 3.11 +* set_version 0.18 +* tox again +* commit : release 0.18 +* Generate universal wheel and source-distribution with py39. +* Upload universal wheel and source to test.pypi. +* test in venvs: ignore wrong paths and un-embedded images +* tag release 0.18 + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-0.18 + -m "tagging release 0.18" + +* upload to pypi +* and test: Note python3 uses the cached download from the python2 test. + + +* upload source and generated html to sf-htdocs/0.18 + + mkdir tmp1 + cd tmp1 + tar xzvf ../dist/docutils-0.18.tar.gz + cd docutils-0.18/ + tools/buildhtml.py . + find . -name \*.pyc -exec rm {} \; + rm -rf docutils.egg-info + rsync -e ssh -r -t ./ web.sourceforge.net:/home/project-web/docutils/htdocs/0.18 + +* Check web/index.txt for necessary corrections : None necessary. +* Release to sourceforge. + + - Upload tar.gz and 0.18 release notes to sourceforge. + - Select docutils-0.18.tar.gz as default for all OS. + +* set_version 0.18.1.dev +* tox +* docutils/HISTORY.txt: add title "Changes Since 0.18" +* Notify docutils-developer and user. +* Run sandbox/infrastructure/docutils-update.local to update web-content. + +Release 0.17 aftermath +====================== + +:2021-04-05: Fixed: on-ASCII characters in docutils/writers/latex2e/docutils.sty + +:2021-04-04: Open: [readthedocs/recommonmark] + AttributeError: 'Values' object has no attribute 'tab_width' (#220) + + pinning to docutils 0.16 helped ... why ? + +Release 0.17.1 (2021-04-16) +=========================== + +* tox with 2.7 3.5, 3.6, 3.7, 3.8, 3.9, 3.10 +* set_version 0.17.1 +* tox again +* commit : release 0.17.1 +* Generate universal wheel and source-distribution with py38. +* Upload universal wheel and source to test.pypi. +* test in venvs ... and then next problem pypi caches 0.17.1b2. + + --no-cache-dir does not help. + + call twice, second time with ``--upgrade``. + +* tag release 0.17.1 +* upload to pypi +* and test +* Notify docutils-developer and user. +* upload source and generated html to sf-htdocs/0.17.1 +* Check web/index.txt for necessary corrections : None necessary. +* Release to sourceforge. +* set_version 0.17.2b.dev +* tox +* docutils/HISTORY.txt: add title "Changes Since 0.17.1" +* run sandbox/infrastructure/docutils-update.local + + +Release 0.17.1 (2021-04-12 ...) +=============================== + +* tox with 2.7 3.5, 3.6, 3.7, 3.8, 3.9, 3.10 + + - 3.7 and 3.10 fail. Both with :: + + from _ctypes import Union, Structure, Array + ModuleNotFoundError: No module named '_ctypes' + + testing against development source passes. + + Test crosstest, see subdirectory + + 3.7 and 3.10 require libffi-dev to build local + then tox passes for 3.5 to 3.10. + +Release 0.17.1b1 (2021-04-09) +============================= + +* tox with 2.7 3.5, 3.6, 3.8, 3.9 + +* with LC_ALL=C and PYTHONWARNINGS=default + + python3.6 and python3.10.0a :: + + docutils/utils/smartquotes.py:639: DeprecationWarning: invalid escape sequence \[ + ch_classes = {'open': u'[(\[{]', # opening braces + docutils/test/test_writers/test_manpage.py:62: DeprecationWarning: invalid escape sequence \- + ... several of the same + +* recommonmark tests:: + + python3.6 -m pip install --user recommonmark + # 0.7.1 + + python3.6 test/alltests.py + FAILED (failures=17, errors=17, skipped=1) + + input: + b'\nExternal hyperlink [target]s:\n\n[target]: http://www.python.org/\n' + -: expected + +: output + <document source="test data"> + <paragraph> + External hyperlink + - <reference name="target" refuri="http://www.python.org/"> + ? -------------- + + <reference refuri="http://www.python.org/"> + target + s: + + only works with recommonmark 0.4 + +* Generate universal wheel and source-distribution with py38. +* Upload universal wheel and source to test.pypi. +* Test in python3.8 venv + + Fails. + + Inside virtualenv :: + + >>> import docutils.parsers.recommonmark_wrapper as rw + >>> dir(rw) + ['Parser', '__builtins__', '__cached__', '__doc__', '__file__', + '__loader__', '__name__', '__package__', '__spec__', + '_recommonmarkParser', 'docutils', 'nodes', 'with_recommonmark'] + + In development directory :: + + >>> import docutils.parsers.recommonmark_wrapper as rw + >>> dir(rw) + ['CommonMarkParser', 'Component', 'Parser', '__builtins__', + '__cached__', '__doc__', '__file__', '__loader__', + '__name__', '__package__', '__spec__', 'docutils', 'nodes'] + + Depending on recommonmark being installed in the running python + version or not ``CommonMarkParser`` is a class or None. + +* Rebuild the wheel after running tox (this cleans caches). + Cannot be uploaded to testpypi because it is the same name. + + Install the whl from dist-directory into py38 venv. + Ok. + +* New version 0.17.1b1.dev because pypi does not allow changing uploads. +* Run tox and python3.10 test. +* Commit new version number +* build sdist and universal wheel with py39. +* Install wheel from dist into venv py39. + + Test passes (embedding fails because images are missing). + +* Upload universal wheel and source to test.pypi. +* Install into py39 venv : This time install the --pre release + tests pass. + +* upload to pypi. +* test in py39 venv. Passed +* test in py39 venv with LC_ALL=C. Passed +* test in venv with recommonmark==0.4: fails . requires module html. + +* notify docutils-develop and user and sphinx. +* New version 0.17.1b2.dev + +Release 0.17 (2021-04-03 ...) +============================= + +* tox with 2.7 3.8, 3.9 + + 3.10a6 misses _ctypes. + +* copy more things from HISTORY to RELEASE-NOTES + +* ``set_version.sh 0.17`` + +* Run tests manually and via tox: + + ======== ====== + pyvers time + ======== ====== + 2.7 7.3 + 3.8 6.5 + 3.9 6.5 + 3.10 7.2 + ======== ====== + +* Generate universal wheel and source-distribution. +* Upload universal wheel and source to test.pypi. + Wait some minutes to test in python2 virtualenv. + + Test in python3.10 venv. + + Stylesheet paths are different and image embedding fails + because images are not found. + + After copying ``docs/user/rst/images`` from docutils into the + venv-directory/docs/user/rst/images image embedding works. + +* Commit changes to version control system. +* tag 0.17 (Note: only directory docutils is copied):: + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils \ + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-0.17 \ + -m "tagging release 0.17" + +* Generate universal wheel and source-distribution. + Do it again and check for differences: svn-numbers and sha-fingerprints + +* Now upload to pypi (the newly created s- and bdist). +* ... and test in venv and virtualenv. +* Notify to docutils-developer and user. +* Upload source and html to sf-htdocs/0.17 + +* Check web/index.txt for necessary corrections: nothing to do. + +* Run sandbox/infrastructure/docutils-update.local to update web-content. +* Release to sourceforge. + + - Upload tar.gz and 0.17 release notes to sourceforge. + - Select docutils-0.17.tar.gz as default for all OS. + +* set_version 0.18b.dev +* test with py2 and py3 +* docutils/HISTORY.txt: add title "Changes Since 0.17" + +* run sandbox/infrastructure/docutils-update.local + +BetaRelease 0.17b1 (2021-02-10) to test.pypi +============================================ + +* tox with 2.7 3.8 and 3.9 :: + + functional/expected/standalone_rst_html5.html + + -<dl class="footnote brackets"> + ... + -<dd><p>Requires support for attributes to inline + -roles to make sense.</p> + -</dd> + -</dl> + + seams to be a moved chunk in test input but not in expected + +* Version numbering + + ``python3 setup.py clean`` tells :: + + setuptools/dist.py:473: UserWarning: Normalizing '0.17b.dev' to '0.17b0.dev0'. + + According to https://peps.python.org/pep-0440/#pre-releases + + set_version 0.17b1 + +* test :: + + export PYTHONPATH= + export PYTHONWARNINGS=default + python2 test/alltests.py + + Ran 1454 tests + OK (skipped=3) + + python3 test/alltests.py + Ran 1442 tests + OK (skipped=5) + + python has some ResourceWarning:: + + docutils/parsers/rst/directives/images.py:145: ResourceWarning: + unclosed file <_io.BufferedReader name=b'../docs/user/rst/images/title.png'> + del img + + docutils/writers/html4css1/__init__.py:578: ResourceWarning: + unclosed file <_io.BufferedReader name=b'../docs/user/rst/images/biohazard.png'> + del img + +* Upload universal wheel and source to test.pypi:: + + python3 setup.py sdist + python3 setup.py bdist_wheel --universal + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* + + Wait some minutes to test in virtualenv :: + + python2 -m virtualenv du2 ; cd du2 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps --pre docutils + # Successfully installed docutils-0.17b1 + + cp -r ~/projects/docutils-code/docutils/test . + # copy docs too for inlined images to be found + python2 test/alltests.py + # IGNORE stylesheet path differences ? + + Test in venv :: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps --pre docutils + # Successfully installed docutils-0.17b1 + + cp -r ~/projects/docutils-code/docutils/test . + cp -r ~/projects/docutils-code/docutils/docs . + python test/alltests.py + # Python 3.8.5 Linux 5.4.0 + # IGNORE stylesheet path differences ? + +* commit 0.17b1 to code.sf + +* Now upload to pypi:: + + python3 -m twine upload dist/docutils-0.17b1* + +* and test:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps --pre docutils + # 0.17b1 + cp -r ~/projects/docutils-code/docutils/test . + cp -r ~/projects/docutils-code/docutils/docs . + python test/alltests.py + # css paths fail + +* Notify to docutils-developer and user. + +* ON RELEASE then: tag 0.16 (Note: only directory docutils is copied):: + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils \ + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-0.16 \ + -m "tagging release 0.16" + +* run sandbox/infrastructure/docutils-update.local + +* set version 0.17b2.dev +* test with tox: py27 and py38 39 +* commit to code.sf +* run sandbox/infrastructure/docutils-update.local + +.. note:: final release has some extra steps + +Release 0.16 (2020-01-12) +========================= + +Set version 0.16 + +test :: + + export PYTHONWARNINGS=default + python2 test/alltests.py + python3 test/alltests.py + +Upload universal wheel and source to test.pypi:: + + python3 setup.py sdist + python3 setup.py bdist_wheel --universal + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* + +Wait some minutes to test in virtualenv :: + + python2 -m virtualenv du2 ; cd du2 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + # Successfully installed docutils-0.16 + + cp -r ~/projects/docutils-code/docutils/test . + python2 test/alltests.py + # IGNORE stylesheet path differences ? + + python -m pip uninstall docutils + deactivate ; cd .. ; rm -rf du2 + +Test in venv :: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + # Successfully installed docutils-0.16 + + cp -r ~/projects/docutils-code/docutils/test . + python test/alltests.py + # IGNORE stylesheet path differences ? + # FAIL: test_find_file_in_dirs (test_utils.HelperFunctionTests) + # FAIL: test_rst/ interpreted directives/code ... + # classes="keyword" is "name builtin" in 3.8.0b3 on Darwin 15.6.0 + +Now upload to pypi:: + + python3 -m twine upload dist/docutils-0.16* + +and test:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps docutils + # 0.16 + cp -r ~/projects/docutils-code/docutils/test . + python test/alltests.py + # css paths fail + + python2 -m virtualenv du2 ; cd du2 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps docutils + # 0.16 + cp -r ~/projects/docutils-code/docutils/test . + python test/alltests.py + # css paths fail + +Notify to docutils-developer and user. + +* tag 0.16 (Note: only directory docutils is copied):: + + svn copy svn+ssh://gr...@sv.../p/docutils/code/trunk/docutils \ + svn+ssh://gr...@sv.../p/docutils/code/tags/docutils-0.16 \ + -m "tagging release 0.16" + +* upload doc/0.16 :: + + mkdir tmp1 + cd tmp1 + tar xzvf ../dist/docutils-0.16.tar.gz + cd docutils-0.16/ + tools/buildhtml.py . + find . -name \*.pyc -exec rm {} \; + rm -rf docutils.egg-info + rsync -e ssh -r -t ./ web.sourceforge.net:/home/project-web/docutils/htdocs/0.16 + +* change web index.txt +* run sandbox/infrastructure/docutils-update.local + +* set version 0.17b.dev +* test with py2 and py3 +* run sandbox/infrastructure/docutils-update.local + +* docutils/HISTORY.txt: change title "Changes since 0.15" to "Release 0.16" + add "Changes since 0.16" +* docutils/RELEASE-NOTES.txt change title "Release 0.16b ..." to Release 0.16 ..." + +* Release to sourceforge. + + - Remove test/outputs from tar.gz. + - Upload tar.gz and 0.16 release notes to sourceforge. + - Select docutils-0.16.tar.gz as default for all OS. + +Release 0.16rc1 +--------------- + +Set version 0.16rc1 + +test :: + + export PYTHONWARNINGS=default + python2 test/alltests.py + python3 test/alltests.py + +Fix: DeprecationWarning: Please use assertEqual in test_nodes. + +Upload universal wheel and source to test.pypi:: + + python3 setup.py sdist + python3 setup.py bdist_wheel --universal + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* + +Wait some minutes to test in virtualenv :: + + python2 -m virtualenv du2 ; cd du2 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + # Successfully installed docutils-0.15.2 + python -m pip uninstall docutils + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps --pre docutils + # Successfully installed docutils-0.16Crc1 + + cp -r ~/projects/docutils-code/docutils/test . + python2 test/alltests.py + # IGNORE stylesheet path differences ? + + # -<link rel="stylesheet" href="../input/data/html4css1.css" type="text/css" /> + # -<link rel="stylesheet" href="../input/data/math.css" type="text/css" /> + # +<link rel="stylesheet" href="../../html4css1.css" type="text/css" /> + # +<link rel="stylesheet" href="../../math.css" type="text/css" /> + + deactivate ; cd .. ; rm -rf du2 + +Test in venv :: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + # Successfully installed docutils-0.15.2 + python -m pip uninstall docutils + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps --pre docutils + # Successfully installed docutils-0.16b0.dev0 + cp -r ~/projects/docutils-code/docutils/test . + python test/alltests.py + +Seven CSS-path failures ... ignored for now:: + + deactivate ; cd .. ; rm -rf du3 + +Now upload to pypi:: + + python3 -m twine upload dist/docutils-0.16rc1* + +and test:: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps --pre docutils + # 0.16rc1 + cp -r ~/projects/docutils-code/docutils/test . + python test/alltests.py + # css paths fail + + python2 -m virtualenv du2 ; cd du2 + export PYTHONPATH= ; . bin/activate + + pip install --no-deps --pre docutils + # 0.16rc1 + cp -r ~/projects/docutils-code/docutils/test . + python test/alltests.py + # css paths fail + +Notify to docutils-developer and user. + +Release 0.15 (2019-07-24) +========================= + +branches/rel-0.15 + +CAUTION (2019-07-22) +==================== + + While releasing 0.15 :: + + python3 setup.py sdist bdist_wheel + python2 setup.py bdist_wheel + + This will result in the py2 wheel being identical to the py3 one. + + The name ``docutils-0.15-py2-none-any.whl`` cannot be used twice on pypi, + build the py2-wheel and rename it ``docutils-0.15.post1-py2-none-any.whl``. + (No code was changed therefore only filename change.) + + Name it ``docutils-0.15-post1-py2-none-any.whl`` then the version in the filename + corresponds to the directory names in the wheel file. + + Maybe change the the version number in setup.py ? + +Release 0.15.2 (2019-07-30) +=========================== + +Bump the version number to ease tool live. + +Bump version :: + + set_version 0.15.2 + python2 test/alltests.py + python3 setup.py test3/alltests.py + # visual inspection + svn di | grep '^[+-]' | less -p '0.15.[12]' + svn ci + +Build py2 release upload to test.pypi :: + + mkdir py2 ; cd py2 + svn export svn+ssh://gr...@sv.../p/docutils/code/branches/rel-0.15/docutils + cd docutils + python2 setup.py sdist bdist_wheel + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/docutils-0.15.2-py2-none-any.whl + +Test in virtualenv :: + + virtualenv du2 ; cd du2 + export PYTHONPATH= ; . bin/activate + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + cp -r ~/projects/docutils-rel-0.15/docutils/py2/docutils/test . + python2 test/alltests.py + # IGNORE stylesheet path differences + + deactivate ; cd .. ; rm -rf du2 + +release to pypi from the exported source directory :: + + python3 -m twine upload dist/docutils-0.15.2* + +Test in new virtualenv :: + + virtualenv du2 ; cd du2 + export PYTHONPATH= ; . bin/activate + + pip install docutils + # Successfully installed docutils-0.15.2 + + cp -r ~/projects/docutils-rel-0.15/docutils/py2/docutils/test . + python2 test/alltests.py + # IGNORE stylesheet path differences + + deactivate ; cd .. ; rm -rf du2 + +Build py3 release upload to test.pypi. +In the export/docutils :: + + # py3 and source + python3 setup.py bdist_wheel + python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/docutils-0.15.2-py3-none-any.whl + +Test in virtualenv :: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + +BUG install 0.15 source. Check test.pypi web interface ... py3-wheel is there. +Retry:: + + # Successfully installed docutils-0.15.2 + cp -r ~/projects/docutils-rel-0.15/docutils/py2/docutils/test3 . + python test3/alltests.py + # IGNORE upper directory Failure + + deactivate ; cd .. ; rm -rf du3 + +release to pypi from the exported source directory :: + + python3 -m twine upload dist/docutils-0.15.2-py3* + +Wait for wheel to appear on pypi.org. + +Test in virtualenv :: + + python3 -m venv du3 ; cd du3 + export PYTHONPATH= ; . bin/activate + + pip install docutils + # Successfully installed docutils-0.15.2 + + cp -r ~/projects/docutils-rel-0.15/docutils/py2/docutils/test3 . + python test3/alltests.py + # IGNORE upper directory Failure + + deactivate ; cd .. ; rm -rf du3 + +FINE 0.15.2 + +Release 0.15.1 (2019-07-24) +=========================== + +Bug fix release for python2 only. + +* set version 0.15.1 +* ``python2 setup.py sdist bdist_wheel`` +* ``python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/docutils-0.15.1-py2-none-any.whl `` +* in a new virtualenv:: + + python -m pip install --index-url https://test.pypi.org/simple/ --no-deps docutils + + and then test/alltests.py + +* ``python3 -m twine upload dist/docutils-0.15.1*`` + + upload py2-wheel and source. + +* in a new virtualenv:: + + python -m pip install docutils + + and then test/alltests.py + +* (2019-07-25) replace source by -post1 + + Name it ``docutils-0.15.1-post1.tar.gz`` to make sure + + * It is unchanged library code: *post1* + * the version is still 0.15.1: therefore separate with ``-`` + + * run the tests somewhere, fix and commit. + Then:: + + svn export svn+ssh://@svn.code.sf.net/p/docutils/code/branches/rel-0.15/docutils d + cd d + python2 setup.py sdist + + * check ``tar tzf dist/docutils-0.15.1.tar.gz`` for remaining files. + Then:: + + mv dist/docutils-0.15.1.tar.gz dist/docutils-0.15.1-post1.tar.gz + python -m twine upload dist/docutils-0.15.1-post1.tar.gz + + * Build a venv (python3), install docutils, copy test3 from development + directory and run the test. + + As there is no 0.15.1 wheel for python3 this will be the source package. + +Release 0.15 +============ + +svn revision: 8258 - start of release + +* test on linux 2.7 3.7 : passed +* test on macosx python2.6: + + - 7 failures due to different error messages. see below + - 4 errors: python2.6 sys.version_info is a tuple no dictionary + FIXED: revision 8260 + +* test on macosx 2.7 3.4 3.6 3.7 : passed +* change version to : 0.15rc1.dev + + - run tests: python 2.7 and 3.7 + +* extract changes from HISTORY.txt to RELEASE-NOTES.txt +* rename headings in HISTORY.txt and RELEASE-NOTES.txt +* run release.sh stage 2: do a clean checkout and packing +* run local test with python 2.6 2.7 3.4 3.6 3.7 +* upload to sourceforge.net. Keep 0.15 as latest, stable. +* Fix: README.txt version number BY HAND +* pypi : + + - docutils is registered + - check setup.py : add classifier 'Programming Language :: Python :: 3.7' + - Login to pypi (see https://packaging.python.org/tutorials/packaging-projects/) + + - python3 -m pip install --user --upgrade setuptools wheel + + (warns about not being in PATH. symlink into my/bin) + - python3 setup.py sdist bdist_wheel :: + + /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/distutils/dist.py:274: UserWarning: Unknown distribution option: 'python_requires' + warnings.warn(msg) + + error: invalid command 'bdist_wheel' + + - add import setuptools to setup.py + - python3 setup.py sdist bdist_wheel + - python2 setup.py bdist_wheel + - python3 -m pip install --user --upgrade twine + - twine upload dist/* + + check on pypi: 0.15 is there. + +* update website docs + + - in directory web edit index.txt + - in sandbox/infrastructure run ./docutils-update.local + +* set version of repository to 0.16b.dev + +Release 0.14 +============ + +svn revision: 8145 - start of release - 0.15.0 beta + +Prerelease 0.14a0 +================= + +svn revision: 8082 Prerelease 0.14a0 +svn revision: 8078 Prerelease 0.14.0a + +* merge changes from HISTORY.txt to RELEASE-NOTES.txt +* extract release number description setting from release.sh +* rename headings in HISTORY.txt and RELEASE-NOTES.txt +* run release.sh stage 2: do a clean checkout and packing +* run local test with python2.7 +* upload to sourceforge.net. Keep 0.13 as latest, stable. +* reister on to pypi and upload tgz +* pypi: unset hide old releases + + +Release 0.13 +============ + +svn revision: 7980 + +Tests +----- + +Tests are run from svn checkout, only few from install. + +* windows7 python 2.7.5: OK + +* windows7 python 3.4.1: as in previous release + + * test.css path error (filed #256) + * test_parsers\test_rst\test_directives\test_include.py:: + +* macosx 10.10 python 2.7.10: OK +* macosx 10.10 python 3.3.2: OK +* macosx 10.10 python 3.4.1: OK + +* ubuntu 12.04 python 2.7.3: OK +* ubuntu 12.04 python 3.2.3: OK + +* testing tarball 0.13.1 (build sdist) :: + + +++ functional/output/standalone_rst_html5.html + @@ -7,9 +7,9 @@ + <meta content="A test document, containing at least one example of each reStructuredText construct." lang="en" name="description" xml:lang="en" /> + -<link rel="stylesheet" href="../input/data/minimal.css" type="text/css" /> + -<link rel="stylesheet" href="../input/data/plain.css" type="text/css" /> + -<link rel="stylesheet" href="../input/data/math.css" type="text/css" /> + +<link rel="stylesheet" href="../../minimal.css" type="text/css" /> + +<link rel="stylesheet" href="../../plain.css" type="text/css" /> + +<link rel="stylesheet" href="../../math.css" type="text/css" /> + </head> + + this is because ``test/functional/input/data/minimal.css`` is a symlink to + ``../../../../docutils/writers/html5_polyglot/minimal.css`` and release_test.sh + removes directory docutils to ensure the test uses the installed docutils + not the unzipped. + + FIX: remove docutils/__init__.py + +Release 0.12 +============ + +svn revision: 7749 + +Tests +----- + +Tests are run from svn checkout, only few from install. + +Python3 tests are run :: + + rm -rf build test3 + python3 setup.py build + PYTHONPATH=build/lib python3 test3/alltests.py + +* ubuntu 8.04: python 2.4.5, 2.5.2, 2.6.7, 2.7.2 OK + + python 2.6.4rc1 6 failure due to change in error message: no such file ... + + python 3.2.3 OK + +* macosx 10.6.8: python 2.5.4, 2.7.3 + + python 2.6.1 6 failure due to change in error message: no such file ... + + python 3.2, 3.4.1 OK + +* ubuntu 14.04: pyton 2.7.6, python 3.4.0 OK + +* windows7: python 2.7.5 + + Error (filed #256): test_writers/test_html4css1_template.py:: + + stylesheet = """\ + - <link rel="stylesheet" href="/test.css" type="text/css" />""" + + <link rel="stylesheet" href="C:/test.css" type="text/css" />""" + ? ++ + + python 3.4.1 + + * test.css path error (filed #256) + * test_parsers\test_rst\test_directives\test_include.py:: + + b'Encoding:\n\n.. include:: test_parsers/test_rst/test_directives/utf-16.csv\n :encoding: utf-16\n' + File "test3\alltests.py", line 40, in write + string = string.encode('raw_unicode_escape').decode('ascii') + UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 994: ordinal not in range(128) + + fiddling with alltests.py (uncommitted) :: + + <system_message level="4" line="1" source="test data" type="SEVERE"> + <paragraph> + Problem with "raw" directive: + UnicodeDecodeError: \'utf-16-be\' codec can\'t decode bytes in position 90-91: illegal encoding + <literal_block xml:space="preserve"> + .. raw:: html + :file: test_parsers/test_rst/test_directives/utf-16.csv + :encoding: utf-16''' != '''\ + + + +Release 0.11 +============ + +Summary +------- + +``sandbox/infrastructure/release.sh`` tries running ``test/alltests.py`` after +installing the new release, this fails because + +* tests depends on e.g. ``../docs/user/rst/images/title.png`` or ``../HISTORY.txt``, + but thess are neither in the test directory tree nor in the installed software. + +* there is a lot of code trying to handle varying installation targets ``/usr/lib`` + ``/usr/local/lib` and not yet ``/usr/lib/pymodules``. + +Change testing to: + +1. build and install +2. extract docutils-<release>.tar.gz into tmp +3. remove docutils/docutils directory, just to make shure it is not used. +4. run test/alltest.py in this directory, so all files are where they are + while development. + +Following failure becuase docutils-library directory was removed, therefore +docutils/writers/html4css1/html4css1.css is not found:: + + ====================================================================== + FAIL: test_custom_stylesheet_dir (test_writers.test_html4css1_misc.SettingsTestCase) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "/... 0.11/test/test_writers/test_html4css1_misc.py", line 81, in test_custom_stylesheet_dir + self.assertIn('docutils/writers/html4css1/html4css1.css', styles) + File "/... 0.11/test/DocutilsTestSupport.py", line 138, in assertIn + msg or '%s not in %s' % _format_str(a, b)) + AssertionError: 'docutils/writers/html4css1/html4css1.css' not in u'''\ + <link rel="stylesheet" href="html4css1.css" type="text/css" /> + <link rel="stylesheet" href="data/ham.css" type="text/css" /> + ''' + + +Tests +----- + +* ubuntu 8.04 2.4.5, 2.5.2, 2.6.7, 2.7.2 OK + + python 2.6.4rc1 6 failure due to change in error message: no such file ... + + Python 3.2.3 : OK (roman.py left over from last release) + +* macosx 10.6.8: python 2.5.4, 2.7.3 + + python 2.6.1 6 failure due to change in error message: no such file ... + + python 3.2: roman.py for py3 required. + +Release.sh +---------- + +release.sh does not work on MacOSX. + +installation on ubuntu 10.04 breaks test script:: + + Working directory: /usr/local/lib/python2.6/site-packages/docutils-test + Docutils package: /usr/local/lib/python2.6/dist-packages/docutils + + ====================================================================== + FAIL: test_find_file_in_dirs (test_utils.HelperFunctionsTests) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "/usr/local/lib/python2.6/site-packages/docutils-test/test_utils.py", line 295, in test_find_file_in_dirs + '../HISTORY.txt') + AssertionError: 'HISTORY.txt' != '../HISTORY.txt' + +Stopping for now. + + + +Release 0.10 +============ + +* same failures for some python2.6 versions :: + + Problems with "raw" directive path: + - InputError: [Errno 2] No such file or directory: 'non-existent.file'. + + InputError: (2, 'No such file or directory'). + +* testing release tarball :: + + ====================================================================== + FAIL: test_dependencies (__main__.RecordDependenciesTests) + ---------------------------------------------------------------------- + Traceback (most recent call last): + File "docutils-test/test_dependencies.py", line 61, in test_dependencies + self.assertEqual(record, expected) + AssertionError: [u'data/include.txt', u'data/raw.txt'] != [u'../docs/user/rst/images/title.png', + u'data/include.txt', u'data/raw.txt'] + + ... + + because ../docs is not there if run from /usr/../pythonx.x/site-packages/docutils-test. + +Release 0.9.1 +============= + +same failures as for 0.9 plus + +* python 2.3: twice, ignored :: + + - [Errno 2] No such file or directory: 'bogus.csv'. + + [Errno 2] No such file or directory: u'bogus.csv'. + + python 2.3 :: + + ====================================================================== + ERROR: test_unicode (test_error_reporting.ErrorStringTests) + ---------------------------------------------------------------------- + Traceback (most ... [truncated message content] |
From: <gr...@us...> - 2024-09-10 18:17:16
|
Revision: 9924 http://sourceforge.net/p/docutils/code/9924 Author: grubert Date: 2024-09-10 18:17:15 +0000 (Tue, 10 Sep 2024) Log Message: ----------- FIX test_writers html4css when PIL is not installed Modified Paths: -------------- trunk/docutils/test/test_writers/test_html4css1.py Modified: trunk/docutils/test/test_writers/test_html4css1.py =================================================================== --- trunk/docutils/test/test_writers/test_html4css1.py 2024-09-10 15:30:31 UTC (rev 9923) +++ trunk/docutils/test/test_writers/test_html4css1.py 2024-09-10 18:17:15 UTC (rev 9924) @@ -21,6 +21,7 @@ import docutils import docutils.core +from docutils.parsers.rst.directives.images import PIL from docutils.utils.code_analyzer import with_pygments from docutils.writers import html4css1 @@ -36,6 +37,11 @@ DATA_ROOT = TEST_ROOT / 'data' ROOT_PREFIX = (TEST_ROOT / 'functional/input').as_posix() +# Pillow/PIL is optional: +if PIL: + SCALING_OUTPUT = 'style="width: 32px; height: 32px;" ' +else: + SCALING_OUTPUT = '' class Html5WriterPublishPartsTestCase(unittest.TestCase): """Test case for HTML5 writer via the publish_parts() interface.""" @@ -416,8 +422,8 @@ :scale: 100% .. figure:: /data/blue%20square.png """, -"""\ -<img alt="/data/blue%20square.png" src="/data/blue%20square.png" style="width: 32.0px; height: 32.0px;" /> +f"""\ +<img alt="/data/blue%20square.png" src="/data/blue%20square.png" {SCALING_OUTPUT}/> <div class="figure"> <img alt="/data/blue%20square.png" src="/data/blue%20square.png" /> </div> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-10 15:30:34
|
Revision: 9923 http://sourceforge.net/p/docutils/code/9923 Author: milde Date: 2024-09-10 15:30:31 +0000 (Tue, 10 Sep 2024) Log Message: ----------- Documentation update. Fix/update links, add crosslinks. Restructure and update content. Modified Paths: -------------- trunk/docutils/FAQ.rst trunk/docutils/docs/howto/html-stylesheets.rst trunk/docutils/docs/ref/doctree.rst trunk/docutils/docs/ref/rst/directives.rst trunk/docutils/docs/ref/rst/restructuredtext.rst trunk/docutils/docs/user/config.rst trunk/docutils/docs/user/html.rst trunk/docutils/docs/user/latex.rst trunk/docutils/docs/user/links.rst trunk/docutils/docs/user/rst/quickstart.rst trunk/docutils/test/functional/expected/standalone_rst_html5.html trunk/docutils/test/functional/input/data/html5-features.rst trunk/sandbox/stylesheets/index.txt Modified: trunk/docutils/FAQ.rst =================================================================== --- trunk/docutils/FAQ.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/FAQ.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -199,14 +199,10 @@ What's the standard abbreviation for "reStructuredText"? -------------------------------------------------------- -"RST" and "ReST" (or "reST") are both acceptable. Care should be -taken with capitalization, to avoid confusion with "REST__", an -acronym for "Representational State Transfer". +"RST" (or "rST") and "ReST" (or "reST") are both acceptable. +Care should be taken with capitalization, to avoid confusion with +"REST__", an acronym for "Representational State Transfer". -The abbreviations "reSTX" and "rSTX"/"rstx" should **not** be used; -they overemphasize reStructuredText's predecessor, Zope's -StructuredText. - __ https://en.wikipedia.org/wiki/Representational_State_Transfer @@ -213,13 +209,8 @@ What's the standard filename extension for a reStructuredText file? ------------------------------------------------------------------- -It's ".txt". ReStructuredText source files are meant to be readable as -plaintext, and most operating systems already associate ".txt" with text -files. +The most commonly used extensions are ".rst" and ".txt". -That said, we see an increasing number of projects settling on -the extension ".rst". - Also see `What's the official MIME type for reStructuredText data?`_ @@ -245,55 +236,25 @@ Here's an ordinary paragraph. -Counterexample:: +See also `A reStructuredText Primer`__ +and the `reStructuredText Markup Specification`__. - Here's an ordinary paragraph. +__ docs/user/rst/quickstart.html#document-title-subtitle +__ docs/ref/rst/restructuredtext.html#document-title - This is *not* a Document Title - ============================== - - The "ordinary paragraph" above the section title - prevents it from becoming the document title. - -Another counterexample:: - - This is not the Document Title, because... - =========================================== - - Here's an ordinary paragraph. - - ... the title adornment is not unique - ===================================== - - Another ordinary paragraph. - - How can I represent esoteric characters (e.g. character entities) in a document? -------------------------------------------------------------------------------- For example, say you want an em-dash (XML character entity —, -Unicode character U+2014) in your document: use a real em-dash. -Insert literal characters (e.g. type a *real* em-dash) into your -input file, using whatever encoding suits your application, and tell -Docutils the input encoding. Docutils uses Unicode internally, so the -em-dash character is U+2014 internally. +Unicode character U+2014) in your document. -Emacs users should refer to the `Emacs Support for reStructuredText`__ -document. Tips for other editors are welcome. +ReStructuredText has no character entity subsystem. [#]_ +However, Docutils uses Unicode so you use a literal character +(e.g. a "real" em-dash) for all charactes supported by the +`input encoding`_ (by default "UTF-8"). -__ tools/editors/emacs/README.html - -ReStructuredText has no character entity subsystem; it doesn't know -anything about XML character entities. -To Docutils, "—" in input text is -7 discrete characters; no interpretation happens. When writing HTML, -the "&" is converted to "&", so in the raw output you'd see -"&mdash;". There's no difference in interpretation for text -inside or outside inline literals or literal blocks -- there's no -character entity interpretation in either case. - -If you can't use a Unicode-compatible encoding and must rely on 7-bit -ASCII, there is a workaround: +If you are restricted to 7-bit ASCII or a legacy encoding, +there is a workaround: `Standard Substitution Definition Sets`_ provide equivalents of XML & HTML character entity sets as substitution definitions. [#]_ For example, the Japanese yen currency symbol can be used as follows:: @@ -302,9 +263,7 @@ |yen| 600 for a complete meal? That's cheap! -.. [#] Thanks to David Priest for the original idea. - -You can create custom `substitution definitions`_ in your document +You can also create custom `substitution definitions`_ in your document using the "unicode_" directive, e.g.:: .. |--| unicode:: U+2013 .. en dash @@ -322,6 +281,15 @@ thus you need to add spaces ("``foo |---| bar``") and advise the reStructuredText parser to trim the spaces. +.. [#] reStructuredText doesn't know anything about XML character + entities. To Docutils, "—" in input text is 7 discrete + characters; no interpretation happens. When writing HTML, the + "&" is converted to "``&``", so in the raw output you'd see + "``&mdash;``" and in the HTML browser "—". + +.. [#] Thanks to David Priest for the original idea. + +.. _input encoding: docs/user/config.html#input-encoding .. _Standard Substitution Definition Sets: docs/ref/rst/definitions.html .. _substitution definitions: docs/ref/rst/restructuredtext.html #substitution-definitions @@ -382,8 +350,7 @@ ----------------------------------------------------------------------- People have tossed the idea around, and some implementations of -reStructuredText-generating tools can be found in the `Docutils Link -List`_. +reStructuredText-generating tools can be found in the `Docutils Links`_. There's no reason why reStructuredText should not be round-trippable to/from XML; any technicalities which prevent round-tripping would be @@ -399,44 +366,19 @@ tool that does 80% of the work automatically, leaving the other 20% for manual tweaks. -.. _Docutils Link List: docs/user/links.html +.. _Docutils Link List: +.. _Docutils Links: docs/user/links.html Are there any Wikis that use reStructuredText syntax? ----------------------------------------------------- -There are several, with various degrees of completeness. With no -implied endorsement or recommendation, and in no particular order: +Yes, see `Wikis`__ in the `Docutils Links`_. -* `Ian Bicking's experimental code - <https://docutils.sourceforge.io/sandbox/ianb/wiki/Wiki.py>`__ +__ docs/user/links.html#wikis -* `MoinMoin <http://moinmoin.wikiwikiweb.de/>`__ has some support; - `here's a sample <http://moinmoin.wikiwikiweb.de/RestSample>`__ -* Zope-based `Zwiki <http://zwiki.org/>`__ -* Zope3-based Zwiki (in the Zope 3 source tree as - ``zope.products.zwiki``) - -* `StikiWiki <http://mithrandr.moria.org/code/stikiwiki/>`__ - -* `Trac <http://trac.edgewall.com//>`__ `supports using - reStructuredText - <http://trac.edgewall.com//wiki/WikiRestructuredText>`__ as - an alternative to wiki markup. This includes support for `TracLinks - <http://trac.edgewall.com//wiki/TracLinks>`__ from within - RST text via a custom RST reference-directive or, even easier, an - interpreted text role 'trac' - -Please `let us know`_ of any other reStructuredText Wikis. - -.. dead link -.. The example application for the `Web Framework Shootout -.. <http://colorstudy.com/docs/shootout.html>`__ article is a Wiki using -.. reStructuredText. - - Are there any Weblog (Blog) projects that use reStructuredText syntax? ---------------------------------------------------------------------- Modified: trunk/docutils/docs/howto/html-stylesheets.rst =================================================================== --- trunk/docutils/docs/howto/html-stylesheets.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/howto/html-stylesheets.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -61,7 +61,7 @@ __ https://developer.mozilla.org/en-US/docs/Web/CSS It is important that you do not edit a copy of ``html4css1.css`` -directly because ``html4css1.css`` is frequently updated with each new +directly because ``html4css1.css`` may be updated with a new release of Docutils. Also make sure that you import ``html4css1.css`` (using "``@import Modified: trunk/docutils/docs/ref/doctree.rst =================================================================== --- trunk/docutils/docs/ref/doctree.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/ref/doctree.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -4001,7 +4001,10 @@ _`%measure` | A number which may be immediately followed by a unit or percent sign. - Resolves to CDATA_. + ReStructuredText supports `CSS2 length units`_. + Handling of values without unit depends on the writer/output format + (see the writer specific documentation in the `user documentation`__ + for details). Resolves to CDATA_. | Used in the `height`_ and `width`_ attributes. Python data type: ``str``. _`%number` @@ -4028,7 +4031,9 @@ and `stub`_ attributes. Python data type: ``int``. +__ ../index.html#introductory-tutorial-material-for-end-users + Names and identifiers ===================== @@ -5312,6 +5317,7 @@ .. _bibliographic fields: rst/restructuredtext.html#bibliographic-fields .. _block quote: rst/restructuredtext.html#block-quotes .. _bullet list: rst/restructuredtext.html#bullet-lists +.. _CSS2 length units: rst/restructuredtext.html#length-units .. _citations: rst/restructuredtext.html#citations .. _definition list: rst/restructuredtext.html#definition-lists .. _directive: rst/restructuredtext.html#directives Modified: trunk/docutils/docs/ref/rst/directives.rst =================================================================== --- trunk/docutils/docs/ref/rst/directives.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/ref/rst/directives.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -2203,14 +2203,19 @@ A _`list of integers` may be comma- or whitespace-separated. -:_`length`: number followed by one of the supported `length units`_ +:_`length`: number, optionally followed by one of the + supported `length units`_ + Handling of values without unit depends on the writer/output format. + See the writer specific documentation in the `user doc`__ for details. + + __ ../../index.html#introductory-tutorial-material-for-end-users + :_`path`: local filesystem path Newlines are removed. The `root_prefix`_ configuration setting can be used to tell Docutils - to interpret root paths (starting with "/") relative to a "project - directory". + to interpret paths starting with "/" relative to a "project directory". :_`text`: free text @@ -2218,8 +2223,8 @@ :_`URI`: _`URI reference` - Full URI or `relative reference`_ (absolute or relative path reference), - cf. :RFC:`3986`. + Full URI or `relative reference`_ + (absolute or relative path reference, cf. :RFC:`3986`). Whitespace is removed (cf. `external hyperlink targets`_ in the reStructuredText specification). Modified: trunk/docutils/docs/ref/rst/restructuredtext.rst =================================================================== --- trunk/docutils/docs/ref/rst/restructuredtext.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/ref/rst/restructuredtext.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -490,18 +490,22 @@ title and possibly other metadata elements (author, date, etc.; see `Bibliographic Fields`_). -.. _document title: +Document Title +`````````````` -Specifically, there is no way to indicate a document title and subtitle -explicitly in reStructuredText. [#]_ Instead, a lone top-level `section -title`_ can be treated as the *document title*. Similarly, a lone -second-level section title immediately after the document title can -become the *document subtitle*. The rest of the sections are then lifted -up a level or two. See the `DocTitle transform`_ for details. +Specifically, there is no special syntax to indicate a *document title* +and *subtitle* in reStructuredText. [#]_ +Instead, a uniquely-adorned top-level `section title`_ can be treated as +the document title. Similarly, a uniquely-adorned second-level section +title immediately after the document title can become the document +subtitle. The rest of the sections are then lifted up a level or two. +See `A ReStructuredText Primer`__ for examples +and the `DocTitle transform`_ for details. .. [#] The `"title"`_ directive sets the document's `metadata title`_ that does not become part of the document body. +__ ../../user/rst/quickstart.html#document-title-subtitle Sections -------- @@ -3112,9 +3116,8 @@ https://www.w3.org/TR/css-values-3/#lengths .. _How to configure the size of a pixel: ../../user/latex.html#size-of-a-pixel -__ ../../user/ +__ ../../index.html#introductory-tutorial-material-for-end-users - Percentage Units ---------------- Modified: trunk/docutils/docs/user/config.rst =================================================================== --- trunk/docutils/docs/user/config.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/user/config.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -171,9 +171,9 @@ Configuration File Sections & Entries ------------------------------------- -Below are the Docutils `runtime settings`_, listed by config file section. -Sections correspond to Docutils components (module name -or alias; section names are always in lowercase letters). +Below are the Docutils runtime settings, listed by config file section. +Sections correspond to Docutils components (module name or alias; always +in lowercase letters). .. important:: Any setting may be specified in any section, but only settings from "`active sections`_" will be used. @@ -1080,6 +1080,8 @@ [html writers] -------------- +Common settings for the `Docutils HTML writers`_. + .. _attribution [html writers]: attribution @@ -2538,6 +2540,8 @@ .. _option lists: ../ref/rst/restructuredtext.html#option-lists .. _tables: ../ref/rst/restructuredtext.html#tables +.. _Docutils HTML writers: html.html + .. _front end tools: tools.html .. _buildhtml.py: tools.html#buildhtml-py Modified: trunk/docutils/docs/user/html.rst =================================================================== --- trunk/docutils/docs/user/html.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/user/html.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -6,6 +6,12 @@ .. contents:: +This document describes the HTML writers provided by Docutils. + +The default `length unit`_ in HTML is "px" (pixels, 1 px = 1/96 in). + +.. _length unit: ../ref/rst/restructuredtext.html#length-units + html ---- @@ -26,19 +32,58 @@ post-processing that may break otherwise. +html5 +----- + +:aliases: _`html5_polyglot` +:front-end: rst2html5_ +:config: `[html5 writer]`_ + +The *html5* writer generates valid XML that conforms to the +`HTML standard`_ (`polyglot HTML`_). [#safetext]_ +New features and elements are used if they are widely supported. +See the `HTML5 test page`_ (and the sources `html5-features.rst`_ and +`html5-text-level-tags.rst`_) for differences to the html4css1_ writer. + +There is no hard-coded formatting information in the HTML document. +Correct rendering of elements not directly supported by HTML depends on a +CSS_ style sheet. The provided style sheet minimal.css_ defines required +styling rules; plain.css_ and responsive.css_ add optional rules for +better legibility. Adaption of the layout is possible with `custom style +sheets`_. [#safetext]_ + +.. [#safetext] The validity of raw HTML and custom stylesheets must be + ensured by the author. + +.. _HTML5 test page: https://docutils.sourceforge.io/test/functional/ + expected/standalone_rst_html5.html#differences-to-the-html4css1-writer +.. _html5-features.rst: https://docutils.sourceforge.io/test/functional/ + input/data/html5-features.rst +.. _html5-text-level-tags.rst: https://docutils.sourceforge.io/test/functional/ + input/data/html5-text-level-tags.rst +.. _rst2html5: tools.html#rst2html5 +.. _[html5 writer]: config.html#html5-writer +.. _minimal.css: ../../docutils/writers/html5_polyglot/minimal.css +.. _plain.css: ../../docutils/writers/html5_polyglot/plain.css +.. _responsive.css: ../../docutils/writers/html5_polyglot/responsive.css +.. _custom style sheets: ../howto/html-stylesheets.html +.. _viewable with any browser: http://www.anybrowser.org/campaign +.. _Benefits of polyglot XHTML5: http://xmlplease.com/xhtml/xhtml5polyglot/ + + html4css1 --------- -:aliases: html4, html_ -:front-ends: rst2html4_, rst2html_ -:config: `[html4css1 writer]`_ +:aliases: html4, html_ +:front-end: rst2html4_ +:config: `[html4css1 writer]`_ The HTML Writer module, ``docutils/writers/html4css1.py``, was the first Docutils writer and up to release 0.13 the only official HTML writer. -The output conforms to the `XHTML 1 Transitional`_ specification. It does -not validate as `HTML 4.01 Transitional`_ due to the closing of empty tags -required in XML but not allowed in HTML 4. However, the output follows the +The output conforms to the `XHTML 1 Transitional`_ specification. It does +not validate as `HTML 4.01 Transitional`_ due to the closing of empty tags +required in XML but not allowed in HTML 4. However, the output follows the `HTML Compatibility Guidelines`_ for proper rendering on most HTML user agents. @@ -45,12 +90,17 @@ Correct rendering depends on a CSS_ style sheet. A reference style sheet, `html4css1.css`_, is provided and used by default. -To support the `Internet Explorer` (with a market share of about 90% around -2002, the time this writer was written), documents contain some hard-coded -formatting hints and are tagged as "text/html" (instead of -"application/xhtml+xml"). [#IE]_ +To support the `Internet Explorer` (with a market share of about 90% +around 2002, the time this writer was written), documents contain some +hard-coded formatting hints and are tagged as "text/html" (instead of +"application/xhtml+xml"). Additional class values serve as surrogate for +the "first"/"last" pseudo-classes introduced in CSS 2.1. [#IE]_ -.. [#IE] Conformance to `CSS 2.1`_ has been added in IE 8 (2009), support +Tables are used for description lists, field lists, docinfo, footnotes, +and option lists. Videos and SVG images are wrapped in <object> elements +and cannot be embedded. + +.. [#IE] Conformance to `CSS 2.1`_ has been added in IE 8 (2009), support for XHTML in IE 9 (2011). .. _rst2html: tools.html#rst2html @@ -62,7 +112,7 @@ ~~~~~~~~ :front-end: ``docutils --reader=pep --writer=pep_html`` -:config: `[pep_html writer]`_ +:config: `[pep_html writer]`_, `[html4css1 writer]`_ This is a special writer for the generation of `Python Enhancement Proposals`_ (PEPs). It inherits from html4css1_ and adds some `PEP-specific @@ -78,7 +128,7 @@ :alias: s5 :front-end: rst2s5_ -:config: `[s5_html writer]`_ +:config: `[s5_html writer]`_, `[html4css1 writer]`_ The `s5` writer inherits from html4css1_. It produces XHTML for use with S5_, the “Simple Standards-based Slide Show System” by Eric Meyer. See @@ -91,69 +141,12 @@ .. _theme: tools.html#themes -html5 ------ +3rd-party HTML writers +---------------------- -:aliases: _`html5_polyglot` -:front-end: rst2html5_ -:config: `[html5 writer]`_ +For additional HTML writers, see the `Docutils link list`__ +and the sandbox_. -The ``html5`` writer generates `polyglot HTML`_ output, valid -XML [#safetext]_ that is compatible with `HTML5`_. New features and elements -are used if they are widely supported. -See the `HTML5 test page`_ (and the sources `html5-features.rst`_ and -`html5-text-level-tags.rst`_) for further differences to the html4css1_ -writer. - -There is no hard-coded formatting information in the HTML document. -Correct rendering of elements not directly supported by HTML depends on a -CSS_ style sheet. The provided style sheet minimal.css_ defines required -styling rules; plain.css_ and responsive.css_ add optional rules for -better legibility. Adaption of the layout is possible with `custom style -sheets`_. [#safetext]_ - -New in Docutils 0.13 - -.. [#safetext] The validity of raw HTML and custom stylesheets must be - ensured by the author. -.. _HTML5 test page: https://docutils.sourceforge.io/test/functional/ - expected/standalone_rst_html5.html#changes-to-the-html4css1-writer -.. _html5-features.rst: https://docutils.sourceforge.io/test/functional/ - input/data/html5-features.rst -.. _html5-text-level-tags.rst: https://docutils.sourceforge.io/test/functional/ - input/data/html5-text-level-tags.rst -.. _rst2html5: tools.html#rst2html5 -.. _[html5 writer]: config.html#html5-writer -.. _minimal.css: ../../docutils/writers/html5_polyglot/minimal.css -.. _plain.css: ../../docutils/writers/html5_polyglot/plain.css -.. _responsive.css: ../../docutils/writers/html5_polyglot/responsive.css -.. _custom style sheets: ../howto/html-stylesheets.html -.. _viewable with any browser: http://www.anybrowser.org/campaign -.. _Benefits of polyglot XHTML5: http://xmlplease.com/xhtml/xhtml5polyglot/ - - -Overview --------- - -================ =========== ============== ================= =========== -name aliases `front-end`_ HTML version CSS version -================ =========== ============== ================= =========== -html4css1_ html4, rst2html4, `XHTML 1 `CSS 1`_ - html_ rst2html Transitional`_ - -pep_html_ .. rstpep2html `XHTML 1 `CSS 1`_ - Transitional`_ - -s5_html_ s5 rst2s5 `XHTML 1 `CSS 1`_ - Transitional`_ - -html5_polyglot_ html5 rst2html5 `HTML5`_ `CSS 3`_ - -================ =========== ============== ================= =========== - -For additional alternatives, see the `Docutils link list`__ and the -sandbox_. - __ https://docutils.sourceforge.io/docs/user/links.html #website-generators-and-html-variants .. _sandbox: ../dev/policies.html#the-sandbox @@ -162,16 +155,10 @@ References ---------- -_`HTML5` - `HTML5, A vocabulary and associated APIs for HTML and XHTML`, - W3C Recommendation, 28 October 2014. - https://www.w3.org/TR/2014/REC-html5-20141028/ +_`HTML Standard` + `HTML Living Standard`. + https://html.spec.whatwg.org/multipage/ -_`XHTML 1.1` - `XHTML™ 1.1 - Module-based XHTML - Second Edition`, - W3C Recommendation, 23 November 2010. - https://www.w3.org/TR/xhtml11/ - _`XHTML 1 Transitional` `Transitional version`_ of: `XHTML™ 1.0 The Extensible HyperText Markup Language (Second @@ -179,15 +166,7 @@ W3C Recommendation, 26 January 2000, revised 1 August 2002. https://www.w3.org/TR/xhtml1/ -_`XHTML Basic` - `XHTML™ Basic 1.1 - Second Edition`, - W3C Recommendation, 23 November 2010. - https://www.w3.org/TR/xhtml-basic/ - -.. _transitional version: - https://www.w3.org/TR/xhtml1/#a_dtd_XHTML-1.0-Transitional - -_`HTML 4.01 Transitional` +_`HTML 4.01 Transitional` Transitional version of: `HTML 4.01 Specification`, W3C Recommendation 24 December 1999. https://www.w3.org/TR/html4/ @@ -194,33 +173,37 @@ .. _`CSS 1`: -_`CSS Level 1`: +_`CSS Level 1`: The features defined in the `CSS1 specification`_, but using the syntax and definitions in the `CSS 2.1`_ specification. -_`CSS 2.1` `Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification`, +_`CSS 2.1` + `Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification`, W3C Recommendation 07 June 2011. https://www.w3.org/TR/CSS21/ -_`CSS 3`: - CSS Level 3 builds on CSS Level 2 module by module, using the CSS2.1 +_`CSS 3`: + CSS Level 3 builds on CSS Level 2 module by module, using the CSS 2.1 specification as its core. - Specifications: https://www.w3.org/Style/CSS/specs.en.html + | Specifications: https://www.w3.org/Style/CSS/specs.en.html + | Validator: http://jigsaw.w3.org/css-validator/ - Validator: http://jigsaw.w3.org/css-validator/ - .. other references ---------------- .. _HTML Compatibility Guidelines: https://www.w3.org/TR/xhtml1/#guidelines -.. _CSS: https://www.w3.org/TR/CSS/ -.. _CSS1 specification: https://www.w3.org/TR/2008/REC-CSS1-20080411/ +.. _transitional version: + https://www.w3.org/TR/xhtml1/#a_dtd_XHTML-1.0-Transitional + .. _polyglot HTML: https://www.w3.org/TR/html-polyglot/ .. Beware. This specification is no longer in active maintenance and the HTML Working Group does not intend to maintain it further. +.. _CSS: https://www.w3.org/TR/CSS/ +.. _CSS1 specification: https://www.w3.org/TR/2008/REC-CSS1-20080411/ + .. Appendix Modified: trunk/docutils/docs/user/latex.rst =================================================================== --- trunk/docutils/docs/user/latex.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/user/latex.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -100,6 +100,9 @@ :sp: scaled point (1sp = 1/65536pt) :bp: "big" point (`DTP point`) (1 bp = 1/72 in) +The **default length unit** (added by the latex writer to length +values without unit) is the `DTP point` "bp". + .. attention:: Different definitions of the unit "pt"! * In Docutils (as well as CSS) the unit symbol "pt" denotes the @@ -118,9 +121,6 @@ In `raw LaTeX`_ and `custom style sheets`_, the `DTP point` must be specified as "bp", while "pt" is interpreted as `LaTeX point`. -The default length unit (added by Docutils to length specifications -without unit) is the "DTP point". - .. _length units: ../ref/rst/restructuredtext.html#length-units Modified: trunk/docutils/docs/user/links.rst =================================================================== --- trunk/docutils/docs/user/links.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/user/links.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -14,16 +14,17 @@ .. contents:: -This document contains links users of Docutils and reStructuredText -may find useful. Many of the projects -listed here are hosted in the `Docutils Sandbox`_. If you have -something to publish, you can get write access, too! +This document contains links that users of Docutils_ and reStructuredText_ +may find useful. The most current version of this link list can always be found at https://docutils.sourceforge.io/docs/user/links.html. +If you find outdated or broken links or want to suggest additions, +please `let us know`__ and we'll update the list here. .. _Docutils: https://docutils.sourceforge.io/ -.. _Docutils Sandbox: https://docutils.sourceforge.io/sandbox/README.html +.. _reStructuredText: https://docutils.sourceforge.io/rst.html +__ mailing-lists.html#docutils-users Editors @@ -45,7 +46,7 @@ plugin for Vim that emulates two-pane outliner with support for reStructuredText (since version 4.0b2). - - `Riv: Take notes in rst <https://github.com/Rykka/riv.vim>`__ Vim + - `Riv: Take notes in rST <https://github.com/Rykka/riv.vim>`__ Vim plugin to take notes in reStructured text. * `reStructuredText Language Support for Visual Studio Code`__ @@ -279,7 +280,7 @@ .. _DashTable: https://github.com/gustavklopp/DashTable -* Sphinx_ includes a `LaTeX to Rst converter +* Sphinx_ includes a `LaTeX to rST converter <https://svn.python.org/projects/doctools/converter/>`__ in its source code (trimmed to importing the old Python docs). @@ -326,14 +327,14 @@ .. _rst2blogger: https://github.com/dhellmann/rst2blogger#readme +.. _Docutils Sandbox: https://docutils.sourceforge.io/sandbox/README.html + Related Applications -------------------- Applications using docutils/reStructuredText and helper applications. -* For Wikis, please see the `FAQ entry about Wikis`_. - * For Blogs (Weblogs), please see the `FAQ entry about Blogs`_. * `Project Gutenberg`_ uses Docutils for its "ebookmaker_" @@ -362,6 +363,31 @@ .. _repository: ../dev/repository.html +Wikis +````` + +* Trac_ supports `using reStructuredText`__ as an alternative to wiki markup. + This includes support for TracLinks_ from within reStructuredText + via a custom rST reference-directive or, even easier, an interpreted + text role "trac". + + __ http://trac.edgewall.com//wiki/WikiRestructuredText + +* MoinMoin_ includes a `ReStructuredText Parser + <http://moinmo.in/HelpOnParsers/ReStructuredText>`__. + +* Ian Bicking's experimental `wiki module`__ in the sandbox. + + __ https://docutils.sourceforge.io/sandbox/ianb/wiki + +* Zope-based Zwiki_ + (requires Zope2, which reached end of life on December 31, 2020). + +.. _TracLinks: http://trac.edgewall.com//wiki/TracLinks +.. _MoinMoin: http://moinmo.in/ +.. _ZWiki: https://github.com/simonmichael/ZWiki + + Tools ````` @@ -370,7 +396,7 @@ .. _rstcheck: https://pypi.python.org/pypi/rstcheck -* restview_ is a viewer for ReStructuredText documents. +* restview_ is a viewer for reStructuredText documents. Pass the name of a ReStructuredText document to restview, and it will launch a web server on localhost:random-port and open a web browser. It @@ -402,7 +428,7 @@ .. _Sphinx extensions: https://www.sphinx-doc.org/en/master/usage/extensions/ .. _Python documentation: https://docs.python.org/ -.. _Trac: https://trac.edgewall.org/ +.. _Trac: https://trac.edgewall.org .. _PyLit: https://codeberg.org/milde/pylit Modified: trunk/docutils/docs/user/rst/quickstart.rst =================================================================== --- trunk/docutils/docs/user/rst/quickstart.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/docs/user/rst/quickstart.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -329,10 +329,10 @@ may be formatted somewhat differently (e.g. the HTML writer by default shows it as a centered heading). -To indicate the document title in reStructuredText, use a unique adornment -style at the beginning of the document. To indicate the document subtitle, -use another unique adornment style immediately after the document title. For -example:: +To indicate the document title in reStructuredText, use a section title +with unique adornment style at the beginning of the document. +To indicate the document subtitle, use another unique adornment style +immediately after the document title. For example:: ================ Document Title @@ -351,7 +351,29 @@ overline-and-underlined titles (but not underlined-only) may be inset for aesthetics. +Counterexample:: + Here's an ordinary paragraph. + + This is *not* a Document Title + ============================== + + The "ordinary paragraph" above the section title + prevents it from becoming the document title. + +Another counterexample:: + + This is not the Document Title, because... + =========================================== + + Here's an ordinary paragraph. + + ... the title adornment is not unique + ===================================== + + Another ordinary paragraph. + + Images ------ Modified: trunk/docutils/test/functional/expected/standalone_rst_html5.html =================================================================== --- trunk/docutils/test/functional/expected/standalone_rst_html5.html 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/test/functional/expected/standalone_rst_html5.html 2024-09-10 15:30:31 UTC (rev 9923) @@ -1283,7 +1283,7 @@ </li> <li><p>Set table column widths with <style="width: ...">, not "width" argument.</p></li> <li><p>Horizontal alignment of table heads with CSS.</p></li> -<li><p>Do not drop paragraph objects, use CSS rules to prevent unwanted vertical +<li><p>Do not drop paragraph elements, use CSS rules to prevent unwanted vertical space.</p></li> <li><p>Put subtitles in <p> elements.</p></li> <li><p>Use the new semantic tags <main>, <section>, <header>, Modified: trunk/docutils/test/functional/input/data/html5-features.rst =================================================================== --- trunk/docutils/test/functional/input/data/html5-features.rst 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/docutils/test/functional/input/data/html5-features.rst 2024-09-10 15:30:31 UTC (rev 9923) @@ -14,7 +14,7 @@ * Horizontal alignment of table heads with CSS. -* Do not drop paragraph objects, use CSS rules to prevent unwanted vertical +* Do not drop paragraph elements, use CSS rules to prevent unwanted vertical space. * Put subtitles in <p> elements. Modified: trunk/sandbox/stylesheets/index.txt =================================================================== --- trunk/sandbox/stylesheets/index.txt 2024-09-10 08:01:52 UTC (rev 9922) +++ trunk/sandbox/stylesheets/index.txt 2024-09-10 15:30:31 UTC (rev 9923) @@ -3,7 +3,7 @@ ======================= :Author: Lea Wiemann and others -:Contact: LeW...@gm... +:Contact: doc...@li... :Revision: $Revision$ :Date: $Date$ :Copyright: This document has been placed in the public domain. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <gr...@us...> - 2024-09-10 08:01:54
|
Revision: 9922 http://sourceforge.net/p/docutils/code/9922 Author: grubert Date: 2024-09-10 08:01:52 +0000 (Tue, 10 Sep 2024) Log Message: ----------- FIX change hard coded uris to f-string expansions Modified Paths: -------------- trunk/docutils/test/test_writers/test_html4css1.py Modified: trunk/docutils/test/test_writers/test_html4css1.py =================================================================== --- trunk/docutils/test/test_writers/test_html4css1.py 2024-09-04 19:33:39 UTC (rev 9921) +++ trunk/docutils/test/test_writers/test_html4css1.py 2024-09-10 08:01:52 UTC (rev 9922) @@ -517,8 +517,8 @@ .. image:: {DATA_ROOT.as_uri()}/circle-broken.svg :loading: embed """, -"""\ -<object data="file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg" type="image/svg+xml">file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg</object> +f"""\ +<object data="{DATA_ROOT.as_uri()}/circle-broken.svg" type="image/svg+xml">{DATA_ROOT.as_uri()}/circle-broken.svg</object> """ ], [r"""Broken :math:`\sin \my`. @@ -583,8 +583,8 @@ .. image:: {DATA_ROOT.as_uri()}/circle-broken.svg :loading: embed """, -"""\ -<object data="file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg" type="image/svg+xml">file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg</object> +f"""\ +<object data="{DATA_ROOT.as_uri()}/circle-broken.svg" type="image/svg+xml">{DATA_ROOT.as_uri()}/circle-broken.svg</object> """], [r'Broken :math:`\sin \my`.', '<p>Broken <tt class="math">\\sin \\my</tt>.</p>\n' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-04 19:33:42
|
Revision: 9921 http://sourceforge.net/p/docutils/code/9921 Author: milde Date: 2024-09-04 19:33:39 +0000 (Wed, 04 Sep 2024) Log Message: ----------- Revise `HTMLTranslator.prepare_svg()`. Change oder of method arguments (sort by importance). Use a dictionary to update the `<svg style="..."> declarations keeping exisisting declarations intact. Simplify conversion of "align" attribute. Add test cases. Modified Paths: -------------- trunk/docutils/docutils/writers/_html_base.py trunk/docutils/test/test_writers/test_html5_polyglot.py trunk/docutils/test/test_writers/test_html5_polyglot_misc.py Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2024-09-04 19:33:30 UTC (rev 9920) +++ trunk/docutils/docutils/writers/_html_base.py 2024-09-04 19:33:39 UTC (rev 9921) @@ -28,7 +28,7 @@ import urllib.parse import urllib.request import warnings -import xml.etree.ElementTree as ET # TODO: lazy import in prepare_svg()? +import xml.etree.ElementTree as ET from pathlib import Path from typing import TYPE_CHECKING @@ -474,39 +474,36 @@ return None return imgsize - def prepare_svg(self, node, imagedata, size_declaration): - # Edit `imagedata` for embedding as SVG image. - # Use ElementTree to add node attributes. - # ET also removes comments and preamble code. + def prepare_svg(self, code: str, node: nodes.Element, atts: dict) -> str: + # Parse SVG source `code` (ignoring comments and preamble code), + # add relevant attributes from `node` and `atts` to the root element. # - # Internal: interface and behaviour may change without notice. - - # SVG namespace + # Internal auxiliary method called from `self.visit_image()`. svg_ns = {'': 'http://www.w3.org/2000/svg', - 'xlink': 'http://www.w3.org/1999/xlink'} + 'xlink': 'http://www.w3.org/1999/xlink'} # SVG namespace # don't add SVG namespace to all elements - ET.register_namespace('', svg_ns['']) - ET.register_namespace('xlink', svg_ns['xlink']) + for key, value in svg_ns.items(): + ET.register_namespace(key, value) + # Parse: try: - svg = ET.fromstring(imagedata) + svg = ET.fromstring(code) except ET.ParseError as err: self.messages.append(self.document.reporter.error( f'Cannot parse SVG image "{node["uri"]}":\n {err}', base_node=node)) - return imagedata - # apply image node attributes: - if size_declaration: # append to style, replacing width & height - declarations = [d.strip() for d in svg.get('style', '').split(';')] - declarations = [d for d in declarations - if d - and not d.startswith('width') - and not d.startswith('height')] - svg.set('style', '; '.join(declarations+[size_declaration])) - if node['classes'] or 'align' in node: + return code + # Apply image node attributes: + if 'style' in atts: + # update style declarations + style_att = f"{svg.get('style', '')}; {atts['style']}" + style_att = [d.partition(':') for d in style_att.split(';') + if d.strip()] + style_att = dict((k.strip(), v.strip()) for k, p, v in style_att) + style_att = ' '.join(f'{k}: {v};' for k, v in style_att.items()) + svg.set('style', style_att) + if 'classes' in atts or node['classes']: classes = svg.get('class', '').split() - classes += node.get('classes', []) - if 'align' in node: - classes.append(f'align-{node["align"]}') + classes += node['classes'] + atts.get('classes', []) svg.set('class', ' '.join(classes)) if 'alt' in node and svg.find('title', svg_ns) is None: svg_title = ET.Element('title') @@ -598,7 +595,7 @@ infix = ' /' else: infix = '' - return ''.join(prefix) + '<%s%s>' % (' '.join(parts), infix) + suffix + return f"{''.join(prefix)}<{' '.join(parts)}{infix}>{suffix}" def emptytag(self, node, tagname, suffix='\n', **attributes): """Construct and return an XML-compatible empty tag.""" @@ -1173,14 +1170,11 @@ mimetype = mimetypes.guess_type(uri)[0] element = '' # the HTML element (including potential children) atts = {} # attributes for the HTML tag - # alignment is handled by CSS rules - if 'align' in node: - atts['class'] = 'align-%s' % node['align'] - # set size with "style" attribute (more universal, accepts dimensions) size_declaration = self.image_size(node) if size_declaration: atts['style'] = size_declaration - + if 'align' in node: + atts['classes'] = [f"align-{node['align']}"] # ``:loading:`` option (embed, link, lazy), default from setting, # exception: only embed videos if told via directive option loading = 'link' if mimetype in self.videotypes else self.image_loading @@ -1201,8 +1195,7 @@ else: self.settings.record_dependencies.add(imagepath) if mimetype == 'image/svg+xml': - element = self.prepare_svg(node, imagedata, - size_declaration) + element = self.prepare_svg(imagedata, node, atts) else: data64 = base64.b64encode(imagedata).decode() uri = f'data:{mimetype};base64,{data64}' Modified: trunk/docutils/test/test_writers/test_html5_polyglot.py =================================================================== --- trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-04 19:33:30 UTC (rev 9920) +++ trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-04 19:33:39 UTC (rev 9921) @@ -2,9 +2,10 @@ # $Id$ # Author: reggie dugard <re...@us...> +# Maintainer: doc...@li... # Copyright: This module has been placed in the public domain. -"""Test HTML5 writer output ("fragment" part). +"""Test HTML5 writer output ("fragment"/"body" part). This is the document body (not HTML <body>). """ @@ -89,7 +90,7 @@ self.assertEqual(case_expected, parts['body']) -totest = {} +totest = {} # expected samples contain only the "body" part of the HMTL output totest['standard'] = ({}, [ ["""\ @@ -147,6 +148,18 @@ </div> """, ], +[f"""\ +.. image:: {DATA_ROOT.as_uri()}/circle.svg + :loading: embed + :width: 50% + :height: 30 + :align: left +""", +"""\ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" style="width: 50%; height: 30px;" class="align-left"> + <circle cx="5" cy="5" r="4" fill="lightblue" /> +</svg> +"""], ]) Modified: trunk/docutils/test/test_writers/test_html5_polyglot_misc.py =================================================================== --- trunk/docutils/test/test_writers/test_html5_polyglot_misc.py 2024-09-04 19:33:30 UTC (rev 9920) +++ trunk/docutils/test/test_writers/test_html5_polyglot_misc.py 2024-09-04 19:33:39 UTC (rev 9921) @@ -247,6 +247,19 @@ settings = frontend.get_default_settings(_html_base.Writer) document = utils.new_document('test data', settings) translator = _html_base.HTMLTranslator(document) + svg_sample = """\ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" + style="background: blue; width: 5ex" viewBox="0 0 10 10"> + <circle cx="5" cy="5" r="4" fill="lightblue" /> + <!-- comments are ignored --> +</svg> +""" + expected = """\ +<svg xmlns="http://www.w3.org/2000/svg" style="background: blue; width: 4em; height: 32px;" viewBox="0 0 10 10" class="test me"> + <title>blue circle</title><circle cx="5" cy="5" r="4" fill="lightblue" /> + \n\ +</svg>""" def test_image_size(self): image = nodes.image(height='3', width='4em') @@ -256,6 +269,27 @@ self.assertEqual(self.translator.image_size(image), 'width: 2em; height: 1.5px;') + def test_prepare_svg(self): + # Internal method: the test is no guaranty for stability, + # interface and behaviour may change without notice. + image = nodes.image(height='32', width='4em', alt='blue circle', + align='left', classes=['test', 'me']) + atts = {'style': self.translator.image_size(image)} + rv = self.translator.prepare_svg(self.svg_sample, image, atts) + self.assertEqual(rv, self.expected) + def test_prepare_svg_syntax_variants(self): + # parsing "style" declarations must be robust: + svg_sample = '<svg style="width:3em"></svg>' + + atts = {'style': 'colon:in:value'} + rv = self.translator.prepare_svg(svg_sample, nodes.image(), atts) + self.assertEqual(rv, '<svg style="width: 3em; colon: in:value;" />') + + atts = {'style': 'no-colon;'} + rv = self.translator.prepare_svg(svg_sample, nodes.image(), atts) + self.assertEqual(rv, '<svg style="width: 3em; no-colon: ;" />') + + if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-04 19:33:33
|
Revision: 9920 http://sourceforge.net/p/docutils/code/9920 Author: milde Date: 2024-09-04 19:33:30 +0000 (Wed, 04 Sep 2024) Log Message: ----------- Refactor `HTMLTranslator.image_size()`. Use `nodes.parse_measure()` instead of ad-hoc parsing when scaling size values. Split "spaghetti code" into auxiliary method `read_size_with_PIL()`. Modified Paths: -------------- trunk/docutils/docutils/writers/_html_base.py trunk/docutils/test/test_writers/test_html5_polyglot.py trunk/docutils/test/test_writers/test_html5_polyglot_misc.py Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2024-09-04 19:33:12 UTC (rev 9919) +++ trunk/docutils/docutils/writers/_html_base.py 2024-09-04 19:33:30 UTC (rev 9920) @@ -14,18 +14,23 @@ # # .. _2-Clause BSD license: https://opensource.org/licenses/BSD-2-Clause -"""common definitions for Docutils HTML writers""" +"""Common definitions for Docutils HTML writers.""" +from __future__ import annotations + +__docformat__ = 'reStructuredText' + import base64 import mimetypes import os import os.path -from pathlib import Path import re import urllib.parse import urllib.request import warnings import xml.etree.ElementTree as ET # TODO: lazy import in prepare_svg()? +from pathlib import Path +from typing import TYPE_CHECKING import docutils from docutils import frontend, languages, nodes, utils, writers @@ -36,6 +41,10 @@ unichar2tex, wrap_math_code, MathError) +if TYPE_CHECKING: + from numbers import Real + + class Writer(writers.Writer): supported = ('html', 'xhtml') # update in subclass @@ -404,58 +413,67 @@ text = str(text) return text.translate(self.special_characters) - def image_size(self, node): - # Determine the image size from the node arguments or the image file. - # Return a size declaration suitable as "style" argument value, - # e.g., ``'width: 4px; height: 2em;'``. - # TODO: consider feature-request #102? - size = [node.get('width', None), node.get('height', None)] - if 'scale' in node: - if 'width' not in node or 'height' not in node: - # try reading size from image file - reading_problems = [] - uri = node['uri'] - if not PIL: - reading_problems.append('Requires Python Imaging Library.') - if mimetypes.guess_type(uri)[0] in self.videotypes: - reading_problems.append('PIL cannot read video images.') - if not self.settings.file_insertion_enabled: - reading_problems.append('Reading external files disabled.') - if not reading_problems: - try: - imagepath = self.uri2imagepath(uri) - with PIL.Image.open(imagepath) as img: - imgsize = img.size - except (ValueError, OSError, UnicodeEncodeError) as err: - reading_problems.append(str(err)) - else: - self.settings.record_dependencies.add( - imagepath.replace('\\', '/')) - if reading_problems: - msg = ['Cannot scale image!', - f'Could not get size from "{uri}":', - *reading_problems] - self.messages.append(self.document.reporter.warning( - '\n '.join(msg), base_node=node)) - else: - for i in range(2): - size[i] = size[i] or '%dpx' % imgsize[i] - # scale provided/determined size values: - factor = float(node['scale']) / 100 - for i in range(2): - if size[i]: - match = re.match(r'([0-9.]+)(\S*)$', size[i]) - size[i] = '%s%s' % (factor * float(match.group(1)), - match.group(2)) - size_declarations = [] - for i, dimension in enumerate(('width', 'height')): - if size[i]: - # Interpret unitless values as pixels: - if re.match(r'^[0-9.]+$', size[i]): - size[i] += 'px' - size_declarations.append(f'{dimension}: {size[i]};') - return ' '.join(size_declarations) + def image_size(self, node: nodes.image) -> str: + """Determine the image size from node arguments or the image file. + Auxiliary method called from `self.visit_image()`. + + Provisional. + """ + # TODO: Use "width" and "hight" for unitless integers? + # [feature-requests:#102] + + # List with optional width and height measures ((value, unit)-tuples) + measures: list[tuple[Real, str] | None] = [None, None] + dimensions = ('width', 'height') + for i, dimension in enumerate(dimensions): + if dimension in node: + measures[i] = nodes.parse_measure(node[dimension]) + if None in measures and 'scale' in node: + # supplement with (unitless) values read from image file + imgsize = self.read_size_with_PIL(node) + if imgsize: + measures = [measure or (imgvalue, '') + for measure, imgvalue in zip(measures, imgsize)] + # scale values + factor = node.get('scale', 100) / 100 # scaling factor + if factor != 1: + measures = [(measure[0] * factor, measure[1]) + for measure in measures if measure] + # format as CSS declarations and return + return ' '.join(f'{dimension}: {measure[0]:g}{measure[1] or "px"};' + for dimension, measure in zip(dimensions, measures) + if measure) + + def read_size_with_PIL(self, node) -> tuple[int, int] | None: + # Try reading size from image file. + # Internal auxiliary method called from `self.image_size()`. + reading_problems = [] + uri = node['uri'] + if not PIL: + reading_problems.append('Requires Python Imaging Library.') + if mimetypes.guess_type(uri)[0] in self.videotypes: + reading_problems.append('PIL cannot read video images.') + if not self.settings.file_insertion_enabled: + reading_problems.append('Reading external files disabled.') + if not reading_problems: + try: + imagepath = self.uri2imagepath(uri) + with PIL.Image.open(imagepath) as img: + imgsize = img.size + except (ValueError, OSError, UnicodeEncodeError) as err: + reading_problems.append(str(err)) + else: + self.settings.record_dependencies.add(imagepath) + if reading_problems: + msg = ['Cannot scale image!', + f'Could not get size from "{uri}":', + *reading_problems] + self.messages.append(self.document.reporter.warning( + '\n '.join(msg), base_node=node)) + return None + return imgsize + def prepare_svg(self, node, imagedata, size_declaration): # Edit `imagedata` for embedding as SVG image. # Use ElementTree to add node attributes. @@ -607,7 +625,7 @@ child['classes'].append(class_) def uri2imagepath(self, uri): - """Get filesystem path corresponding to an URI. + """Get POSIX filesystem path corresponding to an URI. The image directive expects an image URI__. Some writers require the corresponding image path to read the image size from the file or to Modified: trunk/docutils/test/test_writers/test_html5_polyglot.py =================================================================== --- trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-04 19:33:12 UTC (rev 9919) +++ trunk/docutils/test/test_writers/test_html5_polyglot.py 2024-09-04 19:33:30 UTC (rev 9920) @@ -46,7 +46,7 @@ if (tuple(int(i) for i in PIL.__version__.split('.')) >= (10, 3)): DUMMY_PNG_NOT_FOUND = ("[Errno 2] No such file or directory: '%s'" % Path('dummy.png').resolve()) - SCALING_OUTPUT = 'style="width: 32.0px; height: 32.0px;" ' + SCALING_OUTPUT = 'style="width: 32px; height: 32px;" ' NO_PIL_SYSTEM_MESSAGE = '' else: REQUIRES_PIL = '\n Requires Python Imaging Library.' Modified: trunk/docutils/test/test_writers/test_html5_polyglot_misc.py =================================================================== --- trunk/docutils/test/test_writers/test_html5_polyglot_misc.py 2024-09-04 19:33:12 UTC (rev 9919) +++ trunk/docutils/test/test_writers/test_html5_polyglot_misc.py 2024-09-04 19:33:30 UTC (rev 9920) @@ -18,8 +18,8 @@ # so we import the local `docutils` package. sys.path.insert(0, str(Path(__file__).resolve().parents[2])) -from docutils import core -from docutils.writers import html5_polyglot +from docutils import core, frontend, nodes, utils +from docutils.writers import html5_polyglot, _html_base # TEST_ROOT is ./test/ from the docutils root TEST_ROOT = Path(__file__).parents[1] @@ -241,5 +241,21 @@ self.assertNotIn('MathJax', head) +class ImagesTestCase(unittest.TestCase): + """Test image handling routines.""" + + settings = frontend.get_default_settings(_html_base.Writer) + document = utils.new_document('test data', settings) + translator = _html_base.HTMLTranslator(document) + + def test_image_size(self): + image = nodes.image(height='3', width='4em') + self.assertEqual(self.translator.image_size(image), + 'width: 4em; height: 3px;') + image = nodes.image(height='3', width='4em', scale=50) + self.assertEqual(self.translator.image_size(image), + 'width: 2em; height: 1.5px;') + + if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-04 19:33:14
|
Revision: 9919 http://sourceforge.net/p/docutils/code/9919 Author: milde Date: 2024-09-04 19:33:12 +0000 (Wed, 04 Sep 2024) Log Message: ----------- New function `nodes.parse_measure()`. Relax `validate_measure()`. Allow "arbitrary" units: Check for a run of ASCII-letters or a percent sign. (The definition of "measure" in docutils.dtd and its description in doctree.txt do not include a restriction of the valid units.) Modified Paths: -------------- trunk/docutils/HISTORY.rst trunk/docutils/docutils/nodes.py trunk/docutils/docutils/parsers/rst/directives/__init__.py trunk/docutils/test/test_nodes.py trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py Modified: trunk/docutils/HISTORY.rst =================================================================== --- trunk/docutils/HISTORY.rst 2024-09-04 06:16:29 UTC (rev 9918) +++ trunk/docutils/HISTORY.rst 2024-09-04 19:33:12 UTC (rev 9919) @@ -63,6 +63,7 @@ convert string representations to correct data type, normalize values, raise ValueError for invalid attribute names or values. + - New function `parse_measure()`. - Removed `Element.set_class()`. * docutils/parsers/docutils_xml.py Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2024-09-04 06:16:29 UTC (rev 9918) +++ trunk/docutils/docutils/nodes.py 2024-09-04 19:33:12 UTC (rev 9919) @@ -3074,6 +3074,22 @@ return '"%s"' % value +def parse_measure(measure: str) -> tuple[float, str]: + """Parse a measure__, return value + optional unit. + + __ https://docutils.sourceforge.io/docs/ref/doctree.html#measure + + Provisional. + """ + match = re.fullmatch('(-?[0-9.]+) *([a-zA-Zµ]*|%?)', measure) + try: + value = float(match.group(1)) + unit = match.group(2) + except (AttributeError, ValueError): + raise ValueError(f'"{measure}" is no valid measure.') + return value, unit + + # Methods to validate `Element attribute`__ values. # Ensure the expected Python `data type`__, normalize, and check for @@ -3139,24 +3155,25 @@ return value -def validate_measure(value: str) -> str: +def validate_measure(measure: str) -> str: """ - Validate a length measure__ (number + recognized unit). + Validate a measure__ (number + optional unit). Return normalized `str`. - __ https://docutils.sourceforge.io/docs/ref/doctree.html#measure + See `parse_measure()` for a function returning a "number + unit" tuple. + The unit may be any run of letters or a percent sign. + Provisional. + + __ https://docutils.sourceforge.io/docs/ref/doctree.html#measure """ - units = 'em|ex|px|in|cm|mm|pt|pc|%' - if not re.fullmatch(f'[-0-9.]+ *({units}?)', value): - raise ValueError(f'"{value}" is no valid measure. ' - f'Valid units: {units.replace("|", " ")}.') - return value.replace(' ', '').strip() + value, unit = parse_measure(measure) + return f'{value:g}{unit}' def validate_NMTOKEN(value: str) -> str: """ - Validate a "name token": a `str` of letters, digits, and [-._]. + Validate a "name token": a `str` of ASCII letters, digits, and [-._]. Provisional. """ Modified: trunk/docutils/docutils/parsers/rst/directives/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/__init__.py 2024-09-04 06:16:29 UTC (rev 9918) +++ trunk/docutils/docutils/parsers/rst/directives/__init__.py 2024-09-04 19:33:12 UTC (rev 9919) @@ -261,8 +261,8 @@ float(match.group(1)) except (AttributeError, ValueError): raise ValueError( - 'not a positive measure of one of the following units:\n%s' - % ' '.join('"%s"' % i for i in units)) + 'not a positive measure of one of the following units:\n"%s"' + % '" "'.join(units)) return match.group(1) + match.group(2) Modified: trunk/docutils/test/test_nodes.py =================================================================== --- trunk/docutils/test/test_nodes.py 2024-09-04 06:16:29 UTC (rev 9918) +++ trunk/docutils/test/test_nodes.py 2024-09-04 19:33:12 UTC (rev 9919) @@ -502,11 +502,10 @@ node.validate() def test_validate_wrong_attribute_value(self): - node = nodes.image(uri='test.png', width='20 inch') # invalid unit + node = nodes.image(uri='test.png', width='1in 3pt') with self.assertRaisesRegex(nodes.ValidationError, 'Element <image.*> invalid:\n' - '.*"width" has invalid value "20 inch".\n' - '.*Valid units: em ex '): + '.*"width" has invalid value "1in 3pt".'): node.validate() def test_validate_spurious_element(self): @@ -1114,7 +1113,25 @@ self.assertEqual(nodes.split_name_list(r'a\ n\ame two\\ n\\ames'), ['a name', 'two\\', r'n\ames']) + def test_parse_measure(self): + # measure is number + optional unit (letter(s) or percentage) + self.assertEqual(nodes.parse_measure('8ex'), (8, 'ex')) + self.assertEqual(nodes.parse_measure('2.5'), (2.5, '')) + self.assertEqual(nodes.parse_measure('-2s'), (-2, 's')) + self.assertEqual(nodes.parse_measure('2 µF'), (2, 'µF')) + self.assertEqual(nodes.parse_measure('10 EUR'), (10, 'EUR')) + self.assertEqual(nodes.parse_measure('.5 %'), (.5, '%')) + # scientific notation not supported + with self.assertRaisesRegex(ValueError, '"3e-4 mm" is no valid '): + nodes.parse_measure('3e-4 mm') + # unit must follow the number + with self.assertRaisesRegex(ValueError, '"EUR 23" is no valid '): + nodes.parse_measure('EUR 23') + # only single percent sign allowed + with self.assertRaisesRegex(ValueError, '"2%%" is no valid measure'): + nodes.parse_measure('2%%') + class AttributeTypeTests(unittest.TestCase): """Test validator functions for the supported `attribute data types`__ @@ -1154,17 +1171,19 @@ nodes.validate_identifier_list(s2) def test_validate_measure(self): - # number (may be decimal fraction) + optional CSS2 length unit + # number (may be decimal fraction) + optional unit self.assertEqual(nodes.validate_measure('8ex'), '8ex') + self.assertEqual(nodes.validate_measure('2'), '2') + # internal whitespace is removed self.assertEqual(nodes.validate_measure('3.5 %'), '3.5%') - self.assertEqual(nodes.validate_measure('2'), '2') - with self.assertRaisesRegex(ValueError, '"2km" is no valid measure. ' - 'Valid units: em ex '): - nodes.validate_measure('2km') - # negative numbers are currently not supported - # TODO: allow? the spec doesnot mention negative numbers. - # but a negative width or height of an image is odd. - # nodes.validate_measure('-2') + # padding whitespace is not valid + with self.assertRaisesRegex(ValueError, '"8ex " is no valid measure'): + nodes.validate_measure('8ex ') + # Negative numbers: + # * ``doctree.txt`` does not mention negative numbers, + # * in rST, negative numbers are not valid. + # Provisional: currently valid but may become invalid! + # self.assertEqual(nodes.validate_measure('-2'), '-2') def test_validate_NMTOKEN(self): # str with ASCII-letters, digits, hyphen, underscore, and full-stop. Modified: trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py =================================================================== --- trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py 2024-09-04 06:16:29 UTC (rev 9918) +++ trunk/docutils/test/test_parsers/test_docutils_xml/test_parse_element.py 2024-09-04 19:33:12 UTC (rev 9919) @@ -93,12 +93,10 @@ """ xml = ('<image breadth="3 cm" height="3 inch"/>') node = docutils_xml.parse_element(xml) - self.assertEqual(xml, str(node)) + self.assertEqual(xml.replace('3 inch', '3inch'), str(node)) with self.assertRaisesRegex(ValueError, 'Element <image breadth="3 cm".*invalid:\n' - '.*"breadth" not one of "ids",.*\n' - '.*"height" has invalid value "3 inch".\n' - '.*Valid units: em ex px in cm mm pt ' + '.*"breadth" not one of "ids", ' ): node.validate() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-04 06:16:32
|
Revision: 9918 http://sourceforge.net/p/docutils/code/9918 Author: milde Date: 2024-09-04 06:16:29 +0000 (Wed, 04 Sep 2024) Log Message: ----------- Fixes for `nodes.Node` and `_html_base.SimpleListChecker` Ensure that all methods and attributes that are common to `nodes.Element` and `nodes.Text` are also defined in the abstract base class `nodes.Node`. Rename the node validation hook `check_position()` to `validate_position()` to indicate its relation to element validation. Define `_html_base.SimpleListChecker.default_departure` (as required per documentation in `nodes.GenericNodeVisitor`). Fixup for [r9901] Modified Paths: -------------- trunk/docutils/docutils/nodes.py trunk/docutils/docutils/writers/_html_base.py Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2024-09-03 09:35:59 UTC (rev 9917) +++ trunk/docutils/docutils/nodes.py 2024-09-04 06:16:29 UTC (rev 9918) @@ -71,7 +71,7 @@ class Node: """Abstract base class of nodes in a document tree.""" - parent: Node = None + parent: Element | None = None """Back-reference to the Node immediately containing this Node.""" children: Sequence[Node] = () @@ -398,7 +398,16 @@ Override in subclasses that define validity constraints. """ + def validate_position(self) -> None: + """Hook for additional checks of the parent's content model. + Raise ValidationError, if `self` is at an invalid position. + + Override in subclasses with complex validity constraints. See + `subtitle.validate_position()` and `transition.validate_position()`. + """ + + class Text(Node, str): # NoQA: SLOT000 (Node doesn't define __slots__) """ Instances are terminal nodes (leaves) containing text only; no child @@ -1120,10 +1129,7 @@ def clear(self) -> None: self.children = [] - def replace(self, - old: Node, - new: Node | Iterable[Node], - ) -> None: + def replace(self, old: Node, new: Node | Iterable[Node]) -> None: """Replace one child `Node` with another child or children.""" index = self.index(old) if isinstance(new, Node): @@ -1318,10 +1324,7 @@ continue # try same child with next part of content model else: # Check additional placement constraints (if applicable): - try: - child.check_position() - except AttributeError: - pass + child.validate_position() # advance: if quantifier in ('.', '?'): # go to next element child = next(ichildren, None) @@ -1330,7 +1333,7 @@ if not isinstance(child, category): break try: - child.check_position() + child.validate_position() except AttributeError: pass else: @@ -1355,13 +1358,6 @@ return (f'{msg} Expecting child of type <{_type}>, ' f'not {child.starttag()}.') - def check_position(self) -> None: - """Hook for additional checks of the parent's content model. - - Raise ValidationError, if `self` is at an invalid position. - See `subtitle.check_position()` and `transition.check_position()`. - """ - def validate(self, recursive: bool = True) -> None: """Validate Docutils Document Tree element ("doctree"). @@ -1601,7 +1597,7 @@ class subtitle(Titular, PreBibliographic, SubStructural, TextElement): """Sub-title of `document`, `section` and `sidebar`.""" - def check_position(self) -> None: + def validate_position(self) -> None: """Check position of subtitle: must follow a title.""" if self.parent and self.parent.index(self) == 0: raise ValidationError(f'Element {self.parent.starttag()} invalid:' @@ -1645,7 +1641,7 @@ __ https://docutils.sourceforge.io/docs/ref/doctree.html#transition """ - def check_position(self) -> None: + def validate_position(self) -> None: """Check additional constraints on `transition` placement. A transition may not begin or end a section or document, @@ -1697,7 +1693,7 @@ ((topic, Body), '+'), ) # ((title, subtitle?)?, (%body.elements; | topic)+) - # "subtitle only after title" is ensured in `subtitle.check_position()`. + # "subtitle only after title" is ensured in `subtitle.validate_position()`. class section(Structural, Element): @@ -1714,7 +1710,7 @@ ((section, transition), '*'), ) # (title, subtitle?, %structure.model;) -# Correct transition placement is ensured in `transition.check_position()`. +# Correct transition placement is ensured in `transition.validate_position()`. # Root Element @@ -1743,7 +1739,7 @@ # (docinfo, transition?)?, # %structure.model; ) # Additional restrictions for `subtitle` and `transition` are tested - # with the respective `check_position()` methods. + # with the respective `validate_position()` methods. def __init__(self, settings: Values, Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2024-09-03 09:35:59 UTC (rev 9917) +++ trunk/docutils/docutils/writers/_html_base.py 2024-09-04 06:16:29 UTC (rev 9918) @@ -1831,6 +1831,9 @@ def default_visit(self, node): raise nodes.NodeFound + def default_departure(self, node): + pass + def visit_list_item(self, node): children = [child for child in node.children if not isinstance(child, nodes.Invisible)] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-09-03 09:36:01
|
Revision: 9917 http://sourceforge.net/p/docutils/code/9917 Author: milde Date: 2024-09-03 09:35:59 +0000 (Tue, 03 Sep 2024) Log Message: ----------- Update documentation of `uri2imagepath()` method. Update wording around `URI references`__. Cf. [r9883]. __ https://www.rfc-editor.org/rfc/rfc3986.html#section-4.1 Modified Paths: -------------- trunk/docutils/docutils/writers/_html_base.py Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2024-08-21 13:45:27 UTC (rev 9916) +++ trunk/docutils/docutils/writers/_html_base.py 2024-09-03 09:35:59 UTC (rev 9917) @@ -609,18 +609,21 @@ def uri2imagepath(self, uri): """Get filesystem path corresponding to an URI. - The image directive expects an image URI. Some writers require the + The image directive expects an image URI__. Some writers require the corresponding image path to read the image size from the file or to embed the image in the output. - Absolute URIs consider the "root_prefix" setting. + URIs with absolute "path" part consider the ``root_prefix`` setting. - In order to work in the output document, relative image URIs relate - to the output directory. For access by the writer, the corresponding - image path must be relative to the current working directory. + In order to work in the output document, URI references with relative + path relate to the output directory. For access by the writer, the + corresponding image path must be relative to the current working + directory. Provisional: the function's location, interface and behaviour may change without advance warning. + + __ https://www.rfc-editor.org/rfc/rfc3986.html """ destination = self.settings._destination or '' uri_parts = urllib.parse.urlparse(uri) @@ -630,7 +633,7 @@ if imagepath.startswith('/'): # cf. config.html#root-prefix root_prefix = Path(self.settings.root_prefix) imagepath = (root_prefix/imagepath[1:]).as_posix() - elif not os.path.isabs(imagepath): # exclude absolute Windows paths + elif not os.path.isabs(imagepath): # path may be absolute Windows path destdir = os.path.abspath(os.path.dirname(destination)) imagepath = utils.relative_path(None, os.path.join(destdir, imagepath)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-08-21 13:45:30
|
Revision: 9916 http://sourceforge.net/p/docutils/code/9916 Author: milde Date: 2024-08-21 13:45:27 +0000 (Wed, 21 Aug 2024) Log Message: ----------- Refactor HTML4 writer tests. New test script "test_html4css1.py": Split basic output tests (which happen to use the "fragment" returned by `publish_parts()` to get the interesting part of the output) from other tests of `publish_parts()` Really test all returned parts in "test_html4css1_parts.py". Cf. "Refactor HTML5 writer tests". Modified Paths: -------------- trunk/docutils/test/test_writers/test_html4css1_parts.py Added Paths: ----------- trunk/docutils/test/test_writers/test_html4css1.py Added: trunk/docutils/test/test_writers/test_html4css1.py =================================================================== --- trunk/docutils/test/test_writers/test_html4css1.py (rev 0) +++ trunk/docutils/test/test_writers/test_html4css1.py 2024-08-21 13:45:27 UTC (rev 9916) @@ -0,0 +1,596 @@ +#! /usr/bin/env python3 + +# $Id$ +# Author: reggie dugard <re...@us...> +# Copyright: This module has been placed in the public domain. + +"""Test HTML4 writer output ("fragment" part). + +This is the document body (not HTML <body>). +""" + +from pathlib import Path +import re +import sys +import unittest + +if __name__ == '__main__': + # prepend the "docutils root" to the Python library path + # so we import the local `docutils` package. + sys.path.insert(0, str(Path(__file__).resolve().parents[2])) + +import docutils +import docutils.core +from docutils.utils.code_analyzer import with_pygments +from docutils.writers import html4css1 + +if with_pygments: + import pygments + _pv = re.match(r'^([0-9]+)\.([0-9]*)', pygments.__version__) + if (int(_pv[1]), int(_pv[2])) >= (2, 14): + # pygments output changed in version 2.14 + with_pygments = False + +# TEST_ROOT is ./test/ from the docutils root +TEST_ROOT = Path(__file__).parents[1] +DATA_ROOT = TEST_ROOT / 'data' +ROOT_PREFIX = (TEST_ROOT / 'functional/input').as_posix() + + +class Html5WriterPublishPartsTestCase(unittest.TestCase): + """Test case for HTML5 writer via the publish_parts() interface.""" + + maxDiff = None + + def test_publish(self): + if not with_pygments: + del totest['syntax_highlight'] + for name, (settings_overrides, cases) in totest.items(): + for casenum, (case_input, case_expected) in enumerate(cases): + with self.subTest(id=f'totest[{name!r}][{casenum}]'): + parts = docutils.core.publish_parts( + source=case_input, + writer=html4css1.Writer(), + settings_overrides={ + '_disable_config': True, + 'strict_visitor': True, + 'stylesheet_path': '', + 'section_self_link': True, + **settings_overrides, + } + ) + self.assertEqual(case_expected, parts['body']) + + +totest = {} + +totest['standard'] = ({}, [ +["""\ +Simple String +""", +'<p>Simple String</p>\n', +], +["""\ +Simple String with *markup* +""", +'<p>Simple String with <em>markup</em></p>\n', +], +["""\ +Simple String with an even simpler ``inline literal`` +""", +'<p>Simple String with an even simpler <tt class="docutils literal">inline literal</tt></p>\n', +], +["""\ +A simple `anonymous reference`__ + +__ http://www.test.com/test_url +""", +'<p>A simple <a class="reference external" href="http://www.test.com/test_url">anonymous reference</a></p>\n', +], +["""\ +One paragraph. + +Two paragraphs. +""", +"""\ +<p>One paragraph.</p> +<p>Two paragraphs.</p> +""", +], +["""\ +A simple `named reference`_ with stuff in between the +reference and the target. + +.. _`named reference`: http://www.test.com/test_url +""", +"""\ +<p>A simple <a class="reference external" href="http://www.test.com/test_url">named reference</a> with stuff in between the +reference and the target.</p> +""", +], +["""\ +.. [CIT2022] A citation. +""", +"""\ +<table class="docutils citation" frame="void" id="cit2022" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label">[CIT2022]</td><td>A citation.</td></tr> +</tbody> +</table> +""", +], +]) + + +totest['no_title_promotion'] = ({'doctitle_xform': False}, [ +["""\ ++++++ +Title ++++++ + +Not A Subtitle +============== + +Some stuff + +Section +------- + +Some more stuff + +Another Section +............... + +And even more stuff +""", +"""\ +<div class="section" id="title"> +<h1>Title</h1> +<div class="section" id="not-a-subtitle"> +<h2>Not A Subtitle</h2> +<p>Some stuff</p> +<div class="section" id="section"> +<h3>Section</h3> +<p>Some more stuff</p> +<div class="section" id="another-section"> +<h4>Another Section</h4> +<p>And even more stuff</p> +</div> +</div> +</div> +</div> +""", +], +["""\ +* bullet +* list +""", +"""\ +<ul class="simple"> +<li>bullet</li> +<li>list</li> +</ul> +""", +], +["""\ +.. table:: + :align: right + + +-----+-----+ + | 1 | 2 | + +-----+-----+ + | 3 | 4 | + +-----+-----+ +""", +"""\ +<table border="1" class="docutils align-right"> +<colgroup> +<col width="50%" /> +<col width="50%" /> +</colgroup> +<tbody valign="top"> +<tr><td>1</td> +<td>2</td> +</tr> +<tr><td>3</td> +<td>4</td> +</tr> +</tbody> +</table> +""", +], +["""\ +Not a docinfo. + +:This: .. _target: + + is +:a: +:simple: +:field: list +""", +"""\ +<p>Not a docinfo.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">This:</th><td class="field-body"><p class="first last" id="target">is</p> +</td> +</tr> +<tr class="field"><th class="field-name">a:</th><td class="field-body"></td> +</tr> +<tr class="field"><th class="field-name">simple:</th><td class="field-body"></td> +</tr> +<tr class="field"><th class="field-name">field:</th><td class="field-body">list</td> +</tr> +</tbody> +</table> +""", +], +["""\ +Not a docinfo. + +:This is: a +:simple field list with loooong field: names +""", +"""\ +<p>Not a docinfo.</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">This is:</th><td class="field-body">a</td> +</tr> +<tr class="field"><th class="field-name" colspan="2">simple field list with loooong field:</th></tr> +<tr class="field"><td> </td><td class="field-body">names</td> +</tr> +</tbody> +</table> +""", +], +["""\ +Not a docinfo. + +.. class:: field-indent-200 + +:This: is a +:simple: field list with custom indent. +""", +"""\ +<p>Not a docinfo.</p> +<table class="field-indent-200 docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">This:</th><td class="field-body">is a</td> +</tr> +<tr class="field"><th class="field-name">simple:</th><td class="field-body">field list with custom indent.</td> +</tr> +</tbody> +</table> +""", +], +["""\ +Not a docinfo. + +.. class:: field-indent-200uf + +:This: is a +:simple: field list without custom indent, + because the unit "uf" is invalid. +""", +"""\ +<p>Not a docinfo.</p> +<table class="field-indent-200uf docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">This:</th><td class="field-body">is a</td> +</tr> +<tr class="field"><th class="field-name">simple:</th><td class="field-body">field list without custom indent, +because the unit "uf" is invalid.</td> +</tr> +</tbody> +</table> +""", +], +["""\ +.. figure:: dummy.png + + The figure's caption. + + A legend. + + The legend's second paragraph. +""", +"""\ +<div class="figure"> +<img alt="dummy.png" src="dummy.png" /> +<p class="caption">The figure's caption.</p> +<div class="legend"> +<p>A legend.</p> +<p>The legend's second paragraph.</p> +</div> +</div> +""", +], +["""\ +.. figure:: dummy.png + + The figure's caption, no legend. +""", +"""\ +<div class="figure"> +<img alt="dummy.png" src="dummy.png" /> +<p class="caption">The figure's caption, no legend.</p> +</div> +""", +], +["""\ +.. figure:: dummy.png + + .. + + A legend without caption. +""", +"""\ +<div class="figure"> +<img alt="dummy.png" src="dummy.png" /> +<div class="legend"> +A legend without caption.</div> +</div> +""", +], +["""\ +.. figure:: dummy.png + +No caption nor legend. +""", +"""\ +<div class="figure"> +<img alt="dummy.png" src="dummy.png" /> +</div> +<p>No caption nor legend.</p> +""", +], +[f"""\ +.. include:: {DATA_ROOT}/multiple-term-definition.xml + :parser: xml +""", +"""\ +<dl class="docutils"> +<dt>New in Docutils 0.22</dt> +<dd><p class="first">A definition list item may contain several +terms with optional classifier(s).</p> +<p class="last">However, there is currently no corresponding +reStructuredText syntax.</p> +</dd> +<dt>term 2a</dt> +<dt>term 2b</dt> +<dd>definition 2</dd> +<dt>term 3a <span class="classifier-delimiter">:</span> <span class="classifier">classifier 3a</span> <span class="classifier-delimiter">:</span> <span class="classifier">classifier 3aa</span><dt>term 3b <span class="classifier-delimiter">:</span> <span class="classifier">classifier 3b</span></dt> +<dd>definition 3</dd> +</dl> +""", +], +]) + + +totest['lazy_loading'] = ({'image_loading': 'lazy', + 'report_level': 4}, [ +["""\ +Lazy loading by default, overridden by :loading: option +("cannot embed" warning ignored). + +.. image:: dummy.png +.. image:: dummy.png + :loading: link +.. figure:: dummy.png +.. figure:: dummy.png + :loading: embed +""", +"""\ +<p>Lazy loading by default, overridden by :loading: option +("cannot embed" warning ignored).</p> +<img alt="dummy.png" src="dummy.png" /> +<img alt="dummy.png" src="dummy.png" /> +<div class="figure"> +<img alt="dummy.png" src="dummy.png" /> +</div> +<div class="figure"> +<img alt="dummy.png" src="dummy.png" /> +</div> +""", +], +]) + + +totest['root_prefix'] = ({'root_prefix': ROOT_PREFIX, + 'image_loading': 'embed', + 'warning_stream': '', + }, [ +["""\ +.. image:: /data/blue%20square.png + :scale: 100% +.. figure:: /data/blue%20square.png +""", +"""\ +<img alt="/data/blue%20square.png" src="/data/blue%20square.png" style="width: 32.0px; height: 32.0px;" /> +<div class="figure"> +<img alt="/data/blue%20square.png" src="/data/blue%20square.png" /> +</div> +""" +], +]) + + +totest['no_backlinks'] = ({'footnote_backlinks': False}, [ + +["""\ +Two footnotes [#f1]_ [#f2]_ and two citations [once]_ [twice]_. + +The latter are referenced a second time [#f2]_ [twice]_. + +.. [#f1] referenced once +.. [#f2] referenced twice +.. [once] citation referenced once +.. [twice] citation referenced twice +""", +"""\ +<p>Two footnotes <a class="footnote-reference" href="#f1" id="footnote-reference-1">[1]</a> <a class="footnote-reference" href="#f2" id="footnote-reference-2">[2]</a> and two citations <a class="citation-reference" href="#once" id="citation-reference-1">[once]</a> <a class="citation-reference" href="#twice" id="citation-reference-2">[twice]</a>.</p> +<p>The latter are referenced a second time <a class="footnote-reference" href="#f2" id="footnote-reference-3">[2]</a> <a class="citation-reference" href="#twice" id="citation-reference-3">[twice]</a>.</p> +<table class="docutils footnote" frame="void" id="f1" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label">[1]</td><td>referenced once</td></tr> +</tbody> +</table> +<table class="docutils footnote" frame="void" id="f2" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label">[2]</td><td>referenced twice</td></tr> +</tbody> +</table> +<table class="docutils citation" frame="void" id="once" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label">[once]</td><td>citation referenced once</td></tr> +</tbody> +</table> +<table class="docutils citation" frame="void" id="twice" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label">[twice]</td><td>citation referenced twice</td></tr> +</tbody> +</table> +""", +], +]) + + +totest['syntax_highlight'] = ({'syntax_highlight': 'short', + }, [ +["""\ +.. code:: shell + + cat <<EOF + Hello World + EOF +""", +"""\ +<pre class="code shell literal-block"> +cat <span class="s"><<EOF +Hello World +EOF</span> +</pre> +""", +], +["""\ +.. role:: shell(code) + :language: shell + +:shell:`cat <<EOF Hello World EOF` +""", +"""\ +<p><code class="shell">cat <span class="s"><<EOF Hello World EOF</span></code></p> +""", +], +]) + + +totest['system_messages'] = ({'math_output': 'mathml', + 'warning_stream': '', + }, [ +# No warning with HTML4 ("embed" error is silently ignored). +["""\ +.. image:: https://dummy.png + :loading: embed +""", +"""\ +<img alt="https://dummy.png" src="https://dummy.png" /> +""", +], +# No error with HTML4 (silently ignored) +[f"""\ +.. image:: {DATA_ROOT.as_uri()}/circle-broken.svg + :loading: embed +""", +"""\ +<object data="file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg" type="image/svg+xml">file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg</object> +""" +], +[r"""Broken :math:`\sin \my`. +""", +"""\ +<p>Broken <span class="math problematic">\\sin \\my</span>.</p> +<div class="system-message"> +<p class="system-message-title">System Message: WARNING/2 (<tt class="docutils"><string></tt>, line 1)</p> +Unknown LaTeX command "\\my".</div> +"""], +]) + +totest['system_messages-PIL'] = ({'math_output': 'mathml', + 'warning_stream': '', + }, [ +["""\ +.. image:: dummy.png + :scale: 100% + :loading: embed +""", +"""\ +<img alt="dummy.png" src="dummy.png" /> +""", +], +["""\ +.. image:: dummy.mp4 + :scale: 100% +""", +"""\ +<object data="dummy.mp4" type="video/mp4">dummy.mp4</object> +""", +], +["""\ +.. image:: https://dummy.png + :scale: 100% + :loading: embed +""", +"""\ +<img alt="https://dummy.png" src="https://dummy.png" /> +""", +], +]) + +totest['no_system_messages'] = ({'math_output': 'mathml', + 'report_level': 4, + 'warning_stream': '', + }, [ +["""\ +.. image:: dummy.png + :scale: 100% + :loading: embed + +.. image:: dummy.mp4 + :scale: 100% +""", +"""\ +<img alt="dummy.png" src="dummy.png" /> +<object data="dummy.mp4" type="video/mp4">dummy.mp4</object> +""", +], +[f"""\ +.. image:: {DATA_ROOT.as_uri()}/circle-broken.svg + :loading: embed +""", +"""\ +<object data="file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg" type="image/svg+xml">file:///usr/local/src/docutils-git-svn/docutils/test/data/circle-broken.svg</object> +"""], +[r'Broken :math:`\sin \my`.', +'<p>Broken <tt class="math">\\sin \\my</tt>.</p>\n' +], +]) + + +if __name__ == '__main__': + unittest.main() Property changes on: trunk/docutils/test/test_writers/test_html4css1.py ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision \ No newline at end of property Modified: trunk/docutils/test/test_writers/test_html4css1_parts.py =================================================================== --- trunk/docutils/test/test_writers/test_html4css1_parts.py 2024-08-21 13:45:18 UTC (rev 9915) +++ trunk/docutils/test/test_writers/test_html4css1_parts.py 2024-08-21 13:45:27 UTC (rev 9916) @@ -5,11 +5,9 @@ # Copyright: This module has been placed in the public domain. """ -Test for fragment code in HTML writer. +Test `core.publish_parts()`__ with the html4css1 writer. -Note: the 'body' and 'whole' entries have been removed from the parts -dictionaries (redundant), along with 'meta' and 'stylesheet' entries with -standard values, and any entries with empty values. +__ https://docutils.sourceforge.io/docs/api/publisher.html#publish-parts """ from pathlib import Path @@ -23,142 +21,145 @@ import docutils import docutils.core -from docutils.parsers.rst.directives.images import PIL from docutils.writers import html4css1 -ROOT_PREFIX = (Path(__file__).parent.parent/'functional'/'input').as_posix() -if PIL: - SCALING_OUTPUT = 'style="width: 32.0px; height: 32.0px;" ' -else: - SCALING_OUTPUT = '' +# TEST_ROOT is ./test/ from the docutils root +TEST_ROOT = Path(__file__).parents[1] +DATA_ROOT = TEST_ROOT / 'data' +ROOT_PREFIX = (TEST_ROOT / 'functional/input').as_posix() -class Html4WriterPublishPartsTestCase(unittest.TestCase): - """ - Test case for HTML writer via the publish_parts interface. - """ +# Parts returned by `publish_parts()` for the HTML5 writer by default: +# * empty input string +# * default configuration settings. +# See format_parts() below for the substitution of unresolved format markers. +default_parts = { + 'body': '{fragment}', + 'body_pre_docinfo': '', + 'body_prefix': '</head>\n<body>\n{header}<div class="document">\n', + 'body_suffix': '</div>\n{footer}</body>\n</html>\n', + 'docinfo': '', + 'encoding': 'utf-8', + 'errors': 'xmlcharrefreplace', + 'footer': '', + 'fragment': '', + 'head': '{meta}<title>{metatitle}</title>\n', + 'head_prefix': + '<?xml version="1.0" encoding="utf-8"?>\n' + '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' + ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n' + '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n' + '<head>\n', + 'header': '', + 'html_body': '{header}<div class="document">\n{fragment}</div>\n{footer}', + 'html_head': '{meta}<title>{metatitle}</title>\n', + 'html_prolog': + '<?xml version="1.0" encoding="%s"?>\n' + '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' + ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n', + 'html_subtitle': '', + 'html_title': '', + 'meta': '<meta http-equiv="Content-Type" content="text/html; charset=%s" />\n' + f'<meta name="generator" content="Docutils {docutils.__version__}: https://docutils.sourceforge.io/" />\n', + 'stylesheet': '', + 'subtitle': '', + 'title': '', + 'version': f'{docutils.__version__}', + 'whole': + '{head_prefix}\n' + '{head}\n' + '{stylesheet}\n' + '{body_prefix}\n' + '{body_pre_docinfo}\n' + '{docinfo}\n' + '{body}\n' + '{body_suffix}\n', + } - maxDiff = None - def test_publish(self): - for name, (settings_overrides, cases) in totest.items(): - for casenum, (case_input, case_expected) in enumerate(cases): - with self.subTest(id=f'totest[{name!r}][{casenum}]'): - parts = docutils.core.publish_parts( - source=case_input, - writer=html4css1.Writer(), - settings_overrides={ - '_disable_config': True, - 'strict_visitor': True, - 'stylesheet_path': '', - **settings_overrides, - } - ) - # if the formatted output is a just single fragment, - # compare the text directly for a nicer diff on failure - formatted = self.format_output(parts) - if len(formatted) == 1 and 'fragment' in formatted: - fragment = formatted['fragment'] - self.assertEqual(case_expected, fragment) - else: - self.assertEqual(case_expected, formatted) +def format_parts(parts): + # fill in part values that depend on other parts + # https://docutils.sourceforge.io/docs/api/publisher.html#html4-writer - standard_content_type_template = ('<meta http-equiv="Content-Type"' - ' content="text/html; charset=%s" />\n') - standard_generator_template = ( - '<meta name="generator"' - f' content="Docutils {docutils.__version__}: ' - f'https://docutils.sourceforge.io/" />\n') - standard_html_meta_value = ( - standard_content_type_template - + standard_generator_template) - standard_meta_value = standard_html_meta_value % 'utf-8' - standard_html_prolog = ( - '<?xml version="1.0" encoding="%s"?>\n' - '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ' - '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n') - standard_html_body_template = '<div class="document">\n%s</div>\n' + # metadata title: either the visible title or document['source'] + metatitle = parts['title'] or '<string>' - def format_output(self, parts): - """Minimize & standardize the output.""" - # remove redundant parts & uninteresting parts: - del parts['whole'] - assert parts['body'] == parts['fragment'] - del parts['body'] - del parts['body_pre_docinfo'] - del parts['body_prefix'] - del parts['body_suffix'] - del parts['head'] - del parts['head_prefix'] - del parts['encoding'] - del parts['errors'] - del parts['version'] - # remove standard portions: - parts['meta'] = parts['meta'].replace(self.standard_meta_value, '') - parts['html_head'] = parts['html_head'].replace( - self.standard_html_meta_value, '...') - parts['html_head'] = parts['html_head'].replace( - '...<title><string></title>\n', '') - parts['html_prolog'] = parts['html_prolog'].replace( - self.standard_html_prolog, '') - parts['html_body'] = parts['html_body'].replace( - self.standard_html_body_template % parts['fragment'], '') - # remove empty keys and return - return {k: v for k, v in parts.items() if v} + # "html_head" leaves the encoding unresolved, as "%s": + parts['html_head'] = parts['html_head'].format(metatitle=metatitle, + **parts) + # now resolve encoding: + try: + parts['meta'] = parts['meta'] % parts['encoding'] + except TypeError: # charset-<meta> missing if encoding is 'unicode' + pass + parts['head'] = parts['head'].format(metatitle=metatitle, **parts) + parts['body_prefix'] = parts['body_prefix'].format(**parts) + parts['body'] = parts['body'].format(**parts) + parts['body_suffix'] = parts['body_suffix'].format(**parts) + parts['html_body'] = parts['html_body'].format(**parts) + # newlines are stripped when parts are used to expand the template file + parts['whole'] = parts['whole'].format(**{k: v.rstrip('\n') + for k, v in parts.items()}) + return parts -totest = {} +class Html5WriterPublishPartsTestCase(unittest.TestCase): + """Test HTML5 writer `publish_parts()` interface.""" -totest['title_promotion'] = ({}, [ -["""\ -Simple String -""", -'<p>Simple String</p>\n', -], -["""\ -Simple String with *markup* -""", -'<p>Simple String with <em>markup</em></p>\n', -], -["""\ -Simple String with an even simpler ``inline literal`` -""", -'<p>Simple String with an even simpler <tt class="docutils literal">inline literal</tt></p>\n', -], -["""\ -Simple ``inline\xA0literal`` with NBSP -""", -'<p>Simple <tt class="docutils literal">inline literal</tt> with NBSP</p>\n', -], -["""\ -A simple `anonymous reference`__ + maxDiff = None -__ http://www.test.com/test_url -""", -'<p>A simple <a class="reference external" href="http://www.test.com/test_url">anonymous reference</a></p>\n', -], -["""\ -One paragraph. + def test_publish_parts(self): + for name, (settings_overrides, cases) in totest.items(): + for casenum, (case_input, expected_parts) in enumerate(cases): + _stgns = {'_disable_config': True, + 'strict_visitor': True, + 'stylesheet_path': '', + 'section_self_link': True, + **settings_overrides, + } + parts = docutils.core.publish_parts(source=case_input, + writer=html4css1.Writer(), + settings_overrides=_stgns, + ) + expected = format_parts(default_parts | expected_parts) + for key in parts.keys(): + with self.subTest(id=f'totest[{name!r}][{casenum}][{key}]'): + self.assertEqual(f'{expected[key]}', + f'{parts[key]}') -Two paragraphs. -""", -"""\ -<p>One paragraph.</p> -<p>Two paragraphs.</p> -""", -], -["""\ -A simple `named reference`_ with stuff in between the -reference and the target. -.. _`named reference`: http://www.test.com/test_url -""", -"""\ -<p>A simple <a class="reference external" href="http://www.test.com/test_url">named reference</a> with stuff in between the -reference and the target.</p> -""", -], -["""\ +totest = {} + +totest['standard'] = ({}, [ + ['', # empty input string + {} # results in default parts + ], + ['Simple String with *markup*', + {'fragment': '<p>Simple String with <em>markup</em></p>\n'} + ], + ['.. header:: custom document header\n\n' + 'A paragraph.', + {'header': '<div class="header">\ncustom document header\n' + '<hr class="header"/>\n</div>\n', + 'body_prefix': '</head>\n' + '<body>\n' + '<div class="header">\n' + 'custom document header\n' + '<hr class="header"/>\n' + '</div>\n' + '<div class="document">\n', + 'fragment': '<p>A paragraph.</p>\n', + } + ], + ['.. footer:: custom document footer\n\n' + 'A paragraph.', + {'footer': '<div class="footer">\n' + '<hr class="footer" />\n' + 'custom document footer\n</div>\n', + 'fragment': '<p>A paragraph.</p>\n', + } + ], + ["""\ +++++ Title +++++ @@ -178,7 +179,10 @@ And even more stuff """, -{'fragment': """\ + {'body_pre_docinfo': '<h1 class="title">Title</h1>\n' + '<h2 class="subtitle" id="subtitle">Subtitle</h2>\n', + 'body_prefix': '</head>\n<body>\n<div class="document" id="title">\n', + 'fragment': """\ <p>Some stuff</p> <div class="section" id="section"> <h1>Section</h1> @@ -189,7 +193,8 @@ </div> </div> """, - 'html_body': """<div class="document" id="title"> + 'html_body': """\ +<div class="document" id="title"> <h1 class="title">Title</h1> <h2 class="subtitle" id="subtitle">Subtitle</h2> <p>Some stuff</p> @@ -203,13 +208,12 @@ </div> </div> """, - 'html_head': '...<title>Title</title>\n', - 'html_subtitle': '<h2 class="subtitle" id="subtitle">Subtitle</h2>\n', - 'html_title': '<h1 class="title">Title</h1>\n', - 'subtitle': 'Subtitle', - 'title': 'Title' -}], -["""\ + 'html_subtitle': '<h2 class="subtitle" id="subtitle">Subtitle</h2>\n', + 'html_title': '<h1 class="title">Title</h1>\n', + 'subtitle': 'Subtitle', + 'title': 'Title' + }], + ["""\ +++++ Title +++++ @@ -218,7 +222,10 @@ Some stuff """, -{'docinfo': """<table class="docinfo" frame="void" rules="none"> + {'body_pre_docinfo': '<h1 class="title">Title</h1>\n', + 'body_prefix': '</head>\n<body>\n<div class="document" id="title">\n', + 'docinfo': """\ +<table class="docinfo" frame="void" rules="none"> <col class="docinfo-name" /> <col class="docinfo-content" /> <tbody valign="top"> @@ -227,8 +234,9 @@ </tbody> </table> """, - 'fragment': '<p>Some stuff</p>\n', - 'html_body': """<div class="document" id="title"> + 'fragment': '<p>Some stuff</p>\n', + 'html_body': """\ +<div class="document" id="title"> <h1 class="title">Title</h1> <table class="docinfo" frame="void" rules="none"> <col class="docinfo-name" /> @@ -241,50 +249,14 @@ <p>Some stuff</p> </div> """, - 'html_head': """...<meta name="author" content="me" /> -<title>Title</title> -""", - 'html_title': '<h1 class="title">Title</h1>\n', - 'meta': '<meta name="author" content="me" />\n', - 'title': 'Title' -}] -]) + 'html_title': '<h1 class="title">Title</h1>\n', + 'meta': default_parts['meta'] + '<meta name="author" content="me" />\n', + 'title': 'Title' + }], + ]) totest['no_title_promotion'] = ({'doctitle_xform': False}, [ -["""\ -Simple String -""", -'<p>Simple String</p>\n', -], -["""\ -Simple String with *markup* -""", -'<p>Simple String with <em>markup</em></p>\n', -], -["""\ -Simple String with an even simpler ``inline literal`` -""", -'<p>Simple String with an even simpler <tt class="docutils literal">inline literal</tt></p>\n', -], -["""\ -A simple `anonymous reference`__ - -__ http://www.test.com/test_url -""", -'<p>A simple <a class="reference external" href="http://www.test.com/test_url">anonymous reference</a></p>\n', -], -["""\ -A simple `named reference`_ with stuff in between the -reference and the target. - -.. _`named reference`: http://www.test.com/test_url -""", -"""\ -<p>A simple <a class="reference external" href="http://www.test.com/test_url">named reference</a> with stuff in between the -reference and the target.</p> -""", -], -["""\ + ["""\ +++++ Title +++++ @@ -304,7 +276,7 @@ And even more stuff """, -"""\ + {'fragment': """\ <div class="section" id="title"> <h1>Title</h1> <div class="section" id="not-a-subtitle"> @@ -320,109 +292,25 @@ </div> </div> </div> -""", -], -["""\ -* bullet -* list -""", -"""\ -<ul class="simple"> -<li>bullet</li> -<li>list</li> -</ul> -""", -], -["""\ -.. table:: - :align: right +"""}, + ], + ]) - +-----+-----+ - | 1 | 2 | - +-----+-----+ - | 3 | 4 | - +-----+-----+ -""", -"""\ -<table border="1" class="docutils align-right"> -<colgroup> -<col width="50%" /> -<col width="50%" /> -</colgroup> -<tbody valign="top"> -<tr><td>1</td> -<td>2</td> -</tr> -<tr><td>3</td> -<td>4</td> -</tr> -</tbody> -</table> -""", -], -["""\ -Not a docinfo. +totest['unknown-encoding'] = ({'output_encoding': 'unicode'}, [ + ['Simple String\n', + {'encoding': 'unicode', + 'fragment': '<p>Simple String</p>\n', + 'head_prefix': + '<?xml version="1.0"?>\n' + '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' + ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n' + '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n' + '<head>\n', + 'html_head': f'{default_parts["meta"]}<title>{{metatitle}}</title>\n', + 'meta': f'<meta name="generator" content="Docutils {docutils.__version__}: https://docutils.sourceforge.io/" />\n', + }], + ]) -:This: .. _target: - is -:a: -:simple: -:field: list -""", -"""\ -<p>Not a docinfo.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field"><th class="field-name">This:</th><td class="field-body"><p class="first last" id="target">is</p> -</td> -</tr> -<tr class="field"><th class="field-name">a:</th><td class="field-body"></td> -</tr> -<tr class="field"><th class="field-name">simple:</th><td class="field-body"></td> -</tr> -<tr class="field"><th class="field-name">field:</th><td class="field-body">list</td> -</tr> -</tbody> -</table> -""", -], -["""\ -Not a docinfo. - -:This is: a -:simple field list with loooong field: names -""", -"""\ -<p>Not a docinfo.</p> -<table class="docutils field-list" frame="void" rules="none"> -<col class="field-name" /> -<col class="field-body" /> -<tbody valign="top"> -<tr class="field"><th class="field-name">This is:</th><td class="field-body">a</td> -</tr> -<tr class="field"><th class="field-name" colspan="2">simple field list with loooong field:</th></tr> -<tr class="field"><td> </td><td class="field-body">names</td> -</tr> -</tbody> -</table> -""", -], -]) - -totest['root_prefix'] = ({'root_prefix': ROOT_PREFIX}, [ - -["""\ -.. image:: /data/blue%20square.png - :scale: 100% -""", -'<img alt="/data/blue%20square.png"' -f' src="/data/blue%20square.png" {SCALING_OUTPUT}/>\n', -], -]) - - if __name__ == '__main__': unittest.main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2024-08-21 13:45:21
|
Revision: 9915 http://sourceforge.net/p/docutils/code/9915 Author: milde Date: 2024-08-21 13:45:18 +0000 (Wed, 21 Aug 2024) Log Message: ----------- HTML4 writer: catch/report errors when reading image file. The html writers read image files when embedding an image or scaling an image without size options. Catch errors from converting the image URI to a file system path. Report errors as warning. Modified Paths: -------------- trunk/docutils/docutils/writers/html4css1/__init__.py Modified: trunk/docutils/docutils/writers/html4css1/__init__.py =================================================================== --- trunk/docutils/docutils/writers/html4css1/__init__.py 2024-08-21 13:45:08 UTC (rev 9914) +++ trunk/docutils/docutils/writers/html4css1/__init__.py 2024-08-21 13:45:18 UTC (rev 9915) @@ -571,12 +571,13 @@ if 'scale' in node: if (PIL and ('width' not in node or 'height' not in node) and self.settings.file_insertion_enabled): - imagepath = self.uri2imagepath(uri) try: + imagepath = self.uri2imagepath(uri) with PIL.Image.open(imagepath) as img: img_size = img.size - except (OSError, UnicodeEncodeError): - pass # TODO: warn/info? + except (ValueError, OSError, UnicodeEncodeError) as e: + self.document.reporter.warning( + f'Problem reading image file: {e}') else: self.settings.record_dependencies.add( imagepath.replace('\\', '/')) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |