| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | // CodeMirror, copyright (c) by Marijn Haverbeke and others// Distributed under an MIT license: https://codemirror.net/LICENSE(function(mod) {  if (typeof exports == "object" && typeof module == "object") // CommonJS    mod(require("../../lib/codemirror"), require("../clike/clike"));  else if (typeof define == "function" && define.amd) // AMD    define(["../../lib/codemirror", "../clike/clike"], mod);  else // Plain browser env    mod(CodeMirror);})(function(CodeMirror) {  "use strict";  var keywords = ("this super static final const abstract class extends external factory " +    "implements mixin get native set typedef with enum throw rethrow " +    "assert break case continue default in return new deferred async await covariant " +    "try catch finally do else for if switch while import library export " +    "part of show hide is as extension on yield late required").split(" ");  var blockKeywords = "try catch finally do else for if switch while".split(" ");  var atoms = "true false null".split(" ");  var builtins = "void bool num int double dynamic var String Null Never".split(" ");  function set(words) {    var obj = {};    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;    return obj;  }  function pushInterpolationStack(state) {    (state.interpolationStack || (state.interpolationStack = [])).push(state.tokenize);  }  function popInterpolationStack(state) {    return (state.interpolationStack || (state.interpolationStack = [])).pop();  }  function sizeInterpolationStack(state) {    return state.interpolationStack ? state.interpolationStack.length : 0;  }  CodeMirror.defineMIME("application/dart", {    name: "clike",    keywords: set(keywords),    blockKeywords: set(blockKeywords),    builtin: set(builtins),    atoms: set(atoms),    hooks: {      "@": function(stream) {        stream.eatWhile(/[\w\$_\.]/);        return "meta";      },      // custom string handling to deal with triple-quoted strings and string interpolation      "'": function(stream, state) {        return tokenString("'", stream, state, false);      },      "\"": function(stream, state) {        return tokenString("\"", stream, state, false);      },      "r": function(stream, state) {        var peek = stream.peek();        if (peek == "'" || peek == "\"") {          return tokenString(stream.next(), stream, state, true);        }        return false;      },      "}": function(_stream, state) {        // "}" is end of interpolation, if interpolation stack is non-empty        if (sizeInterpolationStack(state) > 0) {          state.tokenize = popInterpolationStack(state);          return null;        }        return false;      },      "/": function(stream, state) {        if (!stream.eat("*")) return false        state.tokenize = tokenNestedComment(1)        return state.tokenize(stream, state)      },      token: function(stream, _, style) {        if (style == "variable") {          // Assume uppercase symbols are classes using variable-2          var isUpper = RegExp('^[_$]*[A-Z][a-zA-Z0-9_$]*$','g');          if (isUpper.test(stream.current())) {            return 'variable-2';          }        }      }    }  });  function tokenString(quote, stream, state, raw) {    var tripleQuoted = false;    if (stream.eat(quote)) {      if (stream.eat(quote)) tripleQuoted = true;      else return "string"; //empty string    }    function tokenStringHelper(stream, state) {      var escaped = false;      while (!stream.eol()) {        if (!raw && !escaped && stream.peek() == "$") {          pushInterpolationStack(state);          state.tokenize = tokenInterpolation;          return "string";        }        var next = stream.next();        if (next == quote && !escaped && (!tripleQuoted || stream.match(quote + quote))) {          state.tokenize = null;          break;        }        escaped = !raw && !escaped && next == "\\";      }      return "string";    }    state.tokenize = tokenStringHelper;    return tokenStringHelper(stream, state);  }  function tokenInterpolation(stream, state) {    stream.eat("$");    if (stream.eat("{")) {      // let clike handle the content of ${...},      // we take over again when "}" appears (see hooks).      state.tokenize = null;    } else {      state.tokenize = tokenInterpolationIdentifier;    }    return null;  }  function tokenInterpolationIdentifier(stream, state) {    stream.eatWhile(/[\w_]/);    state.tokenize = popInterpolationStack(state);    return "variable";  }  function tokenNestedComment(depth) {    return function (stream, state) {      var ch      while (ch = stream.next()) {        if (ch == "*" && stream.eat("/")) {          if (depth == 1) {            state.tokenize = null            break          } else {            state.tokenize = tokenNestedComment(depth - 1)            return state.tokenize(stream, state)          }        } else if (ch == "/" && stream.eat("*")) {          state.tokenize = tokenNestedComment(depth + 1)          return state.tokenize(stream, state)        }      }      return "comment"    }  }  CodeMirror.registerHelper("hintWords", "application/dart", keywords.concat(atoms).concat(builtins));  // This is needed to make loading through meta.js work.  CodeMirror.defineMode("dart", function(conf) {    return CodeMirror.getMode(conf, "application/dart");  }, "clike");});
 |