summaryrefslogtreecommitdiff
path: root/public/vendor/codemirror/mode/smalltalk
diff options
context:
space:
mode:
Diffstat (limited to 'public/vendor/codemirror/mode/smalltalk')
-rwxr-xr-xpublic/vendor/codemirror/mode/smalltalk/index.html68
-rwxr-xr-xpublic/vendor/codemirror/mode/smalltalk/smalltalk.js168
2 files changed, 236 insertions, 0 deletions
diff --git a/public/vendor/codemirror/mode/smalltalk/index.html b/public/vendor/codemirror/mode/smalltalk/index.html
new file mode 100755
index 00000000..2155ebc2
--- /dev/null
+++ b/public/vendor/codemirror/mode/smalltalk/index.html
@@ -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"><h1>CodeMirror</h1><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/codemirror/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 &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>
+ </article>
diff --git a/public/vendor/codemirror/mode/smalltalk/smalltalk.js b/public/vendor/codemirror/mode/smalltalk/smalltalk.js
new file mode 100755
index 00000000..bb510ba2
--- /dev/null
+++ b/public/vendor/codemirror/mode/smalltalk/smalltalk.js
@@ -0,0 +1,168 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: http://codemirror.net/LICENSE
+
+(function(mod) {
+ if (typeof exports == "object" && typeof module == "object") // CommonJS
+ mod(require("../../lib/codemirror"));
+ else if (typeof define == "function" && define.amd) // AMD
+ define(["../../lib/codemirror"], mod);
+ else // Plain browser env
+ mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+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(/[^\s.{}\[\]()]/))
+ token.name = 'string-2';
+ else
+ token.name = 'meta';
+ }
+
+ } else if (aChar === '$') {
+ if (stream.next() === '<') {
+ stream.eatWhile(/[^\s>]/);
+ 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'});
+
+});