Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n) Topic is solved

Здесь можно сообщить о найденных багах в Far.
Post Reply
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by buniak_a_h »

Извините, если повторяюсь …
Предположим, есть некий текст, содержащий несколько строк, разделённых LF(\n)
Есть элемент диалога DI_TEXT (y2 > y1) с флагом DOF_WORDWRAP
Перевод строки начинает работать только в случае, если строка целиком не помещается в DI_TEXT по ширине. Если помещается - выводится псевдографика. Например, можно получить такое:
image.png
image.png (9.12 KiB) Viewed 1131 times
На картинке - текст состоит из 6-ти строк qqqqqqqqqqqq vvvvvvvvvvvv, разделённых '\n'

Для иллюстрации предлагаю такой маленький тестик:
  1. local F=far.Flags
  2. local tin=table.insert
  3. ----------------------------------------------------------------------
  4. local WList=23
  5. local function Di_Show(aTable, iRep)
  6.  local VerList = {{Text='111'};{Text='222'}}
  7.  local DlgItems = {}
  8.  local h,w=Far.Height-6,Far.Width-8
  9.  local y=2
  10.  local function Add(a) tin(DlgItems, a) end
  11.  Add{"DI_DOUBLEBOX",3,1,w-4,h-4,0,0,0,0,'History'}
  12.  Add{"DI_LISTBOX", 5,y,5+WList,h-9,VerList,0,0,
  13.      {DIF_LISTNOAMPERSAND=1;DIF_LISTWRAPMODE=1;DIF_LISTNOCLOSE=1;DIF_LISTNOBOX=1; DIF_FOCUS=1;}
  14.     };
  15.  Add{"DI_TEXT",8+WList, y, w-6, h-8, 0,0,0, F.DIF_WORDWRAP, ('qqqqqqqqqqqq vvvvvvvvvvvv\n'):rep(iRep) .. '<end>'}
  16.  Add{"DI_SINGLEBOX",6+WList,y,6+WList,h-8,0,0,0,0}
  17.  Add{"DI_TEXT",-1,WList-1,0,0,0,0,0,F.DIF_SEPARATOR}
  18.  Add{"DI_BUTTON",-1,WList,-1,0,0,0,0,{DIF_CENTERGROUP=1;DIF_DEFAULTBUTTON=1},'Ok'};
  19.  --local
  20.  far.Dialog(win.Uuid"7494C755-004A-43C8-A183-1FE2E69175B7", -1, -1, w, math.max(WList+2, y+3), nil, DlgItems)
  21. end -- Di_Show
  22.  
  23. for i=1,math.huge do
  24.  Di_Show({}, i)
  25.  if far.Message("Продолжить?", "", ';YesNo') ~= 1 then break end
  26. end
Last edited by buniak_a_h on Fri 06 Dec, 2019 02:06, edited 1 time in total.
User avatar
HaRT
Moderator
Posts: 9651
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 119 times
Been thanked: 244 times

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by HaRT »

Терминологическая поправка: LF (Line Feed; \n, 0x0A) — это не «ВК», а «ВК» (Возврат Каретки) — это CR (Carriage Return; \r, 0x0D).
Фар есть инструмент, а не нянька. © 2009 DrKnS
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by buniak_a_h »

HaRT wrote: Fri 06 Dec, 2019 00:34 Терминологическая поправка: LF (Line Feed; \n, 0x0A) — это не «ВК», а «ВК» (Возврат Каретки) — это CR (Carriage Return; \r, 0x0D).
Спасибо. Проблема, скорее, с английским. Так-то я помню, что \r - это CR. А вот как на русском …
А по сути - ещё хуже. Если в качестве разделителя указать CR_LF (\r\n), то рисуется нотка от \r. Понятно, что это уже капризы, но указанное в головном сообщении поведение - явно не то, чего ждут!
Ну или такое поведение надо отразить в документации. Типа "дополняйте текст до максимальной длины пробелами". А то забывается ведь!
Last edited by buniak_a_h on Fri 06 Dec, 2019 02:09, edited 2 times in total.
User avatar
DrKnS
Posts: 5785
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 10 times
Been thanked: 330 times

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by DrKnS »

buniak_a_h wrote: Fri 06 Dec, 2019 01:57 поведение надо отразить в документации
А что, где-то в документации обещано, что \r или \n в DI_TEXT будут обрабатываться каким-то специальным образом?
User avatar
John Doe
Бюрократ
Posts: 12997
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 40 times
Been thanked: 310 times

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by John Doe »

buniak_a_h wrote: Fri 06 Dec, 2019 00:14 Для иллюстрации предлагаю такой маленький тестик:
Маленький тестик содержит много лишнего.
(Хотел было поддержать, но расхотелось продираться через ненужный код)
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by buniak_a_h »

John Doe wrote: Fri 06 Dec, 2019 12:52 Маленький тестик содержит много лишнего.
Извините, выдрал кусок работающего скрипта и зациклил. Почищу.
buniak_a_h
Posts: 2285
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 139 times
Been thanked: 245 times
Contact:

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by buniak_a_h »

DrKnS wrote: Fri 06 Dec, 2019 10:25 А что, где-то в документации обещано, что \r или \n в DI_TEXT будут обрабатываться каким-то специальным образом?
А если нет, то почему обрабатываются? Если вся строка не помещается по ширине, то перенос происходит именно по \n . Хотя написано:
%FARHOME%\Encyclopedia\FarEncyclopedia.ru.chm::/html/dialogapi/flags/dif_wordwrap.html wrote:Флаг DIF_WORDWRAP усекает очередное слово, если оно не вмещается по ширине элемента.
а усекает по LF. Видимо, к нему всё же "особое отношение", но включается только если включается WordWrap.
User avatar
HaRT
Moderator
Posts: 9651
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 119 times
Been thanked: 244 times

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by HaRT »

buniak_a_h wrote: Fri 06 Dec, 2019 14:00
%FARHOME%\Encyclopedia\FarEncyclopedia.ru.chm::/html/dialogapi/flags/dif_wordwrap.html wrote:Флаг DIF_WORDWRAP усекает очередное слово, если оно не вмещается по ширине элемента.
а усекает по LF. Видимо, к нему всё же "особое отношение", но включается только если включается WordWrap.
С одной стороны, вроде вполне разумное поведение для многострочного поля ввода текста: если всё вмещается в одну строку, ничего разбивать не требуется; если не вмещается, то разбиваем в первую очередь по переводам строки; если этого недостаточно, то разбиваем между словами (как быть с непробельными символами не-слова — вопрос тонкий); если и это не помогло, разбиваем внутри слов.

С другой стороны, раз уж поле ввода многострочное, то почему бы сразу не учитывать переводы строк интуитивным образом…
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 5785
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 10 times
Been thanked: 330 times

Некорректная работа с многострочными текстами в элементе DI_TEXT с флагом DIF_WORDWRAP, если в тексте есть LF (\n)

Post by DrKnS »

buniak_a_h wrote: Fri 06 Dec, 2019 14:00 А если нет, то почему обрабатываются? Если вся строка не помещается по ширине, то перенос происходит именно по \n
Действительно. Значит, баг.
Post Reply

Return to “Глюки и баги”