Парсер текста форматах FB2 и TXT с страницы сайта ifreedom.su и bookhamster.ru
Скрипт является универсальным парсером-экспортером для двух сайтов, публикующих новеллы (ранобэ): ifreedom.su и bookhamster.ru. Его основная задача — предоставить пользователю удобный инструмент для скачивания произведений в виде единого файла в форматах FB2 или TXT. Скрипт автоматизирует сбор метаданных и списка глав, загрузку их содержимого, очистку от посторонних элементов и интерактивную обработку CAPTCHA.
Скрипт управляется через конечный автомат с четко определенными состояниями (PRE_INIT, IDLE, COLLECTING, DOWNLOADING, STOPPED). Это позволяет реализовать надежную и предсказуемую логику работы, блокируя недопустимые действия в интерфейсе (например, запуск скачивания во время сбора глав) и предоставляя пользователю актуальную информацию о текущем процессе.
startInitialization(): Точка входа, которая определяет контекст страницы (главная страница произведения или страница отдельной главы). Если скрипт запущен на странице главы, он автоматически находит ссылку на главную страницу, загружает ее в фоне и использует для сбора полной информации.gatherMetadata(doc): Функция интеллектуального парсинга метаданных. Она извлекает не только базовую информацию (название, автор, жанр), но и выполняет сложный анализ аннотации, которая на сайте скрыта внутри JavaScript-атрибута onclick. Скрипт извлекает этот HTML, очищает его и форматирует в корректные параграфы <p>.collectChapters(doc): Гибкий сборщик списка глав. Он проверяет несколько возможных CSS-селекторов, чтобы найти список глав, поддерживая разные варианты верстки на сайтах (простые списки ссылок <a>, выпадающие списки <select>). Собранный список глав автоматически очищается от дубликатов и разворачивается в хронологическом порядке.saveChaptersToCache() / loadChaptersFromCache(): Скрипт активно использует localStorage для кэширования списка глав. После первой инициализации на странице произведения полный список глав сохраняется локально. При последующих посещениях он загружается мгновенно, что значительно ускоряет работу и снижает нагрузку на сервер. Пользователю доступны кнопки для принудительного обновления и очистки кэша.handleCaptcha(url): При обнаружении страницы с CAPTCHA во время скачивания главы, процесс не прерывается с ошибкой. Вместо этого скрипт приостанавливает свою работу, открывает страницу с CAPTCHA в новой вкладке и отображает модальное окно с инструкцией для пользователя. После ручного решения CAPTCHA и нажатия кнопки "Продолжить", скрипт возобновляет работу, повторяя запрос к той же главе. Этот механизм реализован через Promise, что позволяет элегантно управлять асинхронной паузой.generateFb2(...): Формирует FB2-документ, соответствующий стандарту. Включает полную <description> секцию с жанром (преобразованным через mapGenreToFb2), автором, переводчиком, названием и аннотацией.cleanChapterHTML(...): Производит тщательную очистку HTML-содержимого каждой главы, удаляя по списку селекторов рекламу, виджеты комментариев, навигацию и прочий "мусор".FileSaver.js: Для надежного сохранения файлов скрипт подключает внешнюю библиотеку FileSaver.js через директиву @require. Это обеспечивает кросс-браузерную совместимость функции сохранения файла.ifreedom.su или bookhamster.ru.@require) для проверенных решений (как FileSaver.js) и наличие механизма остановки процесса повышают общую стабильность работы.async/await, что обеспечивает плавную работу интерфейса без "зависаний" во время выполнения сетевых запросов.Фрагмент сгенерированного FB2-файла:
<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="[http://www.gribuser.ru/xml/fictionbook/2.0](http://www.gribuser.ru/xml/fictionbook/2.0)" xmlns:xlink="[http://www.w3.org/1999/xlink](http://www.w3.org/1999/xlink)">
<description>
<title-info>
<genre>sf_fantasy</genre>
<author><nickname>Имя Автора</nickname></author>
<book-title>Название Произведения</book-title>
<annotation><p>Первый абзац аннотации.</p>
<p>Второй абзац аннотации.</p></annotation>
<lang>ru</lang>
</title-info>
<document-info>
<author><nickname>Exporter Script</nickname></author>
<program-used>UserScript v0.2</program-used>
<date value="2025-10-12">2025-10-12</date>
<id>bookhamster-1760123456789</id>
<version>0.2</version>
</document-info>
<publish-info>
<publisher>Имя Переводчика</publisher>
</publish-info>
</description>
<body>
<section><title><p>Глава 1: Начало</p></title></section>
<section><title><p>Глава 2: Продолжение</p></title></section>
</body>
</FictionBook>