UNPKG

css-font-face-src

Version:

A CSS @font-face src property value parser

624 lines (623 loc) 20.7 kB
// Generated by peggy v. 2.0.1 (ts-pegjs plugin v. 3.0.0 ) // // https://peggyjs.org/ https://github.com/metadevpro/ts-pegjs "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = exports.PeggySyntaxError = void 0; let util = require("../util"); function peg$padEnd(str, targetLength, padString) { padString = padString || ' '; if (str.length > targetLength) { return str; } targetLength -= str.length; padString += padString.repeat(targetLength); return str + padString.slice(0, targetLength); } class PeggySyntaxError extends Error { static buildMessage(expected, found) { function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); } function literalEscape(s) { return s .replace(/\\/g, "\\\\") .replace(/"/g, "\\\"") .replace(/\0/g, "\\0") .replace(/\t/g, "\\t") .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/[\x00-\x0F]/g, (ch) => "\\x0" + hex(ch)) .replace(/[\x10-\x1F\x7F-\x9F]/g, (ch) => "\\x" + hex(ch)); } function classEscape(s) { return s .replace(/\\/g, "\\\\") .replace(/\]/g, "\\]") .replace(/\^/g, "\\^") .replace(/-/g, "\\-") .replace(/\0/g, "\\0") .replace(/\t/g, "\\t") .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/[\x00-\x0F]/g, (ch) => "\\x0" + hex(ch)) .replace(/[\x10-\x1F\x7F-\x9F]/g, (ch) => "\\x" + hex(ch)); } function describeExpectation(expectation) { switch (expectation.type) { case "literal": return "\"" + literalEscape(expectation.text) + "\""; case "class": const escapedParts = expectation.parts.map((part) => { return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part); }); return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; case "any": return "any character"; case "end": return "end of input"; case "other": return expectation.description; } } function describeExpected(expected1) { const descriptions = expected1.map(describeExpectation); let i; let j; descriptions.sort(); if (descriptions.length > 0) { for (i = 1, j = 1; i < descriptions.length; i++) { if (descriptions[i - 1] !== descriptions[i]) { descriptions[j] = descriptions[i]; j++; } } descriptions.length = j; } switch (descriptions.length) { case 1: return descriptions[0]; case 2: return descriptions[0] + " or " + descriptions[1]; default: return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; } } function describeFound(found1) { return found1 ? "\"" + literalEscape(found1) + "\"" : "end of input"; } return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; } constructor(message, expected, found, location) { super(); this.message = message; this.expected = expected; this.found = found; this.location = location; this.name = "PeggySyntaxError"; if (typeof Object.setPrototypeOf === "function") { Object.setPrototypeOf(this, PeggySyntaxError.prototype); } else { this.__proto__ = PeggySyntaxError.prototype; } if (typeof Error.captureStackTrace === "function") { Error.captureStackTrace(this, PeggySyntaxError); } } format(sources) { let str = 'Error: ' + this.message; if (this.location) { let src = null; let k; for (k = 0; k < sources.length; k++) { if (sources[k].grammarSource === this.location.source) { src = sources[k].text.split(/\r\n|\n|\r/g); break; } } let s = this.location.start; let loc = this.location.source + ':' + s.line + ':' + s.column; if (src) { let e = this.location.end; let filler = peg$padEnd('', s.line.toString().length, ' '); let line = src[s.line - 1]; let last = s.line === e.line ? e.column : line.length + 1; str += '\n --> ' + loc + '\n' + filler + ' |\n' + s.line + ' | ' + line + '\n' + filler + ' | ' + peg$padEnd('', s.column - 1, ' ') + peg$padEnd('', last - s.column, '^'); } else { str += '\n at ' + loc; } } return str; } } exports.PeggySyntaxError = PeggySyntaxError; function peg$parse(input, options) { options = options !== undefined ? options : {}; const peg$FAILED = {}; const peg$source = options.grammarSource; const peg$startRuleFunctions = { start: peg$parsestart }; let peg$startRuleFunction = peg$parsestart; const peg$c0 = ""; const peg$c1 = function () { return []; }; const peg$c2 = ","; const peg$c3 = peg$literalExpectation(",", false); const peg$c4 = function (x, xs) { return [x].concat(xs); }; const peg$c5 = function (entry) { return [entry]; }; const peg$c6 = function (url, format) { return { url: url, format: format }; }; const peg$c7 = function (url) { return { url: url }; }; const peg$c8 = "url("; const peg$c9 = peg$literalExpectation("url(", false); const peg$c10 = ")"; const peg$c11 = peg$literalExpectation(")", false); const peg$c12 = function (value) { return value; }; const peg$c13 = "format("; const peg$c14 = peg$literalExpectation("format(", false); const peg$c15 = "local("; const peg$c16 = peg$literalExpectation("local(", false); const peg$c17 = function (value) { return { local: value }; }; const peg$c18 = /^[^)]/; const peg$c19 = peg$classExpectation([")"], true, false); const peg$c20 = function (chars) { return util.extractValue(chars.join("")); }; const peg$c21 = /^[ \t\r\n\f]/; const peg$c22 = peg$classExpectation([" ", "\t", "\r", "\n", "\f"], false, false); let peg$currPos = 0; let peg$savedPos = 0; const peg$posDetailsCache = [{ line: 1, column: 1 }]; let peg$maxFailPos = 0; let peg$maxFailExpected = []; let peg$silentFails = 0; let peg$result; if (options.startRule !== undefined) { if (!(options.startRule in peg$startRuleFunctions)) { throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); } peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; } function text() { return input.substring(peg$savedPos, peg$currPos); } function location() { return peg$computeLocation(peg$savedPos, peg$currPos); } function expected(description, location1) { location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos); throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location1); } function error(message, location1) { location1 = location1 !== undefined ? location1 : peg$computeLocation(peg$savedPos, peg$currPos); throw peg$buildSimpleError(message, location1); } function peg$literalExpectation(text1, ignoreCase) { return { type: "literal", text: text1, ignoreCase: ignoreCase }; } function peg$classExpectation(parts, inverted, ignoreCase) { return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; } function peg$anyExpectation() { return { type: "any" }; } function peg$endExpectation() { return { type: "end" }; } function peg$otherExpectation(description) { return { type: "other", description: description }; } function peg$computePosDetails(pos) { let details = peg$posDetailsCache[pos]; let p; if (details) { return details; } else { p = pos - 1; while (!peg$posDetailsCache[p]) { p--; } details = peg$posDetailsCache[p]; details = { line: details.line, column: details.column }; while (p < pos) { if (input.charCodeAt(p) === 10) { details.line++; details.column = 1; } else { details.column++; } p++; } peg$posDetailsCache[pos] = details; return details; } } function peg$computeLocation(startPos, endPos) { const startPosDetails = peg$computePosDetails(startPos); const endPosDetails = peg$computePosDetails(endPos); return { source: peg$source, start: { offset: startPos, line: startPosDetails.line, column: startPosDetails.column }, end: { offset: endPos, line: endPosDetails.line, column: endPosDetails.column } }; } function peg$fail(expected1) { if (peg$currPos < peg$maxFailPos) { return; } if (peg$currPos > peg$maxFailPos) { peg$maxFailPos = peg$currPos; peg$maxFailExpected = []; } peg$maxFailExpected.push(expected1); } function peg$buildSimpleError(message, location1) { return new PeggySyntaxError(message, [], "", location1); } function peg$buildStructuredError(expected1, found, location1) { return new PeggySyntaxError(PeggySyntaxError.buildMessage(expected1, found), expected1, found, location1); } function peg$parsestart() { let s0, s1; s0 = peg$parsesourceEntries(); if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$c0; if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c1(); } s0 = s1; } return s0; } function peg$parsesourceEntries() { let s0, s1, s2, s3, s4, s5; s0 = peg$currPos; s1 = peg$parsesourceEntry(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$parsewhitespace(); while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$parsewhitespace(); } if (s2 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 44) { s3 = peg$c2; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c3); } } if (s3 !== peg$FAILED) { s4 = []; s5 = peg$parsewhitespace(); while (s5 !== peg$FAILED) { s4.push(s5); s5 = peg$parsewhitespace(); } if (s4 !== peg$FAILED) { s5 = peg$parsesourceEntries(); if (s5 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c4(s1, s5); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parsesourceEntry(); if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c5(s1); } s0 = s1; } return s0; } function peg$parsesourceEntry() { let s0; s0 = peg$parseurlEntry(); if (s0 === peg$FAILED) { s0 = peg$parselocalEntry(); } return s0; } function peg$parseurlEntry() { let s0, s1, s2, s3; s0 = peg$currPos; s1 = peg$parseurl(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$parsewhitespace(); while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$parsewhitespace(); } if (s2 !== peg$FAILED) { s3 = peg$parseformat(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c6(s1, s3); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseurl(); if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c7(s1); } s0 = s1; } return s0; } function peg$parseurl() { let s0, s1, s2, s3; s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c8) { s1 = peg$c8; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c9); } } if (s1 !== peg$FAILED) { s2 = peg$parsevalue(); if (s2 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 41) { s3 = peg$c10; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c11); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c12(s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } return s0; } function peg$parseformat() { let s0, s1, s2, s3; s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c13) { s1 = peg$c13; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c14); } } if (s1 !== peg$FAILED) { s2 = peg$parsevalue(); if (s2 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 41) { s3 = peg$c10; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c11); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c12(s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } return s0; } function peg$parselocalEntry() { let s0, s1, s2, s3; s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c15) { s1 = peg$c15; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c16); } } if (s1 !== peg$FAILED) { s2 = peg$parsevalue(); if (s2 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 41) { s3 = peg$c10; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c11); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c17(s2); s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } return s0; } function peg$parsevalue() { let s0, s1, s2; s0 = peg$currPos; s1 = []; if (peg$c18.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c19); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { s1.push(s2); if (peg$c18.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c19); } } } } else { s1 = peg$FAILED; } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$c20(s1); } s0 = s1; return s0; } function peg$parsewhitespace() { let s0; if (peg$c21.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c22); } } return s0; } peg$result = peg$startRuleFunction(); if (peg$result !== peg$FAILED && peg$currPos === input.length) { return peg$result; } else { if (peg$result !== peg$FAILED && peg$currPos < input.length) { peg$fail(peg$endExpectation()); } throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)); } } exports.parse = peg$parse;