[pdal] 10/12: Add missing sources for minified JS used in documentation.
Bas Couwenberg
sebastic at debian.org
Sat Aug 27 13:10:11 UTC 2016
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master-git
in repository pdal.
commit 191fbce2d1e3af739338352ec53fb74583150ca1
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Sat Apr 30 21:04:20 2016 +0200
Add missing sources for minified JS used in documentation.
---
debian/changelog | 1 +
debian/missing-sources/classList.js | 240 ++++++
debian/missing-sources/head.js | 1184 +++++++++++++++++++++++++++++
debian/missing-sources/highlight.js | 784 ++++++++++++++++++++
debian/missing-sources/modernizr.js | 1393 +++++++++++++++++++++++++++++++++++
debian/missing-sources/theme.js | 185 +++++
6 files changed, 3787 insertions(+)
diff --git a/debian/changelog b/debian/changelog
index 9a60028..58fb8cc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -10,6 +10,7 @@ pdal (1.2.0+git20160429-cbe9b08-1) UNRELEASED; urgency=medium
* Add patch to not require sphinxcontrib.bibtex extension (not packaged).
* Add patch to fix websocketpp detection for greyhound plugin.
* Use libjs-mathjax package for sphinx documentation.
+ * Add missing sources for minified JS used in documentation.
-- Bas Couwenberg <sebastic at debian.org> Sat, 30 Apr 2016 15:30:38 +0200
diff --git a/debian/missing-sources/classList.js b/debian/missing-sources/classList.js
new file mode 100644
index 0000000..0693237
--- /dev/null
+++ b/debian/missing-sources/classList.js
@@ -0,0 +1,240 @@
+/*
+ * classList.js: Cross-browser full element.classList implementation.
+ * 1.1.20150312
+ *
+ * By Eli Grey, http://eligrey.com
+ * License: Dedicated to the public domain.
+ * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md
+ */
+
+/*global self, document, DOMException */
+
+/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */
+
+if ("document" in self) {
+
+// Full polyfill for browsers with no classList support
+// Including IE < Edge missing SVGElement.classList
+if (!("classList" in document.createElement("_"))
+ || document.createElementNS && !("classList" in document.createElementNS("http://www.w3.org/2000/svg","g"))) {
+
+(function (view) {
+
+"use strict";
+
+if (!('Element' in view)) return;
+
+var
+ classListProp = "classList"
+ , protoProp = "prototype"
+ , elemCtrProto = view.Element[protoProp]
+ , objCtr = Object
+ , strTrim = String[protoProp].trim || function () {
+ return this.replace(/^\s+|\s+$/g, "");
+ }
+ , arrIndexOf = Array[protoProp].indexOf || function (item) {
+ var
+ i = 0
+ , len = this.length
+ ;
+ for (; i < len; i++) {
+ if (i in this && this[i] === item) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ // Vendors: please allow content code to instantiate DOMExceptions
+ , DOMEx = function (type, message) {
+ this.name = type;
+ this.code = DOMException[type];
+ this.message = message;
+ }
+ , checkTokenAndGetIndex = function (classList, token) {
+ if (token === "") {
+ throw new DOMEx(
+ "SYNTAX_ERR"
+ , "An invalid or illegal string was specified"
+ );
+ }
+ if (/\s/.test(token)) {
+ throw new DOMEx(
+ "INVALID_CHARACTER_ERR"
+ , "String contains an invalid character"
+ );
+ }
+ return arrIndexOf.call(classList, token);
+ }
+ , ClassList = function (elem) {
+ var
+ trimmedClasses = strTrim.call(elem.getAttribute("class") || "")
+ , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
+ , i = 0
+ , len = classes.length
+ ;
+ for (; i < len; i++) {
+ this.push(classes[i]);
+ }
+ this._updateClassName = function () {
+ elem.setAttribute("class", this.toString());
+ };
+ }
+ , classListProto = ClassList[protoProp] = []
+ , classListGetter = function () {
+ return new ClassList(this);
+ }
+;
+// Most DOMException implementations don't allow calling DOMException's toString()
+// on non-DOMExceptions. Error's toString() is sufficient here.
+DOMEx[protoProp] = Error[protoProp];
+classListProto.item = function (i) {
+ return this[i] || null;
+};
+classListProto.contains = function (token) {
+ token += "";
+ return checkTokenAndGetIndex(this, token) !== -1;
+};
+classListProto.add = function () {
+ var
+ tokens = arguments
+ , i = 0
+ , l = tokens.length
+ , token
+ , updated = false
+ ;
+ do {
+ token = tokens[i] + "";
+ if (checkTokenAndGetIndex(this, token) === -1) {
+ this.push(token);
+ updated = true;
+ }
+ }
+ while (++i < l);
+
+ if (updated) {
+ this._updateClassName();
+ }
+};
+classListProto.remove = function () {
+ var
+ tokens = arguments
+ , i = 0
+ , l = tokens.length
+ , token
+ , updated = false
+ , index
+ ;
+ do {
+ token = tokens[i] + "";
+ index = checkTokenAndGetIndex(this, token);
+ while (index !== -1) {
+ this.splice(index, 1);
+ updated = true;
+ index = checkTokenAndGetIndex(this, token);
+ }
+ }
+ while (++i < l);
+
+ if (updated) {
+ this._updateClassName();
+ }
+};
+classListProto.toggle = function (token, force) {
+ token += "";
+
+ var
+ result = this.contains(token)
+ , method = result ?
+ force !== true && "remove"
+ :
+ force !== false && "add"
+ ;
+
+ if (method) {
+ this[method](token);
+ }
+
+ if (force === true || force === false) {
+ return force;
+ } else {
+ return !result;
+ }
+};
+classListProto.toString = function () {
+ return this.join(" ");
+};
+
+if (objCtr.defineProperty) {
+ var classListPropDesc = {
+ get: classListGetter
+ , enumerable: true
+ , configurable: true
+ };
+ try {
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+ } catch (ex) { // IE 8 doesn't support enumerable:true
+ if (ex.number === -0x7FF5EC54) {
+ classListPropDesc.enumerable = false;
+ objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
+ }
+ }
+} else if (objCtr[protoProp].__defineGetter__) {
+ elemCtrProto.__defineGetter__(classListProp, classListGetter);
+}
+
+}(self));
+
+} else {
+// There is full or partial native classList support, so just check if we need
+// to normalize the add/remove and toggle APIs.
+
+(function () {
+ "use strict";
+
+ var testElement = document.createElement("_");
+
+ testElement.classList.add("c1", "c2");
+
+ // Polyfill for IE 10/11 and Firefox <26, where classList.add and
+ // classList.remove exist but support only one argument at a time.
+ if (!testElement.classList.contains("c2")) {
+ var createMethod = function(method) {
+ var original = DOMTokenList.prototype[method];
+
+ DOMTokenList.prototype[method] = function(token) {
+ var i, len = arguments.length;
+
+ for (i = 0; i < len; i++) {
+ token = arguments[i];
+ original.call(this, token);
+ }
+ };
+ };
+ createMethod('add');
+ createMethod('remove');
+ }
+
+ testElement.classList.toggle("c3", false);
+
+ // Polyfill for IE 10 and Firefox <24, where classList.toggle does not
+ // support the second argument.
+ if (testElement.classList.contains("c3")) {
+ var _toggle = DOMTokenList.prototype.toggle;
+
+ DOMTokenList.prototype.toggle = function(token, force) {
+ if (1 in arguments && !this.contains(token) === !force) {
+ return force;
+ } else {
+ return _toggle.call(this, token);
+ }
+ };
+
+ }
+
+ testElement = null;
+}());
+
+}
+
+}
+
diff --git a/debian/missing-sources/head.js b/debian/missing-sources/head.js
new file mode 100644
index 0000000..ccde51b
--- /dev/null
+++ b/debian/missing-sources/head.js
@@ -0,0 +1,1184 @@
+///#source 1 1 /src/1.0.0/core.js
+/*! head.core - v1.0.2 */
+/*
+ * HeadJS The only script in your <HEAD>
+ * Author Tero Piirainen (tipiirai)
+ * Maintainer Robert Hoffmann (itechnology)
+ * License MIT / http://bit.ly/mit-license
+ * WebSite http://headjs.com
+ */
+(function(win, undefined) {
+ "use strict";
+
+ // gt, gte, lt, lte, eq breakpoints would have been more simple to write as ['gt','gte','lt','lte','eq']
+ // but then we would have had to loop over the collection on each resize() event,
+ // a simple object with a direct access to true/false is therefore much more efficient
+ var doc = win.document,
+ nav = win.navigator,
+ loc = win.location,
+ html = doc.documentElement,
+ klass = [],
+ conf = {
+ screens : [240, 320, 480, 640, 768, 800, 1024, 1280, 1440, 1680, 1920],
+ screensCss: { "gt": true, "gte": false, "lt": true, "lte": false, "eq": false },
+ browsers : [
+ { ie: { min: 6, max: 11 } }
+ //,{ chrome : { min: 8, max: 33 } }
+ //,{ ff : { min: 3, max: 26 } }
+ //,{ ios : { min: 3, max: 7 } }
+ //,{ android: { min: 2, max: 4 } }
+ //,{ webkit : { min: 9, max: 12 } }
+ //,{ opera : { min: 9, max: 12 } }
+ ],
+ browserCss: { "gt": true, "gte": false, "lt": true, "lte": false, "eq": true },
+ html5 : true,
+ page : "-page",
+ section : "-section",
+ head : "head"
+ };
+
+ if (win.head_conf) {
+ for (var item in win.head_conf) {
+ if (win.head_conf[item] !== undefined) {
+ conf[item] = win.head_conf[item];
+ }
+ }
+ }
+
+ function pushClass(name) {
+ klass[klass.length] = name;
+ }
+
+ function removeClass(name) {
+ // need to test for both space and no space
+ // https://github.com/headjs/headjs/issues/270
+ // https://github.com/headjs/headjs/issues/226
+ var re = new RegExp(" ?\\b" + name + "\\b");
+ html.className = html.className.replace(re, "");
+ }
+
+ function each(arr, fn) {
+ for (var i = 0, l = arr.length; i < l; i++) {
+ fn.call(arr, arr[i], i);
+ }
+ }
+
+ // API
+ var api = win[conf.head] = function() {
+ api.ready.apply(null, arguments);
+ };
+
+ api.feature = function(key, enabled, queue) {
+
+ // internal: apply all classes
+ if (!key) {
+ html.className += " " + klass.join(" ");
+ klass = [];
+
+ return api;
+ }
+
+ if (Object.prototype.toString.call(enabled) === "[object Function]") {
+ enabled = enabled.call();
+ }
+
+ pushClass((enabled ? "" : "no-") + key);
+ api[key] = !!enabled;
+
+ // apply class to HTML element
+ if (!queue) {
+ removeClass("no-" + key);
+ removeClass(key);
+ api.feature();
+ }
+
+ return api;
+ };
+
+ // no queue here, so we can remove any eventual pre-existing no-js class
+ api.feature("js", true);
+
+ // browser type & version
+ var ua = nav.userAgent.toLowerCase(),
+ mobile = /mobile|android|kindle|silk|midp|phone|(windows .+arm|touch)/.test(ua);
+
+ // useful for enabling/disabling feature (we can consider a desktop navigator to have more cpu/gpu power)
+ api.feature("mobile" , mobile , true);
+ api.feature("desktop", !mobile, true);
+
+ // http://www.zytrax.com/tech/web/browser_ids.htm
+ // http://www.zytrax.com/tech/web/mobile_ids.html
+ ua = /(chrome|firefox)[ \/]([\w.]+)/.exec(ua) || // Chrome & Firefox
+ /(iphone|ipad|ipod)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Mobile IOS
+ /(android)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Mobile Webkit
+ /(webkit|opera)(?:.*version)?[ \/]([\w.]+)/.exec(ua) || // Safari & Opera
+ /(msie) ([\w.]+)/.exec(ua) ||
+ /(trident).+rv:(\w.)+/.exec(ua) || [];
+
+ var browser = ua[1],
+ version = parseFloat(ua[2]);
+
+ switch (browser) {
+ case "msie":
+ case "trident":
+ browser = "ie";
+ version = doc.documentMode || version;
+ break;
+
+ case "firefox":
+ browser = "ff";
+ break;
+
+ case "ipod":
+ case "ipad":
+ case "iphone":
+ browser = "ios";
+ break;
+
+ case "webkit":
+ browser = "safari";
+ break;
+ }
+
+ // Browser vendor and version
+ api.browser = {
+ name: browser,
+ version: version
+ };
+ api.browser[browser] = true;
+
+ for (var i = 0, l = conf.browsers.length; i < l; i++) {
+ for (var key in conf.browsers[i]) {
+ if (browser === key) {
+ pushClass(key);
+
+ var min = conf.browsers[i][key].min;
+ var max = conf.browsers[i][key].max;
+
+ for (var v = min; v <= max; v++) {
+ if (version > v) {
+ if (conf.browserCss.gt) {
+ pushClass("gt-" + key + v);
+ }
+
+ if (conf.browserCss.gte) {
+ pushClass("gte-" + key + v);
+ }
+ } else if (version < v) {
+ if (conf.browserCss.lt) {
+ pushClass("lt-" + key + v);
+ }
+
+ if (conf.browserCss.lte) {
+ pushClass("lte-" + key + v);
+ }
+ } else if (version === v) {
+ if (conf.browserCss.lte) {
+ pushClass("lte-" + key + v);
+ }
+
+ if (conf.browserCss.eq) {
+ pushClass("eq-" + key + v);
+ }
+
+ if (conf.browserCss.gte) {
+ pushClass("gte-" + key + v);
+ }
+ }
+ }
+ } else {
+ pushClass("no-" + key);
+ }
+ }
+ }
+
+ pushClass(browser);
+ pushClass(browser + parseInt(version, 10));
+
+ // IE lt9 specific
+ if (conf.html5 && browser === "ie" && version < 9) {
+ // HTML5 support : you still need to add html5 css initialization styles to your site
+ // See: assets/html5.css
+ each("abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|progress|section|summary|time|video".split("|"), function(el) {
+ doc.createElement(el);
+ });
+ }
+
+ // CSS "router"
+ each(loc.pathname.split("/"), function(el, i) {
+ if (this.length > 2 && this[i + 1] !== undefined) {
+ if (i) {
+ pushClass(this.slice(i, i + 1).join("-").toLowerCase() + conf.section);
+ }
+ } else {
+ // pageId
+ var id = el || "index", index = id.indexOf(".");
+ if (index > 0) {
+ id = id.substring(0, index);
+ }
+
+ html.id = id.toLowerCase() + conf.page;
+
+ // on root?
+ if (!i) {
+ pushClass("root" + conf.section);
+ }
+ }
+ });
+
+ // basic screen info
+ api.screen = {
+ height: win.screen.height,
+ width : win.screen.width
+ };
+
+ // viewport resolutions: w-100, lt-480, lt-1024 ...
+ function screenSize() {
+ // remove earlier sizes
+ html.className = html.className.replace(/ (w-|eq-|gt-|gte-|lt-|lte-|portrait|no-portrait|landscape|no-landscape)\d+/g, "");
+
+ // Viewport width
+ var iw = win.innerWidth || html.clientWidth,
+ ow = win.outerWidth || win.screen.width;
+
+ api.screen.innerWidth = iw;
+ api.screen.outerWidth = ow;
+
+ // for debugging purposes, not really useful for anything else
+ pushClass("w-" + iw);
+
+ each(conf.screens, function(width) {
+ if (iw > width) {
+ if (conf.screensCss.gt) {
+ pushClass("gt-" + width);
+ }
+
+ if (conf.screensCss.gte) {
+ pushClass("gte-" + width);
+ }
+ } else if (iw < width) {
+ if (conf.screensCss.lt) {
+ pushClass("lt-" + width);
+ }
+
+ if (conf.screensCss.lte) {
+ pushClass("lte-" + width);
+ }
+ } else if (iw === width) {
+ if (conf.screensCss.lte) {
+ pushClass("lte-" + width);
+ }
+
+ if (conf.screensCss.eq) {
+ pushClass("e-q" + width);
+ }
+
+ if (conf.screensCss.gte) {
+ pushClass("gte-" + width);
+ }
+ }
+ });
+
+ // Viewport height
+ var ih = win.innerHeight || html.clientHeight,
+ oh = win.outerHeight || win.screen.height;
+
+ api.screen.innerHeight = ih;
+ api.screen.outerHeight = oh;
+
+ // no need for onChange event to detect this
+ api.feature("portrait" , (ih > iw));
+ api.feature("landscape", (ih < iw));
+ }
+
+ screenSize();
+
+ // Throttle navigators from triggering too many resize events
+ var resizeId = 0;
+
+ function onResize() {
+ win.clearTimeout(resizeId);
+ resizeId = win.setTimeout(screenSize, 50);
+ }
+
+ // Manually attach, as to not overwrite existing handler
+ if (win.addEventListener) {
+ win.addEventListener("resize", onResize, false);
+
+ } else {
+ // IE8 and less
+ win.attachEvent("onresize", onResize);
+ }
+}(window));
+///#source 1 1 /src/1.0.0/css3.js
+/*! head.css3 - v1.0.0 */
+/*
+ * HeadJS The only script in your <HEAD>
+ * Author Tero Piirainen (tipiirai)
+ * Maintainer Robert Hoffmann (itechnology)
+ * License MIT / http://bit.ly/mit-license
+ * WebSite http://headjs.com
+ */
+(function (win, undefined) {
+ "use strict";
+
+ var doc = win.document,
+ /*
+ To add a new test:
+
+ head.feature("video", function() {
+ var tag = document.createElement('video');
+ return !!tag.canPlayType;
+ });
+
+ Good place to grab more tests
+
+ https://github.com/Modernizr/Modernizr/blob/master/modernizr.js
+ */
+
+ /* CSS modernizer */
+ el = doc.createElement("i"),
+ style = el.style,
+ prefs = " -o- -moz- -ms- -webkit- -khtml- ".split(" "),
+ domPrefs = "Webkit Moz O ms Khtml".split(" "),
+ headVar = win.head_conf && win.head_conf.head || "head",
+ api = win[headVar];
+
+ // Thanks Paul Irish!
+
+ function testProps(props) {
+ for (var i in props) {
+ if (style[props[i]] !== undefined) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+
+ function testAll(prop) {
+ var camel = prop.charAt(0).toUpperCase() + prop.substr(1),
+ props = (prop + " " + domPrefs.join(camel + " ") + camel).split(" ");
+
+ return !!testProps(props);
+ }
+
+ var tests = {
+ // should we seperate linear/radial ?
+ // seems like some browsers need a test for prefix http://caniuse.com/#feat=css-gradients
+ gradient: function () {
+ var s1 = "background-image:",
+ s2 = "gradient(linear,left top,right bottom,from(#9f9),to(#fff));",
+ s3 = "linear-gradient(left top,#eee,#fff);";
+
+ style.cssText = (s1 + prefs.join(s2 + s1) + prefs.join(s3 + s1)).slice(0, -s1.length);
+ return !!style.backgroundImage;
+ },
+
+ rgba: function () {
+ style.cssText = "background-color:rgba(0,0,0,0.5)";
+ return !!style.backgroundColor;
+ },
+
+ opacity: function () {
+ return el.style.opacity === "";
+ },
+
+ textshadow: function () {
+ return style.textShadow === "";
+ },
+
+ multiplebgs: function () {
+ style.cssText = "background:url(https://),url(https://),red url(https://)";
+
+ // If the UA supports multiple backgrounds, there should be three occurrences
+ // of the string "url(" in the return value for elemStyle.background
+ var result = (style.background || "").match(/url/g);
+
+ return Object.prototype.toString.call(result) === "[object Array]" && result.length === 3;
+ },
+
+ boxshadow: function () {
+ return testAll("boxShadow");
+ },
+
+ borderimage: function () {
+ return testAll("borderImage");
+ },
+
+ borderradius: function () {
+ return testAll("borderRadius");
+ },
+
+ cssreflections: function () {
+ return testAll("boxReflect");
+ },
+
+ csstransforms: function () {
+ return testAll("transform");
+ },
+
+ csstransitions: function () {
+ return testAll("transition");
+ },
+ touch: function () {
+ return "ontouchstart" in win;
+ },
+ retina: function () {
+ return (win.devicePixelRatio > 1);
+ },
+
+ /*
+ font-face support. Uses browser sniffing but is synchronous.
+ http://paulirish.com/2009/font-face-feature-detection/
+ */
+ fontface: function () {
+ var browser = api.browser.name, version = api.browser.version;
+
+ switch (browser) {
+ case "ie":
+ return version >= 9;
+
+ case "chrome":
+ return version >= 13;
+
+ case "ff":
+ return version >= 6;
+
+ case "ios":
+ return version >= 5;
+
+ case "android":
+ return false;
+
+ case "webkit":
+ return version >= 5.1;
+
+ case "opera":
+ return version >= 10;
+
+ default:
+ return false;
+ }
+ }
+ };
+
+ // queue features
+ for (var key in tests) {
+ if (tests[key]) {
+ api.feature(key, tests[key].call(), true);
+ }
+ }
+
+ // enable features at once
+ api.feature();
+
+}(window));
+///#source 1 1 /src/1.0.0/load.js
+/*! head.load - v1.0.3 */
+/*
+ * HeadJS The only script in your <HEAD>
+ * Author Tero Piirainen (tipiirai)
+ * Maintainer Robert Hoffmann (itechnology)
+ * License MIT / http://bit.ly/mit-license
+ * WebSite http://headjs.com
+ */
+(function (win, undefined) {
+ "use strict";
+
+ //#region variables
+ var doc = win.document,
+ domWaiters = [],
+ handlers = {}, // user functions waiting for events
+ assets = {}, // loadable items in various states
+ isAsync = "async" in doc.createElement("script") || "MozAppearance" in doc.documentElement.style || win.opera,
+ isDomReady,
+
+ /*** public API ***/
+ headVar = win.head_conf && win.head_conf.head || "head",
+ api = win[headVar] = (win[headVar] || function () { api.ready.apply(null, arguments); }),
+
+ // states
+ PRELOADING = 1,
+ PRELOADED = 2,
+ LOADING = 3,
+ LOADED = 4;
+ //#endregion
+
+ //#region PRIVATE functions
+
+ //#region Helper functions
+ function noop() {
+ // does nothing
+ }
+
+ function each(arr, callback) {
+ if (!arr) {
+ return;
+ }
+
+ // arguments special type
+ if (typeof arr === "object") {
+ arr = [].slice.call(arr);
+ }
+
+ // do the job
+ for (var i = 0, l = arr.length; i < l; i++) {
+ callback.call(arr, arr[i], i);
+ }
+ }
+
+ /* A must read: http://bonsaiden.github.com/JavaScript-Garden
+ ************************************************************/
+ function is(type, obj) {
+ var clas = Object.prototype.toString.call(obj).slice(8, -1);
+ return obj !== undefined && obj !== null && clas === type;
+ }
+
+ function isFunction(item) {
+ return is("Function", item);
+ }
+
+ function isArray(item) {
+ return is("Array", item);
+ }
+
+ function toLabel(url) {
+ ///<summary>Converts a url to a file label</summary>
+ var items = url.split("/"),
+ name = items[items.length - 1],
+ i = name.indexOf("?");
+
+ return i !== -1 ? name.substring(0, i) : name;
+ }
+
+ // INFO: this look like a "im triggering callbacks all over the place, but only wanna run it one time function" ..should try to make everything work without it if possible
+ // INFO: Even better. Look into promises/defered's like jQuery is doing
+ function one(callback) {
+ ///<summary>Execute a callback only once</summary>
+ callback = callback || noop;
+
+ if (callback._done) {
+ return;
+ }
+
+ callback();
+ callback._done = 1;
+ }
+ //#endregion
+
+ function conditional(test, success, failure, callback) {
+ ///<summary>
+ /// INFO: use cases:
+ /// head.test(condition, null , "file.NOk" , callback);
+ /// head.test(condition, "fileOk.js", null , callback);
+ /// head.test(condition, "fileOk.js", "file.NOk" , callback);
+ /// head.test(condition, "fileOk.js", ["file.NOk", "file.NOk"], callback);
+ /// head.test({
+ /// test : condition,
+ /// success : [{ label1: "file1Ok.js" }, { label2: "file2Ok.js" }],
+ /// failure : [{ label1: "file1NOk.js" }, { label2: "file2NOk.js" }],
+ /// callback: callback
+ /// );
+ /// head.test({
+ /// test : condition,
+ /// success : ["file1Ok.js" , "file2Ok.js"],
+ /// failure : ["file1NOk.js", "file2NOk.js"],
+ /// callback: callback
+ /// );
+ ///</summary>
+ var obj = (typeof test === "object") ? test : {
+ test: test,
+ success: !!success ? isArray(success) ? success : [success] : false,
+ failure: !!failure ? isArray(failure) ? failure : [failure] : false,
+ callback: callback || noop
+ };
+
+ // Test Passed ?
+ var passed = !!obj.test;
+
+ // Do we have a success case
+ if (passed && !!obj.success) {
+ obj.success.push(obj.callback);
+ api.load.apply(null, obj.success);
+ }
+ // Do we have a fail case
+ else if (!passed && !!obj.failure) {
+ obj.failure.push(obj.callback);
+ api.load.apply(null, obj.failure);
+ }
+ else {
+ callback();
+ }
+
+ return api;
+ }
+
+ function getAsset(item) {
+ ///<summary>
+ /// Assets are in the form of
+ /// {
+ /// name : label,
+ /// url : url,
+ /// state: state
+ /// }
+ ///</summary>
+ var asset = {};
+
+ if (typeof item === "object") {
+ for (var label in item) {
+ if (!!item[label]) {
+ asset = {
+ name: label,
+ url : item[label]
+ };
+ }
+ }
+ }
+ else {
+ asset = {
+ name: toLabel(item),
+ url : item
+ };
+ }
+
+ // is the item already existant
+ var existing = assets[asset.name];
+ if (existing && existing.url === asset.url) {
+ return existing;
+ }
+
+ assets[asset.name] = asset;
+ return asset;
+ }
+
+ function allLoaded(items) {
+ items = items || assets;
+
+ for (var name in items) {
+ if (items.hasOwnProperty(name) && items[name].state !== LOADED) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function onPreload(asset) {
+ asset.state = PRELOADED;
+
+ each(asset.onpreload, function (afterPreload) {
+ afterPreload.call();
+ });
+ }
+
+ function preLoad(asset, callback) {
+ if (asset.state === undefined) {
+
+ asset.state = PRELOADING;
+ asset.onpreload = [];
+
+ loadAsset({ url: asset.url, type: "cache" }, function () {
+ onPreload(asset);
+ });
+ }
+ }
+
+ function apiLoadHack() {
+ /// <summary>preload with text/cache hack
+ ///
+ /// head.load("http://domain.com/file.js","http://domain.com/file.js", callBack)
+ /// head.load(["http://domain.com/file.js","http://domain.com/file.js"], callBack)
+ /// head.load({ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }, callBack)
+ /// head.load([{ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }], callBack)
+ /// </summary>
+ var args = arguments,
+ callback = args[args.length - 1],
+ rest = [].slice.call(args, 1),
+ next = rest[0];
+
+ if (!isFunction(callback)) {
+ callback = null;
+ }
+
+ // if array, repush as args
+ if (isArray(args[0])) {
+ args[0].push(callback);
+ api.load.apply(null, args[0]);
+
+ return api;
+ }
+
+ // multiple arguments
+ if (!!next) {
+ /* Preload with text/cache hack (not good!)
+ * http://blog.getify.com/on-script-loaders/
+ * http://www.nczonline.net/blog/2010/12/21/thoughts-on-script-loaders/
+ * If caching is not configured correctly on the server, then items could load twice !
+ *************************************************************************************/
+ each(rest, function (item) {
+ // item is not a callback or empty string
+ if (!isFunction(item) && !!item) {
+ preLoad(getAsset(item));
+ }
+ });
+
+ // execute
+ load(getAsset(args[0]), isFunction(next) ? next : function () {
+ api.load.apply(null, rest);
+ });
+ }
+ else {
+ // single item
+ load(getAsset(args[0]));
+ }
+
+ return api;
+ }
+
+ function apiLoadAsync() {
+ ///<summary>
+ /// simply load and let browser take care of ordering
+ ///
+ /// head.load("http://domain.com/file.js","http://domain.com/file.js", callBack)
+ /// head.load(["http://domain.com/file.js","http://domain.com/file.js"], callBack)
+ /// head.load({ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }, callBack)
+ /// head.load([{ label1: "http://domain.com/file.js" }, { label2: "http://domain.com/file.js" }], callBack)
+ ///</summary>
+ var args = arguments,
+ callback = args[args.length - 1],
+ items = {};
+
+ if (!isFunction(callback)) {
+ callback = null;
+ }
+
+ // if array, repush as args
+ if (isArray(args[0])) {
+ args[0].push(callback);
+ api.load.apply(null, args[0]);
+
+ return api;
+ }
+
+ // JRH 262#issuecomment-26288601
+ // First populate the items array.
+ // When allLoaded is called, all items will be populated.
+ // Issue when lazy loaded, the callback can execute early.
+ each(args, function (item, i) {
+ if (item !== callback) {
+ item = getAsset(item);
+ items[item.name] = item;
+ }
+ });
+
+ each(args, function (item, i) {
+ if (item !== callback) {
+ item = getAsset(item);
+
+ load(item, function () {
+ if (allLoaded(items)) {
+ one(callback);
+ }
+ });
+ }
+ });
+
+ return api;
+ }
+
+ function load(asset, callback) {
+ ///<summary>Used with normal loading logic</summary>
+ callback = callback || noop;
+
+ if (asset.state === LOADED) {
+ callback();
+ return;
+ }
+
+ // INFO: why would we trigger a ready event when its not really loaded yet ?
+ if (asset.state === LOADING) {
+ api.ready(asset.name, callback);
+ return;
+ }
+
+ if (asset.state === PRELOADING) {
+ asset.onpreload.push(function () {
+ load(asset, callback);
+ });
+ return;
+ }
+
+ asset.state = LOADING;
+
+ loadAsset(asset, function () {
+ asset.state = LOADED;
+
+ callback();
+
+ // handlers for this asset
+ each(handlers[asset.name], function (fn) {
+ one(fn);
+ });
+
+ // dom is ready & no assets are queued for loading
+ // INFO: shouldn't we be doing the same test above ?
+ if (isDomReady && allLoaded()) {
+ each(handlers.ALL, function (fn) {
+ one(fn);
+ });
+ }
+ });
+ }
+
+ function getExtension(url) {
+ url = url || "";
+
+ var items = url.split("?")[0].split(".");
+ return items[items.length-1].toLowerCase();
+ }
+
+ /* Parts inspired from: https://github.com/cujojs/curl
+ ******************************************************/
+ function loadAsset(asset, callback) {
+ callback = callback || noop;
+
+ function error(event) {
+ event = event || win.event;
+
+ // release event listeners
+ ele.onload = ele.onreadystatechange = ele.onerror = null;
+
+ // do callback
+ callback();
+
+ // need some more detailed error handling here
+ }
+
+ function process(event) {
+ event = event || win.event;
+
+ // IE 7/8 (2 events on 1st load)
+ // 1) event.type = readystatechange, s.readyState = loading
+ // 2) event.type = readystatechange, s.readyState = loaded
+
+ // IE 7/8 (1 event on reload)
+ // 1) event.type = readystatechange, s.readyState = complete
+
+ // event.type === 'readystatechange' && /loaded|complete/.test(s.readyState)
+
+ // IE 9 (3 events on 1st load)
+ // 1) event.type = readystatechange, s.readyState = loading
+ // 2) event.type = readystatechange, s.readyState = loaded
+ // 3) event.type = load , s.readyState = loaded
+
+ // IE 9 (2 events on reload)
+ // 1) event.type = readystatechange, s.readyState = complete
+ // 2) event.type = load , s.readyState = complete
+
+ // event.type === 'load' && /loaded|complete/.test(s.readyState)
+ // event.type === 'readystatechange' && /loaded|complete/.test(s.readyState)
+
+ // IE 10 (3 events on 1st load)
+ // 1) event.type = readystatechange, s.readyState = loading
+ // 2) event.type = load , s.readyState = complete
+ // 3) event.type = readystatechange, s.readyState = loaded
+
+ // IE 10 (3 events on reload)
+ // 1) event.type = readystatechange, s.readyState = loaded
+ // 2) event.type = load , s.readyState = complete
+ // 3) event.type = readystatechange, s.readyState = complete
+
+ // event.type === 'load' && /loaded|complete/.test(s.readyState)
+ // event.type === 'readystatechange' && /complete/.test(s.readyState)
+
+ // Other Browsers (1 event on 1st load)
+ // 1) event.type = load, s.readyState = undefined
+
+ // Other Browsers (1 event on reload)
+ // 1) event.type = load, s.readyState = undefined
+
+ // event.type == 'load' && s.readyState = undefined
+
+ // !doc.documentMode is for IE6/7, IE8+ have documentMode
+ if (event.type === "load" || (/loaded|complete/.test(ele.readyState) && (!doc.documentMode || doc.documentMode < 9))) {
+ // remove timeouts
+ win.clearTimeout(asset.errorTimeout);
+ win.clearTimeout(asset.cssTimeout);
+
+ // release event listeners
+ ele.onload = ele.onreadystatechange = ele.onerror = null;
+
+ // do callback
+ callback();
+ }
+ }
+
+ function isCssLoaded() {
+ // should we test again ? 20 retries = 5secs ..after that, the callback will be triggered by the error handler at 7secs
+ if (asset.state !== LOADED && asset.cssRetries <= 20) {
+
+ // loop through stylesheets
+ for (var i = 0, l = doc.styleSheets.length; i < l; i++) {
+ // do we have a match ?
+ // we need to tests agains ele.href and not asset.url, because a local file will be assigned the full http path on a link element
+ if (doc.styleSheets[i].href === ele.href) {
+ process({ "type": "load" });
+ return;
+ }
+ }
+
+ // increment & try again
+ asset.cssRetries++;
+ asset.cssTimeout = win.setTimeout(isCssLoaded, 250);
+ }
+ }
+
+ var ele;
+ var ext = getExtension(asset.url);
+
+ if (ext === "css") {
+ ele = doc.createElement("link");
+ ele.type = "text/" + (asset.type || "css");
+ ele.rel = "stylesheet";
+ ele.href = asset.url;
+
+ /* onload supported for CSS on unsupported browsers
+ * Safari windows 5.1.7, FF < 10
+ */
+
+ // Set counter to zero
+ asset.cssRetries = 0;
+ asset.cssTimeout = win.setTimeout(isCssLoaded, 500);
+ }
+ else {
+ ele = doc.createElement("script");
+ ele.type = "text/" + (asset.type || "javascript");
+ ele.src = asset.url;
+ }
+
+ ele.onload = ele.onreadystatechange = process;
+ ele.onerror = error;
+
+ /* Good read, but doesn't give much hope !
+ * http://blog.getify.com/on-script-loaders/
+ * http://www.nczonline.net/blog/2010/12/21/thoughts-on-script-loaders/
+ * https://hacks.mozilla.org/2009/06/defer/
+ */
+
+ // ASYNC: load in parallel and execute as soon as possible
+ ele.async = false;
+ // DEFER: load in parallel but maintain execution order
+ ele.defer = false;
+
+ // timout for asset loading
+ asset.errorTimeout = win.setTimeout(function () {
+ error({ type: "timeout" });
+ }, 7e3);
+
+ // use insertBefore to keep IE from throwing Operation Aborted (thx Bryan Forbes!)
+ var head = doc.head || doc.getElementsByTagName("head")[0];
+
+ // but insert at end of head, because otherwise if it is a stylesheet, it will not override values
+ head.insertBefore(ele, head.lastChild);
+ }
+
+ /* Parts inspired from: https://github.com/jrburke/requirejs
+ ************************************************************/
+ function init() {
+ var items = doc.getElementsByTagName("script");
+
+ // look for a script with a data-head-init attribute
+ for (var i = 0, l = items.length; i < l; i++) {
+ var dataMain = items[i].getAttribute("data-headjs-load");
+ if (!!dataMain) {
+ api.load(dataMain);
+ return;
+ }
+ }
+ }
+
+ function ready(key, callback) {
+ ///<summary>
+ /// INFO: use cases:
+ /// head.ready(callBack);
+ /// head.ready(document , callBack);
+ /// head.ready("file.js", callBack);
+ /// head.ready("label" , callBack);
+ /// head.ready(["label1", "label2"], callback);
+ ///</summary>
+
+ // DOM ready check: head.ready(document, function() { });
+ if (key === doc) {
+ if (isDomReady) {
+ one(callback);
+ }
+ else {
+ domWaiters.push(callback);
+ }
+
+ return api;
+ }
+
+ // shift arguments
+ if (isFunction(key)) {
+ callback = key;
+ key = "ALL"; // holds all callbacks that where added without labels: ready(callBack)
+ }
+
+ // queue all items from key and return. The callback will be executed if all items from key are already loaded.
+ if (isArray(key)) {
+ var items = {};
+
+ each(key, function (item) {
+ items[item] = assets[item];
+
+ api.ready(item, function() {
+ if (allLoaded(items)) {
+ one(callback);
+ }
+ });
+ });
+
+ return api;
+ }
+
+ // make sure arguments are sane
+ if (typeof key !== "string" || !isFunction(callback)) {
+ return api;
+ }
+
+ // this can also be called when we trigger events based on filenames & labels
+ var asset = assets[key];
+
+ // item already loaded --> execute and return
+ if (asset && asset.state === LOADED || key === "ALL" && allLoaded() && isDomReady) {
+ one(callback);
+ return api;
+ }
+
+ var arr = handlers[key];
+ if (!arr) {
+ arr = handlers[key] = [callback];
+ }
+ else {
+ arr.push(callback);
+ }
+
+ return api;
+ }
+
+ /* Mix of stuff from jQuery & IEContentLoaded
+ * http://dev.w3.org/html5/spec/the-end.html#the-end
+ ***************************************************/
+ function domReady() {
+ // Make sure body exists, at least, in case IE gets a little overzealous (jQuery ticket #5443).
+ if (!doc.body) {
+ // let's not get nasty by setting a timeout too small.. (loop mania guaranteed if assets are queued)
+ win.clearTimeout(api.readyTimeout);
+ api.readyTimeout = win.setTimeout(domReady, 50);
+ return;
+ }
+
+ if (!isDomReady) {
+ isDomReady = true;
+
+ init();
+ each(domWaiters, function (fn) {
+ one(fn);
+ });
+ }
+ }
+
+ function domContentLoaded() {
+ // W3C
+ if (doc.addEventListener) {
+ doc.removeEventListener("DOMContentLoaded", domContentLoaded, false);
+ domReady();
+ }
+
+ // IE
+ else if (doc.readyState === "complete") {
+ // we're here because readyState === "complete" in oldIE
+ // which is good enough for us to call the dom ready!
+ doc.detachEvent("onreadystatechange", domContentLoaded);
+ domReady();
+ }
+ }
+
+ // Catch cases where ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if (doc.readyState === "complete") {
+ domReady();
+ }
+
+ // W3C
+ else if (doc.addEventListener) {
+ doc.addEventListener("DOMContentLoaded", domContentLoaded, false);
+
+ // A fallback to window.onload, that will always work
+ win.addEventListener("load", domReady, false);
+ }
+
+ // IE
+ else {
+ // Ensure firing before onload, maybe late but safe also for iframes
+ doc.attachEvent("onreadystatechange", domContentLoaded);
+
+ // A fallback to window.onload, that will always work
+ win.attachEvent("onload", domReady);
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var top = false;
+
+ try {
+ top = !win.frameElement && doc.documentElement;
+ } catch (e) { }
+
+ if (top && top.doScroll) {
+ (function doScrollCheck() {
+ if (!isDomReady) {
+ try {
+ // Use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ top.doScroll("left");
+ } catch (error) {
+ // let's not get nasty by setting a timeout too small.. (loop mania guaranteed if assets are queued)
+ win.clearTimeout(api.readyTimeout);
+ api.readyTimeout = win.setTimeout(doScrollCheck, 50);
+ return;
+ }
+
+ // and execute any waiting functions
+ domReady();
+ }
+ }());
+ }
+ }
+ //#endregion
+
+ //#region Public Exports
+ // INFO: determine which method to use for loading
+ api.load = api.js = isAsync ? apiLoadAsync : apiLoadHack;
+ api.test = conditional;
+ api.ready = ready;
+ //#endregion
+
+ //#region INIT
+ // perform this when DOM is ready
+ api.ready(doc, function () {
+ if (allLoaded()) {
+ each(handlers.ALL, function (callback) {
+ one(callback);
+ });
+ }
+
+ if (api.feature) {
+ api.feature("domloaded", true);
+ }
+ });
+ //#endregion
+}(window));
diff --git a/debian/missing-sources/highlight.js b/debian/missing-sources/highlight.js
new file mode 100644
index 0000000..aa9708c
--- /dev/null
+++ b/debian/missing-sources/highlight.js
@@ -0,0 +1,784 @@
+/*
+Syntax highlighting with language autodetection.
+https://highlightjs.org/
+*/
+
+(function(factory) {
+
+ // Find the global object for export to both the browser and web workers.
+ var globalObject = typeof window == 'object' && window ||
+ typeof self == 'object' && self;
+
+ // Setup highlight.js for different environments. First is Node.js or
+ // CommonJS.
+ if(typeof exports !== 'undefined') {
+ factory(exports);
+ } else if(globalObject) {
+ // Export hljs globally even when using AMD for cases when this script
+ // is loaded with others that may still expect a global hljs.
+ globalObject.hljs = factory({});
+
+ // Finally register the global hljs with AMD.
+ if(typeof define === 'function' && define.amd) {
+ define([], function() {
+ return globalObject.hljs;
+ });
+ }
+ }
+
+}(function(hljs) {
+
+ /* Utility functions */
+
+ function escape(value) {
+ return value.replace(/&/gm, '&').replace(/</gm, '<').replace(/>/gm, '>');
+ }
+
+ function tag(node) {
+ return node.nodeName.toLowerCase();
+ }
+
+ function testRe(re, lexeme) {
+ var match = re && re.exec(lexeme);
+ return match && match.index == 0;
+ }
+
+ function isNotHighlighted(language) {
+ return (/^(no-?highlight|plain|text)$/i).test(language);
+ }
+
+ function blockLanguage(block) {
+ var i, match, length,
+ classes = block.className + ' ';
+
+ classes += block.parentNode ? block.parentNode.className : '';
+
+ // language-* takes precedence over non-prefixed class names.
+ match = (/\blang(?:uage)?-([\w-]+)\b/i).exec(classes);
+ if (match) {
+ return getLanguage(match[1]) ? match[1] : 'no-highlight';
+ }
+
+ classes = classes.split(/\s+/);
+ for (i = 0, length = classes.length; i < length; i++) {
+ if (getLanguage(classes[i]) || isNotHighlighted(classes[i])) {
+ return classes[i];
+ }
+ }
+ }
+
+ function inherit(parent, obj) {
+ var result = {}, key;
+ for (key in parent)
+ result[key] = parent[key];
+ if (obj)
+ for (key in obj)
+ result[key] = obj[key];
+ return result;
+ }
+
+ /* Stream merging */
+
+ function nodeStream(node) {
+ var result = [];
+ (function _nodeStream(node, offset) {
+ for (var child = node.firstChild; child; child = child.nextSibling) {
+ if (child.nodeType == 3)
+ offset += child.nodeValue.length;
+ else if (child.nodeType == 1) {
+ result.push({
+ event: 'start',
+ offset: offset,
+ node: child
+ });
+ offset = _nodeStream(child, offset);
+ // Prevent void elements from having an end tag that would actually
+ // double them in the output. There are more void elements in HTML
+ // but we list only those realistically expected in code display.
+ if (!tag(child).match(/br|hr|img|input/)) {
+ result.push({
+ event: 'stop',
+ offset: offset,
+ node: child
+ });
+ }
+ }
+ }
+ return offset;
+ })(node, 0);
+ return result;
+ }
+
+ function mergeStreams(original, highlighted, value) {
+ var processed = 0;
+ var result = '';
+ var nodeStack = [];
+
+ function selectStream() {
+ if (!original.length || !highlighted.length) {
+ return original.length ? original : highlighted;
+ }
+ if (original[0].offset != highlighted[0].offset) {
+ return (original[0].offset < highlighted[0].offset) ? original : highlighted;
+ }
+
+ /*
+ To avoid starting the stream just before it should stop the order is
+ ensured that original always starts first and closes last:
+
+ if (event1 == 'start' && event2 == 'start')
+ return original;
+ if (event1 == 'start' && event2 == 'stop')
+ return highlighted;
+ if (event1 == 'stop' && event2 == 'start')
+ return original;
+ if (event1 == 'stop' && event2 == 'stop')
+ return highlighted;
+
+ ... which is collapsed to:
+ */
+ return highlighted[0].event == 'start' ? original : highlighted;
+ }
+
+ function open(node) {
+ function attr_str(a) {return ' ' + a.nodeName + '="' + escape(a.value) + '"';}
+ result += '<' + tag(node) + Array.prototype.map.call(node.attributes, attr_str).join('') + '>';
+ }
+
+ function close(node) {
+ result += '</' + tag(node) + '>';
+ }
+
+ function render(event) {
+ (event.event == 'start' ? open : close)(event.node);
+ }
+
+ while (original.length || highlighted.length) {
+ var stream = selectStream();
+ result += escape(value.substr(processed, stream[0].offset - processed));
+ processed = stream[0].offset;
+ if (stream == original) {
+ /*
+ On any opening or closing tag of the original markup we first close
+ the entire highlighted node stack, then render the original tag along
+ with all the following original tags at the same offset and then
+ reopen all the tags on the highlighted stack.
+ */
+ nodeStack.reverse().forEach(close);
+ do {
+ render(stream.splice(0, 1)[0]);
+ stream = selectStream();
+ } while (stream == original && stream.length && stream[0].offset == processed);
+ nodeStack.reverse().forEach(open);
+ } else {
+ if (stream[0].event == 'start') {
+ nodeStack.push(stream[0].node);
+ } else {
+ nodeStack.pop();
+ }
+ render(stream.splice(0, 1)[0]);
+ }
+ }
+ return result + escape(value.substr(processed));
+ }
+
+ /* Initialization */
+
+ function compileLanguage(language) {
+
+ function reStr(re) {
+ return (re && re.source) || re;
+ }
+
+ function langRe(value, global) {
+ return new RegExp(
+ reStr(value),
+ 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')
+ );
+ }
+
+ function compileMode(mode, parent) {
+ if (mode.compiled)
+ return;
+ mode.compiled = true;
+
+ mode.keywords = mode.keywords || mode.beginKeywords;
+ if (mode.keywords) {
+ var compiled_keywords = {};
+
+ var flatten = function(className, str) {
+ if (language.case_insensitive) {
+ str = str.toLowerCase();
+ }
+ str.split(' ').forEach(function(kw) {
+ var pair = kw.split('|');
+ compiled_keywords[pair[0]] = [className, pair[1] ? Number(pair[1]) : 1];
+ });
+ };
+
+ if (typeof mode.keywords == 'string') { // string
+ flatten('keyword', mode.keywords);
+ } else {
+ Object.keys(mode.keywords).forEach(function (className) {
+ flatten(className, mode.keywords[className]);
+ });
+ }
+ mode.keywords = compiled_keywords;
+ }
+ mode.lexemesRe = langRe(mode.lexemes || /\w+/, true);
+
+ if (parent) {
+ if (mode.beginKeywords) {
+ mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')\\b';
+ }
+ if (!mode.begin)
+ mode.begin = /\B|\b/;
+ mode.beginRe = langRe(mode.begin);
+ if (!mode.end && !mode.endsWithParent)
+ mode.end = /\B|\b/;
+ if (mode.end)
+ mode.endRe = langRe(mode.end);
+ mode.terminator_end = reStr(mode.end) || '';
+ if (mode.endsWithParent && parent.terminator_end)
+ mode.terminator_end += (mode.end ? '|' : '') + parent.terminator_end;
+ }
+ if (mode.illegal)
+ mode.illegalRe = langRe(mode.illegal);
+ if (mode.relevance === undefined)
+ mode.relevance = 1;
+ if (!mode.contains) {
+ mode.contains = [];
+ }
+ var expanded_contains = [];
+ mode.contains.forEach(function(c) {
+ if (c.variants) {
+ c.variants.forEach(function(v) {expanded_contains.push(inherit(c, v));});
+ } else {
+ expanded_contains.push(c == 'self' ? mode : c);
+ }
+ });
+ mode.contains = expanded_contains;
+ mode.contains.forEach(function(c) {compileMode(c, mode);});
+
+ if (mode.starts) {
+ compileMode(mode.starts, parent);
+ }
+
+ var terminators =
+ mode.contains.map(function(c) {
+ return c.beginKeywords ? '\\.?(' + c.begin + ')\\.?' : c.begin;
+ })
+ .concat([mode.terminator_end, mode.illegal])
+ .map(reStr)
+ .filter(Boolean);
+ mode.terminators = terminators.length ? langRe(terminators.join('|'), true) : {exec: function(/*s*/) {return null;}};
+ }
+
+ compileMode(language);
+ }
+
+ /*
+ Core highlighting function. Accepts a language name, or an alias, and a
+ string with the code to highlight. Returns an object with the following
+ properties:
+
+ - relevance (int)
+ - value (an HTML string with highlighting markup)
+
+ */
+ function highlight(name, value, ignore_illegals, continuation) {
+
+ function subMode(lexeme, mode) {
+ for (var i = 0; i < mode.contains.length; i++) {
+ if (testRe(mode.contains[i].beginRe, lexeme)) {
+ return mode.contains[i];
+ }
+ }
+ }
+
+ function endOfMode(mode, lexeme) {
+ if (testRe(mode.endRe, lexeme)) {
+ while (mode.endsParent && mode.parent) {
+ mode = mode.parent;
+ }
+ return mode;
+ }
+ if (mode.endsWithParent) {
+ return endOfMode(mode.parent, lexeme);
+ }
+ }
+
+ function isIllegal(lexeme, mode) {
+ return !ignore_illegals && testRe(mode.illegalRe, lexeme);
+ }
+
+ function keywordMatch(mode, match) {
+ var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0];
+ return mode.keywords.hasOwnProperty(match_str) && mode.keywords[match_str];
+ }
+
+ function buildSpan(classname, insideSpan, leaveOpen, noPrefix) {
+ var classPrefix = noPrefix ? '' : options.classPrefix,
+ openSpan = '<span class="' + classPrefix,
+ closeSpan = leaveOpen ? '' : '</span>';
+
+ openSpan += classname + '">';
+
+ return openSpan + insideSpan + closeSpan;
+ }
+
+ function processKeywords() {
+ if (!top.keywords)
+ return escape(mode_buffer);
+ var result = '';
+ var last_index = 0;
+ top.lexemesRe.lastIndex = 0;
+ var match = top.lexemesRe.exec(mode_buffer);
+ while (match) {
+ result += escape(mode_buffer.substr(last_index, match.index - last_index));
+ var keyword_match = keywordMatch(top, match);
+ if (keyword_match) {
+ relevance += keyword_match[1];
+ result += buildSpan(keyword_match[0], escape(match[0]));
+ } else {
+ result += escape(match[0]);
+ }
+ last_index = top.lexemesRe.lastIndex;
+ match = top.lexemesRe.exec(mode_buffer);
+ }
+ return result + escape(mode_buffer.substr(last_index));
+ }
+
+ function processSubLanguage() {
+ var explicit = typeof top.subLanguage == 'string';
+ if (explicit && !languages[top.subLanguage]) {
+ return escape(mode_buffer);
+ }
+
+ var result = explicit ?
+ highlight(top.subLanguage, mode_buffer, true, continuations[top.subLanguage]) :
+ highlightAuto(mode_buffer, top.subLanguage.length ? top.subLanguage : undefined);
+
+ // Counting embedded language score towards the host language may be disabled
+ // with zeroing the containing mode relevance. Usecase in point is Markdown that
+ // allows XML everywhere and makes every XML snippet to have a much larger Markdown
+ // score.
+ if (top.relevance > 0) {
+ relevance += result.relevance;
+ }
+ if (explicit) {
+ continuations[top.subLanguage] = result.top;
+ }
+ return buildSpan(result.language, result.value, false, true);
+ }
+
+ function processBuffer() {
+ result += (top.subLanguage !== undefined ? processSubLanguage() : processKeywords());
+ mode_buffer = '';
+ }
+
+ function startNewMode(mode, lexeme) {
+ result += mode.className? buildSpan(mode.className, '', true): '';
+ top = Object.create(mode, {parent: {value: top}});
+ }
+
+ function processLexeme(buffer, lexeme) {
+
+ mode_buffer += buffer;
+
+ if (lexeme === undefined) {
+ processBuffer();
+ return 0;
+ }
+
+ var new_mode = subMode(lexeme, top);
+ if (new_mode) {
+ if (new_mode.skip) {
+ mode_buffer += lexeme;
+ } else {
+ if (new_mode.excludeBegin) {
+ mode_buffer += lexeme;
+ }
+ processBuffer();
+ if (!new_mode.returnBegin && !new_mode.excludeBegin) {
+ mode_buffer = lexeme;
+ }
+ }
+ startNewMode(new_mode, lexeme);
+ return new_mode.returnBegin ? 0 : lexeme.length;
+ }
+
+ var end_mode = endOfMode(top, lexeme);
+ if (end_mode) {
+ var origin = top;
+ if (origin.skip) {
+ mode_buffer += lexeme;
+ } else {
+ if (!(origin.returnEnd || origin.excludeEnd)) {
+ mode_buffer += lexeme;
+ }
+ processBuffer();
+ if (origin.excludeEnd) {
+ mode_buffer = lexeme;
+ }
+ }
+ do {
+ if (top.className) {
+ result += '</span>';
+ }
+ if (!top.skip) {
+ relevance += top.relevance;
+ }
+ top = top.parent;
+ } while (top != end_mode.parent);
+ if (end_mode.starts) {
+ startNewMode(end_mode.starts, '');
+ }
+ return origin.returnEnd ? 0 : lexeme.length;
+ }
+
+ if (isIllegal(lexeme, top))
+ throw new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.className || '<unnamed>') + '"');
+
+ /*
+ Parser should not reach this point as all types of lexemes should be caught
+ earlier, but if it does due to some bug make sure it advances at least one
+ character forward to prevent infinite looping.
+ */
+ mode_buffer += lexeme;
+ return lexeme.length || 1;
+ }
+
+ var language = getLanguage(name);
+ if (!language) {
+ throw new Error('Unknown language: "' + name + '"');
+ }
+
+ compileLanguage(language);
+ var top = continuation || language;
+ var continuations = {}; // keep continuations for sub-languages
+ var result = '', current;
+ for(current = top; current != language; current = current.parent) {
+ if (current.className) {
+ result = buildSpan(current.className, '', true) + result;
+ }
+ }
+ var mode_buffer = '';
+ var relevance = 0;
+ try {
+ var match, count, index = 0;
+ while (true) {
+ top.terminators.lastIndex = index;
+ match = top.terminators.exec(value);
+ if (!match)
+ break;
+ count = processLexeme(value.substr(index, match.index - index), match[0]);
+ index = match.index + count;
+ }
+ processLexeme(value.substr(index));
+ for(current = top; current.parent; current = current.parent) { // close dangling modes
+ if (current.className) {
+ result += '</span>';
+ }
+ }
+ return {
+ relevance: relevance,
+ value: result,
+ language: name,
+ top: top
+ };
+ } catch (e) {
+ if (e.message.indexOf('Illegal') != -1) {
+ return {
+ relevance: 0,
+ value: escape(value)
+ };
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ /*
+ Highlighting with language detection. Accepts a string with the code to
+ highlight. Returns an object with the following properties:
+
+ - language (detected language)
+ - relevance (int)
+ - value (an HTML string with highlighting markup)
+ - second_best (object with the same structure for second-best heuristically
+ detected language, may be absent)
+
+ */
+ function highlightAuto(text, languageSubset) {
+ languageSubset = languageSubset || options.languages || Object.keys(languages);
+ var result = {
+ relevance: 0,
+ value: escape(text)
+ };
+ var second_best = result;
+ languageSubset.filter(getLanguage).forEach(function(name) {
+ var current = highlight(name, text, false);
+ current.language = name;
+ if (current.relevance > second_best.relevance) {
+ second_best = current;
+ }
+ if (current.relevance > result.relevance) {
+ second_best = result;
+ result = current;
+ }
+ });
+ if (second_best.language) {
+ result.second_best = second_best;
+ }
+ return result;
+ }
+
+ /*
+ Post-processing of the highlighted markup:
+
+ - replace TABs with something more useful
+ - replace real line-breaks with '<br>' for non-pre containers
+
+ */
+ function fixMarkup(value) {
+ if (options.tabReplace) {
+ value = value.replace(/^((<[^>]+>|\t)+)/gm, function(match, p1 /*..., offset, s*/) {
+ return p1.replace(/\t/g, options.tabReplace);
+ });
+ }
+ if (options.useBR) {
+ value = value.replace(/\n/g, '<br>');
+ }
+ return value;
+ }
+
+ function buildClassName(prevClassName, currentLang, resultLang) {
+ var language = currentLang ? aliases[currentLang] : resultLang,
+ result = [prevClassName.trim()];
+
+ if (!prevClassName.match(/\bhljs\b/)) {
+ result.push('hljs');
+ }
+
+ if (prevClassName.indexOf(language) === -1) {
+ result.push(language);
+ }
+
+ return result.join(' ').trim();
+ }
+
+ /*
+ Applies highlighting to a DOM node containing code. Accepts a DOM node and
+ two optional parameters for fixMarkup.
+ */
+ function highlightBlock(block) {
+ var language = blockLanguage(block);
+ if (isNotHighlighted(language))
+ return;
+
+ var node;
+ if (options.useBR) {
+ node = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ node.innerHTML = block.innerHTML.replace(/\n/g, '').replace(/<br[ \/]*>/g, '\n');
+ } else {
+ node = block;
+ }
+ var text = node.textContent;
+ var result = language ? highlight(language, text, true) : highlightAuto(text);
+
+ var originalStream = nodeStream(node);
+ if (originalStream.length) {
+ var resultNode = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
+ resultNode.innerHTML = result.value;
+ result.value = mergeStreams(originalStream, nodeStream(resultNode), text);
+ }
+ result.value = fixMarkup(result.value);
+
+ block.innerHTML = result.value;
+ block.className = buildClassName(block.className, language, result.language);
+ block.result = {
+ language: result.language,
+ re: result.relevance
+ };
+ if (result.second_best) {
+ block.second_best = {
+ language: result.second_best.language,
+ re: result.second_best.relevance
+ };
+ }
+ }
+
+ var options = {
+ classPrefix: 'hljs-',
+ tabReplace: null,
+ useBR: false,
+ languages: undefined
+ };
+
+ /*
+ Updates highlight.js global options with values passed in the form of an object.
+ */
+ function configure(user_options) {
+ options = inherit(options, user_options);
+ }
+
+ /*
+ Applies highlighting to all <pre><code>..</code></pre> blocks on a page.
+ */
+ function initHighlighting() {
+ if (initHighlighting.called)
+ return;
+ initHighlighting.called = true;
+
+ var blocks = document.querySelectorAll('pre code');
+ Array.prototype.forEach.call(blocks, highlightBlock);
+ }
+
+ /*
+ Attaches highlighting to the page load event.
+ */
+ function initHighlightingOnLoad() {
+ addEventListener('DOMContentLoaded', initHighlighting, false);
+ addEventListener('load', initHighlighting, false);
+ }
+
+ var languages = {};
+ var aliases = {};
+
+ function registerLanguage(name, language) {
+ var lang = languages[name] = language(hljs);
+ if (lang.aliases) {
+ lang.aliases.forEach(function(alias) {aliases[alias] = name;});
+ }
+ }
+
+ function listLanguages() {
+ return Object.keys(languages);
+ }
+
+ function getLanguage(name) {
+ name = (name || '').toLowerCase();
+ return languages[name] || languages[aliases[name]];
+ }
+
+ /* Interface definition */
+
+ hljs.highlight = highlight;
+ hljs.highlightAuto = highlightAuto;
+ hljs.fixMarkup = fixMarkup;
+ hljs.highlightBlock = highlightBlock;
+ hljs.configure = configure;
+ hljs.initHighlighting = initHighlighting;
+ hljs.initHighlightingOnLoad = initHighlightingOnLoad;
+ hljs.registerLanguage = registerLanguage;
+ hljs.listLanguages = listLanguages;
+ hljs.getLanguage = getLanguage;
+ hljs.inherit = inherit;
+
+ // Common regexps
+ hljs.IDENT_RE = '[a-zA-Z]\\w*';
+ hljs.UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*';
+ hljs.NUMBER_RE = '\\b\\d+(\\.\\d+)?';
+ hljs.C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float
+ hljs.BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b...
+ hljs.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';
+
+ // Common modes
+ hljs.BACKSLASH_ESCAPE = {
+ begin: '\\\\[\\s\\S]', relevance: 0
+ };
+ hljs.APOS_STRING_MODE = {
+ className: 'string',
+ begin: '\'', end: '\'',
+ illegal: '\\n',
+ contains: [hljs.BACKSLASH_ESCAPE]
+ };
+ hljs.QUOTE_STRING_MODE = {
+ className: 'string',
+ begin: '"', end: '"',
+ illegal: '\\n',
+ contains: [hljs.BACKSLASH_ESCAPE]
+ };
+ hljs.PHRASAL_WORDS_MODE = {
+ begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/
+ };
+ hljs.COMMENT = function (begin, end, inherits) {
+ var mode = hljs.inherit(
+ {
+ className: 'comment',
+ begin: begin, end: end,
+ contains: []
+ },
+ inherits || {}
+ );
+ mode.contains.push(hljs.PHRASAL_WORDS_MODE);
+ mode.contains.push({
+ className: 'doctag',
+ begin: "(?:TODO|FIXME|NOTE|BUG|XXX):",
+ relevance: 0
+ });
+ return mode;
+ };
+ hljs.C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$');
+ hljs.C_BLOCK_COMMENT_MODE = hljs.COMMENT('/\\*', '\\*/');
+ hljs.HASH_COMMENT_MODE = hljs.COMMENT('#', '$');
+ hljs.NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.NUMBER_RE,
+ relevance: 0
+ };
+ hljs.C_NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.C_NUMBER_RE,
+ relevance: 0
+ };
+ hljs.BINARY_NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.BINARY_NUMBER_RE,
+ relevance: 0
+ };
+ hljs.CSS_NUMBER_MODE = {
+ className: 'number',
+ begin: hljs.NUMBER_RE + '(' +
+ '%|em|ex|ch|rem' +
+ '|vw|vh|vmin|vmax' +
+ '|cm|mm|in|pt|pc|px' +
+ '|deg|grad|rad|turn' +
+ '|s|ms' +
+ '|Hz|kHz' +
+ '|dpi|dpcm|dppx' +
+ ')?',
+ relevance: 0
+ };
+ hljs.REGEXP_MODE = {
+ className: 'regexp',
+ begin: /\//, end: /\/[gimuy]*/,
+ illegal: /\n/,
+ contains: [
+ hljs.BACKSLASH_ESCAPE,
+ {
+ begin: /\[/, end: /\]/,
+ relevance: 0,
+ contains: [hljs.BACKSLASH_ESCAPE]
+ }
+ ]
+ };
+ hljs.TITLE_MODE = {
+ className: 'title',
+ begin: hljs.IDENT_RE,
+ relevance: 0
+ };
+ hljs.UNDERSCORE_TITLE_MODE = {
+ className: 'title',
+ begin: hljs.UNDERSCORE_IDENT_RE,
+ relevance: 0
+ };
+ hljs.METHOD_GUARD = {
+ // excludes method names from keyword processing
+ begin: '\\.\\s*' + hljs.UNDERSCORE_IDENT_RE,
+ relevance: 0
+ };
+
+ return hljs;
+}));
diff --git a/debian/missing-sources/modernizr.js b/debian/missing-sources/modernizr.js
new file mode 100644
index 0000000..56a0022
--- /dev/null
+++ b/debian/missing-sources/modernizr.js
@@ -0,0 +1,1393 @@
+/*!
+ * Modernizr v2.6.2
+ * www.modernizr.com
+ *
+ * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
+ * Available under the BSD and MIT licenses: www.modernizr.com/license/
+ */
+
+/*
+ * Modernizr tests which native CSS3 and HTML5 features are available in
+ * the current UA and makes the results available to you in two ways:
+ * as properties on a global Modernizr object, and as classes on the
+ * <html> element. This information allows you to progressively enhance
+ * your pages with a granular level of control over the experience.
+ *
+ * Modernizr has an optional (not included) conditional resource loader
+ * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).
+ * To get a build that includes Modernizr.load(), as well as choosing
+ * which tests to include, go to www.modernizr.com/download/
+ *
+ * Authors Faruk Ates, Paul Irish, Alex Sexton
+ * Contributors Ryan Seddon, Ben Alman
+ */
+
+window.Modernizr = (function( window, document, undefined ) {
+
+ var version = '2.6.2',
+
+ Modernizr = {},
+
+ /*>>cssclasses*/
+ // option for enabling the HTML classes to be added
+ enableClasses = true,
+ /*>>cssclasses*/
+
+ docElement = document.documentElement,
+
+ /**
+ * Create our "modernizr" element that we do most feature tests on.
+ */
+ mod = 'modernizr',
+ modElem = document.createElement(mod),
+ mStyle = modElem.style,
+
+ /**
+ * Create the input element for various Web Forms feature tests.
+ */
+ inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,
+
+ /*>>smile*/
+ smile = ':)',
+ /*>>smile*/
+
+ toString = {}.toString,
+
+ // TODO :: make the prefixes more granular
+ /*>>prefixes*/
+ // List of property values to set for css tests. See ticket #21
+ prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
+ /*>>prefixes*/
+
+ /*>>domprefixes*/
+ // Following spec is to expose vendor-specific style properties as:
+ // elem.style.WebkitBorderRadius
+ // and the following would be incorrect:
+ // elem.style.webkitBorderRadius
+
+ // Webkit ghosts their properties in lowercase but Opera & Moz do not.
+ // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+
+ // erik.eae.net/archives/2008/03/10/21.48.10/
+
+ // More here: github.com/Modernizr/Modernizr/issues/issue/21
+ omPrefixes = 'Webkit Moz O ms',
+
+ cssomPrefixes = omPrefixes.split(' '),
+
+ domPrefixes = omPrefixes.toLowerCase().split(' '),
+ /*>>domprefixes*/
+
+ /*>>ns*/
+ ns = {'svg': 'http://www.w3.org/2000/svg'},
+ /*>>ns*/
+
+ tests = {},
+ inputs = {},
+ attrs = {},
+
+ classes = [],
+
+ slice = classes.slice,
+
+ featureName, // used in testing loop
+
+
+ /*>>teststyles*/
+ // Inject element with style element and some CSS rules
+ injectElementWithStyles = function( rule, callback, nodes, testnames ) {
+
+ var style, ret, node, docOverflow,
+ div = document.createElement('div'),
+ // After page load injecting a fake body doesn't work so check if body exists
+ body = document.body,
+ // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.
+ fakeBody = body || document.createElement('body');
+
+ if ( parseInt(nodes, 10) ) {
+ // In order not to give false positives we create a node for each test
+ // This also allows the method to scale for unspecified uses
+ while ( nodes-- ) {
+ node = document.createElement('div');
+ node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
+ div.appendChild(node);
+ }
+ }
+
+ // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed
+ // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element
+ // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.
+ // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
+ // Documents served as xml will throw if using so use xml friendly encoded version. See issue #277
+ style = ['','<style id="s', mod, '">', rule, '</style>'].join('');
+ div.id = mod;
+ // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.
+ // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270
+ (body ? div : fakeBody).innerHTML += style;
+ fakeBody.appendChild(div);
+ if ( !body ) {
+ //avoid crashing IE8, if background image is used
+ fakeBody.style.background = '';
+ //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible
+ fakeBody.style.overflow = 'hidden';
+ docOverflow = docElement.style.overflow;
+ docElement.style.overflow = 'hidden';
+ docElement.appendChild(fakeBody);
+ }
+
+ ret = callback(div, rule);
+ // If this is done after page load we don't want to remove the body so check if body exists
+ if ( !body ) {
+ fakeBody.parentNode.removeChild(fakeBody);
+ docElement.style.overflow = docOverflow;
+ } else {
+ div.parentNode.removeChild(div);
+ }
+
+ return !!ret;
+
+ },
+ /*>>teststyles*/
+
+ /*>>mq*/
+ // adapted from matchMedia polyfill
+ // by Scott Jehl and Paul Irish
+ // gist.github.com/786768
+ testMediaQuery = function( mq ) {
+
+ var matchMedia = window.matchMedia || window.msMatchMedia;
+ if ( matchMedia ) {
+ return matchMedia(mq).matches;
+ }
+
+ var bool;
+
+ injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {
+ bool = (window.getComputedStyle ?
+ getComputedStyle(node, null) :
+ node.currentStyle)['position'] == 'absolute';
+ });
+
+ return bool;
+
+ },
+ /*>>mq*/
+
+
+ /*>>hasevent*/
+ //
+ // isEventSupported determines if a given element supports the given event
+ // kangax.github.com/iseventsupported/
+ //
+ // The following results are known incorrects:
+ // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative
+ // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333
+ // ...
+ isEventSupported = (function() {
+
+ var TAGNAMES = {
+ 'select': 'input', 'change': 'input',
+ 'submit': 'form', 'reset': 'form',
+ 'error': 'img', 'load': 'img', 'abort': 'img'
+ };
+
+ function isEventSupported( eventName, element ) {
+
+ element = element || document.createElement(TAGNAMES[eventName] || 'div');
+ eventName = 'on' + eventName;
+
+ // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
+ var isSupported = eventName in element;
+
+ if ( !isSupported ) {
+ // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
+ if ( !element.setAttribute ) {
+ element = document.createElement('div');
+ }
+ if ( element.setAttribute && element.removeAttribute ) {
+ element.setAttribute(eventName, '');
+ isSupported = is(element[eventName], 'function');
+
+ // If property was created, "remove it" (by setting value to `undefined`)
+ if ( !is(element[eventName], 'undefined') ) {
+ element[eventName] = undefined;
+ }
+ element.removeAttribute(eventName);
+ }
+ }
+
+ element = null;
+ return isSupported;
+ }
+ return isEventSupported;
+ })(),
+ /*>>hasevent*/
+
+ // TODO :: Add flag for hasownprop ? didn't last time
+
+ // hasOwnProperty shim by kangax needed for Safari 2.0 support
+ _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
+
+ if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
+ hasOwnProp = function (object, property) {
+ return _hasOwnProperty.call(object, property);
+ };
+ }
+ else {
+ hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */
+ return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
+ };
+ }
+
+ // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
+ // es5.github.com/#x15.3.4.5
+
+ if (!Function.prototype.bind) {
+ Function.prototype.bind = function bind(that) {
+
+ var target = this;
+
+ if (typeof target != "function") {
+ throw new TypeError();
+ }
+
+ var args = slice.call(arguments, 1),
+ bound = function () {
+
+ if (this instanceof bound) {
+
+ var F = function(){};
+ F.prototype = target.prototype;
+ var self = new F();
+
+ var result = target.apply(
+ self,
+ args.concat(slice.call(arguments))
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return self;
+
+ } else {
+
+ return target.apply(
+ that,
+ args.concat(slice.call(arguments))
+ );
+
+ }
+
+ };
+
+ return bound;
+ };
+ }
+
+ /**
+ * setCss applies given styles to the Modernizr DOM node.
+ */
+ function setCss( str ) {
+ mStyle.cssText = str;
+ }
+
+ /**
+ * setCssAll extrapolates all vendor-specific css strings.
+ */
+ function setCssAll( str1, str2 ) {
+ return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
+ }
+
+ /**
+ * is returns a boolean for if typeof obj is exactly type.
+ */
+ function is( obj, type ) {
+ return typeof obj === type;
+ }
+
+ /**
+ * contains returns a boolean for if substr is found within str.
+ */
+ function contains( str, substr ) {
+ return !!~('' + str).indexOf(substr);
+ }
+
+ /*>>testprop*/
+
+ // testProps is a generic CSS / DOM property test.
+
+ // In testing support for a given CSS property, it's legit to test:
+ // `elem.style[styleName] !== undefined`
+ // If the property is supported it will return an empty string,
+ // if unsupported it will return undefined.
+
+ // We'll take advantage of this quick test and skip setting a style
+ // on our modernizr element, but instead just testing undefined vs
+ // empty string.
+
+ // Because the testing of the CSS property names (with "-", as
+ // opposed to the camelCase DOM properties) is non-portable and
+ // non-standard but works in WebKit and IE (but not Gecko or Opera),
+ // we explicitly reject properties with dashes so that authors
+ // developing in WebKit or IE first don't end up with
+ // browser-specific content by accident.
+
+ function testProps( props, prefixed ) {
+ for ( var i in props ) {
+ var prop = props[i];
+ if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
+ return prefixed == 'pfx' ? prop : true;
+ }
+ }
+ return false;
+ }
+ /*>>testprop*/
+
+ // TODO :: add testDOMProps
+ /**
+ * testDOMProps is a generic DOM property test; if a browser supports
+ * a certain property, it won't return undefined for it.
+ */
+ function testDOMProps( props, obj, elem ) {
+ for ( var i in props ) {
+ var item = obj[props[i]];
+ if ( item !== undefined) {
+
+ // return the property name as a string
+ if (elem === false) return props[i];
+
+ // let's bind a function
+ if (is(item, 'function')){
+ // default to autobind unless override
+ return item.bind(elem || obj);
+ }
+
+ // return the unbound function or obj or value
+ return item;
+ }
+ }
+ return false;
+ }
+
+ /*>>testallprops*/
+ /**
+ * testPropsAll tests a list of DOM properties we want to check against.
+ * We specify literally ALL possible (known and/or likely) properties on
+ * the element including the non-vendor prefixed one, for forward-
+ * compatibility.
+ */
+ function testPropsAll( prop, prefixed, elem ) {
+
+ var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
+ props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
+
+ // did they call .prefixed('boxSizing') or are we just testing a prop?
+ if(is(prefixed, "string") || is(prefixed, "undefined")) {
+ return testProps(props, prefixed);
+
+ // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])
+ } else {
+ props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
+ return testDOMProps(props, prefixed, elem);
+ }
+ }
+ /*>>testallprops*/
+
+
+ /**
+ * Tests
+ * -----
+ */
+
+ // The *new* flexbox
+ // dev.w3.org/csswg/css3-flexbox
+
+ tests['flexbox'] = function() {
+ return testPropsAll('flexWrap');
+ };
+
+ // The *old* flexbox
+ // www.w3.org/TR/2009/WD-css3-flexbox-20090723/
+
+ tests['flexboxlegacy'] = function() {
+ return testPropsAll('boxDirection');
+ };
+
+ // On the S60 and BB Storm, getContext exists, but always returns undefined
+ // so we actually have to call getContext() to verify
+ // github.com/Modernizr/Modernizr/issues/issue/97/
+
+ tests['canvas'] = function() {
+ var elem = document.createElement('canvas');
+ return !!(elem.getContext && elem.getContext('2d'));
+ };
+
+ tests['canvastext'] = function() {
+ return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));
+ };
+
+ // webk.it/70117 is tracking a legit WebGL feature detect proposal
+
+ // We do a soft detect which may false positive in order to avoid
+ // an expensive context creation: bugzil.la/732441
+
+ tests['webgl'] = function() {
+ return !!window.WebGLRenderingContext;
+ };
+
+ /*
+ * The Modernizr.touch test only indicates if the browser supports
+ * touch events, which does not necessarily reflect a touchscreen
+ * device, as evidenced by tablets running Windows 7 or, alas,
+ * the Palm Pre / WebOS (touch) phones.
+ *
+ * Additionally, Chrome (desktop) used to lie about its support on this,
+ * but that has since been rectified: crbug.com/36415
+ *
+ * We also test for Firefox 4 Multitouch Support.
+ *
+ * For more info, see: modernizr.github.com/Modernizr/touch.html
+ */
+
+ tests['touch'] = function() {
+ var bool;
+
+ if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
+ bool = true;
+ } else {
+ injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {
+ bool = node.offsetTop === 9;
+ });
+ }
+
+ return bool;
+ };
+
+
+ // geolocation is often considered a trivial feature detect...
+ // Turns out, it's quite tricky to get right:
+ //
+ // Using !!navigator.geolocation does two things we don't want. It:
+ // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513
+ // 2. Disables page caching in WebKit: webk.it/43956
+ //
+ // Meanwhile, in Firefox < 8, an about:config setting could expose
+ // a false positive that would throw an exception: bugzil.la/688158
+
+ tests['geolocation'] = function() {
+ return 'geolocation' in navigator;
+ };
+
+
+ tests['postmessage'] = function() {
+ return !!window.postMessage;
+ };
+
+
+ // Chrome incognito mode used to throw an exception when using openDatabase
+ // It doesn't anymore.
+ tests['websqldatabase'] = function() {
+ return !!window.openDatabase;
+ };
+
+ // Vendors had inconsistent prefixing with the experimental Indexed DB:
+ // - Webkit's implementation is accessible through webkitIndexedDB
+ // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB
+ // For speed, we don't test the legacy (and beta-only) indexedDB
+ tests['indexedDB'] = function() {
+ return !!testPropsAll("indexedDB", window);
+ };
+
+ // documentMode logic from YUI to filter out IE8 Compat Mode
+ // which false positives.
+ tests['hashchange'] = function() {
+ return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);
+ };
+
+ // Per 1.6:
+ // This used to be Modernizr.historymanagement but the longer
+ // name has been deprecated in favor of a shorter and property-matching one.
+ // The old API is still available in 1.6, but as of 2.0 will throw a warning,
+ // and in the first release thereafter disappear entirely.
+ tests['history'] = function() {
+ return !!(window.history && history.pushState);
+ };
+
+ tests['draganddrop'] = function() {
+ var div = document.createElement('div');
+ return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
+ };
+
+ // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10
+ // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.
+ // FF10 still uses prefixes, so check for it until then.
+ // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/
+ tests['websockets'] = function() {
+ return 'WebSocket' in window || 'MozWebSocket' in window;
+ };
+
+
+ // css-tricks.com/rgba-browser-support/
+ tests['rgba'] = function() {
+ // Set an rgba() color and check the returned value
+
+ setCss('background-color:rgba(150,255,150,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba');
+ };
+
+ tests['hsla'] = function() {
+ // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
+ // except IE9 who retains it as hsla
+
+ setCss('background-color:hsla(120,40%,100%,.5)');
+
+ return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');
+ };
+
+ tests['multiplebgs'] = function() {
+ // Setting multiple images AND a color on the background shorthand property
+ // and then querying the style.background property value for the number of
+ // occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
+
+ setCss('background:url(https://),url(https://),red url(https://)');
+
+ // If the UA supports multiple backgrounds, there should be three occurrences
+ // of the string "url(" in the return value for elemStyle.background
+
+ return (/(url\s*\(.*?){3}/).test(mStyle.background);
+ };
+
+
+
+ // this will false positive in Opera Mini
+ // github.com/Modernizr/Modernizr/issues/396
+
+ tests['backgroundsize'] = function() {
+ return testPropsAll('backgroundSize');
+ };
+
+ tests['borderimage'] = function() {
+ return testPropsAll('borderImage');
+ };
+
+
+ // Super comprehensive table about all the unique implementations of
+ // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance
+
+ tests['borderradius'] = function() {
+ return testPropsAll('borderRadius');
+ };
+
+ // WebOS unfortunately false positives on this test.
+ tests['boxshadow'] = function() {
+ return testPropsAll('boxShadow');
+ };
+
+ // FF3.0 will false positive on this test
+ tests['textshadow'] = function() {
+ return document.createElement('div').style.textShadow === '';
+ };
+
+
+ tests['opacity'] = function() {
+ // Browsers that actually have CSS Opacity implemented have done so
+ // according to spec, which means their return values are within the
+ // range of [0.0,1.0] - including the leading zero.
+
+ setCssAll('opacity:.55');
+
+ // The non-literal . in this regex is intentional:
+ // German Chrome returns this value as 0,55
+ // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
+ return (/^0.55$/).test(mStyle.opacity);
+ };
+
+
+ // Note, Android < 4 will pass this test, but can only animate
+ // a single property at a time
+ // daneden.me/2011/12/putting-up-with-androids-bullshit/
+ tests['cssanimations'] = function() {
+ return testPropsAll('animationName');
+ };
+
+
+ tests['csscolumns'] = function() {
+ return testPropsAll('columnCount');
+ };
+
+
+ tests['cssgradients'] = function() {
+ /**
+ * For CSS Gradients syntax, please see:
+ * webkit.org/blog/175/introducing-css-gradients/
+ * developer.mozilla.org/en/CSS/-moz-linear-gradient
+ * developer.mozilla.org/en/CSS/-moz-radial-gradient
+ * dev.w3.org/csswg/css3-images/#gradients-
+ */
+
+ var str1 = 'background-image:',
+ str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
+ str3 = 'linear-gradient(left top,#9f9, white);';
+
+ setCss(
+ // legacy webkit syntax (FIXME: remove when syntax not in use anymore)
+ (str1 + '-webkit- '.split(' ').join(str2 + str1) +
+ // standard syntax // trailing 'background-image:'
+ prefixes.join(str3 + str1)).slice(0, -str1.length)
+ );
+
+ return contains(mStyle.backgroundImage, 'gradient');
+ };
+
+
+ tests['cssreflections'] = function() {
+ return testPropsAll('boxReflect');
+ };
+
+
+ tests['csstransforms'] = function() {
+ return !!testPropsAll('transform');
+ };
+
+
+ tests['csstransforms3d'] = function() {
+
+ var ret = !!testPropsAll('perspective');
+
+ // Webkit's 3D transforms are passed off to the browser's own graphics renderer.
+ // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
+ // some conditions. As a result, Webkit typically recognizes the syntax but
+ // will sometimes throw a false positive, thus we must do a more thorough check:
+ if ( ret && 'webkitPerspective' in docElement.style ) {
+
+ // Webkit allows this media query to succeed only if the feature is enabled.
+ // `@media (transform-3d),(-webkit-transform-3d){ ... }`
+ injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {
+ ret = node.offsetLeft === 9 && node.offsetHeight === 3;
+ });
+ }
+ return ret;
+ };
+
+
+ tests['csstransitions'] = function() {
+ return testPropsAll('transition');
+ };
+
+
+ /*>>fontface*/
+ // @font-face detection routine by Diego Perini
+ // javascript.nwbox.com/CSSSupport/
+
+ // false positives:
+ // WebOS github.com/Modernizr/Modernizr/issues/342
+ // WP7 github.com/Modernizr/Modernizr/issues/538
+ tests['fontface'] = function() {
+ var bool;
+
+ injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) {
+ var style = document.getElementById('smodernizr'),
+ sheet = style.sheet || style.styleSheet,
+ cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';
+
+ bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;
+ });
+
+ return bool;
+ };
+ /*>>fontface*/
+
+ // CSS generated content detection
+ tests['generatedcontent'] = function() {
+ var bool;
+
+ injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {
+ bool = node.offsetHeight >= 3;
+ });
+
+ return bool;
+ };
+
+
+
+ // These tests evaluate support of the video/audio elements, as well as
+ // testing what types of content they support.
+ //
+ // We're using the Boolean constructor here, so that we can extend the value
+ // e.g. Modernizr.video // true
+ // Modernizr.video.ogg // 'probably'
+ //
+ // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
+ // thx to NielsLeenheer and zcorpan
+
+ // Note: in some older browsers, "no" was a return value instead of empty string.
+ // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2
+ // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5
+
+ tests['video'] = function() {
+ var elem = document.createElement('video'),
+ bool = false;
+
+ // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,'');
+
+ // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
+ bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
+
+ bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
+ }
+
+ } catch(e) { }
+
+ return bool;
+ };
+
+ tests['audio'] = function() {
+ var elem = document.createElement('audio'),
+ bool = false;
+
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,'');
+ bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,'');
+
+ // Mimetypes accepted:
+ // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
+ // bit.ly/iphoneoscodecs
+ bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,'');
+ bool.m4a = ( elem.canPlayType('audio/x-m4a;') ||
+ elem.canPlayType('audio/aac;')) .replace(/^no$/,'');
+ }
+ } catch(e) { }
+
+ return bool;
+ };
+
+
+ // In FF4, if disabled, window.localStorage should === null.
+
+ // Normally, we could not test that directly and need to do a
+ // `('localStorage' in window) && ` test first because otherwise Firefox will
+ // throw bugzil.la/365772 if cookies are disabled
+
+ // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem
+ // will throw the exception:
+ // QUOTA_EXCEEDED_ERRROR DOM Exception 22.
+ // Peculiarly, getItem and removeItem calls do not throw.
+
+ // Because we are forced to try/catch this, we'll go aggressive.
+
+ // Just FWIW: IE8 Compat mode supports these features completely:
+ // www.quirksmode.org/dom/html5.html
+ // But IE8 doesn't support either with local files
+
+ tests['localstorage'] = function() {
+ try {
+ localStorage.setItem(mod, mod);
+ localStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+ tests['sessionstorage'] = function() {
+ try {
+ sessionStorage.setItem(mod, mod);
+ sessionStorage.removeItem(mod);
+ return true;
+ } catch(e) {
+ return false;
+ }
+ };
+
+
+ tests['webworkers'] = function() {
+ return !!window.Worker;
+ };
+
+
+ tests['applicationcache'] = function() {
+ return !!window.applicationCache;
+ };
+
+
+ // Thanks to Erik Dahlstrom
+ tests['svg'] = function() {
+ return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;
+ };
+
+ // specifically for SVG inline in HTML, not within XHTML
+ // test page: paulirish.com/demo/inline-svg
+ tests['inlinesvg'] = function() {
+ var div = document.createElement('div');
+ div.innerHTML = '<svg/>';
+ return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
+ };
+
+ // SVG SMIL animation
+ tests['smil'] = function() {
+ return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));
+ };
+
+ // This test is only for clip paths in SVG proper, not clip paths on HTML content
+ // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg
+
+ // However read the comments to dig into applying SVG clippaths to HTML content here:
+ // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491
+ tests['svgclippaths'] = function() {
+ return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));
+ };
+
+ /*>>webforms*/
+ // input features and input types go directly onto the ret object, bypassing the tests loop.
+ // Hold this guy to execute in a moment.
+ function webforms() {
+ /*>>input*/
+ // Run through HTML5's new input attributes to see if the UA understands any.
+ // We're using f which is the <input> element created early on
+ // Mike Taylr has created a comprehensive resource for testing these attributes
+ // when applied to all input types:
+ // miketaylr.com/code/input-type-attr.html
+ // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
+
+ // Only input placeholder is tested while textarea's placeholder is not.
+ // Currently Safari 4 and Opera 11 have support only for the input placeholder
+ // Both tests are available in feature-detects/forms-placeholder.js
+ Modernizr['input'] = (function( props ) {
+ for ( var i = 0, len = props.length; i < len; i++ ) {
+ attrs[ props[i] ] = !!(props[i] in inputElem);
+ }
+ if (attrs.list){
+ // safari false positive's on datalist: webk.it/74252
+ // see also github.com/Modernizr/Modernizr/issues/146
+ attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
+ }
+ return attrs;
+ })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
+ /*>>input*/
+
+ /*>>inputtypes*/
+ // Run through HTML5's new input types to see if the UA understands any.
+ // This is put behind the tests runloop because it doesn't return a
+ // true/false like all the other tests; instead, it returns an object
+ // containing each input type with its corresponding true/false value
+
+ // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/
+ Modernizr['inputtypes'] = (function(props) {
+
+ for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
+
+ inputElem.setAttribute('type', inputElemType = props[i]);
+ bool = inputElem.type !== 'text';
+
+ // We first check to see if the type we give it sticks..
+ // If the type does, we feed it a textual value, which shouldn't be valid.
+ // If the value doesn't stick, we know there's input sanitization which infers a custom UI
+ if ( bool ) {
+
+ inputElem.value = smile;
+ inputElem.style.cssText = 'position:absolute;visibility:hidden;';
+
+ if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
+
+ docElement.appendChild(inputElem);
+ defaultView = document.defaultView;
+
+ // Safari 2-4 allows the smiley as a value, despite making a slider
+ bool = defaultView.getComputedStyle &&
+ defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
+ // Mobile android web browser has false positive, so must
+ // check the height to see if the widget is actually there.
+ (inputElem.offsetHeight !== 0);
+
+ docElement.removeChild(inputElem);
+
+ } else if ( /^(search|tel)$/.test(inputElemType) ){
+ // Spec doesn't define any special parsing or detectable UI
+ // behaviors so we pass these through as true
+
+ // Interestingly, opera fails the earlier test, so it doesn't
+ // even make it here.
+
+ } else if ( /^(url|email)$/.test(inputElemType) ) {
+ // Real url and email support comes with prebaked validation.
+ bool = inputElem.checkValidity && inputElem.checkValidity() === false;
+
+ } else {
+ // If the upgraded input compontent rejects the :) text, we got a winner
+ bool = inputElem.value != smile;
+ }
+ }
+
+ inputs[ props[i] ] = !!bool;
+ }
+ return inputs;
+ })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
+ /*>>inputtypes*/
+ }
+ /*>>webforms*/
+
+
+ // End of test definitions
+ // -----------------------
+
+
+
+ // Run through all tests and detect their support in the current UA.
+ // todo: hypothetically we could be doing an array of tests and use a basic loop here.
+ for ( var feature in tests ) {
+ if ( hasOwnProp(tests, feature) ) {
+ // run the test, throw the return value into the Modernizr,
+ // then based on that boolean, define an appropriate className
+ // and push it into an array of classes we'll join later.
+ featureName = feature.toLowerCase();
+ Modernizr[featureName] = tests[feature]();
+
+ classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
+ }
+ }
+
+ /*>>webforms*/
+ // input tests need to run.
+ Modernizr.input || webforms();
+ /*>>webforms*/
+
+
+ /**
+ * addTest allows the user to define their own feature tests
+ * the result will be added onto the Modernizr object,
+ * as well as an appropriate className set on the html element
+ *
+ * @param feature - String naming the feature
+ * @param test - Function returning true if feature is supported, false if not
+ */
+ Modernizr.addTest = function ( feature, test ) {
+ if ( typeof feature == 'object' ) {
+ for ( var key in feature ) {
+ if ( hasOwnProp( feature, key ) ) {
+ Modernizr.addTest( key, feature[ key ] );
+ }
+ }
+ } else {
+
+ feature = feature.toLowerCase();
+
+ if ( Modernizr[feature] !== undefined ) {
+ // we're going to quit if you're trying to overwrite an existing test
+ // if we were to allow it, we'd do this:
+ // var re = new RegExp("\\b(no-)?" + feature + "\\b");
+ // docElement.className = docElement.className.replace( re, '' );
+ // but, no rly, stuff 'em.
+ return Modernizr;
+ }
+
+ test = typeof test == 'function' ? test() : test;
+
+ if (typeof enableClasses !== "undefined" && enableClasses) {
+ docElement.className += ' ' + (test ? '' : 'no-') + feature;
+ }
+ Modernizr[feature] = test;
+
+ }
+
+ return Modernizr; // allow chaining.
+ };
+
+
+ // Reset modElem.cssText to nothing to reduce memory footprint.
+ setCss('');
+ modElem = inputElem = null;
+
+ /*>>shiv*/
+ /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */
+ ;(function(window, document) {
+ /*jshint evil:true */
+ /** Preset options */
+ var options = window.html5 || {};
+
+ /** Used to skip problem elements */
+ var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ /** Not all elements can be cloned in IE **/
+ var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
+
+ /** Detect whether the browser supports default html5 styles */
+ var supportsHtml5Styles;
+
+ /** Name of the expando, to work with multiple documents or to re-shiv one document */
+ var expando = '_html5shiv';
+
+ /** The id for the the documents expando */
+ var expanID = 0;
+
+ /** Cached data for each document */
+ var expandoData = {};
+
+ /** Detect whether the browser supports unknown elements */
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = '<xyz></xyz>';
+ //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ // assign a false positive if unable to shiv
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }());
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Creates a style sheet with the given CSS text and adds it to the document.
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @param {String} cssText The CSS text.
+ * @returns {StyleSheet} The style element.
+ */
+ function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
+
+ p.innerHTML = 'x<style>' + cssText + '</style>';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ /**
+ * Returns the value of `html5.elements` as an array.
+ * @private
+ * @returns {Array} An array of shived element node names.
+ */
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') : elements;
+ }
+
+ /**
+ * Returns the data associated to the given document
+ * @private
+ * @param {Document} ownerDocument The document.
+ * @returns {Object} An object of data.
+ */
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ /**
+ * returns a shived element for the given nodeName and document
+ * @memberOf html5
+ * @param {String} nodeName name of the element
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived element.
+ */
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ // Avoid adding some elements to fragments in IE < 9 because
+ // * Attributes like `name` or `type` cannot be set/changed once an element
+ // is inserted into a document/fragment
+ // * Link elements with `src` attributes that are inaccessible, as with
+ // a 403 response, will cause the tab/window to crash
+ // * Script elements appended to fragments will execute when their `src`
+ // or `text` property is set
+ return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;
+ }
+
+ /**
+ * returns a shived DocumentFragment for the given document
+ * @memberOf html5
+ * @param {Document} ownerDocument The context document.
+ * @returns {Object} The shived DocumentFragment.
+ */
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;i<l;i++){
+ clone.createElement(elems[i]);
+ }
+ return clone;
+ }
+
+ /**
+ * Shivs the `createElement` and `createDocumentFragment` methods of the document.
+ * @private
+ * @param {Document|DocumentFragment} ownerDocument The document.
+ * @param {Object} data of the document.
+ */
+ function shivMethods(ownerDocument, data) {
+ if (!data.cache) {
+ data.cache = {};
+ data.createElem = ownerDocument.createElement;
+ data.createFrag = ownerDocument.createDocumentFragment;
+ data.frag = data.createFrag();
+ }
+
+
+ ownerDocument.createElement = function(nodeName) {
+ //abort shiv
+ if (!html5.shivMethods) {
+ return data.createElem(nodeName);
+ }
+ return createElement(nodeName, ownerDocument, data);
+ };
+
+ ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
+ 'var n=f.cloneNode(),c=n.createElement;' +
+ 'h.shivMethods&&(' +
+ // unroll the `createElement` calls
+ getElements().join().replace(/\w+/g, function(nodeName) {
+ data.createElem(nodeName);
+ data.frag.createElement(nodeName);
+ return 'c("' + nodeName + '")';
+ }) +
+ ');return n}'
+ )(html5, data.frag);
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * Shivs the given document.
+ * @memberOf html5
+ * @param {Document} ownerDocument The document to shiv.
+ * @returns {Document} The shived document.
+ */
+ function shivDocument(ownerDocument) {
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ var data = getExpandoData(ownerDocument);
+
+ if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
+ data.hasCSS = !!addStyleSheet(ownerDocument,
+ // corrects block display not defined in IE6/7/8/9
+ 'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +
+ // adds styling not present in IE6/7/8/9
+ 'mark{background:#FF0;color:#000}'
+ );
+ }
+ if (!supportsUnknownElements) {
+ shivMethods(ownerDocument, data);
+ }
+ return ownerDocument;
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * The `html5` object is exposed so that more elements can be shived and
+ * existing shiving can be detected on iframes.
+ * @type Object
+ * @example
+ *
+ * // options can be changed before the script is included
+ * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
+ */
+ var html5 = {
+
+ /**
+ * An array or space separated string of node names of the elements to shiv.
+ * @memberOf html5
+ * @type Array|String
+ */
+ 'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',
+
+ /**
+ * A flag to indicate that the HTML5 style sheet should be inserted.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivCSS': (options.shivCSS !== false),
+
+ /**
+ * Is equal to true if a browser supports creating unknown/HTML5 elements
+ * @memberOf html5
+ * @type boolean
+ */
+ 'supportsUnknownElements': supportsUnknownElements,
+
+ /**
+ * A flag to indicate that the document's `createElement` and `createDocumentFragment`
+ * methods should be overwritten.
+ * @memberOf html5
+ * @type Boolean
+ */
+ 'shivMethods': (options.shivMethods !== false),
+
+ /**
+ * A string to describe the type of `html5` object ("default" or "default print").
+ * @memberOf html5
+ * @type String
+ */
+ 'type': 'default',
+
+ // shivs the document according to the specified `html5` object options
+ 'shivDocument': shivDocument,
+
+ //creates a shived element
+ createElement: createElement,
+
+ //creates a shived documentFragment
+ createDocumentFragment: createDocumentFragment
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ // expose html5
+ window.html5 = html5;
+
+ // shiv the document
+ shivDocument(document);
+
+ }(this, document));
+ /*>>shiv*/
+
+ // Assign private properties to the return object with prefix
+ Modernizr._version = version;
+
+ // expose these for the plugin API. Look in the source for how to join() them against your input
+ /*>>prefixes*/
+ Modernizr._prefixes = prefixes;
+ /*>>prefixes*/
+ /*>>domprefixes*/
+ Modernizr._domPrefixes = domPrefixes;
+ Modernizr._cssomPrefixes = cssomPrefixes;
+ /*>>domprefixes*/
+
+ /*>>mq*/
+ // Modernizr.mq tests a given media query, live against the current state of the window
+ // A few important notes:
+ // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false
+ // * A max-width or orientation query will be evaluated against the current state, which may change later.
+ // * You must specify values. Eg. If you are testing support for the min-width media query use:
+ // Modernizr.mq('(min-width:0)')
+ // usage:
+ // Modernizr.mq('only screen and (max-width:768)')
+ Modernizr.mq = testMediaQuery;
+ /*>>mq*/
+
+ /*>>hasevent*/
+ // Modernizr.hasEvent() detects support for a given event, with an optional element to test on
+ // Modernizr.hasEvent('gesturestart', elem)
+ Modernizr.hasEvent = isEventSupported;
+ /*>>hasevent*/
+
+ /*>>testprop*/
+ // Modernizr.testProp() investigates whether a given style property is recognized
+ // Note that the property names must be provided in the camelCase variant.
+ // Modernizr.testProp('pointerEvents')
+ Modernizr.testProp = function(prop){
+ return testProps([prop]);
+ };
+ /*>>testprop*/
+
+ /*>>testallprops*/
+ // Modernizr.testAllProps() investigates whether a given style property,
+ // or any of its vendor-prefixed variants, is recognized
+ // Note that the property names must be provided in the camelCase variant.
+ // Modernizr.testAllProps('boxSizing')
+ Modernizr.testAllProps = testPropsAll;
+ /*>>testallprops*/
+
+
+ /*>>teststyles*/
+ // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards
+ // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })
+ Modernizr.testStyles = injectElementWithStyles;
+ /*>>teststyles*/
+
+
+ /*>>prefixed*/
+ // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input
+ // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
+
+ // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.
+ // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:
+ //
+ // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
+
+ // If you're trying to ascertain which transition end event to bind to, you might do something like...
+ //
+ // var transEndEventNames = {
+ // 'WebkitTransition' : 'webkitTransitionEnd',
+ // 'MozTransition' : 'transitionend',
+ // 'OTransition' : 'oTransitionEnd',
+ // 'msTransition' : 'MSTransitionEnd',
+ // 'transition' : 'transitionend'
+ // },
+ // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];
+
+ Modernizr.prefixed = function(prop, obj, elem){
+ if(!obj) {
+ return testPropsAll(prop, 'pfx');
+ } else {
+ // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'
+ return testPropsAll(prop, obj, elem);
+ }
+ };
+ /*>>prefixed*/
+
+
+ /*>>cssclasses*/
+ // Remove "no-js" class from <html> element, if it exists:
+ docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') +
+
+ // Add the new classes to the <html> element.
+ (enableClasses ? ' js ' + classes.join(' ') : '');
+ /*>>cssclasses*/
+
+ return Modernizr;
+
+})(this, this.document);
diff --git a/debian/missing-sources/theme.js b/debian/missing-sources/theme.js
new file mode 100644
index 0000000..f0940e9
--- /dev/null
+++ b/debian/missing-sources/theme.js
@@ -0,0 +1,185 @@
+require = (function e(t, n, r) {
+ function s(o, u) {
+ if (!n[o]) {
+ if (!t[o]) {
+ var a = typeof require == "function" && require;
+ if (!u && a) return a(o, !0);
+ if (i) return i(o, !0);
+ var f = new Error("Cannot find module '" + o + "'");
+ throw f.code = "MODULE_NOT_FOUND", f
+ }
+ var l = n[o] = {
+ exports: {}
+ };
+ t[o][0].call(l.exports, function(e) {
+ var n = t[o][1][e];
+ return s(n ? n : e)
+ }, l, l.exports, e, t, n, r)
+ }
+ return n[o].exports
+ }
+ var i = typeof require == "function" && require;
+ for (var o = 0; o < r.length; o++) s(r[o]);
+ return s
+})({
+ "sphinx-rtd-theme": [function(require, module, exports) {
+ var jQuery = (typeof(window) != 'undefined') ? window.jQuery : require('jquery');
+
+ // Sphinx theme nav state
+ function ThemeNav() {
+
+ var nav = {
+ navBar: null,
+ win: null,
+ winScroll: false,
+ winResize: false,
+ linkScroll: false,
+ winPosition: 0,
+ winHeight: null,
+ docHeight: null,
+ isRunning: null
+ };
+
+ nav.enable = function() {
+ var self = this;
+
+ jQuery(function($) {
+ self.init($);
+
+ self.reset();
+ self.win.on('hashchange', self.reset);
+
+ // Set scroll monitor
+ self.win.on('scroll', function() {
+ if (!self.linkScroll) {
+ self.winScroll = true;
+ }
+ });
+ setInterval(function() {
+ if (self.winScroll) self.onScroll();
+ }, 25);
+
+ // Set resize monitor
+ self.win.on('resize', function() {
+ self.winResize = true;
+ });
+ setInterval(function() {
+ if (self.winResize) self.onResize();
+ }, 25);
+ self.onResize();
+ });
+ };
+
+ nav.init = function($) {
+ var doc = $(document),
+ self = this;
+
+ this.navBar = $('div.wy-side-scroll:first');
+ this.win = $(window);
+
+ // Set up javascript UX bits
+ $(document)
+ // Shift nav in mobile when clicking the menu.
+ .on('click', "[data-toggle='wy-nav-top']", function() {
+ $("[data-toggle='wy-nav-shift']").toggleClass("shift");
+ $("[data-toggle='rst-versions']").toggleClass("shift");
+ })
+
+ // Nav menu link click operations
+ .on('click', ".wy-menu-vertical .current ul li a", function() {
+ var target = $(this);
+ // Close menu when you click a link.
+ $("[data-toggle='wy-nav-shift']").removeClass("shift");
+ $("[data-toggle='rst-versions']").toggleClass("shift");
+ // Handle dynamic display of l3 and l4 nav lists
+ self.toggleCurrent(target);
+ self.hashChange();
+ })
+ .on('click', "[data-toggle='rst-current-version']", function() {
+ $("[data-toggle='rst-versions']").toggleClass("shift-up");
+ })
+
+ // Make tables responsive
+ $("table.docutils:not(.field-list)")
+ .wrap("<div class='wy-table-responsive'></div>");
+
+ // Add expand links to all parents of nested ul
+ $('.wy-menu-vertical ul').not('.simple').siblings('a').each(function() {
+ var link = $(this);
+ expand = $('<span class="toctree-expand"></span>');
+ expand.on('click', function(ev) {
+ self.toggleCurrent(link);
+ ev.stopPropagation();
+ return false;
+ });
+ link.prepend(expand);
+ });
+ };
+
+ nav.reset = function() {
+ // Get anchor from URL and open up nested nav
+ var anchor = encodeURI(window.location.hash);
+ if (anchor) {
+ try {
+ var link = $('.wy-menu-vertical')
+ .find('[href="' + anchor + '"]');
+ $('.wy-menu-vertical li.toctree-l1 li.current')
+ .removeClass('current');
+ link.closest('li.toctree-l2').addClass('current');
+ link.closest('li.toctree-l3').addClass('current');
+ link.closest('li.toctree-l4').addClass('current');
+ } catch (err) {
+ console.log("Error expanding nav for anchor", err);
+ }
+ }
+ };
+
+ nav.onScroll = function() {
+ this.winScroll = false;
+ var newWinPosition = this.win.scrollTop(),
+ winBottom = newWinPosition + this.winHeight,
+ navPosition = this.navBar.scrollTop(),
+ newNavPosition = navPosition + (newWinPosition - this.winPosition);
+ if (newWinPosition < 0 || winBottom > this.docHeight) {
+ return;
+ }
+ this.navBar.scrollTop(newNavPosition);
+ this.winPosition = newWinPosition;
+ };
+
+ nav.onResize = function() {
+ this.winResize = false;
+ this.winHeight = this.win.height();
+ this.docHeight = $(document).height();
+ };
+
+ nav.hashChange = function() {
+ this.linkScroll = true;
+ this.win.one('hashchange', function() {
+ this.linkScroll = false;
+ });
+ };
+
+ nav.toggleCurrent = function(elem) {
+ var parent_li = elem.closest('li');
+ parent_li.siblings('li.current').removeClass('current');
+ parent_li.siblings().find('li.current').removeClass('current');
+ parent_li.find('> ul li.current').removeClass('current');
+ parent_li.toggleClass('current');
+ }
+
+ return nav;
+ };
+
+ module.exports.ThemeNav = ThemeNav();
+
+ if (typeof(window) != 'undefined') {
+ window.SphinxRtdTheme = {
+ StickyNav: module.exports.ThemeNav
+ };
+ }
+
+ }, {
+ "jquery": "jquery"
+ }]
+}, {}, ["sphinx-rtd-theme"]);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pdal.git
More information about the Pkg-grass-devel
mailing list