This repository has been archived by the owner on Feb 9, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
codemirror.js
50 lines (49 loc) · 3.07 KB
/
codemirror.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import CodeMirror from 'codemirror'
export function create() {
CodeMirror.defineSimpleMode("michelson", {
start: [
// delimiters
{ regex: /[;{(\s]/, token: "builtin", next: "start" },
// string
{ regex: /"(?:[^\\]|\\.)*?(?:"|$)/, token: "string" },
// bytes
{ regex: /(?:0x[0-9a-f]+)(?=\s|;|\}|\)|$)/i, token: "string" },
// int
{ regex: /(?:[+-]?[0-9]+\.?[0-9]*)(?=\s|;|\}|\)|$)/, token: "string" },
// comment
{ regex: /#.*/, token: "comment" },
{ regex: /\/\*/, token: "comment", next: "comment" },
// block
{ regex: /(?:parameter|storage|code)(?=\s|$)/, token: "atom" },
// data
{ regex: /(?:Unit|True|False|Pair|Left|Right|Some|None|Elt)(?=\s|;|\)|$)/, token: "keyword" },
// instruction
{ regex: /(?:CAST|RENAME|DROP|DUP|SWAP|PUSH|SOME|NONE|UNIT|NEVER|IF_NONE|UNPAIR|PAIR|CAR|CDR|LEFT|RIGHT|IF_LEFT|IF_RIGHT|NIL|CONS|IF_CONS|SIZE|EMPTY_SET|EMPTY_MAP|MAP|ITER|MEM|GET|UPDATE|IF|LOOP|LOOP_LEFT|LAMBDA|EXEC|DIP|FAILWITH|CONCAT|SLICE|PACK|UNPACK|ADD|SUB|MUL|EDIV|ABS|NEG|LSL|LSR|OR|AND|XOR|NOT|COMPARE|EQ|NEQ|LT|GT|LE|GE|CHECK_SIGNATURE|BLAKE2B|SHA256|SHA512|SHA3|KECCAK|HASH_KEY|DIG|DUG|EMPTY_BIG_MAP|APPLY|ISNAT|INT|PAIRING_CHECK)(?=\s|;|\}|$)/, token: "keyword" },
{ regex: /(?:SELF_ADDRESS|SELF|CONTRACT|TRANSFER_TOKENS|SET_DELEGATE|CREATE_CONTRACT|IMPLICIT_ACCOUNT|NOW|AMOUNT|BALANCE|STEPS_TO_QUOTA|SOURCE|SENDER|ADDRESS|CHAIN_ID|SAPLING_VERIFY_UPDATE|SAPLING_EMPTY_STATE|TOTAL_VOTING_POWER|VOTING_POWER|LEVEL)(?=\s|;|\}|$)/, token: "atom" },
// type
{ regex: /(?:option|list|set|contract|pair|or|lambda|map|big_map)(?=\s|\)|$)/, token: "tag" },
{ regex: /(?:key|unit|never|signature|operation|address|int|nat|string|bytes|mutez|bool|key_hash|baker_hash|timestamp|chain_id|sapling_state|sapling_transaction|bls12_381_fr|bls12_381_g1|bls12_381_g2)(?=\s|\)|\}|;|$)/, token: "variable" },
// macros
{ regex: /(?:IF_SOME|FAIL|ASSERT|ASSERT_NONE|ASSERT_SOME|ASSERT_LEFT|ASSERT_RIGHT|(?:SET|MAP)_C[AD]+R)(?=\s|;|\}|$)/, token: "string-2" },
{ regex: /(?:DII+P|C[AD]{2,}R|DUU+P|P[PAI]{3,}R|UNP[PAI]{3,}R)(?=\s|;|\}|$)/, token: "string-2" },
{ regex: /(?:(?:CMP|IF|IFCMP|ASSERT_|ASSERT_CMP)(?:EQ|NEQ|LT|GT|LE|GE))(?=\s|;|\}|\{|$)/, token: "string-2" },
// annotations
{ regex: /(?:%[A-z_0-9%@]*)(?=\s|$|\))/, token: "comment" },
{ regex: /(?:@[A-z_0-9%]+)(?=\s|$|\))/, token: "comment" },
{ regex: /(?::[A-z_0-9]+)(?=\s|$|\))/, token: "comment" },
// fallback
{ regex: /[^\s]+/, token: "builtin" }
],
comment: [
{ regex: /.*?\*\//, token: "comment", next: "start" },
{ regex: /.*/, token: "comment" }
],
meta: {
dontIndentStates: ["comment"],
lineComment: "#",
blockCommentStart: "/*",
blockCommentEnd: "*/"
}
});
return CodeMirror;
}