mirror of https://github.com/gogits/gogs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
4.6 KiB
174 lines
4.6 KiB
// 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("apl", function() { |
|
var builtInOps = { |
|
".": "innerProduct", |
|
"\\": "scan", |
|
"/": "reduce", |
|
"⌿": "reduce1Axis", |
|
"⍀": "scan1Axis", |
|
"¨": "each", |
|
"⍣": "power" |
|
}; |
|
var builtInFuncs = { |
|
"+": ["conjugate", "add"], |
|
"−": ["negate", "subtract"], |
|
"×": ["signOf", "multiply"], |
|
"÷": ["reciprocal", "divide"], |
|
"⌈": ["ceiling", "greaterOf"], |
|
"⌊": ["floor", "lesserOf"], |
|
"∣": ["absolute", "residue"], |
|
"⍳": ["indexGenerate", "indexOf"], |
|
"?": ["roll", "deal"], |
|
"⋆": ["exponentiate", "toThePowerOf"], |
|
"⍟": ["naturalLog", "logToTheBase"], |
|
"○": ["piTimes", "circularFuncs"], |
|
"!": ["factorial", "binomial"], |
|
"⌹": ["matrixInverse", "matrixDivide"], |
|
"<": [null, "lessThan"], |
|
"≤": [null, "lessThanOrEqual"], |
|
"=": [null, "equals"], |
|
">": [null, "greaterThan"], |
|
"≥": [null, "greaterThanOrEqual"], |
|
"≠": [null, "notEqual"], |
|
"≡": ["depth", "match"], |
|
"≢": [null, "notMatch"], |
|
"∈": ["enlist", "membership"], |
|
"⍷": [null, "find"], |
|
"∪": ["unique", "union"], |
|
"∩": [null, "intersection"], |
|
"∼": ["not", "without"], |
|
"∨": [null, "or"], |
|
"∧": [null, "and"], |
|
"⍱": [null, "nor"], |
|
"⍲": [null, "nand"], |
|
"⍴": ["shapeOf", "reshape"], |
|
",": ["ravel", "catenate"], |
|
"⍪": [null, "firstAxisCatenate"], |
|
"⌽": ["reverse", "rotate"], |
|
"⊖": ["axis1Reverse", "axis1Rotate"], |
|
"⍉": ["transpose", null], |
|
"↑": ["first", "take"], |
|
"↓": [null, "drop"], |
|
"⊂": ["enclose", "partitionWithAxis"], |
|
"⊃": ["diclose", "pick"], |
|
"⌷": [null, "index"], |
|
"⍋": ["gradeUp", null], |
|
"⍒": ["gradeDown", null], |
|
"⊤": ["encode", null], |
|
"⊥": ["decode", null], |
|
"⍕": ["format", "formatByExample"], |
|
"⍎": ["execute", null], |
|
"⊣": ["stop", "left"], |
|
"⊢": ["pass", "right"] |
|
}; |
|
|
|
var isOperator = /[\.\/⌿⍀¨⍣]/; |
|
var isNiladic = /⍬/; |
|
var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/; |
|
var isArrow = /←/; |
|
var isComment = /[⍝#].*$/; |
|
|
|
var stringEater = function(type) { |
|
var prev; |
|
prev = false; |
|
return function(c) { |
|
prev = c; |
|
if (c === type) { |
|
return prev === "\\"; |
|
} |
|
return true; |
|
}; |
|
}; |
|
return { |
|
startState: function() { |
|
return { |
|
prev: false, |
|
func: false, |
|
op: false, |
|
string: false, |
|
escape: false |
|
}; |
|
}, |
|
token: function(stream, state) { |
|
var ch, funcName; |
|
if (stream.eatSpace()) { |
|
return null; |
|
} |
|
ch = stream.next(); |
|
if (ch === '"' || ch === "'") { |
|
stream.eatWhile(stringEater(ch)); |
|
stream.next(); |
|
state.prev = true; |
|
return "string"; |
|
} |
|
if (/[\[{\(]/.test(ch)) { |
|
state.prev = false; |
|
return null; |
|
} |
|
if (/[\]}\)]/.test(ch)) { |
|
state.prev = true; |
|
return null; |
|
} |
|
if (isNiladic.test(ch)) { |
|
state.prev = false; |
|
return "niladic"; |
|
} |
|
if (/[¯\d]/.test(ch)) { |
|
if (state.func) { |
|
state.func = false; |
|
state.prev = false; |
|
} else { |
|
state.prev = true; |
|
} |
|
stream.eatWhile(/[\w\.]/); |
|
return "number"; |
|
} |
|
if (isOperator.test(ch)) { |
|
return "operator apl-" + builtInOps[ch]; |
|
} |
|
if (isArrow.test(ch)) { |
|
return "apl-arrow"; |
|
} |
|
if (isFunction.test(ch)) { |
|
funcName = "apl-"; |
|
if (builtInFuncs[ch] != null) { |
|
if (state.prev) { |
|
funcName += builtInFuncs[ch][1]; |
|
} else { |
|
funcName += builtInFuncs[ch][0]; |
|
} |
|
} |
|
state.func = true; |
|
state.prev = false; |
|
return "function " + funcName; |
|
} |
|
if (isComment.test(ch)) { |
|
stream.skipToEnd(); |
|
return "comment"; |
|
} |
|
if (ch === "∘" && stream.peek() === ".") { |
|
stream.next(); |
|
return "function jot-dot"; |
|
} |
|
stream.eatWhile(/[\w\$_]/); |
|
state.prev = true; |
|
return "keyword"; |
|
} |
|
}; |
|
}); |
|
|
|
CodeMirror.defineMIME("text/apl", "apl"); |
|
|
|
});
|
|
|