Mercurial
comparison .cms/lib/codemirror/mode/apl/apl.js @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others | |
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE | |
3 | |
4 (function(mod) { | |
5 if (typeof exports == "object" && typeof module == "object") // CommonJS | |
6 mod(require("../../lib/codemirror")); | |
7 else if (typeof define == "function" && define.amd) // AMD | |
8 define(["../../lib/codemirror"], mod); | |
9 else // Plain browser env | |
10 mod(CodeMirror); | |
11 })(function(CodeMirror) { | |
12 "use strict"; | |
13 | |
14 CodeMirror.defineMode("apl", function() { | |
15 var builtInOps = { | |
16 ".": "innerProduct", | |
17 "\\": "scan", | |
18 "/": "reduce", | |
19 "⌿": "reduce1Axis", | |
20 "⍀": "scan1Axis", | |
21 "¨": "each", | |
22 "⍣": "power" | |
23 }; | |
24 var builtInFuncs = { | |
25 "+": ["conjugate", "add"], | |
26 "−": ["negate", "subtract"], | |
27 "×": ["signOf", "multiply"], | |
28 "÷": ["reciprocal", "divide"], | |
29 "⌈": ["ceiling", "greaterOf"], | |
30 "⌊": ["floor", "lesserOf"], | |
31 "∣": ["absolute", "residue"], | |
32 "⍳": ["indexGenerate", "indexOf"], | |
33 "?": ["roll", "deal"], | |
34 "⋆": ["exponentiate", "toThePowerOf"], | |
35 "⍟": ["naturalLog", "logToTheBase"], | |
36 "○": ["piTimes", "circularFuncs"], | |
37 "!": ["factorial", "binomial"], | |
38 "⌹": ["matrixInverse", "matrixDivide"], | |
39 "<": [null, "lessThan"], | |
40 "≤": [null, "lessThanOrEqual"], | |
41 "=": [null, "equals"], | |
42 ">": [null, "greaterThan"], | |
43 "≥": [null, "greaterThanOrEqual"], | |
44 "≠": [null, "notEqual"], | |
45 "≡": ["depth", "match"], | |
46 "≢": [null, "notMatch"], | |
47 "∈": ["enlist", "membership"], | |
48 "⍷": [null, "find"], | |
49 "∪": ["unique", "union"], | |
50 "∩": [null, "intersection"], | |
51 "∼": ["not", "without"], | |
52 "∨": [null, "or"], | |
53 "∧": [null, "and"], | |
54 "⍱": [null, "nor"], | |
55 "⍲": [null, "nand"], | |
56 "⍴": ["shapeOf", "reshape"], | |
57 ",": ["ravel", "catenate"], | |
58 "⍪": [null, "firstAxisCatenate"], | |
59 "⌽": ["reverse", "rotate"], | |
60 "⊖": ["axis1Reverse", "axis1Rotate"], | |
61 "⍉": ["transpose", null], | |
62 "↑": ["first", "take"], | |
63 "↓": [null, "drop"], | |
64 "⊂": ["enclose", "partitionWithAxis"], | |
65 "⊃": ["diclose", "pick"], | |
66 "⌷": [null, "index"], | |
67 "⍋": ["gradeUp", null], | |
68 "⍒": ["gradeDown", null], | |
69 "⊤": ["encode", null], | |
70 "⊥": ["decode", null], | |
71 "⍕": ["format", "formatByExample"], | |
72 "⍎": ["execute", null], | |
73 "⊣": ["stop", "left"], | |
74 "⊢": ["pass", "right"] | |
75 }; | |
76 | |
77 var isOperator = /[\.\/⌿⍀¨⍣]/; | |
78 var isNiladic = /⍬/; | |
79 var isFunction = /[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/; | |
80 var isArrow = /←/; | |
81 var isComment = /[⍝#].*$/; | |
82 | |
83 var stringEater = function(type) { | |
84 var prev; | |
85 prev = false; | |
86 return function(c) { | |
87 prev = c; | |
88 if (c === type) { | |
89 return prev === "\\"; | |
90 } | |
91 return true; | |
92 }; | |
93 }; | |
94 return { | |
95 startState: function() { | |
96 return { | |
97 prev: false, | |
98 func: false, | |
99 op: false, | |
100 string: false, | |
101 escape: false | |
102 }; | |
103 }, | |
104 token: function(stream, state) { | |
105 var ch, funcName; | |
106 if (stream.eatSpace()) { | |
107 return null; | |
108 } | |
109 ch = stream.next(); | |
110 if (ch === '"' || ch === "'") { | |
111 stream.eatWhile(stringEater(ch)); | |
112 stream.next(); | |
113 state.prev = true; | |
114 return "string"; | |
115 } | |
116 if (/[\[{\(]/.test(ch)) { | |
117 state.prev = false; | |
118 return null; | |
119 } | |
120 if (/[\]}\)]/.test(ch)) { | |
121 state.prev = true; | |
122 return null; | |
123 } | |
124 if (isNiladic.test(ch)) { | |
125 state.prev = false; | |
126 return "niladic"; | |
127 } | |
128 if (/[¯\d]/.test(ch)) { | |
129 if (state.func) { | |
130 state.func = false; | |
131 state.prev = false; | |
132 } else { | |
133 state.prev = true; | |
134 } | |
135 stream.eatWhile(/[\w\.]/); | |
136 return "number"; | |
137 } | |
138 if (isOperator.test(ch)) { | |
139 return "operator apl-" + builtInOps[ch]; | |
140 } | |
141 if (isArrow.test(ch)) { | |
142 return "apl-arrow"; | |
143 } | |
144 if (isFunction.test(ch)) { | |
145 funcName = "apl-"; | |
146 if (builtInFuncs[ch] != null) { | |
147 if (state.prev) { | |
148 funcName += builtInFuncs[ch][1]; | |
149 } else { | |
150 funcName += builtInFuncs[ch][0]; | |
151 } | |
152 } | |
153 state.func = true; | |
154 state.prev = false; | |
155 return "function " + funcName; | |
156 } | |
157 if (isComment.test(ch)) { | |
158 stream.skipToEnd(); | |
159 return "comment"; | |
160 } | |
161 if (ch === "∘" && stream.peek() === ".") { | |
162 stream.next(); | |
163 return "function jot-dot"; | |
164 } | |
165 stream.eatWhile(/[\w\$_]/); | |
166 state.prev = true; | |
167 return "keyword"; | |
168 } | |
169 }; | |
170 }); | |
171 | |
172 CodeMirror.defineMIME("text/apl", "apl"); | |
173 | |
174 }); |