WYSIWYG: Каретки, большие и разные
От: c-smile Канада http://terrainformatica.com
Дата: 16.10.13 03:05
Оценка: 93 (1)
Это про редактирвание HTML в WYSIWYG mode (пагубность WYSIWYG не обсуждается — просто надо).

Предстаьте что есть документ с таблицей:
ПриветПока
111222
333444
Markup у нея естественно такой
<body>
  |<table>
    |<tr>
      <th>Привет</th><th>Пока</th>
    </tr>|
    |<tr>
      <td>111</td><td>222</td>
    </tr>|
    |<tr>
      <td>333</td><td>444</td>
    </tr>|
  </table>|
</body>


Помимо стандартных caret positions (между символами) в моем редакторе есть ещё позиции отмеченные '|'

Позиция между <body> и <table> нужна для того чтобы можно было вставить текст перед таблицей. То же после </table> — напечатать что-то после table.
Позиция перед <tr> нужна для того чтобы вставить row перед данным row. После </tr> — вставить после.

Вопрос: как должны выглядеть каретки в данных необычных позициях? Простая палка '|' не работает — вот эти две caret positions:
|<tr><td>|111

рисуются практически в одном месте и соотв. не различимы — нужен distinct look.

Какие будут идеи?


Вообще это все про следующую версию моего blocknote.net на движке Sciter3. Это будет WYSIWYG-editor — платформер, расширяемый скриптами редактор html (и не только).
Если у UX господ есть желание сказать новое слово в этом деле и сделать симпатичный редактор for the rest of us — свяжитесь со мной к взаимной пользе.
Re: WYSIWYG: Каретки, большие и разные
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.10.13 04:54
Оценка:
Здравствуйте, c-smile, Вы писали:

В виде скобок [ ] чтобы было понятно до или после? Каретка до таблицы высотой с таблицу, каретка до строки высотой со строку. Что в WYSIWYG делает <tr></tr> я не знаю.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: WYSIWYG: Каретки, большие и разные
От: c-smile Канада http://terrainformatica.com
Дата: 17.10.13 00:07
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, c-smile, Вы писали:


A>В виде скобок [ ] чтобы было понятно до или после? Каретка до таблицы высотой с таблицу, каретка до строки высотой со строку. Что в WYSIWYG делает <tr></tr> я не знаю.


Представь себе длинную таблицу и эти мигающие скобки на весь экран. Раздражать будет, нет?

А каретка на начале/конце row позволяет вставлять rows в темпе вальса без дополнительных меню и пр. Крайне удобно, далеко не один юзер мне спаибо уже сказал (в blocknote.net оно работает)
Re: WYSIWYG: Каретки, большие и разные
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 17.10.13 02:08
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Вопрос: как должны выглядеть каретки в данных необычных позициях? Простая палка '|' не работает — вот эти две caret positions:

CS>
CS>|<tr><td>|111 
CS>

CS>рисуются практически в одном месте и соотв. не различимы — нужен distinct look.

Возможно, конкретно для необычных позиций лучше как-то выделять редактируемый элемент, а каретку оставить как есть. Без мигания — например, обвести или подсветить.
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: WYSIWYG: Каретки, большие и разные
От: c-smile Канада http://terrainformatica.com
Дата: 17.10.13 06:15
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, c-smile, Вы писали:


DR>Возможно, конкретно для необычных позиций лучше как-то выделять редактируемый элемент, а каретку оставить как есть. Без мигания — например, обвести или подсветить.


Позиция каретки это место *между* двумя объектами, символами например.
В моем случае каретка может находиться между блоками (в DOM смысле).

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

<table>
 ...
</table>
<table>
 ...
</table>


У тебя должна быто возможность поставить каретку *между* таблицами чтобы вставить текст между ними.

Вот пример (там можно редактировать):
http://terrainformatica.com/tests/2tables.htm

Попробуй вставить что-то между таблицами — поймешь что я имею ввиду.
Re: WYSIWYG: Каретки, большие и разные
От: cgibin  
Дата: 17.10.13 14:33
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Какие будут идеи?


Отдельный режим? Есть же режим отображения спецсимволов, пусть будет и каретка "вставления". Если в какую-то позицию можно что-то вставить, и это не внутри текста, то вставляем пустую строку и каретку в начало — всё, что юзер введет затем оборачиваем нужными тегами.
Re[2]: WYSIWYG: Каретки, большие и разные
От: c-smile Канада http://terrainformatica.com
Дата: 17.10.13 16:39
Оценка:
Здравствуйте, cgibin, Вы писали:

C>Здравствуйте, c-smile, Вы писали:


CS>>Какие будут идеи?


C>Отдельный режим? Есть же режим отображения спецсимволов, пусть будет и каретка "вставления". Если в какую-то позицию можно что-то вставить, и это не внутри текста, то вставляем пустую строку и каретку в начало — всё, что юзер введет затем оборачиваем нужными тегами.


Как я уже сказал, не все позиции каретки предназначены для вставки текста. Некуда ту пустую строку вствлять.

Да и вставлять пустую строку, а потом её убирать если ничего не введено, тоже не красиво.
Зажимаешь LEFT на клавиатуре и смотришь веселые картинки.
Re[3]: WYSIWYG: Каретки, большие и разные
От: cgibin  
Дата: 17.10.13 20:56
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Зажимаешь LEFT на клавиатуре и смотришь веселые картинки.


Ну в твоем случае зажимаешь кнопку и ждешь, когда уже наконец эта каретка преодолеет несчастную табличку из пары строк. Или пытаешься перместить каретку на строчку вниз и внезапно понимаешь, что придется в несколько раз больше совершить нажатий.
Мне кажется, основной юзкейс все-таки навигация по контенту, а не исследование потрохов разметки, и нужно дать пользователю возможность явно обозначать свои намерения.
Re[4]: WYSIWYG: Каретки, большие и разные
От: c-smile Канада http://terrainformatica.com
Дата: 18.10.13 20:45
Оценка:
Здравствуйте, cgibin, Вы писали:

C>Здравствуйте, c-smile, Вы писали:


CS>>Зажимаешь LEFT на клавиатуре и смотришь веселые картинки.


C>Ну в твоем случае зажимаешь кнопку и ждешь, когда уже наконец эта каретка преодолеет несчастную табличку из пары строк. Или пытаешься перместить каретку на строчку вниз и внезапно понимаешь, что придется в несколько раз больше совершить нажатий.


Home/End в таблице ставит каретку в начало конец row.

Нужно мне наверно больше рассказать про что такое blocknote будет.
Blocknote не есть WYSIWYG редактор готовых web страниц. Такое сделать а) в принципе невозможно (в чистом WYSIWYG) да и b) никому особо не нужно.

Blocknote user model это web писатель. Если взять скажем wordpress сайт то Blocknote для редактирования текста article. Но не самой страницы которая включает в себя кучу генерирванного контента.
"web писатель" это общее понятие которая включает в себя, например, тебя когда тебе нужно написать markdown.md текст для GITа.
Это также и просто писатель который пишет книжку в формате fictionbook.fb и т.д.

Всем им нужен способ быстро и естесвенно печатать. Больше keyboard shortcuts — лучше. Без продирания через markdown или html конструкций.

C>Мне кажется, основной юзкейс все-таки навигация по контенту, а не исследование потрохов разметки, и нужно дать пользователю возможность явно обозначать свои намерения.


Не понял замечание если честно. Открой MS Word. Вставь таблицу, посмотри на их каретку в конце table row — поймешь что я имею ввиду. Какие там потроха разметки?
Re[3]: WYSIWYG: Каретки, большие и разные
От: rusted Беларусь  
Дата: 22.10.13 08:12
Оценка: 20 (1) +1
Здравствуйте, c-smile, Вы писали:

DR>>Возможно, конкретно для необычных позиций лучше как-то выделять редактируемый элемент, а каретку оставить как есть. Без мигания — например, обвести или подсветить.


CS>Позиция каретки это место *между* двумя объектами, символами например.

CS>В моем случае каретка может находиться между блоками (в DOM смысле).

CS>Например, представь что у тебя на экране две таблицы одна за другой:


CS>
CS><table>
CS> ...
CS></table>
CS><table>
CS> ...
CS></table>
CS>


CS>У тебя должна быто возможность поставить каретку *между* таблицами чтобы вставить текст между ними.


Когда каретка между таблицами — ничего не выделять. Когда каретка внутри таблицы, но перед первой строкой — подсвечиваем всю таблицу. Когда каретка внутри строки таблицы, но не в ячейке — подсвечиваем всю строку. Ну и когда каретка в ячейке — выделем саму ячейку.
Выделять-подсвечивать надо попробовать как изменением фона, так и всякими рамками-обводками — возможно какой-то из вариантов получится достаточно удобным.
Re: WYSIWYG: Каретки, большие и разные
От: Кодт Россия  
Дата: 25.10.13 15:15
Оценка:
Здравствуйте, c-smile, Вы писали:

Представь себе ещё более простую ситуацию: <b>one|</b>|<i>|two</i>
Тут между one и two целых три позиции, набор текста в которых будет давать разный эффект...

Впрочем, для данной ситуации есть общепринятое решение: считать, что позиция только одна: <b>one|</b><i>two</i>

А с таблицами — выход, наверное, в том, чтобы сделать ненулевую рамку (margin/boder/padding на твой вкус). Тогда будет видно, находится каретка до/после таблицы или в начале первой/конце последней клетки, в конце клетки или в начале следующей клетки.

Ещё вариант — подсвечивать (выделять рамкой или менять фон) текущую клетку, если каретка в ней.
Он будет плохо работать, если клетка таблицы содержит вложенную таблицу 1*1. И подсвеченной окажется то ли внешняя клетка, то ли внутренняя.

Развитие этого варианта: у текущей клетки не только подсветку менять, но и ширину padding'а принудительно ненулевую устанавливать.
Перекуём баги на фичи!
Re[2]: WYSIWYG: Каретки, большие и разные
От: c-smile Канада http://terrainformatica.com
Дата: 26.10.13 00:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, c-smile, Вы писали:


К>Представь себе ещё более простую ситуацию: <b>one|</b>|<i>|two</i>

К>Тут между one и two целых три позиции, набор текста в которых будет давать разный эффект...

На самом деле в blocknote и sciter так оно и есть.
Caret position у меня это struct cpos { int char_idx; bool before_or_after; };

Скажем для такого markup:
<p>one<b>two</b><p>

при движении вперед каретка останавливается здесь
<p>|o|n|e|<b>t|w|o|</b><p>

А если назад то здесь
<p>|o|n|e<b>|t|w|o|</b><p>

Т.е. если каретка между 'e' и 't' то напечатаныый символ окажется либо внутри <b> либо снаружи — в зависимости от того
с какой стороны ты туда пришел. Что в общем инуитивно естественно.

К>Впрочем, для данной ситуации есть общепринятое решение: считать, что позиция только одна: <b>one|</b><i>two</i>


Это работает для Word/MSRICHTEXT с его плоской DOM моделью. Для HTML (для профессиональных писателей) такое плох работает.
Google Docs кстати не зря используют flat model а не наивный HTML contenteditable. У них кажлая *строка* это отдельный <div>.
А кваретка это вообще <span> c border. На contenteditable нормальный редактор не сделать.

К>А с таблицами — выход, наверное, в том, чтобы сделать ненулевую рамку (margin/boder/padding на твой вкус). Тогда будет видно, находится каретка до/после таблицы или в начале первой/конце последней клетки, в конце клетки или в начале следующей клетки.


Сделал каретки трех типов: |,- (горизонтальная каретка между блоками) и Г — каретки для rows.

К>Ещё вариант — подсвечивать (выделять рамкой или менять фон) текущую клетку, если каретка в ней.

К>Он будет плохо работать, если клетка таблицы содержит вложенную таблицу 1*1. И подсвеченной окажется то ли внешняя клетка, то ли внутренняя.

К>Развитие этого варианта: у текущей клетки не только подсветку менять, но и ширину padding'а принудительно ненулевую устанавливать.


Это да. Для редактирвания вообще грузится отдельный edit-friendly.css
Re[3]: WYSIWYG: Каретки, большие и разные
От: Кодт Россия  
Дата: 28.10.13 07:47
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Т.е. если каретка между 'e' и 't' то напечатаныый символ окажется либо внутри <b> либо снаружи — в зависимости от того

CS>с какой стороны ты туда пришел. Что в общем инуитивно естественно.

Поспорил бы, что интуитивно и естественно.
Во-первых, в текущую позицию можно как побуквенно придти, так и прыгнуть несколькими разными способами:
— навигация по словам (Ctrl+стрелки)
— навигация по строкам (особенно, если шрифт не моноширинный, и вертикальное перемещение приводит и к горизонтальному тоже)
— поиск
— бэкспейс и удаление
— мышь
Если в случае навигации и, в принципе, поиска, можно говорить о направлении, то с мышью это не так.
А бэкспейс в какой контекст перемещает? Вроде бы, движение влево, но изменяется левый текст, значит, и продолжать ввод нужно от левого.

Во-вторых, нужно не только видеть, что на экране, но и помнить последнее действие. Отвернулся, забыл, вернулся, ой.
Отсюда — вырабатывается привычка специально двигать каретку влево-вправо перед набором текста.

К>>Впрочем, для данной ситуации есть общепринятое решение: считать, что позиция только одна: <b>one|</b><i>two</i>


CS>Это работает для Word/MSRICHTEXT с его плоской DOM моделью. Для HTML (для профессиональных писателей) такое плох работает.

CS>Google Docs кстати не зря используют flat model а не наивный HTML contenteditable. У них кажлая *строка* это отдельный <div>.
CS>А кваретка это вообще <span> c border. На contenteditable нормальный редактор не сделать.

К>>А с таблицами — выход, наверное, в том, чтобы сделать ненулевую рамку (margin/boder/padding на твой вкус). Тогда будет видно, находится каретка до/после таблицы или в начале первой/конце последней клетки, в конце клетки или в начале следующей клетки.


CS>Сделал каретки трех типов: |,- (горизонтальная каретка между блоками) и Г — каретки для rows.


Это позволит отличить внешний текст от таблицы. А таблицу от таблицы? (Смежные и, особенно, вложенные)


Кстати, вспомнил решение — специально для профессионалов и html-редакторов.
Выводить хлебные крошки в строке статуса. Это Macromedia Dreamweaver умел делать, и его младший брат, забыл, как он назывался. Очень удобно и понятно.
То есть, каретка визуально на месте, а крошки меняются. И мышью по крошкам можно прогуляться, заодно.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.