#1923 closed enhancement (fixed)
Use a better API to get just the HTML body from the reST parser
| Reported by: | Lele Gaifax | Owned by: | Matthew Good | 
|---|---|---|---|
| Priority: | normal | Milestone: | 0.10 | 
| Component: | general | Version: | devel | 
| Severity: | normal | Keywords: | |
| Cc: | Branch: | ||
| Release Notes: | |||
| API Changes: | |||
| Internal Changes: | |||
Description
The following patch use the newer publish_parts() API, introduced in Docutils 0.3.9, and knows about the upcoming 0.3.10 html_body part name.
diff -rN -u old-trac+darcs/trac/trac/mimeview/rst.py new-trac+darcs/trac/trac/mimeview/rst.py
--- old-trac+darcs/trac/trac/mimeview/rst.py    2005-08-14 21:41:13.000000000 +0200
+++ new-trac+darcs/trac/trac/mimeview/rst.py    2005-08-14 21:41:13.000000000 +0200
@@ -82,7 +82,7 @@
     def render(self, req, mimetype, content, filename=None, rev=None):
         try:
             from docutils import nodes
-            from docutils.core import publish_string
+            from docutils.core import publish_parts
             from docutils.parsers import rst
             from docutils import __version__
         except ImportError:
@@ -227,6 +227,11 @@
         _inliner = rst.states.Inliner()
         _parser = rst.Parser(inliner=_inliner)
-        html = publish_string(content, writer_name='html', parser=_parser,
+        parts = publish_parts(content, writer_name='html', parser=_parser,
                               settings_overrides={'halt_level': 6})
-        return html[html.find('<body>') + 6:html.find('</body>')].strip()
+        # Docutils 0.3.9 introduced html_body
+        if parts.has_key('html_body'):
+            html = parts['html_body']
+        else:
+            html = parts['body']
+        return html
      Attachments (0)
Change History (5)
comment:1 by , 20 years ago
comment:2 by , 20 years ago
Uhm, don't be scared by that comment, that effectively may be misleading: the
publish_parts() API has been there since Docutils 0.3.3, released
in 2004-05-09.
comment:3 by , 20 years ago
Addendum
I propose also the following patch, that allows the configuration of language, input_encoding and output_encoding passed to
the docutils engine. It takes the values from a new [docutils]
section of TracIni, that the patch updates as well.
As I'm going to use Trac to wrap a Subversion repository that contains reStructuredText documentation written in italian, this is a needed capability.
Wed Aug 24 20:18:05 CEST 2005  lele@metapensiero.it
  * Fetch the default value for language and in/out encodings used by reST from {{{[docutils]}}} in {{{trac.ini}}}
diff -rN -u old-trac/trac/mimeview/rst.py new-trac/trac/mimeview/rst.py
--- old-trac/trac/mimeview/rst.py	2005-08-24 20:25:42.070333872 +0200
+++ new-trac/trac/mimeview/rst.py	2005-08-24 20:25:42.097329768 +0200
@@ -227,8 +227,16 @@
         _inliner = rst.states.Inliner()
         _parser = rst.Parser(inliner=_inliner)
 
+        language = self.config.get('trac', 'default_lang', 'en')
+        code = self.config.get('docutils', 'language_code', language)
+        charset = self.config.get('trac', 'default_charset')
+        inenc = self.config.get('docutils', 'input_encoding', charset)
+        outenc = self.config.get('docutils', 'output_encoding', charset)
         parts = publish_parts(content, writer_name='html', parser=_parser,
-                              settings_overrides={'halt_level': 6})
+                              settings_overrides={'halt_level': 6,
+                                                  'language_code': code,
+                                                  'input_encoding': inenc,
+                                                  'output_encoding': outenc})
         # Docutils 0.3.9 introduced html_body
         if parts.has_key('html_body'):
             html = parts['html_body']
diff -rN -u old-trac/wiki-default/TracIni new-trac/wiki-default/TracIni
--- old-trac/wiki-default/TracIni	2005-08-24 20:25:42.069334024 +0200
+++ new-trac/wiki-default/TracIni	2005-08-24 20:25:42.128325056 +0200
@@ -18,6 +18,7 @@
 || database        || Database to use for this project ||
 || templates_dir   || Path of Clearsilver templates ||
 || default_charset || Source files uses this charset ||
+|| default_lang    || Language code to use for templates and the like, defaults to ''en'' ||
 
 == [logging] ==
 || log_type  || Logging facility to use. (none, file, stderr, syslog, winlog) ||
@@ -64,6 +65,13 @@
 == [diff] ==
 || tab_width || Displayed tab width in changeset diffs ||
 
+== [docutils] ==
+|| language_code   || This specifies the language used by the reStructuredText engine, and defaults to {{{[trac].default_lang}}} ||
+|| input_encoding  || Encoding to be expected in input texts, by default {{{[trac].default_lang}}} ||
+|| output_encoding || Encoding of text produced by docutils, by default {{{[trac].default_lang}}} ||
+
+See also: WikiRestructuredText
+
 [[BR]]
 ----
 See also: TracGuide, TracAdmin
\ No newline at end of file
comment:4 by , 19 years ago
| Milestone: | → 0.10 | 
|---|---|
| Owner: | changed from to | 
| Status: | new → assigned | 
Well, Trac requires Docutils 0.3.9 since [3512], so we can upgrade to the new APIs now.
comment:5 by , 19 years ago
| Resolution: | → fixed | 
|---|---|
| Status: | assigned → closed | 
Ok, the API change was made in [3514]. The encoding shouldn't be relevant here since Trac now does everything in unicode and [3514] also removed the redundant UTF encoding/decoding since docutils already uses unicode. If there are other reasons for having encoding config options that should go into a new ticket.



  
The patch looks good but I think we should wait past 0.9 before applying this patch because this requires the latest docutils version.