Home | History | Annotate | Download | only in front_end
      1 /*
      2  * Copyright (C) 2013 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 WebInspector.CodeMirrorUtils = {
     32     /**
     33      * @param {string} mimeType
     34      * @return {function(string, function(string, string, number, number))}
     35      */
     36     createTokenizer: function(mimeType)
     37     {
     38         var mode = CodeMirror.getMode({indentUnit: 2}, mimeType);
     39         var state = CodeMirror.startState(mode);
     40         function tokenize(line, callback)
     41         {
     42             var stream = new CodeMirror.StringStream(line);
     43             while (!stream.eol()) {
     44                 var style = mode.token(stream, state);
     45                 var value = stream.current();
     46                 callback(value, style, stream.start, stream.start + value.length);
     47                 stream.start = stream.pos;
     48             }
     49         }
     50         return tokenize;
     51     },
     52 
     53     /**
     54      * @param {string} tokenType
     55      */
     56     convertTokenType: function(tokenType)
     57     {
     58         if (tokenType.startsWith("js-variable") || tokenType.startsWith("js-property") || tokenType === "js-def")
     59             return "javascript-ident";
     60         if (tokenType === "js-string-2")
     61             return "javascript-regexp";
     62         if (tokenType === "js-number" || tokenType === "js-comment" || tokenType === "js-string" || tokenType === "js-keyword")
     63             return "javascript-" + tokenType.substring("js-".length);
     64         if (tokenType === "css-number")
     65             return "css-number";
     66         return null;
     67     },
     68 
     69     /**
     70      * @param {string} modeName
     71      * @param {string} tokenPrefix
     72      */
     73     overrideModeWithPrefixedTokens: function(modeName, tokenPrefix)
     74     {
     75         var oldModeName = modeName + "-old";
     76         if (CodeMirror.modes[oldModeName])
     77             return;
     78 
     79         CodeMirror.defineMode(oldModeName, CodeMirror.modes[modeName]);
     80         CodeMirror.defineMode(modeName, modeConstructor);
     81 
     82         function modeConstructor(config, parserConfig)
     83         {
     84             var innerConfig = {};
     85             for (var i in parserConfig)
     86                 innerConfig[i] = parserConfig[i];
     87             innerConfig.name = oldModeName;
     88             var codeMirrorMode = CodeMirror.getMode(config, innerConfig);
     89             codeMirrorMode.name = modeName;
     90             codeMirrorMode.token = tokenOverride.bind(null, codeMirrorMode.token);
     91             return codeMirrorMode;
     92         }
     93 
     94         function tokenOverride(superToken, stream, state)
     95         {
     96             var token = superToken(stream, state);
     97             return token ? tokenPrefix + token : token;
     98         }
     99     }
    100 }
    101 
    102 WebInspector.CodeMirrorUtils.overrideModeWithPrefixedTokens("css-base", "css-");
    103 WebInspector.CodeMirrorUtils.overrideModeWithPrefixedTokens("javascript", "js-");
    104 WebInspector.CodeMirrorUtils.overrideModeWithPrefixedTokens("xml", "xml-");
    105