Momota.pw別館

Yuki_noeの進捗状況

わびさび方式から、インデント付きでみやすく、スペースを表示しない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(/"/, '&quot;')}\""
        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の文書にして返してくれます。以上。

内容はインデント付きでそれなりに見やすくしたジェームズ・クラーク式記法です。

気に入ったので作った

追記

都のことなので、これはジェームズ・クラーク式記法ではないということになる。

Clark記法

などと紛らわしいので、カッコ付きにしておきました