diff options
author | goodger <goodger@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2007-02-12 04:05:20 +0000 |
---|---|---|
committer | goodger <goodger@929543f6-e4f2-0310-98a6-ba3bd3dd1d04> | 2007-02-12 04:05:20 +0000 |
commit | c18b8a02bca18994e26700de58b509f2514d33a2 (patch) | |
tree | 39851d41348911dcbe1e40597c236e485d46c839 | |
parent | 55095186fbb0553c6707a9fdbeda4298c1b8e324 (diff) | |
download | docutils-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.txt | 10 | ||||
-rw-r--r-- | docs/ref/transforms.txt | 2 | ||||
-rw-r--r-- | docs/user/config.txt | 12 | ||||
-rw-r--r-- | docutils/frontend.py | 29 | ||||
-rw-r--r-- | docutils/transforms/universal.py | 38 | ||||
-rw-r--r-- | docutils/writers/__init__.py | 2 |
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`.""" |