Записки о неопределенностях в textile (недописано)
Textile — человекоориентированный язык разметки. Очень удачный. Беда в том, что он был придуман с потолка PHP'шниками и не имеет четких правил по поводу того, как обрабатывать те или иные символы.
К примеру, чтобы подчеркнуть слово как вставленное, нужно обрамить его знаками +
. А как мы будем интерпретировать текст 1+2+3=6
— как 123=6, или все-таки как 1+2+3=6? Официальное руководство часто дает только общие понятия о том, как пользоваться текстайлом. А вот как быть тем, кто пишет парсеры?
Вот кое-какие правила, которые я сумел вывести, базируя их на основе здравого смысла и поведения реализаций на PHP и RedCloth. На основе их работает мой парсер текстайла.
Модификаторы для фраз среди текста
Символ считается модификатором, а не частью текста, если он «прилипает» к выделяемому тексту с одной стороны и окружен пробелом, табуляцией, началом или концом строки с другой. К примеру, + word +
уже не будет считаться вставленным словом из-за пробелов между знаками +
и выделяемым словом. Также не будет выделяться 1+2+3=6
Если фраза между модификаторами пуста, модификаторы считаются текстом. ++
нельзя интерпретировать как вставленный пустой текст.
Если же нам нужно выделить фразу внутри, «впритык» к другому тексту, то в соответствии с руководством мы дополнительно обрамляем модификаторы с помощью квадратных скобок — [++].
Пунктуация
В спорных случаях парсер и пользователь должны расчитывать на то, что текст с грамотно расставленной пунктуацией — это просто текст, а с необычно расставленными знаками препинания — текстайловые модификаторы.
Так, например, после двоеточия ставится пробел. Поэтому "языки для академиков": haskell, ocaml
— это просто текст без разметки, а вот "язык для академиков":http://haskell.org
— это ссылка. Но никак не потому, что там стоит http://
— ведь ссылка может быть и с неизвестным науке протоколом, да и просто относительная, а не абсолютная.
Точно так же 2+2+2
мы пишем либо слитно, либо с пробелом с обеих сторон вокруг знака — 2 + 2 + 2
. А вот 2 +2+ 2
— это что-то некрасивое и не по типографике, так что можно оставить возможность интепретировать плюсы как модификаторы.
Правила хорошей пунктуации с точки зрения текстайла такие:
- Между знаком в конце предложения и следующим предложением ставится пробел. Так, восклицательный знак не может стоять в начале слова впритык к нему! Это используется для обозначения
!картинок!
.
*
Юникодная пунктуация
А вот «*привет*»
превратится в «*привет*», потому что юникод пунктуацией не считается.
FIXME: что делать?
Расширенные блоки (extended blocks)
Это те блоки, которые могут включать пустые строки и выделяются двумя точками в модификаторе — «bc..
». Интересно то, что после такого блока никак нельзя поставить список, так как особых модификаторов для списка в текстайле нет.
Замена символов на более приятные для глаз ("" → “”, - → —, -- → —, ... → …, x → ×, (TM) → ™, (R) → ®, (C) → ©)
Вот оно нафиг не нужно.
- Во-первых, уместность такой замены сильно зависит, ну, хотя бы от языка. Русский текст с “английскими лапками” — это уродливо. Русскому «елочки» и свои „лапки“ нужны.
- Во-вторых, все это нужно только тому, кто не осилил compose key.
Списки
Списки не могут быть внутри других блоков! Они сами блоки. Официальная реализация с ее <p><ul>...
не соответствует спецификации XHTML 1.0.
Парсер должен ожидать пробела после *
, иначе начинающиеся с жирного текста строки будут интепретированны как элементы списка.
...
"the pattern (has fucked up ":http://google.com)":http://ya.ru
<a title="has fucked up ":http://google.com" href="http://ya.ru">the pattern </a>