Exemplo n.º 1
0
def clean_astext(node: Element) -> str:
    """Like node.astext(), but ignore images."""
    node = node.deepcopy()
    for img in node.traverse(nodes.image):
        img['alt'] = ''
    for raw in node.traverse(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.traverse(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 = None
        elif isinstance(node, META_TYPE_NODES):
            msg = node.rawcontent
        elif isinstance(node, nodes.pending) and is_pending_meta(node):
            msg = node.details['nodes'][0].rawcontent
        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[str]]]:
    """Traverse translatable index node from a document tree."""
    for node in doctree.traverse(NodeMatcher(addnodes.index, inline=False)):  # type: addnodes.index  # NOQA
        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.traverse(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_term(self, node: Element) -> None:
     if node.traverse(nodes.strong):
         self.body.append('\n')
     else:
         super().visit_term(node)
Exemplo n.º 6
0
 def visit_definition_list_item(self, node: nodes.Element) -> None:
     self._classifier_count_in_li = len(node.traverse(nodes.classifier))