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()
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
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
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)
def visit_term(self, node: Element) -> None: if node.traverse(nodes.strong): self.body.append('\n') else: super().visit_term(node)
def visit_definition_list_item(self, node: nodes.Element) -> None: self._classifier_count_in_li = len(node.traverse(nodes.classifier))