1 # -*- coding: utf-8 -*-
4 from docutils.parsers.rst import Directive, directives
5 from docutils import nodes
6 from docutils.statemachine import StringList
7 from sphinx.util.osutil import copyfile
8 from sphinx.util import logging
10 class ShowFileDirective(Directive):
12 Show a file or propose it to download.
16 optional_arguments = 1
18 'language': directives.unchanged
23 filename = self.arguments[0]
25 if 'language' in self.options:
26 language = self.options['language']
28 logger = logging.getLogger(__name__)
29 # logger.info('showfile {} in {}'.format(filename, language))
33 ' :header: View {}'.format(filename),
35 ' `Download {} <https://framagit.org/simgrid/simgrid/tree/{}>`_'.format(os.path.basename(filename), filename),
37 ' .. literalinclude:: ../../{}'.format(filename),
38 ' :language: {}'.format(language),
42 for idx, line in enumerate(new_content):
43 # logger.info('{} {}'.format(idx,line))
44 self.content.data.insert(idx, line)
45 self.content.items.insert(idx, (None, idx))
47 node = nodes.container()
48 self.state.nested_parse(self.content, self.content_offset, node)
51 class ExampleTabDirective(Directive):
53 A group-tab for a given language, in the presentation of the examples.
56 optional_arguments = 0
57 mandatory_argument = 0
60 self.assert_has_content()
62 filename = self.content[0].strip()
63 self.content.trim_start(1)
65 (language, langcode) = (None, None)
66 if filename[-3:] == '.py':
69 elif filename[-4:] == '.cpp':
72 elif filename[-4:] == '.xml':
76 raise Exception("Unknown language '{}'. Please choose '.cpp', '.py' or '.xml'".format(language))
78 for idx, line in enumerate(self.content.data):
79 self.content.data[idx] = ' ' + line
81 for idx, line in enumerate([
82 '.. group-tab:: {}'.format(language),
84 self.content.data.insert(idx, line)
85 self.content.items.insert(idx, (None, idx))
89 ' .. showfile:: {}'.format(filename),
90 ' :language: {}'.format(langcode),
92 idx = len(self.content.data)
93 self.content.data.insert(idx, line)
94 self.content.items.insert(idx, (None, idx))
96 # logger = logging.getLogger(__name__)
97 # logger.info('------------------')
98 # for line in self.content.data:
99 # logger.info('{}'.format(line))
101 node = nodes.container()
102 self.state.nested_parse(self.content, self.content_offset, node)
106 app.add_directive('showfile', ShowFileDirective)
107 app.add_directive('example-tab', ExampleTabDirective)