[Zope-Checkins]
SVN: Zope/branches/Zope-2_8-branch/lib/python/docutils/
update to docutils 0.3.9
Andreas Jung
andreas at andreas-jung.com
Sun Oct 9 10:37:54 EDT 2005
Log message for revision 39016:
update to docutils 0.3.9
Changed:
A Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/ca.py
A Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/nl.py
A Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/ca.py
A Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/nl.py
A Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/newlatex2e.py
A Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/null.py
-=-
Added: Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/ca.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/ca.py 2005-10-09 14:37:14 UTC (rev 39015)
+++ Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/ca.py 2005-10-09 14:37:54 UTC (rev 39016)
@@ -0,0 +1,62 @@
+# Author: Ivan Vilata i Balaguer
+# Contact: ivan at selidor.net
+# Revision: $Revision: 3276 $
+# Date: $Date: 2005-04-30 13:34:52 +0200 (Sat, 30 Apr 2005) $
+# 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.
+
+"""
+Catalan-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+ # fixed: language-dependent
+ 'author': u'Autor',
+ 'authors': u'Autors',
+ 'organization': u'Organitzaci\u00F3',
+ 'address': u'Adre\u00E7a',
+ 'contact': u'Contacte',
+ 'version': u'Versi\u00F3',
+ 'revision': u'Revisi\u00F3',
+ 'status': u'Estat',
+ 'date': u'Data',
+ 'copyright': u'Copyright',
+ 'dedication': u'Dedicat\u00F2ria',
+ 'abstract': u'Resum',
+ 'attention': u'Atenci\u00F3!',
+ 'caution': u'Compte!',
+ 'danger': u'PERILL!',
+ 'error': u'Error',
+ 'hint': u'Suggeriment',
+ 'important': u'Important',
+ 'note': u'Nota',
+ 'tip': u'Consell',
+ 'warning': u'Av\u00EDs',
+ 'contents': u'Contingut'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+ # language-dependent: fixed
+ u'autor': 'author',
+ u'autors': 'authors',
+ u'organitzaci\u00F3': 'organization',
+ u'adre\u00E7a': 'address',
+ u'contacte': 'contact',
+ u'versi\u00F3': 'version',
+ u'revisi\u00F3': 'revision',
+ u'estat': 'status',
+ u'data': 'date',
+ u'copyright': 'copyright',
+ u'dedicat\u00F2ria': 'dedication',
+ u'resum': 'abstract'}
+"""Catalan (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Added: Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/nl.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/nl.py 2005-10-09 14:37:14 UTC (rev 39015)
+++ Zope/branches/Zope-2_8-branch/lib/python/docutils/languages/nl.py 2005-10-09 14:37:54 UTC (rev 39016)
@@ -0,0 +1,62 @@
+# Author: Martijn Pieters
+# Contact: mjpieters at users.sourceforge.net
+# Revision: $Revision: 3058 $
+# Date: $Date: 2005-03-18 21:09:22 +0100 (Fri, 18 Mar 2005) $
+# 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.
+
+"""
+Dutch-language mappings for language-dependent features of Docutils.
+"""
+
+__docformat__ = 'reStructuredText'
+
+labels = {
+ # fixed: language-dependent
+ 'author': 'Auteur',
+ 'authors': 'Auteurs',
+ 'organization': 'Organisatie',
+ 'address': 'Adres',
+ 'contact': 'Contact',
+ 'version': 'Versie',
+ 'revision': 'Revisie',
+ 'status': 'Status',
+ 'date': 'Datum',
+ 'copyright': 'Copyright',
+ 'dedication': 'Toewijding',
+ 'abstract': 'Samenvatting',
+ 'attention': 'Attentie!',
+ 'caution': 'Let op!',
+ 'danger': '!GEVAAR!',
+ 'error': 'Fout',
+ 'hint': 'Hint',
+ 'important': 'Belangrijk',
+ 'note': 'Opmerking',
+ 'tip': 'Tip',
+ 'warning': 'Waarschuwing',
+ 'contents': 'Inhoud'}
+"""Mapping of node class name to label text."""
+
+bibliographic_fields = {
+ # language-dependent: fixed
+ 'auteur': 'author',
+ 'auteurs': 'authors',
+ 'organisatie': 'organization',
+ 'adres': 'address',
+ 'contact': 'contact',
+ 'versie': 'version',
+ 'revisie': 'revision',
+ 'status': 'status',
+ 'datum': 'date',
+ 'copyright': 'copyright',
+ 'toewijding': 'dedication',
+ 'samenvatting': 'abstract'}
+"""Dutch (lowcased) to canonical name mapping for bibliographic fields."""
+
+author_separators = [';', ',']
+"""List of separator strings for the 'Authors' bibliographic field. Tried in
+order."""
Added: Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/ca.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/ca.py 2005-10-09 14:37:14 UTC (rev 39015)
+++ Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/ca.py 2005-10-09 14:37:54 UTC (rev 39016)
@@ -0,0 +1,119 @@
+# Author: Ivan Vilata i Balaguer
+# Contact: ivan at selidor.net
+# Revision: $Revision: 3276 $
+# Date: $Date: 2005-04-30 13:34:52 +0200 (Sat, 30 Apr 2005) $
+# 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.
+
+"""
+Catalan-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+ # language-dependent: fixed
+ u'atenci\u00F3': 'attention',
+ u'compte': 'caution',
+ u'perill': 'danger',
+ u'error': 'error',
+ u'suggeriment': 'hint',
+ u'important': 'important',
+ u'nota': 'note',
+ u'consell': 'tip',
+ u'av\u00EDs': 'warning',
+ u'advertiment': 'admonition',
+ u'nota-al-marge': 'sidebar',
+ u'nota-marge': 'sidebar',
+ u'tema': 'topic',
+ u'bloc-de-l\u00EDnies': 'line-block',
+ u'bloc-l\u00EDnies': 'line-block',
+ u'literal-analitzat': 'parsed-literal',
+ u'r\u00FAbrica': 'rubric',
+ u'ep\u00EDgraf': 'epigraph',
+ u'sumari': 'highlights',
+ u'cita-destacada': 'pull-quote',
+ u'compost': 'compound',
+ #'questions': 'questions',
+ u'taula': 'table',
+ u'taula-csv': 'csv-table',
+ u'taula-llista': 'list-table',
+ #'qa': 'questions',
+ #'faq': 'questions',
+ u'meta': 'meta',
+ #'imagemap': 'imagemap',
+ u'imatge': 'image',
+ u'figura': 'figure',
+ u'inclou': 'include',
+ u'incloure': 'include',
+ u'cru': 'raw',
+ u'reempla\u00E7a': 'replace',
+ u'reempla\u00E7ar': 'replace',
+ u'unicode': 'unicode',
+ u'classe': 'class',
+ u'rol': 'role',
+ u'contingut': 'contents',
+ u'numsec': 'sectnum',
+ u'numeraci\u00F3-de-seccions': 'sectnum',
+ u'numeraci\u00F3-seccions': 'sectnum',
+ u'cap\u00E7alera': 'header',
+ u'peu-de-p\u00E0gina': 'footer',
+ u'peu-p\u00E0gina': 'footer',
+ #'footnotes': 'footnotes',
+ #'citations': 'citations',
+ u'notes-amb-destinacions': 'target-notes',
+ u'notes-destinacions': 'target-notes',
+ u'directiva-de-prova-de-restructuredtext': 'restructuredtext-test-directive'}
+"""Catalan name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+ # language-dependent: fixed
+ u'abreviatura': 'abbreviation',
+ u'abreviaci\u00F3': 'abbreviation',
+ u'abrev': 'abbreviation',
+ u'ab': 'abbreviation',
+ u'acr\u00F2nim': 'acronym',
+ u'ac': 'acronym',
+ u'\u00EDndex': 'index',
+ u'i': 'index',
+ u'sub\u00EDndex': 'subscript',
+ u'sub': 'subscript',
+ u'super\u00EDndex': 'superscript',
+ u'sup': 'superscript',
+ u'refer\u00E8ncia-a-t\u00EDtol': 'title-reference',
+ u'refer\u00E8ncia-t\u00EDtol': 'title-reference',
+ u't\u00EDtol': 'title-reference',
+ u't': 'title-reference',
+ u'refer\u00E8ncia-a-pep': 'pep-reference',
+ u'refer\u00E8ncia-pep': 'pep-reference',
+ u'pep': 'pep-reference',
+ u'refer\u00E8ncia-a-rfc': 'rfc-reference',
+ u'refer\u00E8ncia-rfc': 'rfc-reference',
+ u'rfc': 'rfc-reference',
+ u'\u00E8mfasi': 'emphasis',
+ u'destacat': 'strong',
+ u'literal': 'literal',
+ u'refer\u00E8ncia-amb-nom': 'named-reference',
+ u'refer\u00E8ncia-nom': 'named-reference',
+ u'refer\u00E8ncia-an\u00F2nima': 'anonymous-reference',
+ u'refer\u00E8ncia-a-nota-al-peu': 'footnote-reference',
+ u'refer\u00E8ncia-nota-al-peu': 'footnote-reference',
+ u'refer\u00E8ncia-a-cita': 'citation-reference',
+ u'refer\u00E8ncia-cita': 'citation-reference',
+ u'refer\u00E8ncia-a-substituci\u00F3': 'substitution-reference',
+ u'refer\u00E8ncia-substituci\u00F3': 'substitution-reference',
+ u'destinaci\u00F3': 'target',
+ u'refer\u00E8ncia-a-uri': 'uri-reference',
+ u'refer\u00E8ncia-uri': 'uri-reference',
+ u'uri': 'uri-reference',
+ u'url': 'uri-reference',
+ u'cru': 'raw',}
+"""Mapping of Catalan role names to canonical role names for interpreted text.
+"""
Added: Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/nl.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/nl.py 2005-10-09 14:37:14 UTC (rev 39015)
+++ Zope/branches/Zope-2_8-branch/lib/python/docutils/parsers/rst/languages/nl.py 2005-10-09 14:37:54 UTC (rev 39016)
@@ -0,0 +1,106 @@
+# Author: Martijn Pieters
+# Contact: mjpieters at users.sourceforge.net
+# Revision: $Revision: 3184 $
+# Date: $Date: 2005-04-07 21:36:11 +0200 (Thu, 07 Apr 2005) $
+# 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.
+
+"""
+Dutch-language mappings for language-dependent features of
+reStructuredText.
+"""
+
+__docformat__ = 'reStructuredText'
+
+
+directives = {
+ # language-dependent: fixed
+ 'attentie': 'attention',
+ 'let-op': 'caution',
+ 'gevaar': 'danger',
+ 'fout': 'error',
+ 'hint': 'hint',
+ 'belangrijk': 'important',
+ 'opmerking': 'note',
+ 'tip': 'tip',
+ 'waarschuwing': 'warning',
+ 'aanmaning': 'admonition',
+ 'katern': 'sidebar',
+ 'onderwerp': 'topic',
+ 'lijn-blok': 'line-block',
+ 'letterlijk-ontleed': 'parsed-literal',
+ 'rubriek': 'rubric',
+ 'opschrift': 'epigraph',
+ 'hoogtepunten': 'highlights',
+ 'pull-quote': 'pull-quote', # Dutch printers use the english term
+ 'samenstelling': 'compound',
+ 'verbinding': 'compound',
+ #'vragen': 'questions',
+ 'tabel': 'table',
+ 'csv-tabel': 'csv-table',
+ 'lijst-tabel': 'list-table',
+ #'veelgestelde-vragen': 'questions',
+ 'meta': 'meta',
+ #'imagemap': 'imagemap',
+ 'beeld': 'image',
+ 'figuur': 'figure',
+ 'opnemen': 'include',
+ 'onbewerkt': 'raw',
+ 'vervang': 'replace',
+ 'vervanging': 'replace',
+ 'unicode': 'unicode',
+ 'klasse': 'class',
+ 'rol': 'role',
+ 'inhoud': 'contents',
+ 'sectnum': 'sectnum',
+ 'sectie-nummering': 'sectnum',
+ 'hoofdstuk-nummering': 'sectnum',
+ u'header (translation required)': 'header',
+ u'footer (translation required)': 'footer',
+ #'voetnoten': 'footnotes',
+ #'citaten': 'citations',
+ 'verwijzing-voetnoten': 'target-notes',
+ 'restructuredtext-test-instructie': 'restructuredtext-test-directive'}
+"""Dutch name to registered (in directives/__init__.py) directive name
+mapping."""
+
+roles = {
+ # language-dependent: fixed
+ 'afkorting': 'abbreviation',
+ # 'ab': 'abbreviation',
+ 'acroniem': 'acronym',
+ 'ac': 'acronym',
+ 'index': 'index',
+ 'i': 'index',
+ 'inferieur': 'subscript',
+ 'inf': 'subscript',
+ 'superieur': 'superscript',
+ 'sup': 'superscript',
+ 'titel-referentie': 'title-reference',
+ 'titel': 'title-reference',
+ 't': 'title-reference',
+ 'pep-referentie': 'pep-reference',
+ 'pep': 'pep-reference',
+ 'rfc-referentie': 'rfc-reference',
+ 'rfc': 'rfc-reference',
+ 'nadruk': 'emphasis',
+ 'extra': 'strong',
+ 'extra-nadruk': 'strong',
+ 'vet': 'strong',
+ 'letterlijk': 'literal',
+ 'benoemde-referentie': 'named-reference',
+ 'anonieme-referentie': 'anonymous-reference',
+ 'voetnoot-referentie': 'footnote-reference',
+ 'citaat-referentie': 'citation-reference',
+ 'substitie-reference': 'substitution-reference',
+ 'verwijzing': 'target',
+ 'uri-referentie': 'uri-reference',
+ 'uri': 'uri-reference',
+ 'url': 'uri-reference',
+ 'onbewerkt': 'raw',}
+"""Mapping of Dutch role names to canonical role names for interpreted text.
+"""
Added: Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/newlatex2e.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/newlatex2e.py 2005-10-09 14:37:14 UTC (rev 39015)
+++ Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/newlatex2e.py 2005-10-09 14:37:54 UTC (rev 39016)
@@ -0,0 +1,759 @@
+"""
+:Author: Felix Wiemann
+:Contact: Felix_Wiemann at ososo.de
+:Revision: $Revision: 3376 $
+:Date: $Date: 2005-05-26 23:33:24 +0200 (Thu, 26 May 2005) $
+:Copyright: This module has been placed in the public domain.
+
+LaTeX2e document tree Writer.
+"""
+
+# Thanks to Engelbert Gruber and various contributors for the original
+# LaTeX writer, some code and many ideas of which have been used for
+# this writer.
+
+__docformat__ = 'reStructuredText'
+
+
+from __future__ import nested_scopes
+
+import re
+import os.path
+from types import ListType
+
+import docutils
+from docutils import nodes, writers, utils
+
+
+class Writer(writers.Writer):
+
+ supported = ('newlatex', 'newlatex2e')
+ """Formats this writer supports."""
+
+ settings_spec = (
+ 'LaTeX-Specific Options',
+ 'The LaTeX "--output-encoding" default is "latin-1:strict". '
+ 'Note that this LaTeX writer is still EXPERIMENTAL.',
+ (('Specify a stylesheet file. The path is used verbatim to include '
+ 'the file. Overrides --stylesheet-path.',
+ ['--stylesheet'],
+ {'default': '', 'metavar': '<file>',
+ 'overrides': 'stylesheet_path'}),
+ ('Specify a stylesheet file, relative to the current working '
+ 'directory. Overrides --stylesheet.',
+ ['--stylesheet-path'],
+ {'metavar': '<file>', 'overrides': 'stylesheet'}),
+ ('Specify a uesr stylesheet file. See --stylesheet.',
+ ['--user-stylesheet'],
+ {'default': '', 'metavar': '<file>',
+ 'overrides': 'user_stylesheet_path'}),
+ ('Specify a user stylesheet file. See --stylesheet-path.',
+ ['--user-stylesheet-path'],
+ {'metavar': '<file>', 'overrides': 'user_stylesheet'})
+ ),)
+
+ settings_defaults = {'output_encoding': 'latin-1',
+ 'trim_footnote_reference_space': 1,
+ # Currently unsupported:
+ 'docinfo_xform': 0,
+ # During development:
+ 'traceback': 1}
+
+ relative_path_settings = ('stylesheet_path',)
+
+ config_section = 'newlatex2e writer'
+ config_section_dependencies = ('writers',)
+
+ output = None
+ """Final translated form of `document`."""
+
+ def __init__(self):
+ writers.Writer.__init__(self)
+ self.translator_class = LaTeXTranslator
+
+ def translate(self):
+ visitor = self.translator_class(self.document)
+ self.document.walkabout(visitor)
+ assert not visitor.context, 'context not empty: %s' % visitor.context
+ self.output = visitor.astext()
+ self.head = visitor.header
+ self.body = visitor.body
+
+
+class Babel:
+ """Language specifics for LaTeX."""
+ # country code by a.schlock.
+ # partly manually converted from iso and babel stuff, dialects and some
+ _ISO639_TO_BABEL = {
+ 'no': 'norsk', # added by hand ( forget about nynorsk?)
+ 'gd': 'scottish', # added by hand
+ 'hu': 'magyar', # added by hand
+ 'pt': 'portuguese',# added by hand
+ 'sl': 'slovenian',
+ 'af': 'afrikaans',
+ 'bg': 'bulgarian',
+ 'br': 'breton',
+ 'ca': 'catalan',
+ 'cs': 'czech',
+ 'cy': 'welsh',
+ 'da': 'danish',
+ 'fr': 'french',
+ # french, francais, canadien, acadian
+ 'de': 'ngerman', # rather than german
+ # ngerman, naustrian, german, germanb, austrian
+ 'el': 'greek',
+ 'en': 'english',
+ # english, USenglish, american, UKenglish, british, canadian
+ 'eo': 'esperanto',
+ 'es': 'spanish',
+ 'et': 'estonian',
+ 'eu': 'basque',
+ 'fi': 'finnish',
+ 'ga': 'irish',
+ 'gl': 'galician',
+ 'he': 'hebrew',
+ 'hr': 'croatian',
+ 'hu': 'hungarian',
+ 'is': 'icelandic',
+ 'it': 'italian',
+ 'la': 'latin',
+ 'nl': 'dutch',
+ 'pl': 'polish',
+ 'pt': 'portuguese',
+ 'ro': 'romanian',
+ 'ru': 'russian',
+ 'sk': 'slovak',
+ 'sr': 'serbian',
+ 'sv': 'swedish',
+ 'tr': 'turkish',
+ 'uk': 'ukrainian'
+ }
+
+ def __init__(self, lang):
+ self.language = lang
+
+ def get_language(self):
+ if self._ISO639_TO_BABEL.has_key(self.language):
+ return self._ISO639_TO_BABEL[self.language]
+ else:
+ # Support dialects.
+ l = self.language.split("_")[0]
+ if self._ISO639_TO_BABEL.has_key(l):
+ return self._ISO639_TO_BABEL[l]
+ return None
+
+
+class LaTeXException(Exception):
+ """
+ Exception base class to for exceptions which influence the
+ automatic generation of LaTeX code.
+ """
+
+
+class SkipAttrParentLaTeX(LaTeXException):
+ """
+ Do not generate \Dattr and \renewcommand{\Dparent}{...} for this
+ node.
+
+ To be raised from before_... methods.
+ """
+
+
+class SkipParentLaTeX(LaTeXException):
+ """
+ Do not generate \renewcommand{\DNparent}{...} for this node.
+
+ To be raised from before_... methods.
+ """
+
+
+class LaTeXTranslator(nodes.SparseNodeVisitor):
+
+ # Start with left double quote.
+ left_quote = 1
+
+ def __init__(self, document):
+ nodes.NodeVisitor.__init__(self, document)
+ self.settings = document.settings
+ self.header = []
+ self.body = []
+ self.context = []
+ self.stylesheet_path = utils.get_stylesheet_reference(
+ self.settings, os.path.join(os.getcwd(), 'dummy'))
+ if self.stylesheet_path:
+ self.settings.record_dependencies.add(self.stylesheet_path)
+ # This ugly hack will be cleaned up when refactoring the
+ # stylesheet mess.
+ self.settings.stylesheet = self.settings.user_stylesheet
+ self.settings.stylesheet_path = self.settings.user_stylesheet_path
+ self.user_stylesheet_path = utils.get_stylesheet_reference(
+ self.settings, os.path.join(os.getcwd(), 'dummy'))
+ if self.user_stylesheet_path:
+ self.settings.record_dependencies.add(self.user_stylesheet_path)
+ self.write_header()
+ for key, value in self.character_map.items():
+ self.character_map[key] = '{%s}' % value
+
+ def write_header(self):
+ a = self.header.append
+ a('%% Generated by Docutils %s <http://docutils.sourceforge.net>.\n'
+ % docutils.__version__)
+ if self.user_stylesheet_path:
+ a('% User stylesheet:')
+ a(r'\input{%s}' % self.user_stylesheet_path)
+ a('% Docutils stylesheet:')
+ a(r'\input{%s}' % self.stylesheet_path)
+ a('')
+ a('% Definitions for Docutils Nodes:')
+ for node_name in nodes.node_class_names:
+ a(r'\providecommand{\DN%s}[1]{#1}' % node_name.replace('_', ''))
+ a('')
+ a('% Auxiliary definitions:')
+ a(r'\providecommand{\Dsetattr}[2]{}')
+ a(r'\providecommand{\Dparent}{} % variable')
+ a(r'\providecommand{\Dattr}[5]{#5}')
+ a(r'\providecommand{\Dattrlen}{} % variable')
+ a(r'\providecommand{\Dtitleastext}{x}')
+ a(r'\providecommand{\Dsinglebackref}{} % variable')
+ a(r'\providecommand{\Dmultiplebackrefs}{} % variable')
+ a('\n\n')
+
+ def to_latex_encoding(self,docutils_encoding):
+ """
+ Translate docutils encoding name into latex's.
+
+ Default fallback method is remove "-" and "_" chars from
+ docutils_encoding.
+ """
+ tr = { "iso-8859-1": "latin1", # west european
+ "iso-8859-2": "latin2", # east european
+ "iso-8859-3": "latin3", # esperanto, maltese
+ "iso-8859-4": "latin4", # north european,scandinavian, baltic
+ "iso-8859-5": "iso88595", # cyrillic (ISO)
+ "iso-8859-9": "latin5", # turkish
+ "iso-8859-15": "latin9", # latin9, update to latin1.
+ "mac_cyrillic": "maccyr", # cyrillic (on Mac)
+ "windows-1251": "cp1251", # cyrillic (on Windows)
+ "koi8-r": "koi8-r", # cyrillic (Russian)
+ "koi8-u": "koi8-u", # cyrillic (Ukrainian)
+ "windows-1250": "cp1250", #
+ "windows-1252": "cp1252", #
+ "us-ascii": "ascii", # ASCII (US)
+ # unmatched encodings
+ #"": "applemac",
+ #"": "ansinew", # windows 3.1 ansi
+ #"": "ascii", # ASCII encoding for the range 32--127.
+ #"": "cp437", # dos latine us
+ #"": "cp850", # dos latin 1
+ #"": "cp852", # dos latin 2
+ #"": "decmulti",
+ #"": "latin10",
+ #"iso-8859-6": "" # arabic
+ #"iso-8859-7": "" # greek
+ #"iso-8859-8": "" # hebrew
+ #"iso-8859-10": "" # latin6, more complete iso-8859-4
+ }
+ if tr.has_key(docutils_encoding.lower()):
+ return tr[docutils_encoding.lower()]
+ return docutils_encoding.translate(string.maketrans("",""),"_-").lower()
+
+ def language_label(self, docutil_label):
+ return self.language.labels[docutil_label]
+
+ # To do: Use unimap.py from TeXML instead. Have to deal with
+ # legal cruft before, because it's LPGL.
+ character_map_string = r"""
+ \ \textbackslash
+ { \{
+ } \}
+ $ \$
+ & \&
+ % \%
+ # \#
+ [ [
+ ] ]
+ - -
+ ` `
+ ' '
+ , ,
+ " "
+ | \textbar
+ < \textless
+ > \textgreater
+ ^ \textasciicircum
+ ~ \textasciitilde
+ _ \Dtextunderscore
+ """
+
+ #special_map = {'\n': ' ', '\r': ' ', '\t': ' ', '\v': ' ', '\f': ' '}
+
+ unicode_map = {
+ u'\u00A0': '~',
+ u'\u2009': '{\\,}',
+ u'\u2013': '{--}',
+ u'\u2014': '{---}',
+ u'\u2018': '`',
+ u'\u2019': '\'',
+ u'\u201A': ',',
+ u'\u201C': '``',
+ u'\u201D': "''",
+ u'\u201E': ',,',
+ u'\u2020': '{\\dag}',
+ u'\u2021': '{\\ddag}',
+ u'\u2026': '{\\dots}',
+ u'\u2122': '{\\texttrademark}',
+ u'\u21d4': '{$\\Leftrightarrow$}',
+ }
+
+ character_map = {}
+ for pair in character_map_string.strip().split('\n'):
+ char, replacement = pair.split()
+ character_map[char] = replacement
+ character_map.update(unicode_map)
+ #character_map.update(special_map)
+
+ def encode(self, text, attval=0):
+ """
+ Encode special characters in ``text`` and return it.
+
+ If attval is true, preserve as much as possible verbatim (used in
+ attribute value encoding).
+ """
+ if not attval:
+ get = self.character_map.get
+ else:
+ # According to
+ # <http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/teTeX/latex/latex2e-html/ltx-164.html>,
+ # the following characters are special: # $ % & ~ _ ^ \ { }
+ # These work without special treatment in macro parameters:
+ # $, &, ~, _, ^
+ get = {'#': '\\#',
+ '%': '\\%',
+ # We cannot do anything about backslashes.
+ '\\': '',
+ '{': '\\{',
+ '}': '\\}',
+ # The quotation mark may be redefined by babel.
+ '"': '"{}',
+ }.get
+ text = ''.join([get(c, c) for c in text])
+ if (self.literal_block or self.inline_literal) and not attval:
+ # NB: We can have inline literals within literal blocks.
+ # Shrink '\r\n'.
+ text = text.replace('\r\n', '\n')
+ # Convert space. If "{ }~~~~~" is wrapped (at the
+ # brace-enclosed space "{ }"), the following non-breaking
+ # spaces ("~~~~") do *not* wind up at the beginning of the
+ # next line. Also note that, for some not-so-obvious
+ # reason, no hyphenation is done if the breaking space ("{
+ # }") comes *after* the non-breaking spaces.
+ if self.literal_block:
+ # Replace newlines with real newlines.
+ text = text.replace('\n', '\mbox{}\\\\')
+ firstspace = '~'
+ else:
+ firstspace = '{ }'
+ text = re.sub(r'\s+', lambda m: firstspace +
+ '~' * (len(m.group()) - 1), text)
+ # Protect hyphens; if we don't, line breaks will be
+ # possible at the hyphens and even the \textnhtt macro
+ # from the hyphenat package won't change that.
+ text = text.replace('-', r'\mbox{-}')
+ text = text.replace("'", r'{\Dtextliteralsinglequote}')
+ return text
+ else:
+ if not attval:
+ # Replace space with single protected space.
+ text = re.sub(r'\s+', '{ }', text)
+ # Replace double quotes with macro calls.
+ L = []
+ for part in text.split('"'):
+ if L:
+ # Insert quote.
+ L.append(self.left_quote and r'\Dtextleftdblquote' or
+ r'\Dtextrightdblquote')
+ self.left_quote = not self.left_quote
+ L.append(part)
+ return ''.join(L)
+ else:
+ return text
+
+ def astext(self):
+ return '\n'.join(self.header) + (''.join(self.body))
+
+ def append(self, text, newline='%\n'):
+ """
+ Append text, stripping newlines, producing nice LaTeX code.
+ """
+ lines = [' ' * self.indentation_level + line + newline
+ for line in text.splitlines(0)]
+ self.body.append(''.join(lines))
+
+ def visit_Text(self, node):
+ self.append(self.encode(node.astext()))
+
+ def depart_Text(self, node):
+ pass
+
+ def before_title(self, node):
+ self.append(r'\renewcommand{\Dtitleastext}{%s}'
+ % self.encode(node.astext()))
+ self.append(r'\renewcommand{\Dhassubtitle}{%s}'
+ % ((len(node.parent) > 2 and
+ isinstance(node.parent[1], nodes.subtitle))
+ and 'true' or 'false'))
+
+ literal_block = 0
+
+ def visit_literal_block(self, node):
+ self.literal_block = 1
+
+ def depart_literal_block(self, node):
+ self.literal_block = 0
+
+ visit_doctest_block = visit_literal_block
+ depart_doctest_block = depart_literal_block
+
+ inline_literal = 0
+
+ def visit_literal(self, node):
+ self.inline_literal += 1
+
+ def depart_literal(self, node):
+ self.inline_literal -= 1
+
+ def visit_comment(self, node):
+ self.append('\n'.join(['% ' + line for line
+ in node.astext().splitlines(0)]), newline='\n')
+ raise nodes.SkipChildren
+
+ bullet_list_level = 0
+
+ def visit_bullet_list(self, node):
+ self.append(r'\Dsetbullet{\labelitem%s}' %
+ ['i', 'ii', 'iii', 'iv'][min(self.bullet_list_level, 3)])
+ self.bullet_list_level += 1
+
+ def depart_bullet_list(self, node):
+ self.bullet_list_level -= 1
+
+ enum_styles = {'arabic': 'arabic', 'loweralpha': 'alph', 'upperalpha':
+ 'Alph', 'lowerroman': 'roman', 'upperroman': 'Roman'}
+
+ enum_counter = 0
+
+ def visit_enumerated_list(self, node):
+ # We create our own enumeration list environment. This allows
+ # to set the style and starting value and unlimited nesting.
+ # Maybe this can be moved to the stylesheet?
+ self.enum_counter += 1
+ enum_prefix = self.encode(node['prefix'])
+ enum_suffix = self.encode(node['suffix'])
+ enum_type = '\\' + self.enum_styles.get(node['enumtype'], r'arabic')
+ start = node.get('start', 1) - 1
+ counter = 'Denumcounter%d' % self.enum_counter
+ self.append(r'\Dmakeenumeratedlist{%s}{%s}{%s}{%s}{%s}{'
+ % (enum_prefix, enum_type, enum_suffix, counter, start))
+ # for Emacs: }
+
+ def depart_enumerated_list(self, node):
+ self.append('}') # for Emacs: {
+
+ def before_list_item(self, node):
+ # XXX needs cleanup.
+ if (len(node) and (isinstance(node[-1], nodes.TextElement) or
+ isinstance(node[-1], nodes.Text)) and
+ node.parent.index(node) == len(node.parent) - 1):
+ node['lastitem'] = 'true'
+
+ before_line = before_list_item
+
+ def before_raw(self, node):
+ if 'latex' in node.get('format', '').split():
+ # We're inserting the text in before_raw and thus outside
+ # of \DN... and \Dattr in order to make grouping with
+ # curly brackets work.
+ self.append(node.astext())
+ raise nodes.SkipChildren
+
+ def process_backlinks(self, node, type):
+ self.append(r'\renewcommand{\Dsinglebackref}{}')
+ self.append(r'\renewcommand{\Dmultiplebackrefs}{}')
+ if len(node['backrefs']) > 1:
+ refs = []
+ for i in range(len(node['backrefs'])):
+ refs.append(r'\Dmulti%sbacklink{%s}{%s}'
+ % (type, node['backrefs'][i], i + 1))
+ self.append(r'\renewcommand{\Dmultiplebackrefs}{(%s){ }}'
+ % ', '.join(refs))
+ elif len(node['backrefs']) == 1:
+ self.append(r'\renewcommand{\Dsinglebackref}{%s}'
+ % node['backrefs'][0])
+
+ def visit_footnote(self, node):
+ self.process_backlinks(node, 'footnote')
+
+ def visit_citation(self, node):
+ self.process_backlinks(node, 'citation')
+
+ def before_table(self, node):
+ # A tables contains exactly one tgroup. See before_tgroup.
+ pass
+
+ def before_tgroup(self, node):
+ widths = []
+ total_width = 0
+ for i in range(int(node['cols'])):
+ assert isinstance(node[i], nodes.colspec)
+ widths.append(int(node[i]['colwidth']) + 1)
+ total_width += widths[-1]
+ del node[:len(widths)]
+ tablespec = '|'
+ for w in widths:
+ # 0.93 is probably wrong in many cases. XXX Find a
+ # solution which works *always*.
+ tablespec += r'p{%s\linewidth}|' % (0.93 * w /
+ max(total_width, 60))
+ self.append(r'\Dmaketable{%s}{' % tablespec)
+ self.context.append('}')
+ raise SkipAttrParentLaTeX
+
+ def depart_tgroup(self, node):
+ self.append(self.context.pop())
+
+ def before_row(self, node):
+ raise SkipAttrParentLaTeX
+
+ def before_thead(self, node):
+ raise SkipAttrParentLaTeX
+
+ def before_tbody(self, node):
+ raise SkipAttrParentLaTeX
+
+ def is_simply_entry(self, node):
+ return (len(node) == 1 and isinstance(node[0], nodes.paragraph) or
+ len(node) == 0)
+
+ def before_entry(self, node):
+ is_leftmost = 0
+ if node.hasattr('morerows'):
+ self.document.reporter.severe('Rowspans are not supported.')
+ # Todo: Add empty cells below rowspanning cell and issue
+ # warning instead of severe.
+ if node.hasattr('morecols'):
+ # The author got a headache trying to implement
+ # multicolumn support.
+ if not self.is_simply_entry(node):
+ self.document.reporter.severe(
+ 'Colspanning table cells may only contain one paragraph.')
+ # Todo: Same as above.
+ # The number of columns this entry spans (as a string).
+ colspan = int(node['morecols']) + 1
+ del node['morecols']
+ else:
+ colspan = 1
+ # Macro to call.
+ macro_name = r'\Dcolspan'
+ if node.parent.index(node) == 0:
+ # Leftmost column.
+ macro_name += 'left'
+ is_leftmost = 1
+ if colspan > 1:
+ self.append('%s{%s}{' % (macro_name, colspan))
+ self.context.append('}')
+ else:
+ # Do not add a multicolumn with colspan 1 beacuse we need
+ # at least one non-multicolumn cell per column to get the
+ # desired column widths, and we can only do colspans with
+ # cells consisting of only one paragraph.
+ if not is_leftmost:
+ self.append(r'\Dsubsequententry{')
+ self.context.append('}')
+ else:
+ self.context.append('')
+ if isinstance(node.parent.parent, nodes.thead):
+ node['tableheaderentry'] = 'true'
+
+ # Don't add \renewcommand{\Dparent}{...} because there must
+ # not be any non-expandable commands in front of \multicolumn.
+ raise SkipParentLaTeX
+
+ def depart_entry(self, node):
+ self.append(self.context.pop())
+
+ def before_substitution_definition(self, node):
+ raise nodes.SkipNode
+
+ indentation_level = 0
+
+ def node_name(self, node):
+ return node.__class__.__name__.replace('_', '')
+
+ def propagate_attributes(self, node):
+ # Propagate attributes using \Dattr macros.
+ node_name = self.node_name(node)
+ attlist = []
+ if isinstance(node, nodes.Element):
+ attlist = node.attlist()
+ numatts = 0
+ pass_contents = self.pass_contents(node)
+ for key, value in attlist:
+ if isinstance(value, ListType):
+ self.append(r'\renewcommand{\Dattrlen}{%s}' % len(value))
+ for i in range(len(value)):
+ self.append(r'\Dattr{%s}{%s}{%s}{%s}{' %
+ (i+1, key, self.encode(value[i], attval=1),
+ node_name))
+ if not pass_contents:
+ self.append('}')
+ numatts += len(value)
+ else:
+ self.append(r'\Dattr{}{%s}{%s}{%s}{' %
+ (key, self.encode(unicode(value), attval=1),
+ node_name))
+ if not pass_contents:
+ self.append('}')
+ numatts += 1
+ if pass_contents:
+ self.context.append('}' * numatts) # for Emacs: {
+ else:
+ self.context.append('')
+
+ def visit_docinfo(self, node):
+ raise NotImplementedError('Docinfo not yet implemented.')
+
+ def visit_document(self, node):
+ document = node
+ # Move IDs into TextElements. This won't work for images.
+ # Need to review this.
+ for node in document.traverse(lambda n: isinstance(n, nodes.Element)):
+ if node.has_key('ids') and not isinstance(node,
+ nodes.TextElement):
+ next_text_element = node.next_node(
+ lambda n: isinstance(n, nodes.TextElement))
+ if next_text_element:
+ next_text_element['ids'].extend(node['ids'])
+ node['ids'] = []
+
+ def pass_contents(self, node):
+ r"""
+ Return true if the node contents should be passed in
+ parameters of \DN... and \Dattr.
+ """
+ return not isinstance(node, (nodes.document, nodes.section))
+
+ def dispatch_visit(self, node):
+ skip_attr = skip_parent = 0
+ # TreePruningException to be propagated.
+ tree_pruning_exception = None
+ if hasattr(self, 'before_' + node.__class__.__name__):
+ try:
+ getattr(self, 'before_' + node.__class__.__name__)(node)
+ except SkipParentLaTeX:
+ skip_parent = 1
+ except SkipAttrParentLaTeX:
+ skip_attr = 1
+ skip_parent = 1
+ except nodes.SkipNode:
+ raise
+ except (nodes.SkipChildren, nodes.SkipSiblings), instance:
+ tree_pruning_exception = instance
+ except nodes.SkipDeparture:
+ raise NotImplementedError(
+ 'SkipDeparture not usable in LaTeX writer')
+
+ if not isinstance(node, nodes.Text):
+ node_name = self.node_name(node)
+ # attribute_deleters will be appended to self.context.
+ attribute_deleters = []
+ if not skip_parent and not isinstance(node, nodes.document):
+ self.append(r'\renewcommand{\Dparent}{%s}'
+ % self.node_name(node.parent))
+ for name, value in node.attlist():
+ # @@@ Evaluate if this is really needed and refactor.
+ if not isinstance(value, ListType) and not ':' in name:
+ macro = r'\DcurrentN%sA%s' % (node_name, name)
+ self.append(r'\def%s{%s}' % (
+ macro, self.encode(unicode(value), attval=1)))
+ attribute_deleters.append(r'\let%s=\relax' % macro)
+ self.context.append('\n'.join(attribute_deleters))
+ if self.pass_contents(node):
+ self.append(r'\DN%s{' % node_name)
+ self.context.append('}')
+ else:
+ self.append(r'\Dvisit%s' % node_name)
+ self.context.append(r'\Ddepart%s' % node_name)
+ self.indentation_level += 1
+ if not skip_attr:
+ self.propagate_attributes(node)
+ else:
+ self.context.append('')
+
+ if (isinstance(node, nodes.TextElement) and
+ not isinstance(node.parent, nodes.TextElement)):
+ # Reset current quote to left.
+ self.left_quote = 1
+
+ # Call visit_... method.
+ try:
+ nodes.SparseNodeVisitor.dispatch_visit(self, node)
+ except LaTeXException:
+ raise NotImplementedError(
+ 'visit_... methods must not raise LaTeXExceptions')
+
+ if tree_pruning_exception:
+ # Propagate TreePruningException raised in before_... method.
+ raise tree_pruning_exception
+
+ def is_invisible(self, node):
+ # Return true if node is invisible or moved away in the LaTeX
+ # rendering.
+ return (isinstance(node, nodes.Invisible) or
+ isinstance(node, nodes.footnote) or
+ isinstance(node, nodes.citation) or
+ # We never know what's inside raw nodes, and often
+ # they *are* invisible. So let's have the user take
+ # care of them.
+ isinstance(node, nodes.raw) or
+ # Horizontally aligned image or figure.
+ node.get('align', None) in ('left', 'center', 'right'))
+
+ def needs_space(self, node):
+ # Return true if node is a visible block-level element.
+ return ((isinstance(node, nodes.Body) or
+ isinstance(node, nodes.topic) or
+ #isinstance(node, nodes.rubric) or
+ isinstance(node, nodes.transition) or
+ isinstance(node, nodes.caption) or
+ isinstance(node, nodes.legend)) and
+ not (self.is_invisible(node) or
+ isinstance(node.parent, nodes.TextElement)))
+
+ def dispatch_departure(self, node):
+ # Call departure method.
+ nodes.SparseNodeVisitor.dispatch_departure(self, node)
+
+ if not isinstance(node, nodes.Text):
+ # Close attribute and node handler call (\DN...{...}).
+ self.indentation_level -= 1
+ self.append(self.context.pop() + self.context.pop())
+ # Delete \Dcurrent... attribute macros.
+ self.append(self.context.pop())
+ # Insert space.
+ if self.needs_space(node):
+ # Next sibling.
+ next_node = node.next_node(
+ ascend=0, siblings=1, descend=0,
+ condition=lambda n: not self.is_invisible(n))
+ if self.needs_space(next_node):
+ # Insert space.
+ if isinstance(next_node, nodes.paragraph):
+ if isinstance(node, nodes.paragraph):
+ # Space between paragraphs.
+ self.append(r'\Dparagraphspace')
+ else:
+ # Space in front of a paragraph.
+ self.append(r'\Dauxiliaryparspace')
+ else:
+ # Space in front of something else than a paragraph.
+ self.append(r'\Dauxiliaryspace')
Added: Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/null.py
===================================================================
--- Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/null.py 2005-10-09 14:37:14 UTC (rev 39015)
+++ Zope/branches/Zope-2_8-branch/lib/python/docutils/writers/null.py 2005-10-09 14:37:54 UTC (rev 39016)
@@ -0,0 +1,23 @@
+# Author: David Goodger
+# Contact: goodger at python.org
+# Revision: $Revision: 3246 $
+# Date: $Date: 2005-04-23 21:23:21 +0200 (Sat, 23 Apr 2005) $
+# Copyright: This module has been placed in the public domain.
+
+"""
+A do-nothing Writer.
+"""
+
+from docutils import writers
+
+
+class Writer(writers.Writer):
+
+ supported = ('null',)
+ """Formats this writer supports."""
+
+ config_section = 'null writer'
+ config_section_dependencies = ('writers',)
+
+ def translate(self):
+ pass
More information about the Zope-Checkins
mailing list