forked from postcss/postcss
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathterminal-highlight.es6
60 lines (53 loc) · 1.26 KB
/
terminal-highlight.es6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import chalk from 'chalk'
import tokenizer from './tokenize'
import Input from './input'
const HIGHLIGHT_THEME = {
'brackets': chalk.cyan,
'at-word': chalk.cyan,
'comment': chalk.gray,
'string': chalk.green,
'class': chalk.yellow,
'call': chalk.cyan,
'hash': chalk.magenta,
'(': chalk.cyan,
')': chalk.cyan,
'{': chalk.yellow,
'}': chalk.yellow,
'[': chalk.yellow,
']': chalk.yellow,
':': chalk.yellow,
';': chalk.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
}
export default terminalHighlight