# coding: utf-8 # # HTMLドキュメントを文法に正しく沿って構築するためのクラス。 # 拡張ライブラリによらずRubyだけで書かれているので処理系によらず動作する。s # 簡明実用のため、DOM操作の機能はない。 # Fileに対するプレーンテキストの出力のように必要な順で #tag と #putsを呼べば # HTMLが作られる。 class HTMLBuilder class << HTMLBuilder # 引数 str を文字列化し、XML文書のテキストノードに # 使えるようにメタキャラクタを実体参照に # 置換した結果(String)を返す。 # def xmltext str str.to_s.encode(Encoding::UTF_8, :xml => :text) end # 引数 str を文字列化し、XML文書の属性値に # 使えるようにメタキャラクタを実体参照に # 置換した結果(String)を返す。 # 先頭・末尾がダブルクォートとなることに注意。 def xmlattr str str.to_s.encode(Encoding::UTF_8, :xml => :attr) end # 引数strが要素・属性の名前として適切な文字列の場合に真を返す。 # さしあたり字種をチェックしているだけである。 def good_name? str /\A[0-9A-Za-z][-0-9A-Za-z]*\z/ === str end end # HTMLでは一部のタグは内容を持つことが許されず、閉じタグを記載してはならないこととされている。 # VOID_ELEMSはこのようなタグ名にマッチする正規表現である。 # /\A(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)\z/ VOID_ELEMS = /\A(area|base|br|col|embed|hr|img|input|link|meta|param|(?#-- --)source|track|wbr)\z/ # 読みやすさのため、タグ名がこの正規表現にマッチする場合、開きタグの前と閉じタグの後に改行が挿入される。 BLOCKY_ELEMS = /\A(hr|h[1-6]|p|div|center|pre|blockquote|address|noscript|(?#-- --)noframes|ul|ol|dir|menu|d[ltd]|table|caption|col|thead|tbody|tfoot|tr|td|(?#-- --)form|script|fieldset|legend|meta|title|head|link|style)\z/ # HTMLドキュメントの構築を始める。引数 titleが(要すれば文字エスケープをした上で)title要素に設定される。このtitle要素のほかhead要素の一部は最初にタグを出力するまで変更可能である( #header 参照). def initialize title @buf = [''] # @head holds the content of tag until _start_body is called. # _start_body clears it to indicate can no longer be modified. @head = { :lang => 'ja', :title => title, :buf => [] } # @stack is list of nested tags @stack = [] end # 引数itemの値に応じて各種メタ情報を設定する。 # #tag または #puts より前に呼ばねばならない。 # :call-seq: # header('lang', [String] lang) => self # header('title', [String] title) => self # header('base', 'href'=>url) => self # header('meta', 'http-equiv'=>fieldname, 'content'=>content) => self # header('link', 'rel'=>relation, 'href'=>url) => self # header('script', 'src'=>url) => self # header('script', 'text'=>text) => self # header('style', 'text'=>text) => self # # [lang] HTMLドキュメントの言語を指定する。 # デフォルトは日本語。英語ならば 'en' とする。 # その他は http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes をみてほしい。 # # [title] ページの表題を指定する。コンストラクタ #new で指定した表題を変更する。 # # [text]