わびさび方式から、インデント付きでみやすく、スペースを表示しないHTML(ジェームズ・クラーク式記法)に変換する
つまりこういうことです
def format_xml arr return "<!doctype html\n>#{_format_xml [arr]}" end def _format_xml(arr, args = {}) args = { :pre => false }.merge(args) return_text = '' arr.each_with_index do |item, index| if item.instance_of? Array inner = item[1..-1] return_text << "<#{item[0]}" if item[1].instance_of? Hash inner = item[2..-1] item[1].each do |key, val| return_text << " #{key}=\"#{val.gsub(/"/, '"')}\"" end end if item[0] =~ /(?:are|met)a|base(?:font)?|[bh]r|col|frame|i(?:mg|nput|sindex)|link|param/ return_text << "\n/>" else if item[0] =~ /s(?:tyle|cript)/ return_text << ">\n#{inner[0].gsub(/^/, ' ')}" else if item[0] == :pre inner_text = _format_xml(inner, args.merge(:pre => true)) else inner_text = _format_xml(inner, args) end if inner.length == 1 and (inner[0].instance_of? Array or ! inner_text.index("\n")) and return_text.length - (return_text.rindex("\n") || 0) + (inner_text.index("\n") || 0) < 80 return_text << ">#{inner_text}" else return_text << "\n >" return_text << inner_text.gsub(/(?<=\n)/, ' ') end end if index == arr.length - 1 return_text << "</#{item[0]}>" else return_text << "</#{item[0]}\n>" end end else if args[:pre] return_text << item.gsub(/\n/, "<br\n/>") else return_text << item end end end return return_text end
format_xmlにわびさび方式を引数として渡すと、HTML5の文書にして返してくれます。以上。
内容はインデント付きでそれなりに見やすくしたジェームズ・クラーク式記法です。
気に入ったので作った
追記
XML の James Clark 記法の件なんですけど生前に直接聞いてみた.結論から言うと James Clark 記法という表記は存在しない.渕さんがページを書く際に,そういえば James Clark がこういう記法使ってたなのを書いただけだった.
— Koichiro Eto (@eto) 2007, 11月 6
都のことなので、これはジェームズ・クラーク式記法ではないということになる。
などと紛らわしいので、カッコ付きにしておきました