1+ /*
2+ * doctools.js
3+ * ~~~~~~~~~~~
4+ *
5+ * Sphinx JavaScript utilities for all documentation.
6+ *
7+ * :copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
8+ * :license: BSD, see LICENSE for details.
9+ *
10+ */
11+
12+ /**
13+ * select a different prefix for underscore
14+ */
15+ $u = _ . noConflict ( ) ;
16+
17+ /**
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"];
24+ window.console = {};
25+ for (var i = 0; i < names.length; ++i)
26+ window.console[names[i]] = function() {};
27+ }
28+ */
29+
30+ /**
31+ * small helper function to urldecode strings
32+ */
33+ jQuery . urldecode = function ( x ) {
34+ return decodeURIComponent ( x ) . replace ( / \+ / g, ' ' ) ;
35+ } ;
36+
37+ /**
38+ * small helper function to urlencode strings
39+ */
40+ jQuery . urlencode = encodeURIComponent ;
41+
42+ /**
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.
46+ */
47+ jQuery . getQueryParameters = function ( s ) {
48+ if ( typeof s == 'undefined' )
49+ s = document . location . search ;
50+ var parts = s . substr ( s . indexOf ( '?' ) + 1 ) . split ( '&' ) ;
51+ var result = { } ;
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 ] ) ;
56+ if ( key in result )
57+ result [ key ] . push ( value ) ;
58+ else
59+ result [ key ] = [ value ] ;
60+ }
61+ return result ;
62+ } ;
63+
64+ /**
65+ * highlight a given string on a jquery object by wrapping it in
66+ * span elements with the given class name.
67+ */
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 ) ) ,
79+ node . nextSibling ) ) ;
80+ node . nodeValue = val . substr ( 0 , pos ) ;
81+ }
82+ }
83+ else if ( ! jQuery ( node ) . is ( "button, select, textarea" ) ) {
84+ jQuery . each ( node . childNodes , function ( ) {
85+ highlight ( this ) ;
86+ } ) ;
87+ }
88+ }
89+ return this . each ( function ( ) {
90+ highlight ( this ) ;
91+ } ) ;
92+ } ;
93+
94+ /*
95+ * backward compatibility for jQuery.browser
96+ * This will be supported until firefox bug is fixed.
97+ */
98+ if ( ! jQuery . browser ) {
99+ jQuery . uaMatch = function ( ua ) {
100+ ua = ua . toLowerCase ( ) ;
101+
102+ var match = / ( c h r o m e ) [ \/ ] ( [ \w . ] + ) / . exec ( ua ) ||
103+ / ( w e b k i t ) [ \/ ] ( [ \w . ] + ) / . exec ( ua ) ||
104+ / ( o p e r a ) (?: .* v e r s i o n | ) [ \/ ] ( [ \w . ] + ) / . exec ( ua ) ||
105+ / ( m s i e ) ( [ \w . ] + ) / . exec ( ua ) ||
106+ ua . indexOf ( "compatible" ) < 0 && / ( m o z i l l a ) (?: .* ? r v : ( [ \w . ] + ) | ) / . exec ( ua ) ||
107+ [ ] ;
108+
109+ return {
110+ browser : match [ 1 ] || "" ,
111+ version : match [ 2 ] || "0"
112+ } ;
113+ } ;
114+ jQuery . browser = { } ;
115+ jQuery . browser [ jQuery . uaMatch ( navigator . userAgent ) . browser ] = true ;
116+ }
117+
118+ /**
119+ * Small JavaScript module for the documentation.
120+ */
121+ var Documentation = {
122+
123+ init : function ( ) {
124+ this . fixFirefoxAnchorBug ( ) ;
125+ this . highlightSearchWords ( ) ;
126+ this . initIndexTable ( ) ;
127+
128+ } ,
129+
130+ /**
131+ * i18n support
132+ */
133+ TRANSLATIONS : { } ,
134+ PLURAL_EXPR : function ( n ) { return n == 1 ? 0 : 1 ; } ,
135+ LOCALE : 'unknown' ,
136+
137+ // gettext and ngettext don't access this so that the functions
138+ // can safely bound to a different name (_ = Documentation.gettext)
139+ gettext : function ( string ) {
140+ var translated = Documentation . TRANSLATIONS [ string ] ;
141+ if ( typeof translated == 'undefined' )
142+ return string ;
143+ return ( typeof translated == 'string' ) ? translated : translated [ 0 ] ;
144+ } ,
145+
146+ ngettext : function ( singular , plural , n ) {
147+ var translated = Documentation . TRANSLATIONS [ singular ] ;
148+ if ( typeof translated == 'undefined' )
149+ return ( n == 1 ) ? singular : plural ;
150+ return translated [ Documentation . PLURALEXPR ( n ) ] ;
151+ } ,
152+
153+ addTranslations : function ( catalog ) {
154+ for ( var key in catalog . messages )
155+ this . TRANSLATIONS [ key ] = catalog . messages [ key ] ;
156+ this . PLURAL_EXPR = new Function ( 'n' , 'return +(' + catalog . plural_expr + ')' ) ;
157+ this . LOCALE = catalog . locale ;
158+ } ,
159+
160+ /**
161+ * add context elements like header anchor links
162+ */
163+ addContextElements : function ( ) {
164+ $ ( 'div[id] > :header:first' ) . each ( function ( ) {
165+ $ ( '<a class="headerlink">\u00B6</a>' ) .
166+ attr ( 'href' , '#' + this . id ) .
167+ attr ( 'title' , _ ( 'Permalink to this headline' ) ) .
168+ appendTo ( this ) ;
169+ } ) ;
170+ $ ( 'dt[id]' ) . each ( function ( ) {
171+ $ ( '<a class="headerlink">\u00B6</a>' ) .
172+ attr ( 'href' , '#' + this . id ) .
173+ attr ( 'title' , _ ( 'Permalink to this definition' ) ) .
174+ appendTo ( this ) ;
175+ } ) ;
176+ } ,
177+
178+ /**
179+ * workaround a firefox stupidity
180+ * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
181+ */
182+ fixFirefoxAnchorBug : function ( ) {
183+ if ( document . location . hash )
184+ window . setTimeout ( function ( ) {
185+ document . location . href += '' ;
186+ } , 10 ) ;
187+ } ,
188+
189+ /**
190+ * highlight the search words provided in the url in the text
191+ */
192+ highlightSearchWords : function ( ) {
193+ var params = $ . getQueryParameters ( ) ;
194+ var terms = ( params . highlight ) ? params . highlight [ 0 ] . split ( / \s + / ) : [ ] ;
195+ if ( terms . length ) {
196+ var body = $ ( 'div.body' ) ;
197+ if ( ! body . length ) {
198+ body = $ ( 'body' ) ;
199+ }
200+ window . setTimeout ( function ( ) {
201+ $ . each ( terms , function ( ) {
202+ body . highlightText ( this . toLowerCase ( ) , 'highlighted' ) ;
203+ } ) ;
204+ } , 10 ) ;
205+ $ ( '<p class="highlight-link"><a href="javascript:Documentation.' +
206+ 'hideSearchWords()">' + _ ( 'Hide Search Matches' ) + '</a></p>' )
207+ . appendTo ( $ ( '#searchbox' ) ) ;
208+ }
209+ } ,
210+
211+ /**
212+ * init the domain index toggle buttons
213+ */
214+ initIndexTable : function ( ) {
215+ var togglers = $ ( 'img.toggler' ) . click ( function ( ) {
216+ var src = $ ( this ) . attr ( 'src' ) ;
217+ var idnum = $ ( this ) . attr ( 'id' ) . substr ( 7 ) ;
218+ $ ( 'tr.cg-' + idnum ) . toggle ( ) ;
219+ if ( src . substr ( - 9 ) == 'minus.png' )
220+ $ ( this ) . attr ( 'src' , src . substr ( 0 , src . length - 9 ) + 'plus.png' ) ;
221+ else
222+ $ ( this ) . attr ( 'src' , src . substr ( 0 , src . length - 8 ) + 'minus.png' ) ;
223+ } ) . css ( 'display' , '' ) ;
224+ if ( DOCUMENTATION_OPTIONS . COLLAPSE_INDEX ) {
225+ togglers . click ( ) ;
226+ }
227+ } ,
228+
229+ /**
230+ * helper function to hide the search marks again
231+ */
232+ hideSearchWords : function ( ) {
233+ $ ( '#searchbox .highlight-link' ) . fadeOut ( 300 ) ;
234+ $ ( 'span.highlighted' ) . removeClass ( 'highlighted' ) ;
235+ } ,
236+
237+ /**
238+ * make the url absolute
239+ */
240+ makeURL : function ( relativeURL ) {
241+ return DOCUMENTATION_OPTIONS . URL_ROOT + '/' + relativeURL ;
242+ } ,
243+
244+ /**
245+ * get the current relative url
246+ */
247+ getCurrentURL : function ( ) {
248+ var path = document . location . pathname ;
249+ var parts = path . split ( / \/ / ) ;
250+ $ . each ( DOCUMENTATION_OPTIONS . URL_ROOT . split ( / \/ / ) , function ( ) {
251+ if ( this == '..' )
252+ parts . pop ( ) ;
253+ } ) ;
254+ var url = parts . join ( '/' ) ;
255+ return path . substring ( url . lastIndexOf ( '/' ) + 1 , path . length - 1 ) ;
256+ } ,
257+
258+ initOnKeyListeners : function ( ) {
259+ $ ( document ) . keyup ( function ( event ) {
260+ var activeElementType = document . activeElement . tagName ;
261+ // don't navigate when in search box or textarea
262+ if ( activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' ) {
263+ switch ( event . keyCode ) {
264+ case 37 : // left
265+ var prevHref = $ ( 'link[rel="prev"]' ) . prop ( 'href' ) ;
266+ if ( prevHref ) {
267+ window . location . href = prevHref ;
268+ return false ;
269+ }
270+ case 39 : // right
271+ var nextHref = $ ( 'link[rel="next"]' ) . prop ( 'href' ) ;
272+ if ( nextHref ) {
273+ window . location . href = nextHref ;
274+ return false ;
275+ }
276+ }
277+ }
278+ } ) ;
279+ }
280+ } ;
281+
282+ // quick alias for translations
283+ _ = Documentation . gettext ;
284+
285+ $ ( document ) . ready ( function ( ) {
286+ Documentation . init ( ) ;
287+ } ) ;
0 commit comments