Java: анализ текста в стиле HTML (Попытка использовать JSoup) - PullRequest
0 голосов
/ 11 марта 2019

Я пишу API, который отображает текст, символ за символом. Я думал, что простым решением для стилизации этого текста было бы добавить разбор HTML. Например, я могу использовать HTML, чтобы добавить жирный тэг к тексту, а затем использовать синтаксический анализ HTML, чтобы поймать это для меня и сказать моему средству визуализации, чтобы включить выделение жирным шрифтом для этого сегмента текста.

Я нашел JSoup в сети, и он кажется многообещающим, но я думаю, что у него могут быть некоторые ограничения, которые по существу вычеркнут его как полезного для того, для чего он мне нужен.

Итак, у меня написан следующий тест:

    String html = "Here's an example of <b>parsing</b> text, <b>character</b> by character.";
    Document doc = Jsoup.parse(html);

    String text = doc.text();

    Elements boldText = doc.select("b");

    System.out.println("Text: " + text);

    for (int i = 0; i < boldText.size(); i++) {
        Element b = boldText.get(i);
        int characterIndex = ???;
        System.out.println("Bold Text " + i + ", Character Index: " + characterIndex + " -> " + b.text());
    }

Я могу получить список частей текста, которые выделены жирным шрифтом. Проблема в том, что на самом деле нет никакого способа получить индекс того, где начинается жирный шрифт и где он заканчивается. Это правда, что я мог бы использовать indexOf() в Java для этого, но я не хочу использовать что-то подобное в сценарии, где пользовательский текст может быть буквально любым. Это открывает возможность того, что мы получим копии текста, и, таким образом, команды начнут путаться.

Кто-нибудь знает, как:

A) Пусть JSoup возвращает индекс символа, где начинаются атрибуты и где они заканчиваются

или

B) Знать Java-анализатор HTML, который может обеспечить необходимые функции.

Чтобы прояснить, что я хочу, мой код рендеринга будет выглядеть примерно так:

    //pseudo-code for rendering characters:
    for (int i = 0; i < characters; i++) {
        char c = text.charAt(i);

        if (index is not part of a tag) {
            boolean bold = isThisIndexBetweenBoldTags(i); //This would be a function that checks if this character index is in range of an HTML tag or not
            renderText(c, bold);
        }
    }

Спасибо за ваше время!

...