Russian Qt Forum

Qt => XML => Тема начата: xintrea от Май 31, 2016, 13:43



Название: Как получить QDomNode для элемента с текстом из одних пробелов?
Отправлено: xintrea от Май 31, 2016, 13:43
Продолжаю решать задачку очистки форматирования в QTextEdit (https://www.linux.org.ru/forum/development/12613447).

Если взять 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, эти четыре пробела пропадут. А нужно, чтоб они сохранились.

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


Название: Re: Как получить QDomNode для элемента с текстом из одних пробелов?
Отправлено: Racheengel от Май 31, 2016, 14:40
Правильно, потому что leading & trailing spaces are ignored.
Как вариант, использовать &nbsp; вместо пробелов.
Иначе что четыре, что двадцать четыре - роли не играют.


Название: Re: Как получить QDomNode для элемента с текстом из одних пробелов?
Отправлено: gil9red от Май 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 еще есть проблема обработки многострочных строк - если регулярка попадет на перенос строки, она не отработает.



Название: Re: Как получить QDomNode для элемента с текстом из одних пробелов?
Отправлено: xintrea от Май 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-нода внутри узла, у которого содержимое одни пробелы.