Mercurial
comparison .cms/lib/codemirror/mode/pegjs/pegjs.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"), require("../javascript/javascript")); | |
7 else if (typeof define == "function" && define.amd) // AMD | |
8 define(["../../lib/codemirror", "../javascript/javascript"], mod); | |
9 else // Plain browser env | |
10 mod(CodeMirror); | |
11 })(function(CodeMirror) { | |
12 "use strict"; | |
13 | |
14 CodeMirror.defineMode("pegjs", function (config) { | |
15 var jsMode = CodeMirror.getMode(config, "javascript"); | |
16 | |
17 function identifier(stream) { | |
18 return stream.match(/^[a-zA-Z_][a-zA-Z0-9_]*/); | |
19 } | |
20 | |
21 return { | |
22 startState: function () { | |
23 return { | |
24 inString: false, | |
25 stringType: null, | |
26 inComment: false, | |
27 inCharacterClass: false, | |
28 braced: 0, | |
29 lhs: true, | |
30 localState: null | |
31 }; | |
32 }, | |
33 token: function (stream, state) { | |
34 //check for state changes | |
35 if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) { | |
36 state.stringType = stream.peek(); | |
37 stream.next(); // Skip quote | |
38 state.inString = true; // Update state | |
39 } | |
40 if (!state.inString && !state.inComment && stream.match('/*')) { | |
41 state.inComment = true; | |
42 } | |
43 | |
44 if (state.inString) { | |
45 while (state.inString && !stream.eol()) { | |
46 if (stream.peek() === state.stringType) { | |
47 stream.next(); // Skip quote | |
48 state.inString = false; // Clear flag | |
49 } else if (stream.peek() === '\\') { | |
50 stream.next(); | |
51 stream.next(); | |
52 } else { | |
53 stream.match(/^.[^\\\"\']*/); | |
54 } | |
55 } | |
56 return state.lhs ? "property string" : "string"; // Token style | |
57 } else if (state.inComment) { | |
58 while (state.inComment && !stream.eol()) { | |
59 if (stream.match('*/')) { | |
60 state.inComment = false; // Clear flag | |
61 } else { | |
62 stream.match(/^.[^\*]*/); | |
63 } | |
64 } | |
65 return "comment"; | |
66 } else if (state.inCharacterClass) { | |
67 while (state.inCharacterClass && !stream.eol()) { | |
68 if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) { | |
69 state.inCharacterClass = false; | |
70 } | |
71 } | |
72 } else if (stream.peek() === '[') { | |
73 stream.next(); | |
74 state.inCharacterClass = true; | |
75 return 'bracket'; | |
76 } else if (stream.match('//')) { | |
77 stream.skipToEnd(); | |
78 return "comment"; | |
79 } else if (state.braced || stream.peek() === '{') { | |
80 if (state.localState === null) { | |
81 state.localState = CodeMirror.startState(jsMode); | |
82 } | |
83 var token = jsMode.token(stream, state.localState); | |
84 var text = stream.current(); | |
85 if (!token) { | |
86 for (var i = 0; i < text.length; i++) { | |
87 if (text[i] === '{') { | |
88 state.braced++; | |
89 } else if (text[i] === '}') { | |
90 state.braced--; | |
91 } | |
92 }; | |
93 } | |
94 return token; | |
95 } else if (identifier(stream)) { | |
96 if (stream.peek() === ':') { | |
97 return 'variable'; | |
98 } | |
99 return 'variable-2'; | |
100 } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) { | |
101 stream.next(); | |
102 return 'bracket'; | |
103 } else if (!stream.eatSpace()) { | |
104 stream.next(); | |
105 } | |
106 return null; | |
107 } | |
108 }; | |
109 }, "javascript"); | |
110 | |
111 }); |