1 |
|
2 |
|
3 |
|
4 | (function(mod) {
|
5 | if (typeof exports == "object" && typeof module == "object")
|
6 | mod(require("../../lib/codemirror"), require("../javascript/javascript"));
|
7 | else if (typeof define == "function" && define.amd)
|
8 | define(["../../lib/codemirror", "../javascript/javascript"], mod);
|
9 | else
|
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 | if (stream)
|
35 |
|
36 |
|
37 | if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) {
|
38 | state.stringType = stream.peek();
|
39 | stream.next();
|
40 | state.inString = true;
|
41 | }
|
42 | if (!state.inString && !state.inComment && stream.match(/^\/\*/)) {
|
43 | state.inComment = true;
|
44 | }
|
45 |
|
46 |
|
47 | if (state.inString) {
|
48 | while (state.inString && !stream.eol()) {
|
49 | if (stream.peek() === state.stringType) {
|
50 | stream.next();
|
51 | state.inString = false;
|
52 | } else if (stream.peek() === '\\') {
|
53 | stream.next();
|
54 | stream.next();
|
55 | } else {
|
56 | stream.match(/^.[^\\\"\']*/);
|
57 | }
|
58 | }
|
59 | return state.lhs ? "property string" : "string";
|
60 | } else if (state.inComment) {
|
61 | while (state.inComment && !stream.eol()) {
|
62 | if (stream.match(/\*\//)) {
|
63 | state.inComment = false;
|
64 | } else {
|
65 | stream.match(/^.[^\*]*/);
|
66 | }
|
67 | }
|
68 | return "comment";
|
69 | } else if (state.inCharacterClass) {
|
70 | while (state.inCharacterClass && !stream.eol()) {
|
71 | if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) {
|
72 | state.inCharacterClass = false;
|
73 | }
|
74 | }
|
75 | } else if (stream.peek() === '[') {
|
76 | stream.next();
|
77 | state.inCharacterClass = true;
|
78 | return 'bracket';
|
79 | } else if (stream.match(/^\/\//)) {
|
80 | stream.skipToEnd();
|
81 | return "comment";
|
82 | } else if (state.braced || stream.peek() === '{') {
|
83 | if (state.localState === null) {
|
84 | state.localState = CodeMirror.startState(jsMode);
|
85 | }
|
86 | var token = jsMode.token(stream, state.localState);
|
87 | var text = stream.current();
|
88 | if (!token) {
|
89 | for (var i = 0; i < text.length; i++) {
|
90 | if (text[i] === '{') {
|
91 | state.braced++;
|
92 | } else if (text[i] === '}') {
|
93 | state.braced--;
|
94 | }
|
95 | };
|
96 | }
|
97 | return token;
|
98 | } else if (identifier(stream)) {
|
99 | if (stream.peek() === ':') {
|
100 | return 'variable';
|
101 | }
|
102 | return 'variable-2';
|
103 | } else if (['[', ']', '(', ')'].indexOf(stream.peek()) != -1) {
|
104 | stream.next();
|
105 | return 'bracket';
|
106 | } else if (!stream.eatSpace()) {
|
107 | stream.next();
|
108 | }
|
109 | return null;
|
110 | }
|
111 | };
|
112 | }, "javascript");
|
113 |
|
114 | });
|