Spaces:
Running
Running
let pico = require('picocolors') | |
let tokenizer = require('./tokenize') | |
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 | |
module.exports = terminalHighlight | |