maglev-webtools 0.2.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.
- data/LICENSE.txt +25 -0
- data/README.rdoc +121 -0
- data/bin/webtools +15 -0
- data/lib/web_tools/#debugger.rb# +212 -0
- data/lib/web_tools/browser.rb +45 -0
- data/lib/web_tools/debugger.rb +219 -0
- data/lib/web_tools/info.rb +29 -0
- data/lib/web_tools/middleware/debugger.rb +118 -0
- data/lib/web_tools/support/app_model.rb +117 -0
- data/lib/web_tools/support/code_browser.rb +109 -0
- data/lib/web_tools/support/ruby.rb +132 -0
- data/lib/web_tools/support/service_helper.rb +22 -0
- data/lib/web_tools/support/smalltalk_extensions.rb +65 -0
- data/lib/web_tools/support/smalltalk_tools.rb +16 -0
- data/lib/web_tools/ui.rb +67 -0
- data/lib/web_tools.rb +10 -0
- data/public/images/favicon.ico +0 -0
- data/public/javascript/CodeMirror/LICENSE +23 -0
- data/public/javascript/CodeMirror/css/Smalltalk.css +34 -0
- data/public/javascript/CodeMirror/js/codemirror.js +582 -0
- data/public/javascript/CodeMirror/js/editor.js +1671 -0
- data/public/javascript/CodeMirror/js/highlight.js +68 -0
- data/public/javascript/CodeMirror/js/parseSmalltalk.js +126 -0
- data/public/javascript/CodeMirror/js/parsedummy.js +32 -0
- data/public/javascript/CodeMirror/js/select.js +699 -0
- data/public/javascript/CodeMirror/js/stringstream.js +159 -0
- data/public/javascript/CodeMirror/js/tokenize.js +57 -0
- data/public/javascript/CodeMirror/js/undo.js +413 -0
- data/public/javascript/CodeMirror/js/util.js +133 -0
- data/public/javascript/CodeMirror/testSmalltalkParser.html +116 -0
- data/public/javascript/ace/ace-uncompressed.js +17299 -0
- data/public/javascript/ace/ace.js +1 -0
- data/public/javascript/ace/keybinding-emacs.js +1 -0
- data/public/javascript/ace/keybinding-vim.js +1 -0
- data/public/javascript/ace/mode-c_cpp.js +1 -0
- data/public/javascript/ace/mode-clojure.js +1 -0
- data/public/javascript/ace/mode-coffee.js +1 -0
- data/public/javascript/ace/mode-csharp.js +1 -0
- data/public/javascript/ace/mode-css.js +1 -0
- data/public/javascript/ace/mode-groovy.js +1 -0
- data/public/javascript/ace/mode-html.js +1 -0
- data/public/javascript/ace/mode-java.js +1 -0
- data/public/javascript/ace/mode-javascript.js +1 -0
- data/public/javascript/ace/mode-json.js +1 -0
- data/public/javascript/ace/mode-lua.js +1 -0
- data/public/javascript/ace/mode-markdown.js +1 -0
- data/public/javascript/ace/mode-ocaml.js +1 -0
- data/public/javascript/ace/mode-perl.js +1 -0
- data/public/javascript/ace/mode-php.js +1 -0
- data/public/javascript/ace/mode-python.js +1 -0
- data/public/javascript/ace/mode-ruby.js +1 -0
- data/public/javascript/ace/mode-scad.js +1 -0
- data/public/javascript/ace/mode-scala.js +1 -0
- data/public/javascript/ace/mode-scss.js +1 -0
- data/public/javascript/ace/mode-svg.js +1 -0
- data/public/javascript/ace/mode-textile.js +1 -0
- data/public/javascript/ace/mode-xml.js +1 -0
- data/public/javascript/ace/theme-clouds.js +1 -0
- data/public/javascript/ace/theme-clouds_midnight.js +1 -0
- data/public/javascript/ace/theme-cobalt.js +1 -0
- data/public/javascript/ace/theme-crimson_editor.js +1 -0
- data/public/javascript/ace/theme-dawn.js +1 -0
- data/public/javascript/ace/theme-eclipse.js +1 -0
- data/public/javascript/ace/theme-idle_fingers.js +1 -0
- data/public/javascript/ace/theme-kr_theme.js +1 -0
- data/public/javascript/ace/theme-merbivore.js +1 -0
- data/public/javascript/ace/theme-merbivore_soft.js +1 -0
- data/public/javascript/ace/theme-mono_industrial.js +1 -0
- data/public/javascript/ace/theme-monokai.js +1 -0
- data/public/javascript/ace/theme-pastel_on_dark.js +1 -0
- data/public/javascript/ace/theme-solarized_dark.js +1 -0
- data/public/javascript/ace/theme-solarized_light.js +1 -0
- data/public/javascript/ace/theme-textmate.js +1 -0
- data/public/javascript/ace/theme-twilight.js +1 -0
- data/public/javascript/ace/theme-vibrant_ink.js +1 -0
- data/public/javascript/ace/worker-coffee.js +1 -0
- data/public/javascript/ace/worker-css.js +1 -0
- data/public/javascript/ace/worker-javascript.js +1 -0
- data/public/javascript/webtools/#debugger.coffee# +253 -0
- data/public/javascript/webtools/browser.js +260 -0
- data/public/javascript/webtools/debugger.coffee +286 -0
- data/public/javascript/webtools/debugger.js +366 -0
- data/public/javascript/webtools/sessions.coffee +17 -0
- data/public/javascript/webtools/sessions.js +27 -0
- data/public/javascript/webtools/version.coffee +14 -0
- data/public/javascript/webtools/version.js +20 -0
- data/public/stylesheets/base/images/ui-anim_basic_16x16.gif +0 -0
- data/public/stylesheets/base/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/public/stylesheets/base/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/public/stylesheets/base/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/public/stylesheets/base/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/public/stylesheets/base/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/public/stylesheets/base/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/public/stylesheets/base/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/stylesheets/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/public/stylesheets/base/images/ui-icons_222222_256x240.png +0 -0
- data/public/stylesheets/base/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/stylesheets/base/images/ui-icons_454545_256x240.png +0 -0
- data/public/stylesheets/base/images/ui-icons_888888_256x240.png +0 -0
- data/public/stylesheets/base/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/stylesheets/base/jquery.ui.accordion.css +12 -0
- data/public/stylesheets/base/jquery.ui.all.css +2 -0
- data/public/stylesheets/base/jquery.ui.autocomplete.css +39 -0
- data/public/stylesheets/base/jquery.ui.base.css +11 -0
- data/public/stylesheets/base/jquery.ui.button.css +35 -0
- data/public/stylesheets/base/jquery.ui.core.css +37 -0
- data/public/stylesheets/base/jquery.ui.datepicker.css +61 -0
- data/public/stylesheets/base/jquery.ui.dialog.css +13 -0
- data/public/stylesheets/base/jquery.ui.progressbar.css +4 -0
- data/public/stylesheets/base/jquery.ui.resizable.css +13 -0
- data/public/stylesheets/base/jquery.ui.selectable.css +3 -0
- data/public/stylesheets/base/jquery.ui.slider.css +17 -0
- data/public/stylesheets/base/jquery.ui.tabs.css +11 -0
- data/public/stylesheets/base/jquery.ui.theme.css +247 -0
- data/public/stylesheets/jquery.contextMenu.css +62 -0
- data/public/stylesheets/reset.css +18 -0
- data/public/stylesheets/webtools.css +53 -0
- data/public/test.html +47 -0
- data/views/browser.rhtml +63 -0
- data/views/debugger.rhtml +59 -0
- data/views/index.rhtml +8 -0
- data/views/layout.rhtml +24 -0
- data/views/sessions.rhtml +12 -0
- data/views/version.rhtml +10 -0
- metadata +316 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/* A few useful utility functions. */
|
|
2
|
+
|
|
3
|
+
// Capture a method on an object.
|
|
4
|
+
function method(obj, name) {
|
|
5
|
+
return function() {obj[name].apply(obj, arguments);};
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// The value used to signal the end of a sequence in iterators.
|
|
9
|
+
var StopIteration = {toString: function() {return "StopIteration"}};
|
|
10
|
+
|
|
11
|
+
// Apply a function to each element in a sequence.
|
|
12
|
+
function forEach(iter, f) {
|
|
13
|
+
if (iter.next) {
|
|
14
|
+
try {while (true) f(iter.next());}
|
|
15
|
+
catch (e) {if (e != StopIteration) throw e;}
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
for (var i = 0; i < iter.length; i++)
|
|
19
|
+
f(iter[i]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Map a function over a sequence, producing an array of results.
|
|
24
|
+
function map(iter, f) {
|
|
25
|
+
var accum = [];
|
|
26
|
+
forEach(iter, function(val) {accum.push(f(val));});
|
|
27
|
+
return accum;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Create a predicate function that tests a string againsts a given
|
|
31
|
+
// regular expression. No longer used but might be used by 3rd party
|
|
32
|
+
// parsers.
|
|
33
|
+
function matcher(regexp){
|
|
34
|
+
return function(value){return regexp.test(value);};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Test whether a DOM node has a certain CSS class.
|
|
38
|
+
function hasClass(element, className) {
|
|
39
|
+
var classes = element.className;
|
|
40
|
+
return classes && new RegExp("(^| )" + className + "($| )").test(classes);
|
|
41
|
+
}
|
|
42
|
+
function removeClass(element, className) {
|
|
43
|
+
element.className = element.className.replace(new RegExp(" " + className + "\\b", "g"), "");
|
|
44
|
+
return element;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Insert a DOM node after another node.
|
|
48
|
+
function insertAfter(newNode, oldNode) {
|
|
49
|
+
var parent = oldNode.parentNode;
|
|
50
|
+
parent.insertBefore(newNode, oldNode.nextSibling);
|
|
51
|
+
return newNode;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function removeElement(node) {
|
|
55
|
+
if (node.parentNode)
|
|
56
|
+
node.parentNode.removeChild(node);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function clearElement(node) {
|
|
60
|
+
while (node.firstChild)
|
|
61
|
+
node.removeChild(node.firstChild);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Check whether a node is contained in another one.
|
|
65
|
+
function isAncestor(node, child) {
|
|
66
|
+
while (child = child.parentNode) {
|
|
67
|
+
if (node == child)
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// The non-breaking space character.
|
|
74
|
+
var nbsp = "\u00a0";
|
|
75
|
+
var matching = {"{": "}", "[": "]", "(": ")",
|
|
76
|
+
"}": "{", "]": "[", ")": "("};
|
|
77
|
+
|
|
78
|
+
// Standardize a few unportable event properties.
|
|
79
|
+
function normalizeEvent(event) {
|
|
80
|
+
if (!event.stopPropagation) {
|
|
81
|
+
event.stopPropagation = function() {this.cancelBubble = true;};
|
|
82
|
+
event.preventDefault = function() {this.returnValue = false;};
|
|
83
|
+
}
|
|
84
|
+
if (!event.stop) {
|
|
85
|
+
event.stop = function() {
|
|
86
|
+
this.stopPropagation();
|
|
87
|
+
this.preventDefault();
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (event.type == "keypress") {
|
|
92
|
+
event.code = (event.charCode == null) ? event.keyCode : event.charCode;
|
|
93
|
+
event.character = String.fromCharCode(event.code);
|
|
94
|
+
}
|
|
95
|
+
return event;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Portably register event handlers.
|
|
99
|
+
function addEventHandler(node, type, handler, removeFunc) {
|
|
100
|
+
function wrapHandler(event) {
|
|
101
|
+
handler(normalizeEvent(event || window.event));
|
|
102
|
+
}
|
|
103
|
+
if (typeof node.addEventListener == "function") {
|
|
104
|
+
node.addEventListener(type, wrapHandler, false);
|
|
105
|
+
if (removeFunc) return function() {node.removeEventListener(type, wrapHandler, false);};
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
node.attachEvent("on" + type, wrapHandler);
|
|
109
|
+
if (removeFunc) return function() {node.detachEvent("on" + type, wrapHandler);};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function nodeText(node) {
|
|
114
|
+
return node.textContent || node.innerText || node.nodeValue || "";
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function nodeTop(node) {
|
|
118
|
+
var top = 0;
|
|
119
|
+
while (node.offsetParent) {
|
|
120
|
+
top += node.offsetTop;
|
|
121
|
+
node = node.offsetParent;
|
|
122
|
+
}
|
|
123
|
+
return top;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function isBR(node) {
|
|
127
|
+
var nn = node.nodeName;
|
|
128
|
+
return nn == "BR" || nn == "br";
|
|
129
|
+
}
|
|
130
|
+
function isSpan(node) {
|
|
131
|
+
var nn = node.nodeName;
|
|
132
|
+
return nn == "SPAN" || nn == "span";
|
|
133
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
This file can be used with jsunit to test the Smalltalk parser.
|
|
3
|
+
-->
|
|
4
|
+
<html>
|
|
5
|
+
<head>
|
|
6
|
+
<title>Test Page for Smalltalk Parser</title>
|
|
7
|
+
<script language="javascript" src="/~jfoster/scripts/jquery.js"></script>
|
|
8
|
+
<script language="javascript" src="/~jfoster/jsunit/app/jsUnitCore.js"></script>
|
|
9
|
+
<script language="javascript" src="/~jfoster/CodeMirror/js/stringstream.js"></script>
|
|
10
|
+
<script language="javascript" src="/~jfoster/CodeMirror/js/tokenize.js"></script>
|
|
11
|
+
<script language="javascript" src="/~jfoster/CodeMirror/js/highlight.js"></script>
|
|
12
|
+
<script language="javascript" src="/~jfoster/CodeMirror/js/parseSmalltalk.js"></script>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<div style="display: none;" />
|
|
16
|
+
<script language="javascript">
|
|
17
|
+
function testCharacter() {
|
|
18
|
+
highlightText("$a $b", result, SmalltalkParser);
|
|
19
|
+
return;
|
|
20
|
+
function result(spanNodes) {
|
|
21
|
+
assertEquals("element count", 2, spanNodes.length);
|
|
22
|
+
assertEquals("span tag", "SPAN", spanNodes[0].tagName);
|
|
23
|
+
assertEquals("span class", "st-character", $(spanNodes[0]).attr("class"));
|
|
24
|
+
assertEquals("span html", "$a ", $(spanNodes[0]).html());
|
|
25
|
+
assertEquals("span tag", "SPAN", spanNodes[1].tagName);
|
|
26
|
+
assertEquals("span class", "st-character", $(spanNodes[1]).attr("class"));
|
|
27
|
+
assertEquals("span html", "$b", $(spanNodes[1]).html());
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function testString() {
|
|
31
|
+
var lineCount = -1;
|
|
32
|
+
highlightText("'abc''def' 'qwe\nrty'", result, SmalltalkParser);
|
|
33
|
+
return;
|
|
34
|
+
function result(spanNodes) {
|
|
35
|
+
++lineCount;
|
|
36
|
+
switch (lineCount) {
|
|
37
|
+
case 0:
|
|
38
|
+
assertEquals("element count", 2, spanNodes.length);
|
|
39
|
+
assertEquals("span tag", "SPAN", spanNodes[0].tagName);
|
|
40
|
+
assertEquals("span class", "st-string", $(spanNodes[0]).attr("class"));
|
|
41
|
+
assertEquals("span html", "'abc''def' ", $(spanNodes[0]).html());
|
|
42
|
+
assertEquals("span class", "st-string", $(spanNodes[1]).attr("class"));
|
|
43
|
+
assertEquals("span html", "'qwe", $(spanNodes[1]).html());
|
|
44
|
+
break;
|
|
45
|
+
case 1:
|
|
46
|
+
assertEquals("element count", 1, spanNodes.length);
|
|
47
|
+
assertEquals("span class", "st-string", $(spanNodes[0]).attr("class"));
|
|
48
|
+
assertEquals("span html", "rty'", $(spanNodes[0]).html());
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
fail("Should be only two lines!");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function testSymbol() {
|
|
56
|
+
highlightText("#'abc' #a #_a1 #a1:b2: # ", result, SmalltalkParser);
|
|
57
|
+
return;
|
|
58
|
+
function result(spanNodes) {
|
|
59
|
+
assertEquals("element count", 5, spanNodes.length);
|
|
60
|
+
assertEquals("span tag", "SPAN", spanNodes[0].tagName);
|
|
61
|
+
assertEquals("span class", "st-symbol", $(spanNodes[0]).attr("class"));
|
|
62
|
+
assertEquals("span html", "#'abc' ", $(spanNodes[0]).html());
|
|
63
|
+
assertEquals("span class", "st-symbol", $(spanNodes[1]).attr("class"));
|
|
64
|
+
assertEquals("span html", "#a ", $(spanNodes[1]).html());
|
|
65
|
+
assertEquals("span class", "st-symbol", $(spanNodes[2]).attr("class"));
|
|
66
|
+
assertEquals("span html", "#_a1 ", $(spanNodes[2]).html());
|
|
67
|
+
assertEquals("span class", "st-symbol", $(spanNodes[3]).attr("class"));
|
|
68
|
+
assertEquals("span html", "#a1:b2: ", $(spanNodes[3]).html());
|
|
69
|
+
assertEquals("span class", "st-error", $(spanNodes[4]).attr("class"));
|
|
70
|
+
assertEquals("span html", "# ", $(spanNodes[4]).html());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function testIdentifier() {
|
|
74
|
+
highlightText("a _a a_1", result, SmalltalkParser);
|
|
75
|
+
return;
|
|
76
|
+
function result(spanNodes) {
|
|
77
|
+
assertEquals("element count", 3, spanNodes.length);
|
|
78
|
+
assertEquals("span class", "st-identifier", $(spanNodes[0]).attr("class"));
|
|
79
|
+
assertEquals("span class", "st-identifier", $(spanNodes[1]).attr("class"));
|
|
80
|
+
assertEquals("span class", "st-identifier", $(spanNodes[2]).attr("class"));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function testKeyword() {
|
|
84
|
+
highlightText("foo:", result, SmalltalkParser);
|
|
85
|
+
return;
|
|
86
|
+
function result(spanNodes) {
|
|
87
|
+
assertEquals("element count", 1, spanNodes.length);
|
|
88
|
+
assertEquals("span class", "st-keyword", $(spanNodes[0]).attr("class"));
|
|
89
|
+
assertEquals("span html", "foo:", $(spanNodes[0]).html());
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function testSpecialLiterals() {
|
|
93
|
+
highlightText("true false self super nil ", result, SmalltalkParser);
|
|
94
|
+
return;
|
|
95
|
+
function result(spanNodes) {
|
|
96
|
+
assertEquals("element count", 5, spanNodes.length);
|
|
97
|
+
assertEquals("span class", "st-boolean", $(spanNodes[0]).attr("class"));
|
|
98
|
+
assertEquals("span class", "st-boolean", $(spanNodes[1]).attr("class"));
|
|
99
|
+
assertEquals("span class", "st-self", $(spanNodes[2]).attr("class"));
|
|
100
|
+
assertEquals("span class", "st-super", $(spanNodes[3]).attr("class"));
|
|
101
|
+
assertEquals("span class", "st-nil", $(spanNodes[4]).attr("class"));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function testOperators() {
|
|
105
|
+
highlightText("^#a ", result, SmalltalkParser);
|
|
106
|
+
return;
|
|
107
|
+
function result(spanNodes) {
|
|
108
|
+
assertEquals("element count", 2, spanNodes.length);
|
|
109
|
+
assertEquals("span class", "st-return", $(spanNodes[0]).attr("class"));
|
|
110
|
+
assertEquals("span class", "st-symbol", $(spanNodes[1]).attr("class"));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
</script>
|
|
115
|
+
</body>
|
|
116
|
+
</html>
|