0
|
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 });
|