Show More
cmake.js
97 lines
| 2.5 KiB
| application/javascript
|
JavascriptLexer
r1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others | |||
// Distributed under an MIT license: http://codemirror.net/LICENSE | ||||
(function(mod) { | ||||
if (typeof exports == "object" && typeof module == "object") | ||||
mod(require("../../lib/codemirror")); | ||||
else if (typeof define == "function" && define.amd) | ||||
define(["../../lib/codemirror"], mod); | ||||
else | ||||
mod(CodeMirror); | ||||
})(function(CodeMirror) { | ||||
"use strict"; | ||||
CodeMirror.defineMode("cmake", function () { | ||||
var variable_regex = /({)?[a-zA-Z0-9_]+(})?/; | ||||
function tokenString(stream, state) { | ||||
var current, prev, found_var = false; | ||||
while (!stream.eol() && (current = stream.next()) != state.pending) { | ||||
if (current === '$' && prev != '\\' && state.pending == '"') { | ||||
found_var = true; | ||||
break; | ||||
} | ||||
prev = current; | ||||
} | ||||
if (found_var) { | ||||
stream.backUp(1); | ||||
} | ||||
if (current == state.pending) { | ||||
state.continueString = false; | ||||
} else { | ||||
state.continueString = true; | ||||
} | ||||
return "string"; | ||||
} | ||||
function tokenize(stream, state) { | ||||
var ch = stream.next(); | ||||
// Have we found a variable? | ||||
if (ch === '$') { | ||||
if (stream.match(variable_regex)) { | ||||
return 'variable-2'; | ||||
} | ||||
return 'variable'; | ||||
} | ||||
// Should we still be looking for the end of a string? | ||||
if (state.continueString) { | ||||
// If so, go through the loop again | ||||
stream.backUp(1); | ||||
return tokenString(stream, state); | ||||
} | ||||
// Do we just have a function on our hands? | ||||
// In 'cmake_minimum_required (VERSION 2.8.8)', 'cmake_minimum_required' is matched | ||||
if (stream.match(/(\s+)?\w+\(/) || stream.match(/(\s+)?\w+\ \(/)) { | ||||
stream.backUp(1); | ||||
return 'def'; | ||||
} | ||||
if (ch == "#") { | ||||
stream.skipToEnd(); | ||||
return "comment"; | ||||
} | ||||
// Have we found a string? | ||||
if (ch == "'" || ch == '"') { | ||||
// Store the type (single or double) | ||||
state.pending = ch; | ||||
// Perform the looping function to find the end | ||||
return tokenString(stream, state); | ||||
} | ||||
if (ch == '(' || ch == ')') { | ||||
return 'bracket'; | ||||
} | ||||
if (ch.match(/[0-9]/)) { | ||||
return 'number'; | ||||
} | ||||
stream.eatWhile(/[\w-]/); | ||||
return null; | ||||
} | ||||
return { | ||||
startState: function () { | ||||
var state = {}; | ||||
state.inDefinition = false; | ||||
state.inInclude = false; | ||||
state.continueString = false; | ||||
state.pending = false; | ||||
return state; | ||||
}, | ||||
token: function (stream, state) { | ||||
if (stream.eatSpace()) return null; | ||||
return tokenize(stream, state); | ||||
} | ||||
}; | ||||
}); | ||||
CodeMirror.defineMIME("text/x-cmake", "cmake"); | ||||
}); | ||||