|
@@ -0,0 +1,136 @@
|
|
|
+YUI.add('ui-code-editor', function (Y) {
|
|
|
+
|
|
|
+ CodeMirror.defineMode("oberon07", function () {
|
|
|
+ function words(str) {
|
|
|
+ var obj = {}, words = str.split(" ");
|
|
|
+
|
|
|
+ for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
|
|
|
+ return obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ var keywords = words("ARRAY IMPORT THEN BEGIN IN TO BY IS TRUE CASE MOD TYPE " +
|
|
|
+ "CONST MODULE UNTIL DIV NIL VAR DO OF WHILE ELSE OR " +
|
|
|
+ "ELSIF POINTER END PROCEDURE FALSE RECORD FOR REPEAT IF RETURN");
|
|
|
+
|
|
|
+ var atoms = {'null': true};
|
|
|
+
|
|
|
+ var isOperatorChar = /[+\-*&%=<>^~#!?\|\/]/;
|
|
|
+
|
|
|
+ function tokenBase(stream, state) {
|
|
|
+ var ch = stream.next();
|
|
|
+
|
|
|
+ if (ch == "#" && state.startOfLine) {
|
|
|
+ stream.skipToEnd();
|
|
|
+ return "meta";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ch == '"' || ch == "'") {
|
|
|
+ state.tokenize = tokenString(ch);
|
|
|
+ return state.tokenize(stream, state);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ch == "(" && stream.eat("*")) {
|
|
|
+ state.tokenize = tokenComment;
|
|
|
+ return tokenComment(stream, state);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (/\d/.test(ch)) {
|
|
|
+ stream.eatWhile(/[\w\.]/);
|
|
|
+ return "number";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ch == "/") {
|
|
|
+ if (stream.eat("/")) {
|
|
|
+ stream.skipToEnd();
|
|
|
+ return "comment";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isOperatorChar.test(ch)) {
|
|
|
+ stream.eatWhile(isOperatorChar);
|
|
|
+ return "operator";
|
|
|
+ }
|
|
|
+
|
|
|
+ stream.eatWhile(/[\w\$_]/);
|
|
|
+
|
|
|
+ var cur = stream.current();
|
|
|
+
|
|
|
+ if (keywords.propertyIsEnumerable(cur)) return "keyword";
|
|
|
+ if (atoms.propertyIsEnumerable(cur)) return "atom";
|
|
|
+ return "variable";
|
|
|
+ }
|
|
|
+
|
|
|
+ function tokenString(quote) {
|
|
|
+ return function(stream, state) {
|
|
|
+ var escaped = false, next, end = false;
|
|
|
+
|
|
|
+ while ((next = stream.next()) != null) {
|
|
|
+ if (next == quote && !escaped) {end = true; break;}
|
|
|
+ escaped = !escaped && next == "\\";
|
|
|
+ }
|
|
|
+
|
|
|
+ if (end || !escaped) state.tokenize = null;
|
|
|
+ return "string";
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ function tokenComment(stream, state) {
|
|
|
+ var maybeEnd = false, ch;
|
|
|
+
|
|
|
+ while (ch = stream.next()) {
|
|
|
+ if (ch == ")" && maybeEnd) {
|
|
|
+ state.tokenize = null;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ maybeEnd = (ch == "*");
|
|
|
+ }
|
|
|
+ return "comment";
|
|
|
+ }
|
|
|
+
|
|
|
+ // Interface
|
|
|
+
|
|
|
+ return {
|
|
|
+ startState: function() {
|
|
|
+ return {tokenize: null};
|
|
|
+ },
|
|
|
+
|
|
|
+ token: function(stream, state) {
|
|
|
+ if (stream.eatSpace()) return null;
|
|
|
+
|
|
|
+ var style = (state.tokenize || tokenBase)(stream, state);
|
|
|
+
|
|
|
+ if (style == "comment" || style == "meta") return style;
|
|
|
+
|
|
|
+ return style;
|
|
|
+ },
|
|
|
+
|
|
|
+ electricChars: "{}"
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ CodeMirror.defineMIME("text/x-oberon07", "oberon07");
|
|
|
+
|
|
|
+ /** Wrapper for CodeMirror Editor */
|
|
|
+ Y.namespace('UI.Code').Editor = Y.Base.create('editorCodeUI', Y.View, {
|
|
|
+ render: function (srcNode) {
|
|
|
+ var editor,
|
|
|
+ node = srcNode instanceof Y.Node ? srcNode : Y.one(srcNode);
|
|
|
+
|
|
|
+ if (node) {
|
|
|
+ editor = CodeMirror.fromTextArea(node._node, {
|
|
|
+ lineNumbers: true,
|
|
|
+ mode: 'text/x-oberon07'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, {});
|
|
|
+
|
|
|
+}, '1.0', {
|
|
|
+ requires: [
|
|
|
+ 'view'
|
|
|
+ ]
|
|
|
+});
|