github.com/jancarloviray/community@v0.41.1-0.20170124221257-33a66c87cf2f/app/public/codemirror/mode/pegjs/pegjs.js (about)

     1  // CodeMirror, copyright (c) by Marijn Haverbeke and others
     2  // Distributed under an MIT license: http://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          inChracterClass: 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.inChracterClass) {
    70            while (state.inChracterClass && !stream.eol()) {
    71              if (!(stream.match(/^[^\]\\]+/) || stream.match(/^\\./))) {
    72                state.inChracterClass = false;
    73              }
    74            }
    75        } else if (stream.peek() === '[') {
    76          stream.next();
    77          state.inChracterClass = 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 = jsMode.startState();
    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  });