diff options
Diffstat (limited to 'site/static/js/docs.js')
-rw-r--r-- | site/static/js/docs.js | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/site/static/js/docs.js b/site/static/js/docs.js new file mode 100644 index 0000000..1309525 --- /dev/null +++ b/site/static/js/docs.js @@ -0,0 +1,142 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Platforms we have logos for and their formatted titles. Used for +// converting "mark" elements to logos +var platforms = { + 'android': 'Android', + 'ios': 'iOS', + 'windows': 'Windows', + 'ubuntu': 'Ubuntu', + 'blackberry': 'Blackberry', + 'fireos': 'FireOS', + 'firefoxos': 'FirefoxOS', + 'webos': 'webOS', + 'osx': 'OS X', + 'browser': 'Browser' +}; + +$(document).ready(function () { + + var HEADER_OFFSET = 56; // in pixels + var TOC_TOP_OFFSET = HEADER_OFFSET + 55; + + // if this page's ToC entry can be found, scroll the ToC to it + var thisPageEntry = $(".this-page"); + if (thisPageEntry.length > 0) { + $(".site-toc-container").scrollTop(thisPageEntry.first().offset().top - TOC_TOP_OFFSET); + } + + function slugifyLikeGitHub(originalText) { + + var text = originalText; + + // convert to lowercase + text = text.toLowerCase(); + + // replace spaces with dashes + text = text.replace(/ /g, '-'); + + // remove unaccepted characters + // NOTE: + // a better regex would have been /[^\d\s\w-_]/ug, but the 'u' flag + // (Unicode) is not supported in some browsers, and we support + // many languages that use Unicode characters + text = text.replace(/[\[\]\(\)\;\:\=\+\?\!\.\,\{\}\\\/\>\<]/g, ''); + + // trim remaining whitespace + text = text.trim(); + + return text; + } + + function getIdForHeading(heading) { + if (heading.id) { + return heading.id; + } else if (heading.name) { + return heading.name; + } else { + return slugifyLikeGitHub(heading.innerText); + } + } + + function permalinkTo(id) { + var anchor = document.createElement("a"); + anchor.className = "header-link"; + anchor.href = "#" + id; + anchor.innerHTML = "<i class=\"glyphicon glyphicon-link\"></i>"; + return anchor; + } + + function anchorFor(id) { + var anchor = document.createElement("a"); + anchor.className = "fragment-anchor"; + anchor.id = id; + return anchor; + } + + // go through all headings in the content and add some links + $('#page-toc-source h1, #page-toc-source h2, #page-toc-source h3, #page-toc-source h4, #page-toc-source h5, #page-toc-source h6') + .each(function (i, heading) { + + headingId = getIdForHeading(heading); + + // add an anchor for linking to the heading + // NOTE: + // we could have set the ID on the heading itself but we didn't + // because the <a> has some extra CSS that floats it above the + // heading and makes it easier to see when linked + $(heading).before(anchorFor(headingId)) + + // add a permalink to all but the first heading + if (i > 0) { + $(heading).append(permalinkTo(headingId)); + } + }); + + // Table of Contents + $('#page-toc').toc({ + 'selectors': 'h1,h2', // elements to use as headings + 'container': '#page-toc-source', // element to find all selectors in + 'prefix': '', // prefix for anchor tags and class names + 'onHighlight': function(el) {}, // called when a new section is highlighted + 'highlightOnScroll': true, // add class to heading that is currently in focus + 'highlightOffset': 100, // offset to trigger the next headline + 'anchorName': function(i, heading, prefix) { // custom function for anchor name + return getIdForHeading(heading); + }, + 'headerText': function(i, heading, $heading) { // custom function building the header-item text + return $heading.text(); + }, + 'itemClass': function(i, heading, $heading, prefix) { // custom function for item class + + // don't assign any special classes to the toc entry itself + return ''; + } + }); + + $('mark').each(function(index, element) { + var platform = element.innerText.toLowerCase(); + platform = platform.replace(/ /g, ''); + if (platforms[platform]) { + $(element).addClass('logo'); + $(element).addClass(platform); + $(element).attr('title', platforms[platform]); + element.innerText = ''; + } + }); +}); |