'use strict'; const { WTVShared, clientShowAlert } = require("./WTVShared.js"); class WTVProxy { constructor(minisrv_config) { this.minisrv_config = minisrv_config; this.wtvshared = new WTVShared(this.minisrv_config); } transformHtml(html) { try { // Apply existing transformations let transformed = html .replace(/[^\x20-\x7E\n\r\t]/g, '') // Remove non-ASCII .replace(/\s+/g, ' ') // Collapse whitespace .replace(//g, '') // Remove comments .replace(/)<[^<]*)*<\/script>/gi, '') // Remove scripts .replace(/)<[^<]*)*>/gi, '') // Remove meta tags .replace(/)<[^<]*)*>/gi, '') // Remove images .replace(/)<[^<]*)*>/gi, '') // Remove input tags .replace(/)<[^<]*)*>/gi, '') // Remove link tags .replace(/)<[^<]*)*>/gi, '') // Remove embed tags .replace(/)<[^<]*)*>/gi, '') // Remove links .replace(/<\/a>/gi, '') // Remove closing links .replace(/)<[^<]*)*<\/iframe>/gi, '') .replace(/)<[^<]*)*<\/object>/gi, '') .replace(/javascript:/gi, '') .replace(/on\w+\s*=\s*("[^"]*"|'[^']*'|[^ >]+)/gi, '') .replace(/style\s*=\s*("[^"]*"|'[^']*'|[^ >]+)/gi, '') .replace(/class\s*=\s*("[^"]*"|'[^']*'|[^ >]+)/gi, '') .replace(/id\s*=\s*("[^"]*"|'[^']*'|[^ >]+)/gi, '') .replace(/<(div|span|section|article|aside|header|footer|nav)\b/gi, '') .replace(/<\/(div|span|section|article|aside|header|footer|nav)>/gi, '') .replace(/FP_preloadImgs\s*\(.*?\)/gi, ''); // Normalize for processing transformed = transformed .replace(/>\s+<') // Remove accidental whitespace between tags .replace(//g, '>\n') // Add newline after each tag .replace(/\n\s*\n/g, '\n'); // Collapse multiple newlines // Format with indentation const lines = transformed.split('\n'); let indentLevel = 0; const indentSize = 2; const formatted = lines.map((line) => { const trimmed = line.trim(); if (trimmed === '') return ''; const isClosing = /^<\/.+?>/.test(trimmed); const isSelfClosing = /^<.+?\/>$/.test(trimmed) || /^
).*?>/.test(trimmed) && !isClosing; if (isClosing) indentLevel = Math.max(indentLevel - 1, 0); const indentedLine = ' '.repeat(indentLevel * indentSize) + trimmed; if (isOpening && !isSelfClosing) indentLevel++; return indentedLine; }); transformed = formatted.join('\n').trim(); // Wrap in DOCTYPE and HTML structure transformed = `\n\n \n \n \n \n${transformed}\n \n`; // Truncate if necessary if (transformed.length > 512) { transformed = transformed.substring(0, 512); transformed = transformed.substring(0, transformed.lastIndexOf('<')) + '\n \n'; } return Buffer.from(transformed, 'ascii').toString('ascii'); } catch (err) { throw new Error(`HTML transformation failed: ${err.message}`); } } } module.exports = WTVProxy;