(Для предварительного чтения: «Экранированная разметка вредна», «Экранированная разметка: всё-таки она вредна»)
Я уже выразил своё мнение по поводу экранированной разметки на нескольких форумах — теперь, думаю, настало время приостановить критику. Тем, кому я мог что-то доказать, я это доказал; повторение делу не поможет. Но некоторые люди жаловались, что я не предлагаю никаких решений взамен критикуемого. В этот раз я предложу свои решения, и заодно — задачу, или по крайней мере упражнение, которое может вас заинтересовать.
Оптимизм — профессиональная болезнь программиста; тестирование —
её лечение.
K. Beck
Я уже писал об этом несколько раз — достаточно, чтобы выделить все мои заметки на тему экранированной разметки в отдельный раздел, несмотря на то, что я почти забросил разделение заметок на разделы — и теперь, думаю, почти всё полезное, что я мог высказать, я уже высказал.
Оказывается, я всё ещё не указал достаточно ясно, какие альтернативы существуют для экранированной разметки. Постараюсь этой заметкой исправить сложившуюся ситуацию.
Вначале — повторение моих тезисов.
Я считаю, что экранированная разметка представляет существенную опасность, и её необходимо запретить в Atom (можете подставить вместо Atom название вашего любимого производного от RSS языка — важно не это), а также во всех остальных спецификациях. Вкратце:
Содержимое, к которому было бы логично предоставить доступ средствам XML, изолируется в закрытой для таких средств области.
Задача, которую экранированная разметка призвана решить, ей решается лишь частично. Вопросы кодировки и другие проблемы интернационализации так и остаются нерешёнными.
Использование экранированной разметки создаёт у наивных пользователей иллюзию того, что это приемлемое решение общей задачи «как засунуть разметку туда, где она запрещена XML-схемой».
Последний из этих пунктов объясняет, в частности, почему экранированная разметка опасна. Два других лишь поясняют, что это неуклюжий хак.
И замечу, что я резко не согласен с заявлением, что моё мнение по этому поводу оторвано от реальности. Я отчаянно озабочен практическими аспектами проблемы экранированной разметки.
Итак, какие же есть альтернативы?
Ограничиться обычным текстом и не пытаться задавать для него разметку.
Думаю, этого окажется достаточно для тех приложений, которые используют Atom для публикации обзоров и ссылок, — т.е. для большинства фидов, которые я читаю.
Если XML-схема выбранного вами варианта Atom допускает в содержимом фида только обычный текст, то этот вариант для вас единственный. Вот что значит использовать для валидации XML-схему.
Разрешать разметку и требовать её синтаксической корректности.
Это, пожалуй, самый сложный путь — но ведь не запредельно сложный, правда? Перед тем, как опубликовать в фиде заметку, потребуется пропускать её через некую утилиту, которая бы исправляла синтаксические ошибки. Мне кажется, что такое преобразование будет ненамного сложнее, чем требующееся для корректного экранирования разметки.
Если документ, включаемый в фид, действительно содержит разметку, непредставимую в синтаксически корректном XML (например, объявления DOCTYPE), то остаётся три варианта — задействовать MIME или какой-либо другой способ реализации настоящих вложений; выложить документы где-нибудь в Сети и дать на них ссылки; наконец, закодировать их в base64.
Некоторые спрашивают, какая же будет выгода от кодирования в base64? А вот какая: у людей не будет искушения создавать вручную документы, закодированные в base64. Они не будет воображать, что слегка экранированная разметка — это универсальный способ поместить разметку в те места, где схема допускает только текст.
От этого способа нет никакой технической выгоды для машин (как нет и существенного проигрыша), но зато конечные пользователи колоссально выигрывают в прозрачности семантики.
Мне хочется провести небольшой эксперимент. Вот два документа; ни один из них не является синтаксически корректным XML, но оба отображаются «правильно» в моём браузере (Mozilla Firebird в Linux):
Лично я бы объединил в фиде только заголовки, но мог бы объединить и документы целиком, если это требуется.
Если вам кажется, что экранированная разметка — это решение проблемы, то как выглядел бы ваш фид? Есть ли у вас средства для автоматической генерации такого фида, и что они сделали бы с этими файлами?