Как вкладки интерпретируются в CommonMark?
См. Описание перед примером 6 в спецификации CommonMark по адресу: http://spec.commonmark.org/0.27/.
Я пытаюсь понять, как следующий код приводит к блоку кода, начинающемуся с двух пробелов.
>→→foo
Пример 6 показывает, что это будет означать следующее.
<blockquote>
<pre><code> foo
</code></pre>
</blockquote>
Но в разделе 2.2 четко говорится:
Однако в тех случаях, когда пробел помогает определить структуру блока, вкладки ведут себя так, как если бы они были заменены пробелами с остановкой табуляции из 4 символов.
Поэтому, насколько я понимаю, приведенная выше уценка ведет себя следующим образом (я обозначаю пробел точкой).
>........foo
Так как один дополнительный пробел допускается после >
и 4 пробела используются для отступа блока кода, мы остались с,
>...foo
Это кодовый блок, начинающийся с трех пробелов. Как CommonMark утверждает, что он должен привести к блоку кода, начинающемуся с двух пробелов? Что мне не хватает?
1 ответ
Ключ находится в самом первом абзаце раздела " Вкладки " (выделение добавлено):
Вкладки в строках не расширяются до пробелов. Однако в тех случаях, когда пробел помогает определить структуру блока, вкладки ведут себя так, как если бы они были заменены пробелами с остановкой табуляции из 4 символов.
Обратите внимание, что написано "4 символа", а не 4 пробела.
Если вы сконфигурируете свой текстовый редактор для использования табуляции длины четыре и для замены табуляции пробелами (любой хороший текстовый редактор должен предлагать этот параметр), текстовый редактор будет использовать столбцы шириной в четыре символа. Когда вы нажимаете клавишу табуляции, он перемещает курсор к следующему столбцу, который будет иметь ширину всего четыре символа. Если столбец уже содержит какие-либо символы, то к четырем символам добавляется только столько пробелов, которые в этом случае будут меньше четырех пробелов.
Например, если вы вводите угловую скобку (>
) в редакторе, а затем нажмите вкладку, вы получите следующее (при настройке замены табуляции пробелами):
>···
Поэтому угловая скобка плюс вкладка перемещаются вперед до конца столбца (четыре символа), что в сумме составляет три пробела. Теперь, когда мы находимся в начале следующего столбца, повторное нажатие клавиши tab переместит нас к следующему столбцу (еще 4 пробела), что в общей сложности составит 7 пробелов:
>·······
Мы можем подтвердить, что это правильная интерпретация с более недавним изменением спецификации, зафиксированной в 3bc01c5dc (которая, очевидно, еще не добралась до релиза). Как следует из комментария фиксации, пояснение помогает сделать математику более понятной (выделение добавлено)
Обычно
>
после начала кавычки может следовать пробел, который не считается частью содержимого. В следующем случае>
сопровождается вкладкой, которая обрабатывается так, как если бы она была развернута в три пробела. Поскольку одно из этих пространств считается частью разделителя,foo
Считается, что внутри контекста цитаты блока есть отступ с шестью пробелами, поэтому мы получаем блок кода с отступом, начинающийся с двух пробелов.
Обратите внимание на добавленное предложение (выделено жирным шрифтом), которое подтверждает, что на первой вкладке добавляются только " три пробела ".
Поэтому, как мы сейчас установили, мы начнем с угловой скобки плюс семь пробелов. Итак, сначала мы отключаем разделитель блок цитат, который состоит из угловой скобки и первого пробела (в следующих примерах |
используется для указания того, где анализатор разбивает строку и не должен учитываться как символы):
>·|······
Текст, содержащийся в цитате, теперь имеет шесть пробелов. Четыре из них являются разделителем блоков кода:
>·|····|··
Что оставляет два пробела в начале блока кода.
Конечно, как было сказано в начале (из раздела в спецификации), вкладки на самом деле не заменяются пробелами, они просто ведут себя так, как если бы они были. И это иногда может сбивать с толку. Это может помочь настроить ваш текстовый редактор так, чтобы всегда заменять вкладки пробелами, и тогда вы сможете избежать этой путаницы.