def make_xrefs(self, rolename: str, domain: str, target: str, innernode: "Type[TextlikeNode]" = nodes.emphasis, contnode: Node = None, env: BuildEnvironment = None) -> List[Node]: delims = r'(\s*[\[\]\(\),](?:\s*or\s)?\s*|\s+or\s+)' delims_re = re.compile(delims) sub_targets = re.split(delims, target) split_contnode = bool(contnode and contnode.astext() == target) results = [] for sub_target in filter(None, sub_targets): if split_contnode: contnode = nodes.Text(sub_target) if delims_re.match(sub_target): results.append(contnode or innernode(sub_target, sub_target)) else: results.append( self.make_xref(rolename, domain, sub_target, innernode, contnode, env)) return results
def write_toc(self, node: Node, indentlevel: int = 4) -> List[str]: parts = [] # type: List[str] if isinstance(node, nodes.list_item) and self.isdocnode(node): compact_paragraph = cast(addnodes.compact_paragraph, node[0]) reference = cast(nodes.reference, compact_paragraph[0]) link = reference['refuri'] title = html.escape(reference.astext()).replace('"', '"') item = '<section title="%(title)s" ref="%(ref)s">' % \ {'title': title, 'ref': link} parts.append(' ' * 4 * indentlevel + item) bullet_list = cast(nodes.bullet_list, node[1]) list_items = cast(Iterable[nodes.list_item], bullet_list) for list_item in list_items: parts.extend(self.write_toc(list_item, indentlevel + 1)) parts.append(' ' * 4 * indentlevel + '</section>') elif isinstance(node, nodes.list_item): for subnode in node: parts.extend(self.write_toc(subnode, indentlevel)) elif isinstance(node, nodes.reference): link = node['refuri'] title = html.escape(node.astext()).replace('"', '"') item = section_template % {'title': title, 'ref': link} item = ' ' * 4 * indentlevel + item parts.append(item.encode('ascii', 'xmlcharrefreplace').decode()) elif isinstance(node, nodes.bullet_list): for subnode in node: parts.extend(self.write_toc(subnode, indentlevel)) elif isinstance(node, addnodes.compact_paragraph): for subnode in node: parts.extend(self.write_toc(subnode, indentlevel)) return parts
def dispatch_visit(self, node: Node) -> None: if isinstance(node, nodes.comment): raise nodes.SkipNode elif isinstance(node, nodes.raw): if 'html' in node.get('format', '').split(): # Some people might put content in raw HTML that should be searched, # so we just amateurishly strip HTML tags and index the remaining # content nodetext = re.sub(r'(?is)<style.*?</style>', '', node.astext()) nodetext = re.sub(r'(?is)<script.*?</script>', '', nodetext) nodetext = re.sub(r'<[^<]+?>', '', nodetext) self.found_words.extend(self.lang.split(nodetext)) raise nodes.SkipNode elif isinstance(node, nodes.Text): self.found_words.extend(self.lang.split(node.astext())) elif isinstance(node, nodes.title): self.found_title_words.extend(self.lang.split(node.astext())) elif isinstance(node, addnodes.meta) and self.is_meta_keywords(node): keywords = node['content'] keywords = [keyword.strip() for keyword in keywords.split(',')] self.found_words.extend(keywords)
def write_toc(node: nodes.Node, parent: etree.Element): if isinstance(node, addnodes.compact_paragraph) or \ isinstance(node, nodes.bullet_list): for subnode in node: write_toc(subnode, parent) elif isinstance(node, nodes.list_item): item = etree.SubElement(parent, 'topic') for subnode in node: write_toc(subnode, item) elif isinstance(node, nodes.reference): parent.attrib['label'] = node.astext() parent.attrib['href'] = base_dir + node['refuri']
def _update_ref(self, node: Node, labelid: str) -> None: source_attr = self.env.exercise_list[labelid] source_node = source_attr.get("node", Node) if is_linked_node(source_node): default_title = "Solution to " target_labelid = source_node.get("target_label", "") target_attr = self.env.exercise_list[target_labelid] target_node = target_attr.get("node", Node) if is_enumerable_node( target_node) and node.astext() == default_title: node.replace(node[0], source_node[0][0][0]) return if is_unenumerable_node( target_node) and node.astext() == default_title: if target_attr.get("title"): if self._has_math_child(target_node[0]): title = self._update_title(target_node[0]) title.insert(0, nodes.Text(default_title, default_title)) node.replace(node[0], title) else: text = target_attr.get("title", "") node[0].insert(len(node[0]), nodes.Text(text, text)) else: node[0].insert(len(node[0]), nodes.Text("Exercise", "Exercise")) else: # If no node.astext() simply add "Exercise" if is_enumerable_node(source_node) and not node.astext(): text = nodes.Text("Exercise", "Exercise") node[0].insert(0, text) return if ":math:" in node.astext(): title = self._update_title(source_node[0]) node.replace(node[0], title)
def get_refnodes(self, doctree: Node, result: List[Dict[str, Any]]) -> List[Dict[str, Any]]: # NOQA """Collect section titles, their depth in the toc and the refuri.""" # XXX: is there a better way than checking the attribute # toctree-l[1-8] on the parent node? if isinstance(doctree, nodes.reference) and doctree.get('refuri'): refuri = doctree['refuri'] if refuri.startswith('http://') or refuri.startswith('https://') \ or refuri.startswith('irc:') or refuri.startswith('mailto:'): return result classes = doctree.parent.attributes['classes'] for level in range(8, 0, -1): # or range(1, 8)? if (self.toctree_template % level) in classes: result.append({ 'level': level, 'refuri': html.escape(refuri), 'text': ssp(html.escape(doctree.astext())) }) break elif isinstance(doctree, nodes.Element): for elem in doctree: result = self.get_refnodes(elem, result) return result
def visit_title(self, node: nodes.Node) -> None: symbol = self.current_symbol has_parent = True if symbol is None: has_parent = False symbol = self.push_symbol() name = node.astext() line = (node.line or 1) - 1 symbol.name = name symbol.range.start.line = line symbol.range.end.line = line symbol.range.end.character = len(name) - 1 symbol.selection_range.start.line = line symbol.selection_range.end.line = line symbol.selection_range.end.character = len(name) - 1 if not has_parent: self.pop_symbol()