annotate .cms/lib/codemirror/mode/yaml/yaml.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"));
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"], 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 CodeMirror.defineMode("yaml", function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 token: function(stream, state) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 var ch = stream.peek();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 var esc = state.escaped;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 state.escaped = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 /* comments */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 stream.skipToEnd();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 return "comment";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 if (state.literal && stream.indentation() > state.keyCol) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 stream.skipToEnd(); return "string";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 } else if (state.literal) { state.literal = false; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 if (stream.sol()) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 state.keyCol = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 state.pair = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 state.pairStart = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 /* document start */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 if(stream.match('---')) { return "def"; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 /* document end */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 if (stream.match('...')) { return "def"; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 /* array list item */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 if (stream.match(/\s*-\s+/)) { return 'meta'; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 /* inline pairs/lists */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 if (stream.match(/^(\{|\}|\[|\])/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 if (ch == '{')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 state.inlinePairs++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 else if (ch == '}')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 state.inlinePairs--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 else if (ch == '[')
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 state.inlineList++;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 else
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 state.inlineList--;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 return 'meta';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 /* list separator */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 if (state.inlineList > 0 && !esc && ch == ',') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 return 'meta';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 /* pairs separator */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 if (state.inlinePairs > 0 && !esc && ch == ',') {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 state.keyCol = 0;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 state.pair = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 state.pairStart = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 return 'meta';
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 /* start of value of a pair */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 if (state.pairStart) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 /* block literals */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77 if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 /* references */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 /* numbers */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 /* keywords */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 if (stream.match(keywordRegex)) { return 'keyword'; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 /* pairs (associative arrays) -> key */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^\s,\[\]{}#&*!|>'"%@`])[^#:]*(?=:($|\s))/)) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 state.pair = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 state.keyCol = stream.indentation();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 return "atom";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 /* nothing found, continue */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 state.pairStart = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 state.escaped = (ch == '\\');
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 stream.next();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 return null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 startState: function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 return {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 pair: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 pairStart: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 keyCol: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 inlinePairs: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 inlineList: 0,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 literal: false,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 escaped: false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 },
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 lineComment: "#",
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113 fold: "indent"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117 CodeMirror.defineMIME("text/x-yaml", "yaml");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 CodeMirror.defineMIME("text/yaml", "yaml");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 });