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