Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

Перенос текста

#android #java

                    
Как во всех читалках реализован перенос текста? Как мне динамически создать WebView
и на него вывести текст с переносом на следующую страницу когда закачивается текущее?
Как это реализовано в Foliant или в CoolReader ? Помогите пожалуйста разобраться.
UPD:
Вот смотрите, немного видоизменю вопрос. У меня вот такой вот слайдинг экранов http://habrahabr.ru/post/131889/
как мне резать строку так что бы  передавать на каждую новую страницу новый не прочитанный
текст? Как мне обрезать текст так что бы при окончании экрана следующий переносился
на следующий экран.
UPD2:
Давайте перефразирую вопрос. Как мне порезать текст и подсчитать сколько его поместится
на экране? Хотя бы так.. Помогите, пожалуйста.    


Ответы

Ответ 1



Задача, о которой вы говорите, достаточно сложна, поэтому давайте разделим её на части. Часть 1. Расстановка переносов. Для начала, есть словари, в которых слова даны со всеми возможными переносами. Составление таких словарей, понятно, трудоёмкая задача. Кроме того, словари обычно всё же хранят таблицы аффиксов и правила присоединения их к корням: хранить 6 падежей для каждого слова обременительно. Затем, существует классической алгоритм Ф. Лианга для расстановки переносов, который использовал мегаотец Дональд Кнут в своей системе TeX. Этот алгоритм базируется на паттернах, которым назначается тот или иной вес, и построен таким образом, чтобы словарь исключений был минимален (например, таблица исключений для английского языка содержит всего 14 элементов). Вы можете найти таблицы для всех языков вместе с таблицами исключений в любой поставке TeX'а (например, во многих дистрибутивах линукса). Этот же алгоритм, с незначительным изменениями используется во многих популярных открытых системах проверки орфографии. Например, hunspell, который используется в OS X, OpenOffice, Firefox, Chrome, Opera, Eclipse и ещё куче других программ, пользуется именно лианговским алгоритмом. Есть ещё проприетарные, закрытые алгоритмы переноса, про них ничего сказать не могу. Как именно расставляются переносы в каждой конкретной читалке, могут сказать лишь специалисты. Однако список программ, которые пользуются TeX'овскими переносами впечатляет, не правда ли? Часть 2. Разбиение текста на строки. Здесь существует снова-таки простой безыскусный подход: зная возможные точки переносов, "напихиваем" куски в текущую строку до тех пор, пока можно. Затем переходим на следующую строку, и так до конца. По моим впечатлениям, Microsoft Word до сих пор работает именно так. Алгоритм же, используемый в системе TeX, гораздо изящнее: целью алгоритма является максимизация суммарного "качества" всех строк. Для каждого из вариантов разбиения на строки алгоритм может оценить, насколько строка растянута или ужата. Отклонение от "идеального" случая уменьшает качество строки. Другие факторы, например, переносы, также уменьшают качество строки. Алгоритм подбирает разбиение за квадратичное время, пользуясь вариантом динамического программирования. Качество получившегося разбиения заметно лучше, чем в наивном алгоритме, и возрастает с увеличением длины абзаца; однако алгоритм сам по себе не очень быстр. Снова-таки, каким алгоритмом пользуется та или иная читалка, сказать могут лишь специалисты. Часть 3. Что делать? Во-первых, поговорите с начальством, узнайте, что они хотят. Вынесите разбиение на строки в отдельный модуль и для начала за пол-дня с кофе и булочками набросайте "жадное" разбиение на строки без переносов. (Обратите внимание на частный случай, когда одно слово в середине длиннее всей строки.) Во-вторых, для переносов проверьте, совместим ли hunspell с вашей лицензией, и прикрутите его для расстановки переносов. Это недолго, и сразу даёт разбиение, не отличающееся от OpenOffice -- уже неплохо. Работы тут на пару дней. В-третьих, попробуйте либо самостоятельно заимплементировать ТеХ'овский алгоритм разбиения на строки, или найдите готовую имплементацию (даже по несовместимой лицензии). Потестируйте скорость, это может быть критично для вашей программы. Если скорость подходит, ищите имплементацию, совместимую с вашей программой в смысле лицензионной чистоты (или сделайте сами, информация в гугле найдётся, хотя и на английском). Если нет, может быть, такое качество вёрстки ценой скорости вам и не нужно?

Ответ 2



Да ладно таблица со словарем - слишком жырно для такой задачи. Мне кажется должен быть сравнительно простой алгоритм. Небольшое гугление наводит на такой вариант написано на Pascal'е, но любой прогер средней уровни агрессивности быстренько положит его на Java

Ответ 3



Очень просто - там есть файл с словарем, в котором все слова записаны, как их можно переносить. Где то так чи-тал-ках реа-ли-зо-ван пе-ре-нос текс-та Использовать webview для этого - лишняя трата ресурсов. Файл для переносов легко гуглится по слову 'Russian_EnUS_hyphen_(Alan).pdb'. Как он читается и используется, можно подсмотреть в коде coolreader'a - hyphman.h и hyphman.cpp

Комментариев нет:

Отправить комментарий