xintrea / mytetra_dev

MyTetra - smart crossplatform manager for information collecting / MyTetra - кроссплатформенный менеджер накопления информации / Официальная страница:
http://webhamster.ru/site/page/index/articles/projectcode/105
254 stars 55 forks source link

Улучшено форматирование выделенного текста, как Code. #91

Closed DikBSD closed 5 years ago

DikBSD commented 5 years ago

Учитываются мягкие переносы до выделенного текста (1-й символ до выделения) и в выделенных абзацах. Добавлен код, который заменяет мягкие переносы на "пустой" абзац.

xintrea commented 5 years ago

DikBSD, надо бы проверить работу кода при выделении справа-налево (снизу-вверх, что то же самое). Навскидку я вижу, что эта ситуация не обрабатывается.

DikBSD commented 5 years ago

Я проверял много раз: выделял текст снизу--вверх, и сверху-вниз. Все работало корректно: исправленный html текст вставлялся куда нужно. Просто в коде этого pull request используется поиск "мягкого переноса" с помощью регулярного выражения, а ему (regexp) без разницы, как происходит выделение. Если вы имеете ввиду вставку обработанного результата, то выделение можно не удалять пред insertHtml - выделенный текст заменяется автоматически новым средствами QTextCursor. Впрочем, я завтра еще раз проверю на работе...

DikBSD commented 5 years ago

Я еще раз все проверил - обработка мягкого переноса работает независимо от того, как было сделано выделение: снизу-вверх или же сверху-вниз. Проверил и в коде и в откомпилированной MyTetra на самых разных вариантах комбинации текста мягким переносом в конце, текста с "нормальным" переносом в конце, с чередованием пустых абзацев, абзацев с мягким переносом... Все работает.

xintrea commented 5 years ago

Я принял коммит на посмотреть, но так и не понял, что этот коммит исправляет.

Насколько я понимаю, была проблема: если в конце выделения стоял мягкий перенос строки, то выделение не форматировалось в код, потому что получалось, что пользователь не сделал выделение по границам абзацев (т. к. мягкий перенос - это середина строки, а не граница абзаца).

Ну вот я сейчас сделал три строки, в конце третьей стороки сделал мягкий перенос, выделил эти три строки и нажал форматирование в код. Форматирование не происходит.

DikBSD commented 5 years ago

Только что еще раз проверил на своем тестовом файле - все форматируется в Code. Я прикрепил к этому сообщению тестовый файл из MyTetra - сжал его в zip. Там несколько вариантов ситуаций с комбинацией мягкого переноса, когда форматирование в Code не срабатывало. Набрал их из Интернет сайтов. На них и отлаживал алгоритм. Попробуйте, если и на них не пойдет, буду смотреть, в чем дело. text.zip

xintrea commented 5 years ago

Вот я сделал видео с проблемами (одна основная, пара несущественных):

https://www.youtube.com/watch?v=ZyzW3M9CHuc

В этом видео демонстрируется три проблемы:

  1. Если в конце выделенного фрагмента есть мягкий перенос, то форматирования в текст не происходит

  2. Меняется мягкий перенос на обычный вне выделенного текста, если он стоит перед выделенным текстом. Такое поведение обсуждаемо, может без этого никак.

  3. Скачет область текста при попытке форматирования в код (сдвигается так что видно первую строчку, ближе к концу ролика, 57-я секунда).

DikBSD commented 5 years ago

Спасибо, я сейчас посмотрю...

DikBSD commented 5 years ago

Пока по вопросу 2:

Меняется мягкий перенос на обычный вне выделенного текста, если он стоит перед выделенным текстом. Такое поведение обсуждаемо, может без этого никак. Сам мягкий перенос не несет между абзацами никакой "функциональной нагрузки". Он между абзацами "подразумевается", как смысловое разделение этих абзацев. Поэтому:

  1. Его замена на абзац не причиняет "вреда" тексту.
  2. Обработка html исходника выделенного текста используемыми регулярными выражениями текста требует, чтобы ДО выделенного текста и/или ПОСЛЕ (в разных ситуациях) не было мягкого переноса. Иначе обработки html исходника не происходит. Исходя из этого я принял решение о замене мягкого переноса вне выделенного текста (одного выше и/или одного ниже) на "пустой абзац".

По остальным вопросам напишу чуть позже (прогоню код под отладчиком).

P.S. Не могли бы Вы прикрепить сюда свой файл?

DikBSD commented 5 years ago

По вопросу 3:

Скачет область текста при попытке форматирования в код (сдвигается так что видно первую строчку, ближе к концу ролика, 57-я секунда). Скачек происходит из-за того, что перед вставкой нового текста textArea->textCursor().insertText() используется удаление выделенного текста textArea->textCursor().removeSelectedText(); Если строки с textArea->textCursor().removeSelectedText()) удалить, то скачка не будет. В принципе, можно перед вставкой вообще не удалять выделенный текст, так как вставка textArea->textCursor().insertText() просто заменяет выделение на свое содержимое. Я уберу эти 2 строки с удалением выделения. И пришлю новый Pool Request.

xintrea commented 5 years ago

Не могли бы Вы прикрепить сюда свой файл?

Да просто сделай пару строк с обычным переносоми и третью с мягким (Shift+Enter) вот и все. На видео видно эти переносы.

xintrea commented 5 years ago

Самое главное - разобраться с вопросом 1.

DikBSD commented 5 years ago

Да просто сделай пару строк с обычным переносоми и третью с мягким (Shift+Enter) вот и все. На видео видно эти переносы.

Воспроизвел проблему. Завтра постараюсь решить ее.

DikBSD commented 5 years ago

Улучшено форматирование, как Code Исправлены замечания по Pool Request:

  1. Внесены изменения в код, учитывающие мягкий перенос в конце выделения. Форматирование Codo проходит корректно.
  2. Устранен скачек области текста при попытке форматирования в Code. Для этого удален код textArea->textCursor().removeSelectedText(), который избыточен, так как вставка текста в html в выделенную курсором область (textArea->textCursor().insertText()) просто заменяет эту область.