суббота, 8 ноября 2008 г.

DOCTYPE ENTITY средствами ruby-xml

Была задача: в генерируемом рельсами XML получить нечто похожее:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE body [
<!ENTITY reg "&#174;">
<!ENTITY mdash "&#8212;">
<!ENTITY nbsp "&#160;">
<!ENTITY ldquo "&#8220;">
<!ENTITY rdquo "&#8221;">
<!ENTITY pound "&#163;">
<!ENTITY trade "&#8482;">
<!ENTITY euro "&#8364;">
<!ENTITY yen "&#165;">
<!ENTITY copy "&#169;">
]>
...

И поскольку, для генерации XML я использую рельсовый RXML билдер, то и выводить надо было rails-методами. Что такое xml.instruct! и как им пользоваться, я давно знаю, но вот с этими entities была и самая проблема.

Нашел в классе Builder::XmlMarkup метод declare! а хули толку? Там настолько "содержательный" пример применения, что хотелось пристрелить разработчиков документации. Пришлось познать, что есть такое Class: Proc в Ruby.

Собственно, вот что в итоге получилось.

XML DOCTYPE ENTITY средствами ruby on rails (layout.rxml)



xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"

entities = {:nbsp => "&#160;", :copy => "&#169;", :reg => "&#174;", :trade => "&#8482;", :mdash => "&#8212;", :ldquo => "&#8220;",
:rdquo => "&#8221;", :pound => "&#163;", :yen => "&#165;", :euro => "&#8364;"}

xml.declare! :DOCTYPE, "body".intern do |x|
entities.each do |key, value|
x.declare! :ENTITY, "#{key}".intern, "#{value}"
end
end


Пользуйтесь! Не забывайте говорить «спасибо» ;) или «thanks» -- кто как приучен :).

0 Комментариев :

Отправить комментарий

Жги!