Skip to content

Commit 88f03a6

Browse files
committed
Merge branch 'chapterjason-master' (Fix #23, fix #22, fix #19)
2 parents 38009f6 + da0801e commit 88f03a6

File tree

6 files changed

+194
-22
lines changed

6 files changed

+194
-22
lines changed

sphinx_tabs/tabs.py

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import json
55
import posixpath
66
import os
7-
from docutils.parsers.rst import Directive
7+
from docutils.parsers.rst import Directive, directives
88
from docutils import nodes
99
from pygments.lexers import get_all_lexers
1010
from sphinx.util.osutil import copyfile
@@ -30,6 +30,15 @@
3030
LEXER_MAP[short_name] = lexer[0]
3131

3232

33+
def get_compatible_builders(app):
34+
builders = ['html', 'singlehtml', 'dirhtml',
35+
'readthedocs', 'readthedocsdirhtml',
36+
'readthedocssinglehtml', 'readthedocssinglehtmllocalmedia',
37+
'spelling']
38+
builders.extend(app.config['sphinx_tabs_valid_builders'])
39+
return builders
40+
41+
3342
class TabsDirective(Directive):
3443
""" Top-level tabs directive """
3544

@@ -43,27 +52,29 @@ def run(self):
4352
node = nodes.container()
4453
node['classes'] = ['sphinx-tabs']
4554

46-
tabs_node = nodes.container()
47-
tabs_node.tagname = 'div'
48-
49-
classes = 'ui top attached tabular menu sphinx-menu'
50-
tabs_node['classes'] = classes.split(' ')
51-
5255
env.temp_data['tab_ids'] = []
5356
env.temp_data['tab_titles'] = []
5457
env.temp_data['is_first_tab'] = True
58+
5559
self.state.nested_parse(self.content, self.content_offset, node)
5660

57-
tab_titles = env.temp_data['tab_titles']
58-
for idx, [data_tab, tab_name] in enumerate(tab_titles):
59-
tab = nodes.container()
60-
tab.tagname = 'a'
61-
tab['classes'] = ['item'] if idx > 0 else ['active', 'item']
62-
tab['classes'].append(data_tab)
63-
tab += tab_name
64-
tabs_node += tab
61+
if env.app.builder.name in get_compatible_builders(env.app):
62+
tabs_node = nodes.container()
63+
tabs_node.tagname = 'div'
64+
65+
classes = 'ui top attached tabular menu sphinx-menu'
66+
tabs_node['classes'] = classes.split(' ')
67+
68+
tab_titles = env.temp_data['tab_titles']
69+
for idx, [data_tab, tab_name] in enumerate(tab_titles):
70+
tab = nodes.container()
71+
tab.tagname = 'a'
72+
tab['classes'] = ['item'] if idx > 0 else ['active', 'item']
73+
tab['classes'].append(data_tab)
74+
tab += tab_name
75+
tabs_node += tab
6576

66-
node.children.insert(0, tabs_node)
77+
node.children.insert(0, tabs_node)
6778

6879
return [node]
6980

@@ -115,6 +126,18 @@ def run(self):
115126
env.temp_data['is_first_tab'] = False
116127

117128
self.state.nested_parse(self.content[2:], self.content_offset, node)
129+
130+
if env.app.builder.name not in get_compatible_builders(env.app):
131+
outer_node = nodes.container()
132+
tab = nodes.container()
133+
tab.tagname = 'a'
134+
tab['classes'] = ['item']
135+
tab += tab_name
136+
137+
outer_node.append(tab)
138+
outer_node.append(node)
139+
return [outer_node]
140+
118141
return [node]
119142

120143

@@ -157,6 +180,9 @@ class CodeTabDirective(Directive):
157180
""" Tab directive with a codeblock as its content"""
158181

159182
has_content = True
183+
option_spec = {
184+
'linenos': directives.flag
185+
}
160186

161187
def run(self):
162188
""" Parse a tab directive """
@@ -182,9 +208,13 @@ def run(self):
182208
' {}'.format(tab_name),
183209
'',
184210
' .. code-block:: {}'.format(lang),
185-
'',
186211
]
187212

213+
if 'linenos' in self.options:
214+
new_content.append(' :linenos:')
215+
216+
new_content.append('')
217+
188218
for idx, line in enumerate(new_content):
189219
self.content.data.insert(idx, line)
190220
self.content.items.insert(idx, (None, idx))
@@ -240,11 +270,7 @@ def copy_assets(app, exception):
240270
log = logging.getLogger(__name__).info # pylint: disable=no-member
241271
else:
242272
log = app.info
243-
builders = ['html', 'singlehtml', 'dirhtml',
244-
'readthedocs', 'readthedocsdirhtml',
245-
'readthedocssinglehtml', 'readthedocssinglehtmllocalmedia',
246-
'spelling']
247-
builders.extend(app.config['sphinx_tabs_valid_builders'])
273+
builders = get_compatible_builders(app)
248274
if exception:
249275
return
250276
if app.builder.name not in builders:

sphinx_tabs/test/linenos/conf.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
project = 'sphinx-tabs test'
2+
master_doc = 'index'
3+
source_suffix = '.rst'
4+
extensions = ['sphinx_tabs.tabs']
5+
pygments_style = 'sphinx'

sphinx_tabs/test/linenos/index.html.1

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<div class="sphinx-tabs docutils container">
2+
<div class="ui top attached tabular menu sphinx-menu docutils container">
3+
<div class="active item sphinx-data-tab-Qysr docutils container">
4+
<div class="docutils container">
5+
C++</div>
6+
</div>
7+
<div class="item sphinx-data-tab-UHl0aG9u docutils container">
8+
<div class="docutils container">
9+
Python</div>
10+
</div>
11+
</div>
12+
<div class="ui bottom attached sphinx-tab tab segment code-tab sphinx-data-tab-Qysr active docutils container">
13+
<div class="highlight-c++">
14+
<table class="highlighttable">
15+
<tr>
16+
<td class="linenos">
17+
<div class="linenodiv">
18+
<pre>1</pre>
19+
</div>
20+
</td>
21+
<td class="code">
22+
<div class="highlight">
23+
<pre>
24+
<span/>
25+
<span class="n">std</span>
26+
<span class="o">::</span>
27+
<span class="n">cout</span>
28+
<span class="o">&lt;&lt;</span>
29+
<span class="s">"hello world"</span>
30+
<span class="o">&lt;&lt;</span>
31+
<span class="n">std</span>
32+
<span class="o">::</span>
33+
<span class="n">endl</span>
34+
<span class="p">;</span>
35+
</pre>
36+
</div>
37+
</td>
38+
</tr>
39+
</table>
40+
</div>
41+
</div>
42+
<div class="ui bottom attached sphinx-tab tab segment code-tab sphinx-data-tab-UHl0aG9u docutils container">
43+
<div class="highlight-python">
44+
<div class="highlight">
45+
<pre>
46+
<span/>
47+
<span class="k">print</span>
48+
<span class="p">(</span>
49+
<span class="s1">'hello world'</span>
50+
<span class="p">)</span>
51+
</pre>
52+
</div>
53+
</div>
54+
</div>
55+
</div>

sphinx_tabs/test/linenos/index.html.2

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<div class="sphinx-tabs docutils container">
2+
<div class="ui top attached tabular menu sphinx-menu docutils container">
3+
<div class="active item sphinx-data-tab-Qysr docutils container">
4+
<div class="docutils container">
5+
C++</div>
6+
</div>
7+
<div class="item sphinx-data-tab-UHl0aG9u docutils container">
8+
<div class="docutils container">
9+
Python</div>
10+
</div>
11+
</div>
12+
<div class="ui bottom attached sphinx-tab tab segment code-tab sphinx-data-tab-Qysr active docutils container">
13+
<div class="highlight-c++ notranslate">
14+
<table class="highlighttable">
15+
<tr>
16+
<td class="linenos">
17+
<div class="linenodiv">
18+
<pre>1</pre>
19+
</div>
20+
</td>
21+
<td class="code">
22+
<div class="highlight">
23+
<pre>
24+
<span/>
25+
<span class="n">std</span>
26+
<span class="o">::</span>
27+
<span class="n">cout</span>
28+
<span class="o">&lt;&lt;</span>
29+
<span class="s">"hello world"</span>
30+
<span class="o">&lt;&lt;</span>
31+
<span class="n">std</span>
32+
<span class="o">::</span>
33+
<span class="n">endl</span>
34+
<span class="p">;</span>
35+
</pre>
36+
</div>
37+
</td>
38+
</tr>
39+
</table>
40+
</div>
41+
</div>
42+
<div class="ui bottom attached sphinx-tab tab segment code-tab sphinx-data-tab-UHl0aG9u docutils container">
43+
<div class="highlight-python notranslate">
44+
<div class="highlight">
45+
<pre>
46+
<span/>
47+
<span class="k">print</span>
48+
<span class="p">(</span>
49+
<span class="s1">'hello world'</span>
50+
<span class="p">)</span>
51+
</pre>
52+
</div>
53+
</div>
54+
</div>
55+
</div>

sphinx_tabs/test/linenos/index.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.. tabs::
2+
3+
.. code-tab:: c++
4+
:linenos:
5+
6+
std::cout << "hello world" << std::endl;
7+
8+
.. code-tab:: python
9+
10+
print('hello world')

sphinx_tabs/test/test_linenos.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import unittest
2+
import pkg_resources
3+
from sphinx_testing import with_app
4+
from .testcase import TestCase
5+
6+
7+
class LinenosTest(TestCase):
8+
@with_app(
9+
buildername='html',
10+
srcdir=pkg_resources.resource_filename(__name__, 'linenos'))
11+
def test_build_html(
12+
self, app, status, warning): # pylint: disable=unused-argument
13+
app.builder.build_all()
14+
actual = self.get_result(app, 'index')
15+
expected = self.get_expectation('linenos', 'index')
16+
self.assertHasTabsAssets(actual)
17+
self.assertXMLEqual(expected, actual)
18+
19+
20+
if __name__ == '__main__':
21+
unittest.main()

0 commit comments

Comments
 (0)