75 lines
2.6 KiB
HTML
Executable File
75 lines
2.6 KiB
HTML
Executable File
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<title>CodeMirror 2</title>
|
|
<link rel="stylesheet" href="lib/codemirror.css">
|
|
<script src="lib/codemirror.js"></script>
|
|
<script src="mode/javascript/javascript.js"></script>
|
|
<link rel="stylesheet" href="mode/javascript/javascript.css">
|
|
</head>
|
|
<body>
|
|
<h1>CodeMirror 2</h1>
|
|
<p>This is a new project, aiming to create a CodeMirror-style
|
|
component without using an IFRAME.
|
|
The <a href="http://ajaxorg.github.com/ace/">ACE</a> editor proved
|
|
that this is viable, which motivated me to give it a shot. (Though I took a somewhat different
|
|
approach.)</p>
|
|
<p>No IE support so far, only tested with recent Chrome, Opera,
|
|
and Firefox builds. The JavaScript parser is the only one I've
|
|
ported over.</p>
|
|
<p>Code at <a href="https://github.com/marijnh/codemirror2">https://github.com/marijnh/codemirror2</a>.</p>
|
|
<form><textarea id="code" style="display: none" name="code">
|
|
// Demo code (the actual new parser character stream implementation)
|
|
|
|
function StringStream(string) {
|
|
this.pos = 0;
|
|
this.string = string;
|
|
}
|
|
|
|
StringStream.prototype = {
|
|
done: function() {return this.pos >= this.string.length;},
|
|
peek: function() {return this.string.charAt(this.pos);},
|
|
next: function() {
|
|
if (this.pos < this.string.length)
|
|
return this.string.charAt(this.pos++);
|
|
},
|
|
eat: function(match) {
|
|
var ch = this.string.charAt(this.pos);
|
|
if (typeof match == "string") var ok = ch == match;
|
|
else var ok = ch && match.test ? match.test(ch) : match(ch);
|
|
if (ok) {this.pos++; return ch;}
|
|
},
|
|
eatWhile: function(match) {
|
|
var start = this.pos;
|
|
while (this.eat(match));
|
|
if (this.pos > start) return this.string.slice(start, this.pos);
|
|
},
|
|
backUp: function(n) {this.pos -= n;},
|
|
column: function() {return this.pos;},
|
|
eatSpace: function() {
|
|
var start = this.pos;
|
|
while (/\s/.test(this.string.charAt(this.pos))) this.pos++;
|
|
return this.pos - start;
|
|
},
|
|
match: function(pattern, consume, caseInsensitive) {
|
|
if (typeof pattern == "string") {
|
|
function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
|
|
if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
|
|
if (consume !== false) this.pos += str.length;
|
|
return true;
|
|
}
|
|
}
|
|
else {
|
|
var match = this.string.slice(this.pos).match(pattern);
|
|
if (match && consume !== false) this.pos += match[0].length;
|
|
return match;
|
|
}
|
|
}
|
|
};
|
|
</textarea></form>
|
|
<script>
|
|
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
|
|
</script>
|
|
</body>
|
|
</html>
|