Abnormal programming
Python
HTML
February 2018 3

Новый облегчённый язык разметки текста на основе парных кавычек (pq)

From Sandbox
Я не могу объяснить, откуда пришла идея такого языка разметки, но то, что получилось в итоге — весьма… занятно.

Не слишком-то рассчитываю на широкое практическое применение этой штуки, но некоторые идеи, использованные в этом языке разметки, вполне могут дать пищу для размышлений и как-то поспособствовать развитию других существующих или новых языков.

Итак, перейду к описанию самого языка. [Если кто-то вдруг не понял, о чём вообще идёт речь, то к облегчённым языкам разметки относятся Markdown, BBCode, вики-разметка и т.п.]

Данная разметка основана на одиночных парных кавычках — символах и (вопрос выбора именно этих символов разъясняется ниже в P.S.), поэтому пока что я остановился на таком варианте названия: пк-разметка или pqmarkup (paired quotes markup).

Как же эти кавычки набирать на клавиатуре?


В ОС семейства Windows можно с помощью программы AutoHotkey назначить глобальные горячие клавиши для ввода любых спец-символов. Чтобы назначить например Alt+9 и Alt+0 для ввода одиночных парных кавычек достаточно добавить такие две строчки в файл-скрипт настроек:
Alt & 9:: SendInput {‘}
Alt & 0:: SendInput {’}

Также в Windows можно использовать без дополнительных настроек сочетание клавиш Alt+0145 (на цифровой клавиатуре) для открывающей кавычки и Alt+0146 для закрывающей (правда, работает это не во всех программах, а также требует определённого состояния NumLock).

Визуально на цифровой клавиатуре эти цифры расположены очень удачно:
┌───┬───┐
│ 4 │ 5 │
├───┼───┘
│ 1 │
├───┴───┐
│ 0     │
└───────┘

Похоже на открывающую квадратную скобочку [.
Очень легко запомнить.


Синтаксис пк-разметки


Оформление текста

*‘жирный’ жирный
_‘подчёркнутый’ подчёркнутый
-‘зачёркнутый’ зачёркнутый
~‘курсив’ курсив
Примечание:
Вот так не работает: ~*‘жирный курсив’ (будет просто ~жирный), пишите так: ~‘*‘жирный курсив’’ или так: *‘~‘жирный курсив’’ (так и задумано).
Обратите внимание, что использование отдельных символов для открывающей и закрывающей кавычек предоставляет возможность неограниченной вложенности элементов форматирования.

Ссылки и всплывающие подсказки


Ссылка[http://адрес]
Ссылка[http://адрес ‘текст всплывающей подсказки’]
Текст[‘текст всплывающей подсказки’]
Подробнее (больше примеров)
Пк-разметка HTML Как выглядит
[http://address] <a href="http://address">http://address</a> http://address
ссылка[http://address] <a href="http://address">ссылка</a> ссылка
ссылка[https://address] <a href="https://address">ссылка</a> ссылка
‘многословная ссылка’[http://address] <a href="http://address">многословная ссылка</a> многословная ссылка
ссылка[https://address ‘текст всплывающей подсказки’] <a href="https://address" title="текст всплывающей подсказки">ссылка</a> ссылка
текст[‘текст всплывающей подсказки’] <abbr title="текст всплывающей подсказки">текст</abbr> текст


Заголовки, картинки, цвет и таблицы

Н (русская) H (английская) Название заголовка\Header
Р (русская) P (английская) Рисунок\Picture [почему не I(image)]
С (русская) C (английская) цвет(Свет)\Color
Т (русская) T (английская) Таблица\Table
Примеры:
Заголовок — Н‘Название заголовка’
Картинка — Р‘http://адрес_картинки’
Текст красным цветом — С(#фф0000)‘текст’
Подробнее (больше примеров)
Пк-разметка HTML Как выглядит
Заголовки\Headers
H‘Заголовок’ <h3>Заголовок</h3>

Заголовок

H(0)‘Заголовок’
H(1)‘Заголовок’ <h2>Заголовок</h2>

Заголовок

H(+1)‘Заголовок’
H(-1)‘Заголовок’ <h4>Заголовок</h4>

Заголовок

Изображения/картинки\Pictures
P‘https://.../blue_circle.png’ <img src="https://.../blue_circle.png" />
P‘https://.../blue_circle.png’[http://address] <a href="http://address"><img src="https://.../blue_circle.png" /></a>
P‘https://.../blue_circle.png’[‘текст всплывающей подсказки’] <img src="https://.../blue_circle.png" title="текст всплывающей подсказки" />
P‘https://.../blue_circle.png’[http://address ‘текст всплывающей подсказки’] <a href="http://address" title="текст всплывающей подсказки"><img src="https://.../blue_circle.png" /></a>
Цвет текста
Цвет задаётся в формате #ККЗЗСС (Красный, Зелёный, Синий) посредством шестнадцатеричных цифр (можно использовать кириллицу: абсдеф/АБСДЕФ является аналогом abcdef/ABCDEF) или в формате КЗС посредством цифр от 0 до 8.
С(#ff0000)‘красный текст’ <span style="color: #ff0000">красный текст</span> красный текст
<font color="#ff0000">красный текст</font>
С(800)‘тоже красный текст’ <span style="color: #FF0000">тоже красный текст</span> тоже красный текст
<font color="#FF0000">тоже красный текст</font>
С(000)‘чёрный текст’ <span style="color: #000000">чёрный текст</span> чёрный текст
<font color="#000000">чёрный текст</font>
С(4)‘серый текст’ <span style="color: #808080">серый текст</span> серый текст
<font color="#808080">серый текст</font>
С(-880)‘текст на жёлтом фоне’ <span style="background-color: #FFFF00">текст на жёлтом фоне</span>
Таблицы
Т‘
Н‘‘A’ ‘B’ ‘C’’
 ‘‘1’ ‘2’ ‘3’’
<table>
<tr><th>A</th><th>B</th><th>C</th></tr>
<tr><td>1</td><td>2</td><td>3</td></tr>
</table>
A B C
1 2 3
Объединение ячеек таблицы
Чтобы объединить ячейки таблицы, нужно каждую отсутствующую ячейку заменить на символ - или символ | таким образом, чтобы следуя по символу - влево и по символу | вверх можно было выйти на соответствующую значимую ячейку.
Т‘‘
‘A’ ‘B’
’‘
‘C’  -
’’
<table>
<tr><td>A</td><td>B</td></tr>
<tr><td colspan="2">C</td></tr>
</table>
A B
C
T‘‘
‘ ’ ‘ ’ ‘1’ ’‘
‘ ’ ‘ ’  |  ’‘
‘2’  -   |  ’’
<table>
<tr><td> </td> <td></td><td rowspan="3">1</td></tr>
<tr><td> </td> <td></td></tr>
<tr><td colspan="2">2</td></tr>
</table>
    1
   
2
T‘‘
‘ ’ ‘ ’ ‘1’ ’‘
‘ ’ ‘ ’  |  ’‘
‘2’  -   -  ’’
<table>
<tr><td> </td><td> </td><td rowspan="2">1</td></tr>
<tr><td> </td><td> </td></tr>
<tr><td colspan="3">2</td></tr>
</table>
    1
   
2
Для больших объединений ячеек (2х2 и более): вправо от значимой ячейки идут символы -, вниз идут символы |, а остальные отсутствующие ячейки можно заполнять либо символом - либо |, но рекомендуется всегда использовать -.
T‘‘
‘1’  -   -  ‘2’ ’‘
 |   -   -  ‘3’ ’‘
 |   -   -  ‘4’ ’‘
‘5’ ‘6’ ‘7’     ’’
<table>
<tr><td colspan="3" rowspan="3">1</td><td>2</td></tr>
<tr><td>3</td></tr>
<tr><td>4</td></tr>
<tr><td>5</td><td>6</td><td>7</td></tr>
</table>
1 2
3
4
5 6 7


Комментарии


[[[комментарий/контейнер для воды (:]]]


Полное описание синтаксиса форматирования.



(Если кому интересно, вот немного истории выбора тегов [для таблиц])
Изначально я планировал альтернативный вариант задания тегов. Вот такой:
[[H]Header/Заголовок[-H]]
или
[[H]Header/Заголовок[-]]
или
[[H]Header/Заголовок]

Соответственно, таблицы задавались тегом [[T]...]
Разделитель столбцов был таким — []
Разделитель строк был таким — [[]]

Пример таблицы:
[[Т]
A[]B[]C
[[]]
1[]2[]3
[-Т]]
или так:
[[Т]
[[]]A[]B[]C
[[]]1[]2[]3
[-Т]]
(Закрывающий тег [-Т] можно опустить.)

Но потом я вспомнил, что несколько вариантов выбора для одного и того же форматирования — это то, что мне не нравится в Markdown (например: __так__ или **так**), и я решил, что оставлять два варианта форматирования в пк-разметке (~‘...’ и [[~]...]) будет неправильно. А значит, имеет смысл оставить только одну форму записи — с кавычками ‘’, так как она менее конфликтующая и является первой/основной идеей, положившей начало этой разметки текста {а то, что набирать символы кавычек и непривычно — я считаю, это не так страшно, так как [с моей точки зрения] важнее читаемость разметки и её когнитивные характеристики (легко понять/запомнить правила разметки, легко читать/воспринимать размеченный текст), а также снижение вероятности возникновения конфликтов (когда простой текст или формула [ошибочно/]ненамеренно трактуется как разметка) и избежание необходимости что-то экранировать (а то ведь часто можно и пропустить/не заметить такие ошибки — когда размеченный текст преобразовался немного не в то, что задумывалось)}.

Определившись с выбором в пользу кавычек, сначала я хотел сделать такой разделитель строк — ‘’ (по аналогии с []), но быстро одумался (ведь тогда возникает проблема с пустыми ячейками в самой таблице) и пришёл к нынешней форме записи:
Т‘
‘‘A’ ‘B’ ‘C’’
‘‘1’ ‘2’ ‘3’’

или так:
Т‘‘
‘A’ ‘B’ ‘C’
’‘
‘1’ ‘2’ ‘3’
’’

(Разумеется, эта форма записи не самая приятная для набора и я немало думал над тем, возможно ли её как-то упростить (или хотя бы дать возможность альтернативной более простой формы записи для таблиц, как в GitHub Flavored Markdown или в Habrahabr Flavored Markdown [к слову сказать, в большинстве реализаций Markdown не поддерживаются таблицы без заголовков]), но решил остановиться на нынешней форме записи, так как она итак достаточно лёгкая (по сравнению с HTML <table>) и при этом имеет неоспоримое преимущество [перед более простой формой записи] — возможность включать в ячейку таблицы всё что угодно (включая любые другие элементы разметки и даже вложенные таблицы), а также нынешняя форма записи даёт возможность использовать пробелы в начале и в конце строки любой ячейки таблицы (возможность спорная, но может пригодиться для экспорта таблиц баз данных).)

(Если кому интересно, вот история/‘как я пришёл к’ нынешней форме записи для объединения ячеек таблицы)
… не, решил спрятать в комментарий и не включать в статью, а если кому это и правда интересно, тогда смотрите исходник статьи.

Исходник данной статьи написан на пк-разметке. Преобразован к формату Habr HTML посредством реализации на Python (c флагом командной строки --habr-html).

P.S.
Причины (впрочем, достаточно субъективные), почему я выбрал именно символы ‘’ (а не `´ или, скажем, «» или “”):

  1. Они достаточно приятно выглядят (в соответствующем шрифте [например, Courier New]). На мой взгляд, лучше, чем «» или ‹›.
  2. Они идут подряд друг за другом в любой кодировке (в отличие от `´ или «» или ‹›) [также как и “”].
  3. Почему не “” — в русских текстах парным символу является (Экранная типографика. Кавычки).
  4. А ещё мне коды[/годы] этих символов нравятся...
    201? и 201¿

Один существенный минус символов кавычек и в том, что символ закрывающей одиночной кавычки согласно текущему стандарту Юникод является предпочтительным символом в качестве знака апострофа, и во многих документах и веб-страницах на английском языке символ действительно используется в качестве апострофа (например так: Don’t), в том числе — в сгенерированной документации к Python, впрочем в HTML-коде там используетсяещё недавно использовался HTML entity &#8217;, а в исходных rst-файлах документации используется обычный апостроф ' — так что и html (при использовании &#8217;) и rst-файлы можно заключать в такие кавычки без проблем [и, к слову, наиболее известные [мне] типографы (за редким исключением) вставляют HTML-entity &rsquo; [или &#146; или &#39; или &#8217;], а не непосредственно сам символ закрывающей кавычки , а если посмотреть на крупнейшие англоязычные новостные ресурсы, то можно заметить, что на многих из них в качестве апострофа используется просто символ апострофа ' (вопреки рекомендации Unicode Consortium)], но если есть такая необходимость, то пк-разметка позволяет вставить непарную открывающую и закрывающую кавычку: так `‘` или так '‘’ (смотри Дополнительные возможности форматирования. "Сырой"\Raw HTML).

Ещё один минус [символов кавычек и ]неоднозначность отображения символов и во многих популярных шрифтах. В частности, в Consolas, используемом в GitHub и Bitbucket. И вообще, символы парных кавычек в разных шрифтах выглядят по-разному (в том числе и в моноширинных шрифтах для программирования):

[На мой взгляд, это просто показывает, что в целом отсутствует чёткое/однозначное представление о том, как должны выглядеть эти символы.]

(Кстати, на Хабре символы одиночных парных кавычек отображались вполне приемлимо (по крайней мере, в Windows) за счёт использования Verdana для основного текста и Courier New для кода, но несколько месяцев назад шрифт для основного текста статей поменяли на Arial, из-за чего пришлось немного подправлять статью — заменять ‘ и ’ на и (в pq: `‘` и `’`).)
+21
14.8k 24
Comments 66