Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/docutils/transforms/universal.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/docutils/transforms/universal.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,320 +0,0 @@ -# $Id: universal.py 8393 2019-09-18 10:13:00Z milde $ -# -*- coding: utf-8 -*- -# Authors: David Goodger <goodger@python.org>; Ueli Schlaepfer; Günter Milde -# Maintainer: docutils-develop@lists.sourceforge.net -# Copyright: This module has been placed in the public domain. - -""" -Transforms needed by most or all documents: - -- `Decorations`: Generate a document's header & footer. -- `Messages`: Placement of system messages stored in - `nodes.document.transform_messages`. -- `TestMessages`: Like `Messages`, used on test runs. -- `FinalReferences`: Resolve remaining references. -""" - -__docformat__ = 'reStructuredText' - -import re -import sys -import time -from docutils import nodes, utils -from docutils.transforms import TransformError, Transform -from docutils.utils import smartquotes - - -if sys.version_info >= (3, 0): - unicode = str # noqa - - -class Decorations(Transform): - - """ - Populate a document's decoration element (header, footer). - """ - - default_priority = 820 - - def apply(self): - header_nodes = self.generate_header() - if header_nodes: - decoration = self.document.get_decoration() - header = decoration.get_header() - header.extend(header_nodes) - footer_nodes = self.generate_footer() - if footer_nodes: - decoration = self.document.get_decoration() - footer = decoration.get_footer() - footer.extend(footer_nodes) - - def generate_header(self): - return None - - def generate_footer(self): - # @@@ Text is hard-coded for now. - # Should be made dynamic (language-dependent). - # @@@ Use timestamp from the `SOURCE_DATE_EPOCH`_ environment variable - # for the datestamp? - # See https://sourceforge.net/p/docutils/patches/132/ - # and https://reproducible-builds.org/specs/source-date-epoch/ - settings = self.document.settings - if settings.generator or settings.datestamp or settings.source_link \ - or settings.source_url: - text = [] - if settings.source_link and settings._source \ - or settings.source_url: - if settings.source_url: - source = settings.source_url - else: - source = utils.relative_path(settings._destination, - settings._source) - text.extend([ - nodes.reference('', 'View document source', - refuri=source), - nodes.Text('.\n')]) - if settings.datestamp: - datestamp = time.strftime(settings.datestamp, time.gmtime()) - text.append(nodes.Text('Generated on: ' + datestamp + '.\n')) - if settings.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.\n')]) - return [nodes.paragraph('', '', *text)] - else: - return None - - -class ExposeInternals(Transform): - - """ - Expose internal attributes if ``expose_internals`` setting is set. - """ - - 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(self.not_Text): - 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): - - """ - Place any system messages generated after parsing into a dedicated section - of the document. - """ - - default_priority = 860 - - def apply(self): - unfiltered = self.document.transform_messages - threshold = self.document.reporter.report_level - messages = [] - for msg in unfiltered: - if msg['level'] >= threshold and not msg.parent: - messages.append(msg) - if messages: - section = nodes.section(classes=['system-messages']) - # @@@ get this from the language module? - section += nodes.title('', 'Docutils System Messages') - section += messages - self.document.transform_messages[:] = [] - self.document += section - - -class FilterMessages(Transform): - - """ - Remove system messages below verbosity threshold. - """ - - default_priority = 870 - - def apply(self): - for node in tuple(self.document.traverse(nodes.system_message)): - if node['level'] < self.document.reporter.report_level: - node.parent.remove(node) - - -class TestMessages(Transform): - - """ - Append all post-parse system messages to the end of the document. - - Used for testing purposes. - """ - - default_priority = 880 - - def apply(self): - 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 tuple(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 = 420 - - def apply(self): - if self.document.settings.strip_elements_with_classes: - self.strip_elements = set( - self.document.settings.strip_elements_with_classes) - # Iterate over a tuple as removing the current node - # corrupts the iterator returned by `traverse`: - for node in tuple(self.document.traverse(self.check_classes)): - node.parent.remove(node) - - if not self.document.settings.strip_classes: - return - strip_classes = self.document.settings.strip_classes - for node in self.document.traverse(nodes.Element): - for class_value in strip_classes: - try: - node['classes'].remove(class_value) - except ValueError: - pass - - def check_classes(self, node): - if not isinstance(node, nodes.Element): - return False - for class_value in node['classes'][:]: - if class_value in self.strip_elements: - return True - return False - - -class SmartQuotes(Transform): - - """ - Replace ASCII quotation marks with typographic form. - - Also replace multiple dashes with em-dash/en-dash characters. - """ - - default_priority = 850 - - nodes_to_skip = (nodes.FixedTextElement, nodes.Special) - """Do not apply "smartquotes" to instances of these block-level nodes.""" - - literal_nodes = (nodes.FixedTextElement, nodes.Special, - nodes.image, nodes.literal, nodes.math, - nodes.raw, nodes.problematic) - """Do apply smartquotes to instances of these inline nodes.""" - - smartquotes_action = 'qDe' - """Setting to select smartquote transformations. - - The default 'qDe' educates normal quote characters: (", '), - em- and en-dashes (---, --) and ellipses (...). - """ - - def __init__(self, document, startnode): - Transform.__init__(self, document, startnode=startnode) - self.unsupported_languages = set() - - def get_tokens(self, txtnodes): - # A generator that yields ``(texttype, nodetext)`` tuples for a list - # of "Text" nodes (interface to ``smartquotes.educate_tokens()``). - for node in txtnodes: - if (isinstance(node.parent, self.literal_nodes) - or isinstance(node.parent.parent, self.literal_nodes)): - yield ('literal', unicode(node)) - else: - # SmartQuotes uses backslash escapes instead of null-escapes - txt = re.sub('(?<=\x00)([-\\\'".`])', r'\\\1', unicode(node)) - yield ('plain', txt) - - def apply(self): - smart_quotes = self.document.settings.smart_quotes - if not smart_quotes: - return - try: - alternative = smart_quotes.startswith('alt') - except AttributeError: - alternative = False - - document_language = self.document.settings.language_code - lc_smartquotes = self.document.settings.smartquotes_locales - if lc_smartquotes: - smartquotes.smartchars.quotes.update(dict(lc_smartquotes)) - - # "Educate" quotes in normal text. Handle each block of text - # (TextElement node) as a unit to keep context around inline nodes: - for node in self.document.traverse(nodes.TextElement): - # skip preformatted text blocks and special elements: - if isinstance(node, self.nodes_to_skip): - continue - # nested TextElements are not "block-level" elements: - if isinstance(node.parent, nodes.TextElement): - continue - - # list of text nodes in the "text block": - txtnodes = [txtnode for txtnode in node.traverse(nodes.Text) - if not isinstance(txtnode.parent, - nodes.option_string)] - - # language: use typographical quotes for language "lang" - lang = node.get_language_code(document_language) - # use alternative form if `smart-quotes` setting starts with "alt": - if alternative: - if '-x-altquot' in lang: - lang = lang.replace('-x-altquot', '') - else: - lang += '-x-altquot' - # drop unsupported subtags: - for tag in utils.normalize_language_tag(lang): - if tag in smartquotes.smartchars.quotes: - lang = tag - break - else: # language not supported: (keep ASCII quotes) - if lang not in self.unsupported_languages: - self.document.reporter.warning('No smart quotes ' - 'defined for language "%s".'%lang, base_node=node) - self.unsupported_languages.add(lang) - lang = '' - - # Iterator educating quotes in plain text: - # (see "utils/smartquotes.py" for the attribute setting) - teacher = smartquotes.educate_tokens(self.get_tokens(txtnodes), - attr=self.smartquotes_action, language=lang) - - for txtnode, newtext in zip(txtnodes, teacher): - txtnode.parent.replace(txtnode, nodes.Text(newtext, - rawsource=txtnode.rawsource)) - - self.unsupported_languages = set() # reset