![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| nornad |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
Эх... шансов, думаю, мало, но всё же...
В общем, сабж - как из JTextPane получить HTML-код выделенного фрагмена? Пример: Есть такой хтмл:
В редакторе выделен текст, скажем между двумя словами "текст" (выше я его "выделил" курсивом). Если использовать doc.getText() для выделенного, то получим
а мне надо получить
Уже голову сломал в раздумьях. Добавлено через 6 минут и 24 секунды В принципе, достаточно иметь возможность перевести "текстовую" позицию каретки в позицию в HTML-коде. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
||||||
|
|||||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
М-да... Вижу, знатоков-извращенцев JTextPane за месяц тут не прибавилось.
Нашёл у одних ребят в проекте решение, но пока ещё не разобрался. Позже отпишусь, что да как. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
Что за ерунда? Я вроде постил сюда вчера свои соображения по сабжу. Куда делось?
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| _Y_ |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
Я уже успешно забыл что там писал, но идея была примерно такая:
Очевидно, что в результате получится форматированная строка
-------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||
|
|||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
М-да... из разряда извращений решение.
Правда, чем дальше в лес, тем больше извращений с JTextPane приходится делать. Ежели с найденным у ребят кодом не разберусь, попробую копать в эту сторону. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| nornad |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
Что-то я, похоже, перезанимался проблемами JTextPane - голова соображать отказывается...
Ни код ребят разобрать не смог, ни нормально въехать в твою идею с ДОМом (в плане реализации). Если не в тягость - кинь примерчиком, плиз. Или хотя бы в общих чертах увидеть описание того, как: XML от него получал, а вот просто текст... Возможно (даже скорее всего) там всё просто, но голова отказывается варить...
Тут я вообще не понял, как из ДОМа убрать текст (или всё же тэги?), основываясь на найденной позиции в общем тексте... Кстати, если знать, где начинается и заканчивается выделенный текстовый кусок в хтмле, то сложностей никаких и ДОМ уже не нужен. Кроме того, у тебя результат получается немного не того формата, что мне нужен. Поясню: Есть исходный хтмл:
Выделение в тексте (показано жирным): part1 part2 part3 part4 У тебя результатом будет:
А надо:
-------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
||||||||
|
|||||||||
| _Y_ |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
Первое лирическое отступление: Проблема в том, что задача, по определению, некорректная т.к. выделение делается в видимом тексте. Т.е. в случае если выделен текст граничащий с тегом, глупый комп не может решить включать тэг в выделение, не включать. А если тэгов несколько!
Второе лирическое отступление: Сам я такого не делал и просто выдаю горбатую идею
Вот я попробовал такой код:
Честно отдает
Т.е. очищает строку от тэгов Не знаю, но предполагаю. Выделенный текст можно найти в полученном из ДОМа тексте. Потом взять текст идущий до него и использовать его для "очистки ДОМа". Я бы попробовал взять все элементы ДОМа и по очереди сравнивать их текстовое содержание (посимвольно?) с этим текстом. Все что сравнилось заменять на пустые строки. То же самое сделать и используя текст, идущий после выделенного. В результате, если мы , например, выделяем text3 в
после "очистки" ДОМa останется
Потом проходим через все элементы и выбрасываем пустые - в данном случае <u></u>. Остается
И вот тут-то проявляется некорректность задачи. Программа не может знать какие из окружающих тегов надо убрать, а какие оставить - это уже только задавать самому в программе. Например - убрать окружающие тэги если они <i> и <b>, но не <u>. В общем - какую-то булеву логику придется включать. Или пусть выбрасывает модальное окошко спрашивая убрать ли такой-то окружающий тэг. Прошу прощения за сумбурность. Спать хоца очень -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||||||||||
|
|||||||||||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
Ну, некорректности задачи я не вижу, ибо если бы я мог получить позицию в хтмле, то взять можно было бы и просто текст и текст с оформлением.
Проблема в том, что я до сих пор не нашёл способа получить эту самую позицию в хтмле. Теперь по поводу того, что программа не знает, что убирать. Если подойти с умом, то она это легко будет знать. Нужно лишь определить "параллельные" теги для того, что мы хотим получить. Например, для твоего примера с выделением text3 "параллельным" будет <u> с text2 (слева; справа нет "параллельного" тега, точнее в его качестве будет выступать закрывающий <i>). Кроме того, подозреваю, что предложенный пример не сможет корректно обработать ситуацию с форматированием хтмл-кода (табуляция, лидирующие пробелы (обычные)), но это стоит ещё проверить. В любом случае спасибо за примерчик - хотя бы есть от чего оттолкнуться. Добавлено через 1 минуту и 43 секунды
Гы Рульная идея. Юзера просто офигеют при виде запроса. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| nerezus |
|
||||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
|
||||
|
|||||
| _Y_ |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
Это действительно проблема. HTML программы типа IE понимают XML, но не наоборот в силу более жестких требований к XML коду. Поэтому "крутые" веб-программисты рекомендуют при написании HTML быть строже к себе
Тогда все будут довольны nornad, если надо получить только позицию начала и конца выделения в HTML коде, то, думаю, что это можно сделать и без ДОМа. Вечерком набросаю програмку. Это сообщение отредактировал(а) _Y_ - 18.5.2007, 10:32 -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
||||||
|
|||||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
В принципе, атрибуты DOM съест - парсер в JTextPane их в кавычки заворачивает. А вот тэг <br> он рисует без концевого слеша... :(
Ок, будет отлично, ежели удастся получить верную позицию в хтмле. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
|
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
Дискуссия-то не о том, валиден ли хтмл и насколько он валиден. Я же не сам его пишу "от и до" руками.
В редакторе пишется текст и задаётся стилизация, а хтмл генерит уже сам редактор. Так что "крутые вэб-программисты" здесь просто отдыхают - им никто не даёт копаться в хтмл-коде. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
nornad, прошу прощения. Не написал. Оч спать хоца, а возни с HTML кодом и JTextPane немало. Так что пока только идея.
Сколь я понял не представляет трудности получить HTML документ в виде String (strHtml) и его же текст без тегов (strTxt). Не составляет также трудности получить позицию (txtBeginning, txtEnd) выделенного текста (strSelected), но относительно текста без тэгов, а не не по отношению к HTML тексту. Задача, найти позицию по отношению к HTML тексту (htmlBeginning, htmlEnd). В этом коде я взял HTML из первого поста и предположил, что выделен фрагмент strSelected = "erence, an". Для простоты убрал символы перевода строки.
Код честно отдает "erence</a>, an" -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
Как я уже упоминал, у такого подхода есть один существенный минус - он "промажет" на форматированном хтмле. Натрави такой вариант поиска позиции на хтмл вида:
Я над таким вариантом уже думал. Пока не придумал, как сделать пропуск различных лидирующих пробелов. Кстати, надо ещё учитывать возможность наличия всяких (точно не скажу, но могут и встретиться; даже очень вероятно). Сечас в голову пришёл некоторый изврат: сделать второй скрытый текстпейн, в который пихать кусочки хтмла из первого и смотреть, какой текст получается. Но, блин, слишком уж страшный способ. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| _Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 1 Всего: 34 |
nornad, боюсь, что ничего лучше не придумаю.
С двойными пробелами, табуляторами и символами типа побороться можно руками (делая замену на соответствующие символы преред поиском), но это головная боль с составлением коллекции ссылок замены. Фактически, программе нужно скормить полную таблицу юникода, да еще кучу других таблиц. А может стОит поискать уже сделанную библиотеку такого рода замен? А вот еще идея. Со вторым JTextPane:
Не знаю - это просто идея. Может и глупая. -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 6 Всего: 31 |
Сомневаюсь, что это действительно спасёт. Как я уже говорил, там проблемы не только с заменой. Есть ещё лидирующие пробелы, которые чаще всего надо удалять, но иногда (например, в теге PRE, если не ошибаюсь) - не надо. То бишь в итоге это сведётся к почти полноценному парсингу хтмла, чего лично я не хотел бы реализовывать. В любом случае спасибо. Отрицательный результат - тоже результат. Теперь я хотя бы точнее представляю проблемы поиска соответствия тексту в хтмл-коде. Буду дальше копать код, который нарисовали ребята и ежели разберусь, выложу тут решение. Или хотя бы опишу принцип (если решение окажется слишком громоздким). -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| krubik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 6.11.2008 Репутация: нет Всего: нет |
nornad, передо мной стоит анлогичная задача, нужно получить html-код выделенного фрагмента, так вот хотелось бы узнать было ли найдено решение. Заранее благодарен.
|
|||
|
||||
| 1024 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 5.12.2006 Репутация: 1 Всего: 1 |
у всех текстовых компонентов есть метод javax.swing.text.JTextComponent.copy(), он помещает выделенный кусок текста в системный буфер в нескольких форматах.
если в JEditorPane загрузить хтмл, выделить какой-то кусок, вызвать метод copy, затем перейти в ворд и выбрать из меню Правка/Специальная вставка то он предложит на выбор формат плоского текста или хтмл и всё корректно вставит со ссылками. Т.е. это уже реализовано и прекрасно работает. У JEditorPane за контент в хтмл вероятно отвечает HTMLEditorKit (т.е. то что в javax.swing.JEditorPane.getEditorKit()), можно в нём посмотреть реализацию или тупо через клипбоард. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |