Проект нового языка разметки

AndrewVK AndrewVK
Abyx
Abyx
01.09.2014 06:03
Здравствуйте, AndrewVK, Вы писали:

круто, но чем плохи существующие — markdown, textile, etc
AndrewVK
AndrewVK
01.09.2014 06:07
Здравствуйте, Abyx, Вы писали:

A>круто, но чем плохи существующие — markdown, textile, etc


textile не очень удобен, а в markdown много чего не хватает. Вот тут тема есть — http://rsdn.ru/forum/rsdn/4862086.1, в ней в том числе и этот вопрос обсуждался. Этот документ, собственно, на ее основе создан, я его просто перетащил сюда с битбакета, чтобы можно было обсуждать, а заодно и wiki потестировать.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
A-Myth
A-Myth
02.09.2014 12:31
AVK>textile не очень удобен, а в markdown много чего не хватает. Вот тут тема есть — http://rsdn.ru/forum/rsdn/4862086.1, в ней в том числе и этот вопрос обсуждался. Этот документ, собственно, на ее основе создан, я его просто перетащил сюда с битбакета, чтобы можно было обсуждать, а заодно и wiki потестировать.

Для markdown есть несколько расширений. Плюс никто не мешает написать свой.
Они много где используются и поддерживаются.
Десятилетие обкатки.
А единый устраивающий всех язык разметки всё равно не создать.
AndrewVK
AndrewVK
02.09.2014 12:35
Здравствуйте, A-Myth, Вы писали:

AM>Для markdown есть несколько расширений. Плюс никто не мешает написать свой.


Ну а если писать свой, то тогда в чем вопрос?

AM>Они много где используются и поддерживаются.


Там в топике есть ссылки, и markdown далеко не на первом месте по популярности.

AM>Десятилетие обкатки.


Десятилетие это сильно сказано. Я точно помню что в 2009 это был еще довольно малоизвестный формат. Опять же, bbcode в разы старше, если уж на обкатку ориентироваться.

AM>А единый устраивающий всех язык разметки всё равно не создать.


Но можно создать такой, который устраивает максимальное количество. Да и не в устраиваемости дело, а в удобстве. Большая часть разметок создана хаотично, люди явно не везде тщательно задумывались об удобстве. А у нас еще и специфика двуязычной клавиатуры накладывается.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
A-Myth
A-Myth
02.09.2014 12:42
AM>>Для markdown есть несколько расширений. Плюс никто не мешает написать свой.
AVK>Ну а если писать свой, то тогда в чем вопрос?

Имел в виду — "своё". Расширение. А основную базу оставить от markdown.
По поводу популярности: "Sites such as GitHub, reddit, Diaspora, Stack Exchange, OpenStreetMap, and SourceForge use variants of Markdown to facilitate discussion between users"

Тут, конечно, дело вкуса и свободного времени, если есть возможность, то создавайте и обкатывайте — "больше языков хороших и разных".
AndrewVK
AndrewVK
02.09.2014 12:54
Здравствуйте, A-Myth, Вы писали:

AM>Имел в виду — "своё". Расширение. А основную базу оставить от markdown.


База в обсуждаемом проекте от markdown с creole и оставлена, по возможности. Ты почитай топик то, там с markdown все и начиналось.

AM>По поводу популярности: "Sites such as GitHub, reddit, Diaspora, Stack Exchange, OpenStreetMap, and SourceForge use variants of Markdown to facilitate discussion between users"


Ну вот и у нас будет variant of Markdown.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
PM
PM
04.09.2014 04:43
Здравствуйте, AndrewVK, Вы писали:

AVK>Ну вот и у нас будет variant of Markdown.


Есть спецификация Markdown: http://standardmarkdown.com
AndrewVK
AndrewVK
01.09.2014 06:03
Перекинул сюда чтобы удобнее было обсуждать и не потерялось. Корневое сообщение темы помечено как wiki статья, т.е. доступно для редактирования.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Ops
Ops
03.09.2014 08:48
Здравствуйте, AndrewVK, Вы писали:

Как я понял, оттенок цитат — это первый шаг. Но что-то неочень градиент, 1-2 уровня цитаты контрастные, а некоторые сливаются (у меня). Девочку бы посадить, настроить, с 5+ разными мониторами...
AndrewVK
AndrewVK
03.09.2014 09:13
Здравствуйте, Ops, Вы писали:

Ops>Как я понял, оттенок цитат — это первый шаг.


Нет. Это просто 100 лет висевшая микрозадачка, которую несложно было сделать. В янусе практически с самого начала реализовано в редакторе.

Ops>Но что-то неочень градиент, 1-2 уровня цитаты контрастные, а некоторые сливаются (у меня).


А остальные не очень и важно. Их, по хорошему, вообще не должно быть, удалять надо.

Ops> Девочку бы посадить, настроить, с 5+ разными мониторами...


Девочку это мы завсегда за
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Ops
Ops
03.09.2014 09:24
Здравствуйте, AndrewVK, Вы писали:

Ops>> Девочку бы посадить, настроить, с 5+ разными мониторами...

AVK>Девочку это мы завсегда за

Если столько разных мониторов есть — могу жену попросить, она с цветами неплохо разбирается (именно поэтому девочку). Но без этих ваших грязных намеков.
Ops
Ops
05.09.2014 08:14
Здравствуйте, AndrewVK, Вы писали:

Ops>>Как я понял, оттенок цитат — это первый шаг.


AVK>Нет. Это просто 100 лет висевшая микрозадачка, которую несложно было сделать. В янусе практически с самого начала реализовано в редакторе.


Вот тут баг.
AndrewVK
AndrewVK
05.09.2014 08:15
Здравствуйте, Ops, Вы писали:

Ops>Вот тут баг.


http://track.rsdn.ru
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
Ops
Ops
05.09.2014 08:27
Здравствуйте, AndrewVK, Вы писали:

AVK>http://track.rsdn.ru


Уболтал, зарегаюсь. Но тогда еще реквест сквозной регистрации запощу туда
AndrewVK
AndrewVK
05.09.2014 11:26
Здравствуйте, Ops, Вы писали:

Ops>Уболтал, зарегаюсь. Но тогда еще реквест сквозной регистрации запощу туда


Пости конечно, но в Youtrack с этим довольно глухо.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
_Raz_
_Raz_ **
05.09.2014 01:35
Здравствуйте, AndrewVK, Вы писали:

AVK>Выделяется символами ** с обеих сторон. При этом слева от открывающей ** должен быть пробел или начало строки, а справа не пробел и не конец строки. Для закрывающей, соответственно, не пробел и не начало строки слева, и пробел или конец строки справа.


Как насчет такого:

Глагол run — это неправильный глагол. Важно знать его формы наизусть.
формы глагола run

1 форма глагола run — r**u**n (первая форма это и есть сам глагол)
2 форма глагола run — r//a//n
3 форма глагола run — r**u**n

Standard Markdown Spec: 6.4 Emphasis and strong emphasis
AndrewVK
AndrewVK
05.09.2014 01:40
Здравствуйте, _Raz_, Вы писали:

_R_>Standard Markdown Spec: 6.4 Emphasis and strong emphasis


В принципе, можно использовать правила из SMD. Поправь только страничку с описанием здесь.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AndrewVK
AndrewVK Спецификация языка разметки
05.09.2014 01:52

Спецификация разметки


Общие правила и определения


Пробельный символ это символ:
  1. Unicode символ CharacterTabulation
  2. Unicode символ LineTabulation
  3. Unicode символ FormFeed
  4. Unicode символ ZeroWidthNoBreakSpace
  5. Символ с unicode классом Zs

Разметка делится на две уровня. Разметка уровня документа и разметка содержимого.

К разметке уровня документа относятся:
  1. Заголовки.
  2. Списки.
  3. Цитаты сообщений.
  4. Блоковые цитаты (Blockquote).
  5. Таблицы.
  6. Горизонтальный разделитель (вертикальная черта, hr).
  7. Сообщение модератора или системы.
  8. Теглайны.
  9. Параграфы.

К разметке содержимого относится:
  1. Стили: жирный, курсив, подчеркнутый, зачеркнутый, верхний и нижний индексы.
  2. Ссылки.
  3. Картинки.
  4. Смайлики.
  5. Код.





Разметка уровня документа


Заголовки

= Уровень 1
== Уровень 2
=== Уровень 3
==== Уровень 4
===== Уровень 5
====== Уровень 6

Выходной HTML
<h1>Уровень 1</h1>
<h2>Уровень 2</h2>
<h3>Уровень 3</h3>
<h4>Уровень 4</h4>
<h5>Уровень 5</h5>
<h6>Уровень 6</h6>



Параграфы

Начало строки — начало параграфа. Конец строки — соответственно конец. Пустые строки между параграфами игнорируются. Если параграф начинается с пробелов или табуляций — они убираются, а вместо этого в параграфе фиксируется количество отступов. За один отступ считается одна табуляция или два пробела. Нечетное количество пробелов округляется до четного в меньшую сторону.
One Two

  Three
    Four

Выходной HTML
<p class='plain-text'>One Two</p>
<p class='plain-text indent1'>Three</p>
<p class='plain-text indent2'>Four</p>


Цитаты сообщений

Строка цитаты имеет следующий формат:
* Префикс из символов, цифр и знака подчеркивания, без пробелов, длиной от 0 до 6 символов.
* Произвольное количество символов >. Количество символов определяет уровень вложенности.
* Произвольный текст до конца строки.
A>> O La La
Bb> One Two

Выходной HTML
<span class='quota level2'><span class='quota-prefix'>A&gt;&gt;</span>O La La</span>
<span class='quota level1'><span class='quota-prefix'>Bb&gt;&gt;</span>O La La</span>



Списки


Ненумерованный список

Элемент списка — строка, начинающаяся с одного или нескольких символов * (в зависимости от уровня вложенности) и следующего за ним пробела.
* Item 1
** Item 1.1
* Item 2
* Item 3

Выходной HTML
<ul>
  <li>Item 1</li>
  <ul>
    <li>Item 1.1</li>
  </ul>
  <li>Item 2</li>
  <li>Item 3</li>
</ul>


Нумерованный список

Элемент списка — строка, начинающаяся с символа # или № и следующего за ним пробела
№ Item 1
## Item 1.1
№ Item 2
№ Item 3

Выходной HTML
<ol>
  <li>Item 1</li>
  <ol>
    <li>Item 1.1</li>
  </ol>
  <li>Item 2</li>
  <li>Item 3</li>
</ol>


Нумерованные и ненумерованные списки могут быть смешаны между собой на разных уровнях. Нумерованные и ненумерованные списки на одном уровне трактуются как два разных списка.

Свернутый блок

Начинается с символов +++ в начале строки и следующего за этими символами названия блока. Завершается строкой из символов +++.
+++ Много текста
Текст текст текст текст.
+++

Выходной HTML
<div class='collapsible'>
  <div class='title'>Много текста</div>
  <div class='content'>
    Текст текст текст текст.
  </div>
</div>


Блочная цитата

Начинается с тройного символа " и им же заканчивается.
"""
Один классик сказал …
"""

Перед открывающими кавычками можно указать символ +. Это будет означать, что цитата будет по умолчанию свернута в строку "Цитата".


Таблицы

|* Header 1 | Header 2 | Header 3|
|  Cell 1.1 | Cell 1.2 | Cell 1.3|
|  Cell 2.1 | Cell 2.2 | Cell 2.3|
|Left aligned | Centered | Right aligned|
|>| Colspan |<|
|\|||
|Rowspan|||

Выходной HTML:
<table>
  <thead>
    <tr>
      <th class='center'>Header 1</th>
      <th class='center'>Header 2</th>
      <th class='center'>Header 3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td class='center'>Cell 1.1</td>
      <td class='center'>Cell 1.2</td>
      <td class='right'>Cell 1.3</td>
    </tr>
    <tr>
      <td class='center'>Cell 2.1</td>
      <td class='center'>Cell 2.2</td>
      <td class='right'>Cell 2.3</td>
    </tr>
    <tr>
      <td>Left aligned</td>
      <td class='center'>Centered</td>
      <td class='right'>Right aligned</td>
    </tr>
    <tr>
      <td colspan='3' class='center'>Cell 1.2</td>
    </tr>
    <tr>
      <td rowspan='2'>Rowspan</td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>


Горизонтальный разделитель

Строка, состоящая только из трех символов ---
Выходной HTML:
<hr/>



Сообщение модератора или системы

Заключается в скобки из тройных символов !!!


Теглайн

Строка, начинающаяся с трех символов @@@, следующиего за ними одного или нескольких пробелов и произвольным текстом далее до конца строки.
@@@Janus v1.2.1

Выходной HTML:
<div class='tagline'>Janus v1.2.1</div>



Объекты

Предназначены для вставки внешних по отношению к форматтеру объектов. Должно присутствовать уникальное имя объекта, а в теле тега значение параметров в JSON формате.
((object_id(
  param1: 25,
  param2: {
    p2p1: 12,
    p2p2: '14'
}
)))

Выходной HTML определяется хостом.







Разметка содержимого


Общее правило для стилей текста:
  1. Открывающая конструкция должна заканчиваться не пробельным символом;
  2. Перед закрывающей конструкцией должен стоять не пробельный символ;

Жирный

Выделяется символами ** с обеих сторон.
**слово**
**несколько слов**
ст**о**ит

Выходной HTML
<strong>слово</strong>
<strong>несколько слов</strong>
ст<strong>о</strong>ит


Курсив

Выделяется символами // с обеих сторон. Правила по обрамлению пробелами соответствуют выделению жирным.
//слово//
//несколько слов//

Выходной HTML
<em>слово</em>
<em>несколько слов</em>


Подчеркнутый

__слово__
__несколько слов__

Выходной HTML
<u>слово</u>
<u>несколько слов</u>


Перечеркнутый

--слово--
--несколько слов--

Выходной HTML
<del>слово</del>
<del>несколько слов</del>


Верхний индекс

^^слово^^
^^несколько слов^^

Выходной HTML
<sup>слово</sup>
<sup>несколько слов</sup>


Нижний индекс

vvсловоvv
vvнесколько словvv

Выходной HTML
<sub>слово</sub>
<sub>несколько слов</sub>


Ссылки

[[текст ссылки|url]]
[[url]]

Текст ссылки может быть пустым. В этом случае в качестве текста используется сам url, но с заменой url escaping на исходный текст.
Выходной HTML
<a href='url'>текст ссылки</a>
<a href='url'>url</a>


Ссылки на сообщения по имени

[[текст ссылки|#name]]
[[#name]]

Текст ссылки может быть пустым. В этом случае текст должен предоставить хост. url ссылки формируется по имени хостом.
Выходной HTML
<a class='name-link' href='host-provided-url'>текст ссылки</a>
<a class='name-link' href='host-provided-url'>host-provided-text</a>



Изображения

![[имя изображения|url]]
![[url]]
+![[имя изображения|url]]

имя изображения может быть пустым. В этом случае в качестве текста используется последний сегмент пути url (имя файла). Если впереди стоит знак + — изображение по умолчанию свернуто.
Выходной HTML
<div class='img'>
  <div class='title'>имя изображения</div>
  <img src='url' alt='имя изображения'/>
</div>
<div class='img'>
  <div class='title'>filename.jpg</div>
  <img src='url' alt='filename.jpg'/>
</div>
<div class='img collapsible'>
  <div class='title'>имя изображения</div>
  <img src='url' alt='имя изображения'/>
</div>



Смайлы


Стандартные смайлы

:)
:))
:)))
:(
;)
:-\\
:???:

Выходной HTML
<i class='emoticon smile'></i>
<i class='emoticon biggrin'></i>
<i class='emoticon lol'></i>
<i class='emoticon frown'></i>
<i class='emoticon wink'></i>
<i class='emoticon smirk'></i>
<i class='emoticon confused'></i>


Смайлы из расширений

Имеют формат :smileid:, где smileid — строка от 1 до 5 символов английского или русского алфавита без пробелов и знаков препинания. Для каждого smileid должны быть два синонима — в русской и английской раскладке.

Код

Внутри кода игнорируется вся разметка, за исключением выделения. Внутри кода так же допускается использование {{{ и }}}. Признак конца кода определяется парсером по парности фигурных скобок.

Кусок текста, окруженный тройными скобками {{{ и }}} распознается как код. Опционально между второй и третьей открывающей скобкой можно указать название языка.
Текст {{ruby{if (x == 0) return;}}} текст

Выходной HTML:
Текст <span class='code'>if (x == 0) return;</span> текст


Если перед и или за блоком кода не идет ничего кроме пробельных символов или конца строки, такой блок форматируется как блочный.
{{cs{
  if (x == 0)
    return;
}}} текст

Выходной HTML:
<div class='code'>
  <span class='code-keyword'>if</span> (x == <span class='code-num-literal'>0</span>)
    <span class='code-keyword'>return</span>;
</div>

Перед открывающими скобками можно указать символ +. Это будет означать, что блок кода будет по умолчанию свернут в строку.

Выделение в коде

Выделить можно либо строку целиком, либо конкретный участок кода. Выделенная строка начинается с символов >>> и следующего на ними пробельного символа. Выделенный участок кода должен быть расположен на одной строке и обрамляется символами >>> и <<< слева и справа. Расположение этих символов относительно слов соответствует правилам для выделения жирным.
if (x == 0)
>>>  Foo();
else
  x = >>>GetX()<<<;



Экранирование

Для экранирования служебного символа можно применять символ экранирования \. Действует только для следующих символов — "\_*+-/!|><@{(:#№[". Все остальные комбинации трактуются как просто текст.


Автозамены

Некоторые комбинации символов заменяются:
* ... (три точки) на … (троеточие)
* --, окруженный пробелами на ­— (длинное тире)
AndrewVK
AndrewVK API парсера
05.09.2014 01:54
_Raz_
_Raz_
05.09.2014 02:15
  const string rmdStringSource = "**hello**";
  const string rbbStringSource = "[-b]hello[/-b]";

  var rmdLexer = new RsdnMarkdownLexer();
  var rbbLexer = new RsdnBbCodeLexer();

  var rmdTree = Parser.Parse(rmdLexer, rmdStringSource);
  var rbbTree = Parser.Parse(rbbLexer, rbbStringSource);


rmdTree == rbbTree
_Raz_
_Raz_
05.09.2014 02:23
  const string rmdStringSource = "**hello**";
  const string rbbStringSource = "[-b]hello[/-b]";

  var rmdLexerCollection = RsdnMarkdownLexer.ProcessInput(rmdStringSource);
  var rbbLexerCollection = RsdnBbCodeLexer.ProcessInput(rbbStringSource);

  var rmdTree = Parser.Parse(rmdLexerCollection);
  var rbbTree = Parser.Parse(rbbLexerCollection);
andrey.desman
andrey.desman
05.09.2014 08:50
Здравствуйте, AndrewVK, Вы писали:

AVK>Старое обсуждение

AVK>Спецификация языка разметки
AVK>API парсера
AVK>Репозиторий

Круто! Надоело переключать раскладку, чтобы ввести эти долбанные квадратные скобки!
AndrewVK
AndrewVK
05.09.2014 11:26
Здравствуйте, andrey.desman, Вы писали:

AD>Круто! Надоело переключать раскладку, чтобы ввести эти долбанные квадратные скобки!


Временно можно хоткеи в редакторе прикрутить, если кто составит табличку.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>