Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.9/dist-packages/docutils/languages/__init__.py: 72%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

46 statements  

1# $Id$ 

2# Author: David Goodger <goodger@python.org> 

3# Copyright: This module has been placed in the public domain. 

4 

5# Internationalization details are documented in 

6# <https://docutils.sourceforge.io/docs/howto/i18n.html>. 

7 

8""" 

9This package contains modules for language-dependent features of Docutils. 

10""" 

11 

12__docformat__ = 'reStructuredText' 

13 

14from importlib import import_module 

15 

16from docutils.utils import normalize_language_tag 

17 

18 

19class LanguageImporter: 

20 """Import language modules. 

21 

22 When called with a BCP 47 language tag, instances return a module 

23 with localisations from `docutils.languages` or the PYTHONPATH. 

24 

25 If there is no matching module, warn (if a `reporter` is passed) 

26 and fall back to English. 

27 """ 

28 packages = ('docutils.languages.', '') 

29 warn_msg = ('Language "%s" not supported: ' 

30 'Docutils-generated text will be in English.') 

31 fallback = 'en' 

32 # TODO: use a dummy module returning empty strings?, configurable? 

33 

34 def __init__(self): 

35 self.cache = {} 

36 

37 def import_from_packages(self, name, reporter=None): 

38 """Try loading module `name` from `self.packages`.""" 

39 module = None 

40 for package in self.packages: 

41 try: 

42 module = import_module(package+name) 

43 self.check_content(module) 

44 except (ImportError, AttributeError): 

45 if reporter and module: 

46 reporter.info(f'{module} is no complete ' 

47 'Docutils language module.') 

48 elif reporter: 

49 reporter.info(f'Module "{package+name}" not found.') 

50 continue 

51 break 

52 return module 

53 

54 def check_content(self, module): 

55 """Check if we got a Docutils language module.""" 

56 if not (isinstance(module.labels, dict) 

57 and isinstance(module.bibliographic_fields, dict) 

58 and isinstance(module.author_separators, list)): 

59 raise ImportError 

60 

61 def __call__(self, language_code, reporter=None): 

62 try: 

63 return self.cache[language_code] 

64 except KeyError: 

65 pass 

66 for tag in normalize_language_tag(language_code): 

67 tag = tag.replace('-', '_') # '-' not valid in module names 

68 module = self.import_from_packages(tag, reporter) 

69 if module is not None: 

70 break 

71 else: 

72 if reporter: 

73 reporter.warning(self.warn_msg % language_code) 

74 if self.fallback: 

75 module = self.import_from_packages(self.fallback) 

76 if reporter and (language_code != 'en'): 

77 reporter.info('Using %s for language "%s".' 

78 % (module, language_code)) 

79 self.cache[language_code] = module 

80 return module 

81 

82 

83get_language = LanguageImporter()