Сопоставить строки для выделения текста с отдельными объектами физической строки в Java - PullRequest
0 голосов
/ 06 декабря 2018

Я использую TextArea из javafx и пытаюсь использовать JFXHighlighter (который просто выделяет текст с полями над текстовой областью. Это утилита из библиотеки jfoenix).JFXHighlighter не делает то, что я хочу, чтобы текст кликабельный, потому что он ограничен и закрыт.Я планирую сделать запрос на извлечение, чтобы сделать его более дружественным к API, но сначала нужно решить эту проблему:

Поэтому я реализую свою точную копию JFXHighlighter с изменениями.Добавление кликабельности - это простая часть, и это уже сделано и исправлено, а сложная часть - это ошибка, которая уже присутствует в Highlighter.

Способ работы TextArea состоит в том, что вы можете получать объекты Text для каждой отображаемой физической строки;JFXHighlighter использует эту функцию, чтобы получить физические границы для каждой строки текста и найти все соответствующие строки в этой строке текста ОТДЕЛЬНО.Таким образом, проблема в том, что JFXHighlighter не может выделить длинный текст, который переносится на новые строки, потому что каждая строка - это отдельный объект.Подсветка была предназначена для поиска слов, а не для поиска предложений.

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

Что я имею в виду, если текстовая область показывает это с переносом:

The big brown fox    <--
jumps over the lazy  <----
dog. But
The big brown fox    <--
also jumped over
a yellow dog
which also 
jumps over the lazy  <----
dog

Если я ищудля «Большая коричневая лиса перепрыгивает через ленивую собаку», я ясно имею в виду первое предложение, но данный вопрос становится немного более сложным с его поиском строк, потому что вы хотите отрицать вторую «Большую коричневую лису» ивторая «перепрыгивает через ленивую» от подсветки тоже.Я не пытаюсь выделить, где когда-либо куски текста появляются, я хочу выделить целое предложение везде, где оно появляется при обработке разделения текста.

Мои попытки заключались в медленном обрезании поискового запроса в цикле while и поиске, затем обрезке его с другого конца и поиске, но это не решает последнюю упомянутую проблему и создает свои собственные проблемы.

JFXHighlighter находит текст, получая начальный индекс искомой строки в каждой строке, если индекс равен -1, пропустите его.Если нет, выделите все, что было найдено.

Так как я могу решить эту проблему?

Код, который получает ограничивающие рамки для каждой строки, находится в методе

private ArrayList<Bounds> getMatchingBounds(String query, Text text)

Это оригинальный JFXHighlighter: https://github.com/jfoenixadmin/JFoenix/blob/master/jfoenix/src/main/java/com/jfoenix/utils/JFXHighlighter.java

И это моя модификация, которая в настоящее время не выделяет должным образом.

hastebin: https://hasteb.in/dahofeku.java

pastebin: https://pastebin.com/VcitqPL1

Наконец: вот как это выглядит в настоящее время, когда мое решение пытается выделить весь текст lorem ipsum в одном поиске.(В результате получается идеал FAR, и я знаю, что мое решение - не лучший способ сделать это, но я не мог придумать лучшего способа сделать это.)

Output

...