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();