openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

dart.js (5115B)


      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("../clike/clike"));
      7   else if (typeof define == "function" && define.amd) // AMD
      8     define(["../../lib/codemirror", "../clike/clike"], mod);
      9   else // Plain browser env
     10     mod(CodeMirror);
     11 })(function(CodeMirror) {
     12   "use strict";
     13 
     14   var keywords = ("this super static final const abstract class extends external factory " +
     15     "implements get native set typedef with enum throw rethrow " +
     16     "assert break case continue default in return new deferred async await covariant " +
     17     "try catch finally do else for if switch while import library export " +
     18     "part of show hide is as").split(" ");
     19   var blockKeywords = "try catch finally do else for if switch while".split(" ");
     20   var atoms = "true false null".split(" ");
     21   var builtins = "void bool num int double dynamic var String".split(" ");
     22 
     23   function set(words) {
     24     var obj = {};
     25     for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
     26     return obj;
     27   }
     28 
     29   function pushInterpolationStack(state) {
     30     (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize);
     31   }
     32 
     33   function popInterpolationStack(state) {
     34     return (state.interpolationStack || (state.interpolationStack = [])).pop();
     35   }
     36 
     37   function sizeInterpolationStack(state) {
     38     return state.interpolationStack ? state.interpolationStack.length : 0;
     39   }
     40 
     41   CodeMirror.defineMIME("application/dart", {
     42     name: "clike",
     43     keywords: set(keywords),
     44     blockKeywords: set(blockKeywords),
     45     builtin: set(builtins),
     46     atoms: set(atoms),
     47     hooks: {
     48       "@": function(stream) {
     49         stream.eatWhile(/[\w\$_\.]/);
     50         return "meta";
     51       },
     52 
     53       // custom string handling to deal with triple-quoted strings and string interpolation
     54       "'": function(stream, state) {
     55         return tokenString("'", stream, state, false);
     56       },
     57       "\"": function(stream, state) {
     58         return tokenString("\"", stream, state, false);
     59       },
     60       "r": function(stream, state) {
     61         var peek = stream.peek();
     62         if (peek == "'" || peek == "\"") {
     63           return tokenString(stream.next(), stream, state, true);
     64         }
     65         return false;
     66       },
     67 
     68       "}": function(_stream, state) {
     69         // "}" is end of interpolation, if interpolation stack is non-empty
     70         if (sizeInterpolationStack(state) > 0) {
     71           state.tokenize = popInterpolationStack(state);
     72           return null;
     73         }
     74         return false;
     75       },
     76 
     77       "/": function(stream, state) {
     78         if (!stream.eat("*")) return false
     79         state.tokenize = tokenNestedComment(1)
     80         return state.tokenize(stream, state)
     81       }
     82     }
     83   });
     84 
     85   function tokenString(quote, stream, state, raw) {
     86     var tripleQuoted = false;
     87     if (stream.eat(quote)) {
     88       if (stream.eat(quote)) tripleQuoted = true;
     89       else return "string"; //empty string
     90     }
     91     function tokenStringHelper(stream, state) {
     92       var escaped = false;
     93       while (!stream.eol()) {
     94         if (!raw && !escaped && stream.peek() == "$") {
     95           pushInterpolationStack(state);
     96           state.tokenize = tokenInterpolation;
     97           return "string";
     98         }
     99         var next = stream.next();
    100         if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) {
    101           state.tokenize = null;
    102           break;
    103         }
    104         escaped = !raw && !escaped && next == "\\";
    105       }
    106       return "string";
    107     }
    108     state.tokenize = tokenStringHelper;
    109     return tokenStringHelper(stream, state);
    110   }
    111 
    112   function tokenInterpolation(stream, state) {
    113     stream.eat("$");
    114     if (stream.eat("{")) {
    115       // let clike handle the content of ${...},
    116       // we take over again when "}" appears (see hooks).
    117       state.tokenize = null;
    118     } else {
    119       state.tokenize = tokenInterpolationIdentifier;
    120     }
    121     return null;
    122   }
    123 
    124   function tokenInterpolationIdentifier(stream, state) {
    125     stream.eatWhile(/[\w_]/);
    126     state.tokenize = popInterpolationStack(state);
    127     return "variable";
    128   }
    129 
    130   function tokenNestedComment(depth) {
    131     return function (stream, state) {
    132       var ch
    133       while (ch = stream.next()) {
    134         if (ch == "*" && stream.eat("/")) {
    135           if (depth == 1) {
    136             state.tokenize = null
    137             break
    138           } else {
    139             state.tokenize = tokenNestedComment(depth - 1)
    140             return state.tokenize(stream, state)
    141           }
    142         } else if (ch == "/" && stream.eat("*")) {
    143           state.tokenize = tokenNestedComment(depth + 1)
    144           return state.tokenize(stream, state)
    145         }
    146       }
    147       return "comment"
    148     }
    149   }
    150 
    151   CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins));
    152 
    153   // This is needed to make loading through meta.js work.
    154   CodeMirror.defineMode("dart", function(conf) {
    155     return CodeMirror.getMode(conf, "application/dart");
    156   }, "clike");
    157 });