├── 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 | 
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;g
b;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