Полностью нативный HTML/CSS движок для Flutter

+ свой текстовый и блочный рендеринг

Никаких WebView, только html и xml для получения первоначального дерева. Изначально использовался xml, но, как оказалось, он не особо дружит со сломанной разметкой, поэтому для сырого дерева использую пакет html
Никаких WebView, только html и xml для получения первоначального дерева. Изначально использовался xml, но, как оказалось, он не особо дружит со сломанной разметкой, поэтому для сырого дерева использую пакет html

В общем, это продолжение постов про свой HTML/CSS-рендеринг движок.
Вкратце перескажу, что было. Сделал свой движок для расстановки слов по строкам, потом отдельную систему для кастомного размещения блоков с разложенными строками внутри. Затем сделал парсеры для HTML и CSS со своим виртуальным деревом. После этого — систему, которая берёт это новое виртуальное дерево и применяет к нему блочный движок, а тот, в свою очередь, использует строчный движок.
Из нового я сделал хитрую ленивую подгрузку глав, которая напрямую зависит от действий пользователя: если тот рьяно листает, подгружаем на ходу; если завис, чтобы почитать текст, то начинаем в фоне (но в том же потоке) подгружать всё, что не подгрузили. Это я продемонстрирую в видео ниже:

Демонстрация на реальном устройстве. Обратите внимание на скорость открытия книги, на цветовой индикатор внизу экрана и на счётчики сверху. Зелёный индикатор — не грузим, синий — грузим. Сверху справа виден прогресс того, как главы и страницы грузятся.

Видео выше является ответом на то, как я разбиваю контент на страницы. Ответ — никак, это видно на картинках, которые делятся на страницы. Вы можете усмотреть здесь противоречие: деление как бы есть, но его как бы нет. И тут вступает Теория Решения Изобретательских Задач (ТРИЗ) Генриха Альтшуллера (был такой советский учёный). Разбивать контент на страницы сложно и дорого, расчёт растёт кратно, поскольку надо делать проверку того, сколько поместилось контента на страницу, а также делать минимум два расчёта для последнего не поместившегося блока(чтобы разбить на части). Поэтому... я просто прокручиваю хитрым образом одну-единственную страницу, а для этого хватает первоначальных метрик.Почему не показываю одним видео? Потому что я тупой и не знаю, как нормально подружить ленивую загрузку и систему якорей, вследствие чего иногда переворот экрана отбрасывает в самое начало. Сейчас хочу добавить процентные якоря (запоминает процент того, сколько пролистали, а при перестроении скипаем этот процент и берём первоначальное смещение; да, первоначальное, оно будет неточным, но с точной позицией текста очень грустно, поскольку если, скажем, мы на заголовке на третьей странице при вертикальном варианте, то это будет A(1, A(2, A(3, ...))), при горизонтальном варианте A'(1, A'(2, A'(3, ...))) — то есть видно, что фактическое положение контента на текущей странице сильно зависит от раскладки на предыдущих страницах, а с первоначальным смещением я хоть примерно смогу быстро воспроизвести цепочку).Хотя вот собственно, а то скажете еще, что я жопорук (а оно так и есть) и что я сидел и долго общитывал каждый вариант

Заботясь о здоровье вашей головы, советую на шестой секунде повернуть голову относительно тела на 90 градусов , не смещая тело

Делаю это всё чисто по приколу, ну и потому что люблю электронные книги, а ещё чуть позже покажу свой Mini Pupper, в котором не используется силовая плата производителя (от MangDang, она сгорела лол), а все его движения — мои Python-скриптики, левые детали и самая обычная Ubuntu

Робот делает бззз

Прошу сильно не ругать: да, я на фоне вас, сверхлюдей, выгляжу глупым и простоватым, но как есть. А такие постики позволяют немножко чаще возвращаться к своим разработкам. Так сказать, закрепляю прогресс)))

1
2 комментария