: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE
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
})(function(CodeMirror) {
CodeMirror.defineMode('smalltalk', function(config) {
var specialChars = /[+\-\/\\*~<>=@%|&?!.,:;^]/;
var keywords = /true|false|nil|self|super|thisContext/;
var Context = function(tokenizer, parent) {
var Token = function(name, context, eos) {
this.context = new Context(next, null);
this.expectVariable = true;
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();
token = nextComment(stream, new Context(nextComment, context));
} else if (aChar === '\'') {
token = nextString(stream, new Context(nextString, context));
} else if (aChar === '#') {
if (stream.peek() === '\'') {
token = nextSymbol(stream, new Context(nextSymbol, context));
if (stream.eatWhile(/[^\s.{}\[\]()]/))
} else if (aChar === '$') {
if (stream.next() === '<') {
stream.eatWhile(/[^\s>]/);
} else if (aChar === '|' && state.expectVariable) {
token.context = new Context(nextTemporaries, context);
} else if (/[\[\]{}()]/.test(aChar)) {
token.eos = /[\[{(]/.test(aChar);
} else if (aChar === ']') {
state.indentation = Math.max(0, state.indentation - 1);
} else if (specialChars.test(aChar)) {
stream.eatWhile(specialChars);
token.eos = aChar !== ';'; // ; cascaded message expression
} else if (/\d/.test(aChar)) {
stream.eatWhile(/[\w\d]/);
} else if (/[\w_]/.test(aChar)) {
stream.eatWhile(/[\w\d_]/);
token.name = state.expectVariable ? (keywords.test(stream.current()) ? 'keyword' : 'variable') : null;
token.eos = state.expectVariable;
var nextComment = function(stream, context) {
return new Token('comment', stream.eat('"') ? context.parent : context, true);
var nextString = function(stream, context) {
return new Token('string', stream.eat('\'') ? context.parent : context, false);
var nextSymbol = function(stream, context) {
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();
token.context = context.parent;
token: function(stream, state) {
state.userIndent(stream.indentation());
var token = state.context.next(stream, state.context, state);
state.context = token.context;
state.expectVariable = token.eos;
blankLine: function(state) {
indent: function(state, textAfter) {
var i = state.context.next === next && textAfter && textAfter.charAt(0) === ']' ? -1 : state.userIndentationDelta;
return (state.indentation + i) * config.indentUnit;
CodeMirror.defineMIME('text/x-stsrc', {name: 'smalltalk'});