123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 'use strict'
-
- let pico = require('picocolors')
-
- let terminalHighlight = require('./terminal-highlight')
-
- class CssSyntaxError extends Error {
- constructor(message, line, column, source, file, plugin) {
- super(message)
- this.name = 'CssSyntaxError'
- this.reason = message
-
- if (file) {
- this.file = file
- }
- if (source) {
- this.source = source
- }
- if (plugin) {
- this.plugin = plugin
- }
- if (typeof line !== 'undefined' && typeof column !== 'undefined') {
- if (typeof line === 'number') {
- this.line = line
- this.column = column
- } else {
- this.line = line.line
- this.column = line.column
- this.endLine = column.line
- this.endColumn = column.column
- }
- }
-
- this.setMessage()
-
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, CssSyntaxError)
- }
- }
-
- setMessage() {
- this.message = this.plugin ? this.plugin + ': ' : ''
- this.message += this.file ? this.file : '<css input>'
- if (typeof this.line !== 'undefined') {
- this.message += ':' + this.line + ':' + this.column
- }
- this.message += ': ' + this.reason
- }
-
- showSourceCode(color) {
- if (!this.source) return ''
-
- let css = this.source
- if (color == null) color = pico.isColorSupported
- if (terminalHighlight) {
- if (color) css = terminalHighlight(css)
- }
-
- let lines = css.split(/\r?\n/)
- let start = Math.max(this.line - 3, 0)
- let end = Math.min(this.line + 2, lines.length)
-
- let maxWidth = String(end).length
-
- let mark, aside
- if (color) {
- let { bold, gray, red } = pico.createColors(true)
- mark = text => bold(red(text))
- aside = text => gray(text)
- } else {
- mark = aside = str => str
- }
-
- return lines
- .slice(start, end)
- .map((line, index) => {
- let number = start + 1 + index
- let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '
- if (number === this.line) {
- let spacing =
- aside(gutter.replace(/\d/g, ' ')) +
- line.slice(0, this.column - 1).replace(/[^\t]/g, ' ')
- return mark('>') + aside(gutter) + line + '\n ' + spacing + mark('^')
- }
- return ' ' + aside(gutter) + line
- })
- .join('\n')
- }
-
- toString() {
- let code = this.showSourceCode()
- if (code) {
- code = '\n\n' + code + '\n'
- }
- return this.name + ': ' + this.message + code
- }
- }
-
- module.exports = CssSyntaxError
- CssSyntaxError.default = CssSyntaxError
|