=begin

= HTML Tag Library

tag.rb

Version 1.0.4

Copyright (C) 2000 MoonWolf Development

MoonWolf <moonwolf-ruby@moonwolf.com>

== 使い方

=== 基本的なHTMLの出力

  require "tag"
  doc = []                          #HTMLドキュメント(Array)
  html = Tag('html')                #<html>
  doc << html                       #docに<html>を追加
  html << head = Tag('head')        #htmlに<head>を追加
  head << (Tag('title') << "TITLE") #headに<title>を追加
  html << body = Tag('body',{'bgcolor'=>'#FFFFFF'})
                                    #<body bgcolor="#FFFFFF">
  print doc.to_s                    #HTML出力

==== 出力
  <html><head><title>TITLE</title></head><body bgcolor="#FFFFFF"></body></html>

=== 属性の設定

  img = Tag('img/')
  img['src']='xxx.png'  #<img src="xxx.png">
  
  o = Tag('option')
  o['selected']=true    #<option selected>

=end

require "cgi"

class Tag
=begin
== クラスメソッド:
--- new(tagname[,attr[,item]])
     新しいオブジェクトを生成する。
     ((|tagname|))はタグの名前、空要素の場合は'/'を追加した名前を指定する。
       Tag.new('html') # <html>〜</html>
       Tag.new('hr/')  # <hr>
=end
	def initialize(tagname,attr = {},item=[])
		@tagname = tagname
		@attr    = attr
		@item    = item
	end
=begin
== メソッド:
--- tagname
     タグ名を返す。
--- attr
     属性のハッシュを返す。
--- item
     子要素の配列を返す。
=end
	attr_accessor('tagname')
	attr_accessor('attr')
	attr_accessor('item')
	def [](name)
		@attr[name]
	end
	def []=(name,value)
		if value
			@attr[name] = value
		else
			@attr.delete(name)
		end
	end
=begin
--- self<<(obj)
    ((|obj|))を配列の末尾に追加する。

=end
	def <<(obj)
		if obj.type==Array
			@item.concat obj
		else
			@item.concat [obj]
		end
		self
	end
=begin
--- cr
     \nを配列の末尾に追加する。
=end
	def cr
		@item << "\n"
		self
	end
=begin
--- br
     <br>を配列の末尾に追加する。
=end
	def br
		@item << "<br>"
		self
	end
=begin
--- insertafter(target,*obj)
     ((|target|))の直後に((|obj|))を挿入する。
=end
	def insertafter(target,*obj)
		@item[@item.index(target)+1,0] = obj
		self
	end
=begin
--- insertbefore(target,*obj)
     ((|target|))の直前に((|obj|))を挿入する。
=end
	def insertbefore(target,*obj)
		@item[@item.index(target),0] = obj
		self
	end
=begin
--- to_s
     HTMLに変換する。
=end
	def to_s
		if @tagname =~ /\/$/
			"<" << @tagname.chop + @attr.collect{|name, value|
				if value==true
					' ' << name
				else
					' ' << name << '="' << CGI::escapeHTML(value) << '"' if value
				end
			}.to_s << '>' << @item.to_s
		else
			"<" << @tagname << @attr.collect{|name, value|
				if value==true
					' ' << name
				else
					' ' << name << '="' << CGI::escapeHTML(value) << '"' if value
				end
			}.to_s << '>' << @item.to_s << '</' << @tagname << '>'
		end
	end
end

=begin
== トップレベルメソッド
--- Tag(tagname [, attr [, item]])
--- Tag(tagname [, attr [, item]]) {...}
     新しいオブジェクトを生成する。
     ブロックを指定して呼び出された場合、ブロックを評価した値を配列に追加する。
=end
def Tag(tagname,attr = {},item=[])
	obj = Tag.new(tagname,attr,item)
	if iterator?
		obj << yield
	end
	obj
end

=begin

== 変更来歴

* 2000/10/13 - MoonWolf
  * version 1.0.3
  * <<メソッド不具合修正
  * Hashの仕様変更に対応

* 2000/09/26 - MoonWolf
  * version 1.0.2
  * Array#concatメソッドの仕様変更に対応

* 2000/08/16 - MoonWolf
  * version 1.0.1
  * <<メソッドの引数を*objからobjに変更

* 2000/08/13 - MoonWolf
  * version 1.0.0
  * 最初のリリース

=end
