✨ Features: - App iOS completa para leer manga sin publicidad - Scraper con WKWebView para manhwaweb.com - Sistema de descargas offline - Lector con zoom y navegación - Favoritos y progreso de lectura - Compatible con iOS 15+ y Sideloadly/3uTools 📦 Contenido: - Backend Node.js con Puppeteer (opcional) - App iOS con SwiftUI - Scraper de capítulos e imágenes - Sistema de almacenamiento local - Testing completo - Documentación exhaustiva 🧪 Prueba: Capítulo 789 de One Piece descargado exitosamente - 21 páginas descargadas - 4.68 MB total - URLs verificadas y funcionales 🎉 Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
73 lines
2.2 KiB
JavaScript
73 lines
2.2 KiB
JavaScript
import { removeElement } from 'domutils';
|
|
import { Document, isDocument as checkIsDocument, } from 'domhandler';
|
|
/**
|
|
* Get the parse function with options.
|
|
*
|
|
* @param parser - The parser function.
|
|
* @returns The parse function with options.
|
|
*/
|
|
export function getParse(parser) {
|
|
/**
|
|
* Parse a HTML string or a node.
|
|
*
|
|
* @param content - The HTML string or node.
|
|
* @param options - The parser options.
|
|
* @param isDocument - If `content` is a document.
|
|
* @param context - The context node in the DOM tree.
|
|
* @returns The parsed document node.
|
|
*/
|
|
return function parse(content, options, isDocument, context) {
|
|
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(content)) {
|
|
content = content.toString();
|
|
}
|
|
if (typeof content === 'string') {
|
|
return parser(content, options, isDocument, context);
|
|
}
|
|
const doc = content;
|
|
if (!Array.isArray(doc) && checkIsDocument(doc)) {
|
|
// If `doc` is already a root, just return it
|
|
return doc;
|
|
}
|
|
// Add content to new root element
|
|
const root = new Document([]);
|
|
// Update the DOM using the root
|
|
update(doc, root);
|
|
return root;
|
|
};
|
|
}
|
|
/**
|
|
* Update the dom structure, for one changed layer.
|
|
*
|
|
* @param newChilds - The new children.
|
|
* @param parent - The new parent.
|
|
* @returns The parent node.
|
|
*/
|
|
export function update(newChilds, parent) {
|
|
// Normalize
|
|
const arr = Array.isArray(newChilds) ? newChilds : [newChilds];
|
|
// Update parent
|
|
if (parent) {
|
|
parent.children = arr;
|
|
}
|
|
else {
|
|
parent = null;
|
|
}
|
|
// Update neighbors
|
|
for (let i = 0; i < arr.length; i++) {
|
|
const node = arr[i];
|
|
// Cleanly remove existing nodes from their previous structures.
|
|
if (node.parent && node.parent.children !== arr) {
|
|
removeElement(node);
|
|
}
|
|
if (parent) {
|
|
node.prev = arr[i - 1] || null;
|
|
node.next = arr[i + 1] || null;
|
|
}
|
|
else {
|
|
node.prev = node.next = null;
|
|
}
|
|
node.parent = parent;
|
|
}
|
|
return parent;
|
|
}
|
|
//# sourceMappingURL=parse.js.map
|