xmlhack.ru logo
>> статьи на xmlhack.ru

Экранированная разметка: всё-таки она вредна

Автор: Норман Уолш
Перевод: А.Скробов
Опубликовано на norman.walsh.name (16.09.2003, англ.): http://norman.walsh.name/2003/09/16/escmarkup
Опубликовано на xmlhack.ru (25.02.2006, рус.): http://xmlhack.ru/texts/06/escaped-markup/still-harmful.html
В закладки:   Del.icio.us   reddit

(Дополнение к статье «Экранированная разметка вредна». Читайте также «Экранированная разметка: чем же её заменить».)

Никто так и не предложил ни одного мало-мальски убедительного аргумента за примирение с экранированной разметкой.

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

Мнения по поводу экранированной разметки разделились. Некоторые оставили свои комментарии к моей статье на XML.com (перевод на xmlhack.ru), Сэм Руби прокомментировал её в своём блоге, а Тим Брэй упоминал об этой проблеме ещё раньше меня. Ей даже посвящена часть Atom Wiki. Некоторым экранированная разметка очень, очень нужна.

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

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

При всём при этом, мне весьма не повезло со статьёй, которую я писал для XML.com: они её переименовали, и это наверняка вызвало определённую путаницу. Та статья, которую я им посылал, называлась «Экранированная разметка вредна». Я сначала подумал, что такая у них редактура, — но позже мне сообщили, что это была ошибка, и вернули статье правильный заголовок. (Для тех, кто не успел увидеть статью до этого исправления, сообщаю: сначала она была опубликована на XML.com под заголовком «Вложенная разметка вредна» — что заявляет совершенно о другом.)

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

Ричард Пинно спрашивает, как сохранить в его базе данных (не понимающей XML), скажем, строку «Мне эта книга показалась весьма полезной». Мой ответ: «Мне эта книга показалась <emph>весьма</emph> полезной». Использование для смысловой или стилевой разметки текста XML-тегов вызывает только одобрение.

Та практика, против которой я возражаю, возможна только в контексте уже существующего XML-документа — при добавлении разметки внутрь тех элементов, где некоторые варианты RSS допускают только простой текст. То, что сейчас для этого применяется — это экранирование разметки, чтобы несмотря на запрет передавать внутри таких элементов размеченный текст: «Мне эта книга показалась &lt;emph&gt;весьма&lt;/emph&gt; полезной.» Это просто жутко.

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

Юкка-Пекка Кейсала предлагает аргумент «экранирование разметки необходимо потому, что о содержимом фидов ничего не известно». Но одного только заключения этого содержимого в секции CDATA недостаточно: по крайней мере, нужно ещё рассматривать каждый символ на предмет проблем с кодировкой. Ненамного сложнее было бы преобразовывать всё содержимое в синтаксически корректный XML.

предыдущей заметке я упомянул TagSoup как метод преобразования беспорядочной мешанины тегов в синтаксически корректный XML. Тед Люн предлагает для этого ещё одно средство — NekoHTML. Наверняка есть и другие варианты. Заметьте, что я не пытаюсь вас склонить к какому-то одному из этих решений, а просто указываю, что они существуют.)

Джон Вэнс спрашивает, как же работать с теми браузерами, которые не понимают XHTML. Я не вполне понимаю, какой он ожидает получить ответ, потому что не вполне понимаю, в чём здесь проблема. Вы вынуждены извлекать из фида экранированное содержимое, потому что браузер, не понимающий XHTML, не сможет сам обработать XML-фид. Значит, вы обрабатываете фид сами. Если вы строите для него DOM, то может быть, вам удастся передать этот DOM непосредственно в браузер — разные способы представления пустых и закрывающих тегов, как и остальные XML-измы, в DOM никак не проявляются. А если вы передаёте в браузер просто поток текста — что же, наверняка вы сможете преобразовывать содержимое фида из XHTML в HTML с той же лёгкостью, с которой вы извлекаете из содержимого открывающие и закрывающие маркеры секций CDATA.

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

Вначале он говорит, что экранирование допустимо, потому что XML для RSS — это всего лишь транспортный протокол, и агрегаторы совершенно законно полагают, что о содержимом фидов им ничего не известно. Нам уже знаком этот аргумент, но Джулиан идёт дальше — он указывает, что SOAP и xmlrpc уже встречались с подобными проблемами. Он совершенно прав, что для систем, использующих XML в качестве транспортного протокола, эта проблема не нова. Я не знаю, как она решена в xmlrpc, но в SOAP есть два способа представления содержимого, не являющегося синтаксически корректным XML — вложения и кодирование в base64. Если один из этих способов перейдёт в RSS на замену этого убожества с экранированием, мне останется только умолкнуть. Смысл здесь в том, что вложения полностью избавляют нас от проблемы включения размеченного содержимого в XML — оно вовсе в него не включается; а при использовании кодирования в base64 станет совершенно ясно, что это лишь механизм инкапсуляции, а не формат, допускающий ручную правку.

Дальше он говорит, что «может, экранирование плохо; может, оно безобразно; может, оно даже вредно, но чёрт возьми, оно справляется с задачей». Гм. Весь вопрос здесь в том, как оно «справляется» с этой задачей. Но даже если как-то и справляется, то думаю, безобразность и вредность экранирования намного перевешивает пользу от его применения — особенно при том, что ту же задачу могут решать другие механизмы, одновременно менее безобразные и безвредные.

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

Наконец, Джулиан спрашивает, как я могу иметь что-то против использования CDATA — ведь это составная часть XML. Я ничего не имею против использования CDATA. Секции CDATA — это превосходное средство для включения текста в XML-документы. Бестолковость экранированной разметки состоит в придании секциям CDATA особого смысла в RSS/Atom, а вовсе не в их использовании как способа сэкономить на амперсандах и точках с запятыми.

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

Никто так и не предложил ни одного мало-мальски убедительного аргумента за примирение с экранированной разметкой. Это не простое упрямство, по крайней мере так мне кажется; но в этом вопросе я не уступлю. Экранированная разметка вредна. Её необходимо искоренить.



Norman Walsh Copyright © 2003-2007 Norman Walsh
Перевод: xmlhack.ru Copyright © 2000-2007 xmlhack.ru