80 lines
2 KiB
JavaScript
80 lines
2 KiB
JavaScript
import { styleParseError } from './error.mjs';
|
|
|
|
function findEndOfQuotedString(code, quote, start) {
|
|
let nextEscape = code.indexOf("\\", start + 1);
|
|
let end = code.indexOf(quote, start + 1);
|
|
if (end === -1) {
|
|
return null;
|
|
}
|
|
while (nextEscape !== -1 && nextEscape < end) {
|
|
if (end === nextEscape + 1) {
|
|
end = code.indexOf(quote, end + 1);
|
|
if (end === -1) {
|
|
return null;
|
|
}
|
|
}
|
|
nextEscape = code.indexOf("\\", nextEscape + 2);
|
|
}
|
|
return end + 1;
|
|
}
|
|
function findEndOfURL(code, start) {
|
|
let index = (start || 0) + 4;
|
|
const length = code.length;
|
|
while (true) {
|
|
if (index >= length) {
|
|
return styleParseError("Cannot find end of URL", code, start);
|
|
}
|
|
let next = code.charAt(index);
|
|
switch (next) {
|
|
case '"':
|
|
case "'": {
|
|
let end = findEndOfQuotedString(code, next, index);
|
|
if (end === null) {
|
|
return styleParseError("Incomplete string", code, index);
|
|
}
|
|
end = code.indexOf(")", end);
|
|
return end === -1 ? styleParseError("Cannot find end of URL", code, start) : end + 1;
|
|
}
|
|
case " ":
|
|
case " ":
|
|
case "\r":
|
|
case "\n":
|
|
index++;
|
|
break;
|
|
default:
|
|
while (true) {
|
|
switch (next) {
|
|
case ")":
|
|
return index + 1;
|
|
case '"':
|
|
case "'":
|
|
case "(":
|
|
case " ":
|
|
case " ":
|
|
case "\r":
|
|
case "\n":
|
|
return styleParseError("Invalid URL", code, start);
|
|
default:
|
|
if (code.charCodeAt(index) < 32) {
|
|
return styleParseError(
|
|
"Invalid URL",
|
|
code,
|
|
start
|
|
);
|
|
}
|
|
}
|
|
index++;
|
|
if (index >= length) {
|
|
return styleParseError(
|
|
"Cannot find end of URL",
|
|
code,
|
|
start
|
|
);
|
|
}
|
|
next = code.charAt(index);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export { findEndOfQuotedString, findEndOfURL };
|