dan mackinlay avatar dan mackinlay committed 91bf814

sketch of modified directive

Comments (0)

Files changed (1)

feed/sphinxcontrib/feed/feeddirectives.py

 
 from docutils import nodes
 
-from sphinx.directives.other import TocTree
+from docutils.parsers.rst import Directive, directives
 
 from feednodes import latest
 
-class Latest(TocTree):
+class Latest(Directive):
     """
     Directive to notify Sphinx about the hierarchical structure of the docs,
     and to include a table-of-contents-like tree in the current document.
     
-    Possibly this should not subclass the TocTree node, but just invoke the
-    same method.
+    Used to be subclassed of TocTree, but now heavily modified from it, to
+    avoid tedious bugs from TocTree's rather special role.
     """
+    has_content = True
+    required_arguments = 0
+    optional_arguments = 0
+    final_argument_whitespace = False
+    option_spec = {
+        # 'maxdepth': int,
+        'glob': directives.flag,
+        # 'hidden': directives.flag,
+        # 'numbered': int_or_nothing,
+        'titlesonly': directives.flag,
+    }
+
     def run(self):
-        ret = super(Latest, self).run()
-        #extract the tocnode. We not want.
-        #Could we even expand it to a full hierarchy here?
-        tocnode = ret[0][0]
+        env = self.state.document.settings.env
+        suffix = env.config.source_suffix
+        glob = 'glob' in self.options
+        
         tocatts = tocnode.non_default_attributes()
         latestnode = latest()
         for key, val in tocatts.iteritems():
             latestnode[key] = val
+
+        ret = []
+        # (title, ref) pairs, where ref may be a document, or an external link,
+        # and title may be None if the document's title is to be used
+        entries = []
+        includefiles = []
+        all_docnames = env.found_docs.copy()
+        # don't add the currently visited file in catch-all patterns
+        all_docnames.remove(env.docname)
+        for entry in self.content:
+            if not entry:
+                continue
+            if not glob:
+                # look for explicit titles ("Some Title <document>")
+                m = explicit_title_re.match(entry)
+                if m:
+                    ref = m.group(2)
+                    title = m.group(1)
+                    docname = ref
+                else:
+                    ref = docname = entry
+                    title = None
+                # remove suffixes (backwards compatibility)
+                if docname.endswith(suffix):
+                    docname = docname[:-len(suffix)]
+                # absolutize filenames
+                docname = docname_join(env.docname, docname)
+                if url_re.match(ref) or ref == 'self':
+                    entries.append((title, ref))
+                elif docname not in env.found_docs:
+                    ret.append(self.state.document.reporter.warning(
+                        'toctree contains reference to nonexisting '
+                        'document %r' % docname, line=self.lineno))
+                    env.note_reread()
+                else:
+                    entries.append((title, docname))
+                    includefiles.append(docname)
+            else:
+                patname = docname_join(env.docname, entry)
+                docnames = sorted(patfilter(all_docnames, patname))
+                for docname in docnames:
+                    all_docnames.remove(docname) # don't include it again
+                    entries.append((None, docname))
+                    includefiles.append(docname)
+                if not docnames:
+                    ret.append(self.state.document.reporter.warning(
+                        'toctree glob pattern %r didn\'t match any documents'
+                        % entry, line=self.lineno))
+        subnode = addnodes.toctree()
+        subnode['parent'] = env.docname
+        # entries contains all entries (self references, external links etc.)
+        subnode['entries'] = entries
+        # includefiles only entries that are documents
+        subnode['includefiles'] = includefiles
+        subnode['maxdepth'] = self.options.get('maxdepth', -1)
+        subnode['glob'] = glob
+        subnode['hidden'] = 'hidden' in self.options
+        subnode['numbered'] = self.options.get('numbered', 0)
+        subnode['titlesonly'] = 'titlesonly' in self.options
+        set_source_info(self, subnode)
         wrappernode = nodes.compound(classes=['latest-wrapper'])
         wrappernode.append(latestnode)
         ret.append(wrappernode)
         return ret
-
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.