Ваш EPUB проходит все валидаторы. Kobo всё равно его не открывает. Виноват код из 2013-го
Книга Андре Кляйна прошла epubcheck без замечаний, а потом молча упала на Kobo. Виновата одна строка: `max-width: min(150px, 30vw)` — корректный CSS, который движок Adobe, замороженный примерно в 2013 году, просто не умеет читать.
Готовый EPUB проходит проверку, а на Kobo показывает пустую или сломанную страницу без единой ошибки. Причина — RMSDK, проприетарный движок Adobe внутри Kobo, собранный около 2010 года под EPUB2: ни flexbox, ни grid, ни математических функций CSS. Современный CSS не деградирует, а падает.
Один независимый разработчик попробовал лицензировать RMSDK напрямую: на письмо по адресу с сайта Adobe никто не отвечает, внутренней документации нет, продукт тихо продали. Kobo теперь переписывает читалку, чтобы полностью отказаться от Adobe.
Книга, которая проходит валидатор и всё равно умирает на устройстве

В своём посте Андре Кляйн описывает момент, которого боится каждый, кто делает электронные книги: месяцы работы, чистый прогон epubcheck — и пустая или искажённая страница на Kobo вообще без сообщения об ошибке. Он докопался до одной строки CSS — max-width: min(150px, 30vw), — которая соответствует CSS Level 4 и которую движок Kobo молча отказывается разбирать.
Этот движок — RMSDK от Adobe, собранный около 2010 года под EPUB2 и, по словам Кляйна, «замороженный приблизительно в 2013-м». В нём нет ни flexbox, ни grid, ни кастомных свойств CSS, ни min()/max()/clamp(). Это не откат к запасному варианту: современный CSS заставляет его падать. А поскольку Kobo выбрала RMSDK «скорее всего, ради DRM», привязка тут структурная, а не случайная. Практический совет Кляйна безрадостен: тестируйте вручную в Adobe Digital Editions, потому что соответствие RMSDK не проверить ни одним стандартным инструментом.
Кто виноват — замороженный парсер Adobe или спека, которая не стоит на месте?
Тред расходится в том, на кого показывать пальцем. Один лагерь говорит: epubcheck делает ровно свою работу, а вот падение на Kobo, втором по популярности производителе читалок, — вот это настоящий скандал.
«Разве не в этом весь смысл epubcheck? Он явно не задуман валидировать весь CSS — он проверяет, что EPUB будет работать… а неработоспособность на устройствах Kobo (вероятно, производитель читалок №2?) — серьёзная проблема» — Danpalmer, SRE по Android в Google
Другой лагерь считает, что эту ловушку создал сам стандарт EPUB, оптом затащив в себя браузерные спеки, которые не перестают меняться.
«Когда W3C, Inc. взяла на себя поддержку спецификации EPub… они просто сослались на WHATWG HTML и другие бесконечно растущие браузерные спеки. Будучи „живыми стандартами“, те не имеют ни версионирования, ни QA… Epub 3.2 просто сделал существующие epub несоответствующими. Поэтому Calibre и другие инструменты до сих пор рекомендуют 3.1, а лучше 2» — tannhaeuser, сопровождающий инструментарий для разметки/SGML
Один читатель указал, что спека EPUB вообще нигде не обещает, какую версию CSS обязан поддерживать рендерер, так что называть RMSDK «сломанным» само по себе спорно: гарантий, что min() заработает, никто не давал.
Сноска: лицензировать движок, на который все опираются, попросту невозможно
Самую острую деталь принёс тот, кто попытался строить на RMSDK, а не вокруг него.
«Получить к нему доступ невозможно… Не с кем поговорить. Почта, указанная на их сайте, не отвечает ни на что… Я написал бывшему коллеге, который там работал… Он сказал, что пытался найти внутреннюю документацию о нём и не нашёл ничего» — nfw2, разработчик ПО для читалок
Заброшенность теперь официальна: Adobe Digital Editions и RMSDK продали Wipro, и эту передачу один читатель назвал «запоротой». Kobo в ответ обходит Adobe стороной.
«Kobo сейчас полностью переписывает софт своих читалок… и я почти уверен, что он больше не основан на RMSDK. Adobe фактически на блюдечке передала рынок DRM для EPUB протоколу LCP — плохо поддерживая продукт, а потом распродав его третьей стороне» — chocolatkey, разработчик инструментов для электронных книг
Ещё один обходной путь всплывал снова и снова: назвать файл .kepub.epub, чтобы запустить новый движок Kobo, прогнать его через kepubify или поставить сбоку KoReader, который запускается на любом Kobo.
Закономерность под багом
Это не разовый казус с CSS. Это движок 2010 года, который держат живым ради DRM, проверяют инструментом, не способным заглянуть внутрь него, и навязывают спекой, которая то и дело переопределяет, что значит «валидный». Комментатор acdha провёл очевидную параллель: ровно так Adobe поступила с Flash — выпускала ошеломляюще плохой софт, игнорировала баг-репорты с минимальными примерами и в итоге объединила против себя всех производителей браузеров. Поразительно, что одной компании удалось провернуть это дважды и что открытый формат EPUB оказался в такой же зависимости от проприетарного рендерера, в какой когда-то был веб от Flash.
Получайте такие разборы каждый день
Главные истории Hacker News — на email, в Telegram или RSS.
В 2014-м он предсказал, что JavaScript станет невидимым к 2035-му. Мы прошли полпути
В докладе Гэри Бернхардт представил будущее, где asm.js становится универсальной основой — в конце концов на нём работает даже ядро, и вы перестаёте писать JavaScript напрямую. Одиннадцать лет спустя тред выставляет оценки каждому прогнозу по реальной истории WebAssembly.