summaryrefslogtreecommitdiff
path: root/sphinx/domains/javascript.py
blob: c2b28e66b051d816a436e1c3f8817629cd039e80 (plain)
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(),
    }