forked from gnif/LookingGlass
-
Notifications
You must be signed in to change notification settings - Fork 0
/
html_unescape.py
58 lines (50 loc) · 2.13 KB
/
html_unescape.py
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
# Copyright 2023 The Looking Glass Authors
# https://looking-glass.io
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc., 59
# Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Call html.unescape on source files when building docs
#
# This converts named HTML character references: like '>' into '>',
# and numeric references: like '🔎' into '🔎'
#
# See https://docs.python.org/3/library/html.html#html.unescape
# and https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references
# for more information on available sequences
from html import unescape
# For type hints (PEP 484)
from sphinx.application import Sphinx
from sphinx.environment import BuildEnvironment
def unescape_source(app: Sphinx, docname: str, source: list) -> None:
env: BuildEnvironment = app.env
exclude: list = env.config.html_unescape_exclude
onlyinclude: list = env.config.html_unescape_onlyinclude
docpath: str = env.doc2path(docname, base=False)
if docname in exclude:
return
if docpath in exclude:
return
if len(onlyinclude) and not (docname in onlyinclude or docpath in onlyinclude):
return
source[0] = unescape(source[0])
def setup(app: Sphinx) -> dict[str, bool | str]:
app.add_config_value('html_unescape_exclude', [], 'env', [list])
app.add_config_value('html_unescape_onlyinclude', [], 'env', [list])
app.connect('source-read', unescape_source)
return {
'version': '1.0',
'env_version': '1.0',
'parallel_read_safe': True,
'parallel_write_safe': True,
}