Я это сделал, бл@ть!!!
Сразу скажу: на видео я показываю, как это себя чувствует на разных платформах, даже при очень быстром листании, и как ведут себя переносы и разрывы абзацев (которых на самом деле нет, лол).
Более-менее стоит внимания начало и конец часть поста
Много лет я разрабатывал читалку. Люблю я читать, и хочу иметь свой ридер, где смогу реализовать все фишки, какие пожелаю: быструю и лёгкую синхронизацию между устройствами (а на передаче данных, даже по P2P, я собаку съел), сто пятьсот способов добавления книг, свои шрифты, возможность выделить текст и на его основе сделать другой документ и т.д. Хоть нейронку подключай, чтобы она делала краткие пересказы и разжёвывала отдельные моменты.
А поскольку железа у меня хватает: несколько флагманских смартфонов, несколько маков, десктоп, планшеты и прочее барахло, то ридер мне нужен практически под все платформы. А разрабатывать это под каждую из них — ну, такое себе, в одного. В итоге я сосредоточился на Flutter.
И тут всплыла одна проблемка: штатные виджеты Text, RichText и прочие не умеют отображать мягкие переносы. То есть, если сам проставишь в слове символ мягкого переноса, виджет слово разорвёт, но без отображения самого дефиса. И это никак не решить. Умники, которые скажут «можно вычислить конец строки, найти знак мягкого переноса и заменить его на обычный "-"», могут идти пробовать сами. Спойлер: там ломаются расчёты TextPainter’а, и слова с таким знаком просто будут переноситься на новую строку, и никак это не компенсировать — хоть буферы добавляй. Всё равно сломается TextAlign.justify. По этому поводу есть открытый тред, которому лет семь, где гугловские разрабы прямо признают: да, такой поддержки нет, потому что это не заложили ещё на этапе проектирования текстового движка.
В итоге у меня ушло пару лет (не постоянной работы) на разработку своего инлайнового движка. Никаких виджетов Text, RichText — только painter, только хардкор. Этот движок сам раскладывает слова по строкам с учётом переносов, justify, сочетаний стилей и отступов. После этого я сделал FB2-ридер и не мог нарадоваться. Да, телефону было тяжко от таких расчётов, да, я думал потом оптимизировать (и я оптимизировал).
Но тут появилась потребность читать и EPUB. И вот тут началась веселуха. Epub-файл оказался простым архивом с кучей HTML-страниц. А это значит — нужно делать свой мини-браузер. Парсить XML по шаблону уже не прокатывало. Месяц ушёл на парсер HTML, месяц на парсер CSS и ещё колоссальное количество времени — на разработку нового движка, который отвечал уже не за расстановку слов в строках, а за раскладку блоков, в которых эти строки находятся. Ну и да, у меня получилось. В предыдущих постах я уже показывал, как отрисовываю HTML-страницы: с несколькими flex-колонками, разными отступами, цветами и бордерами (привет CSS).
Дальше началась интеграция этого движка в мою читалку. И это было больно. Очень больно. Потому что парсеры и новый движок я делал отдельно, в новом проекте, чтобы не тащить ограничения и архитектурные костыли из прошлого. И там возникла серьёзная проблема: подход по разбивке абзацев на страницы не работает с блочным движком. Я сначала думал, что решу как-нибудь потом. Но нет — тупанул. Ведь реально можно представить абзац, в котором десять флексов, таблица и картинка. Его практически нереально разрезать (ну или я просто тупой). Соответственно, на больших документах (а мы говорим про книги) нормально работает только скролл, то есть никакой пагинации.
И вот сегодня, с похмелья, я придумал новый способ пагинации. Никаких нарезок слов, никаких разрывов абзацев. Только хитрое превращение скролла в PageView, где мы вычисляем лишь последнюю визуально отображаемую строку, рисуем первую область, а потом хитрым образом просто смещаем окно. Ведь текст может быть неравномерным. То есть страниц как таковых нет, а есть одна область, где в моменте отображается только нужный кусок контента!
В награду самому себе, пожалуй, куплю "Добрый Колу" в стекле - ни разу в жизни ещё не пил в стеклянной бутылке.
Ну и поводу стиля написания , оправдаюсь лишь цитаткой из книги: «— Забавно то, — Мур говорил без всякого выражения, — что Сенгупта в принципе не понимает, как ты с такими навыками общения можешь быть настолько плох в математике.» – сам не люблю, когда так пишут