diff --git a/sphinx/domains/javascript.py b/sphinx/domains/javascript.py index fb45b0521..8f618a70c 100644 --- a/sphinx/domains/javascript.py +++ b/sphinx/domains/javascript.py @@ -82,6 +82,23 @@ class JSCallable(JSObject): """Description of a JavaScript function, method or constructor.""" has_arguments = True +class JSXRefRole(XRefRole): + def process_link(self, env, refnode, has_explicit_title, title, target): + # basically what sphinx.domains.python.PyXRefRole does + refnode['js:object'] = env.temp_data.get('js:object') + if not has_explicit_title: + title = title.lstrip('.') + target = target.lstrip('~') + if title[0:1] == '~': + title = title[1:] + dot = title.rfind('.') + if dot != -1: + title = title[dot+1:] + if target[0:1] == '.': + target = target[1:] + refnode['refspecific'] = True + return title, target + class JavaScriptDomain(Domain): """JavaScript language domain.""" name = 'js' @@ -97,7 +114,7 @@ class JavaScriptDomain(Domain): 'attribute' : JSObject, } roles = { - 'func': XRefRole(fix_parens=True), - 'data': XRefRole(), - 'attr': XRefRole() + 'func': JSXRefRole(fix_parens=True), + 'data': JSXRefRole(), + 'attr': JSXRefRole() } diff --git a/tests/root/objects.txt b/tests/root/objects.txt index a348b280b..60bb120d7 100644 --- a/tests/root/objects.txt +++ b/tests/root/objects.txt @@ -103,6 +103,7 @@ Without target: :c:func:`CFunction`. :c:func:`!malloc`. :js:data:`bar` :js:func:`bar.baz()` :js:func:`bar.baz` +:js:func:`~bar.baz()` :js:attr:`bar.baz`