bee_api 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/bin/bee_api +84 -0
  2. data/lib/mdpreview.rb +80 -0
  3. data/lib/mdpreview/translator.rb +60 -0
  4. data/lib/mdpreview/version.rb +3 -0
  5. data/test/mdptest.rb +100 -0
  6. data/vendor/HISTORY.md +237 -0
  7. data/vendor/Jakefile.js +316 -0
  8. data/vendor/LICENSE +176 -0
  9. data/vendor/NOTICE +17 -0
  10. data/vendor/README.md +102 -0
  11. data/vendor/app/chrome/documentation.txt +12 -0
  12. data/vendor/app/chrome/manifest.json +24 -0
  13. data/vendor/app/web/ajax.js +43 -0
  14. data/vendor/app/web/app.css +292 -0
  15. data/vendor/app/web/app.js +377 -0
  16. data/vendor/app/web/beta/index.html +17 -0
  17. data/vendor/app/web/datapolicy.txt +48 -0
  18. data/vendor/app/web/doc/doc.css +60 -0
  19. data/vendor/app/web/doc/img/actions_menu.png +0 -0
  20. data/vendor/app/web/doc/img/button_actions_menu.png +0 -0
  21. data/vendor/app/web/doc/img/button_dragarea.png +0 -0
  22. data/vendor/app/web/doc/img/jsoneditor.png +0 -0
  23. data/vendor/app/web/doc/img/jsonformatter.png +0 -0
  24. data/vendor/app/web/doc/img/main_menu.png +0 -0
  25. data/vendor/app/web/doc/img/splitter.png +0 -0
  26. data/vendor/app/web/doc/index.html +201 -0
  27. data/vendor/app/web/favicon.ico +0 -0
  28. data/vendor/app/web/fileretriever.css +54 -0
  29. data/vendor/app/web/fileretriever.js +567 -0
  30. data/vendor/app/web/fileretriever.php +120 -0
  31. data/vendor/app/web/googlea47c4a0b36d11021.html +1 -0
  32. data/vendor/app/web/hash.js +133 -0
  33. data/vendor/app/web/img/description.txt +20 -0
  34. data/vendor/app/web/img/header_background.png +0 -0
  35. data/vendor/app/web/img/icon_128.png +0 -0
  36. data/vendor/app/web/img/icon_16.png +0 -0
  37. data/vendor/app/web/img/icon_gray.svg +151 -0
  38. data/vendor/app/web/img/icon_gray_16.svg +150 -0
  39. data/vendor/app/web/img/icon_orange.svg +151 -0
  40. data/vendor/app/web/img/logo.png +0 -0
  41. data/vendor/app/web/img/logo.xcf +0 -0
  42. data/vendor/app/web/img/logo_app.png +0 -0
  43. data/vendor/app/web/img/logo_app.xcf +0 -0
  44. data/vendor/app/web/index.html +191 -0
  45. data/vendor/app/web/notify.js +150 -0
  46. data/vendor/app/web/queryparams.js +71 -0
  47. data/vendor/app/web/robots.txt +0 -0
  48. data/vendor/app/web/splitter.js +179 -0
  49. data/vendor/app/web/test.html +224 -0
  50. data/vendor/component.json +33 -0
  51. data/vendor/docs/api.md +188 -0
  52. data/vendor/docs/usage.md +137 -0
  53. data/vendor/examples/01_basic_usage.html +45 -0
  54. data/vendor/examples/02_viewer.html +38 -0
  55. data/vendor/examples/03_switch_mode.html +98 -0
  56. data/vendor/examples/cur.file +1 -0
  57. data/vendor/examples/jquery.js +2 -0
  58. data/vendor/examples/meta.js +1 -0
  59. data/vendor/examples/requirejs_demo/requirejs_demo.html +19 -0
  60. data/vendor/examples/requirejs_demo/scripts/main.js +25 -0
  61. data/vendor/examples/requirejs_demo/scripts/require.js +35 -0
  62. data/vendor/img/jsoneditor-icons.png +0 -0
  63. data/vendor/jsoneditor-min.css +1 -0
  64. data/vendor/jsoneditor-min.js +34 -0
  65. data/vendor/jsoneditor.css +597 -0
  66. data/vendor/jsoneditor.js +6069 -0
  67. data/vendor/jsoneditor/css/contextmenu.css +219 -0
  68. data/vendor/jsoneditor/css/img/description.txt +13 -0
  69. data/vendor/jsoneditor/css/img/export.sh +16 -0
  70. data/vendor/jsoneditor/css/img/jsoneditor-icons.png +0 -0
  71. data/vendor/jsoneditor/css/img/jsoneditor-icons.svg +861 -0
  72. data/vendor/jsoneditor/css/jsoneditor.css +220 -0
  73. data/vendor/jsoneditor/css/menu.css +81 -0
  74. data/vendor/jsoneditor/css/searchbox.css +73 -0
  75. data/vendor/jsoneditor/js/appendnode.js +211 -0
  76. data/vendor/jsoneditor/js/contextmenu.js +440 -0
  77. data/vendor/jsoneditor/js/header.js +32 -0
  78. data/vendor/jsoneditor/js/highlighter.js +82 -0
  79. data/vendor/jsoneditor/js/history.js +218 -0
  80. data/vendor/jsoneditor/js/jsoneditor.js +206 -0
  81. data/vendor/jsoneditor/js/module.js +50 -0
  82. data/vendor/jsoneditor/js/node.js +2864 -0
  83. data/vendor/jsoneditor/js/searchbox.js +288 -0
  84. data/vendor/jsoneditor/js/texteditor.js +311 -0
  85. data/vendor/jsoneditor/js/treeeditor.js +770 -0
  86. data/vendor/jsoneditor/js/util.js +582 -0
  87. data/vendor/lib/ace/ace.js +11 -0
  88. data/vendor/lib/ace/mode-json.js +1 -0
  89. data/vendor/lib/ace/theme-jsoneditor.js +144 -0
  90. data/vendor/lib/ace/theme-textmate.js +163 -0
  91. data/vendor/lib/ace/worker-json.js +1 -0
  92. data/vendor/lib/jsonlint/README.md +62 -0
  93. data/vendor/lib/jsonlint/jsonlint.js +432 -0
  94. data/vendor/misc/screenshots/actionsmenu_640x400.png +0 -0
  95. data/vendor/misc/screenshots/codeeditor_640x400.png +0 -0
  96. data/vendor/misc/screenshots/description.json +17 -0
  97. data/vendor/misc/screenshots/jsoneditoronline.png +0 -0
  98. data/vendor/misc/screenshots/jsoneditoronline_640x400.png +0 -0
  99. data/vendor/misc/screenshots/search_640x400.png +0 -0
  100. data/vendor/misc/screenshots/small_tile.xcf +0 -0
  101. data/vendor/misc/screenshots/small_tile_440x280.png +0 -0
  102. data/vendor/misc/todo.txt +101 -0
  103. data/vendor/package.json +28 -0
  104. data/vendor/test/couchdbeditor.html +100 -0
  105. data/vendor/test/largefile.json +12605 -0
  106. data/vendor/test/test_ace.html +60 -0
  107. data/vendor/test/test_editable_div.html +449 -0
  108. metadata +154 -0
@@ -0,0 +1,440 @@
1
+ /**
2
+ * A context menu
3
+ * @param {Object[]} items Array containing the menu structure
4
+ * TODO: describe structure
5
+ * @param {Object} [options] Object with options. Available options:
6
+ * {function} close Callback called when the
7
+ * context menu is being closed.
8
+ * @constructor
9
+ */
10
+ function ContextMenu (items, options) {
11
+ this.dom = {};
12
+
13
+ var me = this;
14
+ var dom = this.dom;
15
+ this.anchor = undefined;
16
+ this.items = items;
17
+ this.eventListeners = {};
18
+ this.selection = undefined; // holds the selection before the menu was opened
19
+ this.visibleSubmenu = undefined;
20
+ this.onClose = options ? options.close : undefined;
21
+
22
+ // create a container element
23
+ var menu = document.createElement('div');
24
+ menu.className = 'jsoneditor-contextmenu';
25
+ dom.menu = menu;
26
+
27
+ // create a list to hold the menu items
28
+ var list = document.createElement('ul');
29
+ list.className = 'menu';
30
+ menu.appendChild(list);
31
+ dom.list = list;
32
+ dom.items = []; // list with all buttons
33
+
34
+ // create a (non-visible) button to set the focus to the menu
35
+ var focusButton = document.createElement('button');
36
+ dom.focusButton = focusButton;
37
+ var li = document.createElement('li');
38
+ li.style.overflow = 'hidden';
39
+ li.style.height = '0';
40
+ li.appendChild(focusButton);
41
+ list.appendChild(li);
42
+
43
+ function createMenuItems (list, domItems, items) {
44
+ items.forEach(function (item) {
45
+ if (item.type == 'separator') {
46
+ // create a separator
47
+ var separator = document.createElement('div');
48
+ separator.className = 'separator';
49
+ li = document.createElement('li');
50
+ li.appendChild(separator);
51
+ list.appendChild(li);
52
+ }
53
+ else {
54
+ var domItem = {};
55
+
56
+ // create a menu item
57
+ var li = document.createElement('li');
58
+ list.appendChild(li);
59
+
60
+ // create a button in the menu item
61
+ var button = document.createElement('button');
62
+ button.className = item.className;
63
+ domItem.button = button;
64
+ if (item.title) {
65
+ button.title = item.title;
66
+ }
67
+ if (item.click) {
68
+ button.onclick = function () {
69
+ me.hide();
70
+ item.click();
71
+ };
72
+ }
73
+ li.appendChild(button);
74
+
75
+ // create the contents of the button
76
+ if (item.submenu) {
77
+ // add the icon to the button
78
+ var divIcon = document.createElement('div');
79
+ divIcon.className = 'icon';
80
+ button.appendChild(divIcon);
81
+ button.appendChild(document.createTextNode(item.text));
82
+
83
+ var buttonSubmenu;
84
+ if (item.click) {
85
+ // submenu and a button with a click handler
86
+ button.className += ' default';
87
+
88
+ var buttonExpand = document.createElement('button');
89
+ domItem.buttonExpand = buttonExpand;
90
+ buttonExpand.className = 'expand';
91
+ buttonExpand.innerHTML = '<div class="expand"></div>';
92
+ li.appendChild(buttonExpand);
93
+ if (item.submenuTitle) {
94
+ buttonExpand.title = item.submenuTitle;
95
+ }
96
+
97
+ buttonSubmenu = buttonExpand;
98
+ }
99
+ else {
100
+ // submenu and a button without a click handler
101
+ var divExpand = document.createElement('div');
102
+ divExpand.className = 'expand';
103
+ button.appendChild(divExpand);
104
+
105
+ buttonSubmenu = button;
106
+ }
107
+
108
+ // attach a handler to expand/collapse the submenu
109
+ buttonSubmenu.onclick = function () {
110
+ me._onExpandItem(domItem);
111
+ buttonSubmenu.focus();
112
+ };
113
+
114
+ // create the submenu
115
+ var domSubItems = [];
116
+ domItem.subItems = domSubItems;
117
+ var ul = document.createElement('ul');
118
+ domItem.ul = ul;
119
+ ul.className = 'menu';
120
+ ul.style.height = '0';
121
+ li.appendChild(ul);
122
+ createMenuItems(ul, domSubItems, item.submenu);
123
+ }
124
+ else {
125
+ // no submenu, just a button with clickhandler
126
+ button.innerHTML = '<div class="icon"></div>' + item.text;
127
+ }
128
+
129
+ domItems.push(domItem);
130
+ }
131
+ });
132
+ }
133
+ createMenuItems(list, this.dom.items, items);
134
+
135
+ // TODO: when the editor is small, show the submenu on the right instead of inline?
136
+
137
+ // calculate the max height of the menu with one submenu expanded
138
+ this.maxHeight = 0; // height in pixels
139
+ items.forEach(function (item) {
140
+ var height = (items.length + (item.submenu ? item.submenu.length : 0)) * 24;
141
+ me.maxHeight = Math.max(me.maxHeight, height);
142
+ });
143
+ }
144
+
145
+ /**
146
+ * Get the currently visible buttons
147
+ * @return {Array.<HTMLElement>} buttons
148
+ * @private
149
+ */
150
+ ContextMenu.prototype._getVisibleButtons = function () {
151
+ var buttons = [];
152
+ var me = this;
153
+ this.dom.items.forEach(function (item) {
154
+ buttons.push(item.button);
155
+ if (item.buttonExpand) {
156
+ buttons.push(item.buttonExpand);
157
+ }
158
+ if (item.subItems && item == me.expandedItem) {
159
+ item.subItems.forEach(function (subItem) {
160
+ buttons.push(subItem.button);
161
+ if (subItem.buttonExpand) {
162
+ buttons.push(subItem.buttonExpand);
163
+ }
164
+ // TODO: change to fully recursive method
165
+ });
166
+ }
167
+ });
168
+
169
+ return buttons;
170
+ };
171
+
172
+ // currently displayed context menu, a singleton. We may only have one visible context menu
173
+ ContextMenu.visibleMenu = undefined;
174
+
175
+ /**
176
+ * Attach the menu to an anchor
177
+ * @param {HTMLElement} anchor
178
+ */
179
+ ContextMenu.prototype.show = function (anchor) {
180
+ this.hide();
181
+
182
+ // calculate whether the menu fits below the anchor
183
+ var windowHeight = util.getWindowHeight();
184
+ var anchorHeight = anchor.offsetHeight;
185
+ var menuHeight = this.maxHeight;
186
+
187
+ // position the menu
188
+ var left = util.getAbsoluteLeft(anchor);
189
+ var top = util.getAbsoluteTop(anchor);
190
+ if (top + anchorHeight + menuHeight < windowHeight) {
191
+ // display the menu below the anchor
192
+ this.dom.menu.style.left = left + 'px';
193
+ this.dom.menu.style.top = (top + anchorHeight) + 'px';
194
+ this.dom.menu.style.bottom = '';
195
+ }
196
+ else {
197
+ // display the menu above the anchor
198
+ this.dom.menu.style.left = left + 'px';
199
+ this.dom.menu.style.top = '';
200
+ this.dom.menu.style.bottom = (windowHeight - top) + 'px';
201
+ }
202
+
203
+ // attach the menu to the document
204
+ document.body.appendChild(this.dom.menu);
205
+
206
+ // create and attach event listeners
207
+ var me = this;
208
+ var list = this.dom.list;
209
+ this.eventListeners.mousedown = util.addEventListener(
210
+ document, 'mousedown', function (event) {
211
+ // hide menu on click outside of the menu
212
+ event = event || window.event;
213
+ var target = event.target || event.srcElement;
214
+ if ((target != list) && !me._isChildOf(target, list)) {
215
+ me.hide();
216
+ util.stopPropagation(event);
217
+ util.preventDefault(event);
218
+ }
219
+ });
220
+ this.eventListeners.mousewheel = util.addEventListener(
221
+ document, 'mousewheel', function () {
222
+ // hide the menu on mouse scroll
223
+ util.stopPropagation(event);
224
+ util.preventDefault(event);
225
+ });
226
+ this.eventListeners.keydown = util.addEventListener(
227
+ document, 'keydown', function (event) {
228
+ me._onKeyDown(event);
229
+ });
230
+
231
+ // move focus to the first button in the context menu
232
+ this.selection = util.getSelection();
233
+ this.anchor = anchor;
234
+ setTimeout(function () {
235
+ me.dom.focusButton.focus();
236
+ }, 0);
237
+
238
+ if (ContextMenu.visibleMenu) {
239
+ ContextMenu.visibleMenu.hide();
240
+ }
241
+ ContextMenu.visibleMenu = this;
242
+ };
243
+
244
+ /**
245
+ * Hide the context menu if visible
246
+ */
247
+ ContextMenu.prototype.hide = function () {
248
+ // remove the menu from the DOM
249
+ if (this.dom.menu.parentNode) {
250
+ this.dom.menu.parentNode.removeChild(this.dom.menu);
251
+ if (this.onClose) {
252
+ this.onClose();
253
+ }
254
+ }
255
+
256
+ // remove all event listeners
257
+ // all event listeners are supposed to be attached to document.
258
+ for (var name in this.eventListeners) {
259
+ if (this.eventListeners.hasOwnProperty(name)) {
260
+ var fn = this.eventListeners[name];
261
+ if (fn) {
262
+ util.removeEventListener(document, name, fn);
263
+ }
264
+ delete this.eventListeners[name];
265
+ }
266
+ }
267
+
268
+ if (ContextMenu.visibleMenu == this) {
269
+ ContextMenu.visibleMenu = undefined;
270
+ }
271
+ };
272
+
273
+ /**
274
+ * Expand a submenu
275
+ * Any currently expanded submenu will be hided.
276
+ * @param {Object} domItem
277
+ * @private
278
+ */
279
+ ContextMenu.prototype._onExpandItem = function (domItem) {
280
+ var me = this;
281
+ var alreadyVisible = (domItem == this.expandedItem);
282
+
283
+ // hide the currently visible submenu
284
+ var expandedItem = this.expandedItem;
285
+ if (expandedItem) {
286
+ //var ul = expandedItem.ul;
287
+ expandedItem.ul.style.height = '0';
288
+ expandedItem.ul.style.padding = '';
289
+ setTimeout(function () {
290
+ if (me.expandedItem != expandedItem) {
291
+ expandedItem.ul.style.display = '';
292
+ util.removeClassName(expandedItem.ul.parentNode, 'selected');
293
+ }
294
+ }, 300); // timeout duration must match the css transition duration
295
+ this.expandedItem = undefined;
296
+ }
297
+
298
+ if (!alreadyVisible) {
299
+ var ul = domItem.ul;
300
+ ul.style.display = 'block';
301
+ var height = ul.clientHeight; // force a reflow in Firefox
302
+ setTimeout(function () {
303
+ if (me.expandedItem == domItem) {
304
+ ul.style.height = (ul.childNodes.length * 24) + 'px';
305
+ ul.style.padding = '5px 10px';
306
+ }
307
+ }, 0);
308
+ util.addClassName(ul.parentNode, 'selected');
309
+ this.expandedItem = domItem;
310
+ }
311
+ };
312
+
313
+ /**
314
+ * Handle onkeydown event
315
+ * @param {Event} event
316
+ * @private
317
+ */
318
+ ContextMenu.prototype._onKeyDown = function (event) {
319
+ event = event || window.event;
320
+ var target = event.target || event.srcElement;
321
+ var keynum = event.which || event.keyCode;
322
+ var handled = false;
323
+ var buttons, targetIndex, prevButton, nextButton;
324
+
325
+ if (keynum == 27) { // ESC
326
+ // hide the menu on ESC key
327
+
328
+ // restore previous selection and focus
329
+ if (this.selection) {
330
+ util.setSelection(this.selection);
331
+ }
332
+ if (this.anchor) {
333
+ this.anchor.focus();
334
+ }
335
+
336
+ this.hide();
337
+
338
+ handled = true;
339
+ }
340
+ else if (keynum == 9) { // Tab
341
+ if (!event.shiftKey) { // Tab
342
+ buttons = this._getVisibleButtons();
343
+ targetIndex = buttons.indexOf(target);
344
+ if (targetIndex == buttons.length - 1) {
345
+ // move to first button
346
+ buttons[0].focus();
347
+ handled = true;
348
+ }
349
+ }
350
+ else { // Shift+Tab
351
+ buttons = this._getVisibleButtons();
352
+ targetIndex = buttons.indexOf(target);
353
+ if (targetIndex == 0) {
354
+ // move to last button
355
+ buttons[buttons.length - 1].focus();
356
+ handled = true;
357
+ }
358
+ }
359
+ }
360
+ else if (keynum == 37) { // Arrow Left
361
+ if (target.className == 'expand') {
362
+ buttons = this._getVisibleButtons();
363
+ targetIndex = buttons.indexOf(target);
364
+ prevButton = buttons[targetIndex - 1];
365
+ if (prevButton) {
366
+ prevButton.focus();
367
+ }
368
+ }
369
+ handled = true;
370
+ }
371
+ else if (keynum == 38) { // Arrow Up
372
+ buttons = this._getVisibleButtons();
373
+ targetIndex = buttons.indexOf(target);
374
+ prevButton = buttons[targetIndex - 1];
375
+ if (prevButton && prevButton.className == 'expand') {
376
+ // skip expand button
377
+ prevButton = buttons[targetIndex - 2];
378
+ }
379
+ if (!prevButton) {
380
+ // move to last button
381
+ prevButton = buttons[buttons.length - 1];
382
+ }
383
+ if (prevButton) {
384
+ prevButton.focus();
385
+ }
386
+ handled = true;
387
+ }
388
+ else if (keynum == 39) { // Arrow Right
389
+ buttons = this._getVisibleButtons();
390
+ targetIndex = buttons.indexOf(target);
391
+ nextButton = buttons[targetIndex + 1];
392
+ if (nextButton && nextButton.className == 'expand') {
393
+ nextButton.focus();
394
+ }
395
+ handled = true;
396
+ }
397
+ else if (keynum == 40) { // Arrow Down
398
+ buttons = this._getVisibleButtons();
399
+ targetIndex = buttons.indexOf(target);
400
+ nextButton = buttons[targetIndex + 1];
401
+ if (nextButton && nextButton.className == 'expand') {
402
+ // skip expand button
403
+ nextButton = buttons[targetIndex + 2];
404
+ }
405
+ if (!nextButton) {
406
+ // move to first button
407
+ nextButton = buttons[0];
408
+ }
409
+ if (nextButton) {
410
+ nextButton.focus();
411
+ handled = true;
412
+ }
413
+ handled = true;
414
+ }
415
+ // TODO: arrow left and right
416
+
417
+ if (handled) {
418
+ util.stopPropagation(event);
419
+ util.preventDefault(event);
420
+ }
421
+ };
422
+
423
+ /**
424
+ * Test if an element is a child of a parent element.
425
+ * @param {Element} child
426
+ * @param {Element} parent
427
+ * @return {boolean} isChild
428
+ */
429
+ ContextMenu.prototype._isChildOf = function (child, parent) {
430
+ var e = child.parentNode;
431
+ while (e) {
432
+ if (e == parent) {
433
+ return true;
434
+ }
435
+ e = e.parentNode;
436
+ }
437
+
438
+ return false;
439
+ };
440
+
@@ -0,0 +1,32 @@
1
+ /*!
2
+ * jsoneditor.js
3
+ *
4
+ * @brief
5
+ * JSONEditor is a web-based tool to view, edit, and format JSON.
6
+ * It shows data a clear, editable treeview.
7
+ *
8
+ * Supported browsers: Chrome, Firefox, Safari, Opera, Internet Explorer 8+
9
+ *
10
+ * @license
11
+ * This json editor is open sourced with the intention to use the editor as
12
+ * a component in your own application. Not to just copy and monetize the editor
13
+ * as it is.
14
+ *
15
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
16
+ * use this file except in compliance with the License. You may obtain a copy
17
+ * of the License at
18
+ *
19
+ * http://www.apache.org/licenses/LICENSE-2.0
20
+ *
21
+ * Unless required by applicable law or agreed to in writing, software
22
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
23
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
24
+ * License for the specific language governing permissions and limitations under
25
+ * the License.
26
+ *
27
+ * Copyright (c) 2011-2013 Jos de Jong, http://jsoneditoronline.org
28
+ *
29
+ * @author Jos de Jong, <wjosdejong@gmail.com>
30
+ * @version @@version
31
+ * @date @@date
32
+ */