github.com/elliott5/community@v0.14.1-0.20160709191136-823126fb026a/app/public/codemirror/mode/ttcn-cfg/ttcn-cfg.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-cfg", function(config, parserConfig) {
    15      var indentUnit = config.indentUnit,
    16          keywords = parserConfig.keywords || {},
    17          fileNCtrlMaskOptions = parserConfig.fileNCtrlMaskOptions || {},
    18          externalCommands = parserConfig.externalCommands || {},
    19          multiLineStrings = parserConfig.multiLineStrings,
    20          indentStatements = parserConfig.indentStatements !== false;
    21      var isOperatorChar = /[\|]/;
    22      var curPunc;
    23  
    24      function tokenBase(stream, state) {
    25        var ch = stream.next();
    26        if (ch == '"' || ch == "'") {
    27          state.tokenize = tokenString(ch);
    28          return state.tokenize(stream, state);
    29        }
    30        if (/[:=]/.test(ch)) {
    31          curPunc = ch;
    32          return "punctuation";
    33        }
    34        if (ch == "#"){
    35          stream.skipToEnd();
    36          return "comment";
    37        }
    38        if (/\d/.test(ch)) {
    39          stream.eatWhile(/[\w\.]/);
    40          return "number";
    41        }
    42        if (isOperatorChar.test(ch)) {
    43          stream.eatWhile(isOperatorChar);
    44          return "operator";
    45        }
    46        if (ch == "["){
    47          stream.eatWhile(/[\w_\]]/);
    48          return "number sectionTitle";
    49        }
    50  
    51        stream.eatWhile(/[\w\$_]/);
    52        var cur = stream.current();
    53        if (keywords.propertyIsEnumerable(cur)) return "keyword";
    54        if (fileNCtrlMaskOptions.propertyIsEnumerable(cur))
    55          return "negative fileNCtrlMaskOptions";
    56        if (externalCommands.propertyIsEnumerable(cur)) return "negative externalCommands";
    57  
    58        return "variable";
    59      }
    60  
    61      function tokenString(quote) {
    62        return function(stream, state) {
    63          var escaped = false, next, end = false;
    64          while ((next = stream.next()) != null) {
    65            if (next == quote && !escaped){
    66              var afterNext = stream.peek();
    67              //look if the character if the quote is like the B in '10100010'B
    68              if (afterNext){
    69                afterNext = afterNext.toLowerCase();
    70                if(afterNext == "b" || afterNext == "h" || afterNext == "o")
    71                  stream.next();
    72              }
    73              end = true; break;
    74            }
    75            escaped = !escaped && next == "\\";
    76          }
    77          if (end || !(escaped || multiLineStrings))
    78            state.tokenize = null;
    79          return "string";
    80        };
    81      }
    82  
    83      function Context(indented, column, type, align, prev) {
    84        this.indented = indented;
    85        this.column = column;
    86        this.type = type;
    87        this.align = align;
    88        this.prev = prev;
    89      }
    90      function pushContext(state, col, type) {
    91        var indent = state.indented;
    92        if (state.context && state.context.type == "statement")
    93          indent = state.context.indented;
    94        return state.context = new Context(indent, col, type, null, state.context);
    95      }
    96      function popContext(state) {
    97        var t = state.context.type;
    98        if (t == ")" || t == "]" || t == "}")
    99          state.indented = state.context.indented;
   100        return state.context = state.context.prev;
   101      }
   102  
   103      //Interface
   104      return {
   105        startState: function(basecolumn) {
   106          return {
   107            tokenize: null,
   108            context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
   109            indented: 0,
   110            startOfLine: true
   111          };
   112        },
   113  
   114        token: function(stream, state) {
   115          var ctx = state.context;
   116          if (stream.sol()) {
   117            if (ctx.align == null) ctx.align = false;
   118            state.indented = stream.indentation();
   119            state.startOfLine = true;
   120          }
   121          if (stream.eatSpace()) return null;
   122          curPunc = null;
   123          var style = (state.tokenize || tokenBase)(stream, state);
   124          if (style == "comment") return style;
   125          if (ctx.align == null) ctx.align = true;
   126  
   127          if ((curPunc == ";" || curPunc == ":" || curPunc == ",")
   128              && ctx.type == "statement"){
   129            popContext(state);
   130          }
   131          else if (curPunc == "{") pushContext(state, stream.column(), "}");
   132          else if (curPunc == "[") pushContext(state, stream.column(), "]");
   133          else if (curPunc == "(") pushContext(state, stream.column(), ")");
   134          else if (curPunc == "}") {
   135            while (ctx.type == "statement") ctx = popContext(state);
   136            if (ctx.type == "}") ctx = popContext(state);
   137            while (ctx.type == "statement") ctx = popContext(state);
   138          }
   139          else if (curPunc == ctx.type) popContext(state);
   140          else if (indentStatements && (((ctx.type == "}" || ctx.type == "top")
   141              && curPunc != ';') || (ctx.type == "statement"
   142              && curPunc == "newstatement")))
   143            pushContext(state, stream.column(), "statement");
   144          state.startOfLine = false;
   145          return style;
   146        },
   147  
   148        electricChars: "{}",
   149        lineComment: "#",
   150        fold: "brace"
   151      };
   152    });
   153  
   154    function words(str) {
   155      var obj = {}, words = str.split(" ");
   156      for (var i = 0; i < words.length; ++i)
   157        obj[words[i]] = true;
   158      return obj;
   159    }
   160  
   161    CodeMirror.defineMIME("text/x-ttcn-cfg", {
   162      name: "ttcn-cfg",
   163      keywords: words("Yes No LogFile FileMask ConsoleMask AppendFile" +
   164      " TimeStampFormat LogEventTypes SourceInfoFormat" +
   165      " LogEntityName LogSourceInfo DiskFullAction" +
   166      " LogFileNumber LogFileSize MatchingHints Detailed" +
   167      " Compact SubCategories Stack Single None Seconds" +
   168      " DateTime Time Stop Error Retry Delete TCPPort KillTimer" +
   169      " NumHCs UnixSocketsEnabled LocalAddress"),
   170      fileNCtrlMaskOptions: words("TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING" +
   171      " TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP" +
   172      " TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION" +
   173      " TTCN_USER TTCN_FUNCTION TTCN_STATISTICS" +
   174      " TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG" +
   175      " EXECUTOR ERROR WARNING PORTEVENT TIMEROP" +
   176      " VERDICTOP DEFAULTOP TESTCASE ACTION USER" +
   177      " FUNCTION STATISTICS PARALLEL MATCHING DEBUG" +
   178      " LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED" +
   179      " DEBUG_ENCDEC DEBUG_TESTPORT" +
   180      " DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE" +
   181      " DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT" +
   182      " DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED" +
   183      " EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA" +
   184      " EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS" +
   185      " EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED" +
   186      " FUNCTION_RND FUNCTION_UNQUALIFIED" +
   187      " MATCHING_DONE MATCHING_MCSUCCESS" +
   188      " MATCHING_MCUNSUCC MATCHING_MMSUCCESS" +
   189      " MATCHING_MMUNSUCC MATCHING_PCSUCCESS" +
   190      " MATCHING_PCUNSUCC MATCHING_PMSUCCESS" +
   191      " MATCHING_PMUNSUCC MATCHING_PROBLEM" +
   192      " MATCHING_TIMEOUT MATCHING_UNQUALIFIED" +
   193      " PARALLEL_PORTCONN PARALLEL_PORTMAP" +
   194      " PARALLEL_PTC PARALLEL_UNQUALIFIED" +
   195      " PORTEVENT_DUALRECV PORTEVENT_DUALSEND" +
   196      " PORTEVENT_MCRECV PORTEVENT_MCSEND" +
   197      " PORTEVENT_MMRECV PORTEVENT_MMSEND" +
   198      " PORTEVENT_MQUEUE PORTEVENT_PCIN" +
   199      " PORTEVENT_PCOUT PORTEVENT_PMIN" +
   200      " PORTEVENT_PMOUT PORTEVENT_PQUEUE" +
   201      " PORTEVENT_STATE PORTEVENT_UNQUALIFIED" +
   202      " STATISTICS_UNQUALIFIED STATISTICS_VERDICT" +
   203      " TESTCASE_FINISH TESTCASE_START" +
   204      " TESTCASE_UNQUALIFIED TIMEROP_GUARD" +
   205      " TIMEROP_READ TIMEROP_START TIMEROP_STOP" +
   206      " TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED" +
   207      " USER_UNQUALIFIED VERDICTOP_FINAL" +
   208      " VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT" +
   209      " VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED"),
   210      externalCommands: words("BeginControlPart EndControlPart BeginTestCase" +
   211      " EndTestCase"),
   212      multiLineStrings: true
   213    });
   214  });