comparison env/lib/python3.9/site-packages/docutils/writers/xetex/__init__.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # :Author: Günter Milde <milde@users.sourceforge.net>
5 # :Revision: $Revision: 8411 $
6 # :Date: $Date: 2019-11-05 14:32:13 +0100 (Di, 05. Nov 2019) $
7 # :Copyright: © 2010 Günter Milde.
8 # :License: Released under the terms of the `2-Clause BSD license`_, in short:
9 #
10 # Copying and distribution of this file, with or without modification,
11 # are permitted in any medium without royalty provided the copyright
12 # notice and this notice are preserved.
13 # This file is offered as-is, without any warranty.
14 #
15 # .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
16
17 """
18 XeLaTeX document tree Writer.
19
20 A variant of Docutils' standard 'latex2e' writer producing LaTeX output
21 suited for processing with the Unicode-aware TeX engines
22 LuaTeX and XeTeX.
23 """
24
25 __docformat__ = 'reStructuredText'
26
27 import os
28 import os.path
29 import re
30
31 import docutils
32 from docutils import frontend, nodes, utils, writers, languages
33 from docutils.writers import latex2e
34
35 class Writer(latex2e.Writer):
36 """A writer for Unicode-aware LaTeX variants (XeTeX, LuaTeX)"""
37
38 supported = ('lxtex', 'xetex', 'xelatex', 'luatex', 'lualatex')
39 """Formats this writer supports."""
40
41 default_template = 'xelatex.tex'
42 default_preamble = '\n'.join([
43 r'% Linux Libertine (free, wide coverage, not only for Linux)',
44 r'\setmainfont{Linux Libertine O}',
45 r'\setsansfont{Linux Biolinum O}',
46 r'\setmonofont[HyphenChar=None,Scale=MatchLowercase]{DejaVu Sans Mono}',
47 ])
48
49 config_section = 'xetex writer'
50 config_section_dependencies = ('writers', 'latex writers',
51 'latex2e writer') # TODO: remove dependency on `latex2e writer`.
52
53 settings_spec = frontend.filter_settings_spec(
54 latex2e.Writer.settings_spec,
55 'font_encoding',
56 template=('Template file. Default: "%s".' % default_template,
57 ['--template'], {'default': default_template, 'metavar': '<file>'}),
58 latex_preamble=('Customization by LaTeX code in the preamble. '
59 'Default: select "Linux Libertine" fonts.',
60 ['--latex-preamble'],
61 {'default': default_preamble}),
62 )
63
64 def __init__(self):
65 latex2e.Writer.__init__(self)
66 self.settings_defaults.update({'fontencoding': ''}) # use default (EU1 or EU2)
67 self.translator_class = XeLaTeXTranslator
68
69
70 class Babel(latex2e.Babel):
71 """Language specifics for XeTeX.
72
73 Use `polyglossia` instead of `babel` and adapt settings.
74 """
75 language_codes = latex2e.Babel.language_codes.copy()
76 # Additionally supported or differently named languages:
77 language_codes.update({
78 # code Polyglossia-name comment
79 'cop': 'coptic',
80 'de': 'german', # new spelling (de_1996)
81 'de-1901': 'ogerman', # old spelling
82 'dv': 'divehi', # Maldivian
83 'dsb': 'lsorbian',
84 'el-polyton': 'polygreek',
85 'fa': 'farsi',
86 'grc': 'ancientgreek',
87 'hsb': 'usorbian',
88 'sh-Cyrl': 'serbian', # Serbo-Croatian, Cyrillic script
89 'sh-Latn': 'croatian', # Serbo-Croatian, Latin script
90 'sq': 'albanian',
91 'sr': 'serbian', # Cyrillic script (sr-Cyrl)
92 'th': 'thai',
93 'vi': 'vietnamese',
94 # zh-Latn: ??? # Chinese Pinyin
95 })
96 # normalize (downcase) keys
97 language_codes = dict([(k.lower(), v) for (k, v) in language_codes.items()])
98
99 # Languages without Polyglossia support:
100 for key in ('af', # 'afrikaans',
101 'de-AT', # 'naustrian',
102 'de-AT-1901', # 'austrian',
103 # TODO: use variant=... for English variants
104 'en-CA', # 'canadian',
105 'en-GB', # 'british',
106 'en-NZ', # 'newzealand',
107 'en-US', # 'american',
108 'fr-CA', # 'canadien',
109 'grc-ibycus', # 'ibycus', (Greek Ibycus encoding)
110 'sr-Latn', # 'serbian script=latin'
111 ):
112 del(language_codes[key.lower()])
113
114 def __init__(self, language_code, reporter):
115 self.language_code = language_code
116 self.reporter = reporter
117 self.language = self.language_name(language_code)
118 self.otherlanguages = {}
119 self.warn_msg = 'Language "%s" not supported by Polyglossia.'
120 self.quote_index = 0
121 self.quotes = ('"', '"')
122 # language dependent configuration:
123 # double quotes are "active" in some languages (e.g. German).
124 self.literal_double_quote = u'"' # TODO: use \textquotedbl ?
125
126 def __call__(self):
127 setup = [r'\usepackage{polyglossia}',
128 r'\setdefaultlanguage{%s}' % self.language]
129 if self.otherlanguages:
130 setup.append(r'\setotherlanguages{%s}' %
131 ','.join(sorted(self.otherlanguages.keys())))
132 return '\n'.join(setup)
133
134
135 class XeLaTeXTranslator(latex2e.LaTeXTranslator):
136 """
137 Generate code for LaTeX using Unicode fonts (XeLaTex or LuaLaTeX).
138
139 See the docstring of docutils.writers._html_base.HTMLTranslator for
140 notes on and examples of safe subclassing.
141 """
142
143 def __init__(self, document):
144 self.is_xetex = True # typeset with XeTeX or LuaTeX engine
145 latex2e.LaTeXTranslator.__init__(self, document, Babel)
146 if self.latex_encoding == 'utf8':
147 self.requirements.pop('_inputenc', None)
148 else:
149 self.requirements['_inputenc'] = (r'\XeTeXinputencoding %s '
150 % self.latex_encoding)