diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-13 21:34:48 -0800 |
| commit | 76cb9c2a39d477a64824a985ade40507e3bbade1 (patch) | |
| tree | 41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/css-tree/cjs/parser/SyntaxError.cjs | |
| parent | 819a39a21ac992b1393244a4c283bbb125208c69 (diff) | |
| download | neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2 neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip | |
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/css-tree/cjs/parser/SyntaxError.cjs')
| -rw-r--r-- | vanilla/node_modules/css-tree/cjs/parser/SyntaxError.cjs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/vanilla/node_modules/css-tree/cjs/parser/SyntaxError.cjs b/vanilla/node_modules/css-tree/cjs/parser/SyntaxError.cjs new file mode 100644 index 0000000..4de5ab3 --- /dev/null +++ b/vanilla/node_modules/css-tree/cjs/parser/SyntaxError.cjs @@ -0,0 +1,74 @@ +'use strict'; + +const createCustomError = require('../utils/create-custom-error.cjs'); + +const MAX_LINE_LENGTH = 100; +const OFFSET_CORRECTION = 60; +const TAB_REPLACEMENT = ' '; + +function sourceFragment({ source, line, column, baseLine, baseColumn }, extraLines) { + function processLines(start, end) { + return lines + .slice(start, end) + .map((line, idx) => + String(start + idx + 1).padStart(maxNumLength) + ' |' + line + ).join('\n'); + } + + const prelines = '\n'.repeat(Math.max(baseLine - 1, 0)); + const precolumns = ' '.repeat(Math.max(baseColumn - 1, 0)); + const lines = (prelines + precolumns + source).split(/\r\n?|\n|\f/); + const startLine = Math.max(1, line - extraLines) - 1; + const endLine = Math.min(line + extraLines, lines.length + 1); + const maxNumLength = Math.max(4, String(endLine).length) + 1; + let cutLeft = 0; + + // column correction according to replaced tab before column + column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\t/g) || []).length; + + if (column > MAX_LINE_LENGTH) { + cutLeft = column - OFFSET_CORRECTION + 3; + column = OFFSET_CORRECTION - 2; + } + + for (let i = startLine; i <= endLine; i++) { + if (i >= 0 && i < lines.length) { + lines[i] = lines[i].replace(/\t/g, TAB_REPLACEMENT); + lines[i] = + (cutLeft > 0 && lines[i].length > cutLeft ? '\u2026' : '') + + lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) + + (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? '\u2026' : ''); + } + } + + return [ + processLines(startLine, line), + new Array(column + maxNumLength + 2).join('-') + '^', + processLines(line, endLine) + ].filter(Boolean) + .join('\n') + .replace(/^(\s+\d+\s+\|\n)+/, '') + .replace(/\n(\s+\d+\s+\|)+$/, ''); +} + +function SyntaxError(message, source, offset, line, column, baseLine = 1, baseColumn = 1) { + const error = Object.assign(createCustomError.createCustomError('SyntaxError', message), { + source, + offset, + line, + column, + sourceFragment(extraLines) { + return sourceFragment({ source, line, column, baseLine, baseColumn }, isNaN(extraLines) ? 0 : extraLines); + }, + get formattedMessage() { + return ( + `Parse error: ${message}\n` + + sourceFragment({ source, line, column, baseLine, baseColumn }, 2) + ); + } + }); + + return error; +} + +exports.SyntaxError = SyntaxError; |
