diff options
Diffstat (limited to '.venv/lib/python3.12/site-packages/docutils/languages/__init__.py')
-rw-r--r-- | .venv/lib/python3.12/site-packages/docutils/languages/__init__.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/docutils/languages/__init__.py b/.venv/lib/python3.12/site-packages/docutils/languages/__init__.py new file mode 100644 index 00000000..1bf43129 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/docutils/languages/__init__.py @@ -0,0 +1,83 @@ +# $Id: __init__.py 9030 2022-03-05 23:28:32Z milde $ +# Author: David Goodger <goodger@python.org> +# Copyright: This module has been placed in the public domain. + +# Internationalization details are documented in +# <https://docutils.sourceforge.io/docs/howto/i18n.html>. + +""" +This package contains modules for language-dependent features of Docutils. +""" + +__docformat__ = 'reStructuredText' + +from importlib import import_module + +from docutils.utils import normalize_language_tag + + +class LanguageImporter: + """Import language modules. + + When called with a BCP 47 language tag, instances return a module + with localisations from `docutils.languages` or the PYTHONPATH. + + If there is no matching module, warn (if a `reporter` is passed) + and fall back to English. + """ + packages = ('docutils.languages.', '') + warn_msg = ('Language "%s" not supported: ' + 'Docutils-generated text will be in English.') + fallback = 'en' + # TODO: use a dummy module returning empty strings?, configurable? + + def __init__(self): + self.cache = {} + + def import_from_packages(self, name, reporter=None): + """Try loading module `name` from `self.packages`.""" + module = None + for package in self.packages: + try: + module = import_module(package+name) + self.check_content(module) + except (ImportError, AttributeError): + if reporter and module: + reporter.info(f'{module} is no complete ' + 'Docutils language module.') + elif reporter: + reporter.info(f'Module "{package+name}" not found.') + continue + break + return module + + def check_content(self, module): + """Check if we got a Docutils language module.""" + 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: + 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, reporter) + if module is not None: + break + else: + if reporter: + reporter.warning(self.warn_msg % language_code) + if self.fallback: + module = self.import_from_packages(self.fallback) + if reporter and (language_code != 'en'): + reporter.info('Using %s for language "%s".' + % (module, language_code)) + self.cache[language_code] = module + return module + + +get_language = LanguageImporter() |