annotate .cms/lib/codemirror/mode/dart/dart.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"), require("../clike/clike"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror", "../clike/clike"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 var keywords = ("this super static final const abstract class extends external factory " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 "implements mixin get native set typedef with enum throw rethrow assert break case " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 "continue default in return new deferred async await covariant try catch finally " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 "do else for if switch while import library export part of show hide is as extension " +
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 "on yield late required sealed base interface when").split(" ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 var blockKeywords = "try catch finally do else for if switch while".split(" ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 var atoms = "true false null".split(" ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 var builtins = "void bool num int double dynamic var String Null Never".split(" ");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 function set(words) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 var obj = {};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 return obj;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 function pushInterpolationStack(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 function popInterpolationStack(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 return (state.interpolationStack || (state.interpolationStack = [])).pop();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 function sizeInterpolationStack(state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 return state.interpolationStack ? state.interpolationStack.length : 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 CodeMirror.defineMIME("application/dart", {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 name: "clike",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 keywords: set(keywords),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 blockKeywords: set(blockKeywords),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 builtin: set(builtins),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 atoms: set(atoms),
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 // clike numbers without the suffixes, and with '_' separators.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 number: /^(?:0x[a-f\d_]+|(?:[\d_]+\.?[\d_]*|\.[\d_]+)(?:e[-+]?[\d_]+)?)/i,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 hooks: {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 "@": function(stream) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 stream.eatWhile(/[\w\$_\.]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 return "meta";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 // custom string handling to deal with triple-quoted strings and string interpolation
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 "'": function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 return tokenString("'", stream, state, false);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 "\"": function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 return tokenString("\"", stream, state, false);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 "r": function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 var peek = stream.peek();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 if (peek == "'" || peek == "\"") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 return tokenString(stream.next(), stream, state, true);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 "}": function(_stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 // "}" is end of interpolation, if interpolation stack is non-empty
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 if (sizeInterpolationStack(state) > 0) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 state.tokenize = popInterpolationStack(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 "/": function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 if (!stream.eat("*")) return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 state.tokenize = tokenNestedComment(1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 return state.tokenize(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 token: function(stream, _, style) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 if (style == "variable") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 // Assume uppercase symbols are classes using variable-2
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 var isUpper = RegExp('^[_$]*[A-Z][a-zA-Z0-9_$]*$','g');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 if (isUpper.test(stream.current())) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 return 'variable-2';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 function tokenString(quote, stream, state, raw) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 var tripleQuoted = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 if (stream.eat(quote)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 if (stream.eat(quote)) tripleQuoted = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 else return "string"; //empty string
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 function tokenStringHelper(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 var escaped = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 while (!stream.eol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 if (!raw && !escaped && stream.peek() == "$") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 pushInterpolationStack(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 state.tokenize = tokenInterpolation;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 var next = stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 state.tokenize = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 break;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 escaped = !raw && !escaped && next == "\\";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 state.tokenize = tokenStringHelper;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 return tokenStringHelper(stream, state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 function tokenInterpolation(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 stream.eat("$");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 if (stream.eat("{")) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 // let clike handle the content of ${...},
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127 // we take over again when "}" appears (see hooks).
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 state.tokenize = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 state.tokenize = tokenInterpolationIdentifier;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
134
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
135 function tokenInterpolationIdentifier(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
136 stream.eatWhile(/[\w_]/);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
137 state.tokenize = popInterpolationStack(state);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
138 return "variable";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
139 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
140
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
141 function tokenNestedComment(depth) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
142 return function (stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
143 var ch
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
144 while (ch = stream.next()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
145 if (ch == "*" && stream.eat("/")) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
146 if (depth == 1) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
147 state.tokenize = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
148 break
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
149 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
150 state.tokenize = tokenNestedComment(depth - 1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
151 return state.tokenize(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
152 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
153 } else if (ch == "/" && stream.eat("*")) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
154 state.tokenize = tokenNestedComment(depth + 1)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
155 return state.tokenize(stream, state)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
156 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
157 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
158 return "comment"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
159 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
160 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
161
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
162 CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
163
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
164 // This is needed to make loading through meta.js work.
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
165 CodeMirror.defineMode("dart", function(conf) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
166 return CodeMirror.getMode(conf, "application/dart");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
167 }, "clike");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
168 });