Exemplo n.º 1
0
def clean_astext(node: Element) -> str:
    """Like node.astext(), but ignore images."""
    node = node.deepcopy()
    for img in node.findall(nodes.image):
        img['alt'] = ''
    for raw in list(node.findall(nodes.raw)):
        raw.parent.remove(raw)
    return node.astext()
Exemplo n.º 2
0
def extract_messages(doctree: Element) -> Iterable[Tuple[Element, str]]:
    """Extract translatable messages from a document tree."""
    for node in doctree.findall(is_translatable):  # type: Element
        if isinstance(node, addnodes.translatable):
            for msg in node.extract_original_messages():
                yield node, msg
            continue
        if isinstance(node, LITERAL_TYPE_NODES):
            msg = node.rawsource
            if not msg:
                msg = node.astext()
        elif isinstance(node, nodes.image):
            if node.get('alt'):
                yield node, node['alt']
            if node.get('translatable'):
                msg = '.. image:: %s' % node['uri']
            else:
                msg = ''
        elif isinstance(node, META_TYPE_NODES):
            # docutils-0.17 or older
            msg = node.rawcontent
        elif isinstance(node, nodes.pending) and is_pending_meta(node):
            # docutils-0.17 or older
            msg = node.details['nodes'][0].rawcontent
        elif isinstance(node, addnodes.docutils_meta):
            # docutils-0.18+
            msg = node["content"]
        else:
            msg = node.rawsource.replace('\n', ' ').strip()

        # XXX nodes rendering empty are likely a bug in sphinx.addnodes
        if msg:
            yield node, msg
Exemplo n.º 3
0
def traverse_translatable_index(doctree: Element) -> Iterable[Tuple[Element, List["IndexEntry"]]]:  # NOQA
    """Traverse translatable index node from a document tree."""
    matcher = NodeMatcher(addnodes.index, inline=False)
    for node in doctree.findall(matcher):  # type: addnodes.index
        if 'raw_entries' in node:
            entries = node['raw_entries']
        else:
            entries = node['entries']
        yield node, entries
Exemplo n.º 4
0
    def detect(self, document: Element) -> None:
        def is_list_node(node: Node) -> bool:
            return isinstance(node, (nodes.bullet_list, nodes.enumerated_list))

        def has_loose_element(node: Element) -> bool:
            return any(
                isinstance(subnode, addnodes.blankline)
                for subnode in node[1:])

        for node in document.findall(is_list_node):  # type: Element
            children = cast(List[nodes.list_item], node)
            if any(has_loose_element(item) for item in children):
                node['tight'] = False
            else:
                node['tight'] = True

            # detect loose lists in list_items
            for list_item in children:
                self.detect(list_item)
Exemplo n.º 5
0
 def visit_definition_list_item(self, node: Element) -> None:
     self._classifier_count_in_li = len(list(node.findall(
         nodes.classifier)))
Exemplo n.º 6
0
 def visit_term(self, node: Element) -> None:
     if any(node.findall(nodes.strong)):
         self.body.append('\n')
     else:
         super().visit_term(node)