1 # -*- coding: utf-8 -*-
3 # Useful doc: https://www.sphinx-doc.org/en/master/extdev/markupapi.html
4 # Example: https://www.sphinx-doc.org/en/master/development/tutorials/recipe.html
7 from docutils.parsers.rst import Directive, directives
8 from docutils import nodes
9 from docutils.statemachine import StringList
10 from sphinx.util.osutil import copyfile
11 from sphinx.util import logging
13 class ShowFileDirective(Directive):
15 Show a file or propose it to download.
19 optional_arguments = 1
21 'language': directives.unchanged
26 filename = self.arguments[0]
28 if 'language' in self.options:
29 language = self.options['language']
31 logger = logging.getLogger(__name__)
32 # logger.info('showfile {} in {}'.format(filename, language))
36 ' :header: View {}'.format(filename),
38 ' `Download {} <https://framagit.org/simgrid/simgrid/tree/{}>`_'.format(os.path.basename(filename), filename),
40 ' .. literalinclude:: ../../{}'.format(filename),
41 ' :language: {}'.format(language),
45 for idx, line in enumerate(new_content):
46 # logger.info('{} {}'.format(idx,line))
47 self.content.data.insert(idx, line)
48 self.content.items.insert(idx, (None, idx))
50 node = nodes.container()
51 self.state.nested_parse(self.content, self.content_offset, node)
54 class ExampleTabDirective(Directive):
56 A group-tab for a given language, in the presentation of the examples.
59 optional_arguments = 0
60 mandatory_argument = 0
63 self.assert_has_content()
65 filename = self.content[0].strip()
66 self.content.trim_start(1)
68 (language, langcode) = (None, None)
69 if filename[-3:] == '.py':
72 elif filename[-4:] == '.cpp':
75 elif filename[-4:] == '.xml':
79 raise Exception("Unknown language '{}'. Please choose '.cpp', '.py' or '.xml'".format(language))
81 for idx, line in enumerate(self.content.data):
82 self.content.data[idx] = ' ' + line
84 for idx, line in enumerate([
85 '.. group-tab:: {}'.format(language),
87 self.content.data.insert(idx, line)
88 self.content.items.insert(idx, (None, idx))
92 ' .. showfile:: {}'.format(filename),
93 ' :language: {}'.format(langcode),
95 idx = len(self.content.data)
96 self.content.data.insert(idx, line)
97 self.content.items.insert(idx, (None, idx))
99 # logger = logging.getLogger(__name__)
100 # logger.info('------------------')
101 # for line in self.content.data:
102 # logger.info('{}'.format(line))
104 node = nodes.container()
105 self.state.nested_parse(self.content, self.content_offset, node)
109 app.add_directive('showfile', ShowFileDirective)
110 app.add_directive('example-tab', ExampleTabDirective)