Blame view

node_modules/postcss/lib/terminal-highlight.js 1.37 KB
7820380e   “wangming”   1
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