GPQAPP

Форк
0
114 строк · 3.5 Кб
1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: https://codemirror.net/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
      if (stream)
35

36
      //check for state changes
37
      if (!state.inString && !state.inComment && ((stream.peek() == '"') || (stream.peek() == "'"))) {
38
        state.stringType = stream.peek();
39
        stream.next(); // Skip quote
40
        state.inString = true; // Update state
41
      }
42
      if (!state.inString && !state.inComment && stream.match('/*')) {
43
        state.inComment = true;
44
      }
45

46
      //return state
47
      if (state.inString) {
48
        while (state.inString && !stream.eol()) {
49
          if (stream.peek() === state.stringType) {
50
            stream.next(); // Skip quote
51
            state.inString = false; // Clear flag
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"; // Token style
60
      } else if (state.inComment) {
61
        while (state.inComment && !stream.eol()) {
62
          if (stream.match('*/')) {
63
            state.inComment = false; // Clear flag
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
});
115

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.