summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgoodger <goodger@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2007-02-12 04:05:20 +0000
committergoodger <goodger@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2007-02-12 04:05:20 +0000
commitc18b8a02bca18994e26700de58b509f2514d33a2 (patch)
tree39851d41348911dcbe1e40597c236e485d46c839
parent55095186fbb0553c6707a9fdbeda4298c1b8e324 (diff)
downloaddocutils-c18b8a02bca18994e26700de58b509f2514d33a2.tar.gz
Added ``--strip-elements-with-class`` and ``--strip-class`` options (``strip_elements_with_classes`` and ``strip_classes`` settings) and ``StripClassesAndElements`` transform.
git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk/docutils@4913 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-rw-r--r--HISTORY.txt10
-rw-r--r--docs/ref/transforms.txt2
-rw-r--r--docs/user/config.txt12
-rw-r--r--docutils/frontend.py29
-rw-r--r--docutils/transforms/universal.py38
-rw-r--r--docutils/writers/__init__.py2
6 files changed, 87 insertions, 6 deletions
diff --git a/HISTORY.txt b/HISTORY.txt
index 8490a6db0..db5645254 100644
--- a/HISTORY.txt
+++ b/HISTORY.txt
@@ -30,6 +30,9 @@ Changes Since 0.4
- Paths of applied configuration files are now recorded in the
runtime setting ``_config_files`` (accessible via
``--dump-settings``).
+ - Added ``--strip-elements-with-class`` and ``--strip-class``
+ options (``strip_elements_with_classes`` and ``strip_classes``
+ settings).
* docutils/io.py:
@@ -68,7 +71,12 @@ Changes Since 0.4
object-oriented directive interface. Errors are now (mostly)
thrown using the new ``DirectiveError`` class.
-* docutils/transforms/writer_aux/:
+* docutils/transforms/universal.py:
+
+ - Added ``StripClasses`` transform to remove from the document tree
+ all elements with classes in ``settings.strip_classes``.
+
+* docutils/transforms/writer_aux.py:
- Added ``Admonitions`` transform to transform specific admonitions
(like ``note``, ``warning``, etc.) into generic admonitions with a
diff --git a/docs/ref/transforms.txt b/docs/ref/transforms.txt
index 6ce9bae8f..ad330e23f 100644
--- a/docs/ref/transforms.txt
+++ b/docs/ref/transforms.txt
@@ -65,6 +65,8 @@ parts.Contents "contents" (d/p), 720
universal.StripComments Reader (r) 740
+universal.StripClasses Writer (w) 750
+
peps.PEPZero peps.Headers (t/p) 760
components.Filter "meta" (d/p) 780
diff --git a/docs/user/config.txt b/docs/user/config.txt
index d67e4c95a..2dc134be1 100644
--- a/docs/user/config.txt
+++ b/docs/user/config.txt
@@ -400,12 +400,24 @@ _`strict_visitor`
Default: disabled (None). Option: ``--strict-visitor`` (hidden,
for development use only).
+_`strip_classes`
+ List of "classes" attribute values to remove from all elements in
+ the document tree.
+
+ Default: disabled (None). Option: ``--strip-class``.
+
_`strip_comments`
Enable the removal of comment elements from the document tree.
Default: disabled (None). Options: ``--strip-comment``,
``--leave-comments``.
+_`strip_elements_with_classes`
+ List of "classes" attribute values; matching elements to be
+ removed from the document tree.
+
+ Default: disabled (None). Option: ``--strip-element-with-class``.
+
_`title`
The document title as metadata, which does not become part of the
document body. It overrides a document-supplied title. For
diff --git a/docutils/frontend.py b/docutils/frontend.py
index 1e446fc6a..034e30769 100644
--- a/docutils/frontend.py
+++ b/docutils/frontend.py
@@ -34,6 +34,8 @@ import warnings
import ConfigParser as CP
import codecs
import docutils
+import docutils.utils
+import docutils.nodes
try:
import optparse
from optparse import SUPPRESS_HELP
@@ -161,13 +163,26 @@ def validate_url_trailing_slash(
else:
return value + '/'
-def validate_dependency_file(
- setting, value, option_parser, config_parser=None, config_section=None):
+def validate_dependency_file(setting, value, option_parser,
+ config_parser=None, config_section=None):
try:
return docutils.utils.DependencyList(value)
except IOError:
return docutils.utils.DependencyList(None)
+def validate_strip_class(setting, value, option_parser,
+ config_parser=None, config_section=None):
+ if config_parser: # validate all values
+ class_values = value
+ else: # just validate the latest value
+ class_values = [value[-1]]
+ for class_value in class_values:
+ normalized = docutils.nodes.make_id(class_value)
+ if class_value != normalized:
+ raise ValueError('invalid class value %r (perhaps %r?)'
+ % (class_value, normalized))
+ return value
+
def make_paths_absolute(pathdict, keys, base_path=None):
"""
Interpret filesystem path settings relative to the `base_path` given.
@@ -343,6 +358,16 @@ class OptionParser(optparse.OptionParser, docutils.SettingsSpec):
('Leave comment elements in the document tree. (default)',
['--leave-comments'],
{'action': 'store_false', 'dest': 'strip_comments'}),
+ ('Remove all elements with classes="<class>" from the document tree. '
+ '(Multiple-use option.)',
+ ['--strip-elements-with-class'],
+ {'action': 'append', 'dest': 'strip_elements_with_classes',
+ 'metavar': '<class>', 'validator': validate_strip_class}),
+ ('Remove all classes="<class>" attributes from elements in the '
+ 'document tree. (Multiple-use option.)',
+ ['--strip-class'],
+ {'action': 'append', 'dest': 'strip_classes',
+ 'metavar': '<class>', 'validator': validate_strip_class}),
('Report system messages at or higher than <level>: "info" or "1", '
'"warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"',
['--report', '-r'], {'choices': threshold_choices, 'default': 2,
diff --git a/docutils/transforms/universal.py b/docutils/transforms/universal.py
index a666f99ee..83bd48f84 100644
--- a/docutils/transforms/universal.py
+++ b/docutils/transforms/universal.py
@@ -86,11 +86,11 @@ class ExposeInternals(Transform):
"""
default_priority = 840
-
+
def not_Text(self, node):
return not isinstance(node, nodes.Text)
- def apply(self):
+ def apply(self):
if self.document.settings.expose_internals:
for node in self.document.traverse(self.not_Text):
for att in self.document.settings.expose_internals:
@@ -167,3 +167,37 @@ class StripComments(Transform):
if self.document.settings.strip_comments:
for node in self.document.traverse(nodes.comment):
node.parent.remove(node)
+
+
+class StripClassesAndElements(Transform):
+
+ """
+ Remove from the document tree all elements with classes in
+ `self.document.settings.strip_elements_with_classes` and all "classes"
+ attribute values in `self.document.settings.strip_classes`.
+ """
+
+ default_priority = 750
+
+ def apply(self):
+ if not (self.document.settings.strip_elements_with_classes
+ or self.document.settings.strip_classes):
+ return
+ # prepare dicts for lookup (not sets, for Python 2.2 compatibility):
+ self.strip_elements = dict(
+ [(key, None)
+ for key in (self.document.settings.strip_elements_with_classes
+ or [])])
+ self.strip_classes = dict(
+ [(key, None) for key in (self.document.settings.strip_classes
+ or [])])
+ for node in self.document.traverse(self.check_classes):
+ node.parent.remove(node)
+
+ def check_classes(self, node):
+ if isinstance(node, nodes.Element):
+ for class_value in node['classes'][:]:
+ if class_value in self.strip_classes:
+ node['classes'].remove(class_value)
+ if class_value in self.strip_elements:
+ return 1
diff --git a/docutils/writers/__init__.py b/docutils/writers/__init__.py
index 9d5326616..39e1ecd5b 100644
--- a/docutils/writers/__init__.py
+++ b/docutils/writers/__init__.py
@@ -34,7 +34,7 @@ class Writer(Component):
return Component.get_transforms(self) + [
universal.Messages,
universal.FilterMessages,
- ]
+ universal.StripClassesAndElements,]
document = None
"""The document to write (Docutils doctree); set by `write`."""