87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# This is a hack of the builtin todo extension, to make the todo_list more user friendly
|
|
|
|
from sphinx.ext.todo import *
|
|
from docutils.parsers.rst import directives
|
|
|
|
def _(s):
|
|
return s
|
|
|
|
def process_todo_nodes(app, doctree, fromdocname):
|
|
if not app.config['todo_include_todos']:
|
|
for node in doctree.traverse(todo_node):
|
|
node.parent.remove(node)
|
|
|
|
# Replace all todolist nodes with a list of the collected todos.
|
|
# Augment each todo with a backlink to the original location.
|
|
env = app.builder.env
|
|
|
|
if not hasattr(env, 'todo_all_todos'):
|
|
env.todo_all_todos = []
|
|
|
|
my_todo_list = nodes.bullet_list("", nodes.Text('',''));
|
|
|
|
# remove the item that was added in the constructor, since I'm tired of
|
|
# reading through docutils for the proper way to construct an empty list
|
|
my_todo_list.remove(my_todo_list[0])
|
|
|
|
my_todo_list.set_class('todo_list')
|
|
for node in doctree.traverse(todolist):
|
|
if not app.config['todo_include_todos']:
|
|
node.replace_self([])
|
|
continue
|
|
|
|
content = []
|
|
|
|
for todo_info in env.todo_all_todos:
|
|
para = nodes.paragraph()
|
|
filename = env.doc2path(todo_info['docname'], base=None)
|
|
|
|
# Create a reference
|
|
newnode = nodes.reference('', '')
|
|
|
|
link = _('%s, line %d') % (filename, todo_info['lineno']);
|
|
innernode = nodes.emphasis(link, link)
|
|
newnode['refdocname'] = todo_info['docname']
|
|
|
|
try:
|
|
newnode['refuri'] = app.builder.get_relative_uri(
|
|
fromdocname, todo_info['docname'])
|
|
newnode['refuri'] += '#' + todo_info['target']['refid']
|
|
except NoUri:
|
|
# ignore if no URI can be determined, e.g. for LaTeX output
|
|
pass
|
|
|
|
newnode.append(innernode)
|
|
para += newnode
|
|
para.set_class("link")
|
|
|
|
todo_entry = todo_info['todo']
|
|
|
|
env.resolve_references(todo_entry, todo_info['docname'], app.builder)
|
|
|
|
item = nodes.list_item("", para)
|
|
todo_entry[1].set_class("details")
|
|
item.append(todo_entry[1])
|
|
|
|
my_todo_list.insert(0, item)
|
|
|
|
|
|
node.replace_self(my_todo_list)
|
|
|
|
def setup(app):
|
|
app.add_config_value('todo_include_todos', False, False)
|
|
|
|
app.add_node(todolist)
|
|
app.add_node(todo_node,
|
|
html=(visit_todo_node, depart_todo_node),
|
|
latex=(visit_todo_node, depart_todo_node),
|
|
text=(visit_todo_node, depart_todo_node))
|
|
|
|
app.add_directive('todo', Todo)
|
|
app.add_directive('todolist', TodoList)
|
|
app.connect('doctree-read', process_todos)
|
|
app.connect('doctree-resolved', process_todo_nodes)
|
|
app.connect('env-purge-doc', purge_todos)
|
|
|