You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.4 KiB
70 lines
1.4 KiB
'use strict' |
|
|
|
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
|
|
|