[Python-checkins] r59526 - in doctools/trunk/sphinx: builder.py directives.py environment.py latexwriter.py texinputs/python.sty
georg.brandl
python-checkins at python.org
Sun Dec 16 13:20:41 CET 2007
Author: georg.brandl
Date: Sun Dec 16 13:20:41 2007
New Revision: 59526
Modified:
doctools/trunk/sphinx/builder.py
doctools/trunk/sphinx/directives.py
doctools/trunk/sphinx/environment.py
doctools/trunk/sphinx/latexwriter.py
doctools/trunk/sphinx/texinputs/python.sty
Log:
Implement index entries, production lists and the glossary.
Modified: doctools/trunk/sphinx/builder.py
==============================================================================
--- doctools/trunk/sphinx/builder.py (original)
+++ doctools/trunk/sphinx/builder.py Sun Dec 16 13:20:41 2007
@@ -143,14 +143,14 @@
"""Load necessary templates and perform initialization."""
raise NotImplementedError
- def get_target_uri(self, source_filename):
+ def get_target_uri(self, source_filename, typ=None):
"""Return the target URI for a source filename."""
raise NotImplementedError
- def get_relative_uri(self, from_, to):
+ def get_relative_uri(self, from_, to, typ=None):
"""Return a relative URI between two source filenames."""
return relative_uri(self.get_target_uri(from_),
- self.get_target_uri(to))
+ self.get_target_uri(to, typ))
def get_outdated_files(self):
"""Return a list of output files that are outdated."""
@@ -195,10 +195,11 @@
self.load_env()
to_build = list(self.get_outdated_files())
if not to_build:
- self.msg('no files are out of date, exiting.')
+ self.msg('no target files are out of date, exiting.')
return
self.build(to_build,
- summary='%d source files that are out of date' % len(to_build))
+ summary='targets for %d source files that are '
+ 'out of date' % len(to_build))
def build(self, filenames, summary=None):
if summary:
@@ -482,7 +483,7 @@
# --------- these are overwritten by the Web builder
- def get_target_uri(self, source_filename):
+ def get_target_uri(self, source_filename, typ=None):
return source_filename[:-4] + '.html'
def get_outdated_files(self):
@@ -561,7 +562,7 @@
os_path(filename))) > targetmtime:
yield filename
- def get_target_uri(self, source_filename):
+ def get_target_uri(self, source_filename, typ=None):
if source_filename == 'index.rst':
return ''
if source_filename.endswith(SEP+'index.rst'):
@@ -650,10 +651,14 @@
self.filenames = []
def get_outdated_files(self):
- # always rebuild everything for now
+ # XXX always rebuild everything for now
return self.env.all_files
- def get_target_uri(self, source_filename):
+ def get_target_uri(self, source_filename, typ=None):
+ if typ == 'token':
+ # token references are always inside production lists and must be
+ # replaced by \token{} in LaTeX
+ return '@token'
if source_filename not in self.filenames:
raise NoUri
else:
@@ -661,7 +666,7 @@
def get_document_data(self):
for toplevel in ["c-api", "distutils", "documenting", "extending",
- "install", "reference", "tutorial", "using", "library"]:
+ "install", "reference", "tutorial", "using", "library"]:
yield (toplevel + SEP + 'index.rst', toplevel+'.tex', 'manual')
yield ('whatsnew' + SEP + self.config['version'] + '.rst',
'whatsnew.tex', 'howto')
@@ -722,6 +727,7 @@
largetree.extend(specials)
print
print "resolving references..."
+ # XXX problem here: :ref:s to distant PDF
self.env.resolve_references(largetree, indexfile, self)
return largetree
Modified: doctools/trunk/sphinx/directives.py
==============================================================================
--- doctools/trunk/sphinx/directives.py (original)
+++ doctools/trunk/sphinx/directives.py Sun Dec 16 13:20:41 2007
@@ -37,18 +37,20 @@
targetnode = nodes.target('', '', ids=[targetid])
state.document.note_explicit_target(targetnode)
indexnode = addnodes.index()
- indexnode['entries'] = arguments
+ indexnode['entries'] = ne = []
for entry in arguments:
entry = entry.strip()
for type in entrytypes:
if entry.startswith(type+':'):
value = entry[len(type)+1:].strip()
env.note_index_entry(type, value, targetid, value)
+ ne.append((type, value, targetid, value))
break
# shorthand notation for single entries
else:
for value in entry.split(','):
env.note_index_entry('single', value.strip(), targetid, value.strip())
+ ne.append(('single', value.strip(), targetid, value.strip()))
return [indexnode, targetnode]
index_directive.arguments = (1, 0, 1)
Modified: doctools/trunk/sphinx/environment.py
==============================================================================
--- doctools/trunk/sphinx/environment.py (original)
+++ doctools/trunk/sphinx/environment.py Sun Dec 16 13:20:41 2007
@@ -52,7 +52,7 @@
# This is increased every time a new environment attribute is added
# to properly invalidate pickle files.
-ENV_VERSION = 12
+ENV_VERSION = 13
def walk_depth(node, depth, maxdepth):
@@ -620,7 +620,7 @@
newnode['refid'] = labelid
else:
newnode['refuri'] = builder.get_relative_uri(
- docfilename, filename) + '#' + labelid
+ docfilename, filename, typ) + '#' + labelid
newnode.append(contnode)
elif typ == 'mod':
filename, synopsis, platform, deprecated = \
Modified: doctools/trunk/sphinx/latexwriter.py
==============================================================================
--- doctools/trunk/sphinx/latexwriter.py (original)
+++ doctools/trunk/sphinx/latexwriter.py Sun Dec 16 13:20:41 2007
@@ -97,7 +97,7 @@
'papersize': 'a4paper', # XXX
'pointsize': '12pt',
'filename': document.settings.filename,
- 'title': None, # comes later
+ 'title': None, # is determined later
'release': config['release'],
'date': time.strftime(config.get('today_fmt', '%B %d, %Y')),
}
@@ -109,6 +109,7 @@
# flags
self.verbatim = None
self.in_title = 0
+ self.in_production_list = 0
self.first_document = 1
self.this_is_the_title = 1
self.literal_whitespace = 0
@@ -156,10 +157,24 @@
raise nodes.SkipNode # XXX
def visit_glossary(self, node):
- raise nodes.SkipNode # XXX
+ pass
+ def depart_glossary(self, node):
+ pass
def visit_productionlist(self, node):
- raise nodes.SkipNode # XXX
+ self.body.append('\n\n\\begin{productionlist}\n')
+ self.in_production_list = 1
+ def depart_productionlist(self, node):
+ self.body.append('\\end{productionlist}\n\n')
+ self.in_production_list = 0
+
+ def visit_production(self, node):
+ if node['tokenname']:
+ self.body.append('\\production{%s}{' % self.encode(node['tokenname']))
+ else:
+ self.body.append('\\productioncont{')
+ def depart_production(self, node):
+ self.body.append('}\n')
def visit_transition(self, node):
self.body.append('\n\n\\bigskip\\hrule{}\\bigskip\n\n')
@@ -410,9 +425,10 @@
pass
def visit_term(self, node):
+ if node.has_key('ids') and node['ids']:
+ self.body.append('\\hypertarget{%s}{}' % node['ids'][0])
self.body.append('\\item[')
def depart_term(self, node):
- # definition list term.
self.body.append(']\n')
def visit_classifier(self, node):
@@ -461,27 +477,60 @@
self.body.append(self.context.pop())
def visit_target(self, node):
- # XXX: no "index-" targets
+ def add_target(id):
+ # indexing uses standard LaTeX index markup, so the targets
+ # will be generated differently
+ if not id.startswith('index-'):
+ self.body.append(r'\hypertarget{%s}{' % id)
+ return '}'
+ return ''
+
+ # XXX specialcase 'module-' targets: add \declaremodule
+ # XXX where to put \makemodindex
+
if not (node.has_key('refuri') or node.has_key('refid')
or node.has_key('refname')):
ctx = ''
for id in node['ids']:
if id not in self.written_ids:
- self.body.append(r'\hypertarget{%s}{' % id)
self.written_ids.add(id)
- ctx += '}'
+ ctx += add_target(id)
self.context.append(ctx)
elif node.has_key('refid') and node['refid'] not in self.written_ids:
- self.body.append(r'\hypertarget{%s}{' % node['refid'])
+ self.context.append(add_target(node['refid']))
self.written_ids.add(node['refid'])
- self.context.append('}')
else:
self.context.append('')
def depart_target(self, node):
self.body.append(self.context.pop())
- def visit_index(self, node):
- raise nodes.SkipNode # XXX
+ indextype_map = {
+ 'module': 'refmodindex', # XXX: key?
+ 'keyword': 'kwindex',
+ 'operator': 'opindex',
+ 'object': 'obindex',
+ 'exception': 'exindex',
+ 'statement': 'stindex',
+ 'builtin': 'bifuncindex',
+ }
+
+ def visit_index(self, node, scre=re.compile(r';\s*')):
+ entries = node['entries']
+ for type, string, tid, _ in entries:
+ if type == 'single':
+ self.body.append(r'\index{%s}' % scre.sub('!', self.encode(string)))
+ elif type == 'pair':
+ parts = tuple(self.encode(x.strip()) for x in string.split(';', 1))
+ self.body.append(r'\indexii{%s}{%s}' % parts)
+ elif type == 'triple':
+ parts = tuple(self.encode(x.strip()) for x in string.split(';', 2))
+ self.body.append(r'\indexiii{%s}{%s}{%s}' % parts)
+ elif type in self.indextype_map:
+ self.body.append(r'\%s{%s}' % (self.indextype_map[type],
+ self.encode(string)))
+ else:
+ raise RuntimeError('XXX unknown index entry type')
+ raise nodes.SkipNode
def visit_reference(self, node):
uri = node.get('refuri', '')
@@ -493,6 +542,12 @@
elif uri.startswith('#'):
self.body.append('\\hyperlink{%s}{' % uri[1:])
self.context.append('}')
+ elif uri.startswith('@token'):
+ if self.in_production_list:
+ self.body.append('\\token{')
+ else:
+ self.body.append('\\grammartoken{')
+ self.context.append('}')
else:
raise RuntimeError('XXX malformed reference target %s' % uri)
def depart_reference(self, node):
Modified: doctools/trunk/sphinx/texinputs/python.sty
==============================================================================
--- doctools/trunk/sphinx/texinputs/python.sty (original)
+++ doctools/trunk/sphinx/texinputs/python.sty Sun Dec 16 13:20:41 2007
@@ -855,26 +855,26 @@
% Use this def/redef approach for \url{} since hyperref defined this already,
% but only if we actually used hyperref:
-\ifpdf
- \newcommand{\url}[1]{{%
- \py at pdfstartlink%
- attr{ /Border [0 0 0] }%
- user{%
- /Subtype/Link%
- /A<<%
- /Type/Action%
- /S/URI%
- /URI(#1)%
- >>%
- }%
- \py at LinkColor% color of the link text
- \py at smallsize\sf #1%
- \py at NormalColor% Turn it back off; these are declarative
- \pdfendlink}% and don't appear bound to the current
- }% formatting "box".
-\else
- \newcommand{\url}[1]{\mbox{\py at smallsize\textsf{#1}}}
-\fi
+%\ifpdf
+% \newcommand{\url}[1]{{%
+% \py at pdfstartlink%
+% attr{ /Border [0 0 0] }%
+% user{%
+% /Subtype/Link%
+% /A<<%
+% /Type/Action%
+% /S/URI%
+% /URI(#1)%
+% >>%
+% }%
+% \py at LinkColor% color of the link text
+% \py at smallsize\sf #1%
+% \py at NormalColor% Turn it back off; these are declarative
+% \pdfendlink}% and don't appear bound to the current
+% }% formatting "box".
+%\else
+% \newcommand{\url}[1]{\mbox{\py at smallsize\textsf{#1}}}
+%\fi
\newcommand{\email}[1]{{\py at smallsize\textsf{#1}}}
\newcommand{\newsgroup}[1]{{\py at smallsize\textsf{#1}}}
More information about the Python-checkins
mailing list