MarkedText — маркдаун здорового человека

    Здравствуйте, меня зовут Дмитрий Карловский и все свои статьипрезентации) пишу я в MarkDown разметке. И знаете что? Она уже порядочно меня подзаелозила! Тексты я пишу на русском, но большая часть спецсимволов есть только в английской раскладке клавиатуры. А редактирование таблиц - это вечная пизанская башня из вертикальных линий. Короче, есть у него проблемы как с удобством редактирования, так и с наглядностью представления. Так что давайте попробуем спроектировать его с нуля, не таща за собой килотонны головоломных конструкций.

    Вёрстка несколько поехала, так как на Хабре выкатили новый кривой визивиг. Так что теперь писать статьи в маркдауне, а потом выкладывать на Хабр будет крайне сложно. С нормальной вёрсткой эту статью вы можете почить на гитхабе: https://github.com/nin-jin/HabHub/issues/39

    Принципы

    • Однозначность синтаксиса

    • Простота синтаксиса

    • Единообразность синтаксиса

    • Минимальное влияние на естественный вид текста

    • Удобство редактирования независимо от раскладки

    • Наглядность представления

    • Расширяемость

    • Быстрая и надёжная запоминаемость

    В качестве спец-символов форматирования лучше использовать такие, которые есть в любой раскладке, а не только в английской. То есть при прочих равных лучше отдать предпочтение следующим символам: ! " ; % : ? * ( ) _ + / \ . , - =

    Существующие решения

    В английской Википедии есть сравнительный обзор легковесных языков разметки, так что не будем повторяться. Там приведены следующие языки: AsciiDoc, BBCode, Creole, GitHub Flavored Markdown, Markdown, Markdown Extra, MediaWiki, MultiMarkdown, Org-mode, PmWiki, POD, reStructuredText, Textile, Texy, txt2tag.

    Почти все они придерживаются примерно похожих конструкций. Однако, BBCode не является легковесным - это практически HTML с квадратными скобками вместо угловых. Поэтому его мы далее рассматривать не будем. Также проигнорируем и POD, чей синтаксис слишком многословный и не слишком наглядный.

    Текстовые блоки

    Блоки текста будем разделять двойным переводом строки, что даст визуальный отступ между блоками. Тип блока определяется специальным префиксом в начале каждой строки блока. Если префикс не распознан, то это обычный абзац.

    Списки

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

    Элементы неупорядоченного списка предваряются маркером. По нормам многих языков таким маркером выступает тире. В вебе в основном потребляются "буллеты". В облегчённых языках разметки в основном используются следующие:

    - item
    * item
    + item
    

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

    - first
    - second
      - first of second
        - first of first of second
      - second of second 
    - third
    
    • first

    • second

      • first of second

        • first of first of second

      • second of second

    • third

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

    1. item
    2) item
    

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

    # item
    

    Правда символ решётки есть лишь в английской раскладке. Мы же воспользуемся для этого плюсиком, ведь к счётчику прибавляется по единичке на каждый элемент списка:

    + first
    + second
      + first of second
        + first of first of second
      + second of second 
    + third
    
    1. first

    2. second

      1. first of second

        1. first of first of second

      2. second of second

    3. third

    Цитаты

    Цитаты объединяют произвольные блоки текста, показывая, что их автором является кто-то другой. Распространённая практика - выделять цитаты угловыми скобками:

    > quote
    > - list in quote
    > > inner quote
    

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

    " quote
    " - list in quote
    " " inner quote
    

    Таблицы

    Таблицы - это двумерное представление данных. И многие языки стараются сохранять двумерность ради наглядности:

    |=  |= table |= header |
    | a | table  | row     |
    | b | table  | row     |
    
    |   | table | header |
    |---|-------|--------|
    | a | table | row    |
    | b | table | row    |
    
    First Header | Second Header
    ------------ | -------------
    Content from cell 1 | Content from cell 2
    Content in the first column | Content in the second column
    

    Однако, такое представление сильно бьёт по удобству редактирования - приходится вручную постоянно выравнивать колонки.

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

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

    |   | table                                                                                                                          | header |
    | a | There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.  | row     |
    | b | table                                                                                                                          | row     |
    

    Короче, рисовать табличку в тексте - бессмысленное занятие. Однако можно сохранить двумерность представления и без таблицы - достаточно выравнивать содержимое ячеек, относящихся к разным колонкам, друг под другом, но с разным отступом:

    ! 
      ! table
        ! header
    ! a
      ! There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
        ! row
    ! b
      ! table 
        ! row
    

    Таким образом человеку легко навигироваться по такой структуре как по горизонтали, так и по вертикали. А маркеры в виде восклицательных знаков похожи на вертикальные линии, но доступны не только в английской раскладке. Редактировать такое представление гораздо удобнее. Оно не боится внезапных переносов текста. А внутрь ячеек можно помещать любые другие блоки текста в произвольном количестве.

    Заголовки

    В некоторых языках заголовки выделяются разными типами подчёркиваний:

    Level 1 Heading
    ===============
    
    Level 2 Heading
    ---------------
    
    Level 3 Heading
    ~~~~~~~~~~~~~~~
    

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

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

    # Level 1 Heading #
    ## Level 2 Heading ##
    ### Level 3 Heading ###
    

    Справа может быть такой же суффикс, несущий лишь декоративную роль, но набирать его утомительно. В разных языках используются разные спецсимволы:

    ## Level 2 Heading
    == Level 2 Heading
    ** Level 2 Heading
    !! Level 2 Heading
    ++ Level 2 Heading
    

    Решётка есть лишь в английской раскладке. Плюсы, звёздочки, восклицательные знаки мы задействуем для другой семантики. А вот массивные символы равенства - то, что надо. Заголовки делят текст на секции, так что пара горизонтальных линий отлично это иллюстрируют:

    = Level 1 Heading
    == Level 2 Heading
    === Level 3 Heading
    

    Преформатированный текст

    В некоторых языках для преформатированного текста используются специальные кавычки:

    ```markdown
    preformatted 
            text
    ```
    

    Однако, если в таком тексте тоже нужно вывести эти кавычки, то получается облом. Поэтому предпочтительнее вариант с префиксом перед каждой строкой. Например, в качестве такого префикса может выступать отступ, равный 2 или 4 пробелам:

        preformatted 
                text
    

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

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

    Поэтому мы разделим префикс на две части:

    • Маркер преформатированного текста из 2 пробелов.

    • Маркер форматирования строки из пары спец символов.

    Выглядеть оно будет так:

        preformatted
                text
      --deleted
      --   text
      ++inserted
      ++    text
      **highlighted
      **       text
    

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

    Инлайн форматирование

    Типичный приём для добавления некоторым словам особого смысла - это окружить их специальными "кавычками". Такие кавычки должны достаточно редко встречаться в обычном тексте, чтобы не приходилось париться с экранированием, которое негативно сказывается на удобстве чтения. Как правило такие кавычки состоят из нескольких повторяющихся спец-символов. Рассмотрим варианты их числа:

    • 1 - слишком мало, высок риск, что символ обычного текста будет воспринят как форматирование.

    • 3 - слишком много, каждый раз трижды нажимать клавишу - слишком утомительно.

    • 2 - золотая середина, на этом и остановимся.

    Акценты

    Акценты служат для привлечения внимания, выделяя важные моменты, иносказания, коннотации и тп. Однако, в основном используются два вида: сильный и слабый акцент. И если назначение сильного акцента всем более-менее понятно, то слабый акцент используют для чего попало и приходится угадывать, что имел ввиду автор. Так что у меня нет уверенности стоит ли его поддерживать вообще, но пусть пока будет.

    Варианты сильного акцента:

    *strong*
    **strong**
    __strong__
    '''strong'''
    ''strong''
    

    Апострофы слишком похожи на кавычки и секунды, так что их сразу отбрасываем. Из оставшихся более распространён вариант с "массивными" звёздочкам - его и выберем.

    **strong**
    

    strong

    Варианты слабого акцента:

    'emphasis'
    ''emphasis''
    _emphasis_
    /emphasis/
    //emphasis//
    *emphasis*
    ~emphasis~
    

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

    //emphasis//
    

    emphasis

    Правки

    Порой надо выделить часть текста, как удалённую, а часть как добавленную. Зачастую это выглядит как зачёркнутый и подчёркнутый текст. Оба варианта в той или иной мере осложняют чтение, поэтому предпочтительнее использовать для этого подсветку фона, как это делают инструменты для мержа. Но в этом случае символы подчёркивания и дефисы уже перестают ассоциироваться с соответствующим им типом форматирования.

    Итак, типичные формы выделения добавлений:

    _insertion_
    __insertion__
    +insertion+
    

    И удалений:

    ~deletion~
    ~~deletion~~
    -deletion-
    --deletion--
    

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

    ++insertion++
    --deletion--
    
    • insertion

    • deletion

    Ссылки

    Ссылки бывают двух видов:

    • Гиперссылка - она переносит вас к цели при клике на неё. Для неё задаётся отображаемое содержимое и урл для перехода.

    • Встраивание - цель встраивается в просматриваемый документ. Для него задаётся урл, откуда берётся встраиваемый документ, и альтернативное содержимое, если встраивание по какой-либо причине не произошло (не поддерживаемый формат, не разрешённый домен, не удалось подключиться и тд).

    Гиперссылки выглядят в разных языках так:

    "Text":http://example.com
    http://example.com[Text]
    <http: example.com|text="">
    [Text|http://example.com]
    [[Text|http://example.com]]
    [[http://example.com|Text]]
    [Text http://example.com]
    [http://example.com Text]
    [Text](http://example.com)
    `Text <http: example.com="">`_
    

    А встраивания так:

    ![title](http://example.com/image.png)
    {{http://example.com/image.png|title}}
    .. image:: /path/to/image.jpg
    

    Важно отметить, что обычно встраивать разрешено лишь изображения. Если хочется встроить видео или сайт - в лучшем случае предлагается писать HTML. Мы же позволим встраивать что угодно - проверка безопасности для урлов должна происходить системно и регулироваться отдельно. Язык разметки текста никак не должен их регламентировать.

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

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

    ""Embedded image\http://example.org/favicon.ico""
    ""Embedded video\https://youtube.com/video=1234""
    ""Embedded site\https://marked.hyoo.ru/""
    

    Если альтернативное содержимое опущено, то в качестве него должен быть взят сам урл. То есть следующие два варианта дают идентичный результат:

    ""http://example.org/favicon.ico""
    ""http://example.org/favicon.ico\http://example.org/favicon.ico""
    

    Для гиперссылок же воспользуемся \ во всех местах:

    \\Clickable text\http://example.org/\\
    Clickable url: \\http://example.org/\\
    

    Разумеется разные типы ссылок можно комбинировать. Например, сделать картинку-ссылку можно так:

    \\""Example\http://example.org/favicon.ico""\http://example.org/\\
    

    Инлайн код

    Инлайн код выводится моноширинным шрифтом и выключает внутри себя любое форматирование. В каждом языке используется что-то своё:

    +monospace text+
    `monospace text`
    ``monospace text``
    ```monospace text```
    |monospace text|
    {{monospace text}}
    {{{monospace text}}}
    =code=
    ~verbatim~
    @monospace text@
    @@monospace text@@
    

    Из доступных не только в английской раскладке тут есть только + и =, которые у нас уже задействованы. То есть нужно придумывать что-то своё. В разных языках используются разные символы, так что идеального варианта быть не может. Но кажется ;; к нему максимально близко. Двойная точка с запятой как правило не имеет смысла во многих языках.

    ;;monospace text;;
    

    monospace text

    Резюме

    Теперь давайте соберём все конструкции формата в одной короткой шпаргалке:

    = MarkedText
    
    Формат текста с **легковесным форматированием**.
    
    --
    
    == Принципы
    
    + Синтаксис:
      - Однозначность
      - Простота
      - Единообразность
    + Внешний вид:
      - Минимальное влияние на естественный вид текста
      - Наглядность форматирования
    + Редактирование:
      - Независимость от раскладки
      - Быстрая и надёжная запоминаемость
    
    == Cравнение с альтернативами
    
    ! **Язык**
      ! **Плюсы**
        ! **Минусы**
    ! MarkedText
      ! - Удобное редактирование таблиц.
      ! - Поддержка сложного форматирования внутри ячеек.
      ! - Простота реализации.
      ! - Легко запоминающийся консистентный синтаксис.
      ! - Удобство редактирования в русской раскладке.
      ! - Колонки не расползаются далеко вправо за горизонтальный скроллинг и не переносятся на новую строку.
        ! - Не поддерживается пока что никакими сторонними инструментами.
    ! MarkDown
      ! - Широкая поддержка различными инструментами.
      ! - Наглядное представление таблиц.
        ! - Сложности с редактированием таблиц.
        ! - Сильно ограниченное содержимое ячеек.
    
    == Парсинг
    
        const res = [ ... $hyoo_marked_line.parse( '**text**' ) ]
      --$mol_assert_equal( res[0].strong, '**text**' )
      ++$mol_assert_equal( res[0].marker, '**' )
      **$mol_assert_equal( res[0].content, 'text' )
    
    == Отзывы
    
    " " " Типичный пользователь: Нигде не поддерживается, идите в --жопу-- ++Жодино++ с таким синтаксисом!
    " " 
    " " Но мы же программисты, мы можем это исправить.. Для этого даже не надо быть экспертом ни по ;;C++;; , ни по ;;D++;;..
    " 
    " Никому это не нужно (с) Диванный Эксперт
    
    Тем не менее, это полезное упражнение в проектировании.
    
    == Ссылки
    
    - Песочница: \\https://marked.hyoo.ru/\\
    - \\Статья о MarkedText\https://github.com/nin-jin/HabHub/issues/39\\
    - \\Парсер на TS\https://github.com/hyoo-ru/marked.hyoo.ru/\\
    - \\Конвертер в HTML на TS\https://github.com/hyoo-ru/marked.hyoo.ru/tree/master/to/html\\
    - ""Результат билда $mol_regexp\https://github.com/hyoo-ru/mam_mol/workflows/mol_regexp/badge.svg""
    

    Ссылки

    Обратная связь

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 151

      +1
      Насчет ссылок достаточно спорно, хотя согласен, что [] есть не в каждой раскладке.
      И по встраиванию тех же изображений, в MD не хватает нормальной настройки атрибутов, не говоря уже о попытках обернуть картинку в figure, чтобы приделать нормальное название. Хорошо бы этот момент учесть.
        0

        Если попытаться засунуть в язык всё на свете, то он уже не будет легковесным. Подпись к картинкам вполне можно сделать и обычнымпараграфом. В легковесный язык имеет смысл вносить лишь те штуки, без которых ну совсем никак.

          –1
          но ломается семантика. Если md будет конвертироваться в html то без этого никак.
            +5

            Как только в HTML появится теги SARCASM, IRONY и HATE поговорим о семантике, а пока что настоящая семантика есть лишь в RDF.

              +2
              настоящая она там или нет — не знаю, есть тег figure который объединяет изображение и подпись к нему. Следующий абзац как подпись к картинке как-то не кошерно.
        +10

        Только идея про таблицы понравилась. Про довод что символов нет в английской раскладке большинству плевать. Читаемость важнее, например > удобнее чем " для цитирования имхо.


        Отзывы огонь!

          +3

          Набирать угловые скобки не удобно. Читаемость — вопрос привычки.

            +4
            Удобство набирания угловых скобок — тоже вопрос привычки
              +4

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

                0

                Поддерживаю. В качестве облегчения страдания от постоянных переключений,
                я забиндил на клавишу Alt переключение раскладки и на клавишу Win (while pressed) временную её смену. Стало чуть проще, хотя и к этому варианту тоже нужно привыкнуть.

                  0
                  угловая скобочка есть лишь в английской раскладке.

                  Ложное заявление

                  При наборе данного комментария русская раскладка не была переключена ни одного раза (]>_<[)
                    +1
                    это как так? что за магия?) подскажите
                      0

                      Win+. под виндой открывает панель смайликов.
                      (╯°□°)╯︵ ┻━┻

                        0

                        Под виндой (любой) есть Alt+0XXX на цифровой клавиатуре.
                        Работает всегда, даже при наборе пароля при входе в систему.

                          0

                          Число нажатий получится не меньше, но ещё и номера символов надо запомнить.

                        +1
                        Ну а круглые, там где и обычно
                        image
                          –1
                          Вот когда у большинства будет продукция Apple (можно садиться писать сценарий фильма ужасов), тогда можно будет тыкать в специальные кнопочки. А пока у большинства более стандартные клавиатуры.
                          0

                          Ничего сложного — тут широкое тире, если что расширенная раскладка.


                          Всё э́то сообще́ние на́брано без сме́ны раскла́дки і каких-либо виндовых таблиц смайликов.


                          (]>_<[)

                        +1

                        Ну так возьмите какую-нибудь расширенную раскладку с третьим/четвёртым слоями на альтГР. Сразу появятся и [], и {}, <>, и |, и даже "экзотика" вроде ≠, ±, «».

                          0

                          Где я её возьму?

                            –2
                            В любом *nix можно смонстрячить свои раскладки, вплоть до аккордных.
                              +1

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

                                –1
                                Ни в коем случае! Пользуйтесь MT!
                                  +3
                                  Ну вы ведь придумали еще один маркдаун вместо того, чтобы найти себе удобный редактор или решить вопрос с переключением раскладки. Можно было бы сделать другую раскладку, чтобы символы были. Можно и ОС поменять, если так сложно язык переключить.
                                +2

                                В Windows я использую AutoHotKey. Вот для примера скрипт, переключающий раскладки капслоком и эмулирующий раскладку Бирмана (base64, потому что там внутри хардкорный юникод): https://pastebin.com/raw/mBdHYpLB

                                  0

                                  Спасибо, попробую, когда совсем приспичит. Хотя скриптовый язык у этой программы… своеобразный.

                                  +1

                                  Добрые люди уже многое наклепали, даже на хабре статьи были https://habr.com/ru/post/450042/.

                                    +1

                                    Набирать цифры с альтом — такое себе удовольствие.

                                      +1

                                      Вопрос привычки, не более. Тем более, что вопрос ведь не в абсолютном, а относительном удобстве (имеется в виду, относительно велосипедных имплементаций маркдаунов).

                                        0

                                        Циферки люди вводят куда чаще редактирования маркдауов.

                                          0

                                          Во-первых, всё зависит от области. Я, к примеру, цифры использую редко. А даже когда использую, частенько набираю на нампаде.


                                          Во-вторых, раскладка по ссылке далеко не единственная. Можете поискать сами (надеюсь, в гугле не забанили?) или даже соорудить самостоятельно.


                                          Смысл всей этой дискуссии в том, что спецсимволы на нелатинских раскладках вполне себе есть, и использовать их отсутствие на наиболее популярном ЙЦУКЕНе как аргумент для своего велосипеда не стоит.

                                            0

                                            Когда есть нампад-то конечно "цифры не нужны".


                                            Мне не очень импонирует идея менять раскладку на всех девайсах, что попадают мне в руки и плеватся в тех случаях, кода я не могу изменить дефолтную раскладку на ту, к которой я привык.

                                              +3

                                              А компилятор своего велосипеда таскать между всеми девайсами импонирует?

                                                0

                                                Компилятор живёт в вебе.

                                0
                                Если переключение закладки забинжено на одну кнопку (капс, например) переключение раскладки перестаёт быть болью и чисто технически не отличается от обычного набора текста.
                                  0

                                  Ну вот, например, давайте посчитаем число действий на ввод |


                                  LeftShift down
                                  LeftShift up
                                  LeftShift down
                                  | down
                                  LeftShift&| up
                                  RightShiftDown
                                  RightShift up

                                  вместо


                                  LeftShift down
                                  ! down
                                  LeftShift&! up
                          +8

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

                            +1

                            Есть конвертер в HTML.

                              +4

                              Мне кажется, подобные языки разметки лучше всего реализовывать сразу как плагины к pandoc. Тогда почти автоматом появляются конвертеры в/из почти всего, что можно придумать.

                                0

                                Вот я и хотел сказать — все эти MD, вики-разметки и т.д. рендерятся все равно в HTML. Но сразу на HTML, почему-то, никто писать не хочет

                                  +1

                                  Потому что не удобно писать хтмл.
                                  Ну, в $mol есть рендер маркдауна безо всяких хтмл.

                                    0
                                    > не удобно писать хтмл

                                    Обилие всяких маркдаунов как-бы намекает, что и на них не очень.
                                    Что такое $mol — не знаю.
                            +28

                            Двойной пробел в середине строки — это очень большой wtf. И совсем не понятно где оно заканчивается (у нас не может быть двойного пробела или восклицательного знака в коде?).


                            В целом markdown'овая отбивка для code отлична. Там даже есть место для указания каким парсером подсвечивать.


                            Насчёт таблиц — я не видел удачных вариантов, и ваш тоже не очень, увы.

                              –3

                              Двойные пробелы в инлайн коде — вещь более редкая, чем бэктики.

                                0

                                В каких языках программирования используются бэктики?

                                  0

                                  В самом популярном, например.

                                    +2
                                    SQL инструкции генерятся с ними.
                                      0
                                      В JavaScript и Bash
                                    +2
                                    А чего автора то минусите? Неужели так часто бы в инлайн коде двойным пробелом пользовались? Бэктики и правда заслуживают большего внимания.
                                      +1

                                      Я, не минусю, я комментирую.

                                    –1
                                    Ну теперь популяризуйте. Что-б включили поддержку в том-же pandoc
                                      +12

                                      Комикс xkcd как множатся стандарты

                                        +16
                                        Эта картинка, с сайта pandoc
                                        лучше
                                        image
                                        +9

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

                                          +5

                                          Попробуйте почитать в маркдауне таблицы с более чем парой слов в ячейках. Это совершенно нечитаемое месиво получается.

                                            +4

                                            Да, с таблицами в маркдауне не очень. Но и предлагаемый вариант, по-моему, не лучше.

                                              –6

                                              Это только кажется, пока не распробуете.

                                                +3

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

                                            +12

                                            Всё понравилось, кроме последних двух пунктов про \ в ссылках и два пробела.
                                            * Со слешами в ссылках возникает визуально неприятный забор типа \\/\//\\ (субьективно).
                                            * Два пробела очень сложно увидеть, особенно если шрифт в редакторе не моноширинный.
                                            Тут вполне реально придумать более лучшие варианты, если ещё поднапрячься.


                                            Например, если развивать идею с удвоенными символами, почему бы не использовать ;; ,,?


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


                                            Ещё осталось неиспользованным ::, но оно будет конфликтовать с кодом на C++, Rust, и т.п.


                                            Если конкретно, то я бы предложил использовать для инлайна либо \\ (можно провести некоторую смутную аналогию с эскейпингом в строковых литералах), либо ,, (должно выглядеть красивее и визуально похоже на кавычки, но путаницы при этом вызывать не должно).


                                            Для ссылок можно попробовать использовать %%. В качестве разделителя при этом сойдёт хотя бы и ;;
                                            %%Ссылка;;https://ru.wikipedia.org/wiki%2F%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%%
                                            Признаю, что выглядит не фиг лучше, чем \\, но как вариант.

                                              0
                                              Два пробела очень сложно увидеть, особенно если шрифт в редакторе не моноширинный.

                                              Если шрифт не моноширинный, то поедут ещё и все отступы в преформатированных блоках. По факту шрифт в редакторах для редактирования легковесных форматов обязан быть моноширинным.


                                              Например, если развивать идею с удвоенными символами, почему бы не использовать ;; ,,?

                                              Потому, что порой надо выводить именно эти (в том числе и удвоенные) символы: ;;, ,,. Особенно при описании спецсимволов такого вот легковесного формата.


                                              я бы предложил использовать для инлайна либо \

                                              Какая-нибудь регулярка в таком случае будет выглядеть так: \\/\t\\\\/\\ вместо /\t\\\\/


                                              %%Ссылка;;https://ru.wikipedia.org/wiki%2F%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%%

                                              В этом случае у пользователя будет рябить в глазах от процентов, от чего он будет чаще ошибаться, и ему сложнее будет искать границы ссылки, особенно, когда идёт несколько ссылок подряд.

                                                0
                                                Мне тоже не нравится идея с пробелами, если честно. Мне этого «добра» и в YAML-ах хватает.
                                                  0

                                                  А что там в ямлах с пробелами?

                                                    +2
                                                    Очень плохо будет, если ошибёшься с их количеством, или поставишь вместо пробелов tab. Вон, редхат аж целую статью выкатил.
                                                    10 советов для хейтеров YAML.
                                                      0

                                                      У меня тут тоже много претензий к ямлу:
                                                      https://m.habr.com/ru/post/503240/
                                                      Но отступы — это всё же совсем иная тема.

                                              +1

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

                                                0

                                                Так что мешает взять и сделать?

                                                  +1

                                                  Лень видимо, для моей задачи у меня исторически сложилась надстройка над латехом легко конвертируемая (не пинайте, регексами) в докбук и переделка всего этого это большой объём работы не приносящий значимого результата, есть мысль хотя бы на чистый докбук перейти, но опять же, только для нового, когда английская версия будет делаться..

                                                    0

                                                    Так-то MarkedText у меня тоже регулярками парсится. Вот, например, регулярка, что разбивает текст на блоки:


                                                    $hyoo_marked_flow == /^(?:(--\r?\n)|((?:((?:=){1,6})) (?:((?:[\s\S]){1,}?))\r?\n)|((?:(?:((?:  ){0,}?))(?:(-|\+)) (?:((?:[\s\S]){1,}?))\r?\n){1,})|((?:(?:(")) (?:((?:[\s\S]){1,}?))\r?\n){1,})|((?:(?:((?:  ){0,}?))(?:(!)) (?:((?:[\s\S]){1,}?))\r?\n){1,})|((?:  (?:(  |\+\+|--|\*\*))(?:((?:[\s\S]){1,}?))\r?\n){1,})|((?:((?:[\s\S]){0,}?))\r?\n))/gmu

                                                    А эта ищет инлайн форматирование:


                                                    $hyoo_marked_line === /(?:((?:(\*\*))(?:((?:[\s\S]){1,}?))\*\*)|((?:(\/\/))(?:((?:[\s\S]){1,}?))\/\/)|((?:(\+\+))(?:((?:[\s\S]){1,}?))\+\+)|((?:(--))(?:((?:[\s\S]){1,}?))--)|((?:(  ))(?:((?:[\s\S]){1,}?))  )|((?:(\\\\))(?:(?:((?:[\s\S]){1,}?))\\){0,1}(?:((?:[^\\]){0,}?))\\\\)|((?:(""))(?:(?:((?:[\s\S]){1,}?))\\){0,1}(?:((?:[^\\]){0,}?))""))/gu
                                                      +3

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

                                                        0
                                                          +4

                                                          Когда элементы могут вкладываться друг в друга неограниченно и в разных комбинациях с регексами будет невозможно

                                                            0

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

                                                          +2

                                                          BNF для маркдауна — это сложно, но можно парсер написать. Регулярки, конечно, не дело.

                                                            0

                                                            Почему? Есть всякие расширенные версии и умные парсерогенераторы, я не спец, но помню что автор одного из таких утверждал что его решение может распарсить всё что напишете.

                                                              0

                                                              В Markdown очень много заморочек с пробелами, переносами строк и другими контекстыми вещами — для правильного парсера нужно прописывать много сторонней логики, а она плохо вписывается в КС грамматику. Есть еще статья Why isn't there a formal grammar for Markdown?, но я с ней не совсем согласен.


                                                              Хотя в настоящее время я пробую сделать грамматику Markdown для ANTLR, посмотрим что получится.

                                                                0

                                                                Вышеупомянутый генератор http://blog.erezsh.com/how-to-write-a-dsl-in-python-with-lark/

                                                                  0

                                                                  Посмотрел — это просто еще один генератор парсеров на основе EBNF грамматик. С парсингом Markdown у него будут такие же проблемы, как и у ANTLR.

                                                  +1
                                                  Лайфхак для тех, у кого macOS.
                                                  В русской раскладке:

                                                  | = alt + shift + 1
                                                  < = alt + shift +,
                                                  > = alt + shift +.
                                                  { = alt + 9
                                                  } = alt + 0
                                                    0
                                                    Про таблицы — идея кошерная, сам так годами делаю.
                                                      0

                                                      А в каком языке так делаете?

                                                        0
                                                        В своих записках так таблицы оформляю.
                                                        Привычка записывать все в иерархические списки (аутлайнеры). Это позволяет быстро восстановить контекст при возвращении к задаче.
                                                      +1

                                                      Заявленная расширяемость не достигнута. Например, pandoc markdown позволяет много где указать {значения=атрибутов}, чтобы не изобретать синтаксис для редкоиспользуемых вещей, вроде размера изображений или вставок/удалений. Атрибуты потом доступны парсеру, например, чтобы реализовать ваш великолепный синтаксис таблиц как плагин.


                                                      Для ссылок не хватает синтаксиса, когда в тексте название ([там][there]), а URL отдельно ([there]: https://...) — удобно для длинных адресов или если надо повторить ссылки, например, в конце статьи. В стиле MarkedText было бы что-то вроде ""там\(there)"".

                                                      +6
                                                      А еще можно зайти с другой стороны и просто сделать русскую раскладку где все такие символы просто есть xD

                                                      Ака ilyabirman.ru/projects/typography-layout только для маркдауна.

                                                      Потому что пытаться изобрести новый стандарт взамен настолько популярному довольно неблагодарная задача. А вот упростить работу с текущей можно. Особенно когда вся статья начинается с посыла «у меня нету таких символов на клавиатуре»
                                                        0

                                                        Проблемы можно решать только для себя, а можно сразу для всех. Я не на столько эгоцентричен, чтобы заставлять каждого пользователя постоянно решать одни и те же проблемы.

                                                          +1
                                                          Что мешает сделать легко устанавливаемую раскладку для всех? :)

                                                          Отдельный формат тоже заставляет каждого его пользователя прилагать усилия на его изучение, на поиск/установку плагинов для IDE, на убеждение всех в комманде что именно этот формат лучше чем тот что поддерживается везде по дефолту и т.п

                                                            0

                                                            Одну для всех не получится. Ибо есть те кто пользуется машинописной раскладкой, а есть странные люди, которые пользуются дефолтной.

                                                        +8
                                                        Да повесьте вы переключалку на CapsLock (под левый мизинец) и забудьте эту проблему.
                                                        — Linux — искаропки
                                                        — macOS — искаропки
                                                        — Windows — recaps
                                                        Как ни крути, а в кириллической раскладке со спецсимволами всю дорогу ерунда.
                                                        И это не исправить пока 33 > 26.
                                                          0
                                                          Есть вариант смонстрячить императивные включалки языков, привязанные к клавишам или их сочетаниям. Удобнее гораздо жахнуть по кнопке и печатать на нужном языке, нежели удерживать в памяти текущий язык и заморачиваться мыслью «надо ли вот сейчас переключать?».
                                                            0
                                                            Держать не надо.
                                                            — Справа внизу (Linux) или справа вверху (MacOS) — флажочек.
                                                            — Cправа вверху (PC keyboard) или слева посредине (MacBook) горит CapsLock.
                                                            Всё это ловится боковым зрением.
                                                            Конечно же держать в голове смысла нет, потому что щелкаешь мизинцем туда-сюда и не факт что переключил куда надо. Ну и память как у гуппи отвлекаешься, забываешь.
                                                            PS. Эх, помнится под DOS'ом была переключала, на русском расцвечивала border CGI-экрана в красный цвет. Вот там точно невозможно было промахнуться раскладкой.
                                                              0
                                                              Отключил индикатор, за ненадобностью. Ибо, как раз, императивный метод переключения раскладок. menu / rshift-menu
                                                                0

                                                                У меня на ноуте индикатора и нет вообще.
                                                                Ну а превентивное переключение по "menu / rshift-menu", к сожалению, плохо работает, ибо всё равно забываешь нажать клавишу нужного языка и печатаешь не на том.

                                                                  0
                                                                  Я не забываю. Я об этом вообще не думаю. Условный рефлекс полезная штука.
                                                            0

                                                            У меня разные раскладки на разных шифтах. Это всё равно напрягает при частом переключении.

                                                              0
                                                              Нет, ну если реально смотреть, то в Вашем случае (когда обычный пользователь пользуется необычным (для обычных пользователей) инструментом) — то таки да, проблема имеет место быть.
                                                              Погроммисты привыкли всё время сидеть в en, поэтому иногда с удивлением обнаруживают, что 95% нормальных людей имеют дефолтной раскладкой ru (внезапно!). И крайне редко переключаются в en.
                                                              Т.к. на хабре в основном тусят ИТшники, то Ваши проблемы здесь видятся необычными. Уж простите уж, нам/им из-за облаков плохо видно проблемы этих ваших человеков.
                                                            0

                                                            Спасибо за саму попытку провести мысленный эксперимент, редкость ныне.
                                                            Меж тем, идеи для заголовков и таблиц — окупили все затраты.


                                                            Два замечания:


                                                            1. Где-то символ-идентификатор должен быть отбит пробелом, где-то (в инлайновых) — нет. Может просто принять, что маркер — это два "редких" символа подряд?
                                                            2. Преформатированный текст в инлайне, если будет определяться двумя пробелами, также будет очень ·сложно заметить· среди тысячи разрывов. В том числе и два ошибочных пробела. Может поискать дополнительные сочетания, например: ::?
                                                              +1

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


                                                              • показывать уровень заголовка
                                                              • объединять ячейки таблицы

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

                                                              0

                                                              Так а что не так с AsciiDoc-то?

                                                                0

                                                                Много чего, с табличками, например, беда.

                                                                0
                                                                А вот что не так с tex-ом? Может чуть более чем всё.

                                                                К markdown есть такие вопросы:
                                                                • Как сделать ссылку не на внешний документ, а на загловок в этом же документе.
                                                                • <!-- комментарии делать как в html -->
                                                                • Как делать сноски
                                                                • Почему heading абсолютный, и нет относительного
                                                                • Как вложить таблицу в таблицу
                                                                • URL-ы допускают кодирование данных в самом урл например картинок. Можно гигабайтные видео вставлять, архивы, музыку, исполняемые файлы… или просто печатную версию документа в pdf. Или есть какие-то ограничения?

                                                                BBCode не является легковесным — это практически HTML с квадратными скобками вместо угловых
                                                                Так и в markdown допускается голый html если markdown-а не хватило => скрипты, стили, чудеса unicode-а, webgl… короче еще и санитайзеры надо.

                                                                  0
                                                                  А вот что не так с tex-ом? Может чуть более чем всё.

                                                                  Он не является легковесным языком.


                                                                  Как сделать ссылку не на внешний документ, а на загловок в этом же документе.

                                                                  [ссылка на заголовок](#some-header)

                                                                  Почему heading абсолютный, и нет относительного

                                                                  Потому что относительный плохо читается человеком.


                                                                  Как вложить таблицу в таблицу

                                                                  Оригинальный маркдаун вообще таблицы не поддерживает и предлагает использовать html.


                                                                  Или есть какие-то ограничения?

                                                                  Ограничения есть всегда, но не задача формата разметки их регламентировать.


                                                                  Так и в markdown допускается голый html

                                                                  Это скорее не "в", а "между". HTML частью синтаксиса маркдауна не является.

                                                                  +1

                                                                  Я бы предложил альтернативный синтаксис:


                                                                  !== Сравнительная таблица
                                                                  ! **Язык** 
                                                                  !(+) **Плюсы** 
                                                                  !(-) **Минусы**
                                                                  !--
                                                                  ! MarkedText (modified)
                                                                  !(+)
                                                                   - Те же, что и в MarkedText
                                                                   - Строки таблицы чётко разделены с помощью `!--` (фактически это просто вариант `--`);
                                                                   - Новый столбец всегда начинается с `!` в начале строки, поэтому дополнительные уровни не нужны (хотя и не возбраняются!); при малом количестве столбцов (2-4) их нетрудно считать, при большом - см. ниже.
                                                                   - Как следствие, ещё более удобное редактирование таблиц, потому что не нужно следить за отступами, особенно при большом количестве колонок. Текст каждой ячейки -- обычный текст.
                                                                  
                                                                  И в ячейку можно безбозяненно вставлять обычные параграфы. Пустые строки не разорвут ячейку таблицы -- нужен либо маркер новой колонки/строки, либо конца таблицы. 
                                                                  
                                                                   - У таблицы есть маркеры начала `!==` (фактически вариант оглавления, с опциональным текстом для заголовка таблицы) и конца `==!` (тоже с опциональным текстом для удобства поиска конца длинной таблицы; парсер должен игнорировать его).
                                                                  
                                                                  !==
                                                                  ! И поэтому можно вставлять вложенные таблицы!
                                                                  ==!
                                                                  
                                                                   - Опциональные маркеры колонок `!(...)` позволяют помнить где какая колонка в длинных таблицах с большим количеством колонок и информации, как если бы заголовок был "прибит" при скроллинге. Текст маркера -- произвольный, парсер его должен игнорировать. Можно вставить номера колонок, можно -- символические имена, на свой вкус. Здесь я пометил колонки "(+)" и "(-)", и вот, наконец, мы дошли до колонки "(-)". Мы ещё помним её?
                                                                  
                                                                  !(-)
                                                                   - Тоже нет инструментов
                                                                  
                                                                  !--
                                                                  ! MarkedText
                                                                  !(+)
                                                                   - Удобное редактирование таблиц.
                                                                   - Поддержка сложного форматирования внутри ячеек.
                                                                   - Простота реализации.
                                                                   - Легко запоминающийся консистентный синтаксис.
                                                                   - Удобство редактирования в русской раскладке.
                                                                   - Колонки не расползаются далеко вправо за горизонтальный скроллинг и не переносятся на новую строку.
                                                                  !(-)
                                                                   - Не поддерживается пока что никакими сторонними инструментами.
                                                                   - При большом количестве колонок с кучей информации, последние колонки трудно отследить пока до них доберёшься.
                                                                  
                                                                  ==! Сравнительная таблица

                                                                  Кроме этого, я бы добавил ещё одно опциональное расширение для строк таблиц:


                                                                  ![r:c] — где r — rowspan, c — colspan. Если значение равно 1, его можно опустить. Значение "*" — span до конца таблицы. Примеры:


                                                                  ![2:3] - ячейка займёт 2 строки и 3 столбца
                                                                  ![2:] - 2 строки, 1 столбец
                                                                  ![*:] - столбец до конца таблицы
                                                                  ![:*] - строка до конца таблицы

                                                                  Двойной пробел для monospaced — на любителя; должна быть альтернатива (те же backticks) для тех, кто хочет выделять inline-блоки явно и не бояться, что какой-нибудь автоформаттер в редакторе выкинет все "лишние" пробелы.

                                                                    0

                                                                    У вас потерялась двумерность структуры, из-за чего выискивать глазами ячейки из одной колонки крайне сложно.


                                                                    Насчёт спанов, я ещё не продумал, но идея такая:


                                                                    1. Пропуская некоторые уровни отступов получаются горизонтальные спаны.
                                                                    2. Дублируя маркер получаются вертикальные спаны.

                                                                    То есть как-то так:


                                                                    ! 2x1
                                                                        !! 1x2
                                                                    ! 1x1
                                                                      ! 1x1

                                                                    должна быть альтернатива

                                                                    Либерализм в синтаксисе ни к чему хорошему не приводит. Лучше простой и однозначный синтаксис, без вольностей.

                                                                      0
                                                                      У вас потерялась двумерность структуры

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


                                                                      Кроме того, я написал, что отступы не возбраняются: хотите своё 1.5D — делайте на здоровье, парсер проигнорирует начальные пробелы.

                                                                        0
                                                                        Она фактически потерялась и с отступами, потому что в сложных таблицах следить за отступами — морока.

                                                                        Не потерялась. А следить за отступами всё равно придётся. Или вложенные списки и цитаты вы тоже будете в плоском виде выводить?


                                                                        Замучаетесь отступы считать и сопоставлять колонки с заголовком.

                                                                        Навёл указатель мыши и проскроллил.

                                                                          0
                                                                          А следить за отступами всё равно придётся.

                                                                          Я не против, пока не нужно отслеживать их дальше, чем 5-7 строк максимум (пусть даже через схлопывание уровней). Иначе я предпочитаю символические имена.


                                                                          Или вложенные списки и цитаты вы тоже будете в плоском виде выводить?

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


                                                                          Редактирование списков в нынешних "умных" редакторах меня постоянно выбешивает, ничего сложнее одного параграфа туда практически не вставить, а если список многоуровневый, то это вообще аллес капут.


                                                                          Навёл указатель мыши и проскроллил.

                                                                          … сказал человек, который борется за каждый keystroke.

                                                                            0

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


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


                                                                            Я не борюсь за каждое нажатие, я борюсь за удобство редактирования. Порой его можно повысить практически бесплатно, просто заменив один символ на другой. И порой новый символ подходит даже лучше оригинала.

                                                                              +1
                                                                              Но обозначать элемент списка вертикальной чертой или ячейку таблицы дефисом — несколько противоестественно.

                                                                              Моё понимание таково: вертикальная черта или дефис или плюсик — это не столько обозначения элементов, сколько индикаторы стиля форматирования:
                                                                              - item: "вывести как элемент ненумерованного списка",
                                                                              + item: "вывести как элемент нумерованного списка",
                                                                              ! item: "вывести как ячейку таблицы".


                                                                              Структура данных одна и та же, отличается лишь визуальное представление.


                                                                              Так как таблица — это список списков, то, тупо заменив "-" на "!" в обычном списке глубины 2, мы должны получить что-то типа


                                                                              !
                                                                                ! item 1,1
                                                                                ! item 1,2
                                                                                ! item 1,3
                                                                              !
                                                                                ! item 2,1
                                                                                ! item 2,2
                                                                                ! item 2,3

                                                                              — и это само по себе уже должно быть выдано в табличной форме, без дополнительных телодвижений. Всё остальное — сахар и устранение неоднозначностей: !-- вместо голого ! в строках позволяет не заботиться об отступах колонок и открывает возможность вставлять в элементы любой контент (кроме таблиц); а !== и ==! позволяют также вкладывать и таблицы.


                                                                              Должно работать и в обратную сторону: если в получившемся "плоском" синтаксисе таблиц заменить все ! обратно на - или +, то получится "плоский" синтаксис для обычных списков, способных принять сложную структуру текста в качестве содержимого элементов:


                                                                              +==
                                                                              + Example 1
                                                                              
                                                                              This item contains:
                                                                              
                                                                              - An inner unnumbered list
                                                                              - Of two items
                                                                              
                                                                              +== 
                                                                              + An inner numbered list
                                                                              + Of two items
                                                                              ==+
                                                                              
                                                                                + This should work too
                                                                                + Because of the indentation.
                                                                              
                                                                              ! A inner table
                                                                              ! With two rows
                                                                              ! And a single column 
                                                                              
                                                                              Note that these inner lists and a table and this paragraph do not cause ambiguity here. If we didn't bracket the first inner numbered list into `+== ... ==+`, then it would cause a confusion due to lack of indentation.
                                                                              
                                                                              + Example 2
                                                                              
                                                                              Note that we can still continue counting 1-level items despite all the line breaks, because we didn't reach the end-of-list market yet, so any `+` in a first position means a new list item.
                                                                              
                                                                              If we use complex item structure, then we must use `+== ... ==+` brackets to mark the end of the list.
                                                                              
                                                                              +--
                                                                              Example 3
                                                                              
                                                                              + This inner numbered list without indentation
                                                                              + Does not cause ambiguity
                                                                              + Because we started to use `+--` as an item delimiter
                                                                              + (like in a table row case)
                                                                              + So now we expect either a next `+--`, or the end of the list.
                                                                              + If we use `+--`, the we must also use `+== ... ==+` brackets to stop
                                                                              
                                                                              ==+
                                                                                0

                                                                                Вкладывать таблицы в таблицы так-то можно и сейчас.

                                                                        0
                                                                        Либерализм в синтаксисе ни к чему хорошему не приводит. Лучше простой и однозначный синтаксис, без вольностей.

                                                                        С таблицами не всё так однозначно. Ваш вариант лучше markdown, когда в ячейках много текста, но его не удобно читать и с большим количеством колонок он не очень удобен. Вариант markdown лучше читается, если в таблице немного нешироких колонок, но редактировать его неудобно. Лучше всего с таблицами в reStructuredText, где их четыре варианта (но из четырёх вариантов grid table, правда, весьма неудобен для написания и не слишком нужен): simple table для таблиц без большого количества текста в столбцах, csv для отображения чего‐то генерируемого, list на случай, когда текст не влезает нормально в simple. Эти три нормально редактируются и два из трёх (кроме csv) нормально читаются (насколько вообще нормально могут читаться таблицы в plaintext).


                                                                        Зачем вообще нужно, чтобы таблицы можно было записать единственным способом?

                                                                      0
                                                                      Я немножко в танке, поэтому наивно спрошу людей знающих: а в чём проблема написать WYSIWYG-редактор под маркдаун с кнопочками как в Word/LibreOffice Writer для работы с текстом?

                                                                      Всего-то надо:
                                                                      — интерпретаторы кнопок в маркдаун-разметку;
                                                                      — панель с кнопками над окном (полем) с текстом;
                                                                      — окно/панель/колонка WYSIWYG-превью и возможность сделать его основным (а окно/панель/колонку с маркдауном скрыть).

                                                                      Если такое уже реализовано, вопрос снят, просто сообщите имя программы. :)
                                                                        +1

                                                                        Панель ввода комментария и есть такой редактор :)


                                                                        WYSIWYG-редакторы языков разметки неудобны:


                                                                        • дольше тянуться мышью, чем вбить разметку;
                                                                        • diff после такого редактора неряшлив (длинные строки, приведение существующей разметки к "стандартному" для редактора виду);
                                                                        • не поддерживает или, хуже, портит расширенную разметку.
                                                                          0
                                                                          Я бы для себя что-нибудь найти, сейчас тьма заметочников на маркдауне, но без WYSIWYG и, что драматичнее, кнопочек…
                                                                            0

                                                                            Визивигу вообще никакие маркдауны не нужны.

                                                                        +2

                                                                        Ребят, спасибо за обсуждение двойных пробелов. Это позволило выявить критичную проблему, когда перенос текста происходит как раз по двойному пробелу. В этом случае без подсветки переводов строк невозможно понять число пробелов. Поэтому я поменял маркер инлайн кода на ;;.

                                                                          0

                                                                          Таблицы особенно понравились!


                                                                          А вот ссылки совершенно нечитаемы, может лучше для них использовать двойные скобки с последним пробелом разделителем? Если ссылка нужна в скобках, то будут тройные скобки.


                                                                          ((Ссылка на подвал https://habr.com/#footer))
                                                                          ((habr.com))
                                                                          Habr (((habr.com)))
                                                                          ((""http://img.habr.com/1.png"" http://habr.com))
                                                                          E-mail: ((mailto::info@habr.com))
                                                                          ""Рисунок 1 http://habr.com/pic1.png""

                                                                          Последняя строка это картинка с alt и title атрибутом, без ссылки.


                                                                            0

                                                                            К сожалению, в таком случае невозможно отличить скобку, как часть урла, от скобки вокруг ссылки. Битые ссылки — типичное следствие этого в маркдаунах.

                                                                              0

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


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

                                                                                0

                                                                                Скобки ни в ссылке ни уж тем более в обычном тексте не обязаны быть согласованными.

                                                                                0
                                                                                Пример ((поиска https://yandex.ru/search/touch/?text=(test%20(abc))&oprnd=2395118338&mda=0&lr=213)).

                                                                                Здесь после первой пары )) до второй пары )) нет пробелов, очень легко определить ссылку.

                                                                              0

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


                                                                              ! 1.1
                                                                              !! 1.2
                                                                              !! 1.3
                                                                              ! 2.1
                                                                              !!/2 2.2-3

                                                                              Из Textile можно взять align, colspan, rowspan, как пример, последняя строка это colspan=2.

                                                                                0

                                                                                Посмотрел пример, если использовать отступы, то тогда rowspan можно расставлять автоматически, а colspan можно сделать через несколько !


                                                                                ! 1.1 (rowspan=2)
                                                                                  ! 1.2
                                                                                    ! 1.3
                                                                                  ! 2.2
                                                                                ! 3.1
                                                                                  !! 3.2-3 (colspan=2)
                                                                                    ! 3.4
                                                                                  0

                                                                                  В этом случае теряется двумерность, что осложняет понимание что к чему относится.

                                                                                  0

                                                                                  По поводу форматирования кода, можно вполне использовать символы, отсутствующие в русской раскладке, ведь код набирают в английской раскладке, кавычки всё же лучше выглядят:


                                                                                  ``code``
                                                                                  ;;code;;
                                                                                    0

                                                                                    Код не только в английской набирают, особенно, когда его копипастят.

                                                                                    +1
                                                                                    Тексты я пишу на русском, но большая часть спецсимволов есть только в английской раскладке клавиатуры.

                                                                                    Знакомая проблема. В Notepad++ я решил её через плагин jN следующим кодом:


                                                                                    Заголовок спойлера
                                                                                    // trdm 2020-02-17 10:21:08  
                                                                                    // script: trdmUtil.js
                                                                                    function typeSymbol( psSymb ) { Editor.currentView.selection = psSymb; }
                                                                                    function addHotSym(psFu, psKey) {
                                                                                        var rv = {
                                                                                            ctrl: false,
                                                                                            shift: false,
                                                                                            alt: true,
                                                                                            key: psKey, // "I"
                                                                                            cmd: psFu
                                                                                        };
                                                                                        addHotKey(rv);  // Различные клавиши <>
                                                                                    }
                                                                                    
                                                                                    // Ввоод символов в русской раскладке схема Alt+' >> ' ; Alt+$ >> $. Можно не переключать раскладку.
                                                                                    function typeSymbol_1() {   typeSymbol( '<' );} addHotSym(typeSymbol_1,0xBC);
                                                                                    function typeSymbol_3() {   typeSymbol( '\'' );} addHotSym(typeSymbol_3,0xDE);
                                                                                    function typeSymbol_2() {   typeSymbol( '>' );} addHotSym(typeSymbol_2,0xBE);
                                                                                    function typeSymbol_4() {   typeSymbol( '~' );} addHotSym(typeSymbol_4,0xC0);
                                                                                    function typeSymbol_5() {   typeSymbol( '$' );} addHotSym(typeSymbol_5,0x34);//$
                                                                                    function typeSymbol_6() {   typeSymbol( '#' );} addHotSym(typeSymbol_6,0x33); //#########
                                                                                    function typeSymbol_7() {   typeSymbol( '|' );} addHotSym(typeSymbol_7,0xDC); //
                                                                                    function typeSymbol_8() {   typeSymbol( '[' );} addHotSym(typeSymbol_8,0xDB); //
                                                                                    function typeSymbol_9() {   typeSymbol( ']' );} addHotSym(typeSymbol_9,0xDD); //
                                                                                    function typeSymbol_10() {  typeSymbol( '\'' );} addHotSym(typeSymbol_10,0xDE); //
                                                                                    

                                                                                    Этот код вешает хоткеи позволяющие без переключения на английский по клавише Alt+… вводить соответствующие спец символы.

                                                                                      0

                                                                                      Я решил проблему, написав дополнение для Vim, транслитерирующее ввод: такой подход позволяет использовать только одну (английскую) раскладку для ввода (для которой я ещё и освоил слепую печать), хотя и не всегда удобен. Думал как‐нибудь написать на замену что‐то более системное — разобраться, как вводятся иероглифы и сделать по аналогии, но до этого как‐то не дошло.

                                                                                        0

                                                                                        Как-то сильно заморочено :)

                                                                                        0

                                                                                        Добавил немножко символов.


                                                                                        // trdm 2020-02-17 10:21:08  
                                                                                        // script: trdmUtil.js
                                                                                        //[[[[[[[[[[[[[[[[[[[[[[[[[
                                                                                        // Ввоод символов в русской раскладке схема Alt+Символ: Alt+> =>> > ; Alt+$ =>> $. Можно не переключать раскладку.
                                                                                        function typeSymbol( psSymb ) { 
                                                                                            if(psSymb.length > 0) {  
                                                                                                Editor.currentView.selection = psSymb; 
                                                                                            }
                                                                                        }
                                                                                        function addHotSym(psFu, psKey) {
                                                                                            var rv = {ctrl: false,  shift: false,   alt: true,  key: psKey, cmd: psFu};
                                                                                            addHotKey(rv);  
                                                                                        }
                                                                                        function addHotSymC(psFu, psKey) {
                                                                                            var rv = {ctrl: true,   shift: false,   alt: false, key: psKey, cmd: psFu};
                                                                                            addHotKey(rv);  
                                                                                        }
                                                                                        function typeSymbol_1()  {  typeSymbol( '<' );} addHotSym(typeSymbol_1,0xBC); //<>>
                                                                                        function typeSymbol_2()  {  typeSymbol( '>' );} addHotSym(typeSymbol_2,0xBE);
                                                                                        function typeSymbol_3()  {  typeSymbol( '\'' );} addHotSym(typeSymbol_3,0xDE);
                                                                                        function typeSymbol_4()  {  typeSymbol( '~' );} addHotSym(typeSymbol_4,0xC0); //~
                                                                                        function typeSymbol_5()  {  typeSymbol( '$' );} addHotSym(typeSymbol_5,0x34);//$$$
                                                                                        function typeSymbol_6()  {  typeSymbol( '#' );} addHotSym(typeSymbol_6,0x33); //###
                                                                                        function typeSymbol_7()  {  typeSymbol( '|' );} addHotSym(typeSymbol_7,0xDC); //|||
                                                                                        function typeSymbol_8()  {  typeSymbol( '[' );} addHotSym(typeSymbol_8,0xDB); //[[[
                                                                                        function typeSymbol_9()  {  typeSymbol( ']' );} addHotSym(typeSymbol_9,0xDD); //]]]
                                                                                        function typeSymbol_10() {  typeSymbol( '\'' );} addHotSym(typeSymbol_10,0xDE); //'''
                                                                                        function typeSymbol_11() {  typeSymbol( '%' );} addHotSym(typeSymbol_11,0x35); //%%
                                                                                        function typeSymbol_12() {  typeSymbol( '^' );} addHotSym(typeSymbol_12,0x36); //^^
                                                                                        function typeSymbol_13() {  typeSymbol( '&' );} addHotSym(typeSymbol_13,0x37); //&&
                                                                                        function typeSymbol_14(){   typeSymbol( '`' );} addHotSymC(typeSymbol_14,0xC0);// `
                                                                                        function typeSymbol_15(){   typeSymbol( '@' );} addHotSym(typeSymbol_15,0x32);// @
                                                                                        function typeSymbol_16(){   typeSymbol( '' );} addHotSym(typeSymbol_16,0x31);// Заглушка для свертывания блоков. не пользуюсь
                                                                                        //]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

                                                                                        Думаю для поклонников Notepad++ будет некое полезное подспорье…
                                                                                        Как использовать:


                                                                                        • установить плагин jN
                                                                                        • в кателоге %Notepad++\plugins\jN\jN\includes\ добавить файл trdmUtil.js (UTF-8)
                                                                                        • Закинуть в файл этот текст
                                                                                        • Перезагрузить N++
                                                                                        • Пользоваться.
                                                                                        0
                                                                                        Дмитрий, Вы очень активный и конструктивный человек! Спасибо Вам за статью!

                                                                                        Разрабатывать удобный текстовый формат оптимально, но придавать излишний вес фактору «это не удобно набирать на русской раскладке клавиатуры» мне кажется малооптимально в этом вопросе.

                                                                                        Хочу поинтересоваться — а Вы бы хотели, чтобы все люди на планете общались одним единым языком?
                                                                                          0
                                                                                          Предложение классное, лучше чем текущая реализация md, в части списков и заголовков, но таблицы видимо, да, что не придумывай норм не получиться.
                                                                                          Мне кажется их можно только самые простые делать в простом формате, хотите красоты — пользуйтесь не простыми форматами, используйте для этого навороченные редакторы.
                                                                                          С ручным выравниванием колонок я тоже намучался.
                                                                                          С другой стороны если будет возможность вставить картинку, то проще таблицу нарисовать в продвинутом редакторе и в документ вставить ссылку на картинку.
                                                                                          По части «Преформатированный текст», не соглашусь, писать ```php или ```sql не напрягает, 4 пробела подряд — очень спорное решение. Я понимаю что спец символов доступных из русской раскладки, не так много, но. Почему бы не сделать тройной символ;
                                                                                          С другой стороны что бы написать php всё равно надо раскладку переключить поэтому и символ ` тоже норм. Можно конечно вместо php писать «пхп», «скл», «иксмл», что бы не переключать раскладу, но мне кажется это будет слишком для консервативных умов.

                                                                                          Only users with full accounts can post comments. Log in, please.