summaryrefslogtreecommitdiff
path: root/node_modules/postcss/lib/terminal-highlight.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/postcss/lib/terminal-highlight.js')
-rw-r--r--node_modules/postcss/lib/terminal-highlight.js70
1 files changed, 70 insertions, 0 deletions
diff --git a/node_modules/postcss/lib/terminal-highlight.js b/node_modules/postcss/lib/terminal-highlight.js
new file mode 100644
index 0000000..6196c9d
--- /dev/null
+++ b/node_modules/postcss/lib/terminal-highlight.js
@@ -0,0 +1,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