Russian Qt Forum
Ноябрь 22, 2024, 11:10 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить QDomNode для элемента с текстом из одних пробелов?  (Прочитано 6196 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Май 31, 2016, 13:43 »

Продолжаю решать задачку очистки форматирования в QTextEdit.

Если взять HTML-код методом:

Код:
textArea->textCursor().selection().toHtml()


засунуть его в QDomDocument, получить из DOM код XML и вставить его на прежнее место через QTextEdit::insertHtml(), то текст изменится. При каких условиях? А вот при каких.

Если на экране мы видим четыре пробела и текст, исходный HTML будет следующий:

Код:
<p>
  <span>    text</span>
</p>


При парсинге в QDomDocument, текстовый узел будет содержать текст

Код:
"    text"


Если на экране мы видим четыре пробела и ссылку, HTML будет следующий:

Код:
<p>
  <span>    </span>
  <a href="http://yandex.ru">
    <span>text</span>
  </a>
</p>


При парсинге в QDomDocument, текстовой ноды из четырех пробелов внутри элемента span не окажется! И таким образом, когда мы конвертнем обратно DOM в XML, эти четыре пробела пропадут. А нужно, чтоб они сохранились.

Вопрос. Как обойти такую проблему?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Май 31, 2016, 14:40 »

Правильно, потому что leading & trailing spaces are ignored.
Как вариант, использовать &nbsp; вместо пробелов.
Иначе что четыре, что двадцать четыре - роли не играют.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Май 31, 2016, 16:09 »

Правильно, потому что leading & trailing spaces are ignored.
Как вариант, использовать &nbsp; вместо пробелов.
Иначе что четыре, что двадцать четыре - роли не играют.


http://www.prog.org.ru/index.php?topic=30148 Улыбающийся
html к пробелам не очень хорошо относится

заменяйте пробелы строкой "&nbsp;"

Вот сам подумай. Ты предлагаешь заменить пробелы на неразрывные пробелы. А потом их нужно поменять на обычные пробелы. Вопрос. Как ты отличишь неразрывные пробелы, которые внесены были искусственно от неразрывных пробелов, которые изначально были в тексте?

И второе. Чтобы твой метод проверить, нужно решить другую задачу: как в HTML поменять пробел " " на на неразрывный пробел «амперсандnbsp;» так, чтобы захватились только пробелы в тексте. А пробелы в тегах и в атрибутах не затронулись.

Что-то я не могу составить такую заковыристую регулярку. В Qt в QRegEx еще есть проблема обработки многострочных строк - если регулярка попадет на перенос строки, она не отработает.

Записан

xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Май 31, 2016, 22:49 »

Правильно, потому что leading & trailing spaces are ignored.
Как вариант, использовать &nbsp; вместо пробелов.
Иначе что четыре, что двадцать четыре - роли не играют.

http://www.prog.org.ru/index.php?topic=30148 Улыбающийся
html к пробелам не очень хорошо относится

заменяйте пробелы строкой "&nbsp;"

Вот сам подумай. Ты предлагаешь заменить пробелы на неразрывные пробелы. А потом их нужно поменять на обычные пробелы. Вопрос. Как ты отличишь неразрывные пробелы, которые внесены были искусственно от неразрывных пробелов, которые изначально были в тексте?

И второе. Чтобы твой метод проверить, нужно решить другую задачу: как в HTML поменять пробел " " на на неразрывный пробел «амперсандnbsp;» так, чтобы захватились только пробелы в тексте. А пробелы в тегах и в атрибутах не затронулись.

Что-то я не могу составить такую заковыристую регулярку. В Qt в QRegEx еще есть проблема обработки многострочных строк - если регулярка попадет на перенос строки, она не отработает.


Поэтому вместо регулярок я и стал использовать парсинг в DOM. Вместо &nbsp; я заменяю пробелы в текстовых DOM-нодах на специальный UTF-8 символ ReplacementCharacter (при этом, само собой, не затрагиваются пробелы в тегах и атрибутах). А после вставки сгенерированного XML, заменяю этот символ на пробелы средствами курсора.

Теперь же проблема в том, что тупо не формируется текстовая DOM-нода внутри узла, у которого содержимое одни пробелы.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.