overpass-doc 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/Rakefile +27 -0
  4. data/bin/overpass-doc +12 -0
  5. data/lib/overpass-doc.rb +9 -0
  6. data/lib/overpass-doc/assets/bootstrap.min.css +7 -0
  7. data/lib/overpass-doc/assets/bootstrap.min.js +7 -0
  8. data/lib/overpass-doc/assets/codemirror.css +176 -0
  9. data/lib/overpass-doc/assets/codemirror.js +3190 -0
  10. data/lib/overpass-doc/assets/jquery.js +2 -0
  11. data/lib/overpass-doc/assets/mode/clike/clike.js +303 -0
  12. data/lib/overpass-doc/assets/mode/clike/index.html +102 -0
  13. data/lib/overpass-doc/assets/mode/clike/scala.html +766 -0
  14. data/lib/overpass-doc/assets/mode/clike/test.js +165 -0
  15. data/lib/overpass-doc/assets/util/closetag.js +165 -0
  16. data/lib/overpass-doc/assets/util/continuecomment.js +36 -0
  17. data/lib/overpass-doc/assets/util/continuelist.js +29 -0
  18. data/lib/overpass-doc/assets/util/dialog.css +32 -0
  19. data/lib/overpass-doc/assets/util/dialog.js +76 -0
  20. data/lib/overpass-doc/assets/util/foldcode.js +196 -0
  21. data/lib/overpass-doc/assets/util/formatting.js +108 -0
  22. data/lib/overpass-doc/assets/util/javascript-hint.js +138 -0
  23. data/lib/overpass-doc/assets/util/loadmode.js +51 -0
  24. data/lib/overpass-doc/assets/util/match-highlighter.js +44 -0
  25. data/lib/overpass-doc/assets/util/multiplex.js +95 -0
  26. data/lib/overpass-doc/assets/util/overlay.js +59 -0
  27. data/lib/overpass-doc/assets/util/pig-hint.js +123 -0
  28. data/lib/overpass-doc/assets/util/runmode-standalone.js +90 -0
  29. data/lib/overpass-doc/assets/util/runmode.js +53 -0
  30. data/lib/overpass-doc/assets/util/search.js +118 -0
  31. data/lib/overpass-doc/assets/util/searchcursor.js +119 -0
  32. data/lib/overpass-doc/assets/util/simple-hint.css +16 -0
  33. data/lib/overpass-doc/assets/util/simple-hint.js +102 -0
  34. data/lib/overpass-doc/assets/util/xml-hint.js +131 -0
  35. data/lib/overpass-doc/generator.rb +122 -0
  36. data/lib/overpass-doc/query.rb +119 -0
  37. data/lib/overpass-doc/views/extra.erb +4 -0
  38. data/lib/overpass-doc/views/index.erb +37 -0
  39. data/lib/overpass-doc/views/layout.erb +80 -0
  40. data/lib/overpass-doc/views/query.erb +115 -0
  41. metadata +144 -0
@@ -0,0 +1,196 @@
1
+ // the tagRangeFinder function is
2
+ // Copyright (C) 2011 by Daniel Glazman <daniel@glazman.org>
3
+ // released under the MIT license (../../LICENSE) like the rest of CodeMirror
4
+ CodeMirror.tagRangeFinder = function(cm, line, hideEnd) {
5
+ var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
6
+ var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
7
+ var xmlNAMERegExp = new RegExp("^[" + nameStartChar + "][" + nameChar + "]*");
8
+
9
+ var lineText = cm.getLine(line);
10
+ var found = false;
11
+ var tag = null;
12
+ var pos = 0;
13
+ while (!found) {
14
+ pos = lineText.indexOf("<", pos);
15
+ if (-1 == pos) // no tag on line
16
+ return;
17
+ if (pos + 1 < lineText.length && lineText[pos + 1] == "/") { // closing tag
18
+ pos++;
19
+ continue;
20
+ }
21
+ // ok we weem to have a start tag
22
+ if (!lineText.substr(pos + 1).match(xmlNAMERegExp)) { // not a tag name...
23
+ pos++;
24
+ continue;
25
+ }
26
+ var gtPos = lineText.indexOf(">", pos + 1);
27
+ if (-1 == gtPos) { // end of start tag not in line
28
+ var l = line + 1;
29
+ var foundGt = false;
30
+ var lastLine = cm.lineCount();
31
+ while (l < lastLine && !foundGt) {
32
+ var lt = cm.getLine(l);
33
+ var gt = lt.indexOf(">");
34
+ if (-1 != gt) { // found a >
35
+ foundGt = true;
36
+ var slash = lt.lastIndexOf("/", gt);
37
+ if (-1 != slash && slash < gt) {
38
+ var str = lineText.substr(slash, gt - slash + 1);
39
+ if (!str.match( /\/\s*\>/ )) { // yep, that's the end of empty tag
40
+ if (hideEnd === true) l++;
41
+ return l;
42
+ }
43
+ }
44
+ }
45
+ l++;
46
+ }
47
+ found = true;
48
+ }
49
+ else {
50
+ var slashPos = lineText.lastIndexOf("/", gtPos);
51
+ if (-1 == slashPos) { // cannot be empty tag
52
+ found = true;
53
+ // don't continue
54
+ }
55
+ else { // empty tag?
56
+ // check if really empty tag
57
+ var str = lineText.substr(slashPos, gtPos - slashPos + 1);
58
+ if (!str.match( /\/\s*\>/ )) { // finally not empty
59
+ found = true;
60
+ // don't continue
61
+ }
62
+ }
63
+ }
64
+ if (found) {
65
+ var subLine = lineText.substr(pos + 1);
66
+ tag = subLine.match(xmlNAMERegExp);
67
+ if (tag) {
68
+ // we have an element name, wooohooo !
69
+ tag = tag[0];
70
+ // do we have the close tag on same line ???
71
+ if (-1 != lineText.indexOf("</" + tag + ">", pos)) // yep
72
+ {
73
+ found = false;
74
+ }
75
+ // we don't, so we have a candidate...
76
+ }
77
+ else
78
+ found = false;
79
+ }
80
+ if (!found)
81
+ pos++;
82
+ }
83
+
84
+ if (found) {
85
+ var startTag = "(\\<\\/" + tag + "\\>)|(\\<" + tag + "\\>)|(\\<" + tag + "\\s)|(\\<" + tag + "$)";
86
+ var startTagRegExp = new RegExp(startTag, "g");
87
+ var endTag = "</" + tag + ">";
88
+ var depth = 1;
89
+ var l = line + 1;
90
+ var lastLine = cm.lineCount();
91
+ while (l < lastLine) {
92
+ lineText = cm.getLine(l);
93
+ var match = lineText.match(startTagRegExp);
94
+ if (match) {
95
+ for (var i = 0; i < match.length; i++) {
96
+ if (match[i] == endTag)
97
+ depth--;
98
+ else
99
+ depth++;
100
+ if (!depth) {
101
+ if (hideEnd === true) l++;
102
+ return l;
103
+ }
104
+ }
105
+ }
106
+ l++;
107
+ }
108
+ return;
109
+ }
110
+ };
111
+
112
+ CodeMirror.braceRangeFinder = function(cm, line, hideEnd) {
113
+ var lineText = cm.getLine(line), at = lineText.length, startChar, tokenType;
114
+ for (;;) {
115
+ var found = lineText.lastIndexOf("{", at);
116
+ if (found < 0) break;
117
+ tokenType = cm.getTokenAt({line: line, ch: found}).className;
118
+ if (!/^(comment|string)/.test(tokenType)) { startChar = found; break; }
119
+ at = found - 1;
120
+ }
121
+ if (startChar == null || lineText.lastIndexOf("}") > startChar) return;
122
+ var count = 1, lastLine = cm.lineCount(), end;
123
+ outer: for (var i = line + 1; i < lastLine; ++i) {
124
+ var text = cm.getLine(i), pos = 0;
125
+ for (;;) {
126
+ var nextOpen = text.indexOf("{", pos), nextClose = text.indexOf("}", pos);
127
+ if (nextOpen < 0) nextOpen = text.length;
128
+ if (nextClose < 0) nextClose = text.length;
129
+ pos = Math.min(nextOpen, nextClose);
130
+ if (pos == text.length) break;
131
+ if (cm.getTokenAt({line: i, ch: pos + 1}).className == tokenType) {
132
+ if (pos == nextOpen) ++count;
133
+ else if (!--count) { end = i; break outer; }
134
+ }
135
+ ++pos;
136
+ }
137
+ }
138
+ if (end == null || end == line + 1) return;
139
+ if (hideEnd === true) end++;
140
+ return end;
141
+ };
142
+
143
+ CodeMirror.indentRangeFinder = function(cm, line) {
144
+ var tabSize = cm.getOption("tabSize");
145
+ var myIndent = cm.getLineHandle(line).indentation(tabSize), last;
146
+ for (var i = line + 1, end = cm.lineCount(); i < end; ++i) {
147
+ var handle = cm.getLineHandle(i);
148
+ if (!/^\s*$/.test(handle.text)) {
149
+ if (handle.indentation(tabSize) <= myIndent) break;
150
+ last = i;
151
+ }
152
+ }
153
+ if (!last) return null;
154
+ return last + 1;
155
+ };
156
+
157
+ CodeMirror.newFoldFunction = function(rangeFinder, markText, hideEnd) {
158
+ var folded = [];
159
+ if (markText == null) markText = '<div style="position: absolute; left: 2px; color:#600">&#x25bc;</div>%N%';
160
+
161
+ function isFolded(cm, n) {
162
+ for (var i = 0; i < folded.length; ++i) {
163
+ var start = cm.lineInfo(folded[i].start);
164
+ if (!start) folded.splice(i--, 1);
165
+ else if (start.line == n) return {pos: i, region: folded[i]};
166
+ }
167
+ }
168
+
169
+ function expand(cm, region) {
170
+ cm.clearMarker(region.start);
171
+ for (var i = 0; i < region.hidden.length; ++i)
172
+ cm.showLine(region.hidden[i]);
173
+ }
174
+
175
+ return function(cm, line) {
176
+ cm.operation(function() {
177
+ var known = isFolded(cm, line);
178
+ if (known) {
179
+ folded.splice(known.pos, 1);
180
+ expand(cm, known.region);
181
+ } else {
182
+ var end = rangeFinder(cm, line, hideEnd);
183
+ if (end == null) return;
184
+ var hidden = [];
185
+ for (var i = line + 1; i < end; ++i) {
186
+ var handle = cm.hideLine(i);
187
+ if (handle) hidden.push(handle);
188
+ }
189
+ var first = cm.setMarker(line, markText);
190
+ var region = {start: first, hidden: hidden};
191
+ cm.onDeleteLine(first, function() { expand(cm, region); });
192
+ folded.push(region);
193
+ }
194
+ });
195
+ };
196
+ };
@@ -0,0 +1,108 @@
1
+ (function() {
2
+
3
+ CodeMirror.extendMode("css", {
4
+ commentStart: "/*",
5
+ commentEnd: "*/",
6
+ newlineAfterToken: function(type, content) {
7
+ return /^[;{}]$/.test(content);
8
+ }
9
+ });
10
+
11
+ CodeMirror.extendMode("javascript", {
12
+ commentStart: "/*",
13
+ commentEnd: "*/",
14
+ // FIXME semicolons inside of for
15
+ newlineAfterToken: function(type, content, textAfter, state) {
16
+ if (this.jsonMode) {
17
+ return /^[\[,{]$/.test(content) || /^}/.test(textAfter);
18
+ } else {
19
+ if (content == ";" && state.lexical && state.lexical.type == ")") return false;
20
+ return /^[;{}]$/.test(content) && !/^;/.test(textAfter);
21
+ }
22
+ }
23
+ });
24
+
25
+ CodeMirror.extendMode("xml", {
26
+ commentStart: "<!--",
27
+ commentEnd: "-->",
28
+ newlineAfterToken: function(type, content, textAfter) {
29
+ return type == "tag" && />$/.test(content) || /^</.test(textAfter);
30
+ }
31
+ });
32
+
33
+ // Comment/uncomment the specified range
34
+ CodeMirror.defineExtension("commentRange", function (isComment, from, to) {
35
+ var cm = this, curMode = CodeMirror.innerMode(cm.getMode(), cm.getTokenAt(from).state).mode;
36
+ cm.operation(function() {
37
+ if (isComment) { // Comment range
38
+ cm.replaceRange(curMode.commentEnd, to);
39
+ cm.replaceRange(curMode.commentStart, from);
40
+ if (from.line == to.line && from.ch == to.ch) // An empty comment inserted - put cursor inside
41
+ cm.setCursor(from.line, from.ch + curMode.commentStart.length);
42
+ } else { // Uncomment range
43
+ var selText = cm.getRange(from, to);
44
+ var startIndex = selText.indexOf(curMode.commentStart);
45
+ var endIndex = selText.lastIndexOf(curMode.commentEnd);
46
+ if (startIndex > -1 && endIndex > -1 && endIndex > startIndex) {
47
+ // Take string till comment start
48
+ selText = selText.substr(0, startIndex)
49
+ // From comment start till comment end
50
+ + selText.substring(startIndex + curMode.commentStart.length, endIndex)
51
+ // From comment end till string end
52
+ + selText.substr(endIndex + curMode.commentEnd.length);
53
+ }
54
+ cm.replaceRange(selText, from, to);
55
+ }
56
+ });
57
+ });
58
+
59
+ // Applies automatic mode-aware indentation to the specified range
60
+ CodeMirror.defineExtension("autoIndentRange", function (from, to) {
61
+ var cmInstance = this;
62
+ this.operation(function () {
63
+ for (var i = from.line; i <= to.line; i++) {
64
+ cmInstance.indentLine(i, "smart");
65
+ }
66
+ });
67
+ });
68
+
69
+ // Applies automatic formatting to the specified range
70
+ CodeMirror.defineExtension("autoFormatRange", function (from, to) {
71
+ var cm = this;
72
+ var outer = cm.getMode(), text = cm.getRange(from, to).split("\n");
73
+ var state = CodeMirror.copyState(outer, cm.getTokenAt(from).state);
74
+ var tabSize = cm.getOption("tabSize");
75
+
76
+ var out = "", lines = 0, atSol = from.ch == 0;
77
+ function newline() {
78
+ out += "\n";
79
+ atSol = true;
80
+ ++lines;
81
+ }
82
+
83
+ for (var i = 0; i < text.length; ++i) {
84
+ var stream = new CodeMirror.StringStream(text[i], tabSize);
85
+ while (!stream.eol()) {
86
+ var inner = CodeMirror.innerMode(outer, state);
87
+ var style = outer.token(stream, state), cur = stream.current();
88
+ stream.start = stream.pos;
89
+ if (!atSol || /\S/.test(cur)) {
90
+ out += cur;
91
+ atSol = false;
92
+ }
93
+ if (!atSol && inner.mode.newlineAfterToken &&
94
+ inner.mode.newlineAfterToken(style, cur, stream.string.slice(stream.pos) || text[i+1] || "", inner.state))
95
+ newline();
96
+ }
97
+ if (!stream.pos && outer.blankLine) outer.blankLine(state);
98
+ if (!atSol) newline();
99
+ }
100
+
101
+ cm.operation(function () {
102
+ cm.replaceRange(out, from, to);
103
+ for (var cur = from.line + 1, end = from.line + lines; cur <= end; ++cur)
104
+ cm.indentLine(cur, "smart");
105
+ cm.setSelection(from, cm.getCursor(false));
106
+ });
107
+ });
108
+ })();
@@ -0,0 +1,138 @@
1
+ (function () {
2
+ function forEach(arr, f) {
3
+ for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
4
+ }
5
+
6
+ function arrayContains(arr, item) {
7
+ if (!Array.prototype.indexOf) {
8
+ var i = arr.length;
9
+ while (i--) {
10
+ if (arr[i] === item) {
11
+ return true;
12
+ }
13
+ }
14
+ return false;
15
+ }
16
+ return arr.indexOf(item) != -1;
17
+ }
18
+
19
+ function scriptHint(editor, keywords, getToken, options) {
20
+ // Find the token at the cursor
21
+ var cur = editor.getCursor(), token = getToken(editor, cur), tprop = token;
22
+ // If it's not a 'word-style' token, ignore the token.
23
+ if (!/^[\w$_]*$/.test(token.string)) {
24
+ token = tprop = {start: cur.ch, end: cur.ch, string: "", state: token.state,
25
+ className: token.string == "." ? "property" : null};
26
+ }
27
+ // If it is a property, find out what it is a property of.
28
+ while (tprop.className == "property") {
29
+ tprop = getToken(editor, {line: cur.line, ch: tprop.start});
30
+ if (tprop.string != ".") return;
31
+ tprop = getToken(editor, {line: cur.line, ch: tprop.start});
32
+ if (tprop.string == ')') {
33
+ var level = 1;
34
+ do {
35
+ tprop = getToken(editor, {line: cur.line, ch: tprop.start});
36
+ switch (tprop.string) {
37
+ case ')': level++; break;
38
+ case '(': level--; break;
39
+ default: break;
40
+ }
41
+ } while (level > 0);
42
+ tprop = getToken(editor, {line: cur.line, ch: tprop.start});
43
+ if (tprop.className == 'variable')
44
+ tprop.className = 'function';
45
+ else return; // no clue
46
+ }
47
+ if (!context) var context = [];
48
+ context.push(tprop);
49
+ }
50
+ return {list: getCompletions(token, context, keywords, options),
51
+ from: {line: cur.line, ch: token.start},
52
+ to: {line: cur.line, ch: token.end}};
53
+ }
54
+
55
+ CodeMirror.javascriptHint = function(editor, options) {
56
+ return scriptHint(editor, javascriptKeywords,
57
+ function (e, cur) {return e.getTokenAt(cur);},
58
+ options);
59
+ };
60
+
61
+ function getCoffeeScriptToken(editor, cur) {
62
+ // This getToken, it is for coffeescript, imitates the behavior of
63
+ // getTokenAt method in javascript.js, that is, returning "property"
64
+ // type and treat "." as indepenent token.
65
+ var token = editor.getTokenAt(cur);
66
+ if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {
67
+ token.end = token.start;
68
+ token.string = '.';
69
+ token.className = "property";
70
+ }
71
+ else if (/^\.[\w$_]*$/.test(token.string)) {
72
+ token.className = "property";
73
+ token.start++;
74
+ token.string = token.string.replace(/\./, '');
75
+ }
76
+ return token;
77
+ }
78
+
79
+ CodeMirror.coffeescriptHint = function(editor, options) {
80
+ return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);
81
+ };
82
+
83
+ var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " +
84
+ "toUpperCase toLowerCase split concat match replace search").split(" ");
85
+ var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " +
86
+ "lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");
87
+ var funcProps = "prototype apply call bind".split(" ");
88
+ var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " +
89
+ "if in instanceof new null return switch throw true try typeof var void while with").split(" ");
90
+ var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " +
91
+ "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");
92
+
93
+ function getCompletions(token, context, keywords, options) {
94
+ var found = [], start = token.string;
95
+ function maybeAdd(str) {
96
+ if (str.indexOf(start) == 0 && !arrayContains(found, str)) found.push(str);
97
+ }
98
+ function gatherCompletions(obj) {
99
+ if (typeof obj == "string") forEach(stringProps, maybeAdd);
100
+ else if (obj instanceof Array) forEach(arrayProps, maybeAdd);
101
+ else if (obj instanceof Function) forEach(funcProps, maybeAdd);
102
+ for (var name in obj) maybeAdd(name);
103
+ }
104
+
105
+ if (context) {
106
+ // If this is a property, see if it belongs to some object we can
107
+ // find in the current environment.
108
+ var obj = context.pop(), base;
109
+ if (obj.className == "variable") {
110
+ if (options && options.additionalContext)
111
+ base = options.additionalContext[obj.string];
112
+ base = base || window[obj.string];
113
+ } else if (obj.className == "string") {
114
+ base = "";
115
+ } else if (obj.className == "atom") {
116
+ base = 1;
117
+ } else if (obj.className == "function") {
118
+ if (window.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&
119
+ (typeof window.jQuery == 'function'))
120
+ base = window.jQuery();
121
+ else if (window._ != null && (obj.string == '_') && (typeof window._ == 'function'))
122
+ base = window._();
123
+ }
124
+ while (base != null && context.length)
125
+ base = base[context.pop().string];
126
+ if (base != null) gatherCompletions(base);
127
+ }
128
+ else {
129
+ // If not, just look in the window object and any local scope
130
+ // (reading into JS mode internals to get at the local and global variables)
131
+ for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);
132
+ for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);
133
+ gatherCompletions(window);
134
+ forEach(keywords, maybeAdd);
135
+ }
136
+ return found;
137
+ }
138
+ })();
@@ -0,0 +1,51 @@
1
+ (function() {
2
+ if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js";
3
+
4
+ var loading = {};
5
+ function splitCallback(cont, n) {
6
+ var countDown = n;
7
+ return function() { if (--countDown == 0) cont(); };
8
+ }
9
+ function ensureDeps(mode, cont) {
10
+ var deps = CodeMirror.modes[mode].dependencies;
11
+ if (!deps) return cont();
12
+ var missing = [];
13
+ for (var i = 0; i < deps.length; ++i) {
14
+ if (!CodeMirror.modes.hasOwnProperty(deps[i]))
15
+ missing.push(deps[i]);
16
+ }
17
+ if (!missing.length) return cont();
18
+ var split = splitCallback(cont, missing.length);
19
+ for (var i = 0; i < missing.length; ++i)
20
+ CodeMirror.requireMode(missing[i], split);
21
+ }
22
+
23
+ CodeMirror.requireMode = function(mode, cont) {
24
+ if (typeof mode != "string") mode = mode.name;
25
+ if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont);
26
+ if (loading.hasOwnProperty(mode)) return loading[mode].push(cont);
27
+
28
+ var script = document.createElement("script");
29
+ script.src = CodeMirror.modeURL.replace(/%N/g, mode);
30
+ var others = document.getElementsByTagName("script")[0];
31
+ others.parentNode.insertBefore(script, others);
32
+ var list = loading[mode] = [cont];
33
+ var count = 0, poll = setInterval(function() {
34
+ if (++count > 100) return clearInterval(poll);
35
+ if (CodeMirror.modes.hasOwnProperty(mode)) {
36
+ clearInterval(poll);
37
+ loading[mode] = null;
38
+ ensureDeps(mode, function() {
39
+ for (var i = 0; i < list.length; ++i) list[i]();
40
+ });
41
+ }
42
+ }, 200);
43
+ };
44
+
45
+ CodeMirror.autoLoadMode = function(instance, mode) {
46
+ if (!CodeMirror.modes.hasOwnProperty(mode))
47
+ CodeMirror.requireMode(mode, function() {
48
+ instance.setOption("mode", instance.getOption("mode"));
49
+ });
50
+ };
51
+ }());