Mercurial > minori
comparison dep/fmt/doc/html/_static/doctools.js @ 343:1faa72660932
*: transfer back to cmake from autotools
autotools just made lots of things more complicated than
they should have and many things broke (i.e. translations)
| author | Paper <paper@paper.us.eu.org> |
|---|---|
| date | Thu, 20 Jun 2024 05:56:06 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 342:adb79bdde329 | 343:1faa72660932 |
|---|---|
| 1 /* | |
| 2 * doctools.js | |
| 3 * ~~~~~~~~~~~ | |
| 4 * | |
| 5 * Sphinx JavaScript utilities for all documentation. | |
| 6 * | |
| 7 * :copyright: Copyright 2007-2020 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, addItems) { | |
| 70 if (node.nodeType === 3) { | |
| 71 var val = node.nodeValue; | |
| 72 var pos = val.toLowerCase().indexOf(text); | |
| 73 if (pos >= 0 && | |
| 74 !jQuery(node.parentNode).hasClass(className) && | |
| 75 !jQuery(node.parentNode).hasClass("nohighlight")) { | |
| 76 var span; | |
| 77 var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); | |
| 78 if (isInSVG) { | |
| 79 span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); | |
| 80 } else { | |
| 81 span = document.createElement("span"); | |
| 82 span.className = className; | |
| 83 } | |
| 84 span.appendChild(document.createTextNode(val.substr(pos, text.length))); | |
| 85 node.parentNode.insertBefore(span, node.parentNode.insertBefore( | |
| 86 document.createTextNode(val.substr(pos + text.length)), | |
| 87 node.nextSibling)); | |
| 88 node.nodeValue = val.substr(0, pos); | |
| 89 if (isInSVG) { | |
| 90 var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); | |
| 91 var bbox = node.parentElement.getBBox(); | |
| 92 rect.x.baseVal.value = bbox.x; | |
| 93 rect.y.baseVal.value = bbox.y; | |
| 94 rect.width.baseVal.value = bbox.width; | |
| 95 rect.height.baseVal.value = bbox.height; | |
| 96 rect.setAttribute('class', className); | |
| 97 addItems.push({ | |
| 98 "parent": node.parentNode, | |
| 99 "target": rect}); | |
| 100 } | |
| 101 } | |
| 102 } | |
| 103 else if (!jQuery(node).is("button, select, textarea")) { | |
| 104 jQuery.each(node.childNodes, function() { | |
| 105 highlight(this, addItems); | |
| 106 }); | |
| 107 } | |
| 108 } | |
| 109 var addItems = []; | |
| 110 var result = this.each(function() { | |
| 111 highlight(this, addItems); | |
| 112 }); | |
| 113 for (var i = 0; i < addItems.length; ++i) { | |
| 114 jQuery(addItems[i].parent).before(addItems[i].target); | |
| 115 } | |
| 116 return result; | |
| 117 }; | |
| 118 | |
| 119 /* | |
| 120 * backward compatibility for jQuery.browser | |
| 121 * This will be supported until firefox bug is fixed. | |
| 122 */ | |
| 123 if (!jQuery.browser) { | |
| 124 jQuery.uaMatch = function(ua) { | |
| 125 ua = ua.toLowerCase(); | |
| 126 | |
| 127 var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || | |
| 128 /(webkit)[ \/]([\w.]+)/.exec(ua) || | |
| 129 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || | |
| 130 /(msie) ([\w.]+)/.exec(ua) || | |
| 131 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || | |
| 132 []; | |
| 133 | |
| 134 return { | |
| 135 browser: match[ 1 ] || "", | |
| 136 version: match[ 2 ] || "0" | |
| 137 }; | |
| 138 }; | |
| 139 jQuery.browser = {}; | |
| 140 jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; | |
| 141 } | |
| 142 | |
| 143 /** | |
| 144 * Small JavaScript module for the documentation. | |
| 145 */ | |
| 146 var Documentation = { | |
| 147 | |
| 148 init : function() { | |
| 149 this.fixFirefoxAnchorBug(); | |
| 150 this.highlightSearchWords(); | |
| 151 this.initIndexTable(); | |
| 152 if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { | |
| 153 this.initOnKeyListeners(); | |
| 154 } | |
| 155 }, | |
| 156 | |
| 157 /** | |
| 158 * i18n support | |
| 159 */ | |
| 160 TRANSLATIONS : {}, | |
| 161 PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, | |
| 162 LOCALE : 'unknown', | |
| 163 | |
| 164 // gettext and ngettext don't access this so that the functions | |
| 165 // can safely bound to a different name (_ = Documentation.gettext) | |
| 166 gettext : function(string) { | |
| 167 var translated = Documentation.TRANSLATIONS[string]; | |
| 168 if (typeof translated === 'undefined') | |
| 169 return string; | |
| 170 return (typeof translated === 'string') ? translated : translated[0]; | |
| 171 }, | |
| 172 | |
| 173 ngettext : function(singular, plural, n) { | |
| 174 var translated = Documentation.TRANSLATIONS[singular]; | |
| 175 if (typeof translated === 'undefined') | |
| 176 return (n == 1) ? singular : plural; | |
| 177 return translated[Documentation.PLURALEXPR(n)]; | |
| 178 }, | |
| 179 | |
| 180 addTranslations : function(catalog) { | |
| 181 for (var key in catalog.messages) | |
| 182 this.TRANSLATIONS[key] = catalog.messages[key]; | |
| 183 this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); | |
| 184 this.LOCALE = catalog.locale; | |
| 185 }, | |
| 186 | |
| 187 /** | |
| 188 * add context elements like header anchor links | |
| 189 */ | |
| 190 addContextElements : function() { | |
| 191 $('div[id] > :header:first').each(function() { | |
| 192 $('<a class="headerlink">\u00B6</a>'). | |
| 193 attr('href', '#' + this.id). | |
| 194 attr('title', _('Permalink to this headline')). | |
| 195 appendTo(this); | |
| 196 }); | |
| 197 $('dt[id]').each(function() { | |
| 198 $('<a class="headerlink">\u00B6</a>'). | |
| 199 attr('href', '#' + this.id). | |
| 200 attr('title', _('Permalink to this definition')). | |
| 201 appendTo(this); | |
| 202 }); | |
| 203 }, | |
| 204 | |
| 205 /** | |
| 206 * workaround a firefox stupidity | |
| 207 * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 | |
| 208 */ | |
| 209 fixFirefoxAnchorBug : function() { | |
| 210 if (document.location.hash && $.browser.mozilla) | |
| 211 window.setTimeout(function() { | |
| 212 document.location.href += ''; | |
| 213 }, 10); | |
| 214 }, | |
| 215 | |
| 216 /** | |
| 217 * highlight the search words provided in the url in the text | |
| 218 */ | |
| 219 highlightSearchWords : function() { | |
| 220 var params = $.getQueryParameters(); | |
| 221 var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; | |
| 222 if (terms.length) { | |
| 223 var body = $('div.body'); | |
| 224 if (!body.length) { | |
| 225 body = $('body'); | |
| 226 } | |
| 227 window.setTimeout(function() { | |
| 228 $.each(terms, function() { | |
| 229 body.highlightText(this.toLowerCase(), 'highlighted'); | |
| 230 }); | |
| 231 }, 10); | |
| 232 $('<p class="highlight-link"><a href="javascript:Documentation.' + | |
| 233 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>') | |
| 234 .appendTo($('#searchbox')); | |
| 235 } | |
| 236 }, | |
| 237 | |
| 238 /** | |
| 239 * init the domain index toggle buttons | |
| 240 */ | |
| 241 initIndexTable : function() { | |
| 242 var togglers = $('img.toggler').click(function() { | |
| 243 var src = $(this).attr('src'); | |
| 244 var idnum = $(this).attr('id').substr(7); | |
| 245 $('tr.cg-' + idnum).toggle(); | |
| 246 if (src.substr(-9) === 'minus.png') | |
| 247 $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); | |
| 248 else | |
| 249 $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); | |
| 250 }).css('display', ''); | |
| 251 if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { | |
| 252 togglers.click(); | |
| 253 } | |
| 254 }, | |
| 255 | |
| 256 /** | |
| 257 * helper function to hide the search marks again | |
| 258 */ | |
| 259 hideSearchWords : function() { | |
| 260 $('#searchbox .highlight-link').fadeOut(300); | |
| 261 $('span.highlighted').removeClass('highlighted'); | |
| 262 }, | |
| 263 | |
| 264 /** | |
| 265 * make the url absolute | |
| 266 */ | |
| 267 makeURL : function(relativeURL) { | |
| 268 return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; | |
| 269 }, | |
| 270 | |
| 271 /** | |
| 272 * get the current relative url | |
| 273 */ | |
| 274 getCurrentURL : function() { | |
| 275 var path = document.location.pathname; | |
| 276 var parts = path.split(/\//); | |
| 277 $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { | |
| 278 if (this === '..') | |
| 279 parts.pop(); | |
| 280 }); | |
| 281 var url = parts.join('/'); | |
| 282 return path.substring(url.lastIndexOf('/') + 1, path.length - 1); | |
| 283 }, | |
| 284 | |
| 285 initOnKeyListeners: function() { | |
| 286 $(document).keydown(function(event) { | |
| 287 var activeElementType = document.activeElement.tagName; | |
| 288 // don't navigate when in search box, textarea, dropdown or button | |
| 289 if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' | |
| 290 && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey | |
| 291 && !event.shiftKey) { | |
| 292 switch (event.keyCode) { | |
| 293 case 37: // left | |
| 294 var prevHref = $('link[rel="prev"]').prop('href'); | |
| 295 if (prevHref) { | |
| 296 window.location.href = prevHref; | |
| 297 return false; | |
| 298 } | |
| 299 case 39: // right | |
| 300 var nextHref = $('link[rel="next"]').prop('href'); | |
| 301 if (nextHref) { | |
| 302 window.location.href = nextHref; | |
| 303 return false; | |
| 304 } | |
| 305 } | |
| 306 } | |
| 307 }); | |
| 308 } | |
| 309 }; | |
| 310 | |
| 311 // quick alias for translations | |
| 312 _ = Documentation.gettext; | |
| 313 | |
| 314 $(document).ready(function() { | |
| 315 Documentation.init(); | |
| 316 }); |
