|
From: <mi...@us...> - 2017-05-08 22:10:41
|
Revision: 8068
http://sourceforge.net/p/docutils/code/8068
Author: milde
Date: 2017-05-08 22:10:39 +0000 (Mon, 08 May 2017)
Log Message:
-----------
Add "smartquotes-locales" setting.
Modified Paths:
--------------
trunk/docutils/docs/user/config.txt
trunk/docutils/docs/user/smartquotes.txt
trunk/docutils/docutils/frontend.py
trunk/docutils/docutils/parsers/rst/__init__.py
trunk/docutils/docutils/transforms/universal.py
trunk/docutils/docutils/utils/smartquotes.py
trunk/docutils/test/test_settings.py
trunk/docutils/test/test_transforms/test_smartquotes.py
Modified: trunk/docutils/docs/user/config.txt
===================================================================
--- trunk/docutils/docs/user/config.txt 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/docs/user/config.txt 2017-05-08 22:10:39 UTC (rev 8068)
@@ -681,10 +681,12 @@
Activate the SmartQuotes_ transform to
change straight quotation marks to typographic form. `Quote characters`_
are selected according to the language of the current block element (see
-language_code_). Also changes consequtive runs of hyphen-minus and full
-stops (``---``, ``--``, ``...``) to em-dash, en-dash and ellipsis Unicode
-characters respectively.
+language_code_, smartquotes_locales_, and the `pre-defined quote sets`__).
+Also changes consecutive runs of hyphen-minus and full stops (``---``,
+``--``, ``...``) to em-dash, en-dash and ellipsis Unicode characters
+respectively.
+
Supported values:
booleans_ (yes/no)
@@ -698,9 +700,33 @@
New in Docutils 0.10.
.. _SmartQuotes: smartquotes.html
+__ smartquotes.html#localisation
.. _quote characters:
http://en.wikipedia.org/wiki/Non-English_usage_of_quotation_marks
+
+smartquotes_locales
+~~~~~~~~~~~~~~~~~~~
+
+Typographical quotes used by the SmartQuotes_ transform.
+
+A comma-separated list_ with language tag and a set of four quotes (primary
+open/close, secondary open/close)smartquotes_locales. (If more than one
+character shall be used for a quote (e.g. padding in French quotes), a
+colon-separated list may be used.)
+
+Example:
+ Ensure a correct leading apostrophe in ``'s Gravenhage`` in Dutch (at the
+ cost of incorrect opening single quotes) and set French quotes to double
+ and single guillemets with inner padding::
+
+ smartquote-locales: nl: „”’’,
+ fr: « : »:‹ : ›
+
+Default: None. Option: ``--smartquotes-locales``.
+
+New in Docutils 0.14.
+
syntax_highlight
~~~~~~~~~~~~~~~~
Modified: trunk/docutils/docs/user/smartquotes.txt
===================================================================
--- trunk/docutils/docs/user/smartquotes.txt 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/docs/user/smartquotes.txt 2017-05-08 22:10:39 UTC (rev 8068)
@@ -17,7 +17,7 @@
Description
===========
-The `smart_quotes configuration setting`_ triggers the SmartQuotes
+The `"smart_quotes" configuration setting`_ triggers the SmartQuotes
transformation on Text nodes that includes the following steps:
- Straight quotes (``"`` and ``'``) into "curly" quote characters
@@ -30,7 +30,7 @@
Advantages:
-* typing speed (especiall when blind-typing),
+* typing speed (especially when blind-typing),
* the possibility to change the quoting style of the
complete document with just one configuration option, and
* restriction to 7-bit characters in the source.
@@ -43,7 +43,8 @@
So, please consider also
`Why You Might Not Want to Use "Smart" Quotes in Your Documents`_.
-.. _smart_quotes configuration setting: config.html#smart-quotes
+.. _"smart_quotes" configuration setting:
+.. _"smart_quotes" setting: config.html#smart-quotes
Escaping
@@ -77,288 +78,303 @@
Quotation marks have a `variety of forms`__ in different languages and
media.
-`Smartquotes` selects quotation marks depending on the language of the current
-block element and the value of the `smart_quotes configuration setting`_.
-
__ https://en.wikipedia.org/wiki/Quotation_mark#Summary_table
-Docutils' `smartquotes` support the following languages:
+`SmartQuotes` inserts quotation marks depending on the language of the
+current block element and the value of the `"smart_quotes" setting`_.\
+[#x-altquot]_
+There is built-in support for the following languages:\ [#smartquotes-locales]_
+:af: .. class:: language-af
-.. class:: language-af
+ "'Afrikaans' quotes"
-"'Afrikaans' quotes"
+:af-x-altquot: .. class:: language-af-x-altquot
-.. class:: language-af-x-altquot
+ "'Afrikaans' alternative quotes"
-"'Afrikaans' alternative quotes"
+:ca: .. class:: language-ca
-.. class:: language-ca
+ "'Catalan' quotes"
-"'Catalan' quotes"
+:ca-x-altquot: .. class:: language-ca-x-altquot
-.. class:: language-ca-x-altquot
+ "'Catalan' alternative quotes"
-"'Catalan' alternative quotes"
+:cs: .. class:: language-cs
-.. class:: language-cs
+ "'Czech' quotes"
-"'Czech' quotes"
+:cs-x-altquot: .. class:: language-cs-x-altquot
-.. class:: language-cs-x-altquot
+ "'Czech' alternative quotes"
-"'Czech' alternative quotes"
+:da: .. class:: language-da
-.. class:: language-da
+ "'Danish' quotes"
-"'Danish' quotes"
+:da-x-altquot: .. class:: language-da-x-altquot
-.. class:: language-da-x-altquot
+ "'Danish' alternative quotes"
-"'Danish' alternative quotes"
+:de: .. class:: language-de
-.. class:: language-de
+ "'German' quotes"
-"'German' quotes"
+:de-x-altquot: .. class:: language-de-x-altquot
-.. class:: language-de-x-altquot
+ "'German' alternative quotes"
-"'German' alternative quotes"
+:de-ch: .. class:: language-de-ch
-.. class:: language-de-ch
+ "'Swiss-German' quotes"
-"'Swiss-German' quotes"
+:el: .. class:: language-el
-.. class:: language-el
+ "'Greek' quotes"
-"'Greek' quotes"
+:en: .. class:: language-en
-.. class:: language-en
+ "'English' quotes"
-"'English' quotes"
+:en-uk-x-altquot: .. class:: language-en-uk-x-altquot
-.. class:: language-en-uk-x-altquot
+ "'British' alternative quotes"
+ (swaps single and double quotes: ``"`` → ‘ and ``'`` → “)
-"'British' alternative quotes"
-(swaps single and double quotes: ``"`` → ‘ and ``'`` → “)
+:eo: .. class:: language-eo
-.. class:: language-eo
+ "'Esperanto' quotes"
-"'Esperanto' quotes"
+:es: .. class:: language-es
-.. class:: language-es
+ "'Spanish' quotes"
-"'Spanish' quotes"
+:es-x-altquot: .. class:: language-es-x-altquot
-.. class:: language-es-x-altquot
+ "'Spanish' alternative quotes"
-"'Spanish' alternative quotes"
+:et: .. class:: language-et
-.. class:: language-et
+ "'Estonian' quotes" (no secondary quote listed in Wikipedia)
-"'Estonian' quotes" (no secondary quote listed in Wikipedia)
+:et-x-altquot: .. class:: language-et-x-altquot
-.. class:: language-et-x-altquot
+ "'Estonian' alternative quotes"
-"'Estonian' alternative quotes"
+:eu: .. class:: language-eu
-.. class:: language-eu
+ "'Basque' quotes"
-"'Basque' quotes"
+:fi: .. class:: language-fi
-.. class:: language-fi
+ "'Finnish' quotes"
-"'Finnish' quotes"
+:fi-x-altquot: .. class:: language-fi-x-altquot
-.. class:: language-fi-x-altquot
+ "'Finnish' alternative quotes"
-"'Finnish' alternative quotes"
+:fr: .. class:: language-fr
-.. class:: language-fr
+ "'French' quotes"
-"'French' quotes"
+:fr-x-altquot: .. class:: language-fr-x-altquot
-.. class:: language-fr-x-altquot
+ "'French' alternative quotes"
-"'French' alternative quotes"
+:fr-ch: .. class:: language-fr-ch
-.. class:: language-fr-ch
+ "'Swiss-French' quotes"
-"'Swiss-French' quotes"
+:fr-ch-x-altquot: .. class:: language-fr-ch-x-altquot
-.. class:: language-fr-ch-x-altquot
+ "'Swiss-French' alternative quotes" (narrow no-break space, see
+ http://typoguide.ch/)
-"'Swiss-French' alternative quotes" (narrow no-break space, see
-http://typoguide.ch/)
+:gl: .. class:: language-gl
-.. class:: language-gl
+ "'Galician' quotes"
-"'Galician' quotes"
+:he: .. class:: language-he
-.. class:: language-he
+ "'Hebrew' quotes"
-"'Hebrew' quotes"
+:he-x-altquot: .. class:: language-he-x-altquot
-.. class:: language-he-x-altquot
+ "'Hebrew' alternative quotes"
-"'Hebrew' alternative quotes"
+:hr: .. class:: language-hr
-.. class:: language-hr
+ "'Croatian' quotes"
-"'Croatian' quotes"
+:hr-x-altquot: .. class:: language-hr-x-altquot
-.. class:: language-hr-x-altquot
+ "'Croatian' alternative quotes"
-"'Croatian' alternative quotes"
+:hsb: .. class:: language-hsb
-.. class:: language-hsb
+ "'Upper Sorbian' quotes"
-"'Upper Sorbian' quotes"
+:hsb-x-altquot: .. class:: language-hsb-x-altquot
-.. class:: language-hsb-x-altquot
+ "'Upper Sorbian' alternative quotes"
-"'Upper Sorbian' alternative quotes"
+:hu: .. class:: language-hu
-.. class:: language-hu
+ "'Hungarian' quotes"
-"'Hungarian' quotes"
+:is: .. class:: language-is
-.. class:: language-is
+ "'Icelandic' quotes"
-"'Icelandic' quotes"
+:it: .. class:: language-it
-.. class:: language-it
+ "'Italian' quotes"
-"'Italian' quotes"
+:it-ch: .. class:: language-it-ch
-.. class:: language-it-ch
+ "'Swiss-Italian' quotes"
-"'Swiss-Italian' quotes"
+:it-x-altquot: .. class:: language-it-x-altquot
-.. class:: language-it-x-altquot
+ "'Italian' alternative quotes"
-"'Italian' alternative quotes"
+:ja: .. class:: language-ja
-.. class:: language-ja
+ "'Japanese' quotes"
-"'Japanese' quotes"
+:lt: .. class:: language-lt
-.. class:: language-lt
+ "'Lithuanian' quotes"
-"'Lithuanian' quotes"
+:lv: .. class:: language-lv
-.. class:: language-lv
+ "'Latvian' quotes"
-"'Latvian' quotes"
+:nl: .. class:: language-nl
-.. class:: language-nl
+ "'Dutch' quotes"
-"'Dutch' quotes"
+:nl-x-altquot: .. class:: language-nl-x-altquot
-.. class:: language-nl-x-altquot
+ "'Dutch' alternative quotes"
-"'Dutch' alternative quotes"
-
.. # 'nl-x-altquot2': u'””’’',
-.. class:: language-pl
+:pl: .. class:: language-pl
-"'Polish' quotes"
+ "'Polish' quotes"
-.. class:: language-pl-x-altquot
+:pl-x-altquot: .. class:: language-pl-x-altquot
-"'Polish' alternative quotes"
+ "'Polish' alternative quotes"
-.. class:: language-pt
+:pt: .. class:: language-pt
-"'Portuguese' quotes"
+ "'Portuguese' quotes"
-.. class:: language-pt-br
+:pt-br: .. class:: language-pt-br
-"'Portuguese (Brazil)' quotes"
+ "'Portuguese (Brazil)' quotes"
-.. class:: language-ro
+:ro: .. class:: language-ro
-"'Romanian' quotes"
+ "'Romanian' quotes"
-.. class:: language-ru
+:ru: .. class:: language-ru
-"'Russian' quotes"
+ "'Russian' quotes"
-.. class:: language-sh
+:sh: .. class:: language-sh
-"'Serbo-Croatian' quotes"
+ "'Serbo-Croatian' quotes"
-.. class:: language-sh-x-altquot
+:sh-x-altquot: .. class:: language-sh-x-altquot
-"'Serbo-Croatian' alternative quotes"
+ "'Serbo-Croatian' alternative quotes"
-.. class:: language-sk
+:sk: .. class:: language-sk
-"'Slovak' quotes"
+ "'Slovak' quotes"
-.. class:: language-sk-x-altquot
+:sk-x-altquot: .. class:: language-sk-x-altquot
-"'Slovak' alternative quotes"
+ "'Slovak' alternative quotes"
-.. class:: language-sl
+:sl: .. class:: language-sl
-"'Slovenian' quotes"
+ "'Slovenian' quotes"
-.. class:: language-sl-x-altquot
+:sl-x-altquot: .. class:: language-sl-x-altquot
-"'Slovenian' alternative quotes"
+ "'Slovenian' alternative quotes"
-.. class:: language-sr
+:sr: .. class:: language-sr
-"'Serbian' quotes"
+ "'Serbian' quotes"
-.. class:: language-sr-x-altquot
+:sr-x-altquot: .. class:: language-sr-x-altquot
-"'Serbian' alternative quotes"
+ "'Serbian' alternative quotes"
-.. class:: language-sv
+:sv: .. class:: language-sv
-"'Swedish' quotes"
+ "'Swedish' quotes"
-.. class:: language-sv-x-altquot
+:sv-x-altquot: .. class:: language-sv-x-altquot
-"'Swedish' alternative quotes"
+ "'Swedish' alternative quotes"
-.. class:: language-tr
+:tr: .. class:: language-tr
-"'Turkish' quotes"
+ "'Turkish' quotes"
-.. class:: language-tr-x-altquot
+:tr-x-altquot: .. class:: language-tr-x-altquot
-"'Turkish' alternative quotes"
+ "'Turkish' alternative quotes"
.. 'tr-x-altquot2': u'“„‘‚', # antiquated?
-.. class:: language-uk
+:uk: .. class:: language-uk
-"'Ukrainian' quotes"
+ "'Ukrainian' quotes"
-.. class:: language-uk-x-altquot
+:uk-x-altquot: .. class:: language-uk-x-altquot
-"'Ukrainian' alternative quotes"
+ "'Ukrainian' alternative quotes"
-.. class:: language-zh-cn
+:zh-cn: .. class:: language-zh-cn
-"'Chinese (China)' quotes"
+ "'Chinese (China)' quotes"
-.. class:: language-zh-tw
+:zh-tw: .. class:: language-zh-tw
-"'Chinese (Taiwan)' quotes"
+ "'Chinese (Taiwan)' quotes"
-Quotes in text blocks in a non-supported language use the document
-language:
+Quotes in text blocks in a non-configured language are kept as plain quotes:
-.. class:: langugage-undefined-example
+:undefined: .. class:: language-undefined-example
-"'Undefined' quotes"
+ "'Undefined' quotes"
+.. [#x-altquot] Tags with the non-standard extension ``-x-altquot`` define
+ the quote set used with the `"smart_quotes" setting`_ value ``"alt"``.
+.. [#smartquotes-locales] The definitions for language-dependend
+ typographical quotes can be extended or overwritten using the
+ `"smartquotes_locales" setting`_.
+
+ The following example ensures a correct leading apostrophe in ``'s
+ Gravenhage`` (at the cost of incorrect leading single quotes) in Dutch
+ and sets French quotes to double and single guillemets with inner
+ spacing::
+
+ smartquote-locales: nl: „”’’
+ fr: « : »:‹ : ›
+
+.. _"smartquotes_locales" setting: config.html#smartquotes-locales
+
+
Caveats
=======
@@ -452,7 +468,7 @@
`Jeremy Hedley`_ and `Charles Wiltgen`_ deserve mention for exemplary beta
testing of the original SmartyPants.
-Internationalization and adaption to Docutils by Günter Milde.
+Internationalisation and adaption to Docutils by Günter Milde.
.. _SmartyPants: http://daringfireball.net/projects/smartypants/
.. _Pyblosxom: http://pyblosxom.bluesock.org/
Modified: trunk/docutils/docutils/frontend.py
===================================================================
--- trunk/docutils/docutils/frontend.py 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/docutils/frontend.py 2017-05-08 22:10:39 UTC (rev 8068)
@@ -40,7 +40,8 @@
import docutils
import docutils.utils
import docutils.nodes
-from docutils.utils.error_reporting import locale_encoding, ErrorOutput, ErrorString
+from docutils.utils.error_reporting import (locale_encoding, SafeString,
+ ErrorOutput, ErrorString)
def store_multiple(option, opt, value, parser, *args, **kwargs):
@@ -205,10 +206,45 @@
for cls in value:
normalized = docutils.nodes.make_id(cls)
if cls != normalized:
- raise ValueError('invalid class value %r (perhaps %r?)'
+ raise ValueError('Invalid class value %r (perhaps %r?)'
% (cls, normalized))
return value
+def validate_smartquotes_locales(setting, value, option_parser,
+ config_parser=None, config_section=None):
+ """Check/normalize a comma separated list of smart quote definitions.
+
+ Return a list of (language-tag, quotes) string tuples."""
+
+ # value is a comma separated string list:
+ value = validate_comma_separated_list(setting, value, option_parser,
+ config_parser, config_section)
+ # validate list elements
+ lc_quotes = []
+ for item in value:
+ try:
+ lang, quotes = item.split(':', 1)
+ except AttributeError:
+ # this function is called for every option added to `value`
+ # -> ignore if already a tuple:
+ lc_quotes.append(item)
+ continue
+ except ValueError:
+ raise ValueError(u'Invalid value "%s".'
+ ' Format is "<language>:<quotes>".'
+ % item.encode('ascii', 'backslashreplace'))
+ # parse colon separated string list:
+ quotes = quotes.strip()
+ multichar_quotes = quotes.split(':')
+ if len(multichar_quotes) == 4:
+ quotes = multichar_quotes
+ elif len(quotes) != 4:
+ raise ValueError('Invalid value "%s". Please specify 4 quotes\n'
+ ' (primary open/close; secondary open/close).'
+ % item.encode('ascii', 'backslashreplace'))
+ lc_quotes.append((lang,quotes))
+ return lc_quotes
+
def make_paths_absolute(pathdict, keys, base_path=None):
"""
Interpret filesystem path settings relative to the `base_path` given.
@@ -568,7 +604,7 @@
try:
config_settings = self.get_standard_config_settings()
except ValueError, error:
- self.error(error)
+ self.error(SafeString(error))
self.set_defaults_from_dict(config_settings.__dict__)
def populate_from_components(self, components):
Modified: trunk/docutils/docutils/parsers/rst/__init__.py
===================================================================
--- trunk/docutils/docutils/parsers/rst/__init__.py 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/docutils/parsers/rst/__init__.py 2017-05-08 22:10:39 UTC (rev 8068)
@@ -141,7 +141,13 @@
('Change straight quotation marks to typographic form: '
'one of "yes", "no", "alt[ernative]" (default "no").',
['--smart-quotes'],
- {'default': False, 'validator': frontend.validate_ternary}),
+ {'default': False, 'metavar': '<yes/no/alt>',
+ 'validator': frontend.validate_ternary}),
+ ('Characters to use as "smart quotes" for <language>. ',
+ ['--smartquotes-locales'],
+ {'metavar': '<language:quotes[,language:quotes,...]>',
+ 'action': 'append',
+ 'validator': frontend.validate_smartquotes_locales}),
('Inline markup recognized at word boundaries only '
'(adjacent to punctuation or whitespace). '
'Force character-level inline markup recognition with '
Modified: trunk/docutils/docutils/transforms/universal.py
===================================================================
--- trunk/docutils/docutils/transforms/universal.py 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/docutils/transforms/universal.py 2017-05-08 22:10:39 UTC (rev 8068)
@@ -249,6 +249,9 @@
# print repr(alternative)
document_language = self.document.settings.language_code
+ lc_smartquotes = self.document.settings.smartquotes_locales
+ if lc_smartquotes:
+ smartquotes.smartchars.quotes.update(dict(lc_smartquotes))
# "Educate" quotes in normal text. Handle each block of text
# (TextElement node) as a unit to keep context around inline nodes:
Modified: trunk/docutils/docutils/utils/smartquotes.py
===================================================================
--- trunk/docutils/docutils/utils/smartquotes.py 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/docutils/utils/smartquotes.py 2017-05-08 22:10:39 UTC (rev 8068)
@@ -592,7 +592,7 @@
text = educateSingleBackticks(text, language)
if do_quotes:
- # Replace plain quotes to prevent converstion to
+ # Replace plain quotes in context to prevent converstion to
# 2-character sequence in French.
context = prev_token_last_char.replace('"',';').replace("'",';')
text = educateQuotes(context+text, language)[1:]
Modified: trunk/docutils/test/test_settings.py
===================================================================
--- trunk/docutils/test/test_settings.py 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/test/test_settings.py 2017-05-08 22:10:39 UTC (rev 8068)
@@ -1,4 +1,5 @@
#!/usr/bin/env python
+# -*- coding: utf-8 -*-
# $Id$
# Author: David Goodger <go...@py...>
@@ -176,6 +177,10 @@
pathdict = {'foo': 'hallo', 'ham': u'h\xE4m', 'spam': u'spam'}
keys = ['foo', 'ham']
+ def setUp(self):
+ self.option_parser = frontend.OptionParser(
+ components=(rst.Parser,), read_config_files=None)
+
def test_make_paths_absolute(self):
pathdict = self.pathdict.copy()
frontend.make_paths_absolute(pathdict, self.keys, base_path='base')
@@ -195,6 +200,33 @@
# not touched, because key not in keys:
self.assertEqual(pathdict['spam'], u'spam')
+ boolean_settings = (
+ (True, True ),
+ ('1', True ),
+ (u'on', True ),
+ ('yes', True ),
+ (u'true', True ),
+ (u'0', False ),
+ ('off', False ),
+ (u'no', False ),
+ ('false', False ),
+ )
+ def test_validate_boolean(self):
+ for t in self.boolean_settings:
+ self.assertEqual(
+ frontend.validate_boolean(None, t[0], self.option_parser),
+ t[1])
+
+ def test_validate_ternary(self):
+ tests = (
+ ('500V', '500V'),
+ (u'parrot', u'parrot'),
+ )
+ for t in self.boolean_settings + tests:
+ self.assertEqual(
+ frontend.validate_ternary(None, t[0], self.option_parser),
+ t[1])
+
def test_validate_colon_separated_string_list(self):
tests = (
(u'a', ['a',] ),
@@ -209,7 +241,6 @@
frontend.validate_colon_separated_string_list(None, t[0], None),
t[1])
-
def test_validate_comma_separated_list(self):
tests = (
(u'a', ['a',] ),
@@ -225,5 +256,33 @@
frontend.validate_comma_separated_list(None, t[0], None),
t[1])
+ def test_validate_url_trailing_slash(self):
+ tests = (
+ ('', './' ),
+ (None, './' ),
+ (u'http://example.org', u'http://example.org/' ),
+ ('http://example.org/', 'http://example.org/' ),
+ )
+ for t in tests:
+ self.assertEqual(
+ frontend.validate_url_trailing_slash(None, t[0], None),
+ t[1])
+
+ def test_validate_smartquotes_locales(self):
+ tests = (
+ ('en:ssvv', [('en', 'ssvv')]),
+ (u'sd:«»°°', [(u'sd', u'«»°°')]),
+ ([('sd', u'«»°°'), u'ds:°°«»'], [('sd', u'«»°°'),
+ ('ds', u'°°«»')]),
+ (u'frs:« : »:((:))', [(u'frs', [u'« ', u' »',
+ u'((', u'))'])]),
+ )
+ for t in tests:
+ self.assertEqual(
+ frontend.validate_smartquotes_locales(None, t[0], None),
+ t[1])
+
+
+
if __name__ == '__main__':
unittest.main()
Modified: trunk/docutils/test/test_transforms/test_smartquotes.py
===================================================================
--- trunk/docutils/test/test_transforms/test_smartquotes.py 2017-05-04 20:10:03 UTC (rev 8067)
+++ trunk/docutils/test/test_transforms/test_smartquotes.py 2017-05-08 22:10:39 UTC (rev 8068)
@@ -32,6 +32,9 @@
s.generateTests(totest_de)
settings['smart_quotes'] = 'alternative'
s.generateTests(totest_de_alt)
+ settings['smart_quotes'] = True
+ settings['smartquotes_locales'] = [('de', u'«»()'), ('nl', u'„”’’')]
+ s.generateTests(totest_locales)
return s
@@ -38,6 +41,7 @@
totest = {}
totest_de = {}
totest_de_alt = {}
+totest_locales = {}
totest['transitions'] = ((SmartQuotes,), [
["""\
@@ -299,6 +303,24 @@
"""],
])
+totest_locales['transitions'] = ((SmartQuotes,), [
+["""\
+German "smart quotes" and 'secondary smart quotes'.
+
+.. class:: language-nl
+
+Dutch "smart quotes" and 's Gravenhage (leading apostrophe).
+""",
+u"""\
+<document source="test data">
+ <paragraph>
+ German «smart quotes» and (secondary smart quotes).
+ <paragraph classes="language-nl">
+ Dutch „smart quotes” and ’s Gravenhage (leading apostrophe).
+"""],
+])
+
+
if __name__ == '__main__':
import unittest
unittest.main(defaultTest='suite')
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|