init
This commit is contained in:
68
public/tinymce/plugins/codemirror/CodeMirror/mode/smalltalk/index.html
vendored
Normal file
68
public/tinymce/plugins/codemirror/CodeMirror/mode/smalltalk/index.html
vendored
Normal file
@ -0,0 +1,68 @@
|
||||
<!doctype html>
|
||||
|
||||
<title>CodeMirror: Smalltalk mode</title>
|
||||
<meta charset="utf-8"/>
|
||||
<link rel=stylesheet href="../../doc/docs.css">
|
||||
|
||||
<link rel="stylesheet" href="../../lib/codemirror.css">
|
||||
<script src="../../lib/codemirror.js"></script>
|
||||
<script src="../../addon/edit/matchbrackets.js"></script>
|
||||
<script src="smalltalk.js"></script>
|
||||
<style>
|
||||
.CodeMirror {border: 2px solid #dee; border-right-width: 10px;}
|
||||
.CodeMirror-gutter {border: none; background: #dee;}
|
||||
.CodeMirror-gutter pre {color: white; font-weight: bold;}
|
||||
</style>
|
||||
<div id=nav>
|
||||
<a href="http://codemirror.net"><img id=logo src="../../doc/logo.png"></a>
|
||||
|
||||
<ul>
|
||||
<li><a href="../../index.html">Home</a>
|
||||
<li><a href="../../doc/manual.html">Manual</a>
|
||||
<li><a href="https://github.com/marijnh/codemirror">Code</a>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a href="../index.html">Language modes</a>
|
||||
<li><a class=active href="#">Smalltalk</a>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<article>
|
||||
<h2>Smalltalk mode</h2>
|
||||
<form><textarea id="code" name="code">
|
||||
"
|
||||
This is a test of the Smalltalk code
|
||||
"
|
||||
Seaside.WAComponent subclass: #MyCounter [
|
||||
| count |
|
||||
MyCounter class >> canBeRoot [ ^true ]
|
||||
|
||||
initialize [
|
||||
super initialize.
|
||||
count := 0.
|
||||
]
|
||||
states [ ^{ self } ]
|
||||
renderContentOn: html [
|
||||
html heading: count.
|
||||
html anchor callback: [ count := count + 1 ]; with: '++'.
|
||||
html space.
|
||||
html anchor callback: [ count := count - 1 ]; with: '--'.
|
||||
]
|
||||
]
|
||||
|
||||
MyCounter registerAsApplication: 'mycounter'
|
||||
</textarea></form>
|
||||
|
||||
<script>
|
||||
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
|
||||
lineNumbers: true,
|
||||
matchBrackets: true,
|
||||
mode: "text/x-stsrc",
|
||||
indentUnit: 4
|
||||
});
|
||||
</script>
|
||||
|
||||
<p>Simple Smalltalk mode.</p>
|
||||
|
||||
<p><strong>MIME types defined:</strong> <code>text/x-stsrc</code>.</p>
|
||||
</article>
|
153
public/tinymce/plugins/codemirror/CodeMirror/mode/smalltalk/smalltalk.js
vendored
Normal file
153
public/tinymce/plugins/codemirror/CodeMirror/mode/smalltalk/smalltalk.js
vendored
Normal file
@ -0,0 +1,153 @@
|
||||
CodeMirror.defineMode('smalltalk', function(config) {
|
||||
|
||||
var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/;
|
||||
var keywords = /true|false|nil|self|super|thisContext/;
|
||||
|
||||
var Context = function(tokenizer, parent) {
|
||||
this.next = tokenizer;
|
||||
this.parent = parent;
|
||||
};
|
||||
|
||||
var Token = function(name, context, eos) {
|
||||
this.name = name;
|
||||
this.context = context;
|
||||
this.eos = eos;
|
||||
};
|
||||
|
||||
var State = function() {
|
||||
this.context = new Context(next, null);
|
||||
this.expectVariable = true;
|
||||
this.indentation = 0;
|
||||
this.userIndentationDelta = 0;
|
||||
};
|
||||
|
||||
State.prototype.userIndent = function(indentation) {
|
||||
this.userIndentationDelta = indentation > 0 ? (indentation / config.indentUnit - this.indentation) : 0;
|
||||
};
|
||||
|
||||
var next = function(stream, context, state) {
|
||||
var token = new Token(null, context, false);
|
||||
var aChar = stream.next();
|
||||
|
||||
if (aChar === '"') {
|
||||
token = nextComment(stream, new Context(nextComment, context));
|
||||
|
||||
} else if (aChar === '\'') {
|
||||
token = nextString(stream, new Context(nextString, context));
|
||||
|
||||
} else if (aChar === '#') {
|
||||
if (stream.peek() === '\'') {
|
||||
stream.next();
|
||||
token = nextSymbol(stream, new Context(nextSymbol, context));
|
||||
} else {
|
||||
if (stream.eatWhile(/[^ .{}\[\]()]/))
|
||||
token.name = 'string-2';
|
||||
else
|
||||
token.name = 'meta';
|
||||
}
|
||||
|
||||
} else if (aChar === '$') {
|
||||
if (stream.next() === '<') {
|
||||
stream.eatWhile(/[^ >]/);
|
||||
stream.next();
|
||||
}
|
||||
token.name = 'string-2';
|
||||
|
||||
} else if (aChar === '|' && state.expectVariable) {
|
||||
token.context = new Context(nextTemporaries, context);
|
||||
|
||||
} else if (/[\[\]{}()]/.test(aChar)) {
|
||||
token.name = 'bracket';
|
||||
token.eos = /[\[{(]/.test(aChar);
|
||||
|
||||
if (aChar === '[') {
|
||||
state.indentation++;
|
||||
} else if (aChar === ']') {
|
||||
state.indentation = Math.max(0, state.indentation - 1);
|
||||
}
|
||||
|
||||
} else if (specialChars.test(aChar)) {
|
||||
stream.eatWhile(specialChars);
|
||||
token.name = 'operator';
|
||||
token.eos = aChar !== ';'; // ; cascaded message expression
|
||||
|
||||
} else if (/\d/.test(aChar)) {
|
||||
stream.eatWhile(/[\w\d]/);
|
||||
token.name = 'number';
|
||||
|
||||
} else if (/[\w_]/.test(aChar)) {
|
||||
stream.eatWhile(/[\w\d_]/);
|
||||
token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;
|
||||
|
||||
} else {
|
||||
token.eos = state.expectVariable;
|
||||
}
|
||||
|
||||
return token;
|
||||
};
|
||||
|
||||
var nextComment = function(stream, context) {
|
||||
stream.eatWhile(/[^"]/);
|
||||
return new Token('comment', stream.eat('"') ? context.parent : context, true);
|
||||
};
|
||||
|
||||
var nextString = function(stream, context) {
|
||||
stream.eatWhile(/[^']/);
|
||||
return new Token('string', stream.eat('\'') ? context.parent : context, false);
|
||||
};
|
||||
|
||||
var nextSymbol = function(stream, context) {
|
||||
stream.eatWhile(/[^']/);
|
||||
return new Token('string-2', stream.eat('\'') ? context.parent : context, false);
|
||||
};
|
||||
|
||||
var nextTemporaries = function(stream, context) {
|
||||
var token = new Token(null, context, false);
|
||||
var aChar = stream.next();
|
||||
|
||||
if (aChar === '|') {
|
||||
token.context = context.parent;
|
||||
token.eos = true;
|
||||
|
||||
} else {
|
||||
stream.eatWhile(/[^|]/);
|
||||
token.name = 'variable';
|
||||
}
|
||||
|
||||
return token;
|
||||
};
|
||||
|
||||
return {
|
||||
startState: function() {
|
||||
return new State;
|
||||
},
|
||||
|
||||
token: function(stream, state) {
|
||||
state.userIndent(stream.indentation());
|
||||
|
||||
if (stream.eatSpace()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var token = state.context.next(stream, state.context, state);
|
||||
state.context = token.context;
|
||||
state.expectVariable = token.eos;
|
||||
|
||||
return token.name;
|
||||
},
|
||||
|
||||
blankLine: function(state) {
|
||||
state.userIndent(0);
|
||||
},
|
||||
|
||||
indent: function(state, textAfter) {
|
||||
var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta;
|
||||
return (state.indentation + i) * config.indentUnit;
|
||||
},
|
||||
|
||||
electricChars: ']'
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'});
|
Reference in New Issue
Block a user