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
61
62
63
64
65
66
67
68
69
70
| 'use strict'
|
| let pico = require('picocolors')
|
| let tokenizer = require('./tokenize')
|
| let Input
|
| function registerInput(dependant) {
| Input = dependant
| }
|
| const HIGHLIGHT_THEME = {
| ';': pico.yellow,
| ':': pico.yellow,
| '(': pico.cyan,
| ')': pico.cyan,
| '[': pico.yellow,
| ']': pico.yellow,
| '{': pico.yellow,
| '}': pico.yellow,
| 'at-word': pico.cyan,
| 'brackets': pico.cyan,
| 'call': pico.cyan,
| 'class': pico.yellow,
| 'comment': pico.gray,
| 'hash': pico.magenta,
| 'string': pico.green
| }
|
| 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
|
|