yurikhan: (Default)

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

Потом люди придумали универсальные языки разметки — XML, JSON и YAML — с помощью которых можно выразить всё что угодно. Поэтому теперь вместо синтаксиса часто изобретают схему.

Однако, что у нас с их подсветкой? (осторожно, цветной текст на белом фоне) )
yurikhan: (Default)

До чего же всё плохо с тем, что называется syndication.

Во-первых, читалки. Подавляющее большинство — на PHP с базой MySQL. В лучшем случае — с PostgreSQL, но всё равно PHP. Есть одна на Go с базой Google App Engine Datastore. What is this I don’t even. (Нет, десктопные читалки рассматривать принципиально не будем, потому что они не дают гарантию непропуска постов.)

Казалось бы, чего сидишь, ниша открыта, напиши RSS-читалку с архитектурой, которая не будет оскорблять твои чувства.

Да только дело в том, что сами форматы данных (RSS 0.9, RSS 1.0, RSS 0.91, RSS 2.0 и Atom вместе с ними) — тяжело больны антипаттерном «само выросло». Сначала у item’ов вообще были только название и ссылка. Потом добавилось описание, предполагаемое коротким и неформатированным. Потом внезапно оказалось, что люди пихают туда HTML! Иногда даже забывая сохранить well-formedness окружающего XML’я. Окей, сняли ограничения на длину, задокументировали, что блин, раз уж вы туда пишете HTML, то эскейпьте его по правилам XML’я. Ну и под конец Atom — «пишите хоть плейн текст, хоть заэскейпленный HTML, хоть валидный XHTML, но явно подпишите, какой именно формат вы используете».

Естественно, при прочих равных софт на стороне производителя генерирует тот формат, к которому проще привести входные данные. А входные данные у большинства[citation needed] блогов — не валидируемый и потому массово невалидный HTML. '<[CDATA[' + post_body + ']]>' и не волнует, пусть кто-то другой с этим потом мучается.

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

Пойду засуну свой инстанс Tiny Tiny RSS в контейнер от греха подальше. Тем более что оно, оказывается, перешло с нормальной модели релизов «вот вам полурегулярные orig.tar.gz, собирайте себе пакеты под что хотите» на rolling-модель «текущая стабильная версия — это то, что сейчас в master’е».

yurikhan: (Default)

Если вы делаете вот так:

<?xml version="1.0" encoding="utf-8"?>
<foo>
    …
    <description>какой-то &lt;b&gt;форматированный&lt;/b&gt; текст</description>
    …
</foo>

или так:

<?xml version="1.0" encoding="utf-8"?>
<foo>
    …
    <description><![CDATA[какой-то <b>форматированный</b> текст]]></description>
    …
</foo>

то эти лучи поноса — вам.

Read more... )
yurikhan: (Default)

Люди, которые проектируют какую-нибудь XML-схему, сначала описывают какой-нибудь элемент как содержащий текст (xsd:string), а потом говорят «Oops, а нам надо туда форматированный текст… ну пофиг, зафигачим туда кусок HTML, обёрнутый в <![CDATA[…]]>» — заслуживают выделенного круга ада. Google KML, I’m looking at you.

(Правильный путь, разумеется, включать xhtml как подсхему.)

yurikhan: (Default)

Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems. /Jamie Zawinski

Студия Артемия Лебедева опубликовала валидатор XML, построенный на регекспах.

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

Так вот, регулярные выражения способны разобрать лишь регулярные языки. А грамматика XML — контекстно-свободная.

Я не вчитывался внимательно в весь код, но, как минимум, <!DOCTYPE> может согласно их валидатору находиться в любом месте и в любых количествах. Кроме того, они упорно используют во всех регекспах конструкцию [a-z_][\w:-]*, в то время как по спецификации имя должно начинаться с Буквы (включая латинский, греческий, кириллический, армянский, еврейский, арабский, бенгальский, тамильский, тайский, лаосский, тибетский, грузинский алфавит, деванагари, гурмукхи, гуджарати, ория, телугу, каннада, малаялам, хангыль, хирагану, катакану и чжуинь, а также китайские/японские иероглифы) и может содержать точки, двоеточия, подчёркивания, дефисы, Буквы, Цифры (европейские, арабо-индийские, деванагари, бенгальские, гурмукхи, гуджарати, ория, тамильские, телугу, каннада, малаялам, тайские, лаосские и тибетские), Комбинирующуюся диакритику и Экстендеры. (Для любопытных: нет, в ECMAScript эскейп \w не матчит все эти экзотические алфавиты — он эквивалентен тупо [A-Za-z0-9_].)

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

Profile

yurikhan: (Default)
Yuri Khan

August 2018

S M T W T F S
   1234
567891011
12131415161718
19202122232425
26 2728293031 

Links

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2025-07-04 21:28
Powered by Dreamwidth Studios