1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627 |
- "use strict";
- const CC_LINE_FEED = "\n".charCodeAt(0);
- const CC_CARRIAGE_RETURN = "\r".charCodeAt(0);
- const CC_FORM_FEED = "\f".charCodeAt(0);
- const CC_TAB = "\t".charCodeAt(0);
- const CC_SPACE = " ".charCodeAt(0);
- const CC_SOLIDUS = "/".charCodeAt(0);
- const CC_REVERSE_SOLIDUS = "\\".charCodeAt(0);
- const CC_ASTERISK = "*".charCodeAt(0);
- const CC_LEFT_PARENTHESIS = "(".charCodeAt(0);
- const CC_RIGHT_PARENTHESIS = ")".charCodeAt(0);
- const CC_LEFT_CURLY = "{".charCodeAt(0);
- const CC_RIGHT_CURLY = "}".charCodeAt(0);
- const CC_LEFT_SQUARE = "[".charCodeAt(0);
- const CC_RIGHT_SQUARE = "]".charCodeAt(0);
- const CC_QUOTATION_MARK = '"'.charCodeAt(0);
- const CC_APOSTROPHE = "'".charCodeAt(0);
- const CC_FULL_STOP = ".".charCodeAt(0);
- const CC_COLON = ":".charCodeAt(0);
- const CC_SEMICOLON = ";".charCodeAt(0);
- const CC_COMMA = ",".charCodeAt(0);
- const CC_PERCENTAGE = "%".charCodeAt(0);
- const CC_AT_SIGN = "@".charCodeAt(0);
- const CC_LOW_LINE = "_".charCodeAt(0);
- const CC_LOWER_A = "a".charCodeAt(0);
- const CC_LOWER_F = "f".charCodeAt(0);
- const CC_LOWER_E = "e".charCodeAt(0);
- const CC_LOWER_U = "u".charCodeAt(0);
- const CC_LOWER_Z = "z".charCodeAt(0);
- const CC_UPPER_A = "A".charCodeAt(0);
- const CC_UPPER_F = "F".charCodeAt(0);
- const CC_UPPER_E = "E".charCodeAt(0);
- const CC_UPPER_U = "E".charCodeAt(0);
- const CC_UPPER_Z = "Z".charCodeAt(0);
- const CC_0 = "0".charCodeAt(0);
- const CC_9 = "9".charCodeAt(0);
- const CC_NUMBER_SIGN = "#".charCodeAt(0);
- const CC_PLUS_SIGN = "+".charCodeAt(0);
- const CC_HYPHEN_MINUS = "-".charCodeAt(0);
- const CC_LESS_THAN_SIGN = "<".charCodeAt(0);
- const CC_GREATER_THAN_SIGN = ">".charCodeAt(0);
- const consumeSpace = (input, pos, _callbacks) => {
-
- while (_isWhiteSpace(input.charCodeAt(pos))) {
- pos++;
- }
-
- return pos;
- };
- const _isNewline = cc =>
- cc === CC_LINE_FEED || cc === CC_CARRIAGE_RETURN || cc === CC_FORM_FEED;
- const consumeExtraNewline = (cc, input, pos) => {
- if (cc === CC_CARRIAGE_RETURN && input.charCodeAt(pos) === CC_LINE_FEED) {
- pos++;
- }
- return pos;
- };
- const _isSpace = cc => cc === CC_TAB || cc === CC_SPACE;
- const _isWhiteSpace = cc => _isNewline(cc) || _isSpace(cc);
- const isIdentStartCodePoint = cc =>
- (cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
- (cc >= CC_UPPER_A && cc <= CC_UPPER_Z) ||
- cc === CC_LOW_LINE ||
- cc >= 0x80;
- const consumeDelimToken = (input, pos, _callbacks) =>
-
- pos;
- const consumeComments = (input, pos, callbacks) => {
-
-
-
-
-
- while (
- input.charCodeAt(pos) === CC_SOLIDUS &&
- input.charCodeAt(pos + 1) === CC_ASTERISK
- ) {
- const start = pos;
- pos += 2;
- for (;;) {
- if (pos === input.length) {
-
- return pos;
- }
- if (
- input.charCodeAt(pos) === CC_ASTERISK &&
- input.charCodeAt(pos + 1) === CC_SOLIDUS
- ) {
- pos += 2;
- if (callbacks.comment) {
- pos = callbacks.comment(input, start, pos);
- }
- break;
- }
- pos++;
- }
- }
- return pos;
- };
- const _isHexDigit = cc =>
- _isDigit(cc) ||
- (cc >= CC_UPPER_A && cc <= CC_UPPER_F) ||
- (cc >= CC_LOWER_A && cc <= CC_LOWER_F);
- const _consumeAnEscapedCodePoint = (input, pos) => {
-
-
-
-
- const cc = input.charCodeAt(pos);
- pos++;
-
-
- if (pos === input.length) {
- return pos;
- }
-
-
-
-
-
-
-
- if (_isHexDigit(cc)) {
- for (let i = 0; i < 5; i++) {
- if (_isHexDigit(input.charCodeAt(pos))) {
- pos++;
- }
- }
- const cc = input.charCodeAt(pos);
- if (_isWhiteSpace(cc)) {
- pos++;
- pos = consumeExtraNewline(cc, input, pos);
- }
- return pos;
- }
-
-
- return pos;
- };
- const consumeAStringToken = (input, pos, callbacks) => {
-
-
-
-
-
- const start = pos - 1;
- const endingCodePoint = input.charCodeAt(pos - 1);
-
-
- for (;;) {
-
-
- if (pos === input.length) {
- if (callbacks.string !== undefined) {
- return callbacks.string(input, start, pos);
- }
- return pos;
- }
- const cc = input.charCodeAt(pos);
- pos++;
-
-
- if (cc === endingCodePoint) {
- if (callbacks.string !== undefined) {
- return callbacks.string(input, start, pos);
- }
- return pos;
- }
-
-
-
- else if (_isNewline(cc)) {
- pos--;
-
- return pos;
- }
-
- else if (cc === CC_REVERSE_SOLIDUS) {
-
- if (pos === input.length) {
- return pos;
- }
-
- else if (_isNewline(input.charCodeAt(pos))) {
- const cc = input.charCodeAt(pos);
- pos++;
- pos = consumeExtraNewline(cc, input, pos);
- }
-
- else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
- pos = _consumeAnEscapedCodePoint(input, pos);
- }
- }
-
-
- else {
-
- }
- }
- };
- const isNonASCIICodePoint = (cc, q) =>
-
- cc > 0x80;
- const isLetter = cc =>
- (cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
- (cc >= CC_UPPER_A && cc <= CC_UPPER_Z);
- const _isIdentStartCodePoint = (cc, q) =>
- isLetter(cc) || isNonASCIICodePoint(cc, q) || cc === CC_LOW_LINE;
- const _isIdentCodePoint = (cc, q) =>
- _isIdentStartCodePoint(cc, q) || _isDigit(cc) || cc === CC_HYPHEN_MINUS;
- const _isDigit = cc => cc >= CC_0 && cc <= CC_9;
- const _ifTwoCodePointsAreValidEscape = (input, pos, f, s) => {
-
-
-
-
- const first = f || input.charCodeAt(pos - 1);
- const second = s || input.charCodeAt(pos);
-
- if (first !== CC_REVERSE_SOLIDUS) return false;
-
- if (_isNewline(second)) return false;
-
- return true;
- };
- const _ifThreeCodePointsWouldStartAnIdentSequence = (input, pos, f, s, t) => {
-
-
-
-
- const first = f || input.charCodeAt(pos - 1);
- const second = s || input.charCodeAt(pos);
- const third = t || input.charCodeAt(pos + 1);
-
-
- if (first === CC_HYPHEN_MINUS) {
-
-
- if (
- _isIdentStartCodePoint(second, pos) ||
- second === CC_HYPHEN_MINUS ||
- _ifTwoCodePointsAreValidEscape(input, pos, second, third)
- ) {
- return true;
- }
- return false;
- }
-
- else if (_isIdentStartCodePoint(first, pos - 1)) {
- return true;
- }
-
-
- else if (first === CC_REVERSE_SOLIDUS) {
- if (_ifTwoCodePointsAreValidEscape(input, pos, first, second)) {
- return true;
- }
- return false;
- }
-
-
- return false;
- };
- const _ifThreeCodePointsWouldStartANumber = (input, pos, f, s, t) => {
-
-
-
-
- const first = f || input.charCodeAt(pos - 1);
- const second = s || input.charCodeAt(pos);
- const third = t || input.charCodeAt(pos);
-
-
-
-
-
-
-
- if (first === CC_PLUS_SIGN || first === CC_HYPHEN_MINUS) {
- if (_isDigit(second)) {
- return true;
- } else if (second === CC_FULL_STOP && _isDigit(third)) {
- return true;
- }
- return false;
- }
-
-
- else if (first === CC_FULL_STOP) {
- if (_isDigit(second)) {
- return true;
- }
- return false;
- }
-
-
- else if (_isDigit(first)) {
- return true;
- }
-
-
- return false;
- };
- const consumeNumberSign = (input, pos, callbacks) => {
-
-
-
-
-
- const start = pos - 1;
- const first = input.charCodeAt(pos);
- const second = input.charCodeAt(pos + 1);
- if (
- _isIdentCodePoint(first, pos - 1) ||
- _ifTwoCodePointsAreValidEscape(input, pos, first, second)
- ) {
- const third = input.charCodeAt(pos + 2);
- let isId = false;
- if (
- _ifThreeCodePointsWouldStartAnIdentSequence(
- input,
- pos,
- first,
- second,
- third
- )
- ) {
- isId = true;
- }
- pos = _consumeAnIdentSequence(input, pos, callbacks);
- if (callbacks.hash !== undefined) {
- return callbacks.hash(input, start, pos, isId);
- }
- return pos;
- }
-
- return pos;
- };
- const consumeHyphenMinus = (input, pos, callbacks) => {
-
- if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
- pos--;
- return consumeANumericToken(input, pos, callbacks);
- }
-
- else if (
- input.charCodeAt(pos) === CC_HYPHEN_MINUS &&
- input.charCodeAt(pos + 1) === CC_GREATER_THAN_SIGN
- ) {
- return pos + 2;
- }
-
- else if (_ifThreeCodePointsWouldStartAnIdentSequence(input, pos)) {
- pos--;
- return consumeAnIdentLikeToken(input, pos, callbacks);
- }
-
- return pos;
- };
- const consumeFullStop = (input, pos, callbacks) => {
- const start = pos - 1;
-
- if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
- pos--;
- return consumeANumericToken(input, pos, callbacks);
- }
-
- if (callbacks.delim !== undefined) {
- return callbacks.delim(input, start, pos);
- }
- return pos;
- };
- const consumePlusSign = (input, pos, callbacks) => {
-
- if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
- pos--;
- return consumeANumericToken(input, pos, callbacks);
- }
-
- return pos;
- };
- const _consumeANumber = (input, pos) => {
-
-
-
-
-
- if (
- input.charCodeAt(pos) === CC_HYPHEN_MINUS ||
- input.charCodeAt(pos) === CC_PLUS_SIGN
- ) {
- pos++;
- }
-
- while (_isDigit(input.charCodeAt(pos))) {
- pos++;
- }
-
-
-
-
- if (
- input.charCodeAt(pos) === CC_FULL_STOP &&
- _isDigit(input.charCodeAt(pos + 1))
- ) {
- pos++;
- while (_isDigit(input.charCodeAt(pos))) {
- pos++;
- }
- }
-
-
-
-
-
- if (
- (input.charCodeAt(pos) === CC_LOWER_E ||
- input.charCodeAt(pos) === CC_UPPER_E) &&
- (((input.charCodeAt(pos + 1) === CC_HYPHEN_MINUS ||
- input.charCodeAt(pos + 1) === CC_PLUS_SIGN) &&
- _isDigit(input.charCodeAt(pos + 2))) ||
- _isDigit(input.charCodeAt(pos + 1)))
- ) {
- pos++;
- if (
- input.charCodeAt(pos) === CC_PLUS_SIGN ||
- input.charCodeAt(pos) === CC_HYPHEN_MINUS
- ) {
- pos++;
- }
- while (_isDigit(input.charCodeAt(pos))) {
- pos++;
- }
- }
-
-
-
- return pos;
- };
- const consumeANumericToken = (input, pos, callbacks) => {
-
-
-
- pos = _consumeANumber(input, pos, callbacks);
-
-
-
-
-
- const first = input.charCodeAt(pos);
- const second = input.charCodeAt(pos + 1);
- const third = input.charCodeAt(pos + 2);
- if (
- _ifThreeCodePointsWouldStartAnIdentSequence(
- input,
- pos,
- first,
- second,
- third
- )
- ) {
- return _consumeAnIdentSequence(input, pos, callbacks);
- }
-
-
- else if (first === CC_PERCENTAGE) {
- return pos + 1;
- }
-
- return pos;
- };
- const consumeColon = (input, pos, callbacks) => {
-
- if (callbacks.colon !== undefined) {
- return callbacks.colon(input, pos - 1, pos);
- }
- return pos;
- };
- const consumeLeftParenthesis = (input, pos, callbacks) => {
-
- if (callbacks.leftParenthesis !== undefined) {
- return callbacks.leftParenthesis(input, pos - 1, pos);
- }
- return pos;
- };
- const consumeRightParenthesis = (input, pos, callbacks) => {
-
- if (callbacks.rightParenthesis !== undefined) {
- return callbacks.rightParenthesis(input, pos - 1, pos);
- }
- return pos;
- };
- const consumeLeftSquareBracket = (input, pos, callbacks) =>
-
- pos;
- const consumeRightSquareBracket = (input, pos, callbacks) =>
-
- pos;
- const consumeLeftCurlyBracket = (input, pos, callbacks) => {
-
- if (callbacks.leftCurlyBracket !== undefined) {
- return callbacks.leftCurlyBracket(input, pos - 1, pos);
- }
- return pos;
- };
- const consumeRightCurlyBracket = (input, pos, callbacks) => {
-
- if (callbacks.rightCurlyBracket !== undefined) {
- return callbacks.rightCurlyBracket(input, pos - 1, pos);
- }
- return pos;
- };
- const consumeSemicolon = (input, pos, callbacks) => {
-
- if (callbacks.semicolon !== undefined) {
- return callbacks.semicolon(input, pos - 1, pos);
- }
- return pos;
- };
- const consumeComma = (input, pos, callbacks) => {
-
- if (callbacks.comma !== undefined) {
- return callbacks.comma(input, pos - 1, pos);
- }
- return pos;
- };
- const _consumeAnIdentSequence = (input, pos) => {
-
-
-
-
-
-
- for (;;) {
- const cc = input.charCodeAt(pos);
- pos++;
-
-
- if (_isIdentCodePoint(cc, pos - 1)) {
-
- }
-
-
- else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
- pos = _consumeAnEscapedCodePoint(input, pos);
- }
-
-
- else {
- return pos - 1;
- }
- }
- };
- const _isNonPrintableCodePoint = cc =>
- (cc >= 0x00 && cc <= 0x08) ||
- cc === 0x0b ||
- (cc >= 0x0e && cc <= 0x1f) ||
- cc === 0x7f;
- const consumeTheRemnantsOfABadUrl = (input, pos) => {
-
-
-
-
- for (;;) {
-
-
- if (pos === input.length) {
- return pos;
- }
- const cc = input.charCodeAt(pos);
- pos++;
-
-
- if (cc === CC_RIGHT_PARENTHESIS) {
- return pos;
- }
-
-
-
-
- else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
- pos = _consumeAnEscapedCodePoint(input, pos);
- }
-
-
- else {
-
- }
- }
- };
- const consumeAUrlToken = (input, pos, fnStart, callbacks) => {
-
-
-
-
-
-
-
-
- while (_isWhiteSpace(input.charCodeAt(pos))) {
- pos++;
- }
- const contentStart = pos;
-
- for (;;) {
-
-
- if (pos === input.length) {
- if (callbacks.url !== undefined) {
- return callbacks.url(input, fnStart, pos, contentStart, pos - 1);
- }
- return pos;
- }
- const cc = input.charCodeAt(pos);
- pos++;
-
-
- if (cc === CC_RIGHT_PARENTHESIS) {
- if (callbacks.url !== undefined) {
- return callbacks.url(input, fnStart, pos, contentStart, pos - 1);
- }
- return pos;
- }
-
-
-
-
- else if (_isWhiteSpace(cc)) {
- const end = pos - 1;
- while (_isWhiteSpace(input.charCodeAt(pos))) {
- pos++;
- }
- if (pos === input.length) {
- if (callbacks.url !== undefined) {
- return callbacks.url(input, fnStart, pos, contentStart, end);
- }
- return pos;
- }
- if (input.charCodeAt(pos) === CC_RIGHT_PARENTHESIS) {
- pos++;
- if (callbacks.url !== undefined) {
- return callbacks.url(input, fnStart, pos, contentStart, end);
- }
- return pos;
- }
-
- return consumeTheRemnantsOfABadUrl(input, pos);
- }
-
-
-
-
-
- else if (
- cc === CC_QUOTATION_MARK ||
- cc === CC_APOSTROPHE ||
- cc === CC_LEFT_PARENTHESIS ||
- _isNonPrintableCodePoint(cc)
- ) {
-
- return consumeTheRemnantsOfABadUrl(input, pos);
- }
-
-
-
- else if (cc === CC_REVERSE_SOLIDUS) {
- if (_ifTwoCodePointsAreValidEscape(input, pos)) {
- pos = _consumeAnEscapedCodePoint(input, pos);
- } else {
-
- return consumeTheRemnantsOfABadUrl(input, pos);
- }
- }
-
-
- else {
-
- }
- }
- };
- const consumeAnIdentLikeToken = (input, pos, callbacks) => {
- const start = pos;
-
-
- pos = _consumeAnIdentSequence(input, pos, callbacks);
-
-
-
-
- if (
- input.slice(start, pos).toLowerCase() === "url" &&
- input.charCodeAt(pos) === CC_LEFT_PARENTHESIS
- ) {
- pos++;
- const end = pos;
- while (
- _isWhiteSpace(input.charCodeAt(pos)) &&
- _isWhiteSpace(input.charCodeAt(pos + 1))
- ) {
- pos++;
- }
- if (
- input.charCodeAt(pos) === CC_QUOTATION_MARK ||
- input.charCodeAt(pos) === CC_APOSTROPHE ||
- (_isWhiteSpace(input.charCodeAt(pos)) &&
- (input.charCodeAt(pos + 1) === CC_QUOTATION_MARK ||
- input.charCodeAt(pos + 1) === CC_APOSTROPHE))
- ) {
- if (callbacks.function !== undefined) {
- return callbacks.function(input, start, end);
- }
- return pos;
- }
- return consumeAUrlToken(input, pos, start, callbacks);
- }
- // Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
- // Create a <function-token> with its value set to string and return it.
- if (input.charCodeAt(pos) === CC_LEFT_PARENTHESIS) {
- pos++;
- if (callbacks.function !== undefined) {
- return callbacks.function(input, start, pos);
- }
- return pos;
- }
- // Otherwise, create an <ident-token> with its value set to string and return it.
- if (callbacks.identifier !== undefined) {
- return callbacks.identifier(input, start, pos);
- }
- return pos;
- };
- const consumeLessThan = (input, pos, _callbacks) => {
-
- if (input.slice(pos, pos + 3) === "!--") {
- return pos + 3;
- }
-
- return pos;
- };
- const consumeCommercialAt = (input, pos, callbacks) => {
- const start = pos - 1;
-
- if (
- _ifThreeCodePointsWouldStartAnIdentSequence(
- input,
- pos,
- input.charCodeAt(pos),
- input.charCodeAt(pos + 1),
- input.charCodeAt(pos + 2)
- )
- ) {
- pos = _consumeAnIdentSequence(input, pos, callbacks);
- if (callbacks.atKeyword !== undefined) {
- pos = callbacks.atKeyword(input, start, pos);
- }
- return pos;
- }
-
- return pos;
- };
- const consumeReverseSolidus = (input, pos, callbacks) => {
-
- if (_ifTwoCodePointsAreValidEscape(input, pos)) {
- pos--;
- return consumeAnIdentLikeToken(input, pos, callbacks);
- }
-
- return pos;
- };
- const consumeAToken = (input, pos, callbacks) => {
- const cc = input.charCodeAt(pos - 1);
-
- switch (cc) {
-
- case CC_LINE_FEED:
- case CC_CARRIAGE_RETURN:
- case CC_FORM_FEED:
- case CC_TAB:
- case CC_SPACE:
- return consumeSpace(input, pos, callbacks);
-
- case CC_QUOTATION_MARK:
- return consumeAStringToken(input, pos, callbacks);
-
- case CC_NUMBER_SIGN:
- return consumeNumberSign(input, pos, callbacks);
-
- case CC_APOSTROPHE:
- return consumeAStringToken(input, pos, callbacks);
-
- case CC_LEFT_PARENTHESIS:
- return consumeLeftParenthesis(input, pos, callbacks);
-
- case CC_RIGHT_PARENTHESIS:
- return consumeRightParenthesis(input, pos, callbacks);
-
- case CC_PLUS_SIGN:
- return consumePlusSign(input, pos, callbacks);
-
- case CC_COMMA:
- return consumeComma(input, pos, callbacks);
-
- case CC_HYPHEN_MINUS:
- return consumeHyphenMinus(input, pos, callbacks);
-
- case CC_FULL_STOP:
- return consumeFullStop(input, pos, callbacks);
-
- case CC_COLON:
- return consumeColon(input, pos, callbacks);
-
- case CC_SEMICOLON:
- return consumeSemicolon(input, pos, callbacks);
-
- case CC_LESS_THAN_SIGN:
- return consumeLessThan(input, pos, callbacks);
-
- case CC_AT_SIGN:
- return consumeCommercialAt(input, pos, callbacks);
-
- case CC_LEFT_SQUARE:
- return consumeLeftSquareBracket(input, pos, callbacks);
-
- case CC_REVERSE_SOLIDUS:
- return consumeReverseSolidus(input, pos, callbacks);
-
- case CC_RIGHT_SQUARE:
- return consumeRightSquareBracket(input, pos, callbacks);
-
- case CC_LEFT_CURLY:
- return consumeLeftCurlyBracket(input, pos, callbacks);
-
- case CC_RIGHT_CURLY:
- return consumeRightCurlyBracket(input, pos, callbacks);
- default:
-
-
- if (_isDigit(cc)) {
- pos--;
- return consumeANumericToken(input, pos, callbacks);
- } else if (cc === CC_LOWER_U || cc === CC_UPPER_U) {
-
-
-
-
-
-
-
-
- pos--;
- return consumeAnIdentLikeToken(input, pos, callbacks);
- }
-
-
- else if (isIdentStartCodePoint(cc)) {
- pos--;
- return consumeAnIdentLikeToken(input, pos, callbacks);
- }
-
-
-
- return consumeDelimToken(input, pos, callbacks);
- }
- };
- module.exports = (input, pos = 0, callbacks = {}) => {
-
- while (pos < input.length) {
-
- pos = consumeComments(input, pos, callbacks);
-
- pos++;
- pos = consumeAToken(input, pos, callbacks);
- if (callbacks.needTerminate && callbacks.needTerminate()) {
- break;
- }
- }
- return pos;
- };
- module.exports.isIdentStartCodePoint = isIdentStartCodePoint;
- module.exports.eatComments = (input, pos) => {
- for (;;) {
- const originalPos = pos;
- pos = consumeComments(input, pos, {});
- if (originalPos === pos) {
- break;
- }
- }
- return pos;
- };
- module.exports.eatWhitespace = (input, pos) => {
- while (_isWhiteSpace(input.charCodeAt(pos))) {
- pos++;
- }
- return pos;
- };
- module.exports.eatWhitespaceAndComments = (input, pos) => {
- for (;;) {
- const originalPos = pos;
- pos = consumeComments(input, pos, {});
- while (_isWhiteSpace(input.charCodeAt(pos))) {
- pos++;
- }
- if (originalPos === pos) {
- break;
- }
- }
- return pos;
- };
- module.exports.eatComments = (input, pos) => {
- for (;;) {
- const originalPos = pos;
- pos = consumeComments(input, pos, {});
- if (originalPos === pos) {
- break;
- }
- }
- return pos;
- };
- module.exports.eatWhiteLine = (input, pos) => {
- for (;;) {
- const cc = input.charCodeAt(pos);
- if (_isSpace(cc)) {
- pos++;
- continue;
- }
- if (_isNewline(cc)) pos++;
- pos = consumeExtraNewline(cc, input, pos);
- break;
- }
- return pos;
- };
- module.exports.skipCommentsAndEatIdentSequence = (input, pos) => {
- pos = module.exports.eatComments(input, pos);
- const start = pos;
- if (
- _ifThreeCodePointsWouldStartAnIdentSequence(
- input,
- pos,
- input.charCodeAt(pos),
- input.charCodeAt(pos + 1),
- input.charCodeAt(pos + 2)
- )
- ) {
- return [start, _consumeAnIdentSequence(input, pos, {})];
- }
- return undefined;
- };
- module.exports.eatString = (input, pos) => {
- pos = module.exports.eatWhitespaceAndComments(input, pos);
- const start = pos;
- if (
- input.charCodeAt(pos) === CC_QUOTATION_MARK ||
- input.charCodeAt(pos) === CC_APOSTROPHE
- ) {
- return [start, consumeAStringToken(input, pos + 1, {})];
- }
- return undefined;
- };
- module.exports.eatImageSetStrings = (input, pos, cbs) => {
-
- const result = [];
- let isFirst = true;
- let needStop = false;
-
- let balanced = 1;
-
- const callbacks = {
- ...cbs,
- string: (_input, start, end) => {
- if (isFirst && balanced === 1) {
- result.push([start, end]);
- isFirst = false;
- }
- return end;
- },
- comma: (_input, _start, end) => {
- if (balanced === 1) {
- isFirst = true;
- }
- return end;
- },
- leftParenthesis: (input, start, end) => {
- balanced++;
- return end;
- },
- function: (_input, start, end) => {
- balanced++;
- return end;
- },
- rightParenthesis: (_input, _start, end) => {
- balanced--;
- if (balanced === 0) {
- needStop = true;
- }
- return end;
- }
- };
- while (pos < input.length) {
-
- pos = consumeComments(input, pos, callbacks);
-
- pos++;
- pos = consumeAToken(input, pos, callbacks);
- if (needStop) {
- break;
- }
- }
- return result;
- };
- module.exports.eatImportTokens = (input, pos, cbs) => {
- const result =
-
- (new Array(4));
-
- let scope;
- let needStop = false;
- let balanced = 0;
-
- const callbacks = {
- ...cbs,
- url: (_input, start, end, contentStart, contentEnd) => {
- if (
- result[0] === undefined &&
- balanced === 0 &&
- result[1] === undefined &&
- result[2] === undefined &&
- result[3] === undefined
- ) {
- result[0] = [start, end, contentStart, contentEnd];
- scope = undefined;
- }
- return end;
- },
- string: (_input, start, end) => {
- if (
- balanced === 0 &&
- result[0] === undefined &&
- result[1] === undefined &&
- result[2] === undefined &&
- result[3] === undefined
- ) {
- result[0] = [start, end, start + 1, end - 1];
- scope = undefined;
- } else if (result[0] !== undefined && scope === 0) {
- result[0][2] = start + 1;
- result[0][3] = end - 1;
- }
- return end;
- },
- leftParenthesis: (_input, _start, end) => {
- balanced++;
- return end;
- },
- rightParenthesis: (_input, _start, end) => {
- balanced--;
- if (balanced === 0 && scope !== undefined) {
-
- (result[scope])[1] = end;
- scope = undefined;
- }
- return end;
- },
- function: (input, start, end) => {
- if (balanced === 0) {
- const name = input
- .slice(start, end - 1)
- .replace(/\\/g, "")
- .toLowerCase();
- if (
- name === "url" &&
- result[0] === undefined &&
- result[1] === undefined &&
- result[2] === undefined &&
- result[3] === undefined
- ) {
- scope = 0;
- result[scope] = [start, end + 1, end + 1, end + 1];
- } else if (
- name === "layer" &&
- result[1] === undefined &&
- result[2] === undefined
- ) {
- scope = 1;
- result[scope] = [start, end];
- } else if (name === "supports" && result[2] === undefined) {
- scope = 2;
- result[scope] = [start, end];
- } else {
- scope = undefined;
- }
- }
- balanced++;
- return end;
- },
- identifier: (input, start, end) => {
- if (
- balanced === 0 &&
- result[1] === undefined &&
- result[2] === undefined
- ) {
- const name = input.slice(start, end).replace(/\\/g, "").toLowerCase();
- if (name === "layer") {
- result[1] = [start, end];
- scope = undefined;
- }
- }
- return end;
- },
- semicolon: (_input, start, end) => {
- if (balanced === 0) {
- needStop = true;
- result[3] = [start, end];
- }
- return end;
- }
- };
- while (pos < input.length) {
-
- pos = consumeComments(input, pos, callbacks);
-
- pos++;
- pos = consumeAToken(input, pos, callbacks);
- if (needStop) {
- break;
- }
- }
- return result;
- };
- module.exports.eatIdentSequence = (input, pos) => {
- pos = module.exports.eatWhitespaceAndComments(input, pos);
- const start = pos;
- if (
- _ifThreeCodePointsWouldStartAnIdentSequence(
- input,
- pos,
- input.charCodeAt(pos),
- input.charCodeAt(pos + 1),
- input.charCodeAt(pos + 2)
- )
- ) {
- return [start, _consumeAnIdentSequence(input, pos, {})];
- }
- return undefined;
- };
- module.exports.eatIdentSequenceOrString = (input, pos) => {
- pos = module.exports.eatWhitespaceAndComments(input, pos);
- const start = pos;
- if (
- input.charCodeAt(pos) === CC_QUOTATION_MARK ||
- input.charCodeAt(pos) === CC_APOSTROPHE
- ) {
- return [start, consumeAStringToken(input, pos + 1, {}), false];
- } else if (
- _ifThreeCodePointsWouldStartAnIdentSequence(
- input,
- pos,
- input.charCodeAt(pos),
- input.charCodeAt(pos + 1),
- input.charCodeAt(pos + 2)
- )
- ) {
- return [start, _consumeAnIdentSequence(input, pos, {}), true];
- }
- return undefined;
- };
- module.exports.eatUntil = chars => {
- const charCodes = Array.from({ length: chars.length }, (_, i) =>
- chars.charCodeAt(i)
- );
- const arr = Array.from(
- { length: charCodes.reduce((a, b) => Math.max(a, b), 0) + 1 },
- () => false
- );
- for (const cc of charCodes) {
- arr[cc] = true;
- }
- return (input, pos) => {
- for (;;) {
- const cc = input.charCodeAt(pos);
- if (cc < arr.length && arr[cc]) {
- return pos;
- }
- pos++;
- if (pos === input.length) return pos;
- }
- };
- };
|