ledger_web 1.2
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 +10 -0
- data/LICENSE +7 -0
- data/README.md +140 -0
- data/Rakefile +11 -0
- data/bin/ledger_web +14 -0
- data/ledger_web.gemspec +26 -0
- data/lib/ledger_web/app.rb +69 -0
- data/lib/ledger_web/config.rb +87 -0
- data/lib/ledger_web/db/migrate/20111226180900_initial_schema.rb +38 -0
- data/lib/ledger_web/db/migrate/20111231132900_add_views.rb +37 -0
- data/lib/ledger_web/db.rb +54 -0
- data/lib/ledger_web/helpers.rb +62 -0
- data/lib/ledger_web/public/bootstrap-dropdown.js +55 -0
- data/lib/ledger_web/public/bootstrap.min.css +356 -0
- data/lib/ledger_web/public/codemirror/keymap/emacs.js +29 -0
- data/lib/ledger_web/public/codemirror/keymap/vim.js +76 -0
- data/lib/ledger_web/public/codemirror/lib/codemirror.css +104 -0
- data/lib/ledger_web/public/codemirror/lib/codemirror.js +2761 -0
- data/lib/ledger_web/public/codemirror/lib/util/dialog.css +23 -0
- data/lib/ledger_web/public/codemirror/lib/util/dialog.js +63 -0
- data/lib/ledger_web/public/codemirror/lib/util/foldcode.js +66 -0
- data/lib/ledger_web/public/codemirror/lib/util/formatting.js +291 -0
- data/lib/ledger_web/public/codemirror/lib/util/javascript-hint.js +83 -0
- data/lib/ledger_web/public/codemirror/lib/util/overlay.js +51 -0
- data/lib/ledger_web/public/codemirror/lib/util/runmode.js +27 -0
- data/lib/ledger_web/public/codemirror/lib/util/search.js +114 -0
- data/lib/ledger_web/public/codemirror/lib/util/searchcursor.js +117 -0
- data/lib/ledger_web/public/codemirror/lib/util/simple-hint.css +16 -0
- data/lib/ledger_web/public/codemirror/lib/util/simple-hint.js +66 -0
- data/lib/ledger_web/public/codemirror/mode/clike/clike.js +249 -0
- data/lib/ledger_web/public/codemirror/mode/clike/index.html +101 -0
- data/lib/ledger_web/public/codemirror/mode/clojure/clojure.js +207 -0
- data/lib/ledger_web/public/codemirror/mode/clojure/index.html +66 -0
- data/lib/ledger_web/public/codemirror/mode/coffeescript/LICENSE +22 -0
- data/lib/ledger_web/public/codemirror/mode/coffeescript/coffeescript.js +325 -0
- data/lib/ledger_web/public/codemirror/mode/coffeescript/index.html +721 -0
- data/lib/ledger_web/public/codemirror/mode/css/css.js +124 -0
- data/lib/ledger_web/public/codemirror/mode/css/index.html +55 -0
- data/lib/ledger_web/public/codemirror/mode/diff/diff.css +3 -0
- data/lib/ledger_web/public/codemirror/mode/diff/diff.js +13 -0
- data/lib/ledger_web/public/codemirror/mode/diff/index.html +99 -0
- data/lib/ledger_web/public/codemirror/mode/gfm/gfm.js +108 -0
- data/lib/ledger_web/public/codemirror/mode/gfm/index.html +47 -0
- data/lib/ledger_web/public/codemirror/mode/groovy/groovy.js +210 -0
- data/lib/ledger_web/public/codemirror/mode/groovy/index.html +71 -0
- data/lib/ledger_web/public/codemirror/mode/haskell/haskell.js +242 -0
- data/lib/ledger_web/public/codemirror/mode/haskell/index.html +60 -0
- data/lib/ledger_web/public/codemirror/mode/htmlembedded/htmlembedded.js +68 -0
- data/lib/ledger_web/public/codemirror/mode/htmlembedded/index.html +49 -0
- data/lib/ledger_web/public/codemirror/mode/htmlmixed/htmlmixed.js +83 -0
- data/lib/ledger_web/public/codemirror/mode/htmlmixed/index.html +51 -0
- data/lib/ledger_web/public/codemirror/mode/javascript/index.html +77 -0
- data/lib/ledger_web/public/codemirror/mode/javascript/javascript.js +360 -0
- data/lib/ledger_web/public/codemirror/mode/jinja2/index.html +37 -0
- data/lib/ledger_web/public/codemirror/mode/jinja2/jinja2.js +42 -0
- data/lib/ledger_web/public/codemirror/mode/lua/index.html +72 -0
- data/lib/ledger_web/public/codemirror/mode/lua/lua.js +140 -0
- data/lib/ledger_web/public/codemirror/mode/markdown/index.html +339 -0
- data/lib/ledger_web/public/codemirror/mode/markdown/markdown.js +242 -0
- data/lib/ledger_web/public/codemirror/mode/ntriples/index.html +32 -0
- data/lib/ledger_web/public/codemirror/mode/ntriples/ntriples.js +172 -0
- data/lib/ledger_web/public/codemirror/mode/pascal/LICENSE +7 -0
- data/lib/ledger_web/public/codemirror/mode/pascal/index.html +48 -0
- data/lib/ledger_web/public/codemirror/mode/pascal/pascal.js +138 -0
- data/lib/ledger_web/public/codemirror/mode/perl/LICENSE +19 -0
- data/lib/ledger_web/public/codemirror/mode/perl/index.html +62 -0
- data/lib/ledger_web/public/codemirror/mode/perl/perl.js +816 -0
- data/lib/ledger_web/public/codemirror/mode/php/index.html +48 -0
- data/lib/ledger_web/public/codemirror/mode/php/php.js +120 -0
- data/lib/ledger_web/public/codemirror/mode/plsql/index.html +62 -0
- data/lib/ledger_web/public/codemirror/mode/plsql/plsql.js +217 -0
- data/lib/ledger_web/public/codemirror/mode/python/LICENSE.txt +21 -0
- data/lib/ledger_web/public/codemirror/mode/python/index.html +122 -0
- data/lib/ledger_web/public/codemirror/mode/python/python.js +333 -0
- data/lib/ledger_web/public/codemirror/mode/r/LICENSE +24 -0
- data/lib/ledger_web/public/codemirror/mode/r/index.html +73 -0
- data/lib/ledger_web/public/codemirror/mode/r/r.js +141 -0
- data/lib/ledger_web/public/codemirror/mode/rpm/changes/changes.js +19 -0
- data/lib/ledger_web/public/codemirror/mode/rpm/changes/index.html +53 -0
- data/lib/ledger_web/public/codemirror/mode/rpm/spec/index.html +99 -0
- data/lib/ledger_web/public/codemirror/mode/rpm/spec/spec.css +5 -0
- data/lib/ledger_web/public/codemirror/mode/rpm/spec/spec.js +66 -0
- data/lib/ledger_web/public/codemirror/mode/rst/index.html +525 -0
- data/lib/ledger_web/public/codemirror/mode/rst/rst.js +326 -0
- data/lib/ledger_web/public/codemirror/mode/ruby/LICENSE +24 -0
- data/lib/ledger_web/public/codemirror/mode/ruby/index.html +171 -0
- data/lib/ledger_web/public/codemirror/mode/ruby/ruby.js +195 -0
- data/lib/ledger_web/public/codemirror/mode/rust/index.html +48 -0
- data/lib/ledger_web/public/codemirror/mode/rust/rust.js +411 -0
- data/lib/ledger_web/public/codemirror/mode/scheme/index.html +64 -0
- data/lib/ledger_web/public/codemirror/mode/scheme/scheme.js +202 -0
- data/lib/ledger_web/public/codemirror/mode/smalltalk/index.html +55 -0
- data/lib/ledger_web/public/codemirror/mode/smalltalk/smalltalk.js +139 -0
- data/lib/ledger_web/public/codemirror/mode/sparql/index.html +40 -0
- data/lib/ledger_web/public/codemirror/mode/sparql/sparql.js +143 -0
- data/lib/ledger_web/public/codemirror/mode/stex/index.html +95 -0
- data/lib/ledger_web/public/codemirror/mode/stex/stex.js +167 -0
- data/lib/ledger_web/public/codemirror/mode/tiddlywiki/index.html +183 -0
- data/lib/ledger_web/public/codemirror/mode/tiddlywiki/tiddlywiki.css +21 -0
- data/lib/ledger_web/public/codemirror/mode/tiddlywiki/tiddlywiki.js +374 -0
- data/lib/ledger_web/public/codemirror/mode/velocity/index.html +103 -0
- data/lib/ledger_web/public/codemirror/mode/velocity/velocity.js +146 -0
- data/lib/ledger_web/public/codemirror/mode/xml/index.html +44 -0
- data/lib/ledger_web/public/codemirror/mode/xml/xml.js +252 -0
- data/lib/ledger_web/public/codemirror/mode/xmlpure/index.html +59 -0
- data/lib/ledger_web/public/codemirror/mode/xmlpure/xmlpure.js +485 -0
- data/lib/ledger_web/public/codemirror/mode/yaml/index.html +67 -0
- data/lib/ledger_web/public/codemirror/mode/yaml/yaml.js +95 -0
- data/lib/ledger_web/public/codemirror/theme/cobalt.css +18 -0
- data/lib/ledger_web/public/codemirror/theme/eclipse.css +25 -0
- data/lib/ledger_web/public/codemirror/theme/elegant.css +10 -0
- data/lib/ledger_web/public/codemirror/theme/monokai.css +28 -0
- data/lib/ledger_web/public/codemirror/theme/neat.css +9 -0
- data/lib/ledger_web/public/codemirror/theme/night.css +21 -0
- data/lib/ledger_web/public/codemirror/theme/rubyblue.css +21 -0
- data/lib/ledger_web/public/jquery-1.7.1.min.js +4 -0
- data/lib/ledger_web/public/jquery.tablesorter.min.js +4 -0
- data/lib/ledger_web/public/ledger.css +14 -0
- data/lib/ledger_web/report.rb +187 -0
- data/lib/ledger_web/reports/savings_rate.erb +49 -0
- data/lib/ledger_web/version.rb +3 -0
- data/lib/ledger_web/views/error.erb +5 -0
- data/lib/ledger_web/views/help.erb +6 -0
- data/lib/ledger_web/views/layout.erb +44 -0
- data/lib/ledger_web/views/table.erb +31 -0
- data/lib/ledger_web/watcher.rb +37 -0
- data/lib/ledger_web.rb +20 -0
- metadata +229 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CodeMirror: Groovy mode</title>
|
|
5
|
+
<link rel="stylesheet" href="../../lib/codemirror.css">
|
|
6
|
+
<script src="../../lib/codemirror.js"></script>
|
|
7
|
+
<script src="groovy.js"></script>
|
|
8
|
+
<link rel="stylesheet" href="../../doc/docs.css">
|
|
9
|
+
<style>.CodeMirror {border-top: 1px solid #500; border-bottom: 1px solid #500;}</style>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<h1>CodeMirror: Groovy mode</h1>
|
|
13
|
+
|
|
14
|
+
<form><textarea id="code" name="code">
|
|
15
|
+
//Pattern for groovy script
|
|
16
|
+
def p = ~/.*\.groovy/
|
|
17
|
+
new File( 'd:\\scripts' ).eachFileMatch(p) {f ->
|
|
18
|
+
// imports list
|
|
19
|
+
def imports = []
|
|
20
|
+
f.eachLine {
|
|
21
|
+
// condition to detect an import instruction
|
|
22
|
+
ln -> if ( ln =~ '^import .*' ) {
|
|
23
|
+
imports << "${ln - 'import '}"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// print thmen
|
|
27
|
+
if ( ! imports.empty ) {
|
|
28
|
+
println f
|
|
29
|
+
imports.each{ println " $it" }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Coin changer demo code from http://groovy.codehaus.org */
|
|
34
|
+
|
|
35
|
+
enum UsCoin {
|
|
36
|
+
quarter(25), dime(10), nickel(5), penny(1)
|
|
37
|
+
UsCoin(v) { value = v }
|
|
38
|
+
final value
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
enum OzzieCoin {
|
|
42
|
+
fifty(50), twenty(20), ten(10), five(5)
|
|
43
|
+
OzzieCoin(v) { value = v }
|
|
44
|
+
final value
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
def plural(word, count) {
|
|
48
|
+
if (count == 1) return word
|
|
49
|
+
word[-1] == 'y' ? word[0..-2] + "ies" : word + "s"
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
def change(currency, amount) {
|
|
53
|
+
currency.values().inject([]){ list, coin ->
|
|
54
|
+
int count = amount / coin.value
|
|
55
|
+
amount = amount % coin.value
|
|
56
|
+
list += "$count ${plural(coin.toString(), count)}"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
</textarea></form>
|
|
60
|
+
|
|
61
|
+
<script>
|
|
62
|
+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
|
|
63
|
+
lineNumbers: true,
|
|
64
|
+
matchBrackets: true,
|
|
65
|
+
mode: "text/x-groovy"
|
|
66
|
+
});
|
|
67
|
+
</script>
|
|
68
|
+
|
|
69
|
+
<p><strong>MIME types defined:</strong> <code>text/x-groovy</code></p>
|
|
70
|
+
</body>
|
|
71
|
+
</html>
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
CodeMirror.defineMode("haskell", function(cmCfg, modeCfg) {
|
|
2
|
+
|
|
3
|
+
function switchState(source, setState, f) {
|
|
4
|
+
setState(f);
|
|
5
|
+
return f(source, setState);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// These should all be Unicode extended, as per the Haskell 2010 report
|
|
9
|
+
var smallRE = /[a-z_]/;
|
|
10
|
+
var largeRE = /[A-Z]/;
|
|
11
|
+
var digitRE = /[0-9]/;
|
|
12
|
+
var hexitRE = /[0-9A-Fa-f]/;
|
|
13
|
+
var octitRE = /[0-7]/;
|
|
14
|
+
var idRE = /[a-z_A-Z0-9']/;
|
|
15
|
+
var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/;
|
|
16
|
+
var specialRE = /[(),;[\]`{}]/;
|
|
17
|
+
var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer
|
|
18
|
+
|
|
19
|
+
function normal(source, setState) {
|
|
20
|
+
if (source.eatWhile(whiteCharRE)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var ch = source.next();
|
|
25
|
+
if (specialRE.test(ch)) {
|
|
26
|
+
if (ch == '{' && source.eat('-')) {
|
|
27
|
+
var t = "comment";
|
|
28
|
+
if (source.eat('#')) {
|
|
29
|
+
t = "meta";
|
|
30
|
+
}
|
|
31
|
+
return switchState(source, setState, ncomment(t, 1));
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (ch == '\'') {
|
|
37
|
+
if (source.eat('\\')) {
|
|
38
|
+
source.next(); // should handle other escapes here
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
source.next();
|
|
42
|
+
}
|
|
43
|
+
if (source.eat('\'')) {
|
|
44
|
+
return "string";
|
|
45
|
+
}
|
|
46
|
+
return "error";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (ch == '"') {
|
|
50
|
+
return switchState(source, setState, stringLiteral);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (largeRE.test(ch)) {
|
|
54
|
+
source.eatWhile(idRE);
|
|
55
|
+
if (source.eat('.')) {
|
|
56
|
+
return "qualifier";
|
|
57
|
+
}
|
|
58
|
+
return "variable-2";
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (smallRE.test(ch)) {
|
|
62
|
+
source.eatWhile(idRE);
|
|
63
|
+
return "variable";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (digitRE.test(ch)) {
|
|
67
|
+
if (ch == '0') {
|
|
68
|
+
if (source.eat(/[xX]/)) {
|
|
69
|
+
source.eatWhile(hexitRE); // should require at least 1
|
|
70
|
+
return "integer";
|
|
71
|
+
}
|
|
72
|
+
if (source.eat(/[oO]/)) {
|
|
73
|
+
source.eatWhile(octitRE); // should require at least 1
|
|
74
|
+
return "number";
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
source.eatWhile(digitRE);
|
|
78
|
+
var t = "number";
|
|
79
|
+
if (source.eat('.')) {
|
|
80
|
+
t = "number";
|
|
81
|
+
source.eatWhile(digitRE); // should require at least 1
|
|
82
|
+
}
|
|
83
|
+
if (source.eat(/[eE]/)) {
|
|
84
|
+
t = "number";
|
|
85
|
+
source.eat(/[-+]/);
|
|
86
|
+
source.eatWhile(digitRE); // should require at least 1
|
|
87
|
+
}
|
|
88
|
+
return t;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (symbolRE.test(ch)) {
|
|
92
|
+
if (ch == '-' && source.eat(/-/)) {
|
|
93
|
+
source.eatWhile(/-/);
|
|
94
|
+
if (!source.eat(symbolRE)) {
|
|
95
|
+
source.skipToEnd();
|
|
96
|
+
return "comment";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
var t = "variable";
|
|
100
|
+
if (ch == ':') {
|
|
101
|
+
t = "variable-2";
|
|
102
|
+
}
|
|
103
|
+
source.eatWhile(symbolRE);
|
|
104
|
+
return t;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return "error";
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function ncomment(type, nest) {
|
|
111
|
+
if (nest == 0) {
|
|
112
|
+
return normal;
|
|
113
|
+
}
|
|
114
|
+
return function(source, setState) {
|
|
115
|
+
var currNest = nest;
|
|
116
|
+
while (!source.eol()) {
|
|
117
|
+
var ch = source.next();
|
|
118
|
+
if (ch == '{' && source.eat('-')) {
|
|
119
|
+
++currNest;
|
|
120
|
+
}
|
|
121
|
+
else if (ch == '-' && source.eat('}')) {
|
|
122
|
+
--currNest;
|
|
123
|
+
if (currNest == 0) {
|
|
124
|
+
setState(normal);
|
|
125
|
+
return type;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
setState(ncomment(type, currNest));
|
|
130
|
+
return type;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function stringLiteral(source, setState) {
|
|
135
|
+
while (!source.eol()) {
|
|
136
|
+
var ch = source.next();
|
|
137
|
+
if (ch == '"') {
|
|
138
|
+
setState(normal);
|
|
139
|
+
return "string";
|
|
140
|
+
}
|
|
141
|
+
if (ch == '\\') {
|
|
142
|
+
if (source.eol() || source.eat(whiteCharRE)) {
|
|
143
|
+
setState(stringGap);
|
|
144
|
+
return "string";
|
|
145
|
+
}
|
|
146
|
+
if (source.eat('&')) {
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
source.next(); // should handle other escapes here
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
setState(normal);
|
|
154
|
+
return "error";
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function stringGap(source, setState) {
|
|
158
|
+
if (source.eat('\\')) {
|
|
159
|
+
return switchState(source, setState, stringLiteral);
|
|
160
|
+
}
|
|
161
|
+
source.next();
|
|
162
|
+
setState(normal);
|
|
163
|
+
return "error";
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
var wellKnownWords = (function() {
|
|
168
|
+
var wkw = {};
|
|
169
|
+
function setType(t) {
|
|
170
|
+
return function () {
|
|
171
|
+
for (var i = 0; i < arguments.length; i++)
|
|
172
|
+
wkw[arguments[i]] = t;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
setType("keyword")(
|
|
177
|
+
"case", "class", "data", "default", "deriving", "do", "else", "foreign",
|
|
178
|
+
"if", "import", "in", "infix", "infixl", "infixr", "instance", "let",
|
|
179
|
+
"module", "newtype", "of", "then", "type", "where", "_");
|
|
180
|
+
|
|
181
|
+
setType("keyword")(
|
|
182
|
+
"\.\.", ":", "::", "=", "\\", "\"", "<-", "->", "@", "~", "=>");
|
|
183
|
+
|
|
184
|
+
setType("builtin")(
|
|
185
|
+
"!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<=", "=<<",
|
|
186
|
+
"==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", "**");
|
|
187
|
+
|
|
188
|
+
setType("builtin")(
|
|
189
|
+
"Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", "Eq",
|
|
190
|
+
"False", "FilePath", "Float", "Floating", "Fractional", "Functor", "GT",
|
|
191
|
+
"IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left",
|
|
192
|
+
"Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read",
|
|
193
|
+
"ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS",
|
|
194
|
+
"String", "True");
|
|
195
|
+
|
|
196
|
+
setType("builtin")(
|
|
197
|
+
"abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf",
|
|
198
|
+
"asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling",
|
|
199
|
+
"compare", "concat", "concatMap", "const", "cos", "cosh", "curry",
|
|
200
|
+
"cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either",
|
|
201
|
+
"elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo",
|
|
202
|
+
"enumFromTo", "error", "even", "exp", "exponent", "fail", "filter",
|
|
203
|
+
"flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap",
|
|
204
|
+
"foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger",
|
|
205
|
+
"fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents",
|
|
206
|
+
"getLine", "head", "id", "init", "interact", "ioError", "isDenormalized",
|
|
207
|
+
"isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last",
|
|
208
|
+
"lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map",
|
|
209
|
+
"mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound",
|
|
210
|
+
"minimum", "mod", "negate", "not", "notElem", "null", "odd", "or",
|
|
211
|
+
"otherwise", "pi", "pred", "print", "product", "properFraction",
|
|
212
|
+
"putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile",
|
|
213
|
+
"readIO", "readList", "readLn", "readParen", "reads", "readsPrec",
|
|
214
|
+
"realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse",
|
|
215
|
+
"round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq",
|
|
216
|
+
"sequence", "sequence_", "show", "showChar", "showList", "showParen",
|
|
217
|
+
"showString", "shows", "showsPrec", "significand", "signum", "sin",
|
|
218
|
+
"sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum",
|
|
219
|
+
"tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger",
|
|
220
|
+
"toRational", "truncate", "uncurry", "undefined", "unlines", "until",
|
|
221
|
+
"unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip",
|
|
222
|
+
"zip3", "zipWith", "zipWith3");
|
|
223
|
+
|
|
224
|
+
return wkw;
|
|
225
|
+
})();
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
return {
|
|
230
|
+
startState: function () { return { f: normal }; },
|
|
231
|
+
copyState: function (s) { return { f: s.f }; },
|
|
232
|
+
|
|
233
|
+
token: function(stream, state) {
|
|
234
|
+
var t = state.f(stream, function(s) { state.f = s; });
|
|
235
|
+
var w = stream.current();
|
|
236
|
+
return (w in wellKnownWords) ? wellKnownWords[w] : t;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
CodeMirror.defineMIME("text/x-haskell", "haskell");
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CodeMirror: Haskell mode</title>
|
|
5
|
+
<link rel="stylesheet" href="../../lib/codemirror.css">
|
|
6
|
+
<script src="../../lib/codemirror.js"></script>
|
|
7
|
+
<script src="haskell.js"></script>
|
|
8
|
+
<link rel="stylesheet" href="../../theme/elegant.css">
|
|
9
|
+
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
|
|
10
|
+
<link rel="stylesheet" href="../../doc/docs.css">
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<h1>CodeMirror: Haskell mode</h1>
|
|
14
|
+
|
|
15
|
+
<form><textarea id="code" name="code">
|
|
16
|
+
module UniquePerms (
|
|
17
|
+
uniquePerms
|
|
18
|
+
)
|
|
19
|
+
where
|
|
20
|
+
|
|
21
|
+
-- | Find all unique permutations of a list where there might be duplicates.
|
|
22
|
+
uniquePerms :: (Eq a) => [a] -> [[a]]
|
|
23
|
+
uniquePerms = permBag . makeBag
|
|
24
|
+
|
|
25
|
+
-- | An unordered collection where duplicate values are allowed,
|
|
26
|
+
-- but represented with a single value and a count.
|
|
27
|
+
type Bag a = [(a, Int)]
|
|
28
|
+
|
|
29
|
+
makeBag :: (Eq a) => [a] -> Bag a
|
|
30
|
+
makeBag [] = []
|
|
31
|
+
makeBag (a:as) = mix a $ makeBag as
|
|
32
|
+
where
|
|
33
|
+
mix a [] = [(a,1)]
|
|
34
|
+
mix a (bn@(b,n):bs) | a == b = (b,n+1):bs
|
|
35
|
+
| otherwise = bn : mix a bs
|
|
36
|
+
|
|
37
|
+
permBag :: Bag a -> [[a]]
|
|
38
|
+
permBag [] = [[]]
|
|
39
|
+
permBag bs = concatMap (\(f,cs) -> map (f:) $ permBag cs) . oneOfEach $ bs
|
|
40
|
+
where
|
|
41
|
+
oneOfEach [] = []
|
|
42
|
+
oneOfEach (an@(a,n):bs) =
|
|
43
|
+
let bs' = if n == 1 then bs else (a,n-1):bs
|
|
44
|
+
in (a,bs') : mapSnd (an:) (oneOfEach bs)
|
|
45
|
+
|
|
46
|
+
apSnd f (a,b) = (a, f b)
|
|
47
|
+
mapSnd = map . apSnd
|
|
48
|
+
</textarea></form>
|
|
49
|
+
|
|
50
|
+
<script>
|
|
51
|
+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
|
|
52
|
+
lineNumbers: true,
|
|
53
|
+
matchBrackets: true,
|
|
54
|
+
theme: "elegant"
|
|
55
|
+
});
|
|
56
|
+
</script>
|
|
57
|
+
|
|
58
|
+
<p><strong>MIME types defined:</strong> <code>text/x-haskell</code>.</p>
|
|
59
|
+
</body>
|
|
60
|
+
</html>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
CodeMirror.defineMode("htmlembedded", function(config, parserConfig) {
|
|
2
|
+
|
|
3
|
+
//config settings
|
|
4
|
+
var scriptStartRegex = parserConfig.scriptStartRegex || /^<%/i,
|
|
5
|
+
scriptEndRegex = parserConfig.scriptEndRegex || /^%>/i;
|
|
6
|
+
|
|
7
|
+
//inner modes
|
|
8
|
+
var scriptingMode, htmlMixedMode;
|
|
9
|
+
|
|
10
|
+
//tokenizer when in html mode
|
|
11
|
+
function htmlDispatch(stream, state) {
|
|
12
|
+
if (stream.match(scriptStartRegex, false)) {
|
|
13
|
+
state.token=scriptingDispatch;
|
|
14
|
+
return scriptingMode.token(stream, state.scriptState);
|
|
15
|
+
}
|
|
16
|
+
else
|
|
17
|
+
return htmlMixedMode.token(stream, state.htmlState);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//tokenizer when in scripting mode
|
|
21
|
+
function scriptingDispatch(stream, state) {
|
|
22
|
+
if (stream.match(scriptEndRegex, false)) {
|
|
23
|
+
state.token=htmlDispatch;
|
|
24
|
+
return htmlMixedMode.token(stream, state.htmlState);
|
|
25
|
+
}
|
|
26
|
+
else
|
|
27
|
+
return scriptingMode.token(stream, state.scriptState);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
startState: function() {
|
|
33
|
+
scriptingMode = scriptingMode || CodeMirror.getMode(config, parserConfig.scriptingModeSpec);
|
|
34
|
+
htmlMixedMode = htmlMixedMode || CodeMirror.getMode(config, "htmlmixed");
|
|
35
|
+
return {
|
|
36
|
+
token : parserConfig.startOpen ? scriptingDispatch : htmlDispatch,
|
|
37
|
+
htmlState : htmlMixedMode.startState(),
|
|
38
|
+
scriptState : scriptingMode.startState()
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
token: function(stream, state) {
|
|
43
|
+
return state.token(stream, state);
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
indent: function(state, textAfter) {
|
|
47
|
+
if (state.token == htmlDispatch)
|
|
48
|
+
return htmlMixedMode.indent(state.htmlState, textAfter);
|
|
49
|
+
else
|
|
50
|
+
return scriptingMode.indent(state.scriptState, textAfter);
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
copyState: function(state) {
|
|
54
|
+
return {
|
|
55
|
+
token : state.token,
|
|
56
|
+
htmlState : CodeMirror.copyState(htmlMixedMode, state.htmlState),
|
|
57
|
+
scriptState : CodeMirror.copyState(scriptingMode, state.scriptState)
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
electricChars: "/{}:"
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
CodeMirror.defineMIME("application/x-ejs", { name: "htmlembedded", scriptingModeSpec:"javascript"});
|
|
67
|
+
CodeMirror.defineMIME("application/x-aspx", { name: "htmlembedded", scriptingModeSpec:"text/x-csharp"});
|
|
68
|
+
CodeMirror.defineMIME("application/x-jsp", { name: "htmlembedded", scriptingModeSpec:"text/x-java"});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CodeMirror: Html Embedded Scripts mode</title>
|
|
5
|
+
<link rel="stylesheet" href="../../lib/codemirror.css">
|
|
6
|
+
<script src="../../lib/codemirror.js"></script>
|
|
7
|
+
<script src="../xml/xml.js"></script>
|
|
8
|
+
<script src="../javascript/javascript.js"></script>
|
|
9
|
+
<script src="../css/css.js"></script>
|
|
10
|
+
<script src="../htmlmixed/htmlmixed.js"></script>
|
|
11
|
+
<script src="htmlembedded.js"></script>
|
|
12
|
+
<style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
|
|
13
|
+
<link rel="stylesheet" href="../../doc/docs.css">
|
|
14
|
+
</head>
|
|
15
|
+
<body>
|
|
16
|
+
<h1>CodeMirror: Html Embedded Scripts mode</h1>
|
|
17
|
+
|
|
18
|
+
<form><textarea id="code" name="code">
|
|
19
|
+
<%
|
|
20
|
+
function hello(who) {
|
|
21
|
+
return "Hello " + who;
|
|
22
|
+
}
|
|
23
|
+
%>
|
|
24
|
+
This is an example of EJS (embedded javascript)
|
|
25
|
+
<p>The program says <%= hello("world") %>.</p>
|
|
26
|
+
<script>
|
|
27
|
+
alert("And here is some normal JS code"); // also colored
|
|
28
|
+
</script>
|
|
29
|
+
</textarea></form>
|
|
30
|
+
|
|
31
|
+
<script>
|
|
32
|
+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
|
|
33
|
+
lineNumbers: true,
|
|
34
|
+
matchBrackets: true,
|
|
35
|
+
mode: "application/x-ejs",
|
|
36
|
+
indentUnit: 4,
|
|
37
|
+
indentWithTabs: true,
|
|
38
|
+
enterMode: "keep",
|
|
39
|
+
tabMode: "shift"
|
|
40
|
+
});
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<p>Mode for html embedded scripts like JSP and ASP.NET. Depends on HtmlMixed which in turn depends on
|
|
44
|
+
JavaScript, CSS and XML.<br />Other dependancies include those of the scriping language chosen.</p>
|
|
45
|
+
|
|
46
|
+
<p><strong>MIME types defined:</strong> <code>application/x-aspx</code> (ASP.NET),
|
|
47
|
+
<code>application/x-ejs</code> (Embedded Javascript), <code>application/x-jsp</code> (JavaServer Pages)</p>
|
|
48
|
+
</body>
|
|
49
|
+
</html>
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
|
|
2
|
+
var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
|
|
3
|
+
var jsMode = CodeMirror.getMode(config, "javascript");
|
|
4
|
+
var cssMode = CodeMirror.getMode(config, "css");
|
|
5
|
+
|
|
6
|
+
function html(stream, state) {
|
|
7
|
+
var style = htmlMode.token(stream, state.htmlState);
|
|
8
|
+
if (style == "tag" && stream.current() == ">" && state.htmlState.context) {
|
|
9
|
+
if (/^script$/i.test(state.htmlState.context.tagName)) {
|
|
10
|
+
state.token = javascript;
|
|
11
|
+
state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
|
|
12
|
+
state.mode = "javascript";
|
|
13
|
+
}
|
|
14
|
+
else if (/^style$/i.test(state.htmlState.context.tagName)) {
|
|
15
|
+
state.token = css;
|
|
16
|
+
state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
|
|
17
|
+
state.mode = "css";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return style;
|
|
21
|
+
}
|
|
22
|
+
function maybeBackup(stream, pat, style) {
|
|
23
|
+
var cur = stream.current();
|
|
24
|
+
var close = cur.search(pat);
|
|
25
|
+
if (close > -1) stream.backUp(cur.length - close);
|
|
26
|
+
return style;
|
|
27
|
+
}
|
|
28
|
+
function javascript(stream, state) {
|
|
29
|
+
if (stream.match(/^<\/\s*script\s*>/i, false)) {
|
|
30
|
+
state.token = html;
|
|
31
|
+
state.curState = null;
|
|
32
|
+
state.mode = "html";
|
|
33
|
+
return html(stream, state);
|
|
34
|
+
}
|
|
35
|
+
return maybeBackup(stream, /<\/\s*script\s*>/,
|
|
36
|
+
jsMode.token(stream, state.localState));
|
|
37
|
+
}
|
|
38
|
+
function css(stream, state) {
|
|
39
|
+
if (stream.match(/^<\/\s*style\s*>/i, false)) {
|
|
40
|
+
state.token = html;
|
|
41
|
+
state.localState = null;
|
|
42
|
+
state.mode = "html";
|
|
43
|
+
return html(stream, state);
|
|
44
|
+
}
|
|
45
|
+
return maybeBackup(stream, /<\/\s*style\s*>/,
|
|
46
|
+
cssMode.token(stream, state.localState));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
startState: function() {
|
|
51
|
+
var state = htmlMode.startState();
|
|
52
|
+
return {token: html, localState: null, mode: "html", htmlState: state};
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
copyState: function(state) {
|
|
56
|
+
if (state.localState)
|
|
57
|
+
var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
|
|
58
|
+
return {token: state.token, localState: local, mode: state.mode,
|
|
59
|
+
htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
token: function(stream, state) {
|
|
63
|
+
return state.token(stream, state);
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
indent: function(state, textAfter) {
|
|
67
|
+
if (state.token == html || /^\s*<\//.test(textAfter))
|
|
68
|
+
return htmlMode.indent(state.htmlState, textAfter);
|
|
69
|
+
else if (state.token == javascript)
|
|
70
|
+
return jsMode.indent(state.localState, textAfter);
|
|
71
|
+
else
|
|
72
|
+
return cssMode.indent(state.localState, textAfter);
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
compareStates: function(a, b) {
|
|
76
|
+
return htmlMode.compareStates(a.htmlState, b.htmlState);
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
electricChars: "/{}:"
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
CodeMirror.defineMIME("text/html", "htmlmixed");
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>CodeMirror: HTML mixed mode</title>
|
|
5
|
+
<link rel="stylesheet" href="../../lib/codemirror.css">
|
|
6
|
+
<script src="../../lib/codemirror.js"></script>
|
|
7
|
+
<script src="../xml/xml.js"></script>
|
|
8
|
+
<script src="../javascript/javascript.js"></script>
|
|
9
|
+
<script src="../css/css.js"></script>
|
|
10
|
+
<script src="htmlmixed.js"></script>
|
|
11
|
+
<link rel="stylesheet" href="../../doc/docs.css">
|
|
12
|
+
<style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<h1>CodeMirror: HTML mixed mode</h1>
|
|
16
|
+
<form><textarea id="code" name="code">
|
|
17
|
+
<html style="color: green">
|
|
18
|
+
<!-- this is a comment -->
|
|
19
|
+
<head>
|
|
20
|
+
<title>Mixed HTML Example</title>
|
|
21
|
+
<style type="text/css">
|
|
22
|
+
h1 {font-family: comic sans; color: #f0f;}
|
|
23
|
+
div {background: yellow !important;}
|
|
24
|
+
body {
|
|
25
|
+
max-width: 50em;
|
|
26
|
+
margin: 1em 2em 1em 5em;
|
|
27
|
+
}
|
|
28
|
+
</style>
|
|
29
|
+
</head>
|
|
30
|
+
<body>
|
|
31
|
+
<h1>Mixed HTML Example</h1>
|
|
32
|
+
<script>
|
|
33
|
+
function jsFunc(arg1, arg2) {
|
|
34
|
+
if (arg1 && arg2) document.body.innerHTML = "achoo";
|
|
35
|
+
}
|
|
36
|
+
</script>
|
|
37
|
+
</body>
|
|
38
|
+
</html>
|
|
39
|
+
</textarea></form>
|
|
40
|
+
<script>
|
|
41
|
+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "text/html", tabMode: "indent"});
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<p>The HTML mixed mode depends on the XML, JavaScript, and CSS modes.</p>
|
|
45
|
+
|
|
46
|
+
<p><strong>MIME types defined:</strong> <code>text/html</code>
|
|
47
|
+
(redefined, only takes effect if you load this parser after the
|
|
48
|
+
XML parser).</p>
|
|
49
|
+
|
|
50
|
+
</body>
|
|
51
|
+
</html>
|