You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			101 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | '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 |