maglev-webtools 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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>
|