| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- // src/utils/html.ts
- var HtmlEscapedCallbackPhase = {
- Stringify: 1,
- BeforeStream: 2,
- Stream: 3
- };
- var raw = (value, callbacks) => {
- const escapedString = new String(value);
- escapedString.isEscaped = true;
- escapedString.callbacks = callbacks;
- return escapedString;
- };
- var escapeRe = /[&<>'"]/;
- var stringBufferToString = async (buffer, callbacks) => {
- let str = "";
- callbacks ||= [];
- const resolvedBuffer = await Promise.all(buffer);
- for (let i = resolvedBuffer.length - 1; ; i--) {
- str += resolvedBuffer[i];
- i--;
- if (i < 0) {
- break;
- }
- let r = resolvedBuffer[i];
- if (typeof r === "object") {
- callbacks.push(...r.callbacks || []);
- }
- const isEscaped = r.isEscaped;
- r = await (typeof r === "object" ? r.toString() : r);
- if (typeof r === "object") {
- callbacks.push(...r.callbacks || []);
- }
- if (r.isEscaped ?? isEscaped) {
- str += r;
- } else {
- const buf = [str];
- escapeToBuffer(r, buf);
- str = buf[0];
- }
- }
- return raw(str, callbacks);
- };
- var escapeToBuffer = (str, buffer) => {
- const match = str.search(escapeRe);
- if (match === -1) {
- buffer[0] += str;
- return;
- }
- let escape;
- let index;
- let lastIndex = 0;
- for (index = match; index < str.length; index++) {
- switch (str.charCodeAt(index)) {
- case 34:
- escape = """;
- break;
- case 39:
- escape = "'";
- break;
- case 38:
- escape = "&";
- break;
- case 60:
- escape = "<";
- break;
- case 62:
- escape = ">";
- break;
- default:
- continue;
- }
- buffer[0] += str.substring(lastIndex, index) + escape;
- lastIndex = index + 1;
- }
- buffer[0] += str.substring(lastIndex, index);
- };
- var resolveCallbackSync = (str) => {
- const callbacks = str.callbacks;
- if (!callbacks?.length) {
- return str;
- }
- const buffer = [str];
- const context = {};
- callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));
- return buffer[0];
- };
- var resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {
- if (typeof str === "object" && !(str instanceof String)) {
- if (!(str instanceof Promise)) {
- str = str.toString();
- }
- if (str instanceof Promise) {
- str = await str;
- }
- }
- const callbacks = str.callbacks;
- if (!callbacks?.length) {
- return Promise.resolve(str);
- }
- if (buffer) {
- buffer[0] += str;
- } else {
- buffer = [str];
- }
- const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then(
- (res) => Promise.all(
- res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))
- ).then(() => buffer[0])
- );
- if (preserveCallbacks) {
- return raw(await resStr, callbacks);
- } else {
- return resStr;
- }
- };
- export {
- HtmlEscapedCallbackPhase,
- escapeToBuffer,
- raw,
- resolveCallback,
- resolveCallbackSync,
- stringBufferToString
- };
|