github.com/elliott5/community@v0.14.1-0.20160709191136-823126fb026a/app/public/codemirror/mode/ttcn/ttcn.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"));
     7    else if (typeof define == "function" && define.amd) // AMD
     8      define(["../../lib/codemirror"], mod);
     9    else // Plain browser env
    10      mod(CodeMirror);
    11  })(function(CodeMirror) {
    12    "use strict";
    13  
    14    CodeMirror.defineMode("ttcn", function(config, parserConfig) {
    15      var indentUnit = config.indentUnit,
    16          keywords = parserConfig.keywords || {},
    17          builtin = parserConfig.builtin || {},
    18          timerOps = parserConfig.timerOps || {},
    19          portOps  = parserConfig.portOps || {},
    20          configOps = parserConfig.configOps || {},
    21          verdictOps = parserConfig.verdictOps || {},
    22          sutOps = parserConfig.sutOps || {},
    23          functionOps = parserConfig.functionOps || {},
    24  
    25          verdictConsts = parserConfig.verdictConsts || {},
    26          booleanConsts = parserConfig.booleanConsts || {},
    27          otherConsts   = parserConfig.otherConsts || {},
    28  
    29          types = parserConfig.types || {},
    30          visibilityModifiers = parserConfig.visibilityModifiers || {},
    31          templateMatch = parserConfig.templateMatch || {},
    32          multiLineStrings = parserConfig.multiLineStrings,
    33          indentStatements = parserConfig.indentStatements !== false;
    34      var isOperatorChar = /[+\-*&@=<>!\/]/;
    35      var curPunc;
    36  
    37      function tokenBase(stream, state) {
    38        var ch = stream.next();
    39  
    40        if (ch == '"' || ch == "'") {
    41          state.tokenize = tokenString(ch);
    42          return state.tokenize(stream, state);
    43        }
    44        if (/[\[\]{}\(\),;\\:\?\.]/.test(ch)) {
    45          curPunc = ch;
    46          return "punctuation";
    47        }
    48        if (ch == "#"){
    49          stream.skipToEnd();
    50          return "atom preprocessor";
    51        }
    52        if (ch == "%"){
    53          stream.eatWhile(/\b/);
    54          return "atom ttcn3Macros";
    55        }
    56        if (/\d/.test(ch)) {
    57          stream.eatWhile(/[\w\.]/);
    58          return "number";
    59        }
    60        if (ch == "/") {
    61          if (stream.eat("*")) {
    62            state.tokenize = tokenComment;
    63            return tokenComment(stream, state);
    64          }
    65          if (stream.eat("/")) {
    66            stream.skipToEnd();
    67            return "comment";
    68          }
    69        }
    70        if (isOperatorChar.test(ch)) {
    71          if(ch == "@"){
    72            if(stream.match("try") || stream.match("catch")
    73                || stream.match("lazy")){
    74              return "keyword";
    75            }
    76          }
    77          stream.eatWhile(isOperatorChar);
    78          return "operator";
    79        }
    80        stream.eatWhile(/[\w\$_\xa1-\uffff]/);
    81        var cur = stream.current();
    82  
    83        if (keywords.propertyIsEnumerable(cur)) return "keyword";
    84        if (builtin.propertyIsEnumerable(cur)) return "builtin";
    85  
    86        if (timerOps.propertyIsEnumerable(cur)) return "def timerOps";
    87        if (configOps.propertyIsEnumerable(cur)) return "def configOps";
    88        if (verdictOps.propertyIsEnumerable(cur)) return "def verdictOps";
    89        if (portOps.propertyIsEnumerable(cur)) return "def portOps";
    90        if (sutOps.propertyIsEnumerable(cur)) return "def sutOps";
    91        if (functionOps.propertyIsEnumerable(cur)) return "def functionOps";
    92  
    93        if (verdictConsts.propertyIsEnumerable(cur)) return "string verdictConsts";
    94        if (booleanConsts.propertyIsEnumerable(cur)) return "string booleanConsts";
    95        if (otherConsts.propertyIsEnumerable(cur)) return "string otherConsts";
    96  
    97        if (types.propertyIsEnumerable(cur)) return "builtin types";
    98        if (visibilityModifiers.propertyIsEnumerable(cur))
    99          return "builtin visibilityModifiers";
   100        if (templateMatch.propertyIsEnumerable(cur)) return "atom templateMatch";
   101  
   102        return "variable";
   103      }
   104  
   105      function tokenString(quote) {
   106        return function(stream, state) {
   107          var escaped = false, next, end = false;
   108          while ((next = stream.next()) != null) {
   109            if (next == quote && !escaped){
   110              var afterQuote = stream.peek();
   111              //look if the character after the quote is like the B in '10100010'B
   112              if (afterQuote){
   113                afterQuote = afterQuote.toLowerCase();
   114                if(afterQuote == "b" || afterQuote == "h" || afterQuote == "o")
   115                  stream.next();
   116              }
   117              end = true; break;
   118            }
   119            escaped = !escaped && next == "\\";
   120          }
   121          if (end || !(escaped || multiLineStrings))
   122            state.tokenize = null;
   123          return "string";
   124        };
   125      }
   126  
   127      function tokenComment(stream, state) {
   128        var maybeEnd = false, ch;
   129        while (ch = stream.next()) {
   130          if (ch == "/" && maybeEnd) {
   131            state.tokenize = null;
   132            break;
   133          }
   134          maybeEnd = (ch == "*");
   135        }
   136        return "comment";
   137      }
   138  
   139      function Context(indented, column, type, align, prev) {
   140        this.indented = indented;
   141        this.column = column;
   142        this.type = type;
   143        this.align = align;
   144        this.prev = prev;
   145      }
   146  
   147      function pushContext(state, col, type) {
   148        var indent = state.indented;
   149        if (state.context && state.context.type == "statement")
   150          indent = state.context.indented;
   151        return state.context = new Context(indent, col, type, null, state.context);
   152      }
   153  
   154      function popContext(state) {
   155        var t = state.context.type;
   156        if (t == ")" || t == "]" || t == "}")
   157          state.indented = state.context.indented;
   158        return state.context = state.context.prev;
   159      }
   160  
   161      //Interface
   162      return {
   163        startState: function(basecolumn) {
   164          return {
   165            tokenize: null,
   166            context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
   167            indented: 0,
   168            startOfLine: true
   169          };
   170        },
   171  
   172        token: function(stream, state) {
   173          var ctx = state.context;
   174          if (stream.sol()) {
   175            if (ctx.align == null) ctx.align = false;
   176            state.indented = stream.indentation();
   177            state.startOfLine = true;
   178          }
   179          if (stream.eatSpace()) return null;
   180          curPunc = null;
   181          var style = (state.tokenize || tokenBase)(stream, state);
   182          if (style == "comment") return style;
   183          if (ctx.align == null) ctx.align = true;
   184  
   185          if ((curPunc == ";" || curPunc == ":" || curPunc == ",")
   186              && ctx.type == "statement"){
   187            popContext(state);
   188          }
   189          else if (curPunc == "{") pushContext(state, stream.column(), "}");
   190          else if (curPunc == "[") pushContext(state, stream.column(), "]");
   191          else if (curPunc == "(") pushContext(state, stream.column(), ")");
   192          else if (curPunc == "}") {
   193            while (ctx.type == "statement") ctx = popContext(state);
   194            if (ctx.type == "}") ctx = popContext(state);
   195            while (ctx.type == "statement") ctx = popContext(state);
   196          }
   197          else if (curPunc == ctx.type) popContext(state);
   198          else if (indentStatements &&
   199              (((ctx.type == "}" || ctx.type == "top") && curPunc != ';') ||
   200              (ctx.type == "statement" && curPunc == "newstatement")))
   201            pushContext(state, stream.column(), "statement");
   202  
   203          state.startOfLine = false;
   204  
   205          return style;
   206        },
   207  
   208        electricChars: "{}",
   209        blockCommentStart: "/*",
   210        blockCommentEnd: "*/",
   211        lineComment: "//",
   212        fold: "brace"
   213      };
   214    });
   215  
   216    function words(str) {
   217      var obj = {}, words = str.split(" ");
   218      for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
   219      return obj;
   220    }
   221  
   222    function def(mimes, mode) {
   223      if (typeof mimes == "string") mimes = [mimes];
   224      var words = [];
   225      function add(obj) {
   226        if (obj) for (var prop in obj) if (obj.hasOwnProperty(prop))
   227          words.push(prop);
   228      }
   229  
   230      add(mode.keywords);
   231      add(mode.builtin);
   232      add(mode.timerOps);
   233      add(mode.portOps);
   234  
   235      if (words.length) {
   236        mode.helperType = mimes[0];
   237        CodeMirror.registerHelper("hintWords", mimes[0], words);
   238      }
   239  
   240      for (var i = 0; i < mimes.length; ++i)
   241        CodeMirror.defineMIME(mimes[i], mode);
   242    }
   243  
   244    def(["text/x-ttcn", "text/x-ttcn3", "text/x-ttcnpp"], {
   245      name: "ttcn",
   246      keywords: words("activate address alive all alt altstep and and4b any" +
   247      " break case component const continue control deactivate" +
   248      " display do else encode enumerated except exception" +
   249      " execute extends extension external for from function" +
   250      " goto group if import in infinity inout interleave" +
   251      " label language length log match message mixed mod" +
   252      " modifies module modulepar mtc noblock not not4b nowait" +
   253      " of on optional or or4b out override param pattern port" +
   254      " procedure record recursive rem repeat return runs select" +
   255      " self sender set signature system template testcase to" +
   256      " type union value valueof var variant while with xor xor4b"),
   257      builtin: words("bit2hex bit2int bit2oct bit2str char2int char2oct encvalue" +
   258      " decomp decvalue float2int float2str hex2bit hex2int" +
   259      " hex2oct hex2str int2bit int2char int2float int2hex" +
   260      " int2oct int2str int2unichar isbound ischosen ispresent" +
   261      " isvalue lengthof log2str oct2bit oct2char oct2hex oct2int" +
   262      " oct2str regexp replace rnd sizeof str2bit str2float" +
   263      " str2hex str2int str2oct substr unichar2int unichar2char" +
   264      " enum2int"),
   265      types: words("anytype bitstring boolean char charstring default float" +
   266      " hexstring integer objid octetstring universal verdicttype timer"),
   267      timerOps: words("read running start stop timeout"),
   268      portOps: words("call catch check clear getcall getreply halt raise receive" +
   269      " reply send trigger"),
   270      configOps: words("create connect disconnect done kill killed map unmap"),
   271      verdictOps: words("getverdict setverdict"),
   272      sutOps: words("action"),
   273      functionOps: words("apply derefers refers"),
   274  
   275      verdictConsts: words("error fail inconc none pass"),
   276      booleanConsts: words("true false"),
   277      otherConsts: words("null NULL omit"),
   278  
   279      visibilityModifiers: words("private public friend"),
   280      templateMatch: words("complement ifpresent subset superset permutation"),
   281      multiLineStrings: true
   282    });
   283  });