From 101671ae44e1686680c80cd07b452aabeb88fb63 Mon Sep 17 00:00:00 2001 From: goodger Date: Sat, 20 Apr 2002 03:01:52 +0000 Subject: Initial revision git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@18 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 149 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 docutils/transforms/universal.py (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py new file mode 100644 index 000000000..1cebcc9db --- /dev/null +++ b/docutils/transforms/universal.py @@ -0,0 +1,149 @@ +#! /usr/bin/env python +""" +:Authors: David Goodger, Ueli Schlaepfer +:Contact: goodger@users.sourceforge.net +:Revision: $Revision$ +:Date: $Date$ +:Copyright: This module has been placed in the public domain. + +Transforms needed by most or all documents: + +- `Messages`: Placement of system messages stored in + `nodes.document.messages`. +- `TestMessages`: Like `Messages`, used on test runs. +- `FinalReferences`: Resolve remaining references. +- `Pending`: Execute pending transforms (abstract base class; + `FirstReaderPending`, `LastReaderPending`, `FirstWriterPending`, and + `LastWriterPending` are its concrete subclasses). +""" + +__docformat__ = 'reStructuredText' + +import re +from docutils import nodes, utils +from docutils.transforms import TransformError, Transform + + +class Messages(Transform): + + """ + Place any system messages generated after parsing into a dedicated section + of the document. + """ + + def transform(self): + # @@@ filter out msgs below threshold? + if len(self.doctree.messages) > 0: + section = nodes.section(CLASS='system-messages') + # @@@ get this from the language module? + section += nodes.title('', 'Docutils System Messages') + section += self.doctree.messages.getchildren() + self.doctree.messages[:] = [] + self.doctree += section + + +class TestMessages(Transform): + + """ + Append all system messages to the end of the doctree. + """ + + def transform(self): + self.doctree += self.doctree.messages.getchildren() + + +class FinalChecks(Transform): + + """ + Perform last-minute checks. + + - Check for dangling references (incl. footnote & citation). + """ + + def transform(self): + visitor = FinalCheckVisitor(self.doctree) + self.doctree.walk(visitor) + + +class FinalCheckVisitor(nodes.NodeVisitor): + + def unknown_visit(self, node): + pass + + def visit_reference(self, node): + if node.resolved or not node.hasattr('refname'): + return + refname = node['refname'] + try: + id = self.doctree.nameids[refname] + except KeyError: + msg = self.doctree.reporter.error( + 'Unknown target name: "%s".' % (node['refname'])) + self.doctree.messages += msg + msgid = self.doctree.set_id(msg) + prb = nodes.problematic( + node.rawsource, node.rawsource, refid=msgid) + prbid = self.doctree.set_id(prb) + msg.add_backref(prbid) + node.parent.replace(node, prb) + return + del node['refname'] + node['refid'] = id + self.doctree.ids[id].referenced = 1 + node.resolved = 1 + + visit_footnote_reference = visit_citation_reference = visit_reference + + +class Pending(Transform): + + """ + Execute pending transforms. + """ + + stage = None + """The stage of processing applicable to this transform; match with + `nodes.pending.stage`. Possible values include 'first_reader', + 'last_reader', 'first_writer', and 'last_writer'. Override in + subclasses.""" + + def transform(self): + for pending in self.doctree.pending: + if pending.stage == self.stage: + pending.transform(self.doctree, pending).transform() + + +class FirstReaderPending(Pending): + + stage = 'first_reader' + + +class LastReaderPending(Pending): + + stage = 'last_reader' + + +class FirstWriterPending(Pending): + + stage = 'first_writer' + + +class LastWriterPending(Pending): + + stage = 'last_writer' + + +test_transforms = (TestMessages,) +"""Universal transforms to apply to the raw doctree when testing.""" + +first_reader_transforms = (FirstReaderPending,) +"""Universal transforms to apply before any other Reader transforms.""" + +last_reader_transforms = (LastReaderPending,) +"""Universal transforms to apply after all other Reader transforms.""" + +first_writer_transforms = (FirstWriterPending,) +"""Universal transforms to apply before any other Writer transforms.""" + +last_writer_transforms = (LastWriterPending, FinalChecks, Messages) +"""Universal transforms to apply after all other Writer transforms.""" -- cgit v1.2.1 From 9c5bc6ca7bedb2a9ebdd40ae9db57a38cdb183a5 Mon Sep 17 00:00:00 2001 From: goodger Date: Sun, 5 May 2002 15:31:17 +0000 Subject: Changed ``Messages`` transform to properly filter out system messages below the warning threshold. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@83 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 63 +++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 27 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 1cebcc9db..145a89b01 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -19,7 +19,7 @@ Transforms needed by most or all documents: __docformat__ = 'reStructuredText' -import re +import re, sys from docutils import nodes, utils from docutils.transforms import TransformError, Transform @@ -32,24 +32,29 @@ class Messages(Transform): """ def transform(self): - # @@@ filter out msgs below threshold? - if len(self.doctree.messages) > 0: + unfiltered = self.document.messages.getchildren() + threshold = self.document.reporter['writer'].warning_level + messages = [] + for msg in unfiltered: + if msg['level'] >= threshold: + messages.append(msg) + if len(messages) > 0: section = nodes.section(CLASS='system-messages') # @@@ get this from the language module? section += nodes.title('', 'Docutils System Messages') - section += self.doctree.messages.getchildren() - self.doctree.messages[:] = [] - self.doctree += section + section += messages + self.document.messages[:] = [] + self.document += section class TestMessages(Transform): """ - Append all system messages to the end of the doctree. + Append all system messages to the end of the document. """ def transform(self): - self.doctree += self.doctree.messages.getchildren() + self.document += self.document.messages.getchildren() class FinalChecks(Transform): @@ -61,8 +66,8 @@ class FinalChecks(Transform): """ def transform(self): - visitor = FinalCheckVisitor(self.doctree) - self.doctree.walk(visitor) + visitor = FinalCheckVisitor(self.document) + self.document.walk(visitor) class FinalCheckVisitor(nodes.NodeVisitor): @@ -75,21 +80,21 @@ class FinalCheckVisitor(nodes.NodeVisitor): return refname = node['refname'] try: - id = self.doctree.nameids[refname] + id = self.document.nameids[refname] except KeyError: - msg = self.doctree.reporter.error( + msg = self.document.reporter.error( 'Unknown target name: "%s".' % (node['refname'])) - self.doctree.messages += msg - msgid = self.doctree.set_id(msg) + self.document.messages += msg + msgid = self.document.set_id(msg) prb = nodes.problematic( node.rawsource, node.rawsource, refid=msgid) - prbid = self.doctree.set_id(prb) + prbid = self.document.set_id(prb) msg.add_backref(prbid) node.parent.replace(node, prb) return del node['refname'] node['refid'] = id - self.doctree.ids[id].referenced = 1 + self.document.ids[id].referenced = 1 node.resolved = 1 visit_footnote_reference = visit_citation_reference = visit_reference @@ -98,43 +103,47 @@ class FinalCheckVisitor(nodes.NodeVisitor): class Pending(Transform): """ - Execute pending transforms. + Base class for the execution of pending transforms. + + `nodes.pending` element objects each contain a "stage" attribute; the + stage of the pending element must match the `stage` of this transform. """ stage = None """The stage of processing applicable to this transform; match with - `nodes.pending.stage`. Possible values include 'first_reader', - 'last_reader', 'first_writer', and 'last_writer'. Override in - subclasses.""" + `nodes.pending.stage`. Possible values include 'first reader', + 'last reader', 'first writer', and 'last writer'. Overriden in + subclasses (below).""" def transform(self): - for pending in self.doctree.pending: + for pending in self.document.pending: if pending.stage == self.stage: - pending.transform(self.doctree, pending).transform() + pending.transform(self.document, self.component, + pending).transform() class FirstReaderPending(Pending): - stage = 'first_reader' + stage = 'first reader' class LastReaderPending(Pending): - stage = 'last_reader' + stage = 'last reader' class FirstWriterPending(Pending): - stage = 'first_writer' + stage = 'first writer' class LastWriterPending(Pending): - stage = 'last_writer' + stage = 'last writer' test_transforms = (TestMessages,) -"""Universal transforms to apply to the raw doctree when testing.""" +"""Universal transforms to apply to the raw document when testing.""" first_reader_transforms = (FirstReaderPending,) """Universal transforms to apply before any other Reader transforms.""" -- cgit v1.2.1 From e5744d83bfa217b861297a76840492691f1896d2 Mon Sep 17 00:00:00 2001 From: goodger Date: Tue, 7 May 2002 04:22:10 +0000 Subject: name improvements git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@109 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 145a89b01..36c83f003 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -32,7 +32,7 @@ class Messages(Transform): """ def transform(self): - unfiltered = self.document.messages.getchildren() + unfiltered = self.document.messages.get_children() threshold = self.document.reporter['writer'].warning_level messages = [] for msg in unfiltered: @@ -54,7 +54,7 @@ class TestMessages(Transform): """ def transform(self): - self.document += self.document.messages.getchildren() + self.document += self.document.messages.get_children() class FinalChecks(Transform): -- cgit v1.2.1 From b4c6826884a1c00c4fb928dc3584cf241fdaff40 Mon Sep 17 00:00:00 2001 From: goodger Date: Wed, 22 May 2002 04:23:41 +0000 Subject: updated git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@138 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 36c83f003..fb422270b 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -70,7 +70,7 @@ class FinalChecks(Transform): self.document.walk(visitor) -class FinalCheckVisitor(nodes.NodeVisitor): +class FinalCheckVisitor(nodes.SparseNodeVisitor): def unknown_visit(self, node): pass -- cgit v1.2.1 From 060ae1cc18c6362cbfc28c6ee525ff32616ad1fb Mon Sep 17 00:00:00 2001 From: goodger Date: Fri, 24 May 2002 03:08:09 +0000 Subject: - Changed names of Reporter's thresholds: warning_level -> report_level; error_level -> halt_level. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@143 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index fb422270b..c17341bb9 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -33,7 +33,7 @@ class Messages(Transform): def transform(self): unfiltered = self.document.messages.get_children() - threshold = self.document.reporter['writer'].warning_level + threshold = self.document.reporter['writer'].report_level messages = [] for msg in unfiltered: if msg['level'] >= threshold: -- cgit v1.2.1 From 6e398dc95eb60a5b81047b899954503ce780f1db Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 30 May 2002 02:30:40 +0000 Subject: Cleaned up imports git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@160 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index c17341bb9..175faf637 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -19,7 +19,8 @@ Transforms needed by most or all documents: __docformat__ = 'reStructuredText' -import re, sys +import re +import sys from docutils import nodes, utils from docutils.transforms import TransformError, Transform -- cgit v1.2.1 From 8f2f1d9958c71eecc024167722971ada5158f99d Mon Sep 17 00:00:00 2001 From: goodger Date: Sat, 1 Jun 2002 01:40:18 +0000 Subject: - Added ``Decorations`` transform (support for "--generator", "--date", "--time", "--source-link" options). git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@169 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 58 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 175faf637..782d930c5 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -8,6 +8,7 @@ Transforms needed by most or all documents: +- `Decorations`: Generate a document's header & footer. - `Messages`: Placement of system messages stored in `nodes.document.messages`. - `TestMessages`: Like `Messages`, used on test runs. @@ -21,10 +22,65 @@ __docformat__ = 'reStructuredText' import re import sys +import time from docutils import nodes, utils from docutils.transforms import TransformError, Transform +class Decorations(Transform): + + """ + Populate a document's decoration element (header, footer). + """ + + def transform(self): + header = self.generate_header() + footer = self.generate_footer() + if header or footer: + decoration = nodes.decoration() + decoration += header + decoration += footer + document = self.document + index = document.first_child_not_matching_class( + nodes.PreDecorative) + if index is None: + document += decoration + else: + document[index:index] = [decoration] + + def generate_header(self): + return None + + def generate_footer(self): + # @@@ Text is hard-coded for now. + # Should be made dynamic (language-dependent). + options = self.document.options + if options.generator or options.datestamp or options.source_link: + text = [] + if options.generator: + text.extend([ + nodes.Text('Generated by '), + nodes.reference('', 'Docutils', refuri= + 'http://docutils.sourceforge.net/'), + nodes.Text(' from '), + nodes.reference('', 'reStructuredText', refuri='http://' + 'docutils.sourceforge.net/rst.html'), + nodes.Text(' source. ')]) + if options.source_link: + text.extend([ + nodes.reference('', 'View document source', + refuri=self.document['source']), + nodes.Text('. ')]) + if options.datestamp: + datestamp = time.strftime(options.datestamp, time.gmtime()) + text.append(nodes.Text('Date: ' + datestamp + '. ')) + footer = nodes.footer() + footer += nodes.paragraph('', '', *text) + return footer + else: + return None + + class Messages(Transform): """ @@ -149,7 +205,7 @@ test_transforms = (TestMessages,) first_reader_transforms = (FirstReaderPending,) """Universal transforms to apply before any other Reader transforms.""" -last_reader_transforms = (LastReaderPending,) +last_reader_transforms = (LastReaderPending, Decorations) """Universal transforms to apply after all other Reader transforms.""" first_writer_transforms = (FirstWriterPending,) -- cgit v1.2.1 From 4c08c14508ae15f0d45164b54497ecf0105af264 Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 27 Jun 2002 01:22:04 +0000 Subject: fiddling git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@210 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 782d930c5..e9553cb13 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -136,9 +136,8 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): if node.resolved or not node.hasattr('refname'): return refname = node['refname'] - try: - id = self.document.nameids[refname] - except KeyError: + id = self.document.nameids.get(refname) + if id is None: msg = self.document.reporter.error( 'Unknown target name: "%s".' % (node['refname'])) self.document.messages += msg @@ -148,11 +147,11 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): prbid = self.document.set_id(prb) msg.add_backref(prbid) node.parent.replace(node, prb) - return - del node['refname'] - node['refid'] = id - self.document.ids[id].referenced = 1 - node.resolved = 1 + else: + del node['refname'] + node['refid'] = id + self.document.ids[id].referenced = 1 + node.resolved = 1 visit_footnote_reference = visit_citation_reference = visit_reference -- cgit v1.2.1 From 9830aac6db5c209b7b022e61dbdcb76540b14acf Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 4 Jul 2002 01:23:50 +0000 Subject: Rearranged footer. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@242 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index e9553cb13..e4ad65b48 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -57,6 +57,14 @@ class Decorations(Transform): options = self.document.options if options.generator or options.datestamp or options.source_link: text = [] + if options.source_link and self.document.hasattr('source'): + text.extend([ + nodes.reference('', 'View document source', + refuri=self.document['source']), + nodes.Text('. ')]) + if options.datestamp: + datestamp = time.strftime(options.datestamp, time.gmtime()) + text.append(nodes.Text('Generated on: ' + datestamp + '. ')) if options.generator: text.extend([ nodes.Text('Generated by '), @@ -66,14 +74,6 @@ class Decorations(Transform): nodes.reference('', 'reStructuredText', refuri='http://' 'docutils.sourceforge.net/rst.html'), nodes.Text(' source. ')]) - if options.source_link: - text.extend([ - nodes.reference('', 'View document source', - refuri=self.document['source']), - nodes.Text('. ')]) - if options.datestamp: - datestamp = time.strftime(options.datestamp, time.gmtime()) - text.append(nodes.Text('Date: ' + datestamp + '. ')) footer = nodes.footer() footer += nodes.paragraph('', '', *text) return footer -- cgit v1.2.1 From efd006184800e755c1baef8b7fc5790bf301bb96 Mon Sep 17 00:00:00 2001 From: goodger Date: Sun, 28 Jul 2002 17:45:16 +0000 Subject: Changed "Decorations" transform to produce relative source links. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@400 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index e4ad65b48..9e58679bf 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -57,10 +57,15 @@ class Decorations(Transform): options = self.document.options if options.generator or options.datestamp or options.source_link: text = [] - if options.source_link and self.document.hasattr('source'): + if options.source_link and options.source or options.source_uri: + if options.source_uri: + source = options.source_uri + else: + source = utils.relative_uri(options.destination, + options.source) text.extend([ nodes.reference('', 'View document source', - refuri=self.document['source']), + refuri=source), nodes.Text('. ')]) if options.datestamp: datestamp = time.strftime(options.datestamp, time.gmtime()) -- cgit v1.2.1 From ef63f320763f423632642e4b2aeb2b9570d4eedf Mon Sep 17 00:00:00 2001 From: goodger Date: Sun, 28 Jul 2002 17:49:48 +0000 Subject: bugfix git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@402 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 9e58679bf..004923887 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -55,9 +55,10 @@ class Decorations(Transform): # @@@ Text is hard-coded for now. # Should be made dynamic (language-dependent). options = self.document.options - if options.generator or options.datestamp or options.source_link: + if options.generator or options.datestamp or options.source_link \ + or options.source_url: text = [] - if options.source_link and options.source or options.source_uri: + if options.source_link and options.source or options.source_url: if options.source_uri: source = options.source_uri else: -- cgit v1.2.1 From e13eaad4a71d8536f52ca0445ee27b9b4e214eec Mon Sep 17 00:00:00 2001 From: goodger Date: Sun, 28 Jul 2002 17:51:05 +0000 Subject: bugfix git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@403 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 004923887..bc5a1bb74 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -59,8 +59,8 @@ class Decorations(Transform): or options.source_url: text = [] if options.source_link and options.source or options.source_url: - if options.source_uri: - source = options.source_uri + if options.source_url: + source = options.source_url else: source = utils.relative_uri(options.destination, options.source) -- cgit v1.2.1 From 60e5c1371c60c00dc4c76d684f263021a703c3a7 Mon Sep 17 00:00:00 2001 From: goodger Date: Wed, 31 Jul 2002 01:49:12 +0000 Subject: updated git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@425 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index bc5a1bb74..dc4a97fb1 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -58,12 +58,12 @@ class Decorations(Transform): if options.generator or options.datestamp or options.source_link \ or options.source_url: text = [] - if options.source_link and options.source or options.source_url: + if options.source_link and options._source or options.source_url: if options.source_url: source = options.source_url else: - source = utils.relative_uri(options.destination, - options.source) + source = utils.relative_uri(options._destination, + options._source) text.extend([ nodes.reference('', 'View document source', refuri=source), -- cgit v1.2.1 From da1ed9c59bcc92e21b45ed894c8850d669b508d0 Mon Sep 17 00:00:00 2001 From: goodger Date: Fri, 23 Aug 2002 02:03:08 +0000 Subject: updated git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@585 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index dc4a97fb1..1ce2c7dc5 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -62,8 +62,8 @@ class Decorations(Transform): if options.source_url: source = options.source_url else: - source = utils.relative_uri(options._destination, - options._source) + source = utils.relative_path(options._destination, + options._source) text.extend([ nodes.reference('', 'View document source', refuri=source), -- cgit v1.2.1 From c1554e0cae13b502620d286b2d7519c7f4c53909 Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 5 Sep 2002 03:15:16 +0000 Subject: updated git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@631 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 1ce2c7dc5..5e5498a8a 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -10,7 +10,7 @@ Transforms needed by most or all documents: - `Decorations`: Generate a document's header & footer. - `Messages`: Placement of system messages stored in - `nodes.document.messages`. + `nodes.document.transform_messages`. - `TestMessages`: Like `Messages`, used on test runs. - `FinalReferences`: Resolve remaining references. - `Pending`: Execute pending transforms (abstract base class; @@ -67,10 +67,10 @@ class Decorations(Transform): text.extend([ nodes.reference('', 'View document source', refuri=source), - nodes.Text('. ')]) + nodes.Text('.\n')]) if options.datestamp: datestamp = time.strftime(options.datestamp, time.gmtime()) - text.append(nodes.Text('Generated on: ' + datestamp + '. ')) + text.append(nodes.Text('Generated on: ' + datestamp + '.\n')) if options.generator: text.extend([ nodes.Text('Generated by '), @@ -79,7 +79,7 @@ class Decorations(Transform): nodes.Text(' from '), nodes.reference('', 'reStructuredText', refuri='http://' 'docutils.sourceforge.net/rst.html'), - nodes.Text(' source. ')]) + nodes.Text(' source.\n')]) footer = nodes.footer() footer += nodes.paragraph('', '', *text) return footer @@ -95,29 +95,31 @@ class Messages(Transform): """ def transform(self): - unfiltered = self.document.messages.get_children() + unfiltered = self.document.transform_messages threshold = self.document.reporter['writer'].report_level messages = [] for msg in unfiltered: - if msg['level'] >= threshold: + if msg['level'] >= threshold and not msg.parent: messages.append(msg) if len(messages) > 0: section = nodes.section(CLASS='system-messages') # @@@ get this from the language module? section += nodes.title('', 'Docutils System Messages') section += messages - self.document.messages[:] = [] + self.document.transform_messages[:] = [] self.document += section class TestMessages(Transform): """ - Append all system messages to the end of the document. + Append all post-parse system messages to the end of the document. """ def transform(self): - self.document += self.document.messages.get_children() + for msg in self.document.transform_messages: + if not msg.parent: + self.document += msg class FinalChecks(Transform): @@ -146,7 +148,6 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): if id is None: msg = self.document.reporter.error( 'Unknown target name: "%s".' % (node['refname'])) - self.document.messages += msg msgid = self.document.set_id(msg) prb = nodes.problematic( node.rawsource, node.rawsource, refid=msgid) -- cgit v1.2.1 From 91e0da642bed568b2dcba1e02ba6ee07c4d35e9d Mon Sep 17 00:00:00 2001 From: goodger Date: Tue, 8 Oct 2002 01:27:29 +0000 Subject: Added support for the ``--expose-internal-attributes`` option. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@771 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 5e5498a8a..3ba62ecef 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -1,11 +1,10 @@ -#! /usr/bin/env python -""" -:Authors: David Goodger, Ueli Schlaepfer -:Contact: goodger@users.sourceforge.net -:Revision: $Revision$ -:Date: $Date$ -:Copyright: This module has been placed in the public domain. +# Authors: David Goodger, Ueli Schlaepfer +# Contact: goodger@users.sourceforge.net +# Revision: $Revision$ +# Date: $Date$ +# Copyright: This module has been placed in the public domain. +""" Transforms needed by most or all documents: - `Decorations`: Generate a document's header & footer. @@ -133,6 +132,9 @@ class FinalChecks(Transform): def transform(self): visitor = FinalCheckVisitor(self.document) self.document.walk(visitor) + if self.document.options.expose_internals: + visitor = InternalAttributeExposer(self.document) + self.document.walk(visitor) class FinalCheckVisitor(nodes.SparseNodeVisitor): @@ -147,7 +149,8 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): id = self.document.nameids.get(refname) if id is None: msg = self.document.reporter.error( - 'Unknown target name: "%s".' % (node['refname'])) + 'Unknown target name: "%s".' % (node['refname']), + base_node=node) msgid = self.document.set_id(msg) prb = nodes.problematic( node.rawsource, node.rawsource, refid=msgid) @@ -163,6 +166,19 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): visit_footnote_reference = visit_citation_reference = visit_reference +class InternalAttributeExposer(nodes.GenericNodeVisitor): + + def __init__(self, document): + nodes.GenericNodeVisitor.__init__(self, document) + self.internal_attributes = document.options.expose_internals + + def default_visit(self, node): + for att in self.internal_attributes: + value = getattr(node, att, None) + if value is not None: + node['internal:' + att] = value + + class Pending(Transform): """ -- cgit v1.2.1 From afeedfb343c2904e9357997d2a50f8f3cabb2568 Mon Sep 17 00:00:00 2001 From: goodger Date: Fri, 18 Oct 2002 04:55:21 +0000 Subject: Refactored names (options -> settings; .transform() -> .apply(); etc.); updated. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@825 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 3ba62ecef..de52c3bb3 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -32,7 +32,7 @@ class Decorations(Transform): Populate a document's decoration element (header, footer). """ - def transform(self): + def apply(self): header = self.generate_header() footer = self.generate_footer() if header or footer: @@ -53,24 +53,25 @@ class Decorations(Transform): def generate_footer(self): # @@@ Text is hard-coded for now. # Should be made dynamic (language-dependent). - options = self.document.options - if options.generator or options.datestamp or options.source_link \ - or options.source_url: + settings = self.document.settings + if settings.generator or settings.datestamp or settings.source_link \ + or settings.source_url: text = [] - if options.source_link and options._source or options.source_url: - if options.source_url: - source = options.source_url + if settings.source_link and settings._source \ + or settings.source_url: + if settings.source_url: + source = settings.source_url else: - source = utils.relative_path(options._destination, - options._source) + source = utils.relative_path(settings._destination, + settings._source) text.extend([ nodes.reference('', 'View document source', refuri=source), nodes.Text('.\n')]) - if options.datestamp: - datestamp = time.strftime(options.datestamp, time.gmtime()) + if settings.datestamp: + datestamp = time.strftime(settings.datestamp, time.gmtime()) text.append(nodes.Text('Generated on: ' + datestamp + '.\n')) - if options.generator: + if settings.generator: text.extend([ nodes.Text('Generated by '), nodes.reference('', 'Docutils', refuri= @@ -93,7 +94,7 @@ class Messages(Transform): of the document. """ - def transform(self): + def apply(self): unfiltered = self.document.transform_messages threshold = self.document.reporter['writer'].report_level messages = [] @@ -115,7 +116,7 @@ class TestMessages(Transform): Append all post-parse system messages to the end of the document. """ - def transform(self): + def apply(self): for msg in self.document.transform_messages: if not msg.parent: self.document += msg @@ -129,10 +130,10 @@ class FinalChecks(Transform): - Check for dangling references (incl. footnote & citation). """ - def transform(self): + def apply(self): visitor = FinalCheckVisitor(self.document) self.document.walk(visitor) - if self.document.options.expose_internals: + if self.document.settings.expose_internals: visitor = InternalAttributeExposer(self.document) self.document.walk(visitor) @@ -170,7 +171,7 @@ class InternalAttributeExposer(nodes.GenericNodeVisitor): def __init__(self, document): nodes.GenericNodeVisitor.__init__(self, document) - self.internal_attributes = document.options.expose_internals + self.internal_attributes = document.settings.expose_internals def default_visit(self, node): for att in self.internal_attributes: @@ -194,11 +195,11 @@ class Pending(Transform): 'last reader', 'first writer', and 'last writer'. Overriden in subclasses (below).""" - def transform(self): + def apply(self): for pending in self.document.pending: if pending.stage == self.stage: pending.transform(self.document, self.component, - pending).transform() + pending).apply() class FirstReaderPending(Pending): -- cgit v1.2.1 From cb678b87cdec6c2fc503cccf524b48bc80950edd Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 24 Oct 2002 00:45:58 +0000 Subject: Completed transform reform; removed ``Pending`` transform classes & data; updated. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@852 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 69 +++++----------------------------------- 1 file changed, 8 insertions(+), 61 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index de52c3bb3..65fc0cb4a 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -12,9 +12,6 @@ Transforms needed by most or all documents: `nodes.document.transform_messages`. - `TestMessages`: Like `Messages`, used on test runs. - `FinalReferences`: Resolve remaining references. -- `Pending`: Execute pending transforms (abstract base class; - `FirstReaderPending`, `LastReaderPending`, `FirstWriterPending`, and - `LastWriterPending` are its concrete subclasses). """ __docformat__ = 'reStructuredText' @@ -32,6 +29,8 @@ class Decorations(Transform): Populate a document's decoration element (header, footer). """ + default_priority = 820 + def apply(self): header = self.generate_header() footer = self.generate_footer() @@ -94,6 +93,8 @@ class Messages(Transform): of the document. """ + default_priority = 860 + def apply(self): unfiltered = self.document.transform_messages threshold = self.document.reporter['writer'].report_level @@ -116,6 +117,8 @@ class TestMessages(Transform): Append all post-parse system messages to the end of the document. """ + default_priority = 890 + def apply(self): for msg in self.document.transform_messages: if not msg.parent: @@ -130,6 +133,8 @@ class FinalChecks(Transform): - Check for dangling references (incl. footnote & citation). """ + default_priority = 840 + def apply(self): visitor = FinalCheckVisitor(self.document) self.document.walk(visitor) @@ -178,61 +183,3 @@ class InternalAttributeExposer(nodes.GenericNodeVisitor): value = getattr(node, att, None) if value is not None: node['internal:' + att] = value - - -class Pending(Transform): - - """ - Base class for the execution of pending transforms. - - `nodes.pending` element objects each contain a "stage" attribute; the - stage of the pending element must match the `stage` of this transform. - """ - - stage = None - """The stage of processing applicable to this transform; match with - `nodes.pending.stage`. Possible values include 'first reader', - 'last reader', 'first writer', and 'last writer'. Overriden in - subclasses (below).""" - - def apply(self): - for pending in self.document.pending: - if pending.stage == self.stage: - pending.transform(self.document, self.component, - pending).apply() - - -class FirstReaderPending(Pending): - - stage = 'first reader' - - -class LastReaderPending(Pending): - - stage = 'last reader' - - -class FirstWriterPending(Pending): - - stage = 'first writer' - - -class LastWriterPending(Pending): - - stage = 'last writer' - - -test_transforms = (TestMessages,) -"""Universal transforms to apply to the raw document when testing.""" - -first_reader_transforms = (FirstReaderPending,) -"""Universal transforms to apply before any other Reader transforms.""" - -last_reader_transforms = (LastReaderPending, Decorations) -"""Universal transforms to apply after all other Reader transforms.""" - -first_writer_transforms = (FirstWriterPending,) -"""Universal transforms to apply before any other Writer transforms.""" - -last_writer_transforms = (LastWriterPending, FinalChecks, Messages) -"""Universal transforms to apply after all other Writer transforms.""" -- cgit v1.2.1 From 9753cc15c75c5f7859e8fd526c5d3b9cbb0f4a7f Mon Sep 17 00:00:00 2001 From: fdrake Date: Thu, 10 Apr 2003 16:03:45 +0000 Subject: Don't use len(L) > 0 to test for non-emptiness of L; lists are true if non-empty and false if empty. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@1274 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 65fc0cb4a..4523304f2 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -102,7 +102,7 @@ class Messages(Transform): for msg in unfiltered: if msg['level'] >= threshold and not msg.parent: messages.append(msg) - if len(messages) > 0: + if messages: section = nodes.section(CLASS='system-messages') # @@@ get this from the language module? section += nodes.title('', 'Docutils System Messages') -- cgit v1.2.1 From b24dd9aaa77085ba010d3d2aaa2a42dac8f73e16 Mon Sep 17 00:00:00 2001 From: goodger Date: Fri, 23 Jan 2004 02:35:13 +0000 Subject: Added FilterMessages transform (removes system messages below the verbosity threshold) git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@1811 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 4523304f2..e7d1f150c 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -111,6 +111,29 @@ class Messages(Transform): self.document += section +class FilterMessages(Transform): + + """ + Remove system messages below verbosity threshold. + """ + + default_priority = 870 + + def apply(self): + visitor = SystemMessageFilterVisitor(self.document) + self.document.walk(visitor) + + +class SystemMessageFilterVisitor(nodes.SparseNodeVisitor): + + def unknown_visit(self, node): + pass + + def visit_system_message(self, node): + if node['level'] < self.document.reporter['writer'].report_level: + node.parent.remove(node) + + class TestMessages(Transform): """ -- cgit v1.2.1 From 1f2f4eb5fe0d7347d89d5549d30a2d27f687a504 Mon Sep 17 00:00:00 2001 From: mmgilbe Date: Mon, 22 Mar 2004 01:08:37 +0000 Subject: Added hook (via docutils.TransformSpec.unknown_reference_resolvers) to FinalCheckVisitor for application-specific handling of unresolvable references. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@1855 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index e7d1f150c..a77437b95 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -159,7 +159,13 @@ class FinalChecks(Transform): default_priority = 840 def apply(self): - visitor = FinalCheckVisitor(self.document) + unknown_reference_resolvers = [] + for i in self.document.transformer.components.values(): + unknown_reference_resolvers.extend(i.unknown_reference_resolvers) + decorated_list = [(f.priority, f) for f in unknown_reference_resolvers] + decorated_list.sort() + unknown_reference_resolvers = [f[1] for f in decorated_list] + visitor = FinalCheckVisitor(self.document, unknown_reference_resolvers) self.document.walk(visitor) if self.document.settings.expose_internals: visitor = InternalAttributeExposer(self.document) @@ -167,6 +173,11 @@ class FinalChecks(Transform): class FinalCheckVisitor(nodes.SparseNodeVisitor): + + def __init__(self, document, unknown_reference_resolvers): + nodes.SparseNodeVisitor.__init__(self, document) + self.document = document + self.unknown_reference_resolvers = unknown_reference_resolvers def unknown_visit(self, node): pass @@ -177,15 +188,21 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): refname = node['refname'] id = self.document.nameids.get(refname) if id is None: - msg = self.document.reporter.error( - 'Unknown target name: "%s".' % (node['refname']), - base_node=node) - msgid = self.document.set_id(msg) - prb = nodes.problematic( - node.rawsource, node.rawsource, refid=msgid) - prbid = self.document.set_id(prb) - msg.add_backref(prbid) - node.parent.replace(node, prb) + handled = None + for i in self.unknown_reference_resolvers: + if i(node): + handled = 1 + break + if not handled: + msg = self.document.reporter.error( + 'Unknown target name: "%s".' % (node['refname']), + base_node=node) + msgid = self.document.set_id(msg) + prb = nodes.problematic( + node.rawsource, node.rawsource, refid=msgid) + prbid = self.document.set_id(prb) + msg.add_backref(prbid) + node.parent.replace(node, prb) else: del node['refname'] node['refid'] = id -- cgit v1.2.1 From f9ce4af77d798fd979eee78a8d31d05783f6f6f3 Mon Sep 17 00:00:00 2001 From: mmgilbe Date: Thu, 25 Mar 2004 23:01:11 +0000 Subject: 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. Removed all refernces to the origuri code, which was broken. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@1894 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index a77437b95..8fbea62c4 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -159,13 +159,8 @@ class FinalChecks(Transform): default_priority = 840 def apply(self): - unknown_reference_resolvers = [] - for i in self.document.transformer.components.values(): - unknown_reference_resolvers.extend(i.unknown_reference_resolvers) - decorated_list = [(f.priority, f) for f in unknown_reference_resolvers] - decorated_list.sort() - unknown_reference_resolvers = [f[1] for f in decorated_list] - visitor = FinalCheckVisitor(self.document, unknown_reference_resolvers) + visitor = FinalCheckVisitor( + self.document, self.document.transformer.unknown_reference_resolvers) self.document.walk(visitor) if self.document.settings.expose_internals: visitor = InternalAttributeExposer(self.document) -- cgit v1.2.1 From ed4e74f0c8c447034a3f79f7856ddaac878ab318 Mon Sep 17 00:00:00 2001 From: goodger Date: Fri, 2 Apr 2004 02:56:04 +0000 Subject: simplified code git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@1905 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 8fbea62c4..4e7d0b457 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -160,7 +160,8 @@ class FinalChecks(Transform): def apply(self): visitor = FinalCheckVisitor( - self.document, self.document.transformer.unknown_reference_resolvers) + self.document, + self.document.transformer.unknown_reference_resolvers) self.document.walk(visitor) if self.document.settings.expose_internals: visitor = InternalAttributeExposer(self.document) @@ -183,12 +184,10 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): refname = node['refname'] id = self.document.nameids.get(refname) if id is None: - handled = None - for i in self.unknown_reference_resolvers: - if i(node): - handled = 1 + for resolver_function in self.unknown_reference_resolvers: + if resolver_function(node): break - if not handled: + else: msg = self.document.reporter.error( 'Unknown target name: "%s".' % (node['refname']), base_node=node) -- cgit v1.2.1 From 1edd0cd8fca10c572d723608dac92e30f8e42ce2 Mon Sep 17 00:00:00 2001 From: goodger Date: Tue, 4 May 2004 00:38:15 +0000 Subject: Added specific error message for duplicate targets. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@2022 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 4e7d0b457..45e74f3e3 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -188,9 +188,14 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): if resolver_function(node): break else: - msg = self.document.reporter.error( - 'Unknown target name: "%s".' % (node['refname']), - base_node=node) + if self.document.nameids.has_key(refname): + 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( + 'Unknown target name: "%s".' % (node['refname']), + base_node=node) msgid = self.document.set_id(msg) prb = nodes.problematic( node.rawsource, node.rawsource, refid=msgid) -- cgit v1.2.1 From c684a39a8dd55bf49cff7bd02eceb12da06200f0 Mon Sep 17 00:00:00 2001 From: wiemann Date: Sat, 30 Oct 2004 16:00:40 +0000 Subject: moved transition transformation code to universal.FinalCheckVisitor git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@2781 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 69 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 45e74f3e3..62304e2a8 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -151,9 +151,10 @@ class TestMessages(Transform): class FinalChecks(Transform): """ - Perform last-minute checks. + Perform last-minute checks and transforms. - Check for dangling references (incl. footnote & citation). + - Check for illegal transitions, move transitions. """ default_priority = 840 @@ -210,6 +211,72 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): visit_footnote_reference = visit_citation_reference = visit_reference + def visit_transition(self, node): + """ + Move transitions at the end of sections up the tree. Complain + on transitions after a title, at the beginning or end of the + document, and after another transition. + + For example, transform this:: + +
+ ... + +
+ ... + + into this:: + +
+ ... + +
+ ... + """ + index = node.parent.index(node) + error = None + if (index == 0 or + isinstance(node.parent[0], nodes.title) and + (index == 1 or + isinstance(node.parent[1], nodes.subtitle) and + index == 2)): + assert (isinstance(node.parent, nodes.document) or + isinstance(node.parent, nodes.section)) + error = self.document.reporter.error( + 'Document or section may not begin with a transition.', + line=node.line) + elif isinstance(node.parent[index - 1], nodes.transition): + error = self.document.reporter.error( + 'At least one body element must separate transitions; ' + 'adjacent transitions are not allowed.', line=node.line) + if error: + # Insert before node and update index. + node.parent.insert(index, error) + index += 1 + assert index < len(node.parent) + if index != len(node.parent) - 1: + # No need to move the node. + return + # Node behind which the transition is to be moved. + sibling = node + # While sibling is the last node of its parent. + while index == len(sibling.parent) - 1: + sibling = sibling.parent + # If sibling is the whole document (i.e. it has no parent). + if sibling.parent is None: + # Transition at the end of document. Do not move the + # transition up, and place an error behind. + error = self.document.reporter.error( + 'Document may not end with a transition.', + line=node.line) + node.parent.insert(node.parent.index(node) + 1, error) + return + index = sibling.parent.index(sibling) + # Remove the original transition node. + node.parent.remove(node) + # Insert the transition after the sibling. + sibling.parent.insert(index + 1, node) + class InternalAttributeExposer(nodes.GenericNodeVisitor): -- cgit v1.2.1 From 9dbc2adead008935245a396eab10bb7bcb11b226 Mon Sep 17 00:00:00 2001 From: wiemann Date: Sat, 26 Mar 2005 16:21:28 +0000 Subject: merged rev. 3094:3101 and 3102:HEAD from branches/multiple-ids to trunk git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3129 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 62304e2a8..7d8a796cc 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -103,7 +103,7 @@ class Messages(Transform): if msg['level'] >= threshold and not msg.parent: messages.append(msg) if messages: - section = nodes.section(CLASS='system-messages') + section = nodes.section(classes=['system-messages']) # @@@ get this from the language module? section += nodes.title('', 'Docutils System Messages') section += messages @@ -167,6 +167,21 @@ class FinalChecks(Transform): if self.document.settings.expose_internals: visitor = InternalAttributeExposer(self.document) self.document.walk(visitor) + # *After* resolving all references, check for unreferenced + # targets: + for target in self.document.traverse(): + if isinstance(target, nodes.target) and not target.referenced: + if target['names']: + naming = target['names'][0] + elif target['ids']: + naming = target['ids'][0] + else: + # Hack: Propagated targets always have their refid + # attribute set. + naming = target['refid'] + self.document.reporter.info( + 'Hyperlink target "%s" is not referenced.' + % naming, base_node=target) class FinalCheckVisitor(nodes.SparseNodeVisitor): @@ -206,7 +221,7 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): else: del node['refname'] node['refid'] = id - self.document.ids[id].referenced = 1 + self.document.ids[id].note_referenced_by(id=id) node.resolved = 1 visit_footnote_reference = visit_citation_reference = visit_reference -- cgit v1.2.1 From a9cb01249ed3351c1e3ba36caa9fc45d0522b842 Mon Sep 17 00:00:00 2001 From: goodger Date: Tue, 5 Apr 2005 15:26:16 +0000 Subject: merged reporter-categories branch into trunk: removed docutils.utils.Reporter.categories, docutils.utils.ConditionSet, and all references to them, to simplify error reporting git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3171 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 7d8a796cc..c77d72df8 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -97,7 +97,7 @@ class Messages(Transform): def apply(self): unfiltered = self.document.transform_messages - threshold = self.document.reporter['writer'].report_level + threshold = self.document.reporter.report_level messages = [] for msg in unfiltered: if msg['level'] >= threshold and not msg.parent: @@ -130,7 +130,7 @@ class SystemMessageFilterVisitor(nodes.SparseNodeVisitor): pass def visit_system_message(self, node): - if node['level'] < self.document.reporter['writer'].report_level: + if node['level'] < self.document.reporter.report_level: node.parent.remove(node) -- cgit v1.2.1 From dcc80f043243f34d0373a3150bacfff20b3212ae Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 7 Apr 2005 19:36:11 +0000 Subject: added "header" & "footer" directives, tests, docs, support, and some tweaks git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3184 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index c77d72df8..4ed7b6896 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -32,19 +32,16 @@ class Decorations(Transform): default_priority = 820 def apply(self): - header = self.generate_header() - footer = self.generate_footer() - if header or footer: - decoration = nodes.decoration() - decoration += header - decoration += footer - document = self.document - index = document.first_child_not_matching_class( - nodes.PreDecorative) - if index is None: - document += decoration - else: - document[index:index] = [decoration] + header_nodes = self.generate_header() + if header_nodes: + decoration = self.document.get_decoration() + header = decoration.get_header() + header.children.extend(header_nodes) + footer_nodes = self.generate_footer() + if footer_nodes: + decoration = self.document.get_decoration() + footer = decoration.get_footer() + footer.children.extend(footer_nodes) def generate_header(self): return None @@ -79,9 +76,7 @@ class Decorations(Transform): nodes.reference('', 'reStructuredText', refuri='http://' 'docutils.sourceforge.net/rst.html'), nodes.Text(' source.\n')]) - footer = nodes.footer() - footer += nodes.paragraph('', '', *text) - return footer + return [nodes.paragraph('', '', *text)] else: return None -- cgit v1.2.1 From e743c7a5d3e7908af5702ddacfbcb4b7556914d9 Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 7 Apr 2005 19:51:45 +0000 Subject: fixed bugs: don't access a node's children attribute directly\! git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3186 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 4ed7b6896..aac05a2e4 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -36,12 +36,12 @@ class Decorations(Transform): if header_nodes: decoration = self.document.get_decoration() header = decoration.get_header() - header.children.extend(header_nodes) + header.extend(header_nodes) footer_nodes = self.generate_footer() if footer_nodes: decoration = self.document.get_decoration() footer = decoration.get_footer() - footer.children.extend(footer_nodes) + footer.extend(footer_nodes) def generate_header(self): return None -- cgit v1.2.1 From 21d87f8811b672fc2726cc2d69baf229240e0dd3 Mon Sep 17 00:00:00 2001 From: wiemann Date: Fri, 1 Jul 2005 16:39:51 +0000 Subject: improved cloaking mechanism git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3644 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index aac05a2e4..75dadd7bf 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -164,8 +164,8 @@ class FinalChecks(Transform): self.document.walk(visitor) # *After* resolving all references, check for unreferenced # targets: - for target in self.document.traverse(): - if isinstance(target, nodes.target) and not target.referenced: + for target in self.document.traverse(nodes.target): + if not target.referenced: if target['names']: naming = target['names'][0] elif target['ids']: -- cgit v1.2.1 From 2703f7c25b10c10f59db93e0776cb81c1d181bca Mon Sep 17 00:00:00 2001 From: wiemann Date: Tue, 5 Jul 2005 20:29:55 +0000 Subject: moved transition transform logic from universal.FinalChecks to a separate transform, misc.Transitions git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3657 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 86 +++------------------------------------- 1 file changed, 5 insertions(+), 81 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 75dadd7bf..53ddde878 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -160,8 +160,11 @@ class FinalChecks(Transform): self.document.transformer.unknown_reference_resolvers) self.document.walk(visitor) if self.document.settings.expose_internals: - visitor = InternalAttributeExposer(self.document) - self.document.walk(visitor) + for node in self.document.traverse(): + for att in self.document.settings.expose_internals: + value = getattr(node, att, None) + if value is not None: + node['internal:' + att] = value # *After* resolving all references, check for unreferenced # targets: for target in self.document.traverse(nodes.target): @@ -220,82 +223,3 @@ class FinalCheckVisitor(nodes.SparseNodeVisitor): node.resolved = 1 visit_footnote_reference = visit_citation_reference = visit_reference - - def visit_transition(self, node): - """ - Move transitions at the end of sections up the tree. Complain - on transitions after a title, at the beginning or end of the - document, and after another transition. - - For example, transform this:: - -
- ... - -
- ... - - into this:: - -
- ... - -
- ... - """ - index = node.parent.index(node) - error = None - if (index == 0 or - isinstance(node.parent[0], nodes.title) and - (index == 1 or - isinstance(node.parent[1], nodes.subtitle) and - index == 2)): - assert (isinstance(node.parent, nodes.document) or - isinstance(node.parent, nodes.section)) - error = self.document.reporter.error( - 'Document or section may not begin with a transition.', - line=node.line) - elif isinstance(node.parent[index - 1], nodes.transition): - error = self.document.reporter.error( - 'At least one body element must separate transitions; ' - 'adjacent transitions are not allowed.', line=node.line) - if error: - # Insert before node and update index. - node.parent.insert(index, error) - index += 1 - assert index < len(node.parent) - if index != len(node.parent) - 1: - # No need to move the node. - return - # Node behind which the transition is to be moved. - sibling = node - # While sibling is the last node of its parent. - while index == len(sibling.parent) - 1: - sibling = sibling.parent - # If sibling is the whole document (i.e. it has no parent). - if sibling.parent is None: - # Transition at the end of document. Do not move the - # transition up, and place an error behind. - error = self.document.reporter.error( - 'Document may not end with a transition.', - line=node.line) - node.parent.insert(node.parent.index(node) + 1, error) - return - index = sibling.parent.index(sibling) - # Remove the original transition node. - node.parent.remove(node) - # Insert the transition after the sibling. - sibling.parent.insert(index + 1, node) - - -class InternalAttributeExposer(nodes.GenericNodeVisitor): - - def __init__(self, document): - nodes.GenericNodeVisitor.__init__(self, document) - self.internal_attributes = document.settings.expose_internals - - def default_visit(self, node): - for att in self.internal_attributes: - value = getattr(node, att, None) - if value is not None: - node['internal:' + att] = value -- cgit v1.2.1 From e0a1eaac9d47da79a00c92c74ef7e789464421b7 Mon Sep 17 00:00:00 2001 From: wiemann Date: Tue, 5 Jul 2005 23:14:55 +0000 Subject: moved expose_internals logic out of FinalChecks into a separate transform, universal.ExposeInternals git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3658 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 53ddde878..1918016fc 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -143,6 +143,23 @@ class TestMessages(Transform): self.document += msg +class ExposeInternals(Transform): + + """ + Expose internal attributes if ``expose_internals`` setting is set. + """ + + default_priority = 840 + + def apply(self): + if self.document.settings.expose_internals: + for node in self.document.traverse(): + for att in self.document.settings.expose_internals: + value = getattr(node, att, None) + if value is not None: + node['internal:' + att] = value + + class FinalChecks(Transform): """ @@ -152,19 +169,13 @@ class FinalChecks(Transform): - Check for illegal transitions, move transitions. """ - default_priority = 840 + default_priority = 850 def apply(self): visitor = FinalCheckVisitor( self.document, self.document.transformer.unknown_reference_resolvers) self.document.walk(visitor) - if self.document.settings.expose_internals: - for node in self.document.traverse(): - for att in self.document.settings.expose_internals: - value = getattr(node, att, None) - if value is not None: - node['internal:' + att] = value # *After* resolving all references, check for unreferenced # targets: for target in self.document.traverse(nodes.target): -- cgit v1.2.1 From 88b1bd28140150e41265cd8a84b5d0ee55f05138 Mon Sep 17 00:00:00 2001 From: wiemann Date: Tue, 5 Jul 2005 23:36:14 +0000 Subject: renamed universal.FinalChecks to references.DanglingReferences; changed priority to 680 git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3659 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 76 ---------------------------------------- 1 file changed, 76 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 1918016fc..b28e8f06b 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -158,79 +158,3 @@ class ExposeInternals(Transform): value = getattr(node, att, None) if value is not None: node['internal:' + att] = value - - -class FinalChecks(Transform): - - """ - Perform last-minute checks and transforms. - - - Check for dangling references (incl. footnote & citation). - - Check for illegal transitions, move transitions. - """ - - default_priority = 850 - - def apply(self): - visitor = FinalCheckVisitor( - self.document, - self.document.transformer.unknown_reference_resolvers) - self.document.walk(visitor) - # *After* resolving all references, check for unreferenced - # targets: - for target in self.document.traverse(nodes.target): - if not target.referenced: - if target['names']: - naming = target['names'][0] - elif target['ids']: - naming = target['ids'][0] - else: - # Hack: Propagated targets always have their refid - # attribute set. - naming = target['refid'] - self.document.reporter.info( - 'Hyperlink target "%s" is not referenced.' - % naming, base_node=target) - - -class FinalCheckVisitor(nodes.SparseNodeVisitor): - - def __init__(self, document, unknown_reference_resolvers): - nodes.SparseNodeVisitor.__init__(self, document) - self.document = document - self.unknown_reference_resolvers = unknown_reference_resolvers - - def unknown_visit(self, node): - pass - - def visit_reference(self, node): - if node.resolved or not node.hasattr('refname'): - 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 self.document.nameids.has_key(refname): - 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( - 'Unknown target name: "%s".' % (node['refname']), - base_node=node) - msgid = self.document.set_id(msg) - prb = nodes.problematic( - node.rawsource, node.rawsource, refid=msgid) - prbid = self.document.set_id(prb) - msg.add_backref(prbid) - node.parent.replace(node, prb) - else: - del node['refname'] - node['refid'] = id - self.document.ids[id].note_referenced_by(id=id) - node.resolved = 1 - - visit_footnote_reference = visit_citation_reference = visit_reference -- cgit v1.2.1 From 5d0c3a22119855adddbf210fc607e3944bbad928 Mon Sep 17 00:00:00 2001 From: wiemann Date: Wed, 6 Jul 2005 12:43:05 +0000 Subject: fixed TestMessages priority to conform to docs git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3660 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index b28e8f06b..8d1b58d9b 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -133,9 +133,11 @@ class TestMessages(Transform): """ Append all post-parse system messages to the end of the document. + + Used for testing purposes. """ - default_priority = 890 + default_priority = 880 def apply(self): for msg in self.document.transform_messages: -- cgit v1.2.1 From da4273546b4b7aa3edcffc67b60c9dd00010dbbf Mon Sep 17 00:00:00 2001 From: wiemann Date: Wed, 6 Jul 2005 12:45:22 +0000 Subject: sorted transform declarations by priority git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3661 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 8d1b58d9b..227f6ce69 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -81,6 +81,23 @@ class Decorations(Transform): return None +class ExposeInternals(Transform): + + """ + Expose internal attributes if ``expose_internals`` setting is set. + """ + + default_priority = 840 + + def apply(self): + if self.document.settings.expose_internals: + for node in self.document.traverse(): + for att in self.document.settings.expose_internals: + value = getattr(node, att, None) + if value is not None: + node['internal:' + att] = value + + class Messages(Transform): """ @@ -143,20 +160,3 @@ class TestMessages(Transform): for msg in self.document.transform_messages: if not msg.parent: self.document += msg - - -class ExposeInternals(Transform): - - """ - Expose internal attributes if ``expose_internals`` setting is set. - """ - - default_priority = 840 - - def apply(self): - if self.document.settings.expose_internals: - for node in self.document.traverse(): - for att in self.document.settings.expose_internals: - value = getattr(node, att, None) - if value is not None: - node['internal:' + att] = value -- cgit v1.2.1 From 49e2f63bbebc20e2c097aab472d18e3de028ea6f Mon Sep 17 00:00:00 2001 From: wiemann Date: Thu, 7 Jul 2005 02:14:50 +0000 Subject: simplified FilterMessages transform git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3665 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 227f6ce69..2766ed41b 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -132,18 +132,9 @@ class FilterMessages(Transform): default_priority = 870 def apply(self): - visitor = SystemMessageFilterVisitor(self.document) - self.document.walk(visitor) - - -class SystemMessageFilterVisitor(nodes.SparseNodeVisitor): - - def unknown_visit(self, node): - pass - - def visit_system_message(self, node): - if node['level'] < self.document.reporter.report_level: - node.parent.remove(node) + for node in self.document.traverse(nodes.system_message): + if node['level'] < self.document.reporter.report_level: + node.parent.remove(node) class TestMessages(Transform): -- cgit v1.2.1 From 37341b9e7726b33a7c3899587e0c98ae50734e5b Mon Sep 17 00:00:00 2001 From: goodger Date: Thu, 15 Sep 2005 14:16:04 +0000 Subject: fixed bug with expose_internals setting and Text nodes (exposed by the "rawsource" internal attribute) git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@3877 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index 2766ed41b..a6a0462cb 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -88,10 +88,13 @@ class ExposeInternals(Transform): """ default_priority = 840 + + def not_Text(self, node): + return not isinstance(node, nodes.Text) def apply(self): if self.document.settings.expose_internals: - for node in self.document.traverse(): + for node in self.document.traverse(self.not_Text): for att in self.document.settings.expose_internals: value = getattr(node, att, None) if value is not None: -- cgit v1.2.1 From e329a521a11f62212d4504d25cb1a3c5c76dfc18 Mon Sep 17 00:00:00 2001 From: goodger Date: Mon, 12 Dec 2005 04:12:02 +0000 Subject: Added the universal.StripComments transform, the "strip_comments" setting, and the --strip-comments/--leave-comments options. git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@4183 929543f6-e4f2-0310-98a6-ba3bd3dd1d04 --- docutils/transforms/universal.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'docutils/transforms/universal.py') diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py index a6a0462cb..b31648632 100644 --- a/docutils/transforms/universal.py +++ b/docutils/transforms/universal.py @@ -154,3 +154,18 @@ class TestMessages(Transform): for msg in self.document.transform_messages: if not msg.parent: self.document += msg + + +class StripComments(Transform): + + """ + Remove comment elements from the document tree (only if the + ``strip_comments`` setting is enabled). + """ + + default_priority = 740 + + def apply(self): + if self.document.settings.strip_comments: + for node in self.document.traverse(nodes.comment): + node.parent.remove(node) -- cgit v1.2.1