parser

Выводим RSS

Автор: Misha v.3 [03 августа 2007]
Версия: 1.4
Тэги: RSS, XML

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

# создаём объект Feed и при необходимости сразу определяем поля у <channel/>.
# можно задать любое поле, упомянутое в спецификации RSS 2.0.
# при задании полей типа date можно передавать как объект-date, так и строку с датой в sql формате.
$oFeed[^FeedRss::create[
	$.title[RSS title]
	$.link[http://$env:SERVER_NAME/]
	$.description[RSS description]

#	по умолчанию для docs будет выведено
#	$.docs[http://blogs.law.harvard.edu/tech/rss]

#	по умолчанию для generator будет выведено
#	$.generator[^if(def $env:PARSER_VERSION){$env:PARSER_VERSION}{Parser 3}]

#	$.copyright[Copyright (c) Vasya Poupkin]
#	$.webMaster[vasya@poupkin.ru]
#	$.ttl(10)
#	$.image[
#		<title>Совсем короткий заголовок</title>
#		<url>http://$env:SERVER_NAME/link/to/image.jpg</url>
#		<link>http://$env:SERVER_NAME/</link>
#		<width>100</width>
#		<height>100</height>
#	]
#	и т.д.
]]

# если при создании объекта не определили поля <channel/> или возникло желание переопределить их -- делаем это
^oFeed.set[
	$.title[RSS title ^[updated^]]
]

# добавляем item-ы
# можно задать любое поле, упомянутое в спецификации RSS 2.0.
# при задании полей типа date можно передавать как объект-date, так и строку с датой в sql формате.
# в реалиях вы как-то достанете данные из БД/файла, и несколько раз вызовете метод addItem (например в menu).
^oFeed.addItem[
	$.title[Item 1 title]
	$.guid[http://item1-link]
	$.pubDate[^date::create[2007-08-02 22:33:44]]
	$.author[^taint[Name <email@domain.ru>]]
]
^oFeed.addItem[
	$.title[Item 2 title]
	$.guid[http://item2-link]
	$.pubDate[2007-08-01 12:23:34]
	$.description[Item 2 description]
	$.comments[Item 2 comments]
]

# выводим RSS поток
# перед выводом будет произведена проверка заполненности обязательных полей.
# по умолчанию будут выданы необходимые HTTP заголовки (last-modified, content-type).
^oFeed.print[
	$.sVersion[2.0]

#	нужно указать, какая Time Zone будет указана при выводе полей типа date.
#	согласно RFC822 безопасно использовать зоны GMT, UTC, некоторые зоны USA или сдвиг времени.
#	в случае, если указанная зона не совпадает с зоной, в которой работает ваш сервер, 
#	не забудьте вручную сдвинуть даты в нужную зону при задании полей типа date у channel и item.
	$.sTZ[+0300]
#	$.sTZ[GMT]

#	количество item-ов, которое будет выведено. по умолчанию выводятся все добавленные item-ы.
	$.iItemLimit(10)

#	если указано, то item-ы будут отсортированы по pubDate. по умолчанию выводятся в порядке их добавления.
	$.bOrderItems(true)

#	подавить вывод XML declaration.
#	$.bOmitXMLDeclaration(true)

#	подавить вывод HTTP заголовков.
#	$.bOmitHTTPHeaders(true)
]

Типа всё :)

Да, забыл сказать, что для работы этих классов требуется доступность класса dtf.p, а также нагло "украденных" у smalex-а классов ArrayList и ArrayListEnumerator, которые отныне поселились среди полезных пользовательских операторов.

Скачать:

Feed.zip (15.08.2007  4,5 КБ)
Архив классов для формирования RSS лент с примером использования