-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy path__init__.py
More file actions
107 lines (75 loc) · 3.08 KB
/
__init__.py
File metadata and controls
107 lines (75 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""A small sphinx extension to add "toggle" buttons to items."""
import os
from docutils import nodes
from docutils.parsers.rst import Directive, directives
from sphinx.locale import get_translation
MESSAGE_CATALOG_NAME = "togglebutton"
translate = get_translation(MESSAGE_CATALOG_NAME)
__version__ = "0.4.3"
def st_static_path(app):
static_path = os.path.abspath(
os.path.join(os.path.dirname(__file__), "_static")
)
app.config.html_static_path.append(static_path)
def initialize_js_assets(app, config):
# Update the global context
app.add_js_file(
None, body=f"let toggleHintShow = '{config.togglebutton_hint}';"
)
app.add_js_file(
None, body=f"let toggleHintHide = '{config.togglebutton_hint_hide}';"
)
open_print = str(config.togglebutton_open_on_print).lower()
app.add_js_file(None, body=f"let toggleOpenOnPrint = '{open_print}';")
app.add_js_file("togglebutton.js")
# This function reads in a variable and inserts it into JavaScript
def insert_custom_selection_config(app):
# This is a configuration that you've specified for users in `conf.py`
selector = app.config["togglebutton_selector"]
js_text = "var togglebuttonSelector = '%s';" % selector
app.add_js_file(None, body=js_text)
class Toggle(Directive):
"""Hide a block of markup text by wrapping it in a container."""
optional_arguments = 1
final_argument_whitespace = True
has_content = True
option_spec = {"id": directives.unchanged, "show": directives.flag}
def run(self):
self.assert_has_content()
classes = ["toggle"]
if "show" in self.options:
classes.append("toggle-shown")
parent = nodes.container(classes=classes)
self.state.nested_parse(self.content, self.content_offset, parent)
return [parent]
# We connect this function to the step after the builder is initialized
def setup(app):
# add translations
package_dir = os.path.abspath(os.path.dirname(__file__))
locale_dir = os.path.join(package_dir, "translations", "locales")
app.add_message_catalog(MESSAGE_CATALOG_NAME, locale_dir)
# Add our static path
app.connect("builder-inited", st_static_path)
# Add relevant code to headers
app.add_css_file("togglebutton.css")
# Add the string we'll use to select items in the JS
# Tell Sphinx about this configuration variable
app.add_config_value(
"togglebutton_selector", ".toggle, .admonition.dropdown", "html"
)
app.add_config_value(
"togglebutton_hint", f"{translate('Click to show')}", "html"
)
app.add_config_value(
"togglebutton_hint_hide", f"{translate('Click to hide')}", "html"
)
app.add_config_value("togglebutton_open_on_print", True, "html")
# Run the function after the builder is initialized
app.connect("builder-inited", insert_custom_selection_config)
app.connect("config-inited", initialize_js_assets)
app.add_directive("toggle", Toggle)
return {
"version": __version__,
"parallel_read_safe": True,
"parallel_write_safe": True,
}