| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: GUI и Java FX приложения > HTML-код выделенного фрагмента |
| Автор: nornad 15.5.2007, 14:20 | ||||||
| Эх... шансов, думаю, мало, но всё же... В общем, сабж - как из JTextPane получить HTML-код выделенного фрагмена? Пример: Есть такой хтмл:
В редакторе выделен текст, скажем между двумя словами "текст" (выше я его "выделил" курсивом). Если использовать doc.getText() для выделенного, то получим
а мне надо получить
Уже голову сломал в раздумьях. Добавлено через 6 минут и 24 секунды В принципе, достаточно иметь возможность перевести "текстовую" позицию каретки в позицию в HTML-коде. |
| Автор: nornad 16.5.2007, 03:30 |
| М-да... Вижу, знатоков-извращенцев JTextPane за месяц тут не прибавилось. Нашёл у одних ребят в проекте решение, но пока ещё не разобрался. Позже отпишусь, что да как. |
| Автор: _Y_ 16.5.2007, 10:31 |
| Что за ерунда? Я вроде постил сюда вчера свои соображения по сабжу. Куда делось? |
| Автор: _Y_ 16.5.2007, 11:26 | ||||
Я уже успешно забыл что там писал, но идея была примерно такая:
Очевидно, что в результате получится форматированная строка
|
| Автор: nornad 16.5.2007, 17:22 |
| М-да... из разряда извращений решение. Правда, чем дальше в лес, тем больше извращений с JTextPane приходится делать. Ежели с найденным у ребят кодом не разберусь, попробую копать в эту сторону. |
| Автор: _Y_ 17.5.2007, 23:26 | ||||||||||||||||
| Первое лирическое отступление: Проблема в том, что задача, по определению, некорректная т.к. выделение делается в видимом тексте. Т.е. в случае если выделен текст граничащий с тегом, глупый комп не может решить включать тэг в выделение, не включать. А если тэгов несколько! Второе лирическое отступление: Сам я такого не делал и просто выдаю горбатую идею
Вот я попробовал такой код:
Честно отдает
Т.е. очищает строку от тэгов
Не знаю, но предполагаю. Выделенный текст можно найти в полученном из ДОМа тексте. Потом взять текст идущий до него и использовать его для "очистки ДОМа". Я бы попробовал взять все элементы ДОМа и по очереди сравнивать их текстовое содержание (посимвольно?) с этим текстом. Все что сравнилось заменять на пустые строки. То же самое сделать и используя текст, идущий после выделенного. В результате, если мы , например, выделяем text3 в
после "очистки" ДОМa останется
Потом проходим через все элементы и выбрасываем пустые - в данном случае <u></u>. Остается
И вот тут-то проявляется некорректность задачи. Программа не может знать какие из окружающих тегов надо убрать, а какие оставить - это уже только задавать самому в программе. Например - убрать окружающие тэги если они <i> и <b>, но не <u>. В общем - какую-то булеву логику придется включать. Или пусть выбрасывает модальное окошко спрашивая убрать ли такой-то окружающий тэг. Прошу прощения за сумбурность. Спать хоца очень |
| Автор: nornad 18.5.2007, 01:42 | ||
| Ну, некорректности задачи я не вижу, ибо если бы я мог получить позицию в хтмле, то взять можно было бы и просто текст и текст с оформлением. Проблема в том, что я до сих пор не нашёл способа получить эту самую позицию в хтмле. Теперь по поводу того, что программа не знает, что убирать. Если подойти с умом, то она это легко будет знать. Нужно лишь определить "параллельные" теги для того, что мы хотим получить. Например, для твоего примера с выделением text3 "параллельным" будет <u> с text2 (слева; справа нет "параллельного" тега, точнее в его качестве будет выступать закрывающий <i>). Кроме того, подозреваю, что предложенный пример не сможет корректно обработать ситуацию с форматированием хтмл-кода (табуляция, лидирующие пробелы (обычные)), но это стоит ещё проверить. В любом случае спасибо за примерчик - хотя бы есть от чего оттолкнуться. Добавлено через 1 минуту и 43 секунды
Гы Рульная идея. Юзера просто офигеют при виде запроса. |
| Автор: nerezus 18.5.2007, 06:03 | ||||
|
| Автор: _Y_ 18.5.2007, 10:30 | ||||||
Это действительно проблема. HTML программы типа IE понимают XML, но не наоборот в силу более жестких требований к XML коду. Поэтому "крутые" веб-программисты рекомендуют при написании HTML быть строже к себе
Тогда все будут довольны nornad, если надо получить только позицию начала и конца выделения в HTML коде, то, думаю, что это можно сделать и без ДОМа. Вечерком набросаю програмку. |
| Автор: nornad 18.5.2007, 13:52 |
| В принципе, атрибуты DOM съест - парсер в JTextPane их в кавычки заворачивает. А вот тэг <br> он рисует без концевого слеша... :( Ок, будет отлично, ежели удастся получить верную позицию в хтмле. |
| Автор: nerezus 18.5.2007, 17:16 | ||
|
| Автор: nornad 18.5.2007, 20:08 |
| Дискуссия-то не о том, валиден ли хтмл и насколько он валиден. Я же не сам его пишу "от и до" руками. В редакторе пишется текст и задаётся стилизация, а хтмл генерит уже сам редактор. Так что "крутые вэб-программисты" здесь просто отдыхают - им никто не даёт копаться в хтмл-коде. |
| Автор: _Y_ 18.5.2007, 23:35 | ||
| nornad, прошу прощения. Не написал. Оч спать хоца, а возни с HTML кодом и JTextPane немало. Так что пока только идея. Сколь я понял не представляет трудности получить HTML документ в виде String (strHtml) и его же текст без тегов (strTxt). Не составляет также трудности получить позицию (txtBeginning, txtEnd) выделенного текста (strSelected), но относительно текста без тэгов, а не не по отношению к HTML тексту. Задача, найти позицию по отношению к HTML тексту (htmlBeginning, htmlEnd). В этом коде я взял HTML из первого поста и предположил, что выделен фрагмент strSelected = "erence, an". Для простоты убрал символы перевода строки.
Код честно отдает "erence</a>, an" |
| Автор: nornad 19.5.2007, 01:44 | ||
Как я уже упоминал, у такого подхода есть один существенный минус - он "промажет" на форматированном хтмле. Натрави такой вариант поиска позиции на хтмл вида:
Я над таким вариантом уже думал. Пока не придумал, как сделать пропуск различных лидирующих пробелов. Кстати, надо ещё учитывать возможность наличия всяких (точно не скажу, но могут и встретиться; даже очень вероятно). Сечас в голову пришёл некоторый изврат: сделать второй скрытый текстпейн, в который пихать кусочки хтмла из первого и смотреть, какой текст получается. Но, блин, слишком уж страшный способ. |
| Автор: _Y_ 19.5.2007, 08:46 |
| nornad, боюсь, что ничего лучше не придумаю. С двойными пробелами, табуляторами и символами типа побороться можно руками (делая замену на соответствующие символы преред поиском), но это головная боль с составлением коллекции ссылок замены. Фактически, программе нужно скормить полную таблицу юникода, да еще кучу других таблиц. А может стОит поискать уже сделанную библиотеку такого рода замен? А вот еще идея. Со вторым JTextPane:
Не знаю - это просто идея. Может и глупая. |
| Автор: nornad 19.5.2007, 11:18 |
Сомневаюсь, что это действительно спасёт. Как я уже говорил, там проблемы не только с заменой. Есть ещё лидирующие пробелы, которые чаще всего надо удалять, но иногда (например, в теге PRE, если не ошибаюсь) - не надо. То бишь в итоге это сведётся к почти полноценному парсингу хтмла, чего лично я не хотел бы реализовывать. В любом случае спасибо. Отрицательный результат - тоже результат. Теперь я хотя бы точнее представляю проблемы поиска соответствия тексту в хтмл-коде. Буду дальше копать код, который нарисовали ребята и ежели разберусь, выложу тут решение. Или хотя бы опишу принцип (если решение окажется слишком громоздким). |
| Автор: krubik 11.2.2009, 12:07 |
| nornad, передо мной стоит анлогичная задача, нужно получить html-код выделенного фрагмента, так вот хотелось бы узнать было ли найдено решение. Заранее благодарен. |
| Автор: 1024 12.2.2009, 13:44 |
| у всех текстовых компонентов есть метод javax.swing.text.JTextComponent.copy(), он помещает выделенный кусок текста в системный буфер в нескольких форматах. если в JEditorPane загрузить хтмл, выделить какой-то кусок, вызвать метод copy, затем перейти в ворд и выбрать из меню Правка/Специальная вставка то он предложит на выбор формат плоского текста или хтмл и всё корректно вставит со ссылками. Т.е. это уже реализовано и прекрасно работает. У JEditorPane за контент в хтмл вероятно отвечает HTMLEditorKit (т.е. то что в javax.swing.JEditorPane.getEditorKit()), можно в нём посмотреть реализацию или тупо через клипбоард. |