first commit

This commit is contained in:
2026-02-07 09:46:32 +08:00
commit 5fcd5dc646
443 changed files with 89466 additions and 0 deletions

57
codemirror/mode/smalltalk/index.html vendored Normal file
View File

@@ -0,0 +1,57 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: Smalltalk mode</title>
<link rel="stylesheet" href="../../lib/codemirror.css">
<script src="../../lib/codemirror.js"></script>
<script src="../../lib/util/matchbrackets.js"></script>
<script src="smalltalk.js"></script>
<link rel="stylesheet" href="../../doc/docs.css">
<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>
</head>
<body>
<h1>CodeMirror: Smalltalk mode</h1>
<form><textarea id="code" name="code">
"
This is a test of the Smalltalk code
"
Seaside.WAComponent subclass: #MyCounter [
| count |
MyCounter class &gt;&gt; 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>
</body>
</html>

139
codemirror/mode/smalltalk/smalltalk.js vendored Normal file
View File

@@ -0,0 +1,139 @@
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 === '#') {
stream.eatWhile(/[^ .]/);
token.name = 'string-2';
} else if (aChar === '$') {
stream.eatWhile(/[^ ]/);
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 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;
state.lastToken = token;
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'});