5 * Sphinx JavaScript utilities for all documentation.
7 * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS.
8 * :license: BSD, see LICENSE for details.
13 * select a different prefix for underscore
18 * make the code below compatible with browsers without
19 * an installed firebug like debugger
20 if (!window.console || !console.firebug) {
21 var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
22 "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
23 "profile", "profileEnd"];
25 for (var i = 0; i < names.length; ++i)
26 window.console[names[i]] = function() {};
31 * small helper function to urldecode strings
33 jQuery
.urldecode
= function(x
) {
34 return decodeURIComponent(x
).replace(/\
+/g
, ' ');
38 * small helper function to urlencode strings
40 jQuery
.urlencode
= encodeURIComponent
;
43 * This function returns the parsed url parameters of the
44 * current request. Multiple values per key are supported,
45 * it will always return arrays of strings for the value parts.
47 jQuery
.getQueryParameters
= function(s
) {
48 if (typeof s
== 'undefined')
49 s
= document
.location
.search
;
50 var parts
= s
.substr(s
.indexOf('?') + 1).split('&');
52 for (var i
= 0; i
< parts
.length
; i
++) {
53 var tmp
= parts
[i].split('=', 2);
54 var key
= jQuery
.urldecode(tmp
[0]);
55 var value
= jQuery
.urldecode(tmp
[1]);
57 result
[key].push(value
);
59 result
[key] = [value];
65 * highlight a given string on a jquery object by wrapping it in
66 * span elements with the given class name.
68 jQuery
.fn
.highlightText
= function(text
, className
) {
69 function highlight(node
) {
70 if (node
.nodeType
== 3) {
71 var val
= node
.nodeValue
;
72 var pos
= val
.toLowerCase().indexOf(text
);
73 if (pos
>= 0 && !jQuery(node
.parentNode
).hasClass(className
)) {
74 var span
= document
.createElement("span");
75 span
.className
= className
;
76 span
.appendChild(document
.createTextNode(val
.substr(pos
, text
.length
)));
77 node
.parentNode
.insertBefore(span
, node
.parentNode
.insertBefore(
78 document
.createTextNode(val
.substr(pos
+ text
.length
)),
80 node
.nodeValue
= val
.substr(0, pos
);
83 else if (!jQuery(node
).is("button, select, textarea")) {
84 jQuery
.each(node
.childNodes
, function() {
89 return this.each(function() {
95 * Small JavaScript module for the documentation.
100 this.fixFirefoxAnchorBug();
101 this.highlightSearchWords();
102 this.initIndexTable();
109 PLURAL_EXPR
: function(n
) { return n
== 1 ?
0 : 1; },
112 // gettext and ngettext don't access this so that the functions
113 // can safely bound to a different name (_ = Documentation.gettext)
114 gettext
: function(string
) {
115 var translated
= Documentation
.TRANSLATIONS
[string];
116 if (typeof translated
== 'undefined')
118 return (typeof translated
== 'string') ? translated
: translated
[0];
121 ngettext
: function(singular
, plural
, n
) {
122 var translated
= Documentation
.TRANSLATIONS
[singular];
123 if (typeof translated
== 'undefined')
124 return (n
== 1) ? singular
: plural
;
125 return translated
[Documentation
.PLURALEXPR(n
)];
128 addTranslations
: function(catalog
) {
129 for (var key
in catalog
.messages
)
130 this.TRANSLATIONS
[key] = catalog
.messages
[key];
131 this.PLURAL_EXPR
= new Function('n', 'return +(' + catalog
.plural_expr
+ ')');
132 this.LOCALE
= catalog
.locale
;
136 * add context elements like header anchor links
138 addContextElements
: function() {
139 $
('div[id] > :header:first').each(function() {
140 $
('<a class="headerlink">\u00B6</a>').
141 attr('href', '#' + this.id
).
142 attr('title', _('Permalink to this headline')).
145 $
('dt[id]').each(function() {
146 $
('<a class="headerlink">\u00B6</a>').
147 attr('href', '#' + this.id
).
148 attr('title', _('Permalink to this definition')).
154 * workaround a firefox stupidity
156 fixFirefoxAnchorBug
: function() {
157 if (document
.location
.hash
&& $
.browser
.mozilla
)
158 window
.setTimeout(function() {
159 document
.location
.href
+= '';
164 * highlight the search words provided in the url in the text
166 highlightSearchWords
: function() {
167 var params
= $
.getQueryParameters();
168 var terms
= (params
.highlight
) ? params
.highlight
[0].split(/\s
+/) : [];
170 var body
= $
('div.body');
174 window
.setTimeout(function() {
175 $
.each(terms
, function() {
176 body
.highlightText(this.toLowerCase(), 'highlighted');
179 $
('<p class="highlight-link"><a href="javascript:Documentation.' +
180 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
181 .appendTo($
('#searchbox'));
186 * init the domain index toggle buttons
188 initIndexTable
: function() {
189 var togglers
= $
('img.toggler').click(function() {
190 var src
= $
(this).attr('src');
191 var idnum
= $
(this).attr('id').substr(7);
192 $
('tr.cg-' + idnum
).toggle();
193 if (src
.substr(-9) == 'minus.png')
194 $
(this).attr('src', src
.substr(0, src
.length
-9) + 'plus.png');
196 $
(this).attr('src', src
.substr(0, src
.length
-8) + 'minus.png');
197 }).css('display', '');
198 if (DOCUMENTATION_OPTIONS
.COLLAPSE_INDEX
) {
204 * helper function to hide the search marks again
206 hideSearchWords
: function() {
207 $
('#searchbox .highlight-link').fadeOut(300);
208 $
('span.highlighted').removeClass('highlighted');
212 * make the url absolute
214 makeURL
: function(relativeURL
) {
215 return DOCUMENTATION_OPTIONS
.URL_ROOT
+ '/' + relativeURL
;
219 * get the current relative url
221 getCurrentURL
: function() {
222 var path
= document
.location
.pathname
;
223 var parts
= path
.split(/\
//);
224 $
.each(DOCUMENTATION_OPTIONS
.URL_ROOT
.split(/\
//), function() {
228 var url
= parts
.join('/');
229 return path
.substring(url
.lastIndexOf('/') + 1, path
.length
- 1);
233 // quick alias for translations
234 _
= Documentation
.gettext
;
236 $
(document
).ready(function() {
237 Documentation
.init();