From: Tony N. <to...@gi...> - 2017-07-18 06:54:43
|
Hello docutils users, Is there a way to get the equivalent to “.. contents::” from publish_parts? http://docutils.sourceforge.net/0.4/docs/api/publisher.html If not, is there any way to get the table of contents programmatically? If not, is there any reason / issue with it being a feature? The practical use is a developer pulling out parts the HTML output would like control over the table of contents output. |
From: Guenter M. <mi...@us...> - 2017-07-18 18:31:55
|
On 2017-07-18, Tony Narlock wrote: > Is there a way to get the equivalent to “.. contents::” from publish_parts? According to http://docutils.sourceforge.net/docs/api/publisher.html#publish-parts-details, no. > If not, is there any way to get the table of contents programmatically? This could be done in a wrapper; or a custom writer or front-end. Places to look include the transforms.parts.Content() and the used HTML writer. > If not, is there any reason / issue with it being a feature? I don't know. > The practical use is a developer pulling out parts the HTML output would > like control over the table of contents output. The simple and secure approach would be CSS styling --- unless the task is more complicated. Günter |
From: Tony N. <to...@gi...> - 2017-07-19 12:57:25
|
I’m getting there, I’ve overrides the Writer and added a new visitor attribute for “toc”. visitor_attributes = Writer.visitor_attributes + ('toc', ) So “toc” should be collected during assemble_parts. >From here, I want to inject the TOC the document into “toc”. There’s transforms.parts.Content(), but I’m not sure where and how I’d put it into play. There is also a directive for parsers.rst.directives.parts.Contents. I’m curious how I would go about injecting that. So how do you think I can go about that? Could you give me a code example to how I could get the equivalent of .. contents:: showing up in a “toc” part of writer? Best, On July 18, 2017 at 1:32:12 PM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-18, Tony Narlock wrote: > Is there a way to get the equivalent to “.. contents::” from publish_parts? According to http://docutils.sourceforge.net/docs/api/publisher.html#publish-parts-details , no. > If not, is there any way to get the table of contents programmatically? This could be done in a wrapper; or a custom writer or front-end. Places to look include the transforms.parts.Content() and the used HTML writer. > If not, is there any reason / issue with it being a feature? I don't know. > The practical use is a developer pulling out parts the HTML output would > like control over the table of contents output. The simple and secure approach would be CSS styling --- unless the task is more complicated. Günter ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. |
From: Guenter M. <mi...@us...> - 2017-07-19 16:33:38
|
On 2017-07-19, Tony Narlock wrote: > I’m getting there, > I’ve overrides the Writer and added a new visitor attribute for “toc”. > visitor_attributes = Writer.visitor_attributes + ('toc', ) > So “toc” should be collected during assemble_parts. > From here, I want to inject the TOC the document into “toc”. > There’s transforms.parts.Content(), but I’m not sure where and how I’d put > it into play. The transform generates the TOC by travelling the document tree after parsing is complete. A good representation of its output can be gained, if you create a `minimal example` sample document, translate it to pseudoxml and examine the result. If the toc represents the logical structure you want to show in your output document, fine. You can leave the transform as-is. If not, explain the changes you think are necessary. > There is also a directive for parsers.rst.directives.parts.Contents. I’m > curious how I would go about injecting that. This should be the class triggered by the ``.. contents::`` directive. It will ensure the transform is called at the right time and does the right thing. > So how do you think I can go about that? Could you give me a code example > to how I could get the equivalent of .. contents:: showing up in a “toc” > part of writer? Rather, you should provide a minimal working example showing what you want to achieve (+ a diff between current and desired output). Günter |
From: Tony N. <to...@gi...> - 2017-07-19 21:04:26
|
On July 19, 2017 at 11:33:54 AM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-19, Tony Narlock wrote: > I’m getting there, > I’ve overrides the Writer and added a new visitor attribute for “toc”. > visitor_attributes = Writer.visitor_attributes + ('toc', ) > So “toc” should be collected during assemble_parts. > From here, I want to inject the TOC the document into “toc”. > There’s transforms.parts.Content(), but I’m not sure where and how I’d put > it into play. The transform generates the TOC by travelling the document tree after parsing is complete. A good representation of its output can be gained, if you create a `minimal example` sample document, translate it to pseudoxml and examine the result. If the toc represents the logical structure you want to show in your output document, fine. You can leave the transform as-is. If not, explain the changes you think are necessary. That means, in my situation, the transform itself is OK as is. I just want publish_parts to output the HTML contents of TOC to its own part. e.g., In the same way publish_parts gives “html_body” and “fragment”, I want it to return “toc”, which is the HTML output of the table of contents. > There is also a directive for parsers.rst.directives.parts.Contents. I’m > curious how I would go about injecting that. This should be the class triggered by the ``.. contents::`` directive. It will ensure the transform is called at the right time and does the right thing. Yes. I pretty much want a new “part” created by HTMLWriter when publish_parts is used that only contains “.. contents::” output. > So how do you think I can go about that? Could you give me a code example > to how I could get the equivalent of .. contents:: showing up in a “toc” > part of writer? Rather, you should provide a minimal working example showing what you want to achieve (+ a diff between current and desired output). https://gist.github.com/tony/c4fc5661fcd4b7de71c65dd8a52c9ea4 Günter ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. Thanks, P.S. Using the new docutils 0.14rc2 release. Thanks Günter. |
From: Guenter M. <mi...@us...> - 2017-07-19 22:26:58
|
On 2017-07-19, Tony Narlock wrote: > On July 19, 2017 at 11:33:54 AM, Guenter Milde via Docutils-users ( > doc...@li...) wrote: ... >> There’s transforms.parts.Content(), but I’m not sure where and how I’d put >> it into play. > The transform generates the TOC by travelling the document tree after > parsing is complete. > I just want publish_parts to output the HTML contents of TOC to its own > part. > e.g., In the same way publish_parts gives “html_body” and “fragment”, I > want it to return “toc”, which is the HTML output of the table of contents. Then, you can leave the transform and directive alone. > Yes. I pretty much want a new “part” created by HTMLWriter when > publish_parts is used that only contains “.. contents::” output. >> So how do you think I can go about that? Could you give me a code example >> to how I could get the equivalent of .. contents:: showing up in a “toc” >> part of writer? > Rather, you should provide a minimal working example showing what you want > to achieve (+ a diff between current and desired output). > https://gist.github.com/tony/c4fc5661fcd4b7de71c65dd8a52c9ea4 Which contains the description: > 1. Currently, table of contents is only outputted through directive. ... > 3. I want it to be available in "toc" *without* using the directive in the > source. For this, you would need to run the "Contents" transform also if the document does not contain the "contents" directive . Dont know how to do this and whether it is worth the effort. I suppose, a wrapper adding the directive to the input string may achieve the same result far more easy. > 2. I do not to position table of contents in the RST. (therefore, I > specifically do not want it in html_body) You can suppress it with the "strip-elements-with-class" setting. For an example of parts implementation, have a look how the "footer" part is implemented in writers/_html_base.py. It is not trivial, make sure to understand the code around every occurence of "footer" in the source file. Günter |
From: Tony N. <to...@gi...> - 2017-07-20 13:10:35
|
This has been helpful, thank you. It would be indispensable to get a code example or demonstration. On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-19, Tony Narlock wrote: > On July 19, 2017 at 11:33:54 AM, Guenter Milde via Docutils-users ( > doc...@li...) wrote: ... >> There’s transforms.parts.Content(), but I’m not sure where and how I’d put >> it into play. > The transform generates the TOC by travelling the document tree after > parsing is complete. > I just want publish_parts to output the HTML contents of TOC to its own > part. > e.g., In the same way publish_parts gives “html_body” and “fragment”, I > want it to return “toc”, which is the HTML output of the table of contents. Then, you can leave the transform and directive alone. > Yes. I pretty much want a new “part” created by HTMLWriter when > publish_parts is used that only contains “.. contents::” output. >> So how do you think I can go about that? Could you give me a code example >> to how I could get the equivalent of .. contents:: showing up in a “toc” >> part of writer? > Rather, you should provide a minimal working example showing what you want > to achieve (+ a diff between current and desired output). > https://gist.github.com/tony/c4fc5661fcd4b7de71c65dd8a52c9ea4 Which contains the description: > 1. Currently, table of contents is only outputted through directive. ... > 3. I want it to be available in "toc" *without* using the directive in the > source. For this, you would need to run the "Contents" transform also if the document does not contain the "contents" directive . Dont know how to do this and whether it is worth the effort. I suppose, a wrapper adding the directive to the input string may achieve the same result far more easy. > 2. I do not to position table of contents in the RST. (therefore, I > specifically do not want it in html_body) You can suppress it with the "strip-elements-with-class" setting. For an example of parts implementation, have a look how the "footer" part is implemented in writers/_html_base.py. It is not trivial, make sure to understand the code around every occurence of "footer" in the source file. I am looking at those, I think I have it figured out how to add “toc”. This is done by appending ’toc' to visitor_attributes. This gets collected during assemble_parts(). But I’m not sure of where and how to inject a directive (e.g. Contents) via Writer. That’d be needed to get the table of contents to be added to “toc”. Günter ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. |
From: Guenter M. <mi...@us...> - 2017-07-20 16:53:48
|
On 2017-07-20, Tony Narlock wrote: > On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( > doc...@li...) wrote: > On 2017-07-19, Tony Narlock wrote: > ... >> The transform generates the TOC by travelling the document tree after >> parsing is complete. ... >> https://gist.github.com/tony/c4fc5661fcd4b7de71c65dd8a52c9ea4 > Which contains the description: >> 1. Currently, table of contents is only outputted through directive. > ... >> 3. I want it to be available in "toc" *without* using the directive in the >> source. > For this, you would need to run the "Contents" transform also if the > document does not contain the "contents" directive. >> 2. I do not to position table of contents in the RST. (therefore, I >> specifically do not want it in html_body) I suppose rather than messing with "parts", you can use the publish_* functions in a wrapper script: Don't use ``.. contents..`` in the source. 1. Parse the rst source with publish_doctree() Returns a doctree object. 2. Export doctree to HTML with publish_from_doctree() 3. Run the toc-generating transform on the doctree. Returns a "toc doctree". 4. Export the "toc doctree" with publish_from_doctree(). This is just an idea, not tested and detailled. > It would be indispensable to get a code example or demonstration. This is left as an exercise to the reader. Günter |
From: Tony N. <to...@gi...> - 2017-07-21 16:07:53
|
So here is where I am: https://gist.github.com/tony/1a03b7668c9e33672f4465dd63c6076b On July 20, 2017 at 11:54:07 AM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-20, Tony Narlock wrote: > On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( > doc...@li...) wrote: > On 2017-07-19, Tony Narlock wrote: > ... >> The transform generates the TOC by travelling the document tree after >> parsing is complete. ... >> https://gist.github.com/tony/c4fc5661fcd4b7de71c65dd8a52c9ea4 > Which contains the description: >> 1. Currently, table of contents is only outputted through directive. > ... >> 3. I want it to be available in "toc" *without* using the directive in the >> source. > For this, you would need to run the "Contents" transform also if the > document does not contain the "contents" directive. >> 2. I do not to position table of contents in the RST. (therefore, I >> specifically do not want it in html_body) I suppose rather than messing with "parts", you can use the publish_* functions in a wrapper script: Don't use ``.. contents..`` in the source. 1. Parse the rst source with publish_doctree() Returns a doctree object. 2. Export doctree to HTML with publish_from_doctree() 3. Run the toc-generating transform on the doctree. Returns a "toc doctree". Where would it be? Am I applying the transform correctly in the paste? 4. Export the "toc doctree" with publish_from_doctree(). Assuming I’m running the transform correctly, I see no difference in the output. This is just an idea, not tested and detailled. > It would be indispensable to get a code example or demonstration. This is left as an exercise to the reader. This has been educational and is helping me understand internals better. I prefer vanilla docutils whenever possible. Any more ideas? Günter ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. |
From: Tony N. <to...@gi...> - 2017-07-21 20:26:33
|
Here’s where it’s at now (after looking at footer and PEP code): https://gist.github.com/tony/9c0d5eaa081b5ff611b7ca9e86a83046 Output: <div class="toc"> <hr class="toc" /> <div class="contents topic" id="contents"> <p class="topic-title first">Contents</p> </div> </div> So stuff is showing in TOC. But the pending contents information doesn’t seem to be rendering. On July 21, 2017 at 11:07:44 AM, Tony Narlock (to...@gi...) wrote: So here is where I am: https://gist.github.com/tony/1a03b7668c9e33672f4465dd63c6076b On July 20, 2017 at 11:54:07 AM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-20, Tony Narlock wrote: > On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( > doc...@li...) wrote: > On 2017-07-19, Tony Narlock wrote: > ... >> The transform generates the TOC by travelling the document tree after >> parsing is complete. ... >> https://gist.github.com/tony/c4fc5661fcd4b7de71c65dd8a52c9ea4 > Which contains the description: >> 1. Currently, table of contents is only outputted through directive. > ... >> 3. I want it to be available in "toc" *without* using the directive in the >> source. > For this, you would need to run the "Contents" transform also if the > document does not contain the "contents" directive. >> 2. I do not to position table of contents in the RST. (therefore, I >> specifically do not want it in html_body) I suppose rather than messing with "parts", you can use the publish_* functions in a wrapper script: Don't use ``.. contents..`` in the source. 1. Parse the rst source with publish_doctree() Returns a doctree object. 2. Export doctree to HTML with publish_from_doctree() 3. Run the toc-generating transform on the doctree. Returns a "toc doctree". Where would it be? Am I applying the transform correctly in the paste? 4. Export the "toc doctree" with publish_from_doctree(). Assuming I’m running the transform correctly, I see no difference in the output. This is just an idea, not tested and detailled. > It would be indispensable to get a code example or demonstration. This is left as an exercise to the reader. This has been educational and is helping me understand internals better. I prefer vanilla docutils whenever possible. Any more ideas? Günter ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. |
From: Guenter M. <mi...@us...> - 2017-07-21 20:39:39
|
On 2017-07-21, Tony Narlock wrote: > So here is where I am: > https://gist.github.com/tony/1a03b7668c9e33672f4465dd63c6076b No time to look. > On July 20, 2017 at 11:54:07 AM, Guenter Milde via Docutils-users ( > On 2017-07-20, Tony Narlock wrote: >> On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( >> ... > > I suppose rather than messing with "parts", you can use the publish_* > > functions in a wrapper script: > > > Don't use ``.. contents..`` in the source. > > > 1. Parse the rst source with publish_doctree() > > > Returns a doctree object. > > > > 2. Export doctree to HTML with publish_from_doctree() Does this work? > > 3. Run the toc-generating transform on the doctree. > > Returns a "toc doctree". > Where would it be? In docutils/transforms/parts.py > Am I applying the transform correctly in the paste? >> 4. Export the "toc doctree" with publish_from_doctree(). > Assuming I’m running the transform correctly, I see no difference in the > output. So I suppose you don't apply it correctly. The idea is to collect generate a TOC by travelling over the doctree in the same manner as it is done by the "Contents" transform. Therefore, it should be possible to use docutils.transforms.parts.Contents.build_contents() and pass it the startnode of the doctree returned by "publish_parts". >> This is just an idea, not tested and detailled. Günter |
From: Tony N. <to...@gi...> - 2017-07-22 00:41:29
|
Thanks for your help on this. This is *way* trickier than it looks, with all due respect. Clocked in almost two days on this so far. Just trying to get the table of contents separate from html_body. Seriously considering adding ..contents:: to the source, building HTML and ripping out the ToC via LXML. Love reStructuredText and docutils (been having quite a few internal successes lately), but this particular task feels like going against the grain. On July 21, 2017 at 3:39:58 PM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-21, Tony Narlock wrote: > So here is where I am: > https://gist.github.com/tony/1a03b7668c9e33672f4465dd63c6076b No time to look. > On July 20, 2017 at 11:54:07 AM, Guenter Milde via Docutils-users ( > On 2017-07-20, Tony Narlock wrote: >> On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( >> ... > > I suppose rather than messing with "parts", you can use the publish_* > > functions in a wrapper script: > > > Don't use ``.. contents..`` in the source. > > > 1. Parse the rst source with publish_doctree() > > > Returns a doctree object. > > > > 2. Export doctree to HTML with publish_from_doctree() Does this work? Yes, this just gives CSS + HTML for way more than I need. Am I supposed to see anything special in the HTML or are you just checking that publish_doctree+publish_from_doctree works (it does). Way more than html_body (all I need, aside from ToC). And I’m not sure what I can do with this content? > > 3. Run the toc-generating transform on the doctree. > > Returns a "toc doctree". > Where would it be? In docutils/transforms/parts.py > Am I applying the transform correctly in the paste? >> 4. Export the "toc doctree" with publish_from_doctree(). > Assuming I’m running the transform correctly, I see no difference in the > output. So I suppose you don't apply it correctly. The idea is to collect generate a TOC by travelling over the doctree in the same manner as it is done by the "Contents" transform. Therefore, it should be possible to use docutils.transforms.parts.Contents.build_contents() and pass it the startnode of the doctree returned by "publish_parts". >> This is just an idea, not tested and detailled. Günter ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. |
From: David G. <go...@py...> - 2017-07-22 03:41:00
Attachments:
toc.py
|
On Fri, Jul 21, 2017 at 7:41 PM, Tony Narlock <to...@gi...> wrote: > Thanks for your help on this. > > This is way trickier than it looks, with all due respect. Just because you're trying to hack Docutils without a sufficiently deep understanding of the internals. > Clocked in almost > two days on this so far. Hopefully this exercise has improved your understanding! > Just trying to get the table of contents separate from html_body. Seriously > considering adding ..contents:: to the source, building HTML and ripping out > the ToC via LXML. > > Love reStructuredText and docutils (been having quite a few internal > successes lately), but this particular task feels like going against the > grain. Have you read the documentation? There's no one place for what you want, it's spread out. See: * http://docutils.sourceforge.net/docs/ref/transforms.html * http://docutils.sourceforge.net/docs/peps/pep-0258.html#transformer * http://docutils.sourceforge.net/docs/dev/hacking.html Also, see the code. There's lots of inline documentation in docstrings and comments. Ultimately, you need to understand the flow of data in Docutils, how all the components interrelate. No, no, no, don't tug on that. You never know what it might be attached to. — Buckaroo Banzai (during brain surgery) I think the attached code will get you most of the way to where you want to go. DG > On July 21, 2017 at 3:39:58 PM, Guenter Milde via Docutils-users > (doc...@li...) wrote: > > On 2017-07-21, Tony Narlock wrote: > >> So here is where I am: >> https://gist.github.com/tony/1a03b7668c9e33672f4465dd63c6076b > > No time to look. > >> On July 20, 2017 at 11:54:07 AM, Guenter Milde via Docutils-users ( >> On 2017-07-20, Tony Narlock wrote: >>> On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( > >>> ... > > >> > I suppose rather than messing with "parts", you can use the publish_* >> > functions in a wrapper script: >> >> > Don't use ``.. contents..`` in the source. >> >> > 1. Parse the rst source with publish_doctree() >> >> > Returns a doctree object. >> >> >> > 2. Export doctree to HTML with publish_from_doctree() > > Does this work? > > Yes, this just gives CSS + HTML for way more than I need. Am I supposed to > see anything special in the HTML or are you just checking that > publish_doctree+publish_from_doctree works (it does). > > Way more than html_body (all I need, aside from ToC). And I’m not sure what > I can do with this content? > > > > >> > 3. Run the toc-generating transform on the doctree. >> > Returns a "toc doctree". > >> Where would it be? > > In docutils/transforms/parts.py > > > >> Am I applying the transform correctly in the paste? > >>> 4. Export the "toc doctree" with publish_from_doctree(). > >> Assuming I’m running the transform correctly, I see no difference in the >> output. > > So I suppose you don't apply it correctly. > > The idea is to collect generate a TOC by travelling over the doctree in > the same manner as it is done by the "Contents" transform. > > Therefore, it should be possible to use > docutils.transforms.parts.Contents.build_contents() and pass it the > startnode of the doctree returned by "publish_parts". > >>> This is just an idea, not tested and detailled. > > Günter |
From: Tony N. <to...@gi...> - 2017-07-22 23:13:26
|
I can confirm getting the node information. The issue I have is getting the HTML from toc_list. The only other problem I have is: from docutils.writers.html5_polyglot import Writer core.publish_from_doctree(toc_list, writer=Writer()) Traceback (most recent call last): File “./try2.py", line 48, in <module> core.publish_from_doctree(toc_list, writer=Writer()) File ".venv/lib/python3.6/site-packages/docutils/core.py", line 521, in publish_from_doctree return pub.publish(enable_exit_status=enable_exit_status) File ".venv/lib/python3.6/site-packages/docutils/core.py", line 218, in publish self.apply_transforms() File ".venv/lib/python3.6/site-packages/docutils/core.py", line 199, in apply_transforms self.document.transformer.apply_transforms() File “.venv/lib/python3.6/site-packages/docutils/transforms/__init__.py", line 162, in apply_transforms self.document.note_transform_message) AttributeError: 'bullet_list' object has no attribute 'note_transform_message' On July 21, 2017 at 10:40:53 PM, David Goodger (go...@py...) wrote: On Fri, Jul 21, 2017 at 7:41 PM, Tony Narlock <to...@gi...> wrote: > Thanks for your help on this. > > This is way trickier than it looks, with all due respect. Just because you're trying to hack Docutils without a sufficiently deep understanding of the internals. > Clocked in almost > two days on this so far. Hopefully this exercise has improved your understanding! > Just trying to get the table of contents separate from html_body. Seriously > considering adding ..contents:: to the source, building HTML and ripping out > the ToC via LXML. > > Love reStructuredText and docutils (been having quite a few internal > successes lately), but this particular task feels like going against the > grain. Have you read the documentation? There's no one place for what you want, it's spread out. See: * http://docutils.sourceforge.net/docs/ref/transforms.html * http://docutils.sourceforge.net/docs/peps/pep-0258.html#transformer * http://docutils.sourceforge.net/docs/dev/hacking.html Also, see the code. There's lots of inline documentation in docstrings and comments. Ultimately, you need to understand the flow of data in Docutils, how all the components interrelate. No, no, no, don't tug on that. You never know what it might be attached to. — Buckaroo Banzai (during brain surgery) I think the attached code will get you most of the way to where you want to go. DG > On July 21, 2017 at 3:39:58 PM, Guenter Milde via Docutils-users > (doc...@li...) wrote: > > On 2017-07-21, Tony Narlock wrote: > >> So here is where I am: >> https://gist.github.com/tony/1a03b7668c9e33672f4465dd63c6076b > > No time to look. > >> On July 20, 2017 at 11:54:07 AM, Guenter Milde via Docutils-users ( >> On 2017-07-20, Tony Narlock wrote: >>> On July 19, 2017 at 5:27:15 PM, Guenter Milde via Docutils-users ( > >>> ... > > >> > I suppose rather than messing with "parts", you can use the publish_* >> > functions in a wrapper script: >> >> > Don't use ``.. contents..`` in the source. >> >> > 1. Parse the rst source with publish_doctree() >> >> > Returns a doctree object. >> >> >> > 2. Export doctree to HTML with publish_from_doctree() > > Does this work? > > Yes, this just gives CSS + HTML for way more than I need. Am I supposed to > see anything special in the HTML or are you just checking that > publish_doctree+publish_from_doctree works (it does). > > Way more than html_body (all I need, aside from ToC). And I’m not sure what > I can do with this content? > > > > >> > 3. Run the toc-generating transform on the doctree. >> > Returns a "toc doctree". > >> Where would it be? > > In docutils/transforms/parts.py > > > >> Am I applying the transform correctly in the paste? > >>> 4. Export the "toc doctree" with publish_from_doctree(). > >> Assuming I’m running the transform correctly, I see no difference in the >> output. > > So I suppose you don't apply it correctly. > > The idea is to collect generate a TOC by travelling over the doctree in > the same manner as it is done by the "Contents" transform. > > Therefore, it should be possible to use > docutils.transforms.parts.Contents.build_contents() and pass it the > startnode of the doctree returned by "publish_parts". > >>> This is just an idea, not tested and detailled. > > Günter |
From: Matěj C. <mc...@ce...> - 2017-07-22 21:00:51
|
On 2017-07-22, 03:40 GMT, David Goodger wrote: > On Fri, Jul 21, 2017 at 7:41 PM, Tony Narlock <to...@gi...> wrote: >> Thanks for your help on this. >> >> This is way trickier than it looks, with all due respect. > > Just because you're trying to hack Docutils without a sufficiently > deep understanding of the internals. Yeah, but that’s the problem for most people who would like to hack on docutils. I am following this thread with some level of dread, because these are exactly operations I will probably need if I am thinking about writing that rst2epub. And frankly this thread does not increase my faith in my own ability to write such script (if I had the time to do so, that is). I will certainly study your attached example. Best, Matěj -- http://matej.ceplovi.cz/blog/, Jabber: mcepl<at>ceplovi.cz GPG Finger: 3C76 A027 CA45 AD70 98B5 BC1D 7920 5802 880B C9D8 He uses statistics as a drunken man uses lamp-posts... for support, rather than illumination. -- Andrew Lang |
From: Guenter M. <mi...@us...> - 2017-07-24 14:08:36
|
On 2017-07-22, Tony Narlock wrote: > I can confirm getting the node information. > The issue I have is getting the HTML from toc_list. > The only other problem I have is: ... > AttributeError: 'bullet_list' object has no attribute > 'note_transform_message' You need to pass a complete doctree to publish from doctree but transforms.Contents.build_contents() returns only a partial doctree. The example below should get you started. Günter #! /usr/bin/env python # -*- coding: utf-8 -*- # # Proof of concept for a front end generating just a toc from an rst source. import sys import docutils from docutils.core import Publisher, publish_doctree, publish_from_doctree from docutils.transforms.parts import Contents from docutils import nodes # from docutils.writers.html5_polyglot import Writer # Test source as string sample = """ Sample Title ============ first section ------------- some text second section -------------- more text this is subsection 2.1 ********************** """ # Parse sample to a doctree (for later parsing with build_contents()) sample_tree = publish_doctree(source=sample) # The sample can also be written to supported output formats from the doctree: output = publish_from_doctree(sample_tree, writer_name="pseudoxml") # output = publish_from_doctree(sample_tree, writer_name="latex") # output = publish_from_doctree(sample_tree, writer_name="html5") #print output # Create a new document tree with just the table of contents # ========================================================== # document tree template: toc_tree = nodes.document('', '', source='toc-generator') toc_tree += nodes.title('', 'Table of Contents') # Re-use the Contents transform to generate the toc by travelling over the # doctree of the complete document. # Set up a Contents instance: # The Contents transform requires a "pending" startnode and generation options # startnode pending = nodes.pending(Contents, rawsource='') contents_transform = docutils.transforms.parts.Contents(sample_tree, pending) contents_transform.backlinks = False # run the contents builder and append the result to the template: toc_topic = nodes.topic(classes=['contents']) toc_topic += contents_transform.build_contents(sample_tree) toc_tree += toc_topic # test # print toc_tree output = publish_from_doctree(toc_tree, writer_name="pseudoxml") output = publish_from_doctree(toc_tree, writer_name="html5") print output |
From: Tony N. <to...@gi...> - 2017-07-25 18:31:01
|
Thank you. This has been educational and shown me things that I didn’t find obvious. What if the user doesn’t want to publish CSS from the tree? Even if using publish_doctree, I prefer the equivalent to publish_parts fragment and html_body, usually. Here is what I did: def publish_parts_from_doctree(document, destination_path=None, writer=None, writer_name='pseudoxml', settings=None, settings_spec=None, settings_overrides=None, config_section=None, enable_exit_status=False): reader = docutils.readers.doctree.Reader(parser_name='null') pub = Publisher(reader, None, writer, source=io.DocTreeInput(document), destination_class=io.StringOutput, settings=settings) if not writer and writer_name: pub.set_writer(writer_name) pub.process_programmatic_settings( settings_spec, settings_overrides, config_section) pub.set_destination(None, destination_path) pub.publish(enable_exit_status=enable_exit_status) return pub.writer.parts Is the equivalent of this attainable a simpler way? Is something like this worth considering as a patch? On July 24, 2017 at 9:08:59 AM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-22, Tony Narlock wrote: > I can confirm getting the node information. > The issue I have is getting the HTML from toc_list. > The only other problem I have is: ... > AttributeError: 'bullet_list' object has no attribute > 'note_transform_message' You need to pass a complete doctree to publish from doctree but transforms.Contents.build_contents() returns only a partial doctree. The example below should get you started. Günter #! /usr/bin/env python # -*- coding: utf-8 -*- # # Proof of concept for a front end generating just a toc from an rst source. import sys import docutils from docutils.core import Publisher, publish_doctree, publish_from_doctree from docutils.transforms.parts import Contents from docutils import nodes # from docutils.writers.html5_polyglot import Writer # Test source as string sample = """ Sample Title ============ first section ------------- some text second section -------------- more text this is subsection 2.1 ********************** """ # Parse sample to a doctree (for later parsing with build_contents()) sample_tree = publish_doctree(source=sample) # The sample can also be written to supported output formats from the doctree: output = publish_from_doctree(sample_tree, writer_name="pseudoxml") # output = publish_from_doctree(sample_tree, writer_name="latex") # output = publish_from_doctree(sample_tree, writer_name="html5") #print output # Create a new document tree with just the table of contents # ========================================================== # document tree template: toc_tree = nodes.document('', '', source='toc-generator') toc_tree += nodes.title('', 'Table of Contents') # Re-use the Contents transform to generate the toc by travelling over the # doctree of the complete document. # Set up a Contents instance: # The Contents transform requires a "pending" startnode and generation options # startnode pending = nodes.pending(Contents, rawsource='') contents_transform = docutils.transforms.parts.Contents(sample_tree, pending) contents_transform.backlinks = False # run the contents builder and append the result to the template: toc_topic = nodes.topic(classes=['contents']) toc_topic += contents_transform.build_contents(sample_tree) toc_tree += toc_topic # test # print toc_tree output = publish_from_doctree(toc_tree, writer_name="pseudoxml") output = publish_from_doctree(toc_tree, writer_name="html5") print output ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. |
From: Guenter M. <mi...@us...> - 2017-07-26 07:02:43
|
On 2017-07-25, Tony Narlock wrote: > What if the user doesn’t want to publish CSS from the tree? You can select the used CSS stylsheet(s) as well as toggle between inclusion and referencing them via Docutils settings. For programmatic use, "settings_override" is your friend. See "config.html" and the documentation the publish_* functions for descriptions and, e.g., the functional tests for usage examples. > Even if using > publish_doctree, I prefer the equivalent to publish_parts fragment and > html_body, usually. > Here is what I did: ... > Is the equivalent of this attainable a simpler way? Is something like this > worth considering as a patch? I don't know. You may file an enhancement ticket. Also the addition of "contents" as a part for the HTML writer seems like a valid enhancement request. (But mind that we don't have many ressources to really work on it.) Günter |
From: Tony N. <to...@gi...> - 2017-07-30 18:10:10
|
On July 26, 2017 at 2:03:02 AM, Guenter Milde via Docutils-users ( doc...@li...) wrote: On 2017-07-25, Tony Narlock wrote: > What if the user doesn’t want to publish CSS from the tree? You can select the used CSS stylsheet(s) as well as toggle between inclusion and referencing them via Docutils settings. For programmatic use, "settings_override" is your friend. See "config.html" and the documentation the publish_* functions for descriptions and, e.g., the functional tests for usage examples. > Even if using > publish_doctree, I prefer the equivalent to publish_parts fragment and > html_body, usually. > Here is what I did: ... > Is the equivalent of this attainable a simpler way? Is something like this > worth considering as a patch? I don't know. You may file an enhancement ticket. Considering that. Also the addition of "contents" as a part for the HTML writer seems like a valid enhancement request. (But mind that we don't have many ressources to really work on it.) The ToC is being used on a production website right now, I plan on making a post about how the site uses docutils. I’m trying to get myself into gear on docutils internals so I can help now and then. Günter ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Docutils-users mailing list Doc...@li... https://lists.sourceforge.net/lists/listinfo/docutils-users Please use "Reply All" to reply to the list. |