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
|
# -*- coding: utf-8 -*-
"""
sphinx.domains.javascript
~~~~~~~~~~~~~~~~~~~~~~~~~
The JavaScript domain.
:copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
import re
from sphinx import addnodes
from sphinx.domains import Domain, ObjType
from sphinx.locale import l_, _
from sphinx.directives import ObjectDescription
from sphinx.domains.python import py_paramlist_re as js_paramlist_re
from sphinx.roles import XRefRole
js_sig_re = re.compile(r'(\w+)\s*\((.*)\)')
class JSFunction(ObjectDescription):
"""
Description of a JavaScript function.
"""
def handle_signature(self, sig, signode):
match = js_sig_re.match(sig)
if match is None:
raise ValueError()
name, arglist = match.groups()
signode += addnodes.desc_name(name, name)
if not arglist:
signode += addnodes.desc_parameterlist()
return name
stack = [signode[-1]]
for token in js_paramlist_re.split(arglist):
if token == '[':
opt = addnodes.desc_optional()
stack[-1] += opt
stack.append(opt)
elif token == ']':
try:
stack.pop()
except IndexError:
raise ValueError()
elif not token or token == ',' or token.isspace():
pass
else:
token = token.strip()
stack[-1] += addnodes.desc_parameter(token, token)
if len(stack) != 1:
raise ValueError()
return name
class JSData(ObjectDescription):
"""Describes a global variable or constant."""
def handle_signature(self, sig, signode):
return sig.strip()
class JavaScriptDomain(Domain):
"""JavaScript language domain."""
name = "js"
label= "JavaScript"
object_types = {
"function": ObjType(l_("js function"), "func"),
"data": ObjType(l_("js data"), "data"),
}
directives = {
"function": JSFunction,
"data": JSData,
}
roles = {
"func": XRefRole(fix_parens=True),
"data": XRefRole(),
}
|