@mapcss/preset-svg
Version:
SVG as CSS for MapCSS
61 lines (60 loc) • 1.56 kB
JavaScript
import { pico } from "./deps.js";
import tokenizer from "./tokenize.js";
let Input;
function registerInput(dependant) {
Input = dependant;
}
const HIGHLIGHT_THEME = {
"brackets": pico.cyan,
"at-word": pico.cyan,
"comment": pico.gray,
"string": pico.green,
"class": pico.yellow,
"hash": pico.magenta,
"call": pico.cyan,
"(": pico.cyan,
")": pico.cyan,
"{": pico.yellow,
"}": pico.yellow,
"[": pico.yellow,
"]": pico.yellow,
":": pico.yellow,
";": pico.yellow,
};
function getTokenType([type, value], processor) {
if (type === "word") {
if (value[0] === ".") {
return "class";
}
if (value[0] === "#") {
return "hash";
}
}
if (!processor.endOfFile()) {
let next = processor.nextToken();
processor.back(next);
if (next[0] === "brackets" || next[0] === "(")
return "call";
}
return type;
}
function terminalHighlight(css) {
let processor = tokenizer(new Input(css), { ignoreErrors: true });
let result = "";
while (!processor.endOfFile()) {
let token = processor.nextToken();
let color = HIGHLIGHT_THEME[getTokenType(token, processor)];
if (color) {
result += token[1]
.split(/\r?\n/)
.map((i) => color(i))
.join("\n");
}
else {
result += token[1];
}
}
return result;
}
terminalHighlight.registerInput = registerInput;
export default terminalHighlight;