Author: wiemann Date: 2007-08-15 23:39:08 +0200 (Wed, 15 Aug 2007) New Revision: 5397 Added: branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/ branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/*funny*-filename.txt branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/empty.txt branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/multi-3.txt branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/recursive-1.txt branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/recursive-2.txt branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/single-1.txt branches/subdocs/test/test_parsers/test_rst/test_directives/subdocs/single-2.txt branches/subdocs/test/test_parsers/test_rst/test_directives/test_subdocs.py Modified: branches/subdocs/docutils/parsers/rst/directives/__init__.py branches/subdocs/docutils/parsers/rst/directives/admonitions.py branches/subdocs/docutils/parsers/rst/directives/parts.py branches/subdocs/docutils/parsers/rst/languages/af.py branches/subdocs/docutils/parsers/rst/languages/ca.py branches/subdocs/docutils/parsers/rst/languages/cs.py branches/subdocs/docutils/parsers/rst/languages/de.py branches/subdocs/docutils/parsers/rst/languages/en.py branches/subdocs/docutils/parsers/rst/languages/eo.py branches/subdocs/docutils/parsers/rst/languages/es.py branches/subdocs/docutils/parsers/rst/languages/fi.py branches/subdocs/docutils/parsers/rst/languages/fr.py branches/subdocs/docutils/parsers/rst/languages/he.py branches/subdocs/docutils/parsers/rst/languages/it.py branches/subdocs/docutils/parsers/rst/languages/ja.py branches/subdocs/docutils/parsers/rst/languages/nl.py branches/subdocs/docutils/parsers/rst/languages/pt_br.py branches/subdocs/docutils/parsers/rst/languages/ru.py branches/subdocs/docutils/parsers/rst/languages/sk.py branches/subdocs/docutils/parsers/rst/languages/sv.py branches/subdocs/docutils/parsers/rst/languages/zh_cn.py branches/subdocs/docutils/parsers/rst/languages/zh_tw.py branches/subdocs/docutils/parsers/rst/states.py branches/subdocs/docutils/readers/standalone.py branches/subdocs/docutils/utils.py branches/subdocs/test/DocutilsTestSupport.py branches/subdocs/test/functional/expected/standalone_rst_html4css1.html branches/subdocs/test/functional/expected/standalone_rst_latex.tex branches/subdocs/test/functional/expected/standalone_rst_pseudoxml.txt branches/subdocs/test/functional/input/data/standard.txt Log: added docset-root directive; finished implementation of subdocs directive, including all error handling and tests; changed directive parser so that if option_spec == {} (as opposed to None), space is still reserved for options, i.e. there must be a blank line before the content block Modified: branches/subdocs/docutils/parsers/rst/directives/__init__.py =================================================================== --- branches/subdocs/docutils/parsers/rst/directives/__init__.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/directives/__init__.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -46,6 +46,7 @@ 'header': ('parts', 'Header'), 'footer': ('parts', 'Footer'), 'subdocs': ('parts', 'Subdocuments'), + 'docset-root': ('parts', 'DocsetRoot'), #'footnotes': ('parts', 'footnotes'), #'citations': ('parts', 'citations'), 'target-notes': ('references', 'TargetNotes'), Modified: branches/subdocs/docutils/parsers/rst/directives/admonitions.py =================================================================== --- branches/subdocs/docutils/parsers/rst/directives/admonitions.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/directives/admonitions.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -19,7 +19,7 @@ required_arguments = 0 optional_arguments = 0 final_argument_whitespace = True - option_spec = {} + option_spec = None has_content = True node_class = None Modified: branches/subdocs/docutils/parsers/rst/directives/parts.py =================================================================== --- branches/subdocs/docutils/parsers/rst/directives/parts.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/directives/parts.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -1,5 +1,6 @@ # $Id$ -# Authors: David Goodger <go...@py...>; Dmitry Jemerov +# Authors: David Goodger <go...@py...>; +# Lea Wiemann <LeW...@gm...>; Dmitry Jemerov # Copyright: This module has been placed in the public domain. """ @@ -8,10 +9,14 @@ __docformat__ = 'reStructuredText' -from docutils import nodes, languages +import os.path + +from docutils import nodes, languages, utils +from docutils.io import FileInput from docutils.transforms import parts -from docutils.parsers.rst import Directive +from docutils.parsers.rst import Directive, Parser from docutils.parsers.rst import directives, states +from docutils.readers import standalone class Contents(Directive): @@ -128,45 +133,27 @@ """Include sub-documents at the current position.""" has_content = True - option_spec = {'inherit': directives.flag} + # Reserve space for future options. + option_spec = {} def run(self): - if self.reader is None: - raise self.warning('No document reader has been specified; ' - 'therefore, the "%s" directive is unavailable.' - % self.name) self.assert_has_content() - if 'inherit' in self.options: - raise self.error('Error in "%s" directive: :inherit: option not' - 'yet implemented.' % self.name) bullets = states.Body.patterns['bullet'] bullet = self.content[0][0] - # Not necessary. REMOVEME. -# print bullet, bullets -# if not bullet in bullets: -# raise self.content_error( -# 'directive must contain exactly one bullet list') bullet_list = nodes.bullet_list('\n'.join(self.content), bullet=bullet) - newline_offset, blank_finish = self.state.nested_list_parse( - self.content, self.content_offset, bullet_list, - initial_state='SubdocumentsSpec', blank_finish=True) - # XXX this does not work. Why? -# if newline_offset != len(self.block_text.splitlines()): -# raise self.content_error( -# 'directive must contain exactly one bullet list') + try: + newline_offset, blank_finish = self.state.nested_list_parse( + self.content, self.content_offset, bullet_list, + initial_state='SubdocumentsSpec', blank_finish=True) + except states.SubdocumentsSpecError, e: + raise self.error('Error with "%s" directive, line %s: %s' + % (self.name, e.line, e.msg)) + if newline_offset != len(self.content) + self.content_offset: + raise self.error('Error with "%s" directive: must contain a ' + 'bullet list.' % self.name) return self.interpret_bullet_list(bullet_list) - def content_error(self, message): # , node - return self.error( - 'Error with %s directive: %s.' % (self.name, message)) - # XXX How do we report an error with the particular node it - # occurred at, not with the whole directive? - #msg_node = self.state.reporter.system_message(3, message_text) - #source_line = self.state_machine.input_lines[node.LINE_NUMBER?] - #msg_node += nodes.literal_block(node.rawsource, node.rawsource) # does not work - #return msg_node - def interpret_bullet_list(self, bullet_list): """ Interpret the bullet list, read the sub-documents, and return a @@ -180,84 +167,114 @@ and isinstance(item[0], nodes.paragraph) \ and len(item[0]) == 1 file_name = item[0].astext() - # Expect field lists -- implement later: -# # Parse field list. -# sections += self.interpret_field_list(item[0]) -# # Parse nested bullet list. -# assert len(item) != 2, 'nested sub-documents not yet implemented' - sections += self.read_subdocument({'file': file_name}) - assert len(sections) + subdoc_sections = self.read_subdocument(file_name) + assert len(subdoc_sections) + sections += subdoc_sections if len(item) > 1: assert len(item) == 2 and isinstance(item[1], nodes.bullet_list) - if len(sections) > 1: + if len(subdoc_sections) > 1: raise self.error('cannot have nested sub-documents ' 'since "%s" contains more than one ' 'section' % file_name) - sections[0] += self.interpret_bullet_list(item[1]) + subdoc_sections[0] += self.interpret_bullet_list(item[1]) return sections -# def interpret_field_list(self, field_list): -# """ -# Parse the field list, read the sub-document specified, and -# return a list of sections. -# """ -# assert isinstance(field_list, nodes.field_list) -# options = {} -# allowed_options = ('file',) -# required_options = ('file',) -# for field in field_list: -# field_name, field_body = field -# option = field_name.astext() -# # XXX HACK -- field bodies should be left unparsed instead -# # (how do we do this?) -# assert isinstance(field_body[0], nodes.paragraph) -# value = field_body[0].rawsource -# if not option in allowed_options: -# raise self.content_error( -# '"%s" is not a valid option; must be one of %s' -# % (option, -# ', '.join(['"%s"' % o for o in allowed_options]))) -# if option in options: -# raise self.content_error('duplicate option: "%s"' % option) -# if not value: -# raise self.content_error( -# 'value expected for "%s" option' % option) -# options[option] = value -# return self.read_subdocument(options) - - def read_subdocument(self, options): + def read_subdocument(self, file_name): # Perhaps this should be moved into the reader. - from docutils.readers import standalone - from docutils.io import FileInput - reader = standalone.Reader(parser_name='rst') - file_name = options['file'] + document = self.state_machine.document + subdoc_reader = standalone.Reader( + parser_name='rst', docset_root=document.get('docset_root')) + if not os.path.isabs(file_name): + if not document.hasattr('docset_root'): + raise self.error('a docset root must be declared using the ' + '"docset-root" directive before ' + 'referencing sub-documents') + # Not *quite* true; absolute paths are still allowed. ;-> + file_name = os.path.join(document['docset_root'], file_name) + file_name = utils.normalize_path(file_name) + # Test for recursion. + subdoc_reader.subdoc_stack = ( + hasattr(self.reader, 'subdoc_stack') + and self.reader.subdoc_stack or []) + if self.reader and self.reader.source and \ + self.reader.source.source_path: + subdoc_reader.subdoc_stack.append(os.path.normcase( + os.path.abspath(self.reader.source.source_path))) + if os.path.normcase(os.path.abspath(file_name)) in \ + subdoc_reader.subdoc_stack: + raise self.error('Error in "%s" directive: Recursive subdocument ' + 'inclusion: "%s"' % (self.name, file_name)) try: - # TODO make paths relative to document root source = FileInput(source_path=file_name, handle_io_errors=False, - encoding=self.reader.source.encoding) + # None or current encoding + encoding=(self.reader and self.reader.source + and self.reader.source.encoding)) except IOError, error: - raise self.content_error('could not read file "%s": %s' - % (file_name, error)) - subdocument = reader.read(source=source, parser=None, - settings=self.state.document.settings) + raise self.error( + 'Error with "%s" directive: could not read file "%s": %s' + % (self.name, file_name, error)) + subdoc_settings = self.state.document.settings.copy() + subdoc_settings.doctitle_xform = True + subdocument = subdoc_reader.read( + source=source, parser=Parser(subdoc_reader), + settings=subdoc_settings) if len(subdocument) >= 1 and isinstance(subdocument[0], nodes.title): # Single document title. + attributes = {} + for att in 'ids', 'names', 'source': + if subdocument.hasattr(att): + attributes[att] = subdocument[att] section = nodes.section( subdocument.rawsource, *subdocument.children, - **subdocument.attributes) + **attributes) return [section] - elif (len(subdocument) >= 1 - # at least one section: - and [n for n in subdocument if isinstance(n, nodes.section)] + elif (# at least one section: + [n for n in subdocument if isinstance(n, nodes.section)] # only sections and transitions: and not [n for n in subdocument if not isinstance(n, (nodes.section, nodes.transition))]): + for section in subdocument.children: + if not isinstance(section, nodes.section): continue + section['source'] = subdocument['source'] return subdocument.children else: - raise self.content_error( - 'problem with file "%s": a sub-document must either ' - 'have a single document-title, or it must consist of one ' - 'or more top-level sections and optionally transitions' - % file_name) + raise self.error( + 'Error with "%s" directive, file "%s": a sub-document must ' + 'either have a single document-title, or it must consist of ' + 'one or more top-level sections and optionally transitions.' + % (self.name, file_name)) + + +class DocsetRoot(Directive): + + """ + Specify the root of the docset (used by the subdocs directive). + """ + + required_arguments = 1 + final_argument_whitespace = True + + def run(self): + path = self.arguments[0] + if not os.path.isabs(path): + if self.reader is None or self.reader.source is None or \ + self.reader.source.source_path is None: + # This could happen when called programmatically. + raise self.error('relative docset roots are prohibited if ' + 'the document source path ' + '(reader.source.source_path) cannot be ' + 'determined') + path = os.path.join( + os.path.dirname(self.reader.source.source_path), path) + path = utils.normalize_path(path) + document = self.state_machine.document + if not document.hasattr('docset_root'): + document['docset_root'] = path + elif os.path.normcase(os.path.abspath(document['docset_root'])) != \ + os.path.normcase(os.path.abspath(path)): + raise self.error('given docset root ("%s") conflicts with ' + 'previously specified docset root ("%s")' + % (path, document['docset_root'])) + return [] Modified: branches/subdocs/docutils/parsers/rst/languages/af.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/af.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/af.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -62,6 +62,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'voetnote': 'footnotes', #'aanhalings': 'citations', 'teikennotas': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/ca.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/ca.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/ca.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -68,6 +68,7 @@ u'peu-de-p\u00E0gina': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', u'peu-p\u00E0gina': 'footer', #'footnotes': 'footnotes', #'citations': 'citations', Modified: branches/subdocs/docutils/parsers/rst/languages/cs.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/cs.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/cs.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -63,6 +63,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'footnotes': 'footnotes', #'citations': 'citations', u'target-notes (translation required)': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/de.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/de.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/de.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -67,6 +67,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #u'fu\xdfnoten': 'footnotes', #'zitate': 'citations', } Modified: branches/subdocs/docutils/parsers/rst/languages/en.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/en.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/en.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -61,8 +61,9 @@ 'section-numbering': 'sectnum', 'header': 'header', 'footer': 'footer', - 'subdocuments (translation required)': 'subdocs', - 'subdocs (translation required)': 'subdocs', + 'subdocuments': 'subdocs', + 'subdocs': 'subdocs', + 'docset-root': 'docset-root', #'footnotes': 'footnotes', #'citations': 'citations', 'target-notes': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/eo.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/eo.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/eo.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -70,6 +70,7 @@ u'piedsekcio': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'footnotes': 'footnotes', #'citations': 'citations', u'celaj-notoj': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/es.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/es.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/es.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -76,6 +76,7 @@ u'pie': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'footnotes': 'footnotes', #'citations': 'citations', u'restructuredtext-test-directive': 'restructuredtext-test-directive'} Modified: branches/subdocs/docutils/parsers/rst/languages/fi.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/fi.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/fi.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -60,6 +60,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #u'alaviitteet': u'footnotes', #u'viitaukset': u'citations', u'target-notes (translation required)': u'target-notes'} Modified: branches/subdocs/docutils/parsers/rst/languages/fr.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/fr.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/fr.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -67,6 +67,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #u'footnotes (translation required)': 'footnotes', #u'citations (translation required)': 'citations', } Modified: branches/subdocs/docutils/parsers/rst/languages/he.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/he.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/he.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -63,6 +63,7 @@ 'footer': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'footnotes': 'footnotes', #'citations': 'citations', 'target-notes': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/it.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/it.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/it.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -65,6 +65,7 @@ 'piede-pagina': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'footnotes': 'footnotes', #'citations': 'citations', 'restructuredtext-test-directive': 'restructuredtext-test-directive'} Modified: branches/subdocs/docutils/parsers/rst/languages/ja.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/ja.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/ja.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -78,6 +78,7 @@ u'フッタ': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #u'脚注': 'footnotes', # 脚註? #u'サイテーション': 'citations', # 出典 引証 引用 u'ターゲットノート': 'target-notes', # 的注 的脚注 Modified: branches/subdocs/docutils/parsers/rst/languages/nl.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/nl.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/nl.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -65,6 +65,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'voetnoten': 'footnotes', #'citaten': 'citations', 'verwijzing-voetnoten': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/pt_br.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/pt_br.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/pt_br.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -63,6 +63,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #u'notas-de-rorap\u00E9': 'footnotes', #u'cita\u00E7\u00F5es': 'citations', u'links-no-rodap\u00E9': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/ru.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/ru.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/ru.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -64,6 +64,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'footnotes (translation required)': 'footnotes', #'citations (translation required)': 'citations', u'\u0446\u0435\u043b\u0435\u0432\u044b\u0435-\u0441\u043d\u043e\u0441\u043a\u0438': Modified: branches/subdocs/docutils/parsers/rst/languages/sk.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/sk.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/sk.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -63,6 +63,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #u'footnotes': 'footnotes', #u'citations': 'citations', } Modified: branches/subdocs/docutils/parsers/rst/languages/sv.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/sv.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/sv.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -62,6 +62,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', # u'fotnoter': 'footnotes', # u'citeringar': 'citations', } Modified: branches/subdocs/docutils/parsers/rst/languages/zh_cn.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/zh_cn.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/zh_cn.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -63,6 +63,7 @@ u'页脚': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #u'footnotes (translation required)': 'footnotes', #u'citations (translation required)': 'citations', u'target-notes (translation required)': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/languages/zh_tw.py =================================================================== --- branches/subdocs/docutils/parsers/rst/languages/zh_tw.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/languages/zh_tw.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -64,6 +64,7 @@ u'footer (translation required)': 'footer', 'subdocuments (translation required)': 'subdocs', 'subdocs (translation required)': 'subdocs', + 'docset-root (translation required)': 'docset-root', #'footnotes (translation required)': 'footnotes', #'citations (translation required)': 'citations', 'target-notes (translation required)': 'target-notes', Modified: branches/subdocs/docutils/parsers/rst/states.py =================================================================== --- branches/subdocs/docutils/parsers/rst/states.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/parsers/rst/states.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -123,8 +123,14 @@ class InterpretedRoleNotImplementedError(DataError): pass class ParserError(ApplicationError): pass class MarkupMismatch(Exception): pass +class SubdocumentsSpecError(DataError): + def __init__(self, msg, line): + self.msg = msg + self.line = line + self.args = (msg, line) + class Struct: """Stores data attributes for dotted-attribute access.""" @@ -2069,7 +2075,7 @@ indented.trim_end() if indented and (directive.required_arguments or directive.optional_arguments - or option_spec): + or option_spec is not None): for i in range(len(indented)): if not indented[i].strip(): break @@ -2085,7 +2091,7 @@ while content and not content[0].strip(): content.trim_start() content_offset += 1 - if option_spec: + if option_spec is not None: options, arg_block = self.parse_directive_options( option_presets, option_spec, arg_block) if arg_block and not (directive.required_arguments @@ -2528,15 +2534,19 @@ indented, indent, line_offset, blank_finish = ( self.state_machine.get_first_known_indented(indent)) if not indented: - self.reporter.error('No empty list items allowed in ' - 'subdocuments specification.', line=self.state_machine.line) - return [], blank_finish + raise SubdocumentsSpecError( + 'No empty list items allowed in sub-documents specification.', + line=self.state_machine.abs_line_number()) if indented[0].startswith(':'): - self.reporter.error('File names may not start with a colon.', - line=self.state_machine.line) - return [], blank_finish + # Colons are reserved for future field-list syntax. + raise SubdocumentsSpecError( + 'File names may not start with a colon.', + line=self.state_machine.abs_line_number()) # If the user tries to start the item with a bullet list, like - # "* * ...", should we catch it? + # "* * ...", catch it. + if re.match(Body.patterns['bullet'], indented[0]): + raise SubdocumentsSpecError('No bullet allowed here.', + self.state_machine.abs_line_number()) if '' in indented: blank_line_index = indented.index('') file_name = ''.join(indented[:blank_line_index]) @@ -2550,16 +2560,14 @@ bullet_list = nodes.bullet_list('\n'.join(nested_list_lines), bullet=nested_list_lines[0][0]) new_line_offset, blank_finish = self.nested_list_parse( - nested_list_lines, - blank_line_index + 1, - # XXX correct? what's line_offset anyway? + nested_list_lines, blank_line_index + 1, node=bullet_list, initial_state='SubdocumentsSpec', blank_finish=blank_finish) if new_line_offset != len(indented): - self.reporter.error('sub-document specification list items ' - 'may only contain one nested bullet list', - line=self.state_machine.abs_line_number()) - return [], blank_finish + raise SubdocumentsSpecError( + 'Sub-document specification list items ' + 'may only contain one nested bullet list', + line=self.state_machine.abs_line_number()) list_item += bullet_list return list_item, blank_finish Modified: branches/subdocs/docutils/readers/standalone.py =================================================================== --- branches/subdocs/docutils/readers/standalone.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/readers/standalone.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -10,7 +10,7 @@ import sys -from docutils import frontend, readers +from docutils import frontend, utils, readers from docutils.transforms import frontmatter, references, misc @@ -64,3 +64,15 @@ references.DanglingReferences, misc.Transitions, ] + + def __init__(self, *args, **kwargs): + self.docset_root = kwargs.setdefault('docset_root') + del kwargs['docset_root'] + readers.Reader.__init__(self, *args, **kwargs) + + def new_document(self): + """Create and return a new empty document tree (root node).""" + document = utils.new_document(self.source.source_path, self.settings) + if self.docset_root is not None: + document['docset_root'] = self.docset_root + return document Modified: branches/subdocs/docutils/utils.py =================================================================== --- branches/subdocs/docutils/utils.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/docutils/utils.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -591,3 +591,18 @@ else: output_file = None return '%s(%r, %s)' % (self.__class__.__name__, output_file, self.list) + + +def normalize_path(path): + """ + os.path.normpath replacement that uses slashes instead of + backslashes for relative paths. + + Normalizing path names using this function allows for easier + testing since it makes the output platform-independent. + """ + path = os.path.normpath(path) + if os.sep == '\\' and os.altsep == '/' and not os.path.isabs(path): + # relative path on Windows + path = path.replace('\\', '/') + return path Modified: branches/subdocs/test/DocutilsTestSupport.py =================================================================== --- branches/subdocs/test/DocutilsTestSupport.py 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/test/DocutilsTestSupport.py 2007-08-15 21:39:08 UTC (rev 5397) @@ -429,7 +429,8 @@ cases that have nothing to do with the input and output of the parser. """ - parser = rst.Parser() + reader = standalone.Reader() + parser = rst.Parser(reader) """Parser shared by all ParserTestCases.""" option_parser = frontend.OptionParser(components=(rst.Parser,)) Modified: branches/subdocs/test/functional/expected/standalone_rst_html4css1.html =================================================================== --- branches/subdocs/test/functional/expected/standalone_rst_html4css1.html 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/test/functional/expected/standalone_rst_html4css1.html 2007-08-15 21:39:08 UTC (rev 5397) @@ -121,21 +121,28 @@ <li><a class="reference internal" href="#replacement-text" id="id59">2.14.6 Replacement Text</a></li> <li><a class="reference internal" href="#compound-paragraph" id="id60">2.14.7 Compound Paragraph</a></li> <li><a class="reference internal" href="#parsed-literal-blocks" id="id61">2.14.8 Parsed Literal Blocks</a></li> +<li><a class="reference internal" href="#sub-documents" id="id62">2.14.9 Sub-Documents</a><ul class="auto-toc"> +<li><a class="reference internal" href="#sub-document-1" id="id63">2.14.9.1 Sub-Document 1</a><ul class="auto-toc"> +<li><a class="reference internal" href="#sub-document-2" id="id64">2.14.9.1.1 Sub-Document 2</a></li> </ul> </li> -<li><a class="reference internal" href="#substitution-definitions" id="id62">2.15 Substitution Definitions</a></li> -<li><a class="reference internal" href="#comments" id="id63">2.16 Comments</a></li> -<li><a class="reference internal" href="#raw-text" id="id64">2.17 Raw text</a></li> -<li><a class="reference internal" href="#container" id="id65">2.18 Container</a></li> -<li><a class="reference internal" href="#colspanning-tables" id="id66">2.19 Colspanning tables</a></li> -<li><a class="reference internal" href="#rowspanning-tables" id="id67">2.20 Rowspanning tables</a></li> -<li><a class="reference internal" href="#complex-tables" id="id68">2.21 Complex tables</a></li> -<li><a class="reference internal" href="#list-tables" id="id69">2.22 List Tables</a></li> -<li><a class="reference internal" href="#custom-roles" id="id70">2.23 Custom Roles</a></li> </ul> </li> -<li><a class="reference internal" href="#error-handling" id="id71">3 Error Handling</a></li> </ul> +</li> +<li><a class="reference internal" href="#substitution-definitions" id="id65">2.15 Substitution Definitions</a></li> +<li><a class="reference internal" href="#comments" id="id66">2.16 Comments</a></li> +<li><a class="reference internal" href="#raw-text" id="id67">2.17 Raw text</a></li> +<li><a class="reference internal" href="#container" id="id68">2.18 Container</a></li> +<li><a class="reference internal" href="#colspanning-tables" id="id69">2.19 Colspanning tables</a></li> +<li><a class="reference internal" href="#rowspanning-tables" id="id70">2.20 Rowspanning tables</a></li> +<li><a class="reference internal" href="#complex-tables" id="id71">2.21 Complex tables</a></li> +<li><a class="reference internal" href="#list-tables" id="id72">2.22 List Tables</a></li> +<li><a class="reference internal" href="#custom-roles" id="id73">2.23 Custom Roles</a></li> +</ul> +</li> +<li><a class="reference internal" href="#error-handling" id="id74">3 Error Handling</a></li> +</ul> </div> <div class="section" id="structural-elements"> <h1><a class="toc-backref" href="#id32">1 Structural Elements</a></h1> @@ -479,7 +486,7 @@ <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label">[4]</td><td>Here's an unreferenced footnote, with a reference to a -nonexistent footnote: <a href="#id80"><span class="problematic" id="id81"><span id="id16"></span>[5]_</span></a>.</td></tr> +nonexistent footnote: <a href="#id86"><span class="problematic" id="id87"><span id="id16"></span>[5]_</span></a>.</td></tr> </tbody> </table> </div> @@ -492,7 +499,7 @@ rendered separately and differently from footnotes.</td></tr> </tbody> </table> -<p>Here's a reference to the above, <a class="citation-reference" href="#cit2002" id="id17">[CIT2002]</a>, and a <a href="#id82"><span class="problematic" id="id83"><span id="id18"></span>[nonexistent]_</span></a> +<p>Here's a reference to the above, <a class="citation-reference" href="#cit2002" id="id17">[CIT2002]</a>, and a <a href="#id88"><span class="problematic" id="id89"><span id="id18"></span>[nonexistent]_</span></a> citation.</p> </div> <div class="section" id="targets"> @@ -506,7 +513,7 @@ "<a class="reference external" href="http://www.python.org/">Python</a> <a class="footnote-reference" href="#id25" id="id27">[5]</a>".</p> <p>Targets may be indirect and anonymous. Thus <a class="reference internal" href="#id22">this phrase</a> may also refer to the <a class="reference internal" href="#id22">Targets</a> section.</p> -<p>Here's a <a href="#id84"><span class="problematic" id="id85">`hyperlink reference without a target`_</span></a>, which generates an +<p>Here's a <a href="#id90"><span class="problematic" id="id91">`hyperlink reference without a target`_</span></a>, which generates an error.</p> <div class="section" id="duplicate-target-names"> <h3><a class="toc-backref" href="#id51">2.13.1 Duplicate Target Names</a></h3> @@ -518,34 +525,41 @@ <h3><a class="toc-backref" href="#id52">2.13.2 Duplicate Target Names</a></h3> <p>Since there are two "Duplicate Target Names" section headers, we cannot uniquely refer to either of them by name. If we try to (like -this: <a href="#id86"><span class="problematic" id="id87">`Duplicate Target Names`_</span></a>), an error is generated.</p> +this: <a href="#id92"><span class="problematic" id="id93">`Duplicate Target Names`_</span></a>), an error is generated.</p> </div> </div> <div class="section" id="directives"> <h2><a class="toc-backref" href="#id53">2.14 Directives</a></h2> <div class="contents local topic" id="contents"> <ul class="auto-toc simple"> -<li><a class="reference internal" href="#document-parts" id="id72">2.14.1 Document Parts</a></li> -<li><a class="reference internal" href="#images" id="id73">2.14.2 Images</a></li> -<li><a class="reference internal" href="#admonitions" id="id74">2.14.3 Admonitions</a></li> -<li><a class="reference internal" href="#topics-sidebars-and-rubrics" id="id75">2.14.4 Topics, Sidebars, and Rubrics</a></li> -<li><a class="reference internal" href="#target-footnotes" id="id76">2.14.5 Target Footnotes</a></li> -<li><a class="reference internal" href="#replacement-text" id="id77">2.14.6 Replacement Text</a></li> -<li><a class="reference internal" href="#compound-paragraph" id="id78">2.14.7 Compound Paragraph</a></li> -<li><a class="reference internal" href="#parsed-literal-blocks" id="id79">2.14.8 Parsed Literal Blocks</a></li> +<li><a class="reference internal" href="#document-parts" id="id75">2.14.1 Document Parts</a></li> +<li><a class="reference internal" href="#images" id="id76">2.14.2 Images</a></li> +<li><a class="reference internal" href="#admonitions" id="id77">2.14.3 Admonitions</a></li> +<li><a class="reference internal" href="#topics-sidebars-and-rubrics" id="id78">2.14.4 Topics, Sidebars, and Rubrics</a></li> +<li><a class="reference internal" href="#target-footnotes" id="id79">2.14.5 Target Footnotes</a></li> +<li><a class="reference internal" href="#replacement-text" id="id80">2.14.6 Replacement Text</a></li> +<li><a class="reference internal" href="#compound-paragraph" id="id81">2.14.7 Compound Paragraph</a></li> +<li><a class="reference internal" href="#parsed-literal-blocks" id="id82">2.14.8 Parsed Literal Blocks</a></li> +<li><a class="reference internal" href="#sub-documents" id="id83">2.14.9 Sub-Documents</a><ul class="auto-toc"> +<li><a class="reference internal" href="#sub-document-1" id="id84">2.14.9.1 Sub-Document 1</a><ul class="auto-toc"> +<li><a class="reference internal" href="#sub-document-2" id="id85">2.14.9.1.1 Sub-Document 2</a></li> </ul> +</li> +</ul> +</li> +</ul> </div> <p>These are just a sample of the many reStructuredText Directives. For others, please see <a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/directives.html">http://docutils.sourceforge.net/docs/ref/rst/directives.html</a>.</p> <div class="section" id="document-parts"> -<h3><a class="toc-backref" href="#id72">2.14.1 Document Parts</a></h3> +<h3><a class="toc-backref" href="#id75">2.14.1 Document Parts</a></h3> <p>An example of the "contents" directive can be seen above this section (a local, untitled table of <a class="reference internal" href="#contents">contents</a>) and at the beginning of the document (a document-wide <a class="reference internal" href="#table-of-contents">table of contents</a>).</p> </div> <div class="section" id="images"> -<h3><a class="toc-backref" href="#id73">2.14.2 Images</a></h3> +<h3><a class="toc-backref" href="#id76">2.14.2 Images</a></h3> <p>An image directive (also clickable -- a hyperlink reference):</p> <a class="reference internal image-reference" href="#directives"><img alt="../../../docs/user/rst/images/title.png" class="class1 class2" src="../../../docs/user/rst/images/title.png" /></a> <p>Image with multiple IDs:</p> @@ -619,7 +633,7 @@ <img alt="../../../docs/user/rst/images/biohazard.png" src="../../../docs/user/rst/images/biohazard.png" style="height: 3cm;" /> </div> <div class="section" id="admonitions"> -<h3><a class="toc-backref" href="#id74">2.14.3 Admonitions</a></h3> +<h3><a class="toc-backref" href="#id77">2.14.3 Admonitions</a></h3> <div class="attention"> <p class="first admonition-title">Attention!</p> <p class="last">Directives at large.</p> @@ -668,7 +682,7 @@ </div> </div> <div class="section" id="topics-sidebars-and-rubrics"> -<h3><a class="toc-backref" href="#id75">2.14.4 Topics, Sidebars, and Rubrics</a></h3> +<h3><a class="toc-backref" href="#id78">2.14.4 Topics, Sidebars, and Rubrics</a></h3> <div class="sidebar"> <p class="first sidebar-title">Sidebar Title</p> <p class="sidebar-subtitle">Optional Subtitle</p> @@ -685,7 +699,7 @@ <p class="rubric">This is a rubric</p> </div> <div class="section" id="target-footnotes"> -<h3><a class="toc-backref" href="#id76">2.14.5 Target Footnotes</a></h3> +<h3><a class="toc-backref" href="#id79">2.14.5 Target Footnotes</a></h3> <table class="docutils footnote" frame="void" id="id25" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> @@ -700,11 +714,11 @@ </table> </div> <div class="section" id="replacement-text"> -<h3><a class="toc-backref" href="#id77">2.14.6 Replacement Text</a></h3> +<h3><a class="toc-backref" href="#id80">2.14.6 Replacement Text</a></h3> <p>I recommend you try <a class="reference external" href="http://www.python.org/">Python, <em>the</em> best language around</a> <a class="footnote-reference" href="#id25" id="id28">[5]</a>.</p> </div> <div class="section" id="compound-paragraph"> -<h3><a class="toc-backref" href="#id78">2.14.7 Compound Paragraph</a></h3> +<h3><a class="toc-backref" href="#id81">2.14.7 Compound Paragraph</a></h3> <div class="some-class compound"> <p class="compound-first">Compound 1, paragraph 1.</p> <p class="compound-middle">Compound 1, paragraph 2.</p> @@ -772,7 +786,7 @@ </div> </div> <div class="section" id="parsed-literal-blocks"> -<h3><a class="toc-backref" href="#id79">2.14.8 Parsed Literal Blocks</a></h3> +<h3><a class="toc-backref" href="#id82">2.14.8 Parsed Literal Blocks</a></h3> <pre class="literal-block"> This is a parsed literal block. This line is indented. The next line is blank. @@ -781,14 +795,27 @@ <span class="pre">text</span></tt>, footnotes <a class="footnote-reference" href="#id8" id="id21">[1]</a>, <span class="target" id="id22">targets</span>, and <a class="reference external" href="http://www.python.org/">references</a>. </pre> </div> +<div class="section" id="sub-documents"> +<h3><a class="toc-backref" href="#id83">2.14.9 Sub-Documents</a></h3> +<p>Include another document:</p> +<div class="section" id="sub-document-1"> +<h4><a class="toc-backref" href="#id84">2.14.9.1 Sub-Document 1</a></h4> +<p>This is a document intended to be included as a sub-document by other +documents. It includes a sub-document itself:</p> +<div class="section" id="sub-document-2"> +<h5><a class="toc-backref" href="#id85">2.14.9.1.1 Sub-Document 2</a></h5> +<p>This is another document intended to be included as a sub-document.</p> </div> +</div> +</div> +</div> <div class="section" id="substitution-definitions"> -<h2><a class="toc-backref" href="#id62">2.15 Substitution Definitions</a></h2> +<h2><a class="toc-backref" href="#id65">2.15 Substitution Definitions</a></h2> <p>An inline image (<img alt="EXAMPLE" src="../../../docs/user/rst/images/biohazard.png" />) example:</p> <p>(Substitution definitions are not visible in the HTML source.)</p> </div> <div class="section" id="comments"> -<h2><a class="toc-backref" href="#id63">2.16 Comments</a></h2> +<h2><a class="toc-backref" href="#id66">2.16 Comments</a></h2> <p>Here's one:</p> <!-- Comments begin with two dots and a space. Anything may follow, except for the syntax of footnotes, hyperlink @@ -800,20 +827,20 @@ <p>(View the HTML source to see the comment.)</p> </div> <div class="section" id="raw-text"> -<h2><a class="toc-backref" href="#id64">2.17 Raw text</a></h2> +<h2><a class="toc-backref" href="#id67">2.17 Raw text</a></h2> <p>This does not necessarily look nice, because there may be missing white space.</p> <p>It's just there to freeze the behavior.</p> A test.Second test.<div class="myclass">Another test with myclass set.</div><p>This is the <span class="myrawroleclass">fourth test</span> with myrawroleclass set.</p> Fifth test in HTML.<br />Line two.</div> <div class="section" id="container"> -<h2><a class="toc-backref" href="#id65">2.18 Container</a></h2> +<h2><a class="toc-backref" href="#id68">2.18 Container</a></h2> <div class="custom container"> <p>paragraph 1</p> <p>paragraph 2</p> </div> </div> <div class="section" id="colspanning-tables"> -<h2><a class="toc-backref" href="#id66">2.19 Colspanning tables</a></h2> +<h2><a class="toc-backref" href="#id69">2.19 Colspanning tables</a></h2> <p>This table has a cell spanning two columns:</p> <table border="1" class="docutils"> <colgroup> @@ -851,7 +878,7 @@ </table> </div> <div class="section" id="rowspanning-tables"> -<h2><a class="toc-backref" href="#id67">2.20 Rowspanning tables</a></h2> +<h2><a class="toc-backref" href="#id70">2.20 Rowspanning tables</a></h2> <p>Here's a table with cells spanning several rows:</p> <table border="1" class="docutils"> <colgroup> @@ -884,7 +911,7 @@ </table> </div> <div class="section" id="complex-tables"> -<h2><a class="toc-backref" href="#id68">2.21 Complex tables</a></h2> +<h2><a class="toc-backref" href="#id71">2.21 Complex tables</a></h2> <p>Here's a complex table, which should test all features.</p> <table border="1" class="docutils"> <colgroup> @@ -933,7 +960,7 @@ </table> </div> <div class="section" id="list-tables"> -<h2><a class="toc-backref" href="#id69">2.22 List Tables</a></h2> +<h2><a class="toc-backref" href="#id72">2.22 List Tables</a></h2> <p>Here's a list table exercising all features:</p> <table border="1" class="test docutils"> <caption>list table with integral header</caption> @@ -966,7 +993,7 @@ </table> </div> <div class="section" id="custom-roles"> -<h2><a class="toc-backref" href="#id70">2.23 Custom Roles</a></h2> +<h2><a class="toc-backref" href="#id73">2.23 Custom Roles</a></h2> <ul> <li><p class="first">A role based on an existing role.</p> <p><tt class="custom docutils literal"><span class="pre">one</span></tt> <tt class="custom docutils literal"><span class="pre">two</span></tt> <tt class="custom docutils literal"><span class="pre">three</span></tt></p> @@ -984,7 +1011,7 @@ </div> </div> <div class="section" id="error-handling"> -<h1><a class="toc-backref" href="#id71">3 Error Handling</a></h1> +<h1><a class="toc-backref" href="#id74">3 Error Handling</a></h1> <p>Any errors caught during processing will generate system messages.</p> <p>There should be five messages in the following, auto-generated section, "Docutils System Messages":</p> @@ -995,17 +1022,17 @@ <div class="system-message" id="id23"> <p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/data/standard.txt</tt>, line 100); <em><a href="#id24">backlink</a></em></p> Undefined substitution referenced: "problematic".</div> -<div class="system-message" id="id80"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/standalone_rst_html4css1.txt</tt>, line 358); <em><a href="#id81">backlink</a></em></p> +<div class="system-message" id="id86"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/standalone_rst_html4css1.txt</tt>, line 358); <em><a href="#id87">backlink</a></em></p> Unknown target name: "5".</div> -<div class="system-message" id="id82"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/data/standard.txt</tt>, line 367); <em><a href="#id83">backlink</a></em></p> +<div class="system-message" id="id88"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/data/standard.txt</tt>, line 367); <em><a href="#id89">backlink</a></em></p> Unknown target name: "nonexistent".</div> -<div class="system-message" id="id84"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/data/standard.txt</tt>, line 394); <em><a href="#id85">backlink</a></em></p> +<div class="system-message" id="id90"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/data/standard.txt</tt>, line 394); <em><a href="#id91">backlink</a></em></p> Unknown target name: "hyperlink reference without a target".</div> -<div class="system-message" id="id86"> -<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/data/standard.txt</tt>, line 407); <em><a href="#id87">backlink</a></em></p> +<div class="system-message" id="id92"> +<p class="system-message-title">System Message: ERROR/3 (<tt class="docutils">functional/input/data/standard.txt</tt>, line 407); <em><a href="#id93">backlink</a></em></p> Duplicate target name, cannot be used as a unique reference: "duplicate target names".</div> </div> </div> Modified: branches/subdocs/test/functional/expected/standalone_rst_latex.tex =================================================================== --- branches/subdocs/test/functional/expected/standalone_rst_latex.tex 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/test/functional/expected/standalone_rst_latex.tex 2007-08-15 21:39:08 UTC (rev 5397) @@ -200,8 +200,18 @@ \item {} \href{\#parsed-literal-blocks}{2.14.8~~~Parsed Literal Blocks} +\item {} \href{\#sub-documents}{2.14.9~~~Sub-Documents} +\begin{list}{}{} +\item {} \href{\#sub-document-1}{2.14.9.1~~~Sub-Document 1} +\begin{list}{}{} +\item {} \href{\#sub-document-2}{2.14.9.1.1~~~Sub-Document 2} + \end{list} +\end{list} + +\end{list} + \item {} \href{\#substitution-definitions}{2.15~~~Substitution Definitions} \item {} \href{\#comments}{2.16~~~Comments} @@ -855,9 +865,19 @@ \item {} \href{\#parsed-literal-blocks}{2.14.8~~~Parsed Literal Blocks} +\item {} \href{\#sub-documents}{2.14.9~~~Sub-Documents} +\begin{list}{}{} +\item {} \href{\#sub-document-1}{2.14.9.1~~~Sub-Document 1} +\begin{list}{}{} +\item {} \href{\#sub-document-2}{2.14.9.1.1~~~Sub-Document 2} + \end{list} +\end{list} +\end{list} + + These are just a sample of the many reStructuredText Directives. For others, please see \href{http://docutils.sourceforge.net/docs/ref/rst/directives.html}{http://docutils.sourceforge.net/docs/ref/rst/directives.html}. @@ -1246,6 +1266,37 @@ %___________________________________________________________________________ +\hypertarget{sub-documents}{} +\pdfbookmark[2]{2.14.9~~~Sub-Documents}{sub-documents} +\subsubsection*{2.14.9~~~Sub-Documents} +\label{sub-documents} + +Include another document: + + +%___________________________________________________________________________ + +\hypertarget{sub-document-1}{} +\pdfbookmark[3]{2.14.9.1~~~Sub-Document 1}{sub-document-1} +\paragraph*{2.14.9.1~~~Sub-Document 1} +\label{sub-document-1} + +This is a document intended to be included as a sub-document by other +documents. It includes a sub-document itself: + + +%___________________________________________________________________________ + +\hypertarget{sub-document-2}{} +\pdfbookmark[4]{2.14.9.1.1~~~Sub-Document 2}{sub-document-2} +\subparagraph*{2.14.9.1.1~~~Sub-Document 2} +\label{sub-document-2} + +This is another document intended to be included as a sub-document. + + +%___________________________________________________________________________ + \hypertarget{substitution-definitions}{} \pdfbookmark[1]{2.15~~~Substitution Definitions}{substitution-definitions} \subsection*{2.15~~~Substitution Definitions} Modified: branches/subdocs/test/functional/expected/standalone_rst_pseudoxml.txt =================================================================== --- branches/subdocs/test/functional/expected/standalone_rst_pseudoxml.txt 2007-08-15 21:11:05 UTC (rev 5396) +++ branches/subdocs/test/functional/expected/standalone_rst_pseudoxml.txt 2007-08-15 21:39:08 UTC (rev 5397) @@ -1,4 +1,4 @@ -<document ids="restructuredtext-test-document doctitle" names="restructuredtext\ test\ document doctitle" source="functional/input/standalone_rst_pseudoxml.txt" title="reStructuredText Test Document"> +<document docset_root="functional/input" ids="restructuredtext-test-document doctitle" names="restructuredtext\ test\ document doctitle" source="functional/input/standalone_rst_pseudoxml.txt" title="reStructuredText Test Document"> <title> reStructuredText Test Document <subtitle ids="examples-of-syntax-constructs subtitle" names="examples\ of\ syntax\ constructs subtitle"> @@ -274,57 +274,77 @@ <generated classes="sectnum"> 2.14.8 Parsed Literal Blocks + <list_item> + <paragraph> + <reference ids="id62" refid="sub-documents"> + <generated classes="sectnum"> + 2.14.9 + Sub-Documents + <bullet_list classes="auto-toc"> + <list_item> + <paragraph> + <reference ids="id63" refid="sub-document-1"> + ... [truncated message content] |