├── notebook-snippet-manager-screencast.gif ├── LICENSE ├── README.md ├── test-notebook-snippet-manger-notebook.ipynb ├── notebook-snippet-manager.js └── list.js /notebook-snippet-manager-screencast.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/captainsafia/notebook-snippet-manager/HEAD/notebook-snippet-manager-screencast.gif -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Safia Abdalla 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # notebook-snippet-manager 2 | notebook-snippet-manager Jupyter Notebook extension for managing code snippets. 3 | The extension uses the browser's WebStorage API so clearing browsing data will 4 | wipe out all snippets and the amount of snippets that you can store is limited 5 | by the space limitations of your browser's WebStorage implementation. Please note 6 | that this extension is in beta, if you experience any difficulties, please submit 7 | any issue and I will do my best to address them promptly. Don't forget to star this 8 | repository so you can stay on top of the latest updates! 9 | 10 | ### To Dos 11 | - [ ] Explore alternatives to WebStorage 12 | - [ ] Add ability to search through snippets 13 | 14 | ### Installation Instructions 15 | 1. Run `jupyter --data-dir` to determine the location of your Jupyter Notebook configuration 16 | 2. Download `notebook-snippet-manager.js` and `list.js` and copy them to `$(jupyter --data-dir)/nbextensions`. 17 | 3. Run `jupyter nbextension enable notebook-snippet-manager`. 18 | 19 | cp list.js notebook-snippet-manager.js $(jupyter --data-dir)/nbextensions 20 | 21 | ### Usage Screencast 22 | ![Usage Screencast](notebook-snippet-manager-screencast.gif) 23 | -------------------------------------------------------------------------------- /test-notebook-snippet-manger-notebook.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "def jaccard_distance(seq1, seq2):\n", 12 | " set1, set2 = set(seq1), set(seq2)\n", 13 | " return 1 - len(set1 & set2) / float(len(set1 | set2))" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": null, 19 | "metadata": { 20 | "collapsed": true 21 | }, 22 | "outputs": [], 23 | "source": [ 24 | "def sorensen_distance(seq1, seq2):\n", 25 | " set1, set2 = set(seq1), set(seq2)\n", 26 | " return 1 - (2 * len(set1 & set2) / float(len(set1) + len(set2)))" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": { 33 | "collapsed": true 34 | }, 35 | "outputs": [], 36 | "source": [ 37 | "def hamming_distance(seq1, seq2, normalized = False):\n", 38 | " L = len(seq1)\n", 39 | " if L != len(seq2):\n", 40 | " raise ValueError(\"expected two strings of the same length\")\n", 41 | " if L == 0:\n", 42 | " return 0.0 if normalized else 0 # equal\n", 43 | " dist = sum(c1 != c2 for c1, c2 in zip(seq1, seq2))\n", 44 | " if normalized:\n", 45 | " return dist / float(L)\n", 46 | " return dist" 47 | ] 48 | } 49 | ], 50 | "metadata": { 51 | "kernelspec": { 52 | "display_name": "Python 3", 53 | "language": "python", 54 | "name": "python3" 55 | }, 56 | "language_info": { 57 | "codemirror_mode": { 58 | "name": "ipython", 59 | "version": 3 60 | }, 61 | "file_extension": ".py", 62 | "mimetype": "text/x-python", 63 | "name": "python", 64 | "nbconvert_exporter": "python", 65 | "pygments_lexer": "ipython3", 66 | "version": "3.5.1" 67 | } 68 | }, 69 | "nbformat": 4, 70 | "nbformat_minor": 1 71 | } 72 | -------------------------------------------------------------------------------- /notebook-snippet-manager.js: -------------------------------------------------------------------------------- 1 | define(['base/js/namespace', 2 | 'jquery', 3 | 'base/js/dialog', 4 | './list' 5 | ], function(Jupyter, $, dialog, list) { 6 | function storageAvailable(type) { 7 | try { 8 | var storage = window[type]; 9 | var x = '__storage_test__'; 10 | storage.setItem(x, x); 11 | storage.removeItem(x); 12 | return true; 13 | } catch (e) { 14 | return false; 15 | } 16 | } 17 | 18 | function add_snippet_to_storage(snippet_name, snippet_content) { 19 | var storage = window['localStorage']; 20 | var stored_snippets = storage.getItem('JupyterNotebookSnippets'); 21 | if (stored_snippets == null) { 22 | stored_snippets = {}; 23 | } else { 24 | stored_snippets = JSON.parse(stored_snippets); 25 | } 26 | stored_snippets[snippet_name] = snippet_content; 27 | var updated_snippets = JSON.stringify(stored_snippets); 28 | storage.setItem('JupyterNotebookSnippets', updated_snippets); 29 | } 30 | 31 | function remove_snippet_from_storage(snippet_name) { 32 | var storage = window['localStorage']; 33 | var stored_snippets = storage.getItem('JupyterNotebookSnippets'); 34 | if (stored_snippets == null) { 35 | return; 36 | } else { 37 | stored_snippets = JSON.parse(stored_snippets); 38 | } 39 | delete stored_snippets[snippet_name]; 40 | var updated_snippets = JSON.stringify(stored_snippets); 41 | storage.setItem('JupyterNotebookSnippets', updated_snippets); 42 | } 43 | 44 | function add_cell_to_snippet_manager() { 45 | var selected_cell = Jupyter.notebook.get_selected_cell(); 46 | var selected_content = selected_cell.get_text(); 47 | 48 | var modal_content = $('

').html("Please provide a name for this snippet."); 49 | modal_content.append($('

')); 50 | modal_content.append($('')); 51 | 52 | Jupyter.keyboard_manager.register_events(modal_content); 53 | 54 | dialog.modal({ 55 | title: 'Add Code Cell to Snippet Manager', 56 | body: modal_content, 57 | buttons: { 58 | Cancel: { 59 | 'class': 'btn-danger' 60 | }, 61 | OK: { 62 | 'class': 'btn-primary', 63 | 'click': function() { 64 | var snippet_name = $('input[name=snippet-name]').val(); 65 | add_snippet_to_storage(snippet_name, selected_content); 66 | } 67 | } 68 | } 69 | }); 70 | } 71 | 72 | function get_snippets() { 73 | var storage = window['localStorage']; 74 | var stored_snippets = storage.getItem('JupyterNotebookSnippets'); 75 | if (stored_snippets == null) { 76 | return {}; 77 | } else { 78 | return JSON.parse(stored_snippets); 79 | } 80 | } 81 | 82 | function add_cell_from_snippet_manager() { 83 | var selected_index = Jupyter.notebook.get_selected_index(); 84 | 85 | var modal_content = $('

').html('Select a snippet to insert.'); 86 | modal_content.append('

'); 87 | var list_content = $('

'); 88 | var table = $('
'); 89 | var table_children = table.children(); 90 | table_children.append('Selected' + 91 | 'Snippet Name' + 92 | 'Snippet Content'); 93 | 94 | var snippets = get_snippets(); 95 | for (var index in snippets) { 96 | var snippet = snippets[index]; 97 | table_children.append('' + 98 | '' + index + '' + 99 | '' + snippet + ''); 100 | } 101 | 102 | list_content.append(table); 103 | modal_content.append(list_content); 104 | 105 | Jupyter.keyboard_manager.register_events(modal_content); 106 | 107 | dialog.modal({ 108 | title: 'Select A Snippet to Include', 109 | body: modal_content, 110 | buttons: { 111 | 'Insert Snippet': { 112 | 'class': 'btn-primary', 113 | 'click': function() { 114 | var selected_snippets = $('.selected input:checked'); 115 | var selected_content = selected_snippets.map(function() { 116 | var content = $(this).parent('td').parent('tr').children('.content'); 117 | return $(content.get(0)).text(); 118 | }); 119 | for (var index in selected_content) { 120 | var code_cell = Jupyter.notebook.insert_cell_at_index('code', selected_index + index); 121 | code_cell.set_text(selected_content[index]); 122 | } 123 | } 124 | }, 125 | 'Delete Snippet': { 126 | 'class': 'btn-danger', 127 | 'click': function() { 128 | var selected_snippets = $('.selected input:checked'); 129 | var selected_names = selected_snippets.map(function() { 130 | var name = $(this).parent('td').parent('tr').children('.name'); 131 | return $(name.get(0)).text(); 132 | }); 133 | for (var index in selected_names) { 134 | remove_snippet_from_storage(selected_names[index]); 135 | } 136 | } 137 | } 138 | } 139 | }); 140 | 141 | } 142 | 143 | function place_snippet_manager_buttons() { 144 | if (!Jupyter.toolbar) { 145 | $([Jupyter.events]).on("app_initialized.NotebookApp", place_snippet_manager_buttons); 146 | return; 147 | } 148 | 149 | if ($(".snippet-manager-buttons").length === 0) { 150 | Jupyter.toolbar.add_buttons_group([{ 151 | 'label': 'Rec', 152 | 'icon': 'fa-arrow-circle-up', 153 | 'callback': add_cell_to_snippet_manager, 154 | 'id': 'add-cell-to-snippet-manager', 155 | 'class': 'snippet-manager-buttons' 156 | }, 157 | { 158 | 'label': 'Ins', 159 | 'icon': 'fa-arrow-circle-down', 160 | 'callback': add_cell_from_snippet_manager, 161 | 'id': 'add-cell-from-snippet-manager', 162 | 'class': 'snippet-manager-buttons' 163 | } 164 | ]); 165 | } 166 | } 167 | 168 | function load_ipython_extension() { 169 | console.log("Loading notebook-snippet-manager extension..."); 170 | if (storageAvailable('localStorage')) { 171 | place_snippet_manager_buttons(); 172 | } else { 173 | var modal_text = "It looks like you have the snippet-manager"; 174 | modal_text += " enabled but your browser doesn't support WebStorage."; 175 | modal_text += " Please switch to a browser with WebStorage to use snippet-manager."; 176 | var modal_content = $('

').html(modal_text); 177 | dialog.modal({ 178 | 'title': 'WebStorage Unavaialble', 179 | 'body': modal_content, 180 | 'buttons': { 181 | OK: {} 182 | } 183 | }); 184 | } 185 | } 186 | 187 | return { 188 | load_ipython_extension: load_ipython_extension 189 | }; 190 | }); 191 | -------------------------------------------------------------------------------- /list.js: -------------------------------------------------------------------------------- 1 | !function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;gb;b++)a.push(r.items[b].values());return a},this.add=function(a,b){if(0!==a.length){if(b)return void t(a,b);var c=[],e=!1;a[0]===d&&(a=[a]);for(var f=0,g=a.length;g>f;f++){var h=null;e=r.items.length>r.page?!0:!1,h=new s(a[f],d,e),r.items.push(h),c.push(h)}return r.update(),c}},this.show=function(a,b){return this.i=a,this.page=b,r.update(),r},this.remove=function(a,b,c){for(var d=0,e=0,f=r.items.length;f>e;e++)r.items[e].values()[a]==b&&(r.templater.remove(r.items[e],c),r.items.splice(e,1),f--,e--,d++);return r.update(),d},this.get=function(a,b){for(var c=[],d=0,e=r.items.length;e>d;d++){var f=r.items[d];f.values()[a]==b&&c.push(f)}return c},this.size=function(){return r.items.length},this.clear=function(){return r.templater.clear(),r.items=[],r},this.on=function(a,b){return r.handlers[a].push(b),r},this.off=function(a,b){var c=r.handlers[a],d=h(c,b);return d>-1&&c.splice(d,1),r},this.trigger=function(a){for(var b=r.handlers[a].length;b--;)r.handlers[a][b](r);return r},this.reset={filter:function(){for(var a=r.items,b=a.length;b--;)a[b].filtered=!1;return r},search:function(){for(var a=r.items,b=a.length;b--;)a[b].found=!1;return r}},this.update=function(){var a=r.items,b=a.length;r.visibleItems=[],r.matchingItems=[],r.templater.clear();for(var c=0;b>c;c++)a[c].matching()&&r.matchingItems.length+1>=r.i&&r.visibleItems.length0?setTimeout(function(){b(c,d,e)},1):(a.update(),d(e))};return b}},{}],3:[function(a,b,c){b.exports=function(a){return a.handlers.filterStart=a.handlers.filterStart||[],a.handlers.filterComplete=a.handlers.filterComplete||[],function(b){if(a.trigger("filterStart"),a.i=1,a.reset.filter(),void 0===b)a.filtered=!1;else{a.filtered=!0;for(var c=a.items,d=0,e=c.length;e>d;d++){var f=c[d];b(f)?f.filtered=!0:f.filtered=!1}}return a.update(),a.trigger("filterComplete"),a.visibleItems}}},{}],4:[function(a,b,c){b.exports=function(a){return function(b,c,d){var e=this;this._values={},this.found=!1,this.filtered=!1;var f=function(b,c,d){if(void 0===c)d?e.values(b,d):e.values(b);else{e.elm=c;var f=a.templater.get(e,b);e.values(f)}};this.values=function(b,c){if(void 0===b)return e._values;for(var d in b)e._values[d]=b[d];c!==!0&&a.templater.set(e,e.values())},this.show=function(){a.templater.show(e)},this.hide=function(){a.templater.hide(e)},this.matching=function(){return a.filtered&&a.searched&&e.found&&e.filtered||a.filtered&&!a.searched&&e.filtered||!a.filtered&&a.searched&&e.found||!a.filtered&&!a.searched},this.visible=function(){return e.elm&&e.elm.parentNode==a.list?!0:!1},f(b,c,d)}}},{}],5:[function(a,b,c){b.exports=function(b){var c=a("./item")(b),d=function(a){for(var b=a.childNodes,c=[],d=0,e=b.length;e>d;d++)void 0===b[d].data&&c.push(b[d]);return c},e=function(a,d){for(var e=0,f=a.length;f>e;e++)b.items.push(new c(d,a[e]))},f=function(a,c){var d=a.splice(0,50);e(d,c),a.length>0?setTimeout(function(){f(a,c)},1):(b.update(),b.trigger("parseComplete"))};return b.handlers.parseComplete=b.handlers.parseComplete||[],function(){var a=d(b.list),c=b.valueNames;b.indexAsync?f(a,c):e(a,c)}}},{"./item":4}],6:[function(a,b,c){b.exports=function(a){var b,c,d,e,f={resetList:function(){a.i=1,a.templater.clear(),e=void 0},setOptions:function(a){2==a.length&&a[1]instanceof Array?c=a[1]:2==a.length&&"function"==typeof a[1]?e=a[1]:3==a.length&&(c=a[1],e=a[2])},setColumns:function(){0!==a.items.length&&void 0===c&&(c=void 0===a.searchColumns?f.toArray(a.items[0].values()):a.searchColumns)},setSearchString:function(b){b=a.utils.toString(b).toLowerCase(),b=b.replace(/[-[\]{}()*+?.,\\^$|#]/g,"\\$&"),d=b},toArray:function(a){var b=[];for(var c in a)b.push(c);return b}},g={list:function(){for(var b=0,c=a.items.length;c>b;b++)g.item(a.items[b])},item:function(a){a.found=!1;for(var b=0,d=c.length;d>b;b++)if(g.values(a.values(),c[b]))return void(a.found=!0)},values:function(c,e){return c.hasOwnProperty(e)&&(b=a.utils.toString(c[e]).toLowerCase(),""!==d&&b.search(d)>-1)?!0:!1},reset:function(){a.reset.search(),a.searched=!1}},h=function(b){return a.trigger("searchStart"),f.resetList(),f.setSearchString(b),f.setOptions(arguments),f.setColumns(),""===d?g.reset():(a.searched=!0,e?e(d,c):g.list()),a.update(),a.trigger("searchComplete"),a.visibleItems};return a.handlers.searchStart=a.handlers.searchStart||[],a.handlers.searchComplete=a.handlers.searchComplete||[],a.utils.events.bind(a.utils.getByClass(a.listContainer,a.searchClass),"keyup",function(b){var c=b.target||b.srcElement,d=""===c.value&&!a.searched;d||h(c.value)}),a.utils.events.bind(a.utils.getByClass(a.listContainer,a.searchClass),"input",function(a){var b=a.target||a.srcElement;""===b.value&&h("")}),h}},{}],7:[function(a,b,c){b.exports=function(a){a.sortFunction=a.sortFunction||function(b,c,d){return d.desc="desc"==d.order?!0:!1,a.utils.naturalSort(b.values()[d.valueName],c.values()[d.valueName],d)};var b={els:void 0,clear:function(){for(var c=0,d=b.els.length;d>c;c++)a.utils.classes(b.els[c]).remove("asc"),a.utils.classes(b.els[c]).remove("desc")},getOrder:function(b){var c=a.utils.getAttribute(b,"data-order");return"asc"==c||"desc"==c?c:a.utils.classes(b).has("desc")?"asc":a.utils.classes(b).has("asc")?"desc":"asc"},getInSensitive:function(b,c){var d=a.utils.getAttribute(b,"data-insensitive");"false"===d?c.insensitive=!1:c.insensitive=!0},setOrder:function(c){for(var d=0,e=b.els.length;e>d;d++){var f=b.els[d];if(a.utils.getAttribute(f,"data-sort")===c.valueName){var g=a.utils.getAttribute(f,"data-order");"asc"==g||"desc"==g?g==c.order&&a.utils.classes(f).add(c.order):a.utils.classes(f).add(c.order)}}}},c=function(){a.trigger("sortStart");var c={},d=arguments[0].currentTarget||arguments[0].srcElement||void 0;d?(c.valueName=a.utils.getAttribute(d,"data-sort"),b.getInSensitive(d,c),c.order=b.getOrder(d)):(c=arguments[1]||c,c.valueName=arguments[0],c.order=c.order||"asc",c.insensitive="undefined"==typeof c.insensitive?!0:c.insensitive),b.clear(),b.setOrder(c),c.sortFunction=c.sortFunction||a.sortFunction,a.items.sort(function(a,b){var d="desc"===c.order?-1:1;return c.sortFunction(a,b,c)*d}),a.update(),a.trigger("sortComplete")};return a.handlers.sortStart=a.handlers.sortStart||[],a.handlers.sortComplete=a.handlers.sortComplete||[],b.els=a.utils.getByClass(a.listContainer,a.sortClass),a.utils.events.bind(b.els,"click",c),a.on("searchStart",b.clear),a.on("filterStart",b.clear),c}},{}],8:[function(a,b,c){var d=function(a){var b,c=this,d=function(){b=c.getItemSource(a.item),b=c.clearSourceItem(b,a.valueNames)};this.clearSourceItem=function(b,c){for(var d=0,e=c.length;e>d;d++){var f;if(c[d].data)for(var g=0,h=c[d].data.length;h>g;g++)b.setAttribute("data-"+c[d].data[g],"");else c[d].attr&&c[d].name?(f=a.utils.getByClass(b,c[d].name,!0),f&&f.setAttribute(c[d].attr,"")):(f=a.utils.getByClass(b,c[d],!0),f&&(f.innerHTML=""));f=void 0}return b},this.getItemSource=function(b){if(void 0===b){for(var c=a.list.childNodes,d=0,e=c.length;e>d;d++)if(void 0===c[d].data)return c[d].cloneNode(!0)}else{if(/^tr[\s>]/.exec(b)){var f=document.createElement("table");return f.innerHTML=b,f.firstChild}if(-1!==b.indexOf("<")){var g=document.createElement("div");return g.innerHTML=b,g.firstChild}var h=document.getElementById(a.item);if(h)return h}throw new Error("The list need to have at list one item on init otherwise you'll have to add a template.")},this.get=function(b,d){c.create(b);for(var e={},f=0,g=d.length;g>f;f++){var h;if(d[f].data)for(var i=0,j=d[f].data.length;j>i;i++)e[d[f].data[i]]=a.utils.getAttribute(b.elm,"data-"+d[f].data[i]);else d[f].attr&&d[f].name?(h=a.utils.getByClass(b.elm,d[f].name,!0),e[d[f].name]=h?a.utils.getAttribute(h,d[f].attr):""):(h=a.utils.getByClass(b.elm,d[f],!0),e[d[f]]=h?h.innerHTML:"");h=void 0}return e},this.set=function(b,d){var e=function(b){for(var c=0,d=a.valueNames.length;d>c;c++)if(a.valueNames[c].data){for(var e=a.valueNames[c].data,f=0,g=e.length;g>f;f++)if(e[f]===b)return{data:b}}else{if(a.valueNames[c].attr&&a.valueNames[c].name&&a.valueNames[c].name==b)return a.valueNames[c];if(a.valueNames[c]===b)return b}},f=function(c,d){var f,g=e(c);g&&(g.data?b.elm.setAttribute("data-"+g.data,d):g.attr&&g.name?(f=a.utils.getByClass(b.elm,g.name,!0),f&&f.setAttribute(g.attr,d)):(f=a.utils.getByClass(b.elm,g,!0),f&&(f.innerHTML=d)),f=void 0)};if(!c.create(b))for(var g in d)d.hasOwnProperty(g)&&f(g,d[g])},this.create=function(a){if(void 0!==a.elm)return!1;var d=b.cloneNode(!0);return d.removeAttribute("id"),a.elm=d,c.set(a,a.values()),!0},this.remove=function(b){b.elm.parentNode===a.list&&a.list.removeChild(b.elm)},this.show=function(b){c.create(b),a.list.appendChild(b.elm)},this.hide=function(b){void 0!==b.elm&&b.elm.parentNode===a.list&&a.list.removeChild(b.elm)},this.clear=function(){if(a.list.hasChildNodes())for(;a.list.childNodes.length>=1;)a.list.removeChild(a.list.firstChild)},d()};b.exports=function(a){return new d(a)}},{}],9:[function(a,b,c){function d(a){if(!a||!a.nodeType)throw new Error("A DOM element reference is required");this.el=a,this.list=a.classList}var e=a("./index-of"),f=/\s+/,g=Object.prototype.toString;b.exports=function(a){return new d(a)},d.prototype.add=function(a){if(this.list)return this.list.add(a),this;var b=this.array(),c=e(b,a);return~c||b.push(a),this.el.className=b.join(" "),this},d.prototype.remove=function(a){if("[object RegExp]"==g.call(a))return this.removeMatching(a);if(this.list)return this.list.remove(a),this;var b=this.array(),c=e(b,a);return~c&&b.splice(c,1),this.el.className=b.join(" "),this},d.prototype.removeMatching=function(a){for(var b=this.array(),c=0;cf;f++)void 0!==b[f]&&b[f].nodeName===b&&(c=b[f].nodeValue);return c}},{}],13:[function(a,b,c){b.exports=function(){return document.getElementsByClassName?function(a,b,c){return c?a.getElementsByClassName(b)[0]:a.getElementsByClassName(b)}:document.querySelector?function(a,b,c){return b="."+b,c?a.querySelector(b):a.querySelectorAll(b)}:function(a,b,c){var d=[],e="*";null===a&&(a=document);for(var f=a.getElementsByTagName(e),g=f.length,h=new RegExp("(^|\\s)"+b+"(\\s|$)"),i=0,j=0;g>i;i++)if(h.test(f[i].className)){if(c)return f[i];d[j]=f[i],j++}return d}}()},{}],14:[function(a,b,c){var d=[].indexOf;b.exports=function(a,b){if(d)return a.indexOf(b);for(var c=0;cr)return-1;if(r>s)return 1}for(var u=0,v=p.length,w=q.length,x=Math.max(v,w);x>u;u++){if(d=t(p[u],v),e=t(q[u],w),isNaN(d)!==isNaN(e))return isNaN(d)?1:-1;if(typeof d!=typeof e&&(d+="",e+=""),e>d)return-1;if(d>e)return 1}return 0}},{}],16:[function(a,b,c){function d(a){return"[object Array]"===Object.prototype.toString.call(a)}b.exports=function(a){if("undefined"==typeof a)return[];if(null===a)return[null];if(a===window)return[window];if("string"==typeof a)return[a];if(d(a))return a;if("number"!=typeof a.length)return[a];if("function"==typeof a&&a instanceof Function)return[a];for(var b=[],c=0;c