From: <mi...@us...> - 2012-01-06 12:08:49
|
Revision: 7308 http://docutils.svn.sourceforge.net/docutils/?rev=7308&view=rev Author: milde Date: 2012-01-06 12:08:43 +0000 (Fri, 06 Jan 2012) Log Message: ----------- Store source and line in the "raw" node generated by raw-derived roles. This is already done for nodes generated by raw directives and required for error reporting by writers. Modified Paths: -------------- trunk/docutils/docutils/parsers/rst/directives/parts.py trunk/docutils/docutils/parsers/rst/roles.py trunk/docutils/docutils/parsers/rst/states.py trunk/docutils/docutils/utils/__init__.py Modified: trunk/docutils/docutils/parsers/rst/directives/parts.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/parts.py 2012-01-06 11:11:51 UTC (rev 7307) +++ trunk/docutils/docutils/parsers/rst/directives/parts.py 2012-01-06 12:08:43 UTC (rev 7308) @@ -64,9 +64,8 @@ topic = nodes.topic(classes=['contents']) topic['classes'] += self.options.get('class', []) # the latex2e writer needs source and line for a warning: - src, srcline = self.state_machine.get_source_and_line() - topic.source = src - topic.line = srcline - 1 + topic.source, topic.line = self.state_machine.get_source_and_line() + topic.line -= 1 if 'local' in self.options: topic['classes'].append('local') if title: Modified: trunk/docutils/docutils/parsers/rst/roles.py =================================================================== --- trunk/docutils/docutils/parsers/rst/roles.py 2012-01-06 11:11:51 UTC (rev 7307) +++ trunk/docutils/docutils/parsers/rst/roles.py 2012-01-06 12:08:43 UTC (rev 7308) @@ -309,6 +309,8 @@ return [prb], [msg] set_classes(options) node = nodes.raw(rawtext, utils.unescape(text, 1), **options) + node.source, node.line = inliner.reporter.get_source_and_line() + node.line -= 1 return [node], [] raw_role.options = {'format': directives.unchanged} Modified: trunk/docutils/docutils/parsers/rst/states.py =================================================================== --- trunk/docutils/docutils/parsers/rst/states.py 2012-01-06 11:11:51 UTC (rev 7307) +++ trunk/docutils/docutils/parsers/rst/states.py 2012-01-06 12:08:43 UTC (rev 7308) @@ -227,9 +227,9 @@ self.document = memo.document self.parent = self.state_machine.node # enable the reporter to determine source and source-line - if not hasattr(self.reporter, 'locator'): - self.reporter.locator = self.state_machine.get_source_and_line - # print "adding locator to reporter", self.state_machine.input_offset + if not hasattr(self.reporter, 'get_source_and_line'): + self.reporter.get_source_and_line = self.state_machine.get_source_and_line + # print "adding get_source_and_line to reporter", self.state_machine.input_offset def goto_line(self, abs_line_offset): Modified: trunk/docutils/docutils/utils/__init__.py =================================================================== --- trunk/docutils/docutils/utils/__init__.py 2012-01-06 11:11:51 UTC (rev 7307) +++ trunk/docutils/docutils/utils/__init__.py 2012-01-06 12:08:43 UTC (rev 7308) @@ -169,7 +169,7 @@ # assert source is not None, "node has line- but no source-argument" if not 'source' in attributes: # 'line' is absolute line number try: # look up (source, line-in-source) - source, line = self.locator(attributes.get('line')) + source, line = self.get_source_and_line(attributes.get('line')) # print "locator lookup", kwargs.get('line'), "->", source, line except AttributeError: source, line = None, None This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2012-01-09 15:01:28
|
Revision: 7310 http://docutils.svn.sourceforge.net/docutils/?rev=7310&view=rev Author: milde Date: 2012-01-09 15:01:15 +0000 (Mon, 09 Jan 2012) Log Message: ----------- Clean up system message (source, line) reporting. Do the abs_line_number -> (src, srcline) conversion in the reporter whenever possible. Modified Paths: -------------- trunk/docutils/docutils/parsers/rst/__init__.py trunk/docutils/docutils/parsers/rst/directives/html.py trunk/docutils/docutils/parsers/rst/directives/misc.py trunk/docutils/docutils/parsers/rst/roles.py trunk/docutils/docutils/parsers/rst/states.py trunk/docutils/docutils/statemachine.py Modified: trunk/docutils/docutils/parsers/rst/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/__init__.py 2012-01-06 18:51:12 UTC (rev 7309) +++ trunk/docutils/docutils/parsers/rst/__init__.py 2012-01-09 15:01:15 UTC (rev 7310) @@ -305,7 +305,6 @@ self.block_text = block_text self.state = state self.state_machine = state_machine - self.src, self.srcline = state_machine.get_source_and_line(lineno) def run(self): raise NotImplementedError('Must override run() is subclass.') @@ -321,8 +320,9 @@ at level `level`, which automatically gets the directive block and the line number added. - You'd often use self.error(message) instead, which will - generate an ERROR-level directive error. + Preferably use the `debug`, `info`, `warning`, `error`, or `severe` + wrapper methods, e.g. ``self.error(message)`` to generate an + ERROR-level directive error. """ return DirectiveError(level, message) Modified: trunk/docutils/docutils/parsers/rst/directives/html.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/html.py 2012-01-06 18:51:12 UTC (rev 7309) +++ trunk/docutils/docutils/parsers/rst/directives/html.py 2012-01-09 15:01:15 UTC (rev 7310) @@ -41,8 +41,7 @@ line = self.state_machine.line msg = self.reporter.info( 'No content for meta tag "%s".' % name, - nodes.literal_block(line, line), - line=self.state_machine.abs_line_number()) + nodes.literal_block(line, line)) return msg, blank_finish tokens = name.split() try: @@ -58,8 +57,7 @@ line = self.state_machine.line msg = self.reporter.error( 'Error parsing meta tag attribute "%s": %s.' - % (token, detail), nodes.literal_block(line, line), - line=self.state_machine.abs_line_number()) + % (token, detail), nodes.literal_block(line, line)) return msg, blank_finish self.document.note_pending(pending) return pending, blank_finish Modified: trunk/docutils/docutils/parsers/rst/directives/misc.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/misc.py 2012-01-06 18:51:12 UTC (rev 7309) +++ trunk/docutils/docutils/parsers/rst/directives/misc.py 2012-01-09 15:01:15 UTC (rev 7310) @@ -240,6 +240,8 @@ # This will always fail because there is no content. self.assert_has_content() raw_node = nodes.raw('', text, **attributes) + (raw_node.source, + raw_node.line) = self.state_machine.get_source_and_line(self.lineno) return [raw_node] Modified: trunk/docutils/docutils/parsers/rst/roles.py =================================================================== --- trunk/docutils/docutils/parsers/rst/roles.py 2012-01-06 18:51:12 UTC (rev 7309) +++ trunk/docutils/docutils/parsers/rst/roles.py 2012-01-09 15:01:15 UTC (rev 7310) @@ -309,8 +309,7 @@ return [prb], [msg] set_classes(options) node = nodes.raw(rawtext, utils.unescape(text, 1), **options) - node.source, node.line = inliner.reporter.get_source_and_line() - node.line -= 1 + node.source, node.line = inliner.reporter.get_source_and_line(lineno) return [node], [] raw_role.options = {'format': directives.unchanged} Modified: trunk/docutils/docutils/parsers/rst/states.py =================================================================== --- trunk/docutils/docutils/parsers/rst/states.py 2012-01-06 18:51:12 UTC (rev 7309) +++ trunk/docutils/docutils/parsers/rst/states.py 2012-01-09 15:01:15 UTC (rev 7310) @@ -247,13 +247,11 @@ This code should never be run. """ - src, srcline = self.state_machine.get_source_and_line() self.reporter.severe( 'Internal error: no transition pattern match. State: "%s"; ' 'transitions: %s; context: %s; current line: %r.' % (self.__class__.__name__, transitions, context, - self.state_machine.line), - source=src, line=srcline) + self.state_machine.line)) return context, None, [] def bof(self, context): @@ -374,10 +372,9 @@ return None def title_inconsistent(self, sourcetext, lineno): - src, srcline = self.state_machine.get_source_and_line(lineno) error = self.reporter.severe( 'Title level inconsistent:', nodes.literal_block('', sourcetext), - source=src, line=srcline) + line=lineno) return error def new_subsection(self, title, lineno, messages): @@ -435,10 +432,10 @@ def unindent_warning(self, node_name): # the actual problem is one line below the current line - src, srcline = self.state_machine.get_source_and_line() + lineno = self.state_machine.abs_line_number()+1 return self.reporter.warning('%s ends without a blank line; ' 'unexpected unindent.' % node_name, - source=src, line=srcline+1) + line=lineno) def build_regexp(definition, compile=1): @@ -1206,10 +1203,7 @@ lineno = self.state_machine.abs_line_number() + line_offset textnodes, messages = self.inline_text(text, lineno) node = nodes.attribution(text, '', *textnodes) - node.line = lineno - # report with source and source-line results in - # ``IndexError: list index out of range`` - # node.source, node.line = self.state_machine.get_source_and_line(lineno) + node.source, node.line = self.state_machine.get_source_and_line(lineno) return node, messages def bullet(self, match, context, next_state): @@ -1258,10 +1252,9 @@ enumlist['suffix'] = self.enum.formatinfo[format].suffix if ordinal != 1: enumlist['start'] = ordinal - src, srcline = self.state_machine.get_source_and_line() msg = self.reporter.info( 'Enumerated list start value not ordinal-1: "%s" (ordinal %s)' - % (text, ordinal), source=src, line=srcline) + % (text, ordinal)) self.parent += msg listitem, blank_finish = self.list_item(match.end()) enumlist += listitem @@ -1450,9 +1443,8 @@ listitem, blank_finish = self.option_list_item(match) except MarkupError, error: # This shouldn't happen; pattern won't match. - src, srcline = self.state_machine.get_source_and_line() msg = self.reporter.error(u'Invalid option list marker: %s' % - error, source=src, line=srcline) + error) self.parent += msg indented, indent, line_offset, blank_finish = \ self.state_machine.get_first_known_indented(match.end()) @@ -1554,10 +1546,9 @@ blank_finish=0) self.goto_line(new_line_offset) if not blank_finish: - src, srcline = self.state_machine.get_source_and_line() self.parent += self.reporter.warning( 'Line block ends without a blank line.', - source=src, line=srcline+1) + line=lineno+1) if len(block): if block[0].indent is None: block[0].indent = 0 @@ -1619,10 +1610,9 @@ nodelist, blank_finish = self.table(isolate_function, parser_class) self.parent += nodelist if not blank_finish: - src, srcline = self.state_machine.get_source_and_line() msg = self.reporter.warning( 'Blank line required after table.', - source=src, line=srcline+1) + line=self.state_machine.abs_line_number()+1) self.parent += msg return [], next_state, [] @@ -1649,8 +1639,8 @@ blank_finish = 1 try: block = self.state_machine.get_text_block(flush_left=1) - except statemachine.UnexpectedIndentationError, instance: - block, src, srcline = instance.args + except statemachine.UnexpectedIndentationError, err: + block, src, srcline = err.args messages.append(self.reporter.error('Unexpected indentation.', source=src, line=srcline)) blank_finish = 0 @@ -1730,11 +1720,10 @@ data = '\n'.join(block) message = 'Malformed table.' startline = self.state_machine.abs_line_number() - len(block) + 1 - src, srcline = self.state_machine.get_source_and_line(startline) if detail: message += '\n' + detail error = self.reporter.error(message, nodes.literal_block(data, data), - source=src, line=srcline) + line=startline) return [error] def build_table(self, tabledata, tableline, stub_columns=0): @@ -1877,7 +1866,6 @@ def hyperlink_target(self, match): pattern = self.explicit.patterns.target lineno = self.state_machine.abs_line_number() - src, srcline = self.state_machine.get_source_and_line() block, indent, offset, blank_finish = \ self.state_machine.get_first_known_indented( match.end(), until_blank=1, strip_indent=0) @@ -2071,7 +2059,6 @@ from docutils.parsers.rst import convert_directive_function directive = convert_directive_function(directive) lineno = self.state_machine.abs_line_number() - src, srcline = self.state_machine.get_source_and_line() initial_line_offset = self.state_machine.line_offset indented, indent, line_offset, blank_finish \ = self.state_machine.get_first_known_indented(match.end(), @@ -2086,8 +2073,7 @@ error = self.reporter.error( 'Error in "%s" directive:\n%s.' % (type_name, ' '.join(detail.args)), - nodes.literal_block(block_text, block_text), - source=src, line=srcline) + nodes.literal_block(block_text, block_text), line=lineno) return [error], blank_finish directive_instance = directive( type_name, arguments, options, content, lineno, @@ -2096,7 +2082,7 @@ result = directive_instance.run() except docutils.parsers.rst.DirectiveError, error: msg_node = self.reporter.system_message(error.level, error.msg, - source=src, line=srcline) + line=lineno) msg_node += nodes.literal_block(block_text, block_text) result = [msg_node] assert isinstance(result, list), \ @@ -2223,13 +2209,13 @@ return 0, 'option data incompletely parsed' def unknown_directive(self, type_name): - src, srcline = self.state_machine.get_source_and_line() + lineno = self.state_machine.abs_line_number() indented, indent, offset, blank_finish = \ self.state_machine.get_first_known_indented(0, strip_indent=0) text = '\n'.join(indented) error = self.reporter.error( 'Unknown directive type "%s".' % type_name, - nodes.literal_block(text, text), source=src, line=srcline) + nodes.literal_block(text, text), line=lineno) return [error], blank_finish def comment(self, match): @@ -2302,11 +2288,10 @@ if expmatch: try: return method(self, expmatch) - except MarkupError, error: # never reached? + except MarkupError, error: + lineno = self.state_machine.abs_line_number() message = ' '.join(error.args) - src, srcline = self.state_machine.get_source_and_line() - errors.append(self.reporter.warning( - message, source=src, line=srcline)) + errors.append(self.reporter.warning(message, line=lineno)) break nodelist, blank_finish = self.comment(match) return nodelist + errors, blank_finish @@ -2683,7 +2668,6 @@ def underline(self, match, context, next_state): """Section title.""" lineno = self.state_machine.abs_line_number() - src, srcline = self.state_machine.get_source_and_line() title = context[0].rstrip() underline = match.string.rstrip() source = title + '\n' + underline @@ -2694,20 +2678,23 @@ msg = self.reporter.info( 'Possible title underline, too short for the title.\n' "Treating it as ordinary text because it's so short.", - source=src, line=srcline) + line=lineno) self.parent += msg raise statemachine.TransitionCorrection('text') else: blocktext = context[0] + '\n' + self.state_machine.line - msg = self.reporter.warning( - 'Title underline too short.', - nodes.literal_block(blocktext, blocktext), - source=src, line=srcline) + msg = self.reporter.warning('Title underline too short.', + nodes.literal_block(blocktext, blocktext), line=lineno) messages.append(msg) if not self.state_machine.match_titles: blocktext = context[0] + '\n' + self.state_machine.line - msg = self.reporter.severe( - 'Unexpected section title.', + # We need get_source_and_line() here to report correctly + src, srcline = self.state_machine.get_source_and_line() + # TODO: why is abs_line_number() == srcline+1 + # if the error is in a table (try with test_tables.py)? + # print "get_source_and_line", srcline + # print "abs_line_number", self.state_machine.abs_line_number() + msg = self.reporter.severe('Unexpected section title.', nodes.literal_block(blocktext, blocktext), source=src, line=srcline) self.parent += messages @@ -2724,8 +2711,8 @@ msg = None try: block = self.state_machine.get_text_block(flush_left=1) - except statemachine.UnexpectedIndentationError, instance: - block, src, srcline = instance.args + except statemachine.UnexpectedIndentationError, err: + block, src, srcline = err.args msg = self.reporter.error('Unexpected indentation.', source=src, line=srcline) lines = context + list(block) @@ -2771,23 +2758,22 @@ def definition_list_item(self, termline): indented, indent, line_offset, blank_finish = \ self.state_machine.get_indented() - definitionlistitem = nodes.definition_list_item( + itemnode = nodes.definition_list_item( '\n'.join(termline + list(indented))) lineno = self.state_machine.abs_line_number() - 1 - src, srcline = self.state_machine.get_source_and_line() - definitionlistitem.source = src - definitionlistitem.line = srcline - 1 + (itemnode.source, + itemnode.line) = self.state_machine.get_source_and_line(lineno) termlist, messages = self.term(termline, lineno) - definitionlistitem += termlist + itemnode += termlist definition = nodes.definition('', *messages) - definitionlistitem += definition + itemnode += definition if termline[0][-2:] == '::': definition += self.reporter.info( 'Blank line missing before literal block (after the "::")? ' 'Interpreted as a definition list item.', - source=src, line=srcline) + line=lineno+1) self.nested_parse(indented, input_offset=line_offset, node=definition) - return definitionlistitem, blank_finish + return itemnode, blank_finish classifier_delimiter = re.compile(' +: +') @@ -2848,8 +2834,8 @@ def indent(self, match, context, next_state): """Definition list item.""" - definitionlistitem, blank_finish = self.definition_list_item(context) - self.parent += definitionlistitem + itemnode, blank_finish = self.definition_list_item(context) + self.parent += itemnode self.blank_finish = blank_finish return [], 'DefinitionList', [] @@ -2893,7 +2879,6 @@ def text(self, match, context, next_state): """Potential over- & underlined title.""" lineno = self.state_machine.abs_line_number() - 1 - src, srcline = self.state_machine.get_source_and_line() overline = context[0] title = match.string underline = '' @@ -2907,7 +2892,7 @@ msg = self.reporter.severe( 'Incomplete section title.', nodes.literal_block(blocktext, blocktext), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] source = '%s\n%s\n%s' % (overline, title, underline) @@ -2921,7 +2906,7 @@ msg = self.reporter.severe( 'Missing matching underline for section title overline.', nodes.literal_block(source, source), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] elif overline != underline: @@ -2932,7 +2917,7 @@ msg = self.reporter.severe( 'Title overline & underline mismatch.', nodes.literal_block(source, source), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] title = title.rstrip() @@ -2945,7 +2930,7 @@ msg = self.reporter.warning( 'Title overline too short.', nodes.literal_block(source, source), - source=src, line=srcline-1) + line=lineno) messages.append(msg) style = (overline[0], underline[0]) self.eofcheck = 0 # @@@ not sure this is correct @@ -2959,22 +2944,20 @@ overline = context[0] blocktext = overline + '\n' + self.state_machine.line lineno = self.state_machine.abs_line_number() - 1 - src, srcline = self.state_machine.get_source_and_line() if len(overline.rstrip()) < 4: self.short_overline(context, blocktext, lineno, 1) msg = self.reporter.error( 'Invalid section title or transition marker.', nodes.literal_block(blocktext, blocktext), - source=src, line=srcline-1) + line=lineno) self.parent += msg return [], 'Body', [] def short_overline(self, context, blocktext, lineno, lines=1): - src, srcline = self.state_machine.get_source_and_line(lineno) msg = self.reporter.info( 'Possible incomplete section title.\nTreating the overline as ' "ordinary text because it's so short.", - source=src, line=srcline) + line=lineno) self.parent += msg self.state_correction(context, lines) @@ -3052,10 +3035,9 @@ def text(self, match, context, next_state): if context: - src, srcline = self.state_machine.get_source_and_line() self.messages.append( self.reporter.error('Inconsistent literal block quoting.', - source=src, line=srcline)) + line=self.state_machine.abs_line_number())) self.state_machine.previous_line() raise EOFError Modified: trunk/docutils/docutils/statemachine.py =================================================================== --- trunk/docutils/docutils/statemachine.py 2012-01-06 18:51:12 UTC (rev 7309) +++ trunk/docutils/docutils/statemachine.py 2012-01-09 15:01:15 UTC (rev 7310) @@ -416,8 +416,8 @@ flush_left) self.next_line(len(block) - 1) return block - except UnexpectedIndentationError, error: - block, source, lineno = error.args + except UnexpectedIndentationError, err: + block = err.args[0] self.next_line(len(block) - 1) # advance to last line of block raise This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2012-10-12 12:21:24
|
Revision: 7527 http://docutils.svn.sourceforge.net/docutils/?rev=7527&view=rev Author: milde Date: 2012-10-12 12:21:18 +0000 (Fri, 12 Oct 2012) Log Message: ----------- Use validate_comma_separated_string_list for stylesheet setting. Modified Paths: -------------- trunk/docutils/docutils/utils/__init__.py trunk/docutils/docutils/writers/html4css1/__init__.py trunk/docutils/docutils/writers/latex2e/__init__.py Modified: trunk/docutils/docutils/utils/__init__.py =================================================================== --- trunk/docutils/docutils/utils/__init__.py 2012-10-12 11:54:01 UTC (rev 7526) +++ trunk/docutils/docutils/utils/__init__.py 2012-10-12 12:21:18 UTC (rev 7527) @@ -509,14 +509,11 @@ """ assert not (settings.stylesheet and settings.stylesheet_path), ( 'stylesheet and stylesheet_path are mutually exclusive.') - if settings.stylesheet_path: - sheets = settings.stylesheet_path.split(",") - elif settings.stylesheet: - sheets = settings.stylesheet.split(",") - else: - sheets = [] - # strip whitespace (frequently occuring in config files) - return [sheet.strip(u' \t\n') for sheet in sheets] + stylesheets = settings.stylesheet_path or settings.stylesheet or [] + # programmatically set default can be string or unicode: + if not isinstance(stylesheets, list): + stylesheets = [cls.strip() for cls in stylesheets.split(',')] + return stylesheets def get_trim_footnote_ref_space(settings): """ Modified: trunk/docutils/docutils/writers/html4css1/__init__.py =================================================================== --- trunk/docutils/docutils/writers/html4css1/__init__.py 2012-10-12 11:54:01 UTC (rev 7526) +++ trunk/docutils/docutils/writers/html4css1/__init__.py 2012-10-12 12:21:18 UTC (rev 7527) @@ -65,14 +65,16 @@ ('Specify comma separated list of stylesheet URLs. ' 'Overrides previous --stylesheet and --stylesheet-path settings.', ['--stylesheet'], - {'metavar': '<URL>', 'overrides': 'stylesheet_path'}), + {'metavar': '<URL>', 'overrides': 'stylesheet_path', + 'validator': frontend.validate_comma_separated_list}), ('Specify comma separated list of stylesheet paths. ' 'With --link-stylesheet, ' 'the path is rewritten relative to the output HTML file. ' 'Default: "%s"' % default_stylesheet_path, ['--stylesheet-path'], {'metavar': '<file>', 'overrides': 'stylesheet', - 'default': default_stylesheet_path}), + 'validator': frontend.validate_comma_separated_list, + 'default': [default_stylesheet_path]}), ('Embed the stylesheet(s) in the output HTML file. The stylesheet ' 'files must be accessible during processing. This is the default.', ['--embed-stylesheet'], @@ -300,6 +302,7 @@ self.body_suffix = ['</body>\n</html>\n'] self.section_level = 0 self.initial_header_level = int(settings.initial_header_level) + self.math_output = settings.math_output.lower() # A heterogenous stack used in conjunction with the tree traversal. # Make sure that the pops correspond to the pushes: @@ -1164,10 +1167,16 @@ self.body.append('\n</pre>\n') def visit_math(self, node, math_env=''): + # If the method is called from visit_math_block(), math_env != ''. + # As there is no native HTML math support, we provide alternatives: # LaTeX and MathJax math_output modes simply wrap the content, # HTML and MathML math_output modes also convert the math_code. - # If the method is called from visit_math_block(), math_env != ''. + if self.math_output not in ('mathml', 'html', 'mathjax', 'latex'): + self.document.reporter.error( + 'math-output format "%s" not supported ' + 'falling back to "latex"'% self.math_output) + self.math_output = 'latex' # # HTML container tags = {# math_output: (block, inline, class-arguments) Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2012-10-12 11:54:01 UTC (rev 7526) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2012-10-12 12:21:18 UTC (rev 7527) @@ -88,11 +88,13 @@ ' Overrides previous --stylesheet and --stylesheet-path settings.', ['--stylesheet'], {'default': '', 'metavar': '<file>', - 'overrides': 'stylesheet_path'}), + 'overrides': 'stylesheet_path', + 'validator': frontend.validate_comma_separated_list}), ('Like --stylesheet, but the path is rewritten ' 'relative to the output file. ', ['--stylesheet-path'], - {'metavar': '<file>', 'overrides': 'stylesheet'}), + {'metavar': '<file>', 'overrides': 'stylesheet', + 'validator': frontend.validate_comma_separated_list}), ('Link to the stylesheet(s) in the output file. (default)', ['--link-stylesheet'], {'dest': 'embed_stylesheet', 'action': 'store_false'}), @@ -226,14 +228,11 @@ # Override parent method to add latex-specific transforms def get_transforms(self): - # call the parent class' method - transform_list = writers.Writer.get_transforms(self) - # print transform_list + return writers.Writer.get_transforms(self) + [ # Convert specific admonitions to generic one - transform_list.append(writer_aux.Admonitions) + writer_aux.Admonitions, # TODO: footnote collection transform - # transform_list.append(footnotes.collect) - return transform_list + ] def translate(self): visitor = self.translator_class(self.document) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2012-12-12 22:04:55
|
Revision: 7544 http://docutils.svn.sourceforge.net/docutils/?rev=7544&view=rev Author: milde Date: 2012-12-12 22:04:49 +0000 (Wed, 12 Dec 2012) Log Message: ----------- smartquotes: non-breaking spaces for french quotes, LaTeX character conversion. Modified Paths: -------------- trunk/docutils/docutils/utils/smartquotes.py trunk/docutils/docutils/writers/latex2e/__init__.py Modified: trunk/docutils/docutils/utils/smartquotes.py =================================================================== --- trunk/docutils/docutils/utils/smartquotes.py 2012-12-07 13:09:00 UTC (rev 7543) +++ trunk/docutils/docutils/utils/smartquotes.py 2012-12-12 22:04:49 UTC (rev 7544) @@ -399,8 +399,9 @@ 'es-x-altquot': u'“”‘’', 'fi': u'””’’', 'fi-x-altquot': u'»»’’', - 'fr': (u'« ', u' »', u'‹ ', u' ›'), - 'fr-x-altquot': (u'“ ', u' ”', u'‘ ', u' ’'), + 'fr': (u'« ', u' »', u'‹ ', u' ›'), # with narrow no-break space + 'fr-x-altquot': u'«»‹›', # for use with manually set spaces + # 'fr-x-altquot': (u'“ ', u' ”', u'‘ ', u' ’'), # rarely used 'fr-ch': u'«»‹›', 'he': u'”“»«', 'he-x-altquot': u'„”‚’', Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2012-12-07 13:09:00 UTC (rev 7543) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2012-12-12 22:04:49 UTC (rev 7544) @@ -728,6 +728,8 @@ } # Unicode chars that are recognized by LaTeX's utf8 encoding utf8_supported_unicode = { + 0x00AB: ur'\guillemotleft', # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + 0x00bb: ur'\guillemotright', # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 0x200C: ur'\textcompwordmark', # ZERO WIDTH NON-JOINER 0x2013: ur'\textendash{}', 0x2014: ur'\textemdash{}', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2013-07-03 09:57:38
|
Revision: 7678 http://sourceforge.net/p/docutils/code/7678 Author: milde Date: 2013-07-03 09:57:36 +0000 (Wed, 03 Jul 2013) Log Message: ----------- Apply #106 and #107: language support for danish. Added Paths: ----------- trunk/docutils/docutils/languages/da.py trunk/docutils/docutils/parsers/rst/languages/da.py Added: trunk/docutils/docutils/languages/da.py =================================================================== --- trunk/docutils/docutils/languages/da.py (rev 0) +++ trunk/docutils/docutils/languages/da.py 2013-07-03 09:57:36 UTC (rev 7678) @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# $Id$ +# Author: E D +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read <http://docutils.sf.net/docs/howto/i18n.html>. Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Danish-language mappings for language-dependent features of Docutils. +""" + +__docformat__ = 'reStructuredText' + +labels = { + # fixed: language-dependent + 'author': u'Forfatter', + 'authors': u'Forfattere', + 'organization': u'Organisation', + 'address': u'Adresse', + 'contact': u'Kontakt', + 'version': u'Version', + 'revision': u'Revision', + 'status': u'Status', + 'date': u'Dato', + 'copyright': u'Copyright', + 'dedication': u'Dedikation', + 'abstract': u'Resumé', + 'attention': u'Giv agt!', + 'caution': u'Pas på!', + 'danger': u'!FARE!', + 'error': u'Fejl', + 'hint': u'Vink', + 'important': u'Vigtigt', + 'note': u'Bemærk', + 'tip': u'Tips', + 'warning': u'Advarsel', + 'contents': u'Indhold'} +"""Mapping of node class name to label text.""" + +bibliographic_fields = { + # language-dependent: fixed + u'forfatter': 'author', + u'forfattere': 'authors', + u'organisation': 'organization', + u'adresse': 'address', + u'kontakt': 'contact', + u'version': 'version', + u'revision': 'revision', + u'status': 'status', + u'dato': 'date', + u'copyright': 'copyright', + u'dedikation': 'dedication', + u'resume': 'abstract', + u'resumé': 'abstract'} +"""Danish (lowcased) to canonical name mapping for bibliographic fields.""" + +author_separators = [';', ','] +"""List of separator strings for the 'Authors' bibliographic field. Tried in +order.""" Property changes on: trunk/docutils/docutils/languages/da.py ___________________________________________________________________ Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: trunk/docutils/docutils/parsers/rst/languages/da.py =================================================================== --- trunk/docutils/docutils/parsers/rst/languages/da.py (rev 0) +++ trunk/docutils/docutils/parsers/rst/languages/da.py 2013-07-03 09:57:36 UTC (rev 7678) @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +# $Id$ +# Author: E D +# Copyright: This module has been placed in the public domain. + +# New language mappings are welcome. Before doing a new translation, please +# read <http://docutils.sf.net/docs/howto/i18n.html>. Two files must be +# translated for each language: one in docutils/languages, the other in +# docutils/parsers/rst/languages. + +""" +Danish-language mappings for language-dependent features of +reStructuredText. +""" + +__docformat__ = 'reStructuredText' + + +directives = { + # language-dependent: fixed + u'giv agt': 'attention', + u'pas på': 'caution', + u'kode': 'code', + u'kode-blok': 'code', + u'kildekode': 'code', + u'fare': 'danger', + u'fejl': 'error', + u'vink': 'hint', + u'vigtigt': 'important', + u'bemærk': 'note', + u'tips': 'tip', + u'advarsel': 'warning', + u'formaning': 'admonition', + u'sidebjælke': 'sidebar', + u'emne': 'topic', + u'linje-blok': 'line-block', + u'linie-blok': 'line-block', + u'parset-literal': 'parsed-literal', + u'rubrik': 'rubric', + u'epigraf': 'epigraph', + u'fremhævninger': 'highlights', + u'pull-quote (translation required)': 'pull-quote', + u'compound (translation required)': 'compound', + u'container (translation required)': 'container', + #'questions': 'questions', + u'tabel': 'table', + u'csv-tabel': 'csv-table', + u'liste-tabel': 'list-table', + #'qa': 'questions', + #'faq': 'questions', + u'meta': 'meta', + u'math (translation required)': 'math', + #'imagemap': 'imagemap', + u'billede': 'image', + u'figur': 'figure', + u'inkludér': 'include', + u'inkluder': 'include', + u'rå': 'raw', + u'erstat': 'replace', + u'unicode': 'unicode', + u'dato': 'date', + u'klasse': 'class', + u'rolle': 'role', + u'forvalgt-rolle': 'default-role', + u'titel': 'title', + u'indhold': 'contents', + u'sektnum': 'sectnum', + u'sektions-nummerering': 'sectnum', + u'sidehovede': 'header', + u'sidefod': 'footer', + #'footnotes': 'footnotes', + #'citations': 'citations', + u'target-notes (translation required)': 'target-notes', + u'restructuredtext-test-direktiv': 'restructuredtext-test-directive'} +"""Danish name to registered (in directives/__init__.py) directive name +mapping.""" + +roles = { + # language-dependent: fixed + u'forkortelse': 'abbreviation', + u'fork': 'abbreviation', + u'akronym': 'acronym', + u'ac (translation required)': 'acronym', + u'kode': 'code', + u'indeks': 'index', + u'i': 'index', + u'subscript (translation required)': 'subscript', + u'sub (translation required)': 'subscript', + u'superscript (translation required)': 'superscript', + u'sup (translation required)': 'superscript', + u'titel-reference': 'title-reference', + u'titel': 'title-reference', + u't': 'title-reference', + u'pep-reference': 'pep-reference', + u'pep': 'pep-reference', + u'rfc-reference': 'rfc-reference', + u'rfc': 'rfc-reference', + u'emfase': 'emphasis', + u'kraftig': 'strong', + u'literal': 'literal', + u'math (translation required)': 'math', + u'navngivet-reference': 'named-reference', + u'anonym-reference': 'anonymous-reference', + u'fodnote-reference': 'footnote-reference', + u'citation-reference (translation required)': 'citation-reference', + u'substitutions-reference': 'substitution-reference', + u'target (translation required)': 'target', + u'uri-reference': 'uri-reference', + u'uri': 'uri-reference', + u'url': 'uri-reference', + u'rå': 'raw',} +"""Mapping of Danish role names to canonical role names for interpreted text. +""" Property changes on: trunk/docutils/docutils/parsers/rst/languages/da.py ___________________________________________________________________ Added: svn:keywords ## -0,0 +1 ## +Author Date Id Revision \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2015-04-20 14:05:35
|
Revision: 7884 http://sourceforge.net/p/docutils/code/7884 Author: milde Date: 2015-04-20 14:05:27 +0000 (Mon, 20 Apr 2015) Log Message: ----------- Safe import of "pygments": syntax errors with Py 3.1 and 3.2. Modified Paths: -------------- trunk/docutils/docutils/utils/code_analyzer.py trunk/docutils/docutils/writers/odf_odt/__init__.py Modified: trunk/docutils/docutils/utils/code_analyzer.py =================================================================== --- trunk/docutils/docutils/utils/code_analyzer.py 2015-04-20 10:57:46 UTC (rev 7883) +++ trunk/docutils/docutils/utils/code_analyzer.py 2015-04-20 14:05:27 UTC (rev 7884) @@ -13,7 +13,7 @@ from pygments.lexers import get_lexer_by_name from pygments.formatters.html import _get_ttype_class with_pygments = True -except ImportError: +except (ImportError, SyntaxError): # pygments 2.0.1 fails with Py 3.1 and 3.2 with_pygments = False # Filter the following token types from the list of class arguments: Modified: trunk/docutils/docutils/writers/odf_odt/__init__.py =================================================================== --- trunk/docutils/docutils/writers/odf_odt/__init__.py 2015-04-20 10:57:46 UTC (rev 7883) +++ trunk/docutils/docutils/writers/odf_odt/__init__.py 2015-04-20 14:05:27 UTC (rev 7884) @@ -58,7 +58,7 @@ import pygments.lexers from pygmentsformatter import OdtPygmentsProgFormatter, \ OdtPygmentsLaTeXFormatter -except ImportError, exp: +except (ImportError, SyntaxError), exp: pygments = None # check for the Python Imaging Library This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2016-08-18 21:22:01
|
Revision: 7968 http://sourceforge.net/p/docutils/code/7968 Author: milde Date: 2016-08-18 21:21:58 +0000 (Thu, 18 Aug 2016) Log Message: ----------- Fix persian language module. Modified Paths: -------------- trunk/docutils/docutils/languages/fa.py trunk/docutils/docutils/parsers/rst/languages/fa.py Modified: trunk/docutils/docutils/languages/fa.py =================================================================== --- trunk/docutils/docutils/languages/fa.py 2016-08-18 13:19:19 UTC (rev 7967) +++ trunk/docutils/docutils/languages/fa.py 2016-08-18 21:21:58 UTC (rev 7968) @@ -16,46 +16,46 @@ labels = { # fixed: language-dependent - 'author': 'نویسنده', - 'authors': 'نویسندگان', - 'organization': 'سازمان', - 'address': 'آدرس', - 'contact': 'تماس', - 'version': 'نسخه', - 'revision': 'بازبینی', - 'status': 'وضعیت', - 'date': 'تاریخ', - 'copyright': 'کپیرایت', - 'dedication': 'تخصیص', - 'abstract': 'چکیده', - 'attention': 'توجه!', - 'caution': 'احتیاط!', - 'danger': 'خطر!', - 'error': 'خطا', - 'hint': 'راهنما', - 'important': 'مهم', - 'note': 'یادداشت', - 'tip': 'نکته', - 'warning': 'اخطار', - 'contents': 'محتوا'} + u'author': u'نویسنده', + u'authors': u'نویسندگان', + u'organization': u'سازمان', + u'address': u'آدرس', + u'contact': u'تماس', + u'version': u'نسخه', + u'revision': u'بازبینی', + u'status': u'وضعیت', + u'date': u'تاریخ', + u'copyright': u'کپیرایت', + u'dedication': u'تخصیص', + u'abstract': u'چکیده', + u'attention': u'توجه!', + u'caution': u'احتیاط!', + u'danger': u'خطر!', + u'error': u'خطا', + u'hint': u'راهنما', + u'important': u'مهم', + u'note': u'یادداشت', + u'tip': u'نکته', + u'warning': u'اخطار', + u'contents': u'محتوا'} """Mapping of node class name to label text.""" bibliographic_fields = { # language-dependent: fixed - 'author': 'نویسنده', - 'authors': 'نویسندگان', - 'organization': 'سازمان', - 'address': 'آدرس', - 'contact': 'تماس', - 'version': 'نسخه', - 'revision': 'بازبینی', - 'status': 'وضعیت', - 'date': 'تاریخ', - 'copyright': 'کپیرایت', - 'dedication': 'تخصیص', - 'abstract': 'چکیده'} + u'نویسنده': u'author', + u'نویسندگان': u'authors', + u'سازمان': u'organization', + u'آدرس': u'address', + u'تماس': u'contact', + u'نسخه': u'version', + u'بازبینی': u'revision', + u'وضعیت': u'status', + u'تاریخ': u'date', + u'کپیرایت': u'copyright', + u'تخصیص': u'dedication', + u'چکیده': u'abstract'} """Persian (lowcased) to canonical name mapping for bibliographic fields.""" -author_separators = ['؛', '،'] +author_separators = [u'؛', u'،'] """List of separator strings for the 'Authors' bibliographic field. Tried in order.""" Modified: trunk/docutils/docutils/parsers/rst/languages/fa.py =================================================================== --- trunk/docutils/docutils/parsers/rst/languages/fa.py 2016-08-18 13:19:19 UTC (rev 7967) +++ trunk/docutils/docutils/parsers/rst/languages/fa.py 2016-08-18 21:21:58 UTC (rev 7968) @@ -18,84 +18,85 @@ directives = { # language-dependent: fixed - 'توجه': 'attention', - 'احتیاط': 'caution', - 'کد': 'code', - 'بلوک-کد': 'code', - 'کد-منبع': 'code', - 'خطر': 'danger', - 'خطا': 'error', - 'راهنما': 'hint', - 'مهم': 'important', - 'یادداشت': 'note', - 'نکته': 'tip', - 'اخطار': 'warning', - 'تذکر': 'admonition', - 'نوار-کناری': 'sidebar', - 'موضوع': 'topic', - 'بلوک-خط': 'line-block', - 'تلفظ-پردازش-شده': 'parsed-literal', - 'سر-فصل': 'rubric', - 'کتیبه': 'epigraph', - 'نکات-برجسته': 'highlights', - 'نقل-قول': 'pull-quote', - 'ترکیب': 'compound', - 'ظرف': 'container', - #'questions': 'questions', - 'جدول': 'table', - 'جدول-csv': 'csv-table', - 'جدول-لیست': 'list-table', - #'qa': 'questions', - #'faq': 'questions', - 'متا': 'meta', - 'ریاضی': 'math', - #'imagemap': 'imagemap', - 'تصویر': 'image', - 'شکل': 'figure', - 'شامل': 'include', - 'خام': 'raw', - 'جایگزین': 'replace', - 'یونیکد': 'unicode', - 'تاریخ': 'date', - 'کلاس': 'class', - 'قانون': 'role', - 'قانون-پیشفرض': 'default-role', - 'عنوان': 'title', - 'محتوا': 'contents', - 'شماره-فصل': 'sectnum', - 'شمارهگذاری-فصل': 'sectnum', - 'سرآیند': 'header', - 'پاصفحه': 'footer', - #'footnotes': 'footnotes', - #'citations': 'citations', - 'یادداشت-هدف': 'target-notes', + u'توجه': u'attention', + u'احتیاط': u'caution', + u'کد': u'code', + u'بلوک-کد': u'code', + u'کد-منبع': u'code', + u'خطر': u'danger', + u'خطا': u'error', + u'راهنما': u'hint', + u'مهم': u'important', + u'یادداشت': u'note', + u'نکته': u'tip', + u'اخطار': u'warning', + u'تذکر': u'admonition', + u'نوار-کناری': u'sidebar', + u'موضوع': u'topic', + u'بلوک-خط': u'line-block', + u'تلفظ-پردازش-شده': u'parsed-literal', + u'سر-فصل': u'rubric', + u'کتیبه': u'epigraph', + u'نکات-برجسته': u'highlights', + u'نقل-قول': u'pull-quote', + u'ترکیب': u'compound', + u'ظرف': u'container', + #'questions': u'questions', + u'جدول': u'table', + u'جدول-csv': u'csv-table', + u'جدول-لیست': u'list-table', + #'qa': u'questions', + #'faq': u'questions', + u'متا': u'meta', + u'ریاضی': u'math', + #'imagemap': u'imagemap', + u'تصویر': u'image', + u'شکل': u'figure', + u'شامل': u'include', + u'خام': u'raw', + u'جایگزین': u'replace', + u'یونیکد': u'unicode', + u'تاریخ': u'date', + u'کلاس': u'class', + u'قانون': u'role', + u'قانون-پیشفرض': u'default-role', + u'عنوان': u'title', + u'محتوا': u'contents', + u'شماره-فصل': u'sectnum', + u'شمارهگذاری-فصل': u'sectnum', + u'سرآیند': u'header', + u'پاصفحه': u'footer', + #'footnotes': u'footnotes', + #'citations': u'citations', + u'یادداشت-هدف': u'target-notes', } """Persian name to registered (in directives/__init__.py) directive name mapping.""" roles = { # language-dependent: fixed - 'مخفف': 'abbreviation', - 'سرنام': 'acronym', - 'کد': 'code', - 'شاخص': 'index', - 'زیرنویس': 'subscript', - 'بالانویس': 'superscript', - 'عنوان': 'title-reference', - 'نیرو': 'pep-reference', - 'تاکید': 'emphasis', - 'قوی': 'strong', - 'لفظی': 'literal', - 'ریاضی': 'math', - 'منبع-نامگذاری': 'named-reference', - 'منبع-ناشناس': 'anonymous-reference', - 'منبع-پانویس': 'footnote-reference', - 'منبع-نقلفول': 'citation-reference', - 'منبع-جایگزینی': 'substitution-reference', - 'هدف': 'target', - 'منبع-uri': 'uri-reference', - 'uri': 'uri-reference', - 'url': 'uri-reference', - 'خام': 'raw',} + u'مخفف': u'abbreviation', + u'سرنام': u'acronym', + u'کد': u'code', + u'شاخص': u'index', + u'زیرنویس': u'subscript', + u'بالانویس': u'superscript', + u'عنوان': u'title-reference', + u'نیرو': u'pep-reference', + u'rfc-reference (translation required)': u'rfc-reference', + u'تاکید': u'emphasis', + u'قوی': u'strong', + u'لفظی': u'literal', + u'ریاضی': u'math', + u'منبع-نامگذاری': u'named-reference', + u'منبع-ناشناس': u'anonymous-reference', + u'منبع-پانویس': u'footnote-reference', + u'منبع-نقلفول': u'citation-reference', + u'منبع-جایگزینی': u'substitution-reference', + u'هدف': u'target', + u'منبع-uri': u'uri-reference', + u'uri': u'uri-reference', + u'url': u'uri-reference', + u'خام': u'raw',} """Mapping of Persian role names to canonical role names for interpreted text. """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2016-12-10 17:51:01
|
Revision: 7995 http://sourceforge.net/p/docutils/code/7995 Author: milde Date: 2016-12-10 17:50:59 +0000 (Sat, 10 Dec 2016) Log Message: ----------- Apply patch by Neil Schemenauer to fix bad string escapes (http://permalink.gmane.org/gmane.text.docutils.devel/7521). Modified Paths: -------------- trunk/docutils/docutils/io.py trunk/docutils/docutils/parsers/rst/__init__.py trunk/docutils/docutils/transforms/peps.py trunk/docutils/docutils/utils/math/latex2mathml.py trunk/docutils/docutils/utils/math/math2html.py trunk/docutils/docutils/writers/_html_base.py trunk/docutils/docutils/writers/latex2e/__init__.py trunk/docutils/docutils/writers/manpage.py Modified: trunk/docutils/docutils/io.py =================================================================== --- trunk/docutils/docutils/io.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/io.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -122,7 +122,7 @@ '%s.\n(%s)' % (', '.join([repr(enc) for enc in encodings]), ErrorString(error))) - coding_slug = re.compile(b("coding[:=]\s*([-\w.]+)")) + coding_slug = re.compile(b(r"coding[:=]\s*([-\w.]+)")) """Encoding declaration pattern.""" byte_order_marks = ((codecs.BOM_UTF8, 'utf-8'), # 'utf-8-sig' new in v2.5 Modified: trunk/docutils/docutils/parsers/rst/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/__init__.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/parsers/rst/__init__.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -145,7 +145,7 @@ ('Inline markup recognized at word boundaries only ' '(adjacent to punctuation or whitespace). ' 'Force character-level inline markup recognition with ' - '"\ " (backslash + space). Default.', + '"\\ " (backslash + space). Default.', ['--word-level-inline-markup'], {'action': 'store_false', 'dest': 'character_level_inline_markup'}), ('Inline markup recognized anywhere, regardless of surrounding ' Modified: trunk/docutils/docutils/transforms/peps.py =================================================================== --- trunk/docutils/docutils/transforms/peps.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/transforms/peps.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -113,7 +113,7 @@ elif name in ('replaces', 'replaced-by', 'requires'): newbody = [] space = nodes.Text(' ') - for refpep in re.split(',?\s+', body.astext()): + for refpep in re.split(r',?\s+', body.astext()): pepno = int(refpep) newbody.append(nodes.reference( refpep, refpep, Modified: trunk/docutils/docutils/utils/math/latex2mathml.py =================================================================== --- trunk/docutils/docutils/utils/math/latex2mathml.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/utils/math/latex2mathml.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -151,8 +151,8 @@ } negatables = {'=': u'\u2260', - '\in': u'\u2209', - '\equiv': u'\u2262'} + r'\in': u'\u2209', + r'\equiv': u'\u2262'} # LaTeX to MathML translation stuff: class math: Modified: trunk/docutils/docutils/utils/math/math2html.py =================================================================== --- trunk/docutils/docutils/utils/math/math2html.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/utils/math/math2html.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -4101,7 +4101,7 @@ def emptycommand(self, pos): """Check for an empty command: look for command disguised as ending. - Special case against '{ \{ \} }' situation.""" + Special case against '{ \\{ \\} }' situation.""" command = '' if not pos.isout(): ending = pos.nextending() Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/writers/_html_base.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -1032,7 +1032,7 @@ wrappers = {# math_mode: (inline, block) 'mathml': ('$%s$', u'\\begin{%s}\n%s\n\\end{%s}'), 'html': ('$%s$', u'\\begin{%s}\n%s\n\\end{%s}'), - 'mathjax': ('\(%s\)', u'\\begin{%s}\n%s\n\\end{%s}'), + 'mathjax': (r'\(%s\)', u'\\begin{%s}\n%s\n\\end{%s}'), 'latex': (None, None), } wrapper = wrappers[self.math_output][math_env != ''] Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -1194,7 +1194,7 @@ (none, self.literal_block_env, self.literal_block_options, - none ) = re.split('(\w+)(.*)', settings.literal_block_env) + none ) = re.split(r'(\w+)(.*)', settings.literal_block_env) elif settings.use_verbatim_when_possible: self.literal_block_env = 'verbatim' # @@ -1462,7 +1462,7 @@ def encode(self, text): """Return text with 'problematic' characters escaped. - * Escape the special printing characters ``# $ % & ~ _ ^ \ { }``, + * Escape the special printing characters ``# $ % & ~ _ ^ \\ { }``, square brackets ``[ ]``, double quotes and (in OT1) ``< | >``. * Translate non-supported Unicode characters. * Separate ``-`` (and more in literal text) to prevent input ligatures. @@ -1561,7 +1561,7 @@ def ids_to_labels(self, node, set_anchor=True): """Return list of label definitions for all ids of `node` - If `set_anchor` is True, an anchor is set with \phantomsection. + If `set_anchor` is True, an anchor is set with \\phantomsection. """ labels = ['\\label{%s}' % id for id in node.get('ids', [])] if set_anchor and labels: @@ -1919,7 +1919,7 @@ self.titledata.append('%%% Title Data') # \title (empty \title prevents error with \maketitle) if self.title: - self.title.insert(0, '\phantomsection%\n ') + self.title.insert(0, '\\phantomsection%\n ') title = [''.join(self.title)] + self.title_labels if self.subtitle: title += [r'\\ % subtitle', @@ -2266,7 +2266,7 @@ if pxunit is not None: sys.stderr.write('deprecation warning: LaTeXTranslator.to_latex_length()' ' option `pxunit` will be removed.') - match = re.match('(\d*\.?\d*)\s*(\S*)', length_str) + match = re.match(r'(\d*\.?\d*)\s*(\S*)', length_str) if not match: return length_str value, unit = match.groups()[:2] @@ -2378,7 +2378,7 @@ self.out.append('\\end{DUlegend}\n') def visit_line(self, node): - self.out.append('\item[] ') + self.out.append(r'\item[] ') def depart_line(self, node): self.out.append('\n') @@ -2522,7 +2522,7 @@ math_code = '\n'.join([math_code] + self.ids_to_labels(node)) if math_env == '$': if self.alltt: - wrapper = u'\(%s\)' + wrapper = ur'\(%s\)' else: wrapper = u'$%s$' else: @@ -2801,7 +2801,7 @@ line = ', line~%s' % node['line'] except KeyError: line = '' - self.out.append('\n\n{\color{red}%s/%s} in \\texttt{%s}%s\n' % + self.out.append('\n\n{\\color{red}%s/%s} in \\texttt{%s}%s\n' % (node['type'], node['level'], self.encode(node['source']), line)) if len(node['backrefs']) == 1: Modified: trunk/docutils/docutils/writers/manpage.py =================================================================== --- trunk/docutils/docutils/writers/manpage.py 2016-12-10 17:41:45 UTC (rev 7994) +++ trunk/docutils/docutils/writers/manpage.py 2016-12-10 17:50:59 UTC (rev 7995) @@ -368,7 +368,7 @@ tmpl = (".TH %(title_upper)s %(manual_section)s" " \"%(date)s\" \"%(version)s\" \"%(manual_group)s\"\n" ".SH NAME\n" - "%(title)s \- %(subtitle)s\n") + "%(title)s \\- %(subtitle)s\n") return tmpl % self._docinfo def append_header(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2016-12-22 23:02:46
|
Revision: 8006 http://sourceforge.net/p/docutils/code/8006 Author: milde Date: 2016-12-22 23:02:44 +0000 (Thu, 22 Dec 2016) Log Message: ----------- Update Swedish and German language files. Modified Paths: -------------- trunk/docutils/docutils/languages/sv.py trunk/docutils/docutils/parsers/rst/languages/de.py trunk/docutils/docutils/parsers/rst/languages/sv.py Modified: trunk/docutils/docutils/languages/sv.py =================================================================== --- trunk/docutils/docutils/languages/sv.py 2016-12-22 09:19:38 UTC (rev 8005) +++ trunk/docutils/docutils/languages/sv.py 2016-12-22 23:02:44 UTC (rev 8006) @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # $Id$ # Author: Adam Chodorowski <cho...@us...> # Copyright: This module has been placed in the public domain. @@ -14,8 +15,8 @@ __docformat__ = 'reStructuredText' labels = { - 'author': u'F\u00f6rfattare', - 'authors': u'F\u00f6rfattare', + 'author': u'Författare', + 'authors': u'Författare', 'organization': u'Organisation', 'address': u'Adress', 'contact': u'Kontakt', @@ -27,20 +28,20 @@ 'dedication': u'Dedikation', 'abstract': u'Sammanfattning', 'attention': u'Observera!', - 'caution': u'Varning!', + 'caution': u'Akta!', # 'Varning' already used for 'warning' 'danger': u'FARA!', 'error': u'Fel', - 'hint': u'V\u00e4gledning', + 'hint': u'Vink', 'important': u'Viktigt', 'note': u'Notera', 'tip': u'Tips', 'warning': u'Varning', - 'contents': u'Inneh\u00e5ll' } + 'contents': u'Innehåll' } """Mapping of node class name to label text.""" bibliographic_fields = { # 'Author' and 'Authors' identical in Swedish; assume the plural: - u'f\u00f6rfattare': 'authors', + u'författare': 'authors', u' n/a': 'author', u'organisation': 'organization', u'adress': 'address', Modified: trunk/docutils/docutils/parsers/rst/languages/de.py =================================================================== --- trunk/docutils/docutils/parsers/rst/languages/de.py 2016-12-22 09:19:38 UTC (rev 8005) +++ trunk/docutils/docutils/parsers/rst/languages/de.py 2016-12-22 23:02:44 UTC (rev 8006) @@ -30,13 +30,14 @@ 'warnung': 'warning', 'ermahnung': 'admonition', 'kasten': 'sidebar', - 'seitenkasten': 'sidebar', + 'seitenkasten': 'sidebar', # kept for backwards compatibiltity + 'seitenleiste': 'sidebar', 'thema': 'topic', - 'zeilen-block': 'line-block', + 'zeilenblock': 'line-block', 'parsed-literal (translation required)': 'parsed-literal', 'rubrik': 'rubric', 'epigraph': 'epigraph', - 'highlights (translation required)': 'highlights', + 'highlights': 'highlights', u'pull-quote': 'pull-quote', # commonly used in German too u'seitenansprache': 'pull-quote', # cf. http://www.typografie.info/2/wiki.php?title=Seitenansprache 'zusammengesetzt': 'compound', @@ -45,7 +46,7 @@ #'fragen': 'questions', 'tabelle': 'table', 'csv-tabelle': 'csv-table', - 'list-table (translation required)': 'list-table', + 'listentabelle': 'list-table', u'mathe': 'math', u'formel': 'math', 'meta': 'meta', @@ -62,14 +63,14 @@ 'datum': 'date', 'klasse': 'class', 'rolle': 'role', - u'default-role (translation required)': 'default-role', - u'title (translation required)': 'title', + u'standardrolle': 'default-role', + u'titel': 'title', 'inhalt': 'contents', - 'kapitel-nummerierung': 'sectnum', - 'abschnitts-nummerierung': 'sectnum', - u'linkziel-fußfnoten': 'target-notes', - u'header (translation required)': 'header', - u'footer (translation required)': 'footer', + u'kapitelnummerierung': 'sectnum', + u'abschnittsnummerierung': 'sectnum', + u'linkziel-fußnoten': 'target-notes', + u'kopfzeilen': 'header', + u'fußzeilen': 'footer', #u'fußfnoten': 'footnotes', #'zitate': 'citations', } @@ -86,7 +87,8 @@ 'titel-referenz': 'title-reference', 'pep-referenz': 'pep-reference', 'rfc-referenz': 'rfc-reference', - 'betonung': 'emphasis', + 'betonung': 'emphasis', # for backwards compatibility + 'betont': 'emphasis', 'fett': 'strong', u'wörtlich': 'literal', u'mathe': 'math', Modified: trunk/docutils/docutils/parsers/rst/languages/sv.py =================================================================== --- trunk/docutils/docutils/parsers/rst/languages/sv.py 2016-12-22 09:19:38 UTC (rev 8005) +++ trunk/docutils/docutils/parsers/rst/languages/sv.py 2016-12-22 23:02:44 UTC (rev 8006) @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # $Id$ # Author: Adam Chodorowski <cho...@us...> # Copyright: This module has been placed in the public domain. @@ -16,52 +17,53 @@ directives = { u'observera': 'attention', - u'caution (translation required)': 'caution', - u'code (translation required)': 'code', + u'akta': 'caution', # also 'försiktigt' + u'kod': 'code', u'fara': 'danger', u'fel': 'error', - u'v\u00e4gledning': 'hint', + u'vink': 'hint', # also 'hint' u'viktigt': 'important', u'notera': 'note', u'tips': 'tip', u'varning': 'warning', - u'admonition (translation required)': 'admonition', - u'sidebar (translation required)': 'sidebar', - u'\u00e4mne': 'topic', - u'line-block (translation required)': 'line-block', + u'anmärkning': 'admonition', # literal 'tillrättavisning', 'förmaning' + u'sidorad': 'sidebar', + u'ämne': 'topic', + u'tema': 'topic', + u'rad-block': 'line-block', u'parsed-literal (translation required)': 'parsed-literal', - u'mellanrubrik': 'rubric', - u'epigraph (translation required)': 'epigraph', - u'highlights (translation required)': 'highlights', + u'rubrik': 'rubric', + u'epigraf': 'epigraph', + u'höjdpunkter': 'highlights', u'pull-quote (translation required)': 'pull-quote', - u'compound (translation required)': 'compound', - u'container (translation required)': 'container', - # u'fr\u00e5gor': 'questions', + u'sammansatt': 'compound', + u'container': 'container', + # u'frågor': 'questions', # NOTE: A bit long, but recommended by http://www.nada.kth.se/dataterm/: - # u'fr\u00e5gor-och-svar': 'questions', - # u'vanliga-fr\u00e5gor': 'questions', - u'table (translation required)': 'table', - u'csv-table (translation required)': 'csv-table', - u'list-table (translation required)': 'list-table', + # u'frågor-och-svar': 'questions', + # u'vanliga-frågor': 'questions', + u'tabell': 'table', + u'csv-tabell': 'csv-table', + u'list-tabell': 'list-table', u'meta': 'meta', - 'math (translation required)': 'math', + u'matematik': 'math', # u'bildkarta': 'imagemap', # FIXME: Translation might be too literal. u'bild': 'image', u'figur': 'figure', - u'inkludera': 'include', - u'r\u00e5': 'raw', # FIXME: Translation might be too literal. - u'ers\u00e4tt': 'replace', + u'inkludera': 'include', + u'rå': 'raw', + u'ersätta': 'replace', u'unicode': 'unicode', u'datum': 'date', - u'class (translation required)': 'class', - u'role (translation required)': 'role', - u'default-role (translation required)': 'default-role', - u'title (translation required)': 'title', - u'inneh\u00e5ll': 'contents', + u'klass': 'class', + u'roll': 'role', + u'standardroll': 'default-role', + u'titel': 'title', + u'innehåll': 'contents', u'sektionsnumrering': 'sectnum', u'target-notes (translation required)': 'target-notes', - u'header (translation required)': 'header', - u'footer (translation required)': 'footer', + u'sidhuvud': 'header', + u'sidfot': 'footer', # u'fotnoter': 'footnotes', # u'citeringar': 'citations', } @@ -69,26 +71,26 @@ mapping.""" roles = { - u'abbreviation (translation required)': 'abbreviation', - u'acronym (translation required)': 'acronym', - u'code (translation required)': 'code', - u'index (translation required)': 'index', - u'subscript (translation required)': 'subscript', - u'superscript (translation required)': 'superscript', - u'title-reference (translation required)': 'title-reference', - u'pep-reference (translation required)': 'pep-reference', - u'rfc-reference (translation required)': 'rfc-reference', - u'emphasis (translation required)': 'emphasis', - u'strong (translation required)': 'strong', - u'literal (translation required)': 'literal', - 'math (translation required)': 'math', - u'named-reference (translation required)': 'named-reference', - u'anonymous-reference (translation required)': 'anonymous-reference', - u'footnote-reference (translation required)': 'footnote-reference', - u'citation-reference (translation required)': 'citation-reference', - u'substitution-reference (translation required)': 'substitution-reference', - u'target (translation required)': 'target', - u'uri-reference (translation required)': 'uri-reference', - u'r\u00e5': 'raw',} + u'förkortning': 'abbreviation', + u'akronym': 'acronym', + u'kod': 'code', + u'index': 'index', + u'nedsänkt': 'subscript', + u'upphöjd': 'superscript', + u'titel-referens': 'title-reference', + u'pep-referens': 'pep-reference', + u'rfc-referens': 'rfc-reference', + u'betoning': 'emphasis', + u'stark': 'strong', + u'bokstavlig': 'literal', # also 'ordagranna' + u'matematik': 'math', + u'namngiven-referens': 'named-reference', + u'anonym-referens': 'anonymous-reference', + u'fotnot-referens': 'footnote-reference', + u'citat-referens': 'citation-reference', + u'ersättnings-referens': 'substitution-reference', + u'mål': 'target', + u'uri-referens': 'uri-reference', + u'rå': 'raw',} """Mapping of Swedish role names to canonical role names for interpreted text. """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2017-05-30 21:04:20
|
Revision: 8095 http://sourceforge.net/p/docutils/code/8095 Author: milde Date: 2017-05-30 21:04:18 +0000 (Tue, 30 May 2017) Log Message: ----------- smart quotes: improve configurability of the transform, add more locales. The lists of "literal" inline and block-level nodes not requiring smartquote conversions are now attributes of the Smartquote transform class. Added Bulgarian, Macedonian, and Norwegian (Bokmaal and Nynorsk) quotes. Modified Paths: -------------- trunk/docutils/docutils/transforms/universal.py trunk/docutils/docutils/utils/smartquotes.py Modified: trunk/docutils/docutils/transforms/universal.py =================================================================== --- trunk/docutils/docutils/transforms/universal.py 2017-05-30 19:59:20 UTC (rev 8094) +++ trunk/docutils/docutils/transforms/universal.py 2017-05-30 21:04:18 UTC (rev 8095) @@ -218,6 +218,20 @@ default_priority = 850 + nodes_to_skip = [nodes.FixedTextElement, nodes.Special] + """Do not apply "smartquotes" to instances of these block-level nodes.""" + + literal_nodes = [nodes.image, nodes.literal, nodes.math, + nodes.raw, nodes.problematic] + """Do not change quotes in instances of these inline nodes.""" + + smartquotes_action = 'qDe' + """Setting to select smartquote transformations. + + The default 'qDe' educates normal quote characters: (", '), + em- and en-dashes (---, --) and ellipses (...). + """ + def __init__(self, document, startnode): Transform.__init__(self, document, startnode=startnode) self.unsupported_languages = set() @@ -230,11 +244,7 @@ False: 'plain'} for txtnode in txtnodes: nodetype = texttype[isinstance(txtnode.parent, - (nodes.literal, - nodes.math, - nodes.image, - nodes.raw, - nodes.problematic))] + self.literal_nodes)] yield (nodetype, txtnode.astext()) @@ -257,7 +267,7 @@ # (TextElement node) as a unit to keep context around inline nodes: for node in self.document.traverse(nodes.TextElement): # skip preformatted text blocks and special elements: - if isinstance(node, (nodes.FixedTextElement, nodes.Special)): + if isinstance(node, self.nodes_to_skip): continue # nested TextElements are not "block-level" elements: if isinstance(node.parent, nodes.TextElement): @@ -291,7 +301,7 @@ # Iterator educating quotes in plain text: # (see "utils/smartquotes.py" for the attribute setting) teacher = smartquotes.educate_tokens(self.get_tokens(txtnodes), - attr='qDe', language=lang) + attr=self.smartquotes_action, language=lang) for txtnode, newtext in zip(txtnodes, teacher): txtnode.parent.replace(txtnode, nodes.Text(newtext)) Modified: trunk/docutils/docutils/utils/smartquotes.py =================================================================== --- trunk/docutils/docutils/utils/smartquotes.py 2017-05-30 19:59:20 UTC (rev 8094) +++ trunk/docutils/docutils/utils/smartquotes.py 2017-05-30 21:04:18 UTC (rev 8095) @@ -396,6 +396,9 @@ # [5] http://www.btb.termiumplus.gc.ca/tpv2guides/guides/redac/index-fra.html # [6] https://en.wikipedia.org/wiki/Hebrew_punctuation#Quotation_marks # [7] http://www.tustep.uni-tuebingen.de/bi/bi00/bi001t1-anfuehrung.pdf + # [8] http://www.korrekturavdelingen.no/anforselstegn.htm + # [9] Typografisk håndbok. Oslo: Spartacus. 2000. s. 67. ISBN 8243001530. + # [10] http://www.typografi.org/sitat/sitatart.html # # TODO: configuration option, e.g.:: # @@ -404,6 +407,7 @@ # fr: « : »:‹ : ›, # :-separated list with NBSPs quotes = {'af': u'“”‘’', 'af-x-altquot': u'„”‚’', + 'bg': u'„“‚‘', # Bulgarian, https://bg.wikipedia.org/wiki/Кавички 'ca': u'«»“”', 'ca-x-altquot': u'“”‘’', 'cs': u'„“‚‘', @@ -442,13 +446,23 @@ 'it': u'«»“”', 'it-ch': u'«»‹›', 'it-x-altquot': u'“”‘’', - # 'it-x-altquot2': u'“„‘‚', # [7] antiquated? + # 'it-x-altquot2': u'“„‘‚', # [7] in headlines 'ja': u'「」『』', 'lt': u'„“‚‘', 'lv': u'„“‚‘', + 'mk': u'„“‚‘', # Macedonian, https://mk.wikipedia.org/wiki/Правопис_и_правоговор_на_македонскиот_јазик 'nl': u'“”‘’', 'nl-x-altquot': u'„”‚’', # 'nl-x-altquot2': u'””’’', + 'nb': u'«»’’', # Norsk bokmål (canonical form 'no') + 'nn': u'«»’’', # Nynorsk [10] + 'nn-x-altquot': u'«»‘’', # [8], [10] + # 'nn-x-altquot2': u'«»«»', # [9], [10 + # 'nn-x-altquot3': u'„“‚‘', # [10] + 'no': u'«»’’', # Norsk bokmål [10] + 'no-x-altquot': u'«»‘’', # [8], [10] + # 'no-x-altquot2': u'«»«»', # [9], [10 + # 'no-x-altquot3': u'„“‚‘', # [10] 'pl': u'„”«»', 'pl-x-altquot': u'«»‚’', # 'pl-x-altquot2': u'„”‚’', # https://pl.wikipedia.org/wiki/Cudzys%C5%82%C3%B3w This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2018-11-21 21:46:03
|
Revision: 8239 http://sourceforge.net/p/docutils/code/8239 Author: milde Date: 2018-11-21 21:46:00 +0000 (Wed, 21 Nov 2018) Log Message: ----------- Remove legacy compatibility defs for versions < 2.5. Modified Paths: -------------- trunk/docutils/docutils/languages/__init__.py trunk/docutils/docutils/parsers/__init__.py trunk/docutils/docutils/parsers/rst/directives/__init__.py trunk/docutils/docutils/parsers/rst/languages/__init__.py trunk/docutils/docutils/readers/__init__.py trunk/docutils/docutils/writers/__init__.py Modified: trunk/docutils/docutils/languages/__init__.py =================================================================== --- trunk/docutils/docutils/languages/__init__.py 2018-11-21 19:09:09 UTC (rev 8238) +++ trunk/docutils/docutils/languages/__init__.py 2018-11-21 21:46:00 UTC (rev 8239) @@ -14,9 +14,8 @@ import sys from docutils.utils import normalize_language_tag -if sys.version_info < (2,5): - from docutils._compat import __import__ + _languages = {} def get_language(language_code, reporter=None): Modified: trunk/docutils/docutils/parsers/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/__init__.py 2018-11-21 19:09:09 UTC (rev 8238) +++ trunk/docutils/docutils/parsers/__init__.py 2018-11-21 21:46:00 UTC (rev 8239) @@ -10,8 +10,6 @@ import sys from docutils import Component -if sys.version_info < (2,5): - from docutils._compat import __import__ class Parser(Component): Modified: trunk/docutils/docutils/parsers/rst/directives/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/__init__.py 2018-11-21 19:09:09 UTC (rev 8238) +++ trunk/docutils/docutils/parsers/rst/directives/__init__.py 2018-11-21 21:46:00 UTC (rev 8239) @@ -15,8 +15,6 @@ from docutils import nodes from docutils.utils import split_escaped_whitespace, escape2null, unescape from docutils.parsers.rst.languages import en as _fallback_language_module -if sys.version_info < (2,5): - from docutils._compat import __import__ _directive_registry = { Modified: trunk/docutils/docutils/parsers/rst/languages/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/languages/__init__.py 2018-11-21 19:09:09 UTC (rev 8238) +++ trunk/docutils/docutils/parsers/rst/languages/__init__.py 2018-11-21 21:46:00 UTC (rev 8239) @@ -15,9 +15,8 @@ import sys from docutils.utils import normalize_language_tag -if sys.version_info < (2,5): - from docutils._compat import __import__ + _languages = {} def get_language(language_code): Modified: trunk/docutils/docutils/readers/__init__.py =================================================================== --- trunk/docutils/docutils/readers/__init__.py 2018-11-21 19:09:09 UTC (rev 8238) +++ trunk/docutils/docutils/readers/__init__.py 2018-11-21 21:46:00 UTC (rev 8239) @@ -12,8 +12,6 @@ from docutils import utils, parsers, Component from docutils.transforms import universal -if sys.version_info < (2,5): - from docutils._compat import __import__ class Reader(Component): Modified: trunk/docutils/docutils/writers/__init__.py =================================================================== --- trunk/docutils/docutils/writers/__init__.py 2018-11-21 19:09:09 UTC (rev 8238) +++ trunk/docutils/docutils/writers/__init__.py 2018-11-21 21:46:00 UTC (rev 8239) @@ -14,8 +14,6 @@ import docutils from docutils import languages, Component from docutils.transforms import universal -if sys.version_info < (2,5): - from docutils._compat import __import__ class Writer(Component): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-03-12 17:03:13
|
Revision: 8251 http://sourceforge.net/p/docutils/code/8251 Author: milde Date: 2019-03-12 17:03:11 +0000 (Tue, 12 Mar 2019) Log Message: ----------- Apply patch #148: Remove handlers for deprecated nodes from LaTeX writer. Modified Paths: -------------- trunk/docutils/docutils/transforms/parts.py trunk/docutils/docutils/writers/latex2e/__init__.py Modified: trunk/docutils/docutils/transforms/parts.py =================================================================== --- trunk/docutils/docutils/transforms/parts.py 2019-02-21 20:05:39 UTC (rev 8250) +++ trunk/docutils/docutils/transforms/parts.py 2019-03-12 17:03:11 UTC (rev 8251) @@ -174,7 +174,6 @@ def ignore_node_but_process_children(self, node): raise nodes.SkipDeparture - visit_interpreted = ignore_node_but_process_children visit_problematic = ignore_node_but_process_children visit_reference = ignore_node_but_process_children visit_target = ignore_node_but_process_children Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2019-02-21 20:05:39 UTC (rev 8250) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2019-03-12 17:03:11 UTC (rev 8251) @@ -2192,12 +2192,6 @@ pass ##self.out.append('%[depart_field]\n') - def visit_field_argument(self, node): - self.out.append('%[visit_field_argument]\n') - - def depart_field_argument(self, node): - self.out.append('%[depart_field_argument]\n') - def visit_field_body(self, node): pass @@ -2441,14 +2435,6 @@ def depart_inline(self, node): self.out.append('}' * len(node['classes'])) - def visit_interpreted(self, node): - # @@@ Incomplete, pending a proper implementation on the - # Parser/Reader end. - self.visit_literal(node) - - def depart_interpreted(self, node): - self.depart_literal(node) - def visit_legend(self, node): self.fallbacks['legend'] = PreambleCmds.legend self.out.append('\\begin{DUlegend}') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-08-26 16:42:40
|
Revision: 8354 http://sourceforge.net/p/docutils/code/8354 Author: milde Date: 2019-08-26 16:42:38 +0000 (Mon, 26 Aug 2019) Log Message: ----------- py3: Replace 'sys.maxint' with 'sys.maxsize' >From the Python 3 release docs [1]: The sys.maxint constant was removed, since there is no longer a limit to the value of integers. However, sys.maxsize can be used as an integer larger than any practical list or string index. It conforms to the implementation's {U+201C}natural{U+201D} integer size and is typically the same as sys.maxint in previous releases on the same platform (assuming the same build options). [1] https://docs.python.org/3.1/whatsnew/3.0.html#integers Signed-off-by: Stephen Finucane <st...@th...ru> Modified Paths: -------------- trunk/docutils/docutils/nodes.py trunk/docutils/docutils/parsers/rst/tableparser.py trunk/docutils/docutils/statemachine.py trunk/docutils/docutils/transforms/parts.py Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2019-08-26 16:42:23 UTC (rev 8353) +++ trunk/docutils/docutils/nodes.py 2019-08-26 16:42:38 UTC (rev 8354) @@ -977,7 +977,7 @@ 'Losing "%s" attribute: %s' % (att, self[att]) self.parent.replace(self, new) - def first_child_matching_class(self, childclass, start=0, end=sys.maxint): + def first_child_matching_class(self, childclass, start=0, end=sys.maxsize): """ Return the index of the first child whose class exactly matches. @@ -997,7 +997,7 @@ return None def first_child_not_matching_class(self, childclass, start=0, - end=sys.maxint): + end=sys.maxsize): """ Return the index of the first child whose class does *not* match. Modified: trunk/docutils/docutils/parsers/rst/tableparser.py =================================================================== --- trunk/docutils/docutils/parsers/rst/tableparser.py 2019-08-26 16:42:23 UTC (rev 8353) +++ trunk/docutils/docutils/parsers/rst/tableparser.py 2019-08-26 16:42:38 UTC (rev 8354) @@ -498,7 +498,7 @@ """ # "Infinite" value for a dummy last column's beginning, used to # check for text overflow: - columns.append((sys.maxint, None)) + columns.append((sys.maxsize, None)) lastcol = len(columns) - 2 # combining characters do not contribute to the column width lines = [strip_combining_chars(line) for line in lines] Modified: trunk/docutils/docutils/statemachine.py =================================================================== --- trunk/docutils/docutils/statemachine.py 2019-08-26 16:42:23 UTC (rev 8353) +++ trunk/docutils/docutils/statemachine.py 2019-08-26 16:42:38 UTC (rev 8354) @@ -1341,7 +1341,7 @@ """A `ViewList` with string-specific methods.""" - def trim_left(self, length, start=0, end=sys.maxint): + def trim_left(self, length, start=0, end=sys.maxsize): """ Trim `length` characters off the beginning of each item, in-place, from index `start` to `end`. No whitespace-checking is done on the Modified: trunk/docutils/docutils/transforms/parts.py =================================================================== --- trunk/docutils/docutils/transforms/parts.py 2019-08-26 16:42:23 UTC (rev 8353) +++ trunk/docutils/docutils/transforms/parts.py 2019-08-26 16:42:38 UTC (rev 8354) @@ -37,7 +37,7 @@ self.startnode.parent.remove(self.startnode) if self.document.settings.sectnum_xform: if self.maxdepth is None: - self.maxdepth = sys.maxint + self.maxdepth = sys.maxsize self.update_section_numbers(self.document) else: # store details for eventual section numbering by the writer self.document.settings.sectnum_depth = self.maxdepth @@ -120,7 +120,7 @@ sections = [sect for sect in node if isinstance(sect, nodes.section)] entries = [] autonum = 0 - depth = self.startnode.details.get('depth', sys.maxint) + depth = self.startnode.details.get('depth', sys.maxsize) for section in sections: title = section[0] auto = title.get('auto') # May be set by SectNum. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-08-26 16:45:12
|
Revision: 8358 http://sourceforge.net/p/docutils/code/8358 Author: milde Date: 2019-08-26 16:45:09 +0000 (Mon, 26 Aug 2019) Log Message: ----------- Cleanup/simplify code following recent changes. Modified Paths: -------------- trunk/docutils/docutils/transforms/__init__.py trunk/docutils/docutils/writers/odf_odt/__init__.py Modified: trunk/docutils/docutils/transforms/__init__.py =================================================================== --- trunk/docutils/docutils/transforms/__init__.py 2019-08-26 16:44:51 UTC (rev 8357) +++ trunk/docutils/docutils/transforms/__init__.py 2019-08-26 16:45:09 UTC (rev 8358) @@ -153,8 +153,8 @@ unknown_reference_resolvers = [] for i in components: unknown_reference_resolvers.extend(i.unknown_reference_resolvers) - decorated_list = sorted([(f.priority, f) for f in unknown_reference_resolvers]) - self.unknown_reference_resolvers.extend([f[1] for f in decorated_list]) + decorated_list = sorted((f.priority, f) for f in unknown_reference_resolvers) + self.unknown_reference_resolvers.extend(f[1] for f in decorated_list) def apply_transforms(self): """Apply all of the stored transforms, in priority order.""" Modified: trunk/docutils/docutils/writers/odf_odt/__init__.py =================================================================== --- trunk/docutils/docutils/writers/odf_odt/__init__.py 2019-08-26 16:44:51 UTC (rev 8357) +++ trunk/docutils/docutils/writers/odf_odt/__init__.py 2019-08-26 16:45:09 UTC (rev 8358) @@ -51,12 +51,8 @@ try: import pygments import pygments.lexers - if sys.version_info.major >= 3: - from .pygmentsformatter import OdtPygmentsProgFormatter, \ - OdtPygmentsLaTeXFormatter - else: - from .pygmentsformatter import OdtPygmentsProgFormatter, \ - OdtPygmentsLaTeXFormatter + from .pygmentsformatter import (OdtPygmentsProgFormatter, + OdtPygmentsLaTeXFormatter) except (ImportError, SyntaxError): pygments = None This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-08-26 23:13:14
|
Revision: 8364 http://sourceforge.net/p/docutils/code/8364 Author: milde Date: 2019-08-26 23:13:12 +0000 (Mon, 26 Aug 2019) Log Message: ----------- Handle 'ConfigParser' to 'configparser' rename. Based on a patch by Stephen Finucane. Modified Paths: -------------- trunk/docutils/docutils/frontend.py trunk/docutils/docutils/writers/odf_odt/__init__.py Modified: trunk/docutils/docutils/frontend.py =================================================================== --- trunk/docutils/docutils/frontend.py 2019-08-26 23:13:04 UTC (rev 8363) +++ trunk/docutils/docutils/frontend.py 2019-08-26 23:13:12 UTC (rev 8364) @@ -33,10 +33,14 @@ import os.path import sys import warnings -import ConfigParser as CP import codecs import optparse from optparse import SUPPRESS_HELP +if sys.version_info >= (3,0): + from configparser import RawConfigParser +else: + from ConfigParser import RawConfigParser + import docutils import docutils.utils import docutils.nodes @@ -735,7 +739,7 @@ raise KeyError('No option with dest == %r.' % dest) -class ConfigParser(CP.RawConfigParser): +class ConfigParser(RawConfigParser): old_settings = { 'pep_stylesheet': ('pep_html writer', 'stylesheet'), @@ -757,7 +761,7 @@ """ def __init__(self, *args, **kwargs): - CP.RawConfigParser.__init__(self, *args, **kwargs) + RawConfigParser.__init__(self, *args, **kwargs) self._files = [] """List of paths of configuration files read.""" @@ -776,9 +780,9 @@ continue try: if sys.version_info < (3,0): - CP.RawConfigParser.readfp(self, fp, filename) + RawConfigParser.readfp(self, fp, filename) else: - CP.RawConfigParser.read_file(self, fp, filename) + RawConfigParser.read_file(self, fp, filename) except UnicodeDecodeError: self._stderr.write(self.not_utf8_error % (filename, filename)) fp.close() Modified: trunk/docutils/docutils/writers/odf_odt/__init__.py =================================================================== --- trunk/docutils/docutils/writers/odf_odt/__init__.py 2019-08-26 23:13:04 UTC (rev 8363) +++ trunk/docutils/docutils/writers/odf_odt/__init__.py 2019-08-26 23:13:12 UTC (rev 8364) @@ -34,10 +34,12 @@ from docutils.readers import standalone from docutils.transforms import references if sys.version_info >= (3,0): + from configparser import ConfigParser from io import StringIO from urllib.request import urlopen from urllib.error import HTTPError else: + from ConfigParser import ConfigParser from StringIO import StringIO from urllib2 import urlopen, HTTPError @@ -893,8 +895,6 @@ document.reporter) self.format_map = {} if self.settings.odf_config_file: - from configparser import ConfigParser - parser = ConfigParser() parser.read(self.settings.odf_config_file) for rststyle, format in parser.items("Formats"): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-08-27 12:10:41
|
Revision: 8370 http://sourceforge.net/p/docutils/code/8370 Author: milde Date: 2019-08-27 12:10:39 +0000 (Tue, 27 Aug 2019) Log Message: ----------- py3: Handle 'urllib', 'urllib2' to 'urlib.*' rename Signed-off-by: Stephen Finucane <st...@th...ru> Modified Paths: -------------- trunk/docutils/docutils/parsers/rst/directives/images.py trunk/docutils/docutils/parsers/rst/directives/misc.py trunk/docutils/docutils/parsers/rst/directives/tables.py trunk/docutils/docutils/utils/math/math2html.py trunk/docutils/docutils/writers/_html_base.py trunk/docutils/docutils/writers/latex2e/__init__.py Modified: trunk/docutils/docutils/parsers/rst/directives/images.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/images.py 2019-08-27 12:10:26 UTC (rev 8369) +++ trunk/docutils/docutils/parsers/rst/directives/images.py 2019-08-27 12:10:39 UTC (rev 8370) @@ -10,12 +10,13 @@ import sys -import urllib + from docutils import nodes, utils from docutils.parsers.rst import Directive from docutils.parsers.rst import directives, states from docutils.nodes import fully_normalize_name, whitespace_normalize_name from docutils.parsers.rst.roles import set_classes + try: # check for the Python Imaging Library import PIL.Image except ImportError: @@ -26,6 +27,12 @@ except ImportError: PIL = None +if sys.version_info >= (3, 0): + from urllib.request import url2pathname +else: + from urllib import url2pathname + + class Image(Directive): align_h_values = ('left', 'center', 'right') @@ -125,7 +132,7 @@ figure_node = nodes.figure('', image_node) if figwidth == 'image': if PIL and self.state.document.settings.file_insertion_enabled: - imagepath = urllib.url2pathname(image_node['uri']) + imagepath = url2pathname(image_node['uri']) try: img = PIL.Image.open( imagepath.encode(sys.getfilesystemencoding())) Modified: trunk/docutils/docutils/parsers/rst/directives/misc.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/misc.py 2019-08-27 12:10:26 UTC (rev 8369) +++ trunk/docutils/docutils/parsers/rst/directives/misc.py 2019-08-27 12:10:39 UTC (rev 8370) @@ -227,10 +227,14 @@ # Do not import urllib2 at the top of the module because # it may fail due to broken SSL dependencies, and it takes # about 0.15 seconds to load. - import urllib2 + if sys.version_info >= (3, 0): + from urllib.request import urlopen + from urllib.error import URLError + else: + from urllib2 import urlopen, URLError try: - raw_text = urllib2.urlopen(source).read() - except (urllib2.URLError, IOError, OSError) as error: + raw_text = urlopen(source).read() + except (URLError, IOError, OSError) as error: raise self.severe(u'Problems with "%s" directive URL "%s":\n%s.' % (self.name, self.options['url'], ErrorString(error))) raw_file = io.StringInput(source=raw_text, source_path=source, Modified: trunk/docutils/docutils/parsers/rst/directives/tables.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/tables.py 2019-08-27 12:10:26 UTC (rev 8369) +++ trunk/docutils/docutils/parsers/rst/directives/tables.py 2019-08-27 12:10:39 UTC (rev 8370) @@ -332,11 +332,16 @@ # Do not import urllib2 at the top of the module because # it may fail due to broken SSL dependencies, and it takes # about 0.15 seconds to load. - import urllib2 + if sys.version_info >= (3, 0): + from urllib.request import urlopen + from urllib.error import URLError + else: + from urllib2 import urlopen, URLError + source = self.options['url'] try: - csv_text = urllib2.urlopen(source).read() - except (urllib2.URLError, IOError, OSError, ValueError) as error: + csv_text = urlopen(source).read() + except (URLError, IOError, OSError, ValueError) as error: severe = self.state_machine.reporter.severe( 'Problems with "%s" directive URL "%s":\n%s.' % (self.name, self.options['url'], SafeString(error)), Modified: trunk/docutils/docutils/utils/math/math2html.py =================================================================== --- trunk/docutils/docutils/utils/math/math2html.py 2019-08-27 12:10:26 UTC (rev 8369) +++ trunk/docutils/docutils/utils/math/math2html.py 2019-08-27 12:10:39 UTC (rev 8370) @@ -27,9 +27,13 @@ import os.path import sys import unicodedata -import urllib +if sys.version_info >= (3, 0): + from urllib.parse import quote_plus +else: + from urllib import quote_plus + if sys.version_info >= (3, 0): unicode = str #noqa basestring = str # noqa @@ -2927,7 +2931,7 @@ def googlecharts(self): "Make the contents using Google Charts http://code.google.com/apis/chart/." - url = FormulaConfig.urls['googlecharts'] + urllib.quote_plus(self.parsed) + url = FormulaConfig.urls['googlecharts'] + quote_plus(self.parsed) img = '<img class="chart" src="' + url + '" alt="' + self.parsed + '"/>' self.contents = [Constant(img)] Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2019-08-27 12:10:26 UTC (rev 8369) +++ trunk/docutils/docutils/writers/_html_base.py 2019-08-27 12:10:39 UTC (rev 8370) @@ -20,7 +20,6 @@ import sys import os.path import re -import urllib try: # check for the Python Imaging Library import PIL.Image @@ -39,6 +38,10 @@ from docutils.utils.math import (unichar2tex, pick_math_environment, math2html, latex2mathml, tex2mathml_extern) +if sys.version_info >= (3, 0): + from urllib.request import url2pathname +else: + from urllib import url2pathname if sys.version_info >= (3, 0): unicode = str # noqa @@ -923,7 +926,7 @@ if 'scale' in node: if (PIL and not ('width' in node and 'height' in node) and self.settings.file_insertion_enabled): - imagepath = urllib.url2pathname(uri) + imagepath = url2pathname(uri) try: img = PIL.Image.open( imagepath.encode(sys.getfilesystemencoding())) Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2019-08-27 12:10:26 UTC (rev 8369) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2019-08-27 12:10:39 UTC (rev 8370) @@ -17,16 +17,21 @@ import os import re import string -import urllib + try: import roman except ImportError: import docutils.utils.roman as roman + from docutils import frontend, nodes, languages, writers, utils, io from docutils.utils.error_reporting import SafeString from docutils.transforms import writer_aux from docutils.utils.math import pick_math_environment, unichar2tex +if sys.version_info >= (3, 0): + from urllib.request import url2pathname +else: + from urllib import url2pathname if sys.version_info >= (3, 0): unicode = str # noqa @@ -2369,7 +2374,7 @@ self.requirements['graphicx'] = self.graphicx_package attrs = node.attributes # Convert image URI to a local file path - imagepath = urllib.url2pathname(attrs['uri']).replace('\\', '/') + imagepath = url2pathname(attrs['uri']).replace('\\', '/') # alignment defaults: if not 'align' in attrs: # Set default align of image in a figure to 'center' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-08-27 12:10:59
|
Revision: 8371 http://sourceforge.net/p/docutils/code/8371 Author: milde Date: 2019-08-27 12:10:52 +0000 (Tue, 27 Aug 2019) Log Message: ----------- py3: Fix magic methods Python 3 uses '__bool__' and '__next__', where Python 2 used '__nonzero__' and 'next'. Use the new names but add aliases. Based on patch by Stephen Finucane <st...@th...ru> Modified Paths: -------------- trunk/docutils/docutils/nodes.py trunk/docutils/docutils/utils/math/math2html.py trunk/docutils/docutils/writers/manpage.py Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2019-08-27 12:10:39 UTC (rev 8370) +++ trunk/docutils/docutils/nodes.py 2019-08-27 12:10:52 UTC (rev 8371) @@ -53,7 +53,7 @@ line = None """The line number (1-based) of the beginning of this Node in `source`.""" - def __nonzero__(self): + def __bool__(self): """ Node instances are always true, even if they're empty. A node is more than a simple container. Its boolean "truth" does not depend on @@ -65,6 +65,9 @@ return True if sys.version_info < (3, 0): + __nonzero__ = __bool__ + + if sys.version_info < (3, 0): # on 2.x, str(node) will be a byte string with Unicode # characters > 255 escaped; on 3.x this is no longer necessary def __str__(self): @@ -544,8 +547,7 @@ else: return self.emptytag() - if sys.version_info > (3, 0): - # 2to3 doesn't convert __unicode__ to __str__ + if sys.version_info >= (3, 0): __str__ = __unicode__ def starttag(self, quoteattr=None): Modified: trunk/docutils/docutils/utils/math/math2html.py =================================================================== --- trunk/docutils/docutils/utils/math/math2html.py 2019-08-27 12:10:39 UTC (rev 8370) +++ trunk/docutils/docutils/utils/math/math2html.py 2019-08-27 12:10:52 UTC (rev 8371) @@ -1313,7 +1313,10 @@ "String representation" return 'options for ' + self.name + ': ' + unicode(self.options) + if sys.version_info >= (3, 0): + __str__ = __unicode__ + class Cloner(object): "An object used to clone other objects." @@ -1453,6 +1456,10 @@ "Return a description" return self.__class__.__name__ + ' (' + unicode(self.begin) + ')' + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class LoneCommand(Parser): "A parser for just one command line" @@ -1986,6 +1993,10 @@ string = string[:-1] return string + ']' + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class PositionEnding(object): "An ending for a parsing position" @@ -2004,6 +2015,8 @@ string += ' (optional)' return string + if sys.version_info >= (3, 0): + __str__ = __unicode__ class Position(Globable): @@ -2046,11 +2059,14 @@ self.skip(current) return current - def next(self): + def __next__(self): "Advance the position and return the next character." self.skipcurrent() return self.current() + if sys.version_info < (3, 0): + next = __next__ + def checkskip(self, string): "Check for a string at the given position; if there, skip it" if not self.checkfor(string): @@ -2312,6 +2328,10 @@ return self.__class__.__name__ return self.__class__.__name__ + '@' + unicode(self.begin) + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class BlackBox(Container): "A container that does not output anything" @@ -2370,7 +2390,7 @@ def extracttext(self): "Return all text." return self.string - + def __unicode__(self): "Return a printable representation." result = 'StringContainer' @@ -2381,6 +2401,10 @@ ellipsis = '' return result + ' (' + self.string.strip()[:15] + ellipsis + ')' + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class Constant(StringContainer): "A constant string" @@ -2392,6 +2416,10 @@ def __unicode__(self): return 'Constant: ' + self.string + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class TaggedText(Container): "Text inside a tag" @@ -2421,11 +2449,10 @@ return 'Tagged <unknown tag>' return 'Tagged <' + self.output.tag + '>' + if sys.version_info >= (3, 0): + __str__ = __unicode__ - - - class DocumentParameters(object): "Global parameters for the document." @@ -2555,21 +2582,14 @@ "See if the formula is inlined" self.begin = reader.linenumber + 1 return ['inline'] - + def parse(self, reader): "Parse the formula until the end" formula = self.parsemultiliner(reader, self.parent.start, self.ending) reader.nextline() return formula - - - - - - - class FormulaBit(Container): "A bit of a formula" @@ -2614,6 +2634,10 @@ "Get a string representation" return self.__class__.__name__ + ' read in ' + self.original + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class TaggedBit(FormulaBit): "A tagged string in a formula" @@ -2656,6 +2680,10 @@ "Return a printable representation." return 'Formula constant: ' + self.string + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class RawText(FormulaBit): "A bit of text inside a formula" @@ -2739,6 +2767,10 @@ "Return a printable representation." return 'Whitespace: *' + self.original + '*' + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class Bracket(FormulaBit): "A {} bracket inside a formula" @@ -2822,7 +2854,6 @@ return bracket - class MathsProcessor(object): "A processor for a maths construction inside the FormulaProcessor." @@ -2834,6 +2865,10 @@ "Return a printable description." return 'Maths processor ' + self.__class__.__name__ + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class FormulaProcessor(object): "A processor specifically for formulas." @@ -2997,6 +3032,10 @@ return 'Formula (' + self.partkey.number + ')' return 'Unnumbered formula' + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class WholeFormula(FormulaBit): "Parse a whole formula" @@ -3229,6 +3268,10 @@ result += ' in mode ' + self.mode return result + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class DependentCounter(NumberCounter): "A counter which depends on another one (the master)." @@ -3780,6 +3823,10 @@ result += ' to ' + self.url return result + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class URL(Link): "A clickable URL" @@ -3948,6 +3995,10 @@ return 'Unnamed label' return 'Label ' + self.key + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class Reference(Link): "A reference to a label." @@ -4008,6 +4059,8 @@ "Return a printable representation." return 'Reference ' + self.key + if sys.version_info >= (3, 0): + __str__ = __unicode__ class FormulaCommand(FormulaBit): @@ -4630,6 +4683,10 @@ "Return a printable representation." return 'Limit previous command' + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class LimitsProcessor(MathsProcessor): "A processor for limits inside an element." @@ -4854,6 +4911,10 @@ result += ' (empty)' return result + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + class ParameterFunction(CommandBit): "A function with a variable number of parameters defined in a template." "The parameters are defined as a parameter definition." @@ -5306,6 +5367,10 @@ "Return a printable representation." return 'Math macro' + if sys.version_info >= (3, 0): + __str__ = __unicode__ + + FormulaFactory.types += [ MacroParameter ] FormulaCommand.types += [ Modified: trunk/docutils/docutils/writers/manpage.py =================================================================== --- trunk/docutils/docutils/writers/manpage.py 2019-08-27 12:10:39 UTC (rev 8370) +++ trunk/docutils/docutils/writers/manpage.py 2019-08-27 12:10:52 UTC (rev 8371) @@ -331,7 +331,7 @@ elif style.endswith('roman'): self._indent = 5 - def next(self): + def __next__(self): if self._style == 'bullet': return self.enum_style[self._style] elif self._style == 'emdash': @@ -349,6 +349,10 @@ return res.lower() else: return "%d." % self._cnt + + if sys.version_info < (3, 0): + next = __next__ + def get_width(self): return self._indent def __repr__(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-09-11 11:39:17
|
Revision: 8389 http://sourceforge.net/p/docutils/code/8389 Author: milde Date: 2019-09-11 11:39:13 +0000 (Wed, 11 Sep 2019) Log Message: ----------- Speed up Node.next_node() ... ... by not creating a full list of following nodes in the process. Although the documented API of Node.traverse() only promises an "iterable" as return value, the implementation returned a list up to v. 0.15. Some 3rd party code still relies on this (e.g. Sphinx as of 2019-09-07). Therefore, Node.traverse() returns a list until this is sorted out. Modified Paths: -------------- trunk/docutils/docutils/nodes.py trunk/docutils/docutils/transforms/frontmatter.py Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2019-09-11 11:39:03 UTC (rev 8388) +++ trunk/docutils/docutils/nodes.py 2019-09-11 11:39:13 UTC (rev 8389) @@ -199,21 +199,19 @@ return stop def _fast_traverse(self, cls): - """Specialized traverse() that only supports instance checks.""" - result = [] + """Return iterator that only supports instance checks.""" if isinstance(self, cls): - result.append(self) + yield self for child in self.children: - result.extend(child._fast_traverse(cls)) - return result + for subnode in child._fast_traverse(cls): + yield subnode def _all_traverse(self): - """Specialized traverse() that doesn't check for a condition.""" - result = [] - result.append(self) + """Return iterator that doesn't check for a condition.""" + yield self for child in self.children: - result.extend(child._all_traverse()) - return result + for subnode in child._all_traverse(): + yield subnode def traverse(self, condition=None, include_self=True, descend=True, siblings=False, ascend=False): @@ -252,6 +250,16 @@ [<strong>, <#text: Foo>, <#text: Bar>, <reference>, <#text: Baz>] """ + # Although the documented API only promises an "iterable" as return + # value, the implementation returned a list up to v. 0.15. Some 3rd + # party code still relies on this (e.g. Sphinx as of 2019-09-07). + # Therefore, let's return a list until this is sorted out: + return list(self._traverse(condition, include_self, + descend, siblings, ascend)) + + def _traverse(self, condition=None, include_self=True, descend=True, + siblings=False, ascend=False): + """Return iterator over nodes following `self`. See `traverse()`.""" if ascend: siblings=True # Check for special argument combinations that allow using an @@ -258,9 +266,13 @@ # optimized version of traverse() if include_self and descend and not siblings: if condition is None: - return self._all_traverse() + for subnode in self._all_traverse(): + yield subnode + return elif isinstance(condition, type): - return self._fast_traverse(condition) + for subnode in self._fast_traverse(condition): + yield subnode + return # Check if `condition` is a class (check for TypeType for Python # implementations that use only new-style classes, like PyPy). if isinstance(condition, type): @@ -267,28 +279,29 @@ node_class = condition def condition(node, node_class=node_class): return isinstance(node, node_class) - r = [] + + if include_self and (condition is None or condition(self)): - r.append(self) + yield self if descend and len(self.children): for child in self: - r.extend(child.traverse(include_self=True, descend=True, - siblings=False, ascend=False, - condition=condition)) + for subnode in child._traverse(condition=condition, + include_self=True, descend=True, + siblings=False, ascend=False): + yield subnode if siblings or ascend: node = self while node.parent: index = node.parent.index(node) for sibling in node.parent[index+1:]: - r.extend(sibling.traverse(include_self=True, - descend=descend, - siblings=False, ascend=False, - condition=condition)) + for subnode in sibling._traverse(condition=condition, + include_self=True, descend=descend, + siblings=False, ascend=False): + yield subnode if not ascend: break else: node = node.parent - return r def next_node(self, condition=None, include_self=False, descend=True, siblings=False, ascend=False): @@ -297,14 +310,13 @@ or None if the iterable is empty. Parameter list is the same as of traverse. Note that - include_self defaults to 0, though. + include_self defaults to False, though. """ - iterable = self.traverse(condition=condition, - include_self=include_self, descend=descend, - siblings=siblings, ascend=ascend) + node_iterator = self._traverse(condition, include_self, + descend, siblings, ascend) try: - return iterable[0] - except IndexError: + return next(node_iterator) + except StopIteration: return None if sys.version_info < (3, 0): Modified: trunk/docutils/docutils/transforms/frontmatter.py =================================================================== --- trunk/docutils/docutils/transforms/frontmatter.py 2019-09-11 11:39:03 UTC (rev 8388) +++ trunk/docutils/docutils/transforms/frontmatter.py 2019-09-11 11:39:13 UTC (rev 8389) @@ -281,10 +281,10 @@ def apply(self): if not getattr(self.document.settings, 'sectsubtitle_xform', 1): return - for section in self.document.traverse(nodes.section): + for section in self.document._traverse(nodes.section): # On our way through the node tree, we are modifying it # but only the not-yet-visited part, so that the iterator - # returned by traverse() is not corrupted. + # returned by _traverse() is not corrupted. self.promote_subtitle(section) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2019-10-11 10:09:54
|
Revision: 8403 http://sourceforge.net/p/docutils/code/8403 Author: milde Date: 2019-10-11 10:09:53 +0000 (Fri, 11 Oct 2019) Log Message: ----------- More descriptive auto-IDs Generate unique ids adding a running number to prefixes based on a) the node "name" (if existing but not unique), b) the new optional argument "suggested_prefix" (used for toc entries), c) the tagname of the object (e.g. footnote, citation, footnote-reference, system-message, ...) Advantages: * Meaningfully named links to ToC entries, footnotes, citations, error messages, and sections with duplicate title. * More stable links (a new footnote does not change backlinks to the ToC, say). For backwards compatibility, this only applies if `settings.auto_id_prefix` ends with a percent sign ("%"). This may become the default in the future. Modified Paths: -------------- trunk/docutils/docutils/nodes.py trunk/docutils/docutils/transforms/parts.py Modified: trunk/docutils/docutils/nodes.py =================================================================== --- trunk/docutils/docutils/nodes.py 2019-10-10 13:19:55 UTC (rev 8402) +++ trunk/docutils/docutils/nodes.py 2019-10-11 10:09:53 UTC (rev 8403) @@ -20,6 +20,7 @@ .. _DTD: http://docutils.sourceforge.net/docs/ref/docutils.dtd """ from __future__ import print_function +from collections import Counter __docformat__ = 'reStructuredText' @@ -36,7 +37,7 @@ class _traversal_list(): # auxiliary class to report a FutureWarning - + def __init__(self, iterable): self.nodes = list(iterable) @@ -46,10 +47,10 @@ "Docutils > 0.16.") warnings.warn(msg, FutureWarning, stacklevel=2) return getattr(self.nodes, name) - + def __iter__(self): return iter(self.nodes) - + def __len__(self): # used in Python 2.7 when typecasting to `list` or `tuple` return len(self.nodes) @@ -1320,8 +1321,8 @@ self.symbol_footnote_start = 0 """Initial symbol footnote symbol index.""" - self.id_start = 1 - """Initial ID number.""" + self.id_counter = Counter() + """Numbers added to otherwise identical IDs.""" self.parse_messages = [] """System messages generated while parsing.""" @@ -1355,7 +1356,7 @@ domroot.appendChild(self._dom_node(domroot)) return domroot - def set_id(self, node, msgnode=None): + def set_id(self, node, msgnode=None, suggested_prefix=''): for id in node['ids']: if id in self.ids and self.ids[id] is not node: msg = self.reporter.severe('Duplicate ID: "%s".' % id) @@ -1362,16 +1363,30 @@ if msgnode != None: msgnode += msg if not node['ids']: + id_prefix = self.settings.id_prefix + auto_id_prefix = self.settings.auto_id_prefix + id = '' for name in node['names']: - id = self.settings.id_prefix + make_id(name) + id = id_prefix + make_id(name) + # TODO: allow names starting with numbers if `id_prefix` + # is non-empty: id = make_id(id_prefix + name) if id and id not in self.ids: break else: - id = '' - while not id or id in self.ids: - id = (self.settings.id_prefix + - self.settings.auto_id_prefix + str(self.id_start)) - self.id_start += 1 + if id and auto_id_prefix.endswith('%'): + # disambiguate name-derived ID + # TODO: remove second condition after announcing change + prefix = id + '-' + else: + prefix = id_prefix + auto_id_prefix + if prefix.endswith('%'): + prefix = '%s%s-' % (prefix[:-1], suggested_prefix + or make_id(node.tagname)) + while True: + self.id_counter[prefix] += 1 + id = '%s%d' % (prefix, self.id_counter[prefix]) + if id not in self.ids: + break node['ids'].append(id) self.ids[id] = node return id Modified: trunk/docutils/docutils/transforms/parts.py =================================================================== --- trunk/docutils/docutils/transforms/parts.py 2019-10-10 13:19:55 UTC (rev 8402) +++ trunk/docutils/docutils/transforms/parts.py 2019-10-11 10:09:53 UTC (rev 8403) @@ -127,7 +127,8 @@ entrytext = self.copy_and_filter(title) reference = nodes.reference('', '', refid=section['ids'][0], *entrytext) - ref_id = self.document.set_id(reference) + ref_id = self.document.set_id(reference, + suggested_prefix='toc-entry') entry = nodes.paragraph('', '', reference) item = nodes.list_item('', entry) if ( self.backlinks in ('entry', 'top') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2020-01-26 21:23:14
|
Revision: 8465 http://sourceforge.net/p/docutils/code/8465 Author: milde Date: 2020-01-26 21:23:12 +0000 (Sun, 26 Jan 2020) Log Message: ----------- Fix/update import of language modules (#385). Docutils loads language modules from its own set or the working directory. (The latter is an undocumented but tested feature.) However, a Python file or a directory that is named like an unsupported language (e.g. "tr") led to errors (#385). * Use importlib.import_module() instead of the low-level __import__(). * Use a common class for docutils.languages.get_language() and docutils.parsers.rst.get_language(). * Report missing language support also for parsers.rst.get_language(). cf. https://docutils.sourceforge.io/docs/howto/i18n.html Modified Paths: -------------- trunk/docutils/docutils/languages/__init__.py trunk/docutils/docutils/parsers/rst/languages/__init__.py trunk/docutils/docutils/parsers/rst/states.py Modified: trunk/docutils/docutils/languages/__init__.py =================================================================== --- trunk/docutils/docutils/languages/__init__.py 2020-01-16 20:31:42 UTC (rev 8464) +++ trunk/docutils/docutils/languages/__init__.py 2020-01-26 21:23:12 UTC (rev 8465) @@ -12,36 +12,65 @@ __docformat__ = 'reStructuredText' import sys +from importlib import import_module from docutils.utils import normalize_language_tag +class LanguageImporter(object): -_languages = {} + packages = ('docutils.languages.', '') + warn_msg = ('Language "%s" not supported: ' + 'Docutils-generated text will be in English.') + fallback = 'en' + # TODO: use a dummy module returning emtpy strings?, configurable? -def get_language(language_code, reporter=None): - """Return module with language localizations. + def __init__(self): + self.cache = {} - `language_code` is a "BCP 47" language tag. - If there is no matching module, warn and fall back to English. - """ - # TODO: use a dummy module returning emtpy strings?, configurable? - for tag in normalize_language_tag(language_code): - tag = tag.replace('-', '_') # '-' not valid in module names - if tag in _languages: - return _languages[tag] + def import_from_packages(self, name): + """Try loading module `name` from `self.packages`.""" try: - module = __import__(tag, globals(), locals(), level=1) - except ImportError: + return self.cache[name] + except KeyError: + pass + for package in self.packages: try: - module = __import__(tag, globals(), locals(), level=0) - except ImportError: + module = import_module(package+name) + self.check_content(module) + except (ImportError, AttributeError, AssertionError): continue - _languages[tag] = module + self.cache[name] = module + return module + return None + + def check_content(self, module): + """Check if we got a Docutils language module.""" + assert isinstance(module.labels, dict) + assert isinstance(module.bibliographic_fields, dict) + assert isinstance(module.author_separators, list) + + def __call__(self, language_code, reporter=None): + try: + return self.cache[language_code] + except KeyError: + pass + for tag in normalize_language_tag(language_code): + tag = tag.replace('-', '_') # '-' not valid in module names + module = self.import_from_packages(tag) + if module is not None: + return module + if reporter is not None: + reporter.warning(self.warn_msg % language_code) + module = self.import_from_packages('en') + self.cache[tag] = module # warn only one time! return module - if reporter is not None: - reporter.warning( - 'language "%s" not supported: ' % language_code + - 'Docutils-generated text will be in English.') - module = __import__('en', globals(), locals(), level=1) - _languages[tag] = module # warn only one time! - return module + + +get_language = LanguageImporter() +"""Return module with language localizations + +from `docutils.languages` or the PYTHONPATH. + +The argument `language_code` is a "BCP 47" language tag. +If there is no matching module, warn and fall back to English. +""" Modified: trunk/docutils/docutils/parsers/rst/languages/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/languages/__init__.py 2020-01-16 20:31:42 UTC (rev 8464) +++ trunk/docutils/docutils/parsers/rst/languages/__init__.py 2020-01-26 21:23:12 UTC (rev 8465) @@ -14,23 +14,24 @@ import sys -from docutils.utils import normalize_language_tag +from docutils.languages import LanguageImporter +class RstLanguageImporter(LanguageImporter): + packages = ('docutils.parsers.rst.languages.', '') + warn_msg = 'rST localisation for language "%s" not found.' + fallback = None + + def check_content(self, module): + """Check if we got an rST language module.""" + assert isinstance(module.directives, dict) + assert isinstance(module.roles, dict) + +get_language = RstLanguageImporter() +"""Return module with language localizations for reStructuredText. -_languages = {} +Get translated directive and rolenames from `docutils.parsers.rst.languages` +or the PYTHONPATH. -def get_language(language_code): - for tag in normalize_language_tag(language_code): - tag = tag.replace('-', '_') # '-' not valid in module names - if tag in _languages: - return _languages[tag] - try: - module = __import__(tag, globals(), locals(), level=1) - except ImportError: - try: - module = __import__(tag, globals(), locals(), level=0) - except ImportError: - continue - _languages[tag] = module - return module - return None +The argument `language_code` is a "BCP 47" language tag. +If there is no matching module, warn and return None. +""" Modified: trunk/docutils/docutils/parsers/rst/states.py =================================================================== --- trunk/docutils/docutils/parsers/rst/states.py 2020-01-16 20:31:42 UTC (rev 8464) +++ trunk/docutils/docutils/parsers/rst/states.py 2020-01-26 21:23:12 UTC (rev 8465) @@ -151,7 +151,7 @@ run the StateMachine. """ self.language = languages.get_language( - document.settings.language_code) + document.settings.language_code, document.reporter) self.match_titles = match_titles if inliner is None: inliner = Inliner() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2020-01-26 21:23:30
|
Revision: 8466 http://sourceforge.net/p/docutils/code/8466 Author: milde Date: 2020-01-26 21:23:28 +0000 (Sun, 26 Jan 2020) Log Message: ----------- Do not use assert statements when checking module content. David Goodger wrote on 05 Jan 2020 in docutils-develop: This is a problem "assert" statements can be disabled via the "python -O" optimization. This would remove the checks and defeat the purpose of the change. Modified Paths: -------------- trunk/docutils/docutils/languages/__init__.py trunk/docutils/docutils/parsers/rst/languages/__init__.py Modified: trunk/docutils/docutils/languages/__init__.py =================================================================== --- trunk/docutils/docutils/languages/__init__.py 2020-01-26 21:23:12 UTC (rev 8465) +++ trunk/docutils/docutils/languages/__init__.py 2020-01-26 21:23:28 UTC (rev 8466) @@ -37,7 +37,7 @@ try: module = import_module(package+name) self.check_content(module) - except (ImportError, AttributeError, AssertionError): + except (ImportError, AttributeError): continue self.cache[name] = module return module @@ -45,9 +45,10 @@ def check_content(self, module): """Check if we got a Docutils language module.""" - assert isinstance(module.labels, dict) - assert isinstance(module.bibliographic_fields, dict) - assert isinstance(module.author_separators, list) + if not (isinstance(module.labels, dict) + and isinstance(module.bibliographic_fields, dict) + and isinstance(module.author_separators, list)): + raise ImportError def __call__(self, language_code, reporter=None): try: Modified: trunk/docutils/docutils/parsers/rst/languages/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/languages/__init__.py 2020-01-26 21:23:12 UTC (rev 8465) +++ trunk/docutils/docutils/parsers/rst/languages/__init__.py 2020-01-26 21:23:28 UTC (rev 8466) @@ -20,12 +20,13 @@ packages = ('docutils.parsers.rst.languages.', '') warn_msg = 'rST localisation for language "%s" not found.' fallback = None - + def check_content(self, module): """Check if we got an rST language module.""" - assert isinstance(module.directives, dict) - assert isinstance(module.roles, dict) - + if not (isinstance(module.directives, dict) + and isinstance(module.roles, dict)): + raise ImportError + get_language = RstLanguageImporter() """Return module with language localizations for reStructuredText. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2020-12-09 15:34:00
|
Revision: 8587 http://sourceforge.net/p/docutils/code/8587 Author: milde Date: 2020-12-09 15:33:58 +0000 (Wed, 09 Dec 2020) Log Message: ----------- Small fixes. Test node class with isinstance() instead of a node's `tagname`. Set "source" and "line" for transition nodes. Modified Paths: -------------- trunk/docutils/docutils/parsers/rst/states.py trunk/docutils/docutils/writers/latex2e/__init__.py Modified: trunk/docutils/docutils/parsers/rst/states.py =================================================================== --- trunk/docutils/docutils/parsers/rst/states.py 2020-12-02 17:34:59 UTC (rev 8586) +++ trunk/docutils/docutils/parsers/rst/states.py 2020-12-09 15:33:58 UTC (rev 8587) @@ -2925,9 +2925,12 @@ elif len(marker) < 4: self.state_correction(context) if self.eofcheck: # ignore EOFError with sections - lineno = self.state_machine.abs_line_number() - 1 + src, srcline = self.state_machine.get_source_and_line() + # lineno = self.state_machine.abs_line_number() - 1 transition = nodes.transition(rawsource=context[0]) - transition.line = lineno + transition.source = src + transition.line = srcline - 1 + # transition.line = lineno self.parent += transition self.eofcheck = 1 return [] Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2020-12-02 17:34:59 UTC (rev 8586) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2020-12-09 15:33:58 UTC (rev 8587) @@ -2997,7 +2997,7 @@ def visit_title(self, node): """Append section and other titles.""" # Document title - if node.parent.tagname == 'document': + if isinstance(node.parent, nodes.document): self.push_output_collector(self.title) self.context.append('') self.pdfinfo.append(' pdftitle={%s},' % @@ -3064,8 +3064,7 @@ def depart_title(self, node): self.out.append(self.context.pop()) - if (isinstance(node.parent, nodes.table) or - node.parent.tagname == 'document'): + if isinstance(node.parent, (nodes.table, nodes.document)): self.pop_output_collector() def minitoc(self, node, title, depth): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2021-07-12 21:23:21
|
Revision: 8797 http://sourceforge.net/p/docutils/code/8797 Author: milde Date: 2021-07-12 21:23:19 +0000 (Mon, 12 Jul 2021) Log Message: ----------- math2html: make "math.css" valid CSS 2.1. Don't use inline-flex. Fix order of super/subscript in the conversion code, so that an inline-table can be used instead. Also go back to constructing big brackets from pieces. Modified Paths: -------------- trunk/docutils/docutils/utils/math/math2html.py trunk/docutils/docutils/writers/html5_polyglot/math.css Modified: trunk/docutils/docutils/utils/math/math2html.py =================================================================== --- trunk/docutils/docutils/utils/math/math2html.py 2021-07-12 21:23:07 UTC (rev 8796) +++ trunk/docutils/docutils/utils/math/math2html.py 2021-07-12 21:23:19 UTC (rev 8797) @@ -175,11 +175,6 @@ u'∥': [u'∥',], } - bigsymbols = {# u'∑': [u'⎲', u'⎳',], # ⎲ ⌠ ┌ - # u'∫': [u'⌠', u'⌡',], # ⎳ ⎮ │ - # u'√': [u'┌', u'⎷',], # ⌡ ⎷ - } - bracketcommands = { u'\\left': u'span class="bigdelimiter size2"', u'\\left.': u'<span class="leftdot"></span>', @@ -221,6 +216,7 @@ '\\guillemotleft': u'«', '\\guillemotright': u'»', '\\idotsint': u'<span class="bigoperator">∫⋯∫</span>', + '\\iiiint': u'<span class="bigoperator">⨌</span>', '\\iiint': u'<span class="bigoperator">∭</span>', '\\iint': u'<span class="bigoperator">∬</span>', '\\lVert': u'∥', @@ -464,7 +460,6 @@ # TODO: move to commands? '\\int': u'<span class="bigoperator">∫</span>', '\\fint': u'<span class="bigoperator">⨏</span>', - '\\iiiint': u'<span class="bigoperator">⨌</span>', '\\sqint': u'<span class="bigoperator">⨖</span>', '\\varointclockwise': u'<span class="bigoperator">∲</span>', } @@ -2406,32 +2401,7 @@ LabelFunction, TextFunction, SpacedCommand] -class BigSymbol(object): - "A big symbol generator." - - symbols = FormulaConfig.bigsymbols - - def __init__(self, symbol): - "Create the big symbol." - self.symbol = symbol - - def getpieces(self): - "Get an array with all pieces." - if not self.symbol in self.symbols: - return [self.symbol] - if self.smalllimit(): - return [self.symbol] - return self.symbols[self.symbol] - - def smalllimit(self): - "Decide if the limit should be a small, one-line symbol." - if not DocumentParameters.displaymode: - return True - if len(self.symbols[self.symbol]) == 1: - return True - return Options.simplemath - -class BigBracket(BigSymbol): +class BigBracket(object): "A big bracket generator." def __init__(self, size, bracket, alignment='l'): @@ -2765,10 +2735,9 @@ def parsebit(self, pos): "Parse a limit command." - pieces = BigSymbol(self.translated).getpieces() self.output = TaggedOutput().settag('span class="limits"') - for piece in pieces: - self.contents.append(TaggedBit().constant(piece, 'span class="limit"')) + symbol = self.translated + self.contents.append(TaggedBit().constant(symbol, 'span class="limit"')) class LimitPreviousCommand(LimitCommand): "A command to limit the previous command." @@ -2802,6 +2771,7 @@ def checklimits(self, contents, index): "Check if the current position has a limits command." + # TODO: check for \limits macro if not DocumentParameters.displaymode: return False if self.checkcommand(contents, index + 1, LimitPreviousCommand): @@ -2820,11 +2790,14 @@ "Modify a limits commands so that the limits appear above and below." limited = contents[index] subscript = self.getlimit(contents, index + 1) - limited.contents.append(subscript) if self.checkscript(contents, index + 1): superscript = self.getlimit(contents, index + 1) else: superscript = TaggedBit().constant(u' ', 'sup class="limit"') + # fix order if source is x^i + if subscript.command == '^': + superscript, subscript = subscript, superscript + limited.contents.append(subscript) limited.contents.insert(0, superscript) def getlimit(self, contents, index): @@ -2838,6 +2811,9 @@ subscript = self.getscript(contents, index) # subscript removed so instead of index + 1 we get index again superscript = self.getscript(contents, index) + # super-/subscript are reversed if source is x^i_j + if subscript.command == '^': + superscript, subscript = subscript, superscript scripts = TaggedBit().complete([superscript, subscript], 'span class="scripts"') contents.insert(index, scripts) Modified: trunk/docutils/docutils/writers/html5_polyglot/math.css =================================================================== --- trunk/docutils/docutils/writers/html5_polyglot/math.css 2021-07-12 21:23:07 UTC (rev 8796) +++ trunk/docutils/docutils/writers/html5_polyglot/math.css 2021-07-12 21:23:19 UTC (rev 8797) @@ -53,7 +53,7 @@ display: none; } .phantom { - visibility: hidden; + visibility: hidden; } .formula i { letter-spacing: 0.1ex; @@ -72,7 +72,7 @@ /* Structures */ span.hspace { - display: inline-block; + display: inline-block; } span.overline, span.bar { text-decoration: overline; @@ -131,7 +131,6 @@ display: inline-block; border-top: thin solid; padding: 0ex; -/* margin: 0.25em 0; */ vertical-align: middle; } span.symbol { @@ -141,11 +140,11 @@ div.formula .bigoperator, .displaystyle .bigoperator, .displaystyle .bigoperator { - line-height: 150%; + line-height: 150%; font-size: 150%; } span.fraction .bigoperator, -span.scriptstyle .bigoperator{ +span.scriptstyle .bigoperator { line-height: inherit; font-size: inherit; } @@ -167,16 +166,14 @@ } /* vertically stacked sub and superscript */ span.scripts { - display: inline-flex; + display: inline-table; vertical-align: middle; - flex-direction: column; } -sup.script { - order: 1; +.script { + display: table-row; + text-align: left; + line-height: 150%; } -sub.script { - order: 2; -} span.limits { display: inline-table; vertical-align: middle; @@ -183,7 +180,7 @@ } .limit { display: table-row; -/* line-height: 99%; */ + line-height: 99%; } sup.limit, sub.limit { line-height: 100%; @@ -208,14 +205,12 @@ span.array, span.bracketcases, span.binomial, span.environment { display: inline-table; text-align: center; - border-collapse: collapse; - margin: 0em; vertical-align: middle; } span.arrayrow, span.binomrow { display: table-row; - padding: 0ex; - border: 0ex; + padding: 0; + border: 0; } span.arraycell, span.bracket, span.case, span.binomcell, span.environmentcell { display: table-cell; @@ -285,7 +280,7 @@ font-family: monospace; } span.textsc { - font-variant: small-caps; + font-variant: small-caps; } span.text, span.textnormal { font-style: normal; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2021-11-01 21:50:35
|
Revision: 8873 http://sourceforge.net/p/docutils/code/8873 Author: milde Date: 2021-11-01 21:50:32 +0000 (Mon, 01 Nov 2021) Log Message: ----------- Small fixes in interpreted text role definitions. Modified Paths: -------------- trunk/docutils/docutils/parsers/rst/roles.py trunk/docutils/docutils/utils/math/latex2mathml.py Modified: trunk/docutils/docutils/parsers/rst/roles.py =================================================================== --- trunk/docutils/docutils/parsers/rst/roles.py 2021-10-31 09:41:02 UTC (rev 8872) +++ trunk/docutils/docutils/parsers/rst/roles.py 2021-11-01 21:50:32 UTC (rev 8873) @@ -5,8 +5,11 @@ """ This module defines standard interpreted text role functions, a registry for interpreted text roles, and an API for adding to and retrieving from the -registry. +registry. See also `Creating reStructuredText Interpreted Text Roles`__. +__ https://docutils.sourceforge.io/docs/ref/rst/roles.html + + The interface for interpreted role functions is as follows:: def role_fn(name, rawtext, text, lineno, inliner, @@ -29,7 +32,8 @@ - ``text`` is the interpreted text content, with backslash escapes converted to nulls (``\x00``). -- ``lineno`` is the line number where the interpreted text beings. +- ``lineno`` is the line number where the text block containing the + interpreted text begins. - ``inliner`` is the Inliner object that called the role function. It defines the following useful attributes: ``reporter``, @@ -78,15 +82,17 @@ from docutils.utils.code_analyzer import Lexer, LexerError DEFAULT_INTERPRETED_ROLE = 'title-reference' +"""The canonical name of the default interpreted role. + +This role is used when no role is specified for a piece of interpreted text. """ -The canonical name of the default interpreted role. This role is used -when no role is specified for a piece of interpreted text. -""" _role_registry = {} -"""Mapping of canonical role names to role functions. Language-dependent role -names are defined in the ``language`` subpackage.""" +"""Mapping of canonical role names to role functions. +Language-dependent role names are defined in the ``language`` subpackage. +""" + _roles = {} """Mapping of local or language-dependent interpreted text role names to role functions.""" @@ -94,9 +100,11 @@ def role(role_name, language_module, lineno, reporter): """ Locate and return a role function from its language-dependent name, along - with a list of system messages. If the role is not found in the current - language, check English. Return a 2-tuple: role function (``None`` if the - named role cannot be found) and a list of system messages. + with a list of system messages. + + If the role is not found in the current language, check English. Return a + 2-tuple: role function (``None`` if the named role cannot be found) and a + list of system messages. """ normname = role_name.lower() messages = [] @@ -140,8 +148,7 @@ role_fn = _role_registry[canonicalname] register_local_role(normname, role_fn) return role_fn, messages - else: - return None, messages # Error message will be generated by caller. + return None, messages # Error message will be generated by caller. def register_canonical_role(name, role_fn): """ @@ -182,11 +189,11 @@ class GenericRole(object): + """ + Generic interpreted text role. + The interpreted text is simply wrapped with the provided node class. """ - Generic interpreted text role, where the interpreted text is simply - wrapped with the provided node class. - """ def __init__(self, role_name, node_class): self.name = role_name @@ -199,11 +206,8 @@ class CustomRole(object): + """Wrapper for custom interpreted text roles.""" - """ - Wrapper for custom interpreted text roles. - """ - def __init__(self, role_name, base_role, options={}, content=[]): self.name = role_name self.base_role = base_role @@ -230,7 +234,7 @@ def generic_custom_role(role, rawtext, text, lineno, inliner, options={}, content=[]): - """""" + """Base for custom roles if no other base role is specified.""" # Once nested inline markup is implemented, this and other methods should # recursively call inliner.nested_parse(). set_classes(options) @@ -275,11 +279,11 @@ def rfc_reference_role(role, rawtext, text, lineno, inliner, options={}, content=[]): + if "#" in text: + rfcnum, section = utils.unescape(text).split("#", 1) + else: + rfcnum, section = utils.unescape(text), None try: - if "#" in text: - rfcnum, section = utils.unescape(text).split("#", 1) - else: - rfcnum, section = utils.unescape(text), None rfcnum = int(rfcnum) if rfcnum < 1: raise ValueError @@ -350,15 +354,13 @@ return [node], [] -code_role.options = {'class': directives.class_option, - 'language': directives.unchanged} +code_role.options = {'language': directives.unchanged} register_canonical_role('code', code_role) def math_role(role, rawtext, text, lineno, inliner, options={}, content=[]): set_classes(options) - i = rawtext.find('`') - text = rawtext.split('`')[1] + text = utils.unescape(text, True) # raw text without inline role markup node = nodes.math(rawtext, text, **options) return [node], [] @@ -368,7 +370,8 @@ # Register roles that are currently unimplemented. ###################################################################### -def unimplemented_role(role, rawtext, text, lineno, inliner, attributes={}): +def unimplemented_role(role, rawtext, text, lineno, inliner, + options=None, content=None): msg = inliner.reporter.error( 'Interpreted text role "%s" not implemented.' % role, line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) Modified: trunk/docutils/docutils/utils/math/latex2mathml.py =================================================================== --- trunk/docutils/docutils/utils/math/latex2mathml.py 2021-10-31 09:41:02 UTC (rev 8872) +++ trunk/docutils/docutils/utils/math/latex2mathml.py 2021-11-01 21:50:32 UTC (rev 8873) @@ -828,7 +828,7 @@ node = node.append(mo(anomalous_chars[c], **attributes)) elif c in "/()[]|": node = node.append(mo(c, stretchy=False)) - elif c in "+*=<>,.!?';@": + elif c in "+*=<>,.!?`';@": node = node.append(mo(c)) else: raise SyntaxError(u'Unsupported character: "%s"' % c) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mi...@us...> - 2022-01-03 23:50:26
|
Revision: 8928 http://sourceforge.net/p/docutils/code/8928 Author: milde Date: 2022-01-03 23:50:23 +0000 (Mon, 03 Jan 2022) Log Message: ----------- Drop (most) special-casing for Python 2.x. Simplifications for nodes.py and error_reporting.py will follow. Modified Paths: -------------- trunk/docutils/docutils/core.py trunk/docutils/docutils/frontend.py trunk/docutils/docutils/io.py trunk/docutils/docutils/parsers/rst/directives/__init__.py trunk/docutils/docutils/parsers/rst/directives/images.py trunk/docutils/docutils/parsers/rst/directives/misc.py trunk/docutils/docutils/parsers/rst/directives/tables.py trunk/docutils/docutils/statemachine.py trunk/docutils/docutils/transforms/frontmatter.py trunk/docutils/docutils/transforms/universal.py trunk/docutils/docutils/utils/__init__.py trunk/docutils/docutils/utils/math/latex2mathml.py trunk/docutils/docutils/utils/math/math2html.py trunk/docutils/docutils/writers/_html_base.py trunk/docutils/docutils/writers/docutils_xml.py trunk/docutils/docutils/writers/latex2e/__init__.py trunk/docutils/docutils/writers/manpage.py trunk/docutils/docutils/writers/odf_odt/__init__.py Modified: trunk/docutils/docutils/core.py =================================================================== --- trunk/docutils/docutils/core.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/core.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -153,11 +153,6 @@ usage, description, settings_spec, config_section, **defaults) if argv is None: argv = sys.argv[1:] - # converting to Unicode (Python 3 does this automatically): - if sys.version_info < (3, 0): - # TODO: make this failsafe and reversible? - argv_encoding = (frontend.locale_encoding or 'ascii') - argv = [a.decode(argv_encoding) for a in argv] self.settings = option_parser.parse_args(argv) def set_io(self, source_path=None, destination_path=None): Modified: trunk/docutils/docutils/frontend.py =================================================================== --- trunk/docutils/docutils/frontend.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/frontend.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -29,19 +29,14 @@ __docformat__ = 'reStructuredText' +import codecs +from configparser import RawConfigParser +import optparse +from optparse import SUPPRESS_HELP import os import os.path import sys import warnings -import codecs -import optparse -from optparse import SUPPRESS_HELP -if sys.version_info >= (3, 0): - from configparser import RawConfigParser - from os import getcwd -else: - from ConfigParser import RawConfigParser - from os import getcwdu as getcwd import docutils import docutils.utils @@ -49,10 +44,7 @@ from docutils.utils.error_reporting import (locale_encoding, SafeString, ErrorOutput, ErrorString) -if sys.version_info >= (3, 0): - unicode = str # noqa - def store_multiple(option, opt, value, parser, *args, **kwargs): """ Store multiple values in `parser.values`. (Option callback.) @@ -175,7 +167,7 @@ config_parser=None, config_section=None): """Check/normalize list arguments (split at "," and strip whitespace). """ - # `value` may be ``unicode``, ``str``, or a ``list`` (when given as + # `value` may be ``bytes``, ``str``, or a ``list`` (when given as # command line option and "action" is "append"). if not isinstance(value, list): value = [value] @@ -258,8 +250,7 @@ `OptionParser.relative_path_settings`. """ if base_path is None: - base_path = getcwd() # type(base_path) == unicode - # to allow combining non-ASCII cwd with unicode values in `pathdict` + base_path = os.getcwd() for key in keys: if key in pathdict: value = pathdict[key] @@ -779,7 +770,7 @@ """Wrapper around sys.stderr catching en-/decoding errors""" def read(self, filenames, option_parser): - if type(filenames) in (str, unicode): + if type(filenames) == str: filenames = [filenames] for filename in filenames: try: @@ -788,10 +779,7 @@ except IOError: continue try: - if sys.version_info < (3, 0): - RawConfigParser.readfp(self, fp, filename) - else: - RawConfigParser.read_file(self, fp, filename) + RawConfigParser.read_file(self, fp, filename) except UnicodeDecodeError: self._stderr.write(self.not_utf8_error % (filename, filename)) fp.close() Modified: trunk/docutils/docutils/io.py =================================================================== --- trunk/docutils/docutils/io.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/io.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -18,8 +18,6 @@ from docutils import TransformSpec from docutils.utils.error_reporting import locale_encoding, ErrorString, ErrorOutput -if sys.version_info >= (3, 0): - unicode = str # noqa class InputError(IOError): pass class OutputError(IOError): pass @@ -88,10 +86,9 @@ locale.setlocale(locale.LC_ALL, '') """ if self.encoding and self.encoding.lower() == 'unicode': - assert isinstance(data, unicode), ( - 'input encoding is "unicode" ' - 'but input is not a unicode object') - if isinstance(data, unicode): + assert isinstance(data, str), ('input encoding is "unicode" ' + 'but input is not a str object') + if isinstance(data, str): # Accept unicode even if self.encoding != 'unicode'. return data if self.encoding: @@ -113,7 +110,7 @@ encodings.insert(1, locale_encoding) for enc in encodings: try: - decoded = unicode(data, enc, self.error_handler) + decoded = str(data, enc, self.error_handler) self.successful_encoding = enc # Return decoded, removing BOMs. return decoded.replace(u'\ufeff', u'') @@ -189,11 +186,11 @@ def encode(self, data): if self.encoding and self.encoding.lower() == 'unicode': - assert isinstance(data, unicode), ( + assert isinstance(data, str), ( 'the encoding given is "unicode" but the output is not ' 'a Unicode string') return data - if not isinstance(data, unicode): + if not isinstance(data, str): # Non-unicode (e.g. bytes) output. return data else: @@ -207,8 +204,7 @@ """ def __init__(self, source=None, source_path=None, encoding=None, error_handler='strict', - autoclose=True, - mode='r' if sys.version_info >= (3, 0) else 'rU'): + autoclose=True, mode='r'): """ :Parameters: - `source`: either a file-like object (which is read directly), or @@ -228,20 +224,15 @@ if source is None: if source_path: - # Specify encoding in Python 3 - if sys.version_info >= (3, 0): - kwargs = {'encoding': self.encoding, - 'errors': self.error_handler} - else: - kwargs = {} try: - self.source = open(source_path, mode, **kwargs) + self.source = open(source_path, mode, + encoding=self.encoding, + errors=self.error_handler) except IOError as error: raise InputError(error.errno, error.strerror, source_path) else: self.source = sys.stdin - elif (sys.version_info >= (3, 0) and - check_encoding(self.source, self.encoding) is False): + elif (check_encoding(self.source, self.encoding) is False): # TODO: re-open, warn or raise error? raise UnicodeError('Encoding clash: encoding given is "%s" ' 'but source is opened with encoding "%s".' % @@ -257,14 +248,14 @@ Read and decode a single file and return the data (Unicode string). """ try: - if self.source is sys.stdin and sys.version_info >= (3, 0): + if self.source is sys.stdin: # read as binary data to circumvent auto-decoding data = self.source.buffer.read() # normalize newlines - data = b'\n'.join(data.splitlines()) + b'\n' + data = b'\n'.join(data.splitlines()+[b'']) else: data = self.source.read() - except (UnicodeError, LookupError) as err: # (in Py3k read() decodes) + except (UnicodeError, LookupError) as err: if not self.encoding and self.source_path: # re-read in binary mode and decode with heuristics b_source = open(self.source_path, 'rb') @@ -271,7 +262,7 @@ data = b_source.read() b_source.close() # normalize newlines - data = b'\n'.join(data.splitlines()) + b'\n' + data = b'\n'.join(data.splitlines()+[b'']) else: raise finally: @@ -350,8 +341,8 @@ pass def open(self): - # Specify encoding in Python 3. - if sys.version_info >= (3, 0) and 'b' not in self.mode: + # Specify encoding + if 'b' not in self.mode: kwargs = {'encoding': self.encoding, 'errors': self.error_handler} else: @@ -371,17 +362,16 @@ """ if not self.opened: self.open() - if ('b' not in self.mode and sys.version_info < (3, 0) - or check_encoding(self.destination, self.encoding) is False - ): + if ('b' not in self.mode + and check_encoding(self.destination, self.encoding) is False): data = self.encode(data) - if sys.version_info >= (3, 0) and os.linesep != '\n': - data = data.replace(b'\n', bytes(os.linesep, 'ascii')) # fix endings - + if os.linesep != '\n': + # fix endings + data = data.replace(b'\n', bytes(os.linesep, 'ascii')) try: self.destination.write(data) except TypeError as err: - if sys.version_info >= (3, 0) and isinstance(data, bytes): + if isinstance(data, bytes): try: self.destination.buffer.write(data) except AttributeError: Modified: trunk/docutils/docutils/parsers/rst/directives/__init__.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/__init__.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/parsers/rst/directives/__init__.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -17,10 +17,7 @@ from docutils.utils import split_escaped_whitespace, escape2null, unescape from docutils.parsers.rst.languages import en as _fallback_language_module -if sys.version_info >= (3, 0): - unichr = chr # noqa - _directive_registry = { 'attention': ('admonitions', 'Attention'), 'caution': ('admonitions', 'Caution'), @@ -308,12 +305,12 @@ """ try: if code.isdigit(): # decimal number - return unichr(int(code)) + return chr(int(code)) else: match = unicode_pattern.match(code) if match: # hex number value = match.group(1) or match.group(2) - return unichr(int(value, 16)) + return chr(int(value, 16)) else: # other text return code except OverflowError as detail: Modified: trunk/docutils/docutils/parsers/rst/directives/images.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/images.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/parsers/rst/directives/images.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -8,15 +8,9 @@ __docformat__ = 'reStructuredText' - import sys +from urllib.request import url2pathname -from docutils import nodes, utils -from docutils.parsers.rst import Directive -from docutils.parsers.rst import directives, states -from docutils.nodes import fully_normalize_name, whitespace_normalize_name -from docutils.parsers.rst.roles import set_classes - try: # check for the Python Imaging Library import PIL.Image except ImportError: @@ -27,10 +21,11 @@ except ImportError: PIL = None -if sys.version_info >= (3, 0): - from urllib.request import url2pathname -else: - from urllib import url2pathname +from docutils import nodes, utils +from docutils.parsers.rst import Directive +from docutils.parsers.rst import directives, states +from docutils.nodes import fully_normalize_name, whitespace_normalize_name +from docutils.parsers.rst.roles import set_classes class Image(Directive): Modified: trunk/docutils/docutils/parsers/rst/directives/misc.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/misc.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/parsers/rst/directives/misc.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -265,14 +265,11 @@ attributes['source'] = path elif 'url' in self.options: source = self.options['url'] - # Do not import urllib2 at the top of the module because + # Do not import urllib at the top of the module because # it may fail due to broken SSL dependencies, and it takes - # about 0.15 seconds to load. - if sys.version_info >= (3, 0): - from urllib.request import urlopen - from urllib.error import URLError - else: - from urllib2 import urlopen, URLError + # about 0.15 seconds to load. Update: < 0.03s with Py3k. + from urllib.request import urlopen + from urllib.error import URLError try: raw_text = urlopen(source).read() except (URLError, IOError, OSError) as error: @@ -587,12 +584,6 @@ 'Invalid context: the "%s" directive can only be used within ' 'a substitution definition.' % self.name) format_str = '\n'.join(self.content) or '%Y-%m-%d' - if sys.version_info< (3, 0): - try: - format_str = format_str.encode(locale_encoding or 'utf-8') - except UnicodeEncodeError: - raise self.warning(u'Cannot encode date format string ' - u'with locale encoding "%s".' % locale_encoding) # @@@ # Use timestamp from the `SOURCE_DATE_EPOCH`_ environment variable? # Pro: Docutils-generated documentation @@ -610,14 +601,6 @@ # time.gmtime(int(source_date_epoch))) # else: text = time.strftime(format_str) - if sys.version_info< (3, 0): - # `text` is a byte string that may contain non-ASCII characters: - try: - text = text.decode(locale_encoding or 'utf-8') - except UnicodeDecodeError: - text = text.decode(locale_encoding or 'utf-8', 'replace') - raise self.warning(u'Error decoding "%s"' - u'with locale encoding "%s".' % (text, locale_encoding)) return [nodes.Text(text)] Modified: trunk/docutils/docutils/parsers/rst/directives/tables.py =================================================================== --- trunk/docutils/docutils/parsers/rst/directives/tables.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/parsers/rst/directives/tables.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -9,9 +9,10 @@ __docformat__ = 'reStructuredText' +import csv +import os.path import sys -import os.path -import csv +import warnings from docutils import io, nodes, statemachine, utils from docutils.utils.error_reporting import SafeString @@ -209,14 +210,14 @@ def __init__(self, options): if 'delim' in options: - self.delimiter = CSVTable.encode_for_csv(options['delim']) + self.delimiter = options['delim'] if 'keepspace' in options: self.skipinitialspace = False if 'quote' in options: - self.quotechar = CSVTable.encode_for_csv(options['quote']) + self.quotechar = options['quote'] if 'escape' in options: self.doublequote = False - self.escapechar = CSVTable.encode_for_csv(options['escape']) + self.escapechar = options['escape'] csv.Dialect.__init__(self) @@ -265,8 +266,6 @@ return [detail.args[0]] except csv.Error as detail: message = str(detail) - if sys.version_info < (3, 0) and '1-character string' in message: - message += '\nwith Python 2.x this must be an ASCII character.' error = self.state_machine.reporter.error( 'Error with CSV data in "%s" directive:\n%s' % (self.name, message), nodes.literal_block( @@ -331,14 +330,11 @@ raise SystemMessagePropagation(severe) elif 'url' in self.options: # CSV data is from a URL. - # Do not import urllib2 at the top of the module because + # Do not import urllib at the top of the module because # it may fail due to broken SSL dependencies, and it takes - # about 0.15 seconds to load. - if sys.version_info >= (3, 0): - from urllib.request import urlopen - from urllib.error import URLError - else: - from urllib2 import urlopen, URLError + # about 0.15 seconds to load. Update: < 0.03s with Py3k. + from urllib.request import urlopen + from urllib.error import URLError source = self.options['url'] try: @@ -363,24 +359,23 @@ raise SystemMessagePropagation(error) return csv_data, source - if sys.version_info < (3, 0): - # 2.x csv module doesn't do Unicode - def decode_from_csv(s): - return s.decode('utf-8') - def encode_for_csv(s): - return s.encode('utf-8') - else: - def decode_from_csv(s): - return s - def encode_for_csv(s): - return s + def decode_from_csv(s): + warnings.warn('CSVTable.decode_from_csv()' + ' is not required with Python 3' + ' and will be removed in Docutils 1.2.', + DeprecationWarning, stacklevel=2) + return s + def encode_for_csv(s): + warnings.warn('CSVTable.encode_from_csv()' + ' is not required with Python 3' + ' and will be removed in Docutils 1.2.', + DeprecationWarning, stacklevel=2) + return s decode_from_csv = staticmethod(decode_from_csv) encode_for_csv = staticmethod(encode_for_csv) def parse_csv_data_into_rows(self, csv_data, dialect, source): - # csv.py doesn't do Unicode; encode temporarily as UTF-8 - csv_reader = csv.reader([self.encode_for_csv(line + '\n') - for line in csv_data], + csv_reader = csv.reader([line + '\n' for line in csv_data], dialect=dialect) rows = [] max_cols = 0 @@ -387,10 +382,8 @@ for row in csv_reader: row_data = [] for cell in row: - # decode UTF-8 back to Unicode - cell_text = self.decode_from_csv(cell) cell_data = (0, 0, 0, statemachine.StringList( - cell_text.splitlines(), source=source)) + cell.splitlines(), source=source)) row_data.append(cell_data) rows.append(row_data) max_cols = max(max_cols, len(row)) Modified: trunk/docutils/docutils/statemachine.py =================================================================== --- trunk/docutils/docutils/statemachine.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/statemachine.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -113,10 +113,7 @@ from docutils import utils from docutils.utils.error_reporting import ErrorOutput -if sys.version_info >= (3, 0): - unicode = str # noqa - class StateMachine(object): """ @@ -1448,7 +1445,7 @@ """ for i in range(len(self.data)): line = self.data[i] - if isinstance(line, unicode): + if isinstance(line, str): new = [] for char in line: new.append(char) Modified: trunk/docutils/docutils/transforms/frontmatter.py =================================================================== --- trunk/docutils/docutils/transforms/frontmatter.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/transforms/frontmatter.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -28,10 +28,6 @@ from docutils.transforms import TransformError, Transform -if sys.version_info >= (3, 0): - unicode = str # noqa - - class TitlePromoter(Transform): """ @@ -512,7 +508,7 @@ The set of separators is locale dependent (default: ";"- or ","). """ # @@ keep original formatting? (e.g. ``:authors: A. Test, *et-al*``) - text = ''.join(unicode(node) + text = ''.join(str(node) for node in field[1].findall(nodes.Text)) if not text: raise TransformError Modified: trunk/docutils/docutils/transforms/universal.py =================================================================== --- trunk/docutils/docutils/transforms/universal.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/transforms/universal.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -28,10 +28,6 @@ from docutils.utils import smartquotes -if sys.version_info >= (3, 0): - unicode = str # noqa - - class Decorations(Transform): """ @@ -263,11 +259,11 @@ for node in txtnodes: if (isinstance(node.parent, self.literal_nodes) or isinstance(node.parent.parent, self.literal_nodes)): - yield ('literal', unicode(node)) + yield ('literal', str(node)) else: # SmartQuotes uses backslash escapes instead of null-escapes # Insert backslashes before escaped "active" characters. - txt = re.sub('(?<=\x00)([-\\\'".`])', r'\\\1', unicode(node)) + txt = re.sub('(?<=\x00)([-\\\'".`])', r'\\\1', str(node)) yield ('plain', txt) def apply(self): Modified: trunk/docutils/docutils/utils/__init__.py =================================================================== --- trunk/docutils/docutils/utils/__init__.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/utils/__init__.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -21,10 +21,7 @@ import docutils.io from docutils.utils.error_reporting import ErrorOutput, SafeString -if sys.version_info >= (3, 0): - unicode = str - class SystemMessage(ApplicationError): def __init__(self, system_message, level): @@ -159,7 +156,7 @@ Raise an exception or generate a warning if appropriate. """ - # `message` can be a `string`, `unicode`, or `Exception` instance. + # `message` can be a `str` or `Exception` instance. if isinstance(message, Exception): message = SafeString(message) @@ -344,7 +341,8 @@ Decode file/path string in a failsafe manner if not already done. """ # see also http://article.gmane.org/gmane.text.docutils.user/2905 - if isinstance(path, unicode): + # TODO: is this still required with Python 3? + if isinstance(path, str): return path try: path = path.decode(sys.getfilesystemencoding(), 'strict') @@ -601,8 +599,6 @@ return list(itertools.chain(*strings)) def strip_combining_chars(text): - if isinstance(text, str) and sys.version_info < (3, 0): - return text return u''.join([c for c in text if not unicodedata.combining(c)]) def find_combining_chars(text): @@ -613,8 +609,6 @@ [3, 6, 9] """ - if isinstance(text, str) and sys.version_info < (3, 0): - return [] return [i for i,c in enumerate(text) if unicodedata.combining(c)] def column_indices(text): @@ -647,8 +641,6 @@ Correct ``len(text)`` for wide East Asian and combining Unicode chars. """ - if isinstance(text, str) and sys.version_info < (3, 0): - return len(text) # shortcut for binary strings width = sum([east_asian_widths[unicodedata.east_asian_width(c)] for c in text]) # correction for combining chars: Modified: trunk/docutils/docutils/utils/math/latex2mathml.py =================================================================== --- trunk/docutils/docutils/utils/math/latex2mathml.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/utils/math/latex2mathml.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -29,8 +29,6 @@ import re import sys import unicodedata -if sys.version_info >= (3, 0): - unicode = str # noqa from docutils.utils.math import tex2unichar, toplevel_code @@ -514,7 +512,7 @@ super(MathToken, self).__init__(**attributes) def _xml_body(self, level=0): - return [unicode(self.data).translate(self.xml_entities)] + return [str(self.data).translate(self.xml_entities)] class mtext(MathToken): pass class mi(MathToken): pass Modified: trunk/docutils/docutils/utils/math/math2html.py =================================================================== --- trunk/docutils/docutils/utils/math/math2html.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/utils/math/math2html.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -19,23 +19,16 @@ # 1.3 2021-06-02 Removed code for conversion of LyX files not # required for LaTeX math. # Support for more math commands from the AMS "math-guide". +# 2.0 2021-12-31 Drop 2.7 compatibility code. import os.path import sys import unicodedata +from urllib.parse import quote_plus -if sys.version_info >= (3, 0): - from urllib.parse import quote_plus -else: - from urllib import quote_plus - from docutils.utils.math import tex2unichar -if sys.version_info >= (3, 0): - unicode = str #noqa - basestring = str # noqa - __version__ = u'1.3 (2021-06-02)' @@ -76,8 +69,6 @@ def show(cls, message, channel): "Show a message out of a channel" - if sys.version_info < (3, 0): - message = message.encode('utf-8') channel.write(message + '\n') debug = classmethod(debug) @@ -771,7 +762,7 @@ def parseending(self, reader, process): "Parse until the current ending is found" if not self.ending: - Trace.error('No ending for ' + unicode(self)) + Trace.error('No ending for ' + str(self)) return while not reader.currentline().startswith(self.ending): process() @@ -782,14 +773,11 @@ container.parent = self.parent contents.append(container) - def __unicode__(self): + def __str__(self): "Return a description" - return self.__class__.__name__ + ' (' + unicode(self.begin) + ')' + return self.__class__.__name__ + ' (' + str(self.begin) + ')' - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class LoneCommand(Parser): "A parser for just one command line" @@ -882,7 +870,7 @@ def gethtml(self, container): "Show an error." - Trace.error('gethtml() not implemented for ' + unicode(self)) + Trace.error('gethtml() not implemented for ' + str(self)) def isempty(self): "Decide if the output is empty: by default, not empty." @@ -915,7 +903,7 @@ return html for element in container.contents: if not hasattr(element, 'gethtml'): - Trace.error('No html in ' + element.__class__.__name__ + ': ' + unicode(element)) + Trace.error('No html in ' + element.__class__.__name__ + ': ' + str(element)) return html html += element.gethtml() return html @@ -980,7 +968,7 @@ def checktag(self, container): "Check that the tag is valid." if not self.tag: - Trace.error('No tag in ' + unicode(container)) + Trace.error('No tag in ' + str(container)) return False if self.tag == '': return False @@ -1192,21 +1180,18 @@ def checkpending(self): "Check if there are any pending endings" if len(self.endings) != 0: - Trace.error('Pending ' + unicode(self) + ' left open') + Trace.error('Pending ' + str(self) + ' left open') - def __unicode__(self): + def __str__(self): "Printable representation" string = 'endings [' for ending in self.endings: - string += unicode(ending) + ',' + string += str(ending) + ',' if len(self.endings) > 0: string = string[:-1] return string + ']' - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class PositionEnding(object): "An ending for a parsing position" @@ -1218,7 +1203,7 @@ "Check for the ending" return pos.checkfor(self.ending) - def __unicode__(self): + def __str__(self): "Printable representation" string = 'Ending ' + self.ending if self.optional: @@ -1225,10 +1210,7 @@ string += ' (optional)' return string - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class Position(Globable): """A position in a text to parse. Including those in Globable, functions to implement by subclasses are: @@ -1274,9 +1256,6 @@ self.skipcurrent() return self.current() - if sys.version_info < (3, 0): - next = __next__ - def checkskip(self, string): "Check for a string at the given position; if there, skip it" if not self.checkfor(string): @@ -1341,7 +1320,7 @@ def gethtml(self): "Get the resulting HTML" html = self.output.gethtml(self) - if isinstance(html, basestring): + if isinstance(html, str): Trace.error('Raw string ' + html) html = [html] return html @@ -1429,7 +1408,7 @@ def tree(self, level = 0): "Show in a tree" - Trace.debug(" " * level + unicode(self)) + Trace.debug(" " * level + str(self)) for container in self.contents: container.tree(level + 1) @@ -1455,16 +1434,13 @@ current = current.parent return False - def __unicode__(self): + def __str__(self): "Get a description" if not self.begin: return self.__class__.__name__ - return self.__class__.__name__ + '@' + unicode(self.begin) + return self.__class__.__name__ + '@' + str(self.begin) - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class BlackBox(Container): "A container that does not output anything" @@ -1496,7 +1472,7 @@ if ContainerConfig.string['startcommand'] in replaced and len(replaced) > 1: # unprocessed commands if self.begin: - message = 'Unknown command at ' + unicode(self.begin) + ': ' + message = 'Unknown command at ' + str(self.begin) + ': ' else: message = 'Unknown command: ' Trace.error(message + replaced.strip()) @@ -1510,20 +1486,17 @@ "Return all text." return self.string - def __unicode__(self): + def __str__(self): "Return a printable representation." result = 'StringContainer' if self.begin: - result += '@' + unicode(self.begin) + result += '@' + str(self.begin) ellipsis = '...' if len(self.string.strip()) <= 15: ellipsis = '' return result + ' (' + self.string.strip()[:15] + ellipsis + ')' - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class Constant(StringContainer): "A constant string" @@ -1532,13 +1505,10 @@ self.string = text self.output = StringOutput() - def __unicode__(self): + def __str__(self): return 'Constant: ' + self.string - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class DocumentParameters(object): "Global parameters for the document." @@ -1690,14 +1660,11 @@ "Return a copy of itself." return self.factory.parseformula(self.original) - def __unicode__(self): + def __str__(self): "Get a string representation" return self.__class__.__name__ + ' read in ' + self.original - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class TaggedBit(FormulaBit): "A tagged string in a formula" @@ -1736,14 +1703,11 @@ "Return a copy of itself." return FormulaConstant(self.original) - def __unicode__(self): + def __str__(self): "Return a printable representation." return 'Formula constant: ' + self.string - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class RawText(FormulaBit): "A bit of text inside a formula" @@ -1823,14 +1787,11 @@ "Parse all whitespace." self.original += pos.skipspace() - def __unicode__(self): + def __str__(self): "Return a printable representation." return 'Whitespace: *' + self.original + '*' - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class Bracket(FormulaBit): "A {} bracket inside a formula" @@ -1919,16 +1880,13 @@ def process(self, contents, index): "Process an element inside a formula." - Trace.error('Unimplemented process() in ' + unicode(self)) + Trace.error('Unimplemented process() in ' + str(self)) - def __unicode__(self): + def __str__(self): "Return a printable description." return 'Maths processor ' + self.__class__.__name__ - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class FormulaProcessor(object): "A processor specifically for formulas." @@ -2055,16 +2013,13 @@ self.parsed = pos.glob(lambda: True) pos.popending(limit) - def __unicode__(self): + def __str__(self): "Return a printable representation." if self.partkey and self.partkey.number: return 'Formula (' + self.partkey.number + ')' return 'Unnumbered formula' - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class WholeFormula(FormulaBit): "Parse a whole formula" @@ -2428,7 +2383,7 @@ def getpiece(self, index): "Return the nth piece for the bracket." - function = getattr(self, 'getpiece' + unicode(len(self.pieces))) + function = getattr(self, 'getpiece' + str(len(self.pieces))) return function(index) def getpiece1(self, index): @@ -2762,14 +2717,11 @@ self.output = TaggedOutput().settag('span class="limits"') self.factory.clearskipped(pos) - def __unicode__(self): + def __str__(self): "Return a printable representation." return 'Limit previous command' - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class LimitsProcessor(MathsProcessor): "A processor for limits inside an element." @@ -2981,19 +2933,16 @@ else: self.value = function.parseparameter(pos) - def __unicode__(self): + def __str__(self): "Return a printable representation." result = 'param ' + self.name if self.value: - result += ': ' + unicode(self.value) + result += ': ' + str(self.value) else: result += ' (empty)' return result - if sys.version_info >= (3, 0): - __str__ = __unicode__ - class ParameterFunction(CommandBit): "A function with a variable number of parameters defined in a template." "The parameters are defined as a parameter definition." @@ -3120,7 +3069,7 @@ return None index = int(pos.skipcurrent()) if 2 + index > len(self.translated): - Trace.error('Function f' + unicode(index) + ' is not defined') + Trace.error('Function f' + str(index) + ' is not defined') return None tag = self.translated[2 + index] if not '$' in tag: @@ -3164,7 +3113,7 @@ for name in function.params: if name in sizestring: size = function.params[name].value.computesize() - sizestring = sizestring.replace(name, unicode(size)) + sizestring = sizestring.replace(name, str(size)) if '$' in sizestring: Trace.error('Unconverted variable in hybrid size: ' + sizestring) return 1 Modified: trunk/docutils/docutils/writers/_html_base.py =================================================================== --- trunk/docutils/docutils/writers/_html_base.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/writers/_html_base.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -21,6 +21,7 @@ import os, os.path import re import sys +from urllib.request import url2pathname import warnings import docutils @@ -32,15 +33,7 @@ from docutils.utils.math import (unichar2tex, pick_math_environment, math2html, latex2mathml, tex2mathml_extern) -if sys.version_info >= (3, 0): - from urllib.request import url2pathname -else: - from urllib import url2pathname -if sys.version_info >= (3, 0): - unicode = str # noqa - - class Writer(writers.Writer): supported = ('html', 'xhtml') # update in subclass @@ -159,9 +152,9 @@ self.output = self.apply_template() def apply_template(self): - template_file = open(self.document.settings.template, 'rb') - template = unicode(template_file.read(), 'utf-8') - template_file.close() + with open(self.document.settings.template, 'r', + encoding='utf-8') as template_file: + template = template_file.read() subs = self.interpolation_dict() return template % subs @@ -364,7 +357,7 @@ # Use only named entities known in both XML and HTML # other characters are automatically encoded "by number" if required. # @@@ A codec to do these and all other HTML entities would be nice. - text = unicode(text) + text = str(text) return text.translate(self.special_characters) def cloak_mailto(self, uri): @@ -469,12 +462,12 @@ # value, but this isn't supported by XHTML. assert value is not None if isinstance(value, list): - values = [unicode(v) for v in value] + values = [str(v) for v in value] parts.append('%s="%s"' % (name.lower(), self.attval(' '.join(values)))) else: parts.append('%s="%s"' % (name.lower(), - self.attval(unicode(value)))) + self.attval(str(value)))) if empty: infix = ' /' else: Modified: trunk/docutils/docutils/writers/docutils_xml.py =================================================================== --- trunk/docutils/docutils/writers/docutils_xml.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/writers/docutils_xml.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -10,6 +10,7 @@ __docformat__ = 'reStructuredText' +from io import StringIO import sys import xml.sax.saxutils @@ -16,16 +17,8 @@ import docutils from docutils import frontend, writers, nodes -if sys.version_info >= (3, 0): - from io import StringIO # noqa -else: - from StringIO import StringIO # noqa -if sys.version_info >= (3, 0): - unicode = str # noqa - - class RawXmlError(docutils.ApplicationError): pass @@ -177,8 +170,6 @@ self.output.append(xml_string) self.default_departure(node) # or not? # Check validity of raw XML: - if isinstance(xml_string, unicode) and sys.version_info < (3, 0): - xml_string = xml_string.encode('utf8') try: self.xmlparser.parse(StringIO(xml_string)) except xml.sax._exceptions.SAXParseException as error: Modified: trunk/docutils/docutils/writers/latex2e/__init__.py =================================================================== --- trunk/docutils/docutils/writers/latex2e/__init__.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/writers/latex2e/__init__.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -16,14 +16,9 @@ import re import string import sys +from urllib.request import url2pathname import warnings -if sys.version_info < (3, 0): - from io import open - from urllib import url2pathname -else: - from urllib.request import url2pathname - try: import roman except ImportError: @@ -35,10 +30,7 @@ from docutils.transforms import writer_aux from docutils.utils.math import pick_math_environment, unichar2tex -if sys.version_info >= (3, 0): - unicode = str # noqa - class Writer(writers.Writer): supported = ('latex', 'latex2e') @@ -2805,7 +2797,7 @@ } # external reference (URL) if 'refuri' in node: - href = unicode(node['refuri']).translate(special_chars) + href = str(node['refuri']).translate(special_chars) # problematic chars double caret and unbalanced braces: if href.find('^^') != -1 or self.has_unbalanced_braces(href): self.error( Modified: trunk/docutils/docutils/writers/manpage.py =================================================================== --- trunk/docutils/docutils/writers/manpage.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/writers/manpage.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -46,9 +46,6 @@ import re import sys -if sys.version_info < (3, 0): - range = xrange # NOQA: F821 # flake8 do not check undefined name - import docutils from docutils import nodes, writers, languages try: @@ -352,9 +349,6 @@ else: return "%d." % self._cnt - if sys.version_info < (3, 0): - next = __next__ - def get_width(self): return self._indent def __repr__(self): Modified: trunk/docutils/docutils/writers/odf_odt/__init__.py =================================================================== --- trunk/docutils/docutils/writers/odf_odt/__init__.py 2022-01-03 23:50:05 UTC (rev 8927) +++ trunk/docutils/docutils/writers/odf_odt/__init__.py 2022-01-03 23:50:23 UTC (rev 8928) @@ -12,7 +12,9 @@ __docformat__ = 'reStructuredText' +from configparser import ConfigParser import copy +from io import StringIO import itertools import os import os.path @@ -21,6 +23,8 @@ import sys import tempfile import time +from urllib.request import urlopen +from urllib.error import HTTPError import weakref from xml.etree import ElementTree as etree from xml.dom import minidom @@ -37,17 +41,6 @@ from docutils.readers import standalone from docutils.transforms import references -if sys.version_info >= (3, 0): - from configparser import ConfigParser - from io import StringIO - from urllib.request import urlopen - from urllib.error import HTTPError -else: - from ConfigParser import ConfigParser - from StringIO import StringIO - from urllib2 import HTTPError - from urllib2 import urlopen - FileNotFoundError = OSError # Import pygments and odtwriter pygments formatters if possible. @@ -296,10 +289,7 @@ def ToString(et): outstream = StringIO() - if sys.version_info >= (3, 0): - et.write(outstream, encoding="unicode") - else: - et.write(outstream) + et.write(outstream, encoding="unicode") s1 = outstream.getvalue() outstream.close() return s1 @@ -881,10 +871,7 @@ self.document.reporter.warning( 'Style "%s" is not a style used by odtwriter.' % ( rststyle, )) - if sys.version_info >= (3, 0): - self.format_map[rststyle] = format - else: - self.format_map[rststyle] = format.decode('utf-8') + self.format_map[rststyle] = format self.section_level = 0 self.section_count = 0 # Create ElementTree content and styles documents. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |