` fixates the "content-tabs"
20 | menu in the upper right position, see :ref:`example-all`.
21 |
22 | .. rst:directive:: .. tab-container:: name
23 |
24 | "tab-container" directive creates a content tab. Tab's caption is set by
25 | `title` option. To switch tabs synchronously the `name` attribute should match
26 | with "tab-container" from another blocks.
27 |
28 | Full example::
29 |
30 | .. content-tabs::
31 |
32 | .. tab-container:: tab1
33 | :title: Tab title one
34 |
35 | Content for tab one
36 |
37 | .. tab-container:: tab2
38 | :title: Tab title two
39 |
40 | Content for tab two
41 |
42 |
43 | will be rendered like this:
44 |
45 | .. content-tabs::
46 |
47 | .. tab-container:: tab1
48 | :title: Tab title one
49 |
50 | Content for tab one
51 |
52 | .. tab-container:: tab2
53 | :title: Tab title two
54 |
55 | Content for tab two
56 |
57 | Generated HTML code:
58 |
59 | .. code-block:: html
60 |
61 |
62 |
63 | - Tab title one
64 | - Tab title two
65 |
66 |
67 |
Content for tab one
68 |
69 |
70 |
Content for tab two
71 |
72 |
73 |
74 | More examples
75 | ~~~~~~~~~~~~~
76 |
77 | .. content-tabs::
78 |
79 | .. tab-container:: python
80 | :title: Python
81 |
82 | .. rubric:: Definition
83 |
84 | .. code-block:: python
85 |
86 | my_api.signin()
87 |
88 | .. rubric:: Example request
89 |
90 | .. code-block:: python
91 |
92 | import my_api
93 | my_api.signin('username', 'password')
94 |
95 |
96 | .. tab-container:: php
97 | :title: PHP
98 |
99 | .. rubric:: Definition
100 |
101 | .. code-block:: php
102 |
103 | MyApi::signin();
104 |
105 | .. rubric:: Example request
106 |
107 | .. code-block:: php
108 |
109 | include 'my-api.php';
110 | MyApi::signin('username', 'password');
111 |
--------------------------------------------------------------------------------
/docs/columns.rst:
--------------------------------------------------------------------------------
1 | .. _column-content:
2 |
3 | Column content
4 | --------------
5 |
6 | .. container:: left-col
7 |
8 | Use `container` or another directive with classes `left-col` / `right-col` to
9 | display the content in two columns.
10 |
11 | .. note:: Supported only **sphinx_rtd_theme**. The right column displays only the windows width more than 1300 px.
12 |
13 | Full example::
14 |
15 | .. container:: left-col
16 |
17 | Left column text
18 |
19 | .. container:: left-col
20 |
21 | Right column text
22 |
23 | More examples
24 | ~~~~~~~~~~~~~
25 |
26 | .. container:: left-col
27 |
28 | .. rubric:: Content in left column
29 |
30 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
31 | incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
32 | nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
33 | Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
34 | fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
35 | culpa qui officia deserunt mollit anim id est laborum
36 |
37 | .. container:: right-col
38 |
39 | .. rubric:: Content in right column
40 |
41 | Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
42 | accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
43 | ab illo inventore veritatis et quasi architecto beatae vitae dicta
44 | sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,
45 | aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos,
46 | qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui
47 | dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed
48 | quia non numquam eius modi tempora incidunt, ut labore et dolore magnam
49 | aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
50 | exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex
51 | ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in
52 | ea voluptate velit esse, quam nihil molestiae consequatur, vel illum,
53 | qui dolorem eum fugiat, quo voluptas nulla pariatur? At vero eos et
54 | accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium
55 | voluptatum deleniti atque corrupti, quos dolores et quas molestias
56 | excepturi sint, obcaecati cupiditate non provident, similique sunt in
57 | culpa, qui officia deserunt mollitia animi, id est laborum et dolorum
58 | fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam
59 | libero tempore, cum soluta nobis est eligendi optio, cumque nihil
60 | impedit, quo minus id, quod maxime placeat, facere possimus, omnis
61 | voluptas assumenda est, omnis dolor repellendus. Temporibus autem
62 | quibusdam et aut officiis debitis aut rerum necessitatibus saepe
63 | eveniet, ut et voluptates repudiandae sint et molestiae non recusandae.
64 | Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis
65 | voluptatibus maiores alias consequatur aut perferendis doloribus
66 | asperiores repellat.
67 |
68 |
--------------------------------------------------------------------------------
/sphinxcontrib/contentui.css:
--------------------------------------------------------------------------------
1 | /*
2 | * right column for sphinx_rtd_theme
3 | */
4 | .clear {
5 | clear: both;
6 | }
7 |
8 | @media screen and (min-width: 1300px) {
9 | .wy-nav-content {
10 | max-width: none;
11 | }
12 |
13 | .with-columns .wy-nav-content {
14 | background: linear-gradient(90deg, #fcfcfc 52%, #eeeeee 52%);
15 | }
16 |
17 | .with-columns .wy-nav-content .wy-breadcrumbs ,
18 | .with-columns .section > h1,
19 | .with-columns .section > h2,
20 | .with-columns .section > h3,
21 | .with-columns footer {
22 | width: 50%;
23 | }
24 |
25 | .with-columns .section {
26 | clear: both;
27 | }
28 |
29 | .left-col.container {
30 | float: left;
31 | width: 50%;
32 | margin-right: 4%;
33 | }
34 |
35 | .right-col.container {
36 | float: left;
37 | width: 45%;
38 | }
39 |
40 | /*
41 | * tab selector fixed in top
42 | */
43 | .with-columns .contenttab-selector.in-right-col {
44 | display: block;
45 | position: fixed;
46 | top: 0;
47 | right: 0;
48 | width: calc(48% - 144px);
49 | background: #444;
50 | padding: 5px 10px;
51 | }
52 |
53 | }
54 |
55 | /**
56 | *
57 | */
58 | .toggle-tab {
59 | margin-bottom: 40px;
60 | }
61 |
62 | .toggle-header {
63 | display: block;
64 | clear: both;
65 | cursor: pointer;
66 | }
67 | .toggle-header p {display: inline; }
68 | .toggle-header strong {color: #2980b9 }
69 |
70 | .toggle-header:after {
71 | content: " ▼";
72 | }
73 |
74 | .toggle-header.open:after {
75 | content: " ▲";
76 | }
77 |
78 | .toggle-content {
79 | display: none;
80 | margin-bottom: 20px;
81 | }
82 |
83 | /*
84 | * tab menu
85 | */
86 | ul.contenttab-selector {
87 | display:block;
88 | list-style-type: none;
89 | margin: 0 0 10px;
90 | padding: 0;
91 | line-height: normal;
92 | overflow: auto;
93 | }
94 | ul.contenttab-selector li {
95 | display: block;
96 | cursor: pointer;
97 | font-weight: bold;
98 | margin: 0 5px 0 0;
99 | padding: 5px 10px;
100 | float: left;
101 | background-color: #999;
102 | color: #fff;
103 | -moz-border-radius: 5px;
104 | -webkit-border-radius: 5px;
105 | border-radius: 5px;
106 | -khtml-border-radius: 5px;
107 | }
108 | .rst-content .section ul.contenttab-selector,
109 | .rst-content .toctree-wrapper ul.contenttab-selector,
110 | article ul.contenttab-selector{
111 | line-height: normal;
112 | margin: 0 0 10px;
113 | }
114 | .rst-content .section ul.contenttab-selector li,
115 | .rst-content .toctree-wrapper ul.contenttab-selector li,
116 | article ul.contenttab-selector li{
117 | margin-left: 0;
118 | }
119 | ul.contenttab-selector li:hover {
120 | background-color: #777;
121 | }
122 | ul.contenttab-selector li.selected {
123 | background-color: #2980b9;
124 | }
125 | ul.contenttab-selector li.selected:hover {
126 | background-color: #333;
127 | }
128 | .content-tabs {
129 | margin: 10px 0 20px 0;
130 | }
131 | .tab-content {
132 | clear: both;
133 | }
134 |
--------------------------------------------------------------------------------
/docs/toggle.rst:
--------------------------------------------------------------------------------
1 | .. _toggle-header:
2 |
3 | Toggle headers
4 | --------------
5 |
6 | .. rst:directive:: .. toggle-header:: class
7 |
8 | "toggle-header" directive creates a block with a visible heading for the
9 | hidden content. The heading can be clicked to view/hide the hidden content.
10 | Optional attribute `class` adds css class for hidden content.
11 | Required option `header` sets text of the heading of the hidden content.
12 |
13 | Full example::
14 |
15 | .. toggle-header::
16 | :header: Example 1 **Show/Hide Code**
17 |
18 | Content for header
19 |
20 |
21 | will be rendered like this:
22 |
23 | .. toggle-header::
24 | :header: Example 1 **Show/Hide Code**
25 |
26 | Content for header
27 |
28 | Generated HTML code:
29 |
30 | .. code-block:: html
31 |
32 |
35 |
36 | Content for header
37 |
38 |
39 | More examples
40 | ~~~~~~~~~~~~~
41 |
42 | .. toggle-header::
43 | :header: Example 1 **Show/Hide Code**
44 |
45 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
46 | incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
47 | nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
48 | Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
49 | fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
50 | culpa qui officia deserunt mollit anim id est laborum
51 |
52 |
53 | .. toggle-header:: rubric
54 | :header: Example 2
55 |
56 | Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
57 | accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
58 | ab illo inventore veritatis et quasi architecto beatae vitae dicta
59 | sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,
60 | aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos,
61 | qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui
62 | dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed
63 | quia non numquam eius modi tempora incidunt, ut labore et dolore magnam
64 | aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
65 | exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex
66 | ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in
67 | ea voluptate velit esse, quam nihil molestiae consequatur, vel illum,
68 | qui dolorem eum fugiat, quo voluptas nulla pariatur? At vero eos et
69 | accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium
70 | voluptatum deleniti atque corrupti, quos dolores et quas molestias
71 | excepturi sint, obcaecati cupiditate non provident, similique sunt in
72 | culpa, qui officia deserunt mollitia animi, id est laborum et dolorum
73 | fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam
74 | libero tempore, cum soluta nobis est eligendi optio, cumque nihil
75 | impedit, quo minus id, quod maxime placeat, facere possimus, omnis
76 | voluptas assumenda est, omnis dolor repellendus. Temporibus autem
77 | quibusdam et aut officiis debitis aut rerum necessitatibus saepe
78 | eveniet, ut et voluptates repudiandae sint et molestiae non recusandae.
79 | Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis
80 | voluptatibus maiores alias consequatur aut perferendis doloribus
81 | asperiores repellat.
82 |
--------------------------------------------------------------------------------
/sphinxcontrib/contentui.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | """
3 | Content ui specs
4 | =================
5 | """
6 | import os
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
12 |
13 |
14 | CSS_FILE = 'contentui.css'
15 | JS_FILE = 'contentui.js'
16 |
17 |
18 | class ContentTabsDirective(Directive):
19 | """
20 | It's container directive with content-tabs class
21 | """
22 |
23 | has_content = True
24 | optional_arguments = 1
25 |
26 | def run(self):
27 | self.assert_has_content()
28 | text = '\n'.join(self.content)
29 | node = nodes.container(text)
30 | node['classes'].append('content-tabs')
31 |
32 | if self.arguments and self.arguments[0]:
33 | node['classes'].append(self.arguments[0])
34 |
35 | self.add_name(node)
36 | self.state.nested_parse(self.content, self.content_offset, node)
37 | return [node]
38 |
39 |
40 | class ContentTabsContainerDirective(Directive):
41 | has_content = True
42 | option_spec = {'title': directives.unchanged}
43 | required_arguments = 1
44 |
45 | def run(self):
46 | self.assert_has_content()
47 | text = '\n'.join(self.content)
48 | node = nodes.container(text)
49 | node['ids'].append('tab-%s' % self.arguments[0])
50 | node['classes'].append('tab-content')
51 |
52 | par = nodes.paragraph(text=self.options["title"])
53 | par['classes'].append('tab-title')
54 | node += par
55 |
56 | self.add_name(node)
57 | self.state.nested_parse(self.content, self.content_offset, node)
58 |
59 | return [node]
60 |
61 |
62 | class ToggleDirective(Directive):
63 | has_content = True
64 | option_spec = {'header': directives.unchanged}
65 | optional_arguments = 1
66 |
67 | def run(self):
68 | node = nodes.container()
69 | node['classes'].append('toggle-content')
70 |
71 | par = nodes.container()
72 | par['classes'].append('toggle-header')
73 | if self.arguments and self.arguments[0]:
74 | par['classes'].append(self.arguments[0])
75 |
76 | self.state.nested_parse(StringList([self.options["header"]]), self.content_offset, par)
77 | self.state.nested_parse(self.content, self.content_offset, node)
78 |
79 | return [par, node]
80 |
81 |
82 | def add_assets(app):
83 | app.add_css_file(CSS_FILE)
84 | app.add_js_file(JS_FILE)
85 |
86 |
87 | def copy_assets(app, exception):
88 | if app.builder.name not in ['html', 'readthedocs'] or exception:
89 | return
90 | logger = logging.getLogger(__name__)
91 | logger.info('Copying contentui stylesheet/javascript... ', nonl=True)
92 | dest = os.path.join(app.builder.outdir, '_static', CSS_FILE)
93 | source = os.path.join(os.path.abspath(os.path.dirname(__file__)), CSS_FILE)
94 | copyfile(source, dest)
95 | dest = os.path.join(app.builder.outdir, '_static', JS_FILE)
96 | source = os.path.join(os.path.abspath(os.path.dirname(__file__)), JS_FILE)
97 | copyfile(source, dest)
98 | logger.info('done')
99 |
100 |
101 | def setup(app):
102 | app.add_directive('content-tabs', ContentTabsDirective)
103 | app.add_directive('tab-container', ContentTabsContainerDirective)
104 | app.add_directive('toggle-header', ToggleDirective)
105 |
106 | app.connect('builder-inited', add_assets)
107 | app.connect('build-finished', copy_assets)
108 |
--------------------------------------------------------------------------------
/docs/example-all.rst:
--------------------------------------------------------------------------------
1 | .. _example-all:
2 |
3 | All-in-One Example
4 | ------------------
5 |
6 | .. container:: left-col
7 |
8 | .. toggle-header::
9 | :header: Example 1 **Show/Hide Code**
10 |
11 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
12 | incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
13 | nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
14 | Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
15 | fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
16 | culpa qui officia deserunt mollit anim id est laborum
17 |
18 | .. toggle-header:: rubric
19 | :header: Example 2
20 |
21 | Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
22 | accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
23 | ab illo inventore veritatis et quasi architecto beatae vitae dicta
24 | sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,
25 | aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos,
26 | qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui
27 | dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed
28 | quia non numquam eius modi tempora incidunt, ut labore et dolore magnam
29 | aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
30 | exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex
31 | ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in
32 | ea voluptate velit esse, quam nihil molestiae consequatur, vel illum,
33 | qui dolorem eum fugiat, quo voluptas nulla pariatur? At vero eos et
34 | accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium
35 | voluptatum deleniti atque corrupti, quos dolores et quas molestias
36 | excepturi sint, obcaecati cupiditate non provident, similique sunt in
37 | culpa, qui officia deserunt mollitia animi, id est laborum et dolorum
38 | fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam
39 | libero tempore, cum soluta nobis est eligendi optio, cumque nihil
40 | impedit, quo minus id, quod maxime placeat, facere possimus, omnis
41 | voluptas assumenda est, omnis dolor repellendus. Temporibus autem
42 | quibusdam et aut officiis debitis aut rerum necessitatibus saepe
43 | eveniet, ut et voluptates repudiandae sint et molestiae non recusandae.
44 | Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis
45 | voluptatibus maiores alias consequatur aut perferendis doloribus
46 | asperiores repellat.
47 |
48 | .. container:: content-tabs right-col
49 |
50 | .. tab-container:: python
51 | :title: Python
52 |
53 | .. rubric:: Definition
54 |
55 | .. code-block:: python
56 |
57 | my_api.signin()
58 |
59 | .. rubric:: Example request
60 |
61 | .. code-block:: python
62 |
63 | import my_api
64 | my_api.signin('username', 'password')
65 |
66 | .. tab-container:: php
67 | :title: PHP
68 |
69 | .. rubric:: Definition
70 |
71 | .. code-block:: php
72 |
73 | MyApi::signin();
74 |
75 | .. rubric:: Example request
76 |
77 | .. code-block:: php
78 |
79 | include 'my-api.php';
80 | MyApi::signin('username', 'password');
81 |
82 | Additional
83 | ~~~~~~~~~~
84 |
85 | .. content-tabs:: left-col
86 |
87 | .. tab-container:: ex1
88 | :title: Example 1
89 |
90 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
91 | incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
92 | nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
93 | Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
94 | fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
95 | culpa qui officia deserunt mollit anim id est laborum
96 |
97 | .. tab-container:: ex2
98 | :title: Example 2
99 |
100 | Sed ut perspiciatis, unde omnis iste natus error sit voluptatem
101 | accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae
102 | ab illo inventore veritatis et quasi architecto beatae vitae dicta
103 | sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit,
104 | aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos,
105 | qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui
106 | dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed
107 | quia non numquam eius modi tempora incidunt, ut labore et dolore magnam
108 | aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum
109 | exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex
110 | ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in
111 | ea voluptate velit esse, quam nihil molestiae consequatur, vel illum,
112 | qui dolorem eum fugiat, quo voluptas nulla pariatur? At vero eos et
113 | accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium
114 | voluptatum deleniti atque corrupti, quos dolores et quas molestias
115 | excepturi sint, obcaecati cupiditate non provident, similique sunt in
116 | culpa, qui officia deserunt mollitia animi, id est laborum et dolorum
117 | fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam
118 | libero tempore, cum soluta nobis est eligendi optio, cumque nihil
119 | impedit, quo minus id, quod maxime placeat, facere possimus, omnis
120 | voluptas assumenda est, omnis dolor repellendus. Temporibus autem
121 | quibusdam et aut officiis debitis aut rerum necessitatibus saepe
122 | eveniet, ut et voluptates repudiandae sint et molestiae non recusandae.
123 | Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis
124 | voluptatibus maiores alias consequatur aut perferendis doloribus
125 | asperiores repellat.
126 |
127 | .. content-tabs:: right-col
128 |
129 |
130 | .. tab-container:: python
131 | :title: Python
132 |
133 | .. rubric:: Description for Python
134 |
135 | .. tab-container:: php
136 | :title: PHP
137 |
138 | .. rubric:: Description for PHP
139 |
--------------------------------------------------------------------------------