AmberRack 0.1.0
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/.gitignore +74 -0
- data/.rvmrc +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +62 -0
- data/README.md +17 -0
- data/Rakefile +24 -0
- data/amber-rack.gemspec +33 -0
- data/app/amber_app.rb +35 -0
- data/app/javascripts/Benchfib.deploy.js +159 -0
- data/app/javascripts/Benchfib.js +159 -0
- data/app/javascripts/Canvas.deploy.js +1464 -0
- data/app/javascripts/Canvas.js +1464 -0
- data/app/javascripts/Compiler.deploy.js +1587 -0
- data/app/javascripts/Compiler.js +1587 -0
- data/app/javascripts/Examples.deploy.js +800 -0
- data/app/javascripts/Examples.js +800 -0
- data/app/javascripts/IDE.deploy.js +3457 -0
- data/app/javascripts/IDE.js +3457 -0
- data/app/javascripts/IDE.js.bak +3420 -0
- data/app/javascripts/JQuery.deploy.js +898 -0
- data/app/javascripts/JQuery.js +898 -0
- data/app/javascripts/Kernel.deploy.js +6761 -0
- data/app/javascripts/Kernel.js +6761 -0
- data/app/javascripts/Parser.deploy.js +1655 -0
- data/app/javascripts/Parser.js +1655 -0
- data/app/javascripts/Raphael-Core.js +0 -0
- data/app/javascripts/Raphael-Graph.js +0 -0
- data/app/javascripts/SUnit.deploy.js +1059 -0
- data/app/javascripts/SUnit.js +1059 -0
- data/app/javascripts/application.js +2 -0
- data/app/javascripts/boot.js +466 -0
- data/app/javascripts/init.js +2 -0
- data/app/javascripts/jquery-1.4.4.min.js +167 -0
- data/app/javascripts/jquery-ui-1.8.9.custom.min.js +781 -0
- data/app/javascripts/jquery.textarea.js +267 -0
- data/app/javascripts/jtalk.js +78 -0
- data/app/javascripts/lib/CodeMirror/LICENSE +19 -0
- data/app/javascripts/lib/CodeMirror/README.md +6 -0
- data/app/javascripts/lib/CodeMirror/compress.html +92 -0
- data/app/javascripts/lib/CodeMirror/css/baboon.png +0 -0
- data/app/javascripts/lib/CodeMirror/css/baboon_vector.svg +153 -0
- data/app/javascripts/lib/CodeMirror/css/docs.css +154 -0
- data/app/javascripts/lib/CodeMirror/demo/activeline.html +72 -0
- data/app/javascripts/lib/CodeMirror/demo/changemode.html +51 -0
- data/app/javascripts/lib/CodeMirror/demo/complete.html +79 -0
- data/app/javascripts/lib/CodeMirror/demo/complete.js +151 -0
- data/app/javascripts/lib/CodeMirror/demo/fullscreen.html +158 -0
- data/app/javascripts/lib/CodeMirror/demo/marker.html +53 -0
- data/app/javascripts/lib/CodeMirror/demo/mustache.html +57 -0
- data/app/javascripts/lib/CodeMirror/demo/preview.html +75 -0
- data/app/javascripts/lib/CodeMirror/demo/resize.html +44 -0
- data/app/javascripts/lib/CodeMirror/demo/runmode.html +50 -0
- data/app/javascripts/lib/CodeMirror/demo/search.html +106 -0
- data/app/javascripts/lib/CodeMirror/demo/theme.html +53 -0
- data/app/javascripts/lib/CodeMirror/index.html +239 -0
- data/app/javascripts/lib/CodeMirror/internals.html +389 -0
- data/app/javascripts/lib/CodeMirror/lib/codemirror.css +67 -0
- data/app/javascripts/lib/CodeMirror/lib/codemirror.js +2144 -0
- data/app/javascripts/lib/CodeMirror/lib/overlay.js +51 -0
- data/app/javascripts/lib/CodeMirror/lib/runmode.js +27 -0
- data/app/javascripts/lib/CodeMirror/manual.html +854 -0
- data/app/javascripts/lib/CodeMirror/mode/clike/clike.js +247 -0
- data/app/javascripts/lib/CodeMirror/mode/clike/index.html +102 -0
- data/app/javascripts/lib/CodeMirror/mode/css/css.js +124 -0
- data/app/javascripts/lib/CodeMirror/mode/css/index.html +56 -0
- data/app/javascripts/lib/CodeMirror/mode/diff/diff.css +3 -0
- data/app/javascripts/lib/CodeMirror/mode/diff/diff.js +13 -0
- data/app/javascripts/lib/CodeMirror/mode/diff/index.html +99 -0
- data/app/javascripts/lib/CodeMirror/mode/haskell/haskell.js +242 -0
- data/app/javascripts/lib/CodeMirror/mode/haskell/index.html +60 -0
- data/app/javascripts/lib/CodeMirror/mode/htmlmixed/htmlmixed.js +79 -0
- data/app/javascripts/lib/CodeMirror/mode/htmlmixed/index.html +52 -0
- data/app/javascripts/lib/CodeMirror/mode/javascript/index.html +78 -0
- data/app/javascripts/lib/CodeMirror/mode/javascript/javascript.js +348 -0
- data/app/javascripts/lib/CodeMirror/mode/lua/index.html +72 -0
- data/app/javascripts/lib/CodeMirror/mode/lua/lua.js +138 -0
- data/app/javascripts/lib/CodeMirror/mode/php/index.html +49 -0
- data/app/javascripts/lib/CodeMirror/mode/php/php.js +110 -0
- data/app/javascripts/lib/CodeMirror/mode/plsql/index.html +63 -0
- data/app/javascripts/lib/CodeMirror/mode/plsql/plsql.js +217 -0
- data/app/javascripts/lib/CodeMirror/mode/python/LICENSE.txt +21 -0
- data/app/javascripts/lib/CodeMirror/mode/python/index.html +123 -0
- data/app/javascripts/lib/CodeMirror/mode/python/python.js +321 -0
- data/app/javascripts/lib/CodeMirror/mode/rst/index.html +526 -0
- data/app/javascripts/lib/CodeMirror/mode/rst/rst.css +75 -0
- data/app/javascripts/lib/CodeMirror/mode/rst/rst.js +333 -0
- data/app/javascripts/lib/CodeMirror/mode/scheme/index.html +65 -0
- data/app/javascripts/lib/CodeMirror/mode/scheme/scheme.js +181 -0
- data/app/javascripts/lib/CodeMirror/mode/smalltalk/index.html +56 -0
- data/app/javascripts/lib/CodeMirror/mode/smalltalk/smalltalk.js +134 -0
- data/app/javascripts/lib/CodeMirror/mode/sparql/index.html +41 -0
- data/app/javascripts/lib/CodeMirror/mode/sparql/sparql.js +143 -0
- data/app/javascripts/lib/CodeMirror/mode/stex/index.html +96 -0
- data/app/javascripts/lib/CodeMirror/mode/stex/stex.js +167 -0
- data/app/javascripts/lib/CodeMirror/mode/xml/index.html +42 -0
- data/app/javascripts/lib/CodeMirror/mode/xml/xml.js +231 -0
- data/app/javascripts/lib/CodeMirror/mode/yaml/index.html +68 -0
- data/app/javascripts/lib/CodeMirror/mode/yaml/yaml.js +95 -0
- data/app/javascripts/lib/CodeMirror/oldrelease.html +178 -0
- data/app/javascripts/lib/CodeMirror/test/index.html +29 -0
- data/app/javascripts/lib/CodeMirror/test/test.js +249 -0
- data/app/javascripts/lib/CodeMirror/theme/default.css +18 -0
- data/app/javascripts/lib/CodeMirror/theme/elegant.css +9 -0
- data/app/javascripts/lib/CodeMirror/theme/jtalk.css +21 -0
- data/app/javascripts/lib/CodeMirror/theme/neat.css +8 -0
- data/app/javascripts/lib/CodeMirror/theme/night.css +20 -0
- data/app/javascripts/lib/jQuery/jquery-1.4.4.min.js +167 -0
- data/app/javascripts/lib/jQuery/jquery-ui-1.8.9.custom.min.js +781 -0
- data/app/javascripts/lib/jQuery/jquery.textarea.js +267 -0
- data/app/smalltalk/Canvas.st +481 -0
- data/app/smalltalk/IDE.st +1752 -0
- data/config.ru +2 -0
- data/lib/amber-rack.rb +4 -0
- data/lib/amber-rack/version.rb +3 -0
- data/public/CodeMirror/LICENSE +19 -0
- data/public/CodeMirror/README.md +6 -0
- data/public/CodeMirror/compress.html +92 -0
- data/public/CodeMirror/css/baboon.png +0 -0
- data/public/CodeMirror/css/baboon_vector.svg +153 -0
- data/public/CodeMirror/css/docs.css +154 -0
- data/public/CodeMirror/demo/activeline.html +72 -0
- data/public/CodeMirror/demo/changemode.html +51 -0
- data/public/CodeMirror/demo/complete.html +79 -0
- data/public/CodeMirror/demo/complete.js +151 -0
- data/public/CodeMirror/demo/fullscreen.html +158 -0
- data/public/CodeMirror/demo/marker.html +53 -0
- data/public/CodeMirror/demo/mustache.html +57 -0
- data/public/CodeMirror/demo/preview.html +75 -0
- data/public/CodeMirror/demo/resize.html +44 -0
- data/public/CodeMirror/demo/runmode.html +50 -0
- data/public/CodeMirror/demo/search.html +106 -0
- data/public/CodeMirror/demo/theme.html +53 -0
- data/public/CodeMirror/index.html +239 -0
- data/public/CodeMirror/internals.html +389 -0
- data/public/CodeMirror/lib/codemirror.css +67 -0
- data/public/CodeMirror/lib/codemirror.js +2144 -0
- data/public/CodeMirror/lib/overlay.js +51 -0
- data/public/CodeMirror/lib/runmode.js +27 -0
- data/public/CodeMirror/manual.html +854 -0
- data/public/CodeMirror/mode/clike/clike.js +247 -0
- data/public/CodeMirror/mode/clike/index.html +102 -0
- data/public/CodeMirror/mode/css/css.js +124 -0
- data/public/CodeMirror/mode/css/index.html +56 -0
- data/public/CodeMirror/mode/diff/diff.css +3 -0
- data/public/CodeMirror/mode/diff/diff.js +13 -0
- data/public/CodeMirror/mode/diff/index.html +99 -0
- data/public/CodeMirror/mode/haskell/haskell.js +242 -0
- data/public/CodeMirror/mode/haskell/index.html +60 -0
- data/public/CodeMirror/mode/htmlmixed/htmlmixed.js +79 -0
- data/public/CodeMirror/mode/htmlmixed/index.html +52 -0
- data/public/CodeMirror/mode/javascript/index.html +78 -0
- data/public/CodeMirror/mode/javascript/javascript.js +348 -0
- data/public/CodeMirror/mode/lua/index.html +72 -0
- data/public/CodeMirror/mode/lua/lua.js +138 -0
- data/public/CodeMirror/mode/php/index.html +49 -0
- data/public/CodeMirror/mode/php/php.js +110 -0
- data/public/CodeMirror/mode/plsql/index.html +63 -0
- data/public/CodeMirror/mode/plsql/plsql.js +217 -0
- data/public/CodeMirror/mode/python/LICENSE.txt +21 -0
- data/public/CodeMirror/mode/python/index.html +123 -0
- data/public/CodeMirror/mode/python/python.js +321 -0
- data/public/CodeMirror/mode/rst/index.html +526 -0
- data/public/CodeMirror/mode/rst/rst.css +75 -0
- data/public/CodeMirror/mode/rst/rst.js +333 -0
- data/public/CodeMirror/mode/scheme/index.html +65 -0
- data/public/CodeMirror/mode/scheme/scheme.js +181 -0
- data/public/CodeMirror/mode/smalltalk/index.html +56 -0
- data/public/CodeMirror/mode/smalltalk/smalltalk.js +134 -0
- data/public/CodeMirror/mode/sparql/index.html +41 -0
- data/public/CodeMirror/mode/sparql/sparql.js +143 -0
- data/public/CodeMirror/mode/stex/index.html +96 -0
- data/public/CodeMirror/mode/stex/stex.js +167 -0
- data/public/CodeMirror/mode/xml/index.html +42 -0
- data/public/CodeMirror/mode/xml/xml.js +231 -0
- data/public/CodeMirror/mode/yaml/index.html +68 -0
- data/public/CodeMirror/mode/yaml/yaml.js +95 -0
- data/public/CodeMirror/oldrelease.html +178 -0
- data/public/CodeMirror/test/index.html +29 -0
- data/public/CodeMirror/test/test.js +249 -0
- data/public/CodeMirror/theme/default.css +18 -0
- data/public/CodeMirror/theme/elegant.css +9 -0
- data/public/CodeMirror/theme/jtalk.css +21 -0
- data/public/CodeMirror/theme/neat.css +8 -0
- data/public/CodeMirror/theme/night.css +20 -0
- data/public/css/jtalk.css +362 -0
- data/public/css/style.css +456 -0
- data/public/css/sunit.css +66 -0
- data/public/ide/fork_me.png +0 -0
- data/public/ide/screen2.png +0 -0
- data/public/ide/style.css +456 -0
- data/public/ide/syntax.css +61 -0
- data/public/ide/text_header.png +0 -0
- data/public/ide/title_container1.png +0 -0
- data/public/images/background_box.png +0 -0
- data/public/images/background_header.png +0 -0
- data/public/images/balloon_header.png +0 -0
- data/views/index.haml +66 -0
- metadata +341 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CodeMirror 2: YAML mode</title>
|
|
5
|
+
<link rel="stylesheet" href="../../lib/codemirror.css">
|
|
6
|
+
<script src="../../lib/codemirror.js"></script>
|
|
7
|
+
<script src="yaml.js"></script>
|
|
8
|
+
<link rel="stylesheet" href="../../theme/default.css">
|
|
9
|
+
<style>.CodeMirror { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; }</style>
|
|
10
|
+
<link rel="stylesheet" href="../../css/docs.css">
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<h1>CodeMirror 2: YAML mode</h1>
|
|
14
|
+
<form><textarea id="code" name="code">
|
|
15
|
+
--- # Favorite movies
|
|
16
|
+
- Casablanca
|
|
17
|
+
- North by Northwest
|
|
18
|
+
- The Man Who Wasn't There
|
|
19
|
+
--- # Shopping list
|
|
20
|
+
[milk, pumpkin pie, eggs, juice]
|
|
21
|
+
--- # Indented Blocks, common in YAML data files, use indentation and new lines to separate the key: value pairs
|
|
22
|
+
name: John Smith
|
|
23
|
+
age: 33
|
|
24
|
+
--- # Inline Blocks, common in YAML data streams, use commas to separate the key: value pairs between braces
|
|
25
|
+
{name: John Smith, age: 33}
|
|
26
|
+
---
|
|
27
|
+
receipt: Oz-Ware Purchase Invoice
|
|
28
|
+
date: 2007-08-06
|
|
29
|
+
customer:
|
|
30
|
+
given: Dorothy
|
|
31
|
+
family: Gale
|
|
32
|
+
|
|
33
|
+
items:
|
|
34
|
+
- part_no: A4786
|
|
35
|
+
descrip: Water Bucket (Filled)
|
|
36
|
+
price: 1.47
|
|
37
|
+
quantity: 4
|
|
38
|
+
|
|
39
|
+
- part_no: E1628
|
|
40
|
+
descrip: High Heeled "Ruby" Slippers
|
|
41
|
+
size: 8
|
|
42
|
+
price: 100.27
|
|
43
|
+
quantity: 1
|
|
44
|
+
|
|
45
|
+
bill-to: &id001
|
|
46
|
+
street: |
|
|
47
|
+
123 Tornado Alley
|
|
48
|
+
Suite 16
|
|
49
|
+
city: East Centerville
|
|
50
|
+
state: KS
|
|
51
|
+
|
|
52
|
+
ship-to: *id001
|
|
53
|
+
|
|
54
|
+
specialDelivery: >
|
|
55
|
+
Follow the Yellow Brick
|
|
56
|
+
Road to the Emerald City.
|
|
57
|
+
Pay no attention to the
|
|
58
|
+
man behind the curtain.
|
|
59
|
+
...
|
|
60
|
+
</textarea></form>
|
|
61
|
+
<script>
|
|
62
|
+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<p><strong>MIME types defined:</strong> <code>text/x-yaml</code>.</p>
|
|
66
|
+
|
|
67
|
+
</body>
|
|
68
|
+
</html>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
CodeMirror.defineMode("yaml", function() {
|
|
2
|
+
|
|
3
|
+
var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
|
|
4
|
+
var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');
|
|
5
|
+
|
|
6
|
+
return {
|
|
7
|
+
token: function(stream, state) {
|
|
8
|
+
var ch = stream.peek();
|
|
9
|
+
var esc = state.escaped;
|
|
10
|
+
state.escaped = false;
|
|
11
|
+
/* comments */
|
|
12
|
+
if (ch == "#") { stream.skipToEnd(); return "comment"; }
|
|
13
|
+
if (state.literal && stream.indentation() > state.keyCol) {
|
|
14
|
+
stream.skipToEnd(); return "string";
|
|
15
|
+
} else if (state.literal) { state.literal = false; }
|
|
16
|
+
if (stream.sol()) {
|
|
17
|
+
state.keyCol = 0;
|
|
18
|
+
state.pair = false;
|
|
19
|
+
state.pairStart = false;
|
|
20
|
+
/* document start */
|
|
21
|
+
if(stream.match(/---/)) { return "def"; }
|
|
22
|
+
/* document end */
|
|
23
|
+
if (stream.match(/\.\.\./)) { return "def"; }
|
|
24
|
+
/* array list item */
|
|
25
|
+
if (stream.match(/\s*-\s+/)) { return 'meta'; }
|
|
26
|
+
}
|
|
27
|
+
/* pairs (associative arrays) -> key */
|
|
28
|
+
if (!state.pair && stream.match(/^\s*([a-z0-9\._-])+(?=\s*:)/i)) {
|
|
29
|
+
state.pair = true;
|
|
30
|
+
state.keyCol = stream.indentation();
|
|
31
|
+
return "atom";
|
|
32
|
+
}
|
|
33
|
+
if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }
|
|
34
|
+
|
|
35
|
+
/* inline pairs/lists */
|
|
36
|
+
if (stream.match(/^(\{|\}|\[|\])/)) {
|
|
37
|
+
if (ch == '{')
|
|
38
|
+
state.inlinePairs++;
|
|
39
|
+
else if (ch == '}')
|
|
40
|
+
state.inlinePairs--;
|
|
41
|
+
else if (ch == '[')
|
|
42
|
+
state.inlineList++;
|
|
43
|
+
else
|
|
44
|
+
state.inlineList--;
|
|
45
|
+
return 'meta';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* list seperator */
|
|
49
|
+
if (state.inlineList > 0 && !esc && ch == ',') {
|
|
50
|
+
stream.next();
|
|
51
|
+
return 'meta';
|
|
52
|
+
}
|
|
53
|
+
/* pairs seperator */
|
|
54
|
+
if (state.inlinePairs > 0 && !esc && ch == ',') {
|
|
55
|
+
state.keyCol = 0;
|
|
56
|
+
state.pair = false;
|
|
57
|
+
state.pairStart = false;
|
|
58
|
+
stream.next();
|
|
59
|
+
return 'meta';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* start of value of a pair */
|
|
63
|
+
if (state.pairStart) {
|
|
64
|
+
/* block literals */
|
|
65
|
+
if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
|
|
66
|
+
/* references */
|
|
67
|
+
if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
|
|
68
|
+
/* numbers */
|
|
69
|
+
if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
|
|
70
|
+
if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
|
|
71
|
+
/* keywords */
|
|
72
|
+
if (stream.match(keywordRegex)) { return 'keyword'; }
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* nothing found, continue */
|
|
76
|
+
state.pairStart = false;
|
|
77
|
+
state.escaped = (ch == '\\');
|
|
78
|
+
stream.next();
|
|
79
|
+
return null;
|
|
80
|
+
},
|
|
81
|
+
startState: function() {
|
|
82
|
+
return {
|
|
83
|
+
pair: false,
|
|
84
|
+
pairStart: false,
|
|
85
|
+
keyCol: 0,
|
|
86
|
+
inlinePairs: 0,
|
|
87
|
+
inlineList: 0,
|
|
88
|
+
literal: false,
|
|
89
|
+
escaped: false
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
CodeMirror.defineMIME("text/x-yaml", "yaml");
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CodeMirror</title>
|
|
5
|
+
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Droid+Sans|Droid+Sans:bold"/>
|
|
6
|
+
<link rel="stylesheet" type="text/css" href="css/docs.css"/>
|
|
7
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
|
8
|
+
<link rel="alternate" href="http://twitter.com/statuses/user_timeline/242283288.rss" type="application/rss+xml"/>
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
|
|
12
|
+
<h1><span class="logo-braces">{ }</span> <a href="http://codemirror.net/">CodeMirror</a></h1>
|
|
13
|
+
|
|
14
|
+
<pre class="grey">
|
|
15
|
+
<img src="css/baboon.png" class="logo" alt="logo"/>/* Old release history */
|
|
16
|
+
|
|
17
|
+
</pre>
|
|
18
|
+
|
|
19
|
+
<p class="rel">28-03-2011: <a href="http://codemirror.net/codemirror-2.0.zip">Version 2.0</a>:</p>
|
|
20
|
+
<p class="rel-note">CodeMirror 2 is a complete rewrite that's
|
|
21
|
+
faster, smaller, simpler to use, and less dependent on browser
|
|
22
|
+
quirks. See <a href="internals.html">this</a>
|
|
23
|
+
and <a href="http://groups.google.com/group/codemirror/browse_thread/thread/5a8e894024a9f580">this</a>
|
|
24
|
+
for more information.</a>
|
|
25
|
+
|
|
26
|
+
<p class="rel">28-03-2011: <a href="http://codemirror.net/codemirror-1.0.zip">Version 1.0</a>:</p>
|
|
27
|
+
<ul class="rel-note">
|
|
28
|
+
<li>Fix error when debug history overflows.</li>
|
|
29
|
+
<li>Refine handling of C# verbatim strings.</li>
|
|
30
|
+
<li>Fix some issues with JavaScript indentation.</li>
|
|
31
|
+
</ul>
|
|
32
|
+
|
|
33
|
+
<p class="rel">22-02-2011: <a href="https://github.com/marijnh/codemirror2/tree/beta2">Version 2.0 beta 2</a>:</p>
|
|
34
|
+
<p class="rel-note">Somewhate more mature API, lots of bugs shaken out.</a>
|
|
35
|
+
|
|
36
|
+
<p class="rel">17-02-2011: <a href="http://codemirror.net/codemirror-0.94.zip">Version 0.94</a>:</p>
|
|
37
|
+
<ul class="rel-note">
|
|
38
|
+
<li><code>tabMode: "spaces"</code> was modified slightly (now indents when something is selected).</li>
|
|
39
|
+
<li>Fixes a bug that would cause the selection code to break on some IE versions.</li>
|
|
40
|
+
<li>Disabling spell-check on WebKit browsers now works.</li>
|
|
41
|
+
</ul>
|
|
42
|
+
|
|
43
|
+
<p class="rel">08-02-2011: <a href="http://codemirror.net/2/">Version 2.0 beta 1</a>:</p>
|
|
44
|
+
<p class="rel-note">CodeMirror 2 is a complete rewrite of
|
|
45
|
+
CodeMirror, no longer depending on an editable frame.</p>
|
|
46
|
+
|
|
47
|
+
<p class="rel">19-01-2011: <a href="http://codemirror.net/codemirror-0.93.zip">Version 0.93</a>:</p>
|
|
48
|
+
<ul class="rel-note">
|
|
49
|
+
<li>Added a <a href="contrib/regex/index.html">Regular Expression</a> parser.</li>
|
|
50
|
+
<li>Fixes to the PHP parser.</li>
|
|
51
|
+
<li>Support for regular expression in search/replace.</li>
|
|
52
|
+
<li>Add <code>save</code> method to instances created with <code>fromTextArea</code>.</li>
|
|
53
|
+
<li>Add support for MS T-SQL in the SQL parser.</li>
|
|
54
|
+
<li>Support use of CSS classes for highlighting brackets.</li>
|
|
55
|
+
<li>Fix yet another hang with line-numbering in hidden editors.</li>
|
|
56
|
+
</ul>
|
|
57
|
+
|
|
58
|
+
<p class="rel">17-12-2010: <a href="http://codemirror.net/codemirror-0.92.zip">Version 0.92</a>:</p>
|
|
59
|
+
<ul class="rel-note">
|
|
60
|
+
<li>Make CodeMirror work in XHTML documents.</li>
|
|
61
|
+
<li>Fix bug in handling of backslashes in Python strings.</li>
|
|
62
|
+
<li>The <code>styleNumbers</code> option is now officially
|
|
63
|
+
supported and documented.</li>
|
|
64
|
+
<li><code>onLineNumberClick</code> option added.</li>
|
|
65
|
+
<li>More consistent names <code>onLoad</code> and
|
|
66
|
+
<code>onCursorActivity</code> callbacks. Old names still work, but
|
|
67
|
+
are deprecated.</li>
|
|
68
|
+
<li>Add a <a href="contrib/freemarker/index.html">Freemarker</a> mode.</li>
|
|
69
|
+
</ul>
|
|
70
|
+
|
|
71
|
+
<p class="rel">11-11-2010: <a
|
|
72
|
+
href="http://codemirror.net/codemirror-0.91.zip">Version 0.91</a>:</p>
|
|
73
|
+
<ul class="rel-note">
|
|
74
|
+
<li>Adds support for <a href="contrib/java">Java</a>.</li>
|
|
75
|
+
<li>Small additions to the <a href="contrib/php">PHP</a> and <a href="contrib/sql">SQL</a> parsers.</li>
|
|
76
|
+
<li>Work around various <a href="https://bugs.webkit.org/show_bug.cgi?id=47806">Webkit</a> <a href="https://bugs.webkit.org/show_bug.cgi?id=23474">issues</a>.</li>
|
|
77
|
+
<li>Fix <code>toTextArea</code> to update the code in the textarea.</li>
|
|
78
|
+
<li>Add a <code>noScriptCaching</code> option (hack to ease development).</li>
|
|
79
|
+
<li>Make sub-modes of <a href="mixedtest.html">HTML mixed</a> mode configurable.</li>
|
|
80
|
+
</ul>
|
|
81
|
+
|
|
82
|
+
<p class="rel">02-10-2010: <a
|
|
83
|
+
href="http://codemirror.net/codemirror-0.9.zip">Version 0.9</a>:</p>
|
|
84
|
+
<ul class="rel-note">
|
|
85
|
+
<li>Add support for searching backwards.</li>
|
|
86
|
+
<li>There are now parsers for <a href="contrib/scheme/index.html">Scheme</a>, <a href="contrib/xquery/index.html">XQuery</a>, and <a href="contrib/ometa/index.html">OmetaJS</a>.</li>
|
|
87
|
+
<li>Makes <code>height: "dynamic"</code> more robust.</li>
|
|
88
|
+
<li>Fixes bug where paste did not work on OS X.</li>
|
|
89
|
+
<li>Add a <code>enterMode</code> and <code>electricChars</code> options to make indentation even more customizable.</li>
|
|
90
|
+
<li>Add <code>firstLineNumber</code> option.</li>
|
|
91
|
+
<li>Fix bad handling of <code>@media</code> rules by the CSS parser.</li>
|
|
92
|
+
<li>Take a new, more robust approach to working around the invisible-last-line bug in WebKit.</li>
|
|
93
|
+
</ul>
|
|
94
|
+
|
|
95
|
+
<p class="rel">22-07-2010: <a
|
|
96
|
+
href="http://codemirror.net/codemirror-0.8.zip">Version 0.8</a>:</p>
|
|
97
|
+
<ul class="rel-note">
|
|
98
|
+
<li>Add a <code>cursorCoords</code> method to find the screen
|
|
99
|
+
coordinates of the cursor.</li>
|
|
100
|
+
<li>A number of fixes and support for more syntax in the PHP parser.</li>
|
|
101
|
+
<li>Fix indentation problem with JSON-mode JS parser in Webkit.</li>
|
|
102
|
+
<li>Add a <a href="compress.html">minification</a> UI.</li>
|
|
103
|
+
<li>Support a <code>height: dynamic</code> mode, where the editor's
|
|
104
|
+
height will adjust to the size of its content.</li>
|
|
105
|
+
<li>Better support for IME input mode.</li>
|
|
106
|
+
<li>Fix JavaScript parser getting confused when seeing a no-argument
|
|
107
|
+
function call.</li>
|
|
108
|
+
<li>Have CSS parser see the difference between selectors and other
|
|
109
|
+
identifiers.</li>
|
|
110
|
+
<li>Fix scrolling bug when pasting in a horizontally-scrolled
|
|
111
|
+
editor.</li>
|
|
112
|
+
<li>Support <code>toTextArea</code> method in instances created with
|
|
113
|
+
<code>fromTextArea</code>.</li>
|
|
114
|
+
<li>Work around new Opera cursor bug that causes the cursor to jump
|
|
115
|
+
when pressing backspace at the end of a line.</li>
|
|
116
|
+
</ul>
|
|
117
|
+
|
|
118
|
+
<p class="rel">27-04-2010: <a
|
|
119
|
+
href="http://codemirror.net/codemirror-0.67.zip">Version
|
|
120
|
+
0.67</a>:</p>
|
|
121
|
+
<p class="rel-note">More consistent page-up/page-down behaviour
|
|
122
|
+
across browsers. Fix some issues with hidden editors looping forever
|
|
123
|
+
when line-numbers were enabled. Make PHP parser parse
|
|
124
|
+
<code>"\\"</code> correctly. Have <code>jumpToLine</code> work on
|
|
125
|
+
line handles, and add <code>cursorLine</code> function to fetch the
|
|
126
|
+
line handle where the cursor currently is. Add new
|
|
127
|
+
<code>setStylesheet</code> function to switch style-sheets in a
|
|
128
|
+
running editor.</p>
|
|
129
|
+
|
|
130
|
+
<p class="rel">01-03-2010: <a
|
|
131
|
+
href="http://codemirror.net/codemirror-0.66.zip">Version
|
|
132
|
+
0.66</a>:</p>
|
|
133
|
+
<p class="rel-note">Adds <code>removeLine</code> method to API.
|
|
134
|
+
Introduces the <a href="contrib/plsql/index.html">PLSQL parser</a>.
|
|
135
|
+
Marks XML errors by adding (rather than replacing) a CSS class, so
|
|
136
|
+
that they can be disabled by modifying their style. Fixes several
|
|
137
|
+
selection bugs, and a number of small glitches.</p>
|
|
138
|
+
|
|
139
|
+
<p class="rel">12-11-2009: <a
|
|
140
|
+
href="http://codemirror.net/codemirror-0.65.zip">Version
|
|
141
|
+
0.65</a>:</p>
|
|
142
|
+
<p class="rel-note">Add support for having both line-wrapping and
|
|
143
|
+
line-numbers turned on, make paren-highlighting style customisable
|
|
144
|
+
(<code>markParen</code> and <code>unmarkParen</code> config
|
|
145
|
+
options), work around a selection bug that Opera
|
|
146
|
+
<em>re</em>introduced in version 10.</p>
|
|
147
|
+
|
|
148
|
+
<p class="rel">23-10-2009: <a
|
|
149
|
+
href="http://codemirror.net/codemirror-0.64.zip">Version
|
|
150
|
+
0.64</a>:</p>
|
|
151
|
+
<p class="rel-note">Solves some issues introduced by the
|
|
152
|
+
paste-handling changes from the previous release. Adds
|
|
153
|
+
<code>setSpellcheck</code>, <code>setTextWrapping</code>,
|
|
154
|
+
<code>setIndentUnit</code>, <code>setUndoDepth</code>,
|
|
155
|
+
<code>setTabMode</code>, and <code>setLineNumbers</code> to
|
|
156
|
+
customise a running editor. Introduces an <a
|
|
157
|
+
href="contrib/sql/index.html">SQL</a> parser. Fixes a few small
|
|
158
|
+
problems in the <a href="contrib/python/index.html">Python</a>
|
|
159
|
+
parser. And, as usual, add workarounds for various newly discovered
|
|
160
|
+
browser incompatibilities.</p>
|
|
161
|
+
|
|
162
|
+
<p class="rel"><em>31-08-2009</em>: <a
|
|
163
|
+
href="http://codemirror.net/codemirror-0.63.zip">Version
|
|
164
|
+
0.63</a>:</p>
|
|
165
|
+
<p class="rel-note"> Overhaul of paste-handling (less fragile), fixes for several
|
|
166
|
+
serious IE8 issues (cursor jumping, end-of-document bugs) and a number
|
|
167
|
+
of small problems.</p>
|
|
168
|
+
|
|
169
|
+
<p class="rel"><em>30-05-2009</em>: <a
|
|
170
|
+
href="http://codemirror.net/codemirror-0.62.zip">Version
|
|
171
|
+
0.62</a>:</p>
|
|
172
|
+
<p class="rel-note">Introduces <a href="contrib/python/index.html">Python</a>
|
|
173
|
+
and <a href="contrib/lua/index.html">Lua</a> parsers. Add
|
|
174
|
+
<code>setParser</code> (on-the-fly mode changing) and
|
|
175
|
+
<code>clearHistory</code> methods. Make parsing passes time-based
|
|
176
|
+
instead of lines-based (see the <code>passTime</code> option).</p>
|
|
177
|
+
|
|
178
|
+
</body></html>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CodeMirror 2: Test Suite</title>
|
|
5
|
+
<link rel="stylesheet" href="../lib/codemirror.css">
|
|
6
|
+
<script src="../lib/codemirror.js"></script>
|
|
7
|
+
<link rel="stylesheet" href="../theme/default.css">
|
|
8
|
+
<script src="../mode/javascript/javascript.js"></script>
|
|
9
|
+
|
|
10
|
+
<style type="text/css">
|
|
11
|
+
.ok {color: #0e0;}
|
|
12
|
+
.failure {color: #e00;}
|
|
13
|
+
.error {color: #c90;}
|
|
14
|
+
</style>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<h1>CodeMirror 2: Test Suite</h1>
|
|
18
|
+
|
|
19
|
+
<p>A limited set of programmatic sanity tests for CodeMirror.</p>
|
|
20
|
+
|
|
21
|
+
<pre id=output></pre>
|
|
22
|
+
|
|
23
|
+
<div style="visibility: hidden" id=testground>
|
|
24
|
+
<form><textarea id="code" name="code"></textarea><input type=submit value=ok name=submit></form>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<script src="test.js"></script>
|
|
28
|
+
</body>
|
|
29
|
+
</html>
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
var tests = [];
|
|
2
|
+
|
|
3
|
+
test("fromTextArea", function() {
|
|
4
|
+
var te = document.getElementById("code");
|
|
5
|
+
te.value = "CONTENT";
|
|
6
|
+
var cm = CodeMirror.fromTextArea(te);
|
|
7
|
+
is(!te.offsetHeight);
|
|
8
|
+
eq(cm.getValue(), "CONTENT");
|
|
9
|
+
cm.setValue("foo\nbar");
|
|
10
|
+
eq(cm.getValue(), "foo\nbar");
|
|
11
|
+
cm.save();
|
|
12
|
+
is(/^foo\r?\nbar$/.test(te.value));
|
|
13
|
+
cm.setValue("xxx");
|
|
14
|
+
cm.toTextArea();
|
|
15
|
+
is(te.offsetHeight);
|
|
16
|
+
eq(te.value, "xxx");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
testCM("getRange", function(cm) {
|
|
20
|
+
eq(cm.getLine(0), "1234");
|
|
21
|
+
eq(cm.getLine(1), "5678");
|
|
22
|
+
eq(cm.getLine(2), null);
|
|
23
|
+
eq(cm.getLine(-1), null);
|
|
24
|
+
eq(cm.getRange({line: 0, ch: 0}, {line: 0, ch: 3}), "123");
|
|
25
|
+
eq(cm.getRange({line: 0, ch: -1}, {line: 0, ch: 200}), "1234");
|
|
26
|
+
eq(cm.getRange({line: 0, ch: 2}, {line: 1, ch: 2}), "34\n56");
|
|
27
|
+
eq(cm.getRange({line: 1, ch: 2}, {line: 100, ch: 0}), "78");
|
|
28
|
+
}, {value: "1234\n5678"});
|
|
29
|
+
|
|
30
|
+
testCM("replaceRange", function(cm) {
|
|
31
|
+
eq(cm.getValue(), "");
|
|
32
|
+
cm.replaceRange("foo\n", {line: 0, ch: 0});
|
|
33
|
+
eq(cm.getValue(), "foo\n");
|
|
34
|
+
cm.replaceRange("a\nb", {line: 0, ch: 1});
|
|
35
|
+
eq(cm.getValue(), "fa\nboo\n");
|
|
36
|
+
eq(cm.lineCount(), 3);
|
|
37
|
+
cm.replaceRange("xyzzy", {line: 0, ch: 0}, {line: 1, ch: 1});
|
|
38
|
+
eq(cm.getValue(), "xyzzyoo\n");
|
|
39
|
+
cm.replaceRange("abc", {line: 0, ch: 0}, {line: 10, ch: 0});
|
|
40
|
+
eq(cm.getValue(), "abc");
|
|
41
|
+
eq(cm.lineCount(), 1);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
testCM("selection", function(cm) {
|
|
45
|
+
cm.setSelection({line: 0, ch: 4}, {line: 2, ch: 2});
|
|
46
|
+
is(cm.somethingSelected());
|
|
47
|
+
eq(cm.getSelection(), "11\n222222\n33");
|
|
48
|
+
eqPos(cm.getCursor(false), {line: 2, ch: 2});
|
|
49
|
+
eqPos(cm.getCursor(true), {line: 0, ch: 4});
|
|
50
|
+
cm.setSelection({line: 1, ch: 0});
|
|
51
|
+
is(!cm.somethingSelected());
|
|
52
|
+
eq(cm.getSelection(), "");
|
|
53
|
+
eqPos(cm.getCursor(true), {line: 1, ch: 0});
|
|
54
|
+
cm.replaceSelection("abc");
|
|
55
|
+
eq(cm.getSelection(), "abc");
|
|
56
|
+
eq(cm.getValue(), "111111\nabc222222\n333333");
|
|
57
|
+
cm.replaceSelection("def", "end");
|
|
58
|
+
eq(cm.getSelection(), "");
|
|
59
|
+
eqPos(cm.getCursor(true), {line: 1, ch: 3});
|
|
60
|
+
cm.setCursor({line: 2, ch: 1});
|
|
61
|
+
eqPos(cm.getCursor(true), {line: 2, ch: 1});
|
|
62
|
+
cm.setCursor(1, 2);
|
|
63
|
+
eqPos(cm.getCursor(true), {line: 1, ch: 2});
|
|
64
|
+
}, {value: "111111\n222222\n333333"});
|
|
65
|
+
|
|
66
|
+
testCM("lines", function(cm) {
|
|
67
|
+
eq(cm.getLine(0), "111111");
|
|
68
|
+
eq(cm.getLine(1), "222222");
|
|
69
|
+
eq(cm.getLine(-1), null);
|
|
70
|
+
cm.removeLine(1);
|
|
71
|
+
cm.setLine(1, "abc");
|
|
72
|
+
eq(cm.getValue(), "111111\nabc");
|
|
73
|
+
}, {value: "111111\n222222\n333333"});
|
|
74
|
+
|
|
75
|
+
testCM("indent", function(cm) {
|
|
76
|
+
cm.indentLine(1);
|
|
77
|
+
eq(cm.getLine(1), " blah();");
|
|
78
|
+
cm.setOption("indentUnit", 8);
|
|
79
|
+
cm.indentLine(1);
|
|
80
|
+
eq(cm.getLine(1), "\tblah();");
|
|
81
|
+
}, {value: "if (x) {\nblah();\n}", indentUnit: 3, indentWithTabs: true});
|
|
82
|
+
|
|
83
|
+
test("defaults", function() {
|
|
84
|
+
var olddefaults = CodeMirror.defaults, defs = CodeMirror.defaults = {};
|
|
85
|
+
for (var opt in olddefaults) defs[opt] = olddefaults[opt];
|
|
86
|
+
defs.indentUnit = 5;
|
|
87
|
+
defs.value = "uu";
|
|
88
|
+
defs.enterMode = "keep";
|
|
89
|
+
defs.tabindex = 55;
|
|
90
|
+
var place = document.getElementById("testground"), cm = CodeMirror(place);
|
|
91
|
+
try {
|
|
92
|
+
eq(cm.getOption("indentUnit"), 5);
|
|
93
|
+
cm.setOption("indentUnit", 10);
|
|
94
|
+
eq(defs.indentUnit, 5);
|
|
95
|
+
eq(cm.getValue(), "uu");
|
|
96
|
+
eq(cm.getOption("enterMode"), "keep");
|
|
97
|
+
eq(cm.getInputField().tabindex, 55);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
CodeMirror.defaults = olddefaults;
|
|
101
|
+
place.removeChild(cm.getWrapperElement());
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
testCM("lineInfo", function(cm) {
|
|
106
|
+
eq(cm.lineInfo(-1), null);
|
|
107
|
+
var lh = cm.setMarker(1, "FOO", "bar");
|
|
108
|
+
var info = cm.lineInfo(1);
|
|
109
|
+
eq(info.text, "222222");
|
|
110
|
+
eq(info.markerText, "FOO");
|
|
111
|
+
eq(info.markerClass, "bar");
|
|
112
|
+
eq(info.line, 1);
|
|
113
|
+
eq(cm.lineInfo(2).markerText, null);
|
|
114
|
+
cm.clearMarker(lh);
|
|
115
|
+
eq(cm.lineInfo(1).markerText, null);
|
|
116
|
+
}, {value: "111111\n222222\n333333"});
|
|
117
|
+
|
|
118
|
+
testCM("coords", function(cm) {
|
|
119
|
+
var scroller = cm.getWrapperElement().getElementsByClassName("CodeMirror-scroll")[0];
|
|
120
|
+
scroller.style.height = "100px";
|
|
121
|
+
var content = [];
|
|
122
|
+
for (var i = 0; i < 200; ++i) content.push("------------------------------" + i);
|
|
123
|
+
cm.setValue(content.join("\n"));
|
|
124
|
+
var top = cm.charCoords({line: 0, ch: 0});
|
|
125
|
+
var bot = cm.charCoords({line: 200, ch: 30});
|
|
126
|
+
is(top.x < bot.x);
|
|
127
|
+
is(top.y < bot.y);
|
|
128
|
+
is(top.y < top.yBot);
|
|
129
|
+
scroller.scrollTop = 100;
|
|
130
|
+
cm.refresh();
|
|
131
|
+
var top2 = cm.charCoords({line: 0, ch: 0});
|
|
132
|
+
is(top.y > top2.y);
|
|
133
|
+
eq(top.x, top2.x);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
testCM("coordsChar", function(cm) {
|
|
137
|
+
var content = [];
|
|
138
|
+
for (var i = 0; i < 70; ++i) content.push("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
|
|
139
|
+
cm.setValue(content.join("\n"));
|
|
140
|
+
for (var x = 0; x < 35; x += 2) {
|
|
141
|
+
for (var y = 0; y < 70; y += 5) {
|
|
142
|
+
cm.setCursor(y, x);
|
|
143
|
+
var pos = cm.coordsChar(cm.charCoords({line: y, ch: x}));
|
|
144
|
+
eq(pos.line, y);
|
|
145
|
+
eq(pos.ch, x);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
testCM("undo", function(cm) {
|
|
151
|
+
cm.setLine(0, "def");
|
|
152
|
+
eq(cm.historySize().undo, 1);
|
|
153
|
+
cm.undo();
|
|
154
|
+
eq(cm.getValue(), "abc");
|
|
155
|
+
eq(cm.historySize().undo, 0);
|
|
156
|
+
eq(cm.historySize().redo, 1);
|
|
157
|
+
cm.redo();
|
|
158
|
+
eq(cm.getValue(), "def");
|
|
159
|
+
eq(cm.historySize().undo, 1);
|
|
160
|
+
eq(cm.historySize().redo, 0);
|
|
161
|
+
cm.setValue("1\n\n\n2");
|
|
162
|
+
eq(cm.historySize().undo, 0);
|
|
163
|
+
for (var i = 0; i < 20; ++i) {
|
|
164
|
+
cm.replaceRange("a", {line: 0, ch: 0});
|
|
165
|
+
cm.replaceRange("b", {line: 3, ch: 0});
|
|
166
|
+
}
|
|
167
|
+
eq(cm.historySize().undo, 40);
|
|
168
|
+
for (var i = 0; i < 38; ++i) cm.undo();
|
|
169
|
+
eq(cm.historySize().undo, 2);
|
|
170
|
+
eq(cm.historySize().redo, 38);
|
|
171
|
+
eq(cm.getValue(), "a1\n\n\nb2");
|
|
172
|
+
cm.setOption("undoDepth", 10);
|
|
173
|
+
for (var i = 0; i < 20; ++i) {
|
|
174
|
+
cm.replaceRange("a", {line: 0, ch: 0});
|
|
175
|
+
cm.replaceRange("b", {line: 3, ch: 0});
|
|
176
|
+
}
|
|
177
|
+
eq(cm.historySize().undo, 10);
|
|
178
|
+
}, {value: "abc"});
|
|
179
|
+
|
|
180
|
+
testCM("undoMultiLine", function(cm) {
|
|
181
|
+
cm.replaceRange("x", {line:0, ch: 0});
|
|
182
|
+
cm.replaceRange("y", {line:1, ch: 0});
|
|
183
|
+
cm.undo();
|
|
184
|
+
eq(cm.getValue(), "abc\ndef\nghi");
|
|
185
|
+
cm.replaceRange("y", {line:1, ch: 0});
|
|
186
|
+
cm.replaceRange("x", {line:0, ch: 0});
|
|
187
|
+
cm.undo();
|
|
188
|
+
eq(cm.getValue(), "abc\ndef\nghi");
|
|
189
|
+
cm.replaceRange("y", {line:2, ch: 0});
|
|
190
|
+
cm.replaceRange("x", {line:1, ch: 0});
|
|
191
|
+
cm.replaceRange("z", {line:2, ch: 0});
|
|
192
|
+
cm.undo();
|
|
193
|
+
eq(cm.getValue(), "abc\ndef\nghi");
|
|
194
|
+
}, {value: "abc\ndef\nghi"});
|
|
195
|
+
|
|
196
|
+
// Scaffolding
|
|
197
|
+
|
|
198
|
+
function htmlEscape(str) {
|
|
199
|
+
return str.replace(/[<&]/g, function(str) {return str == "&" ? "&" : "<";});
|
|
200
|
+
}
|
|
201
|
+
function forEach(arr, f) {
|
|
202
|
+
for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function Failure(why) {this.message = why;}
|
|
206
|
+
|
|
207
|
+
function test(name, run) {tests.push({name: name, func: run});}
|
|
208
|
+
function testCM(name, run, opts) {
|
|
209
|
+
test(name, function() {
|
|
210
|
+
var place = document.getElementById("testground"), cm = CodeMirror(place, opts);
|
|
211
|
+
try {run(cm);}
|
|
212
|
+
finally {place.removeChild(cm.getWrapperElement());}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function runTests() {
|
|
217
|
+
var failures = [], run = 0;
|
|
218
|
+
for (var i = 0; i < tests.length; ++i) {
|
|
219
|
+
var test = tests[i];
|
|
220
|
+
try {test.func();}
|
|
221
|
+
catch(e) {
|
|
222
|
+
if (e instanceof Failure)
|
|
223
|
+
failures.push({type: "failure", test: test.name, text: e.message});
|
|
224
|
+
else
|
|
225
|
+
failures.push({type: "error", test: test.name, text: e.toString()});
|
|
226
|
+
}
|
|
227
|
+
run++;
|
|
228
|
+
}
|
|
229
|
+
var html = [run + " tests run."];
|
|
230
|
+
if (failures.length)
|
|
231
|
+
forEach(failures, function(fail) {
|
|
232
|
+
html.push(fail.test + ': <span class="' + fail.type + '">' + htmlEscape(fail.text) + "</span>");
|
|
233
|
+
});
|
|
234
|
+
else html.push('<span class="ok">All passed.</span>');
|
|
235
|
+
document.getElementById("output").innerHTML = html.join("\n");
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function eq(a, b, msg) {
|
|
239
|
+
if (a != b) throw new Failure(a + " != " + b + (msg ? " (" + msg + ")" : ""));
|
|
240
|
+
}
|
|
241
|
+
function eqPos(a, b, msg) {
|
|
242
|
+
eq(a.line, b.line, msg);
|
|
243
|
+
eq(a.ch, b.ch, msg);
|
|
244
|
+
}
|
|
245
|
+
function is(a, msg) {
|
|
246
|
+
if (!a) throw new Failure("assertion failed" + (msg ? " (" + msg + ")" : ""));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
window.onload = runTests;
|