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 31WebInspector.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 102WebInspector.CodeMirrorUtils.overrideModeWithPrefixedTokens("css-base", "css-"); 103WebInspector.CodeMirrorUtils.overrideModeWithPrefixedTokens("javascript", "js-"); 104WebInspector.CodeMirrorUtils.overrideModeWithPrefixedTokens("xml", "xml-"); 105