Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 100 lines 2.9 kB view raw
1# SPDX-License-Identifier: GPL-2.0 2# 3# Copyright © 2023, Oracle and/or its affiliates. 4# Author: Vegard Nossum <vegard.nossum@oracle.com> 5# 6# Add translation links to the top of the document. 7# 8 9import os 10 11from docutils import nodes 12from docutils.transforms import Transform 13 14import sphinx 15from sphinx import addnodes 16from sphinx.errors import NoUri 17 18all_languages = { 19 # English is always first 20 None: 'English', 21 22 # Keep the rest sorted alphabetically 23 'zh_CN': 'Chinese (Simplified)', 24 'zh_TW': 'Chinese (Traditional)', 25 'it_IT': 'Italian', 26 'ja_JP': 'Japanese', 27 'ko_KR': 'Korean', 28 'pt_BR': 'Portuguese (Brazilian)', 29 'sp_SP': 'Spanish', 30} 31 32class LanguagesNode(nodes.Element): 33 pass 34 35class TranslationsTransform(Transform): 36 default_priority = 900 37 38 def apply(self): 39 app = self.document.settings.env.app 40 docname = self.document.settings.env.docname 41 42 this_lang_code = None 43 components = docname.split(os.sep) 44 if components[0] == 'translations' and len(components) > 2: 45 this_lang_code = components[1] 46 47 # normalize docname to be the untranslated one 48 docname = os.path.join(*components[2:]) 49 50 new_nodes = LanguagesNode() 51 new_nodes['current_language'] = all_languages[this_lang_code] 52 53 for lang_code, lang_name in all_languages.items(): 54 if lang_code == this_lang_code: 55 continue 56 57 if lang_code is None: 58 target_name = docname 59 else: 60 target_name = os.path.join('translations', lang_code, docname) 61 62 pxref = addnodes.pending_xref('', refdomain='std', 63 reftype='doc', reftarget='/' + target_name, modname=None, 64 classname=None, refexplicit=True) 65 pxref += nodes.Text(lang_name) 66 new_nodes += pxref 67 68 self.document.insert(0, new_nodes) 69 70def process_languages(app, doctree, docname): 71 for node in doctree.traverse(LanguagesNode): 72 if app.builder.format not in ['html']: 73 node.parent.remove(node) 74 continue 75 76 languages = [] 77 78 # Iterate over the child nodes; any resolved links will have 79 # the type 'nodes.reference', while unresolved links will be 80 # type 'nodes.Text'. 81 languages = list(filter(lambda xref: 82 isinstance(xref, nodes.reference), node.children)) 83 84 html_content = app.builder.templates.render('translations.html', 85 context={ 86 'current_language': node['current_language'], 87 'languages': languages, 88 }) 89 90 node.replace_self(nodes.raw('', html_content, format='html')) 91 92def setup(app): 93 app.add_node(LanguagesNode) 94 app.add_transform(TranslationsTransform) 95 app.connect('doctree-resolved', process_languages) 96 97 return { 98 'parallel_read_safe': True, 99 'parallel_write_safe': True, 100 }