Example #1
0
    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
Example #2
0
    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('"', '&quot;')
            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
Example #3
0
    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('"', '&quot;')
            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('"', '&quot;')
            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
Example #4
0
 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)
Example #5
0
 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']
Example #6
0
    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)
Example #7
0
 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
Example #8
0
    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()