CGI::HtmlExtension 模块
提供 HTML 生成方法的 Mixin 模块。
例如,
cgi.a("http://www.example.com") { "Example" } # => "<A HREF=\"http://www.example.com\">Example</A>"
Html3、Html4 等模块包含更基本的 HTML 生成方法(#title
、#h1
等)。
有关详细示例,请参阅类 CGI
。
公共实例方法
以字符串形式生成锚元素。
href
可以是字符串,提供 HREF 属性的 URL,也可以是元素属性的哈希。
该元素的主体是通过传入的无参数块返回的字符串。
a("http://www.example.com") { "Example" } # => "<A HREF=\"http://www.example.com\">Example</A>" a("HREF" => "http://www.example.com", "TARGET" => "_top") { "Example" } # => "<A HREF=\"http://www.example.com\" TARGET=\"_top\">Example</A>"
# File lib/cgi/html.rb, line 97 def a(href = "") # :yield: attributes = if href.kind_of?(String) { "HREF" => href } else href end super(attributes) end
href
可以是字符串,提供 HREF 属性的基本 URL,也可以是元素属性的哈希。
传入的无参数块被忽略。
base("http://www.example.com/cgi") # => "<BASE HREF=\"http://www.example.com/cgi\">"
# File lib/cgi/html.rb, line 115 def base(href = "") # :yield: attributes = if href.kind_of?(String) { "HREF" => href } else href end super(attributes) end
以字符串形式生成 BlockQuote 元素。
cite
可以是字符串,提供引文文本的 URI
,也可以是哈希,提供元素的所有属性,或者可以省略,在这种情况下,元素没有属性。
主体由传入的无参数块提供
blockquote("http://www.example.com/quotes/foo.html") { "Foo!" } #=> "<BLOCKQUOTE CITE=\"http://www.example.com/quotes/foo.html\">Foo!</BLOCKQUOTE>
# File lib/cgi/html.rb, line 134 def blockquote(cite = {}) # :yield: attributes = if cite.kind_of?(String) { "CITE" => cite } else cite end super(attributes) end
生成一个 Checkbox 输入元素作为字符串。
元素的属性可以指定为三个参数,name
、value
和 checked
。checked
是一个布尔值;如果为真,则 CHECKED 属性将包含在元素中。
或者,属性可以指定为哈希。
checkbox("name") # = checkbox("NAME" => "name") checkbox("name", "value") # = checkbox("NAME" => "name", "VALUE" => "value") checkbox("name", "value", true) # = checkbox("NAME" => "name", "VALUE" => "value", "CHECKED" => true)
# File lib/cgi/html.rb, line 180 def checkbox(name = "", value = nil, checked = nil) attributes = if name.kind_of?(String) { "TYPE" => "checkbox", "NAME" => name, "VALUE" => value, "CHECKED" => checked } else name["TYPE"] = "checkbox" name end input(attributes) end
生成一系列复选框元素,作为 String
。
所有复选框都将具有相同的 name
属性。每个复选框后面都跟着一个标签。每个值将对应一个复选框。每个值都可以指定为 String
,该值将同时用作 VALUE 属性的值和该复选框的标签。单元素数组具有相同的效果。
每个值也可以指定为一个三元素数组。第一个元素是 VALUE 属性;第二个是标签;第三个是布尔值,指定该复选框是否为 CHECKED。
每个值也可以指定为一个两元素数组,方法是省略值元素(默认为与标签相同)或布尔 checked 元素(默认为 false)。
checkbox_group("name", "foo", "bar", "baz") # <INPUT TYPE="checkbox" NAME="name" VALUE="foo">foo # <INPUT TYPE="checkbox" NAME="name" VALUE="bar">bar # <INPUT TYPE="checkbox" NAME="name" VALUE="baz">baz checkbox_group("name", ["foo"], ["bar", true], "baz") # <INPUT TYPE="checkbox" NAME="name" VALUE="foo">foo # <INPUT TYPE="checkbox" CHECKED NAME="name" VALUE="bar">bar # <INPUT TYPE="checkbox" NAME="name" VALUE="baz">baz checkbox_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz") # <INPUT TYPE="checkbox" NAME="name" VALUE="1">Foo # <INPUT TYPE="checkbox" CHECKED NAME="name" VALUE="2">Bar # <INPUT TYPE="checkbox" NAME="name" VALUE="Baz">Baz checkbox_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"]) checkbox_group("NAME" => "name", "VALUES" => [["foo"], ["bar", true], "baz"]) checkbox_group("NAME" => "name", "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])
# File lib/cgi/html.rb, line 234 def checkbox_group(name = "", *values) if name.kind_of?(Hash) values = name["VALUES"] name = name["NAME"] end values.collect{|value| if value.kind_of?(String) checkbox(name, value) + value else if value[-1] == true || value[-1] == false checkbox(name, value[0], value[-1]) + value[-2] else checkbox(name, value[0]) + value[-1] end end }.join end
生成一个 File
上传输入元素作为字符串。
元素的属性可以指定为三个参数,name
、size
和 maxlength
。maxlength
是文件 名称 的最大长度,而不是文件 内容 的最大长度。
或者,属性可以指定为哈希。
有关包含文件上传的表单,请参见 multipart_form()
。
file_field("name") # <INPUT TYPE="file" NAME="name" SIZE="20"> file_field("name", 40) # <INPUT TYPE="file" NAME="name" SIZE="40"> file_field("name", 40, 100) # <INPUT TYPE="file" NAME="name" SIZE="40" MAXLENGTH="100"> file_field("NAME" => "name", "SIZE" => 40) # <INPUT TYPE="file" NAME="name" SIZE="40">
# File lib/cgi/html.rb, line 276 def file_field(name = "", size = 20, maxlength = nil) attributes = if name.kind_of?(String) { "TYPE" => "file", "NAME" => name, "SIZE" => size.to_s } else name["TYPE"] = "file" name end attributes["MAXLENGTH"] = maxlength.to_s if maxlength input(attributes) end
生成一个 Form 元素作为字符串。
method
应为“get”或“post”,默认为后者。action
默认为当前 CGI
脚本名称。enctype
默认为“application/x-www-form-urlencoded”。
或者,属性可以指定为哈希。
有关包含文件上传的表单,另请参见 multipart_form()
。
form{ "string" } # <FORM METHOD="post" ENCTYPE="application/x-www-form-urlencoded">string</FORM> form("get") { "string" } # <FORM METHOD="get" ENCTYPE="application/x-www-form-urlencoded">string</FORM> form("get", "url") { "string" } # <FORM METHOD="get" ACTION="url" ENCTYPE="application/x-www-form-urlencoded">string</FORM> form("METHOD" => "post", "ENCTYPE" => "enctype") { "string" } # <FORM METHOD="post" ENCTYPE="enctype">string</FORM>
# File lib/cgi/html.rb, line 310 def form(method = "post", action = script_name, enctype = "application/x-www-form-urlencoded") attributes = if method.kind_of?(String) { "METHOD" => method, "ACTION" => action, "ENCTYPE" => enctype } else unless method.has_key?("METHOD") method["METHOD"] = "post" end unless method.has_key?("ENCTYPE") method["ENCTYPE"] = enctype end method end if block_given? body = yield else body = "" end if @output_hidden body << @output_hidden.collect{|k,v| "<INPUT TYPE=\"HIDDEN\" NAME=\"#{k}\" VALUE=\"#{v}\">" }.join end super(attributes){body} end
生成一个顶级 HTML 元素作为字符串。
元素的属性指定为哈希。伪属性“PRETTY”可用于指定生成的 HTML 字符串应缩进。“PRETTY”还可以指定为字符串作为该方法的唯一参数。如果给出了伪属性“DOCTYPE”,则将其用作前导 DOCTYPE SGML 标签;它应包括该标签的全部文本,包括尖括号。
html 元素的主体作为块提供。
html{ "string" } # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML>string</HTML> html("LANG" => "ja") { "string" } # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML LANG="ja">string</HTML> html("DOCTYPE" => false) { "string" } # <HTML>string</HTML> html("DOCTYPE" => '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">') { "string" } # <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML>string</HTML> html("PRETTY" => " ") { "<BODY></BODY>" } # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> # <HTML> # <BODY> # </BODY> # </HTML> html("PRETTY" => "\t") { "<BODY></BODY>" } # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> # <HTML> # <BODY> # </BODY> # </HTML> html("PRETTY") { "<BODY></BODY>" } # = html("PRETTY" => " ") { "<BODY></BODY>" } html(if $VERBOSE then "PRETTY" end) { "HTML string" }
# File lib/cgi/html.rb, line 403 def html(attributes = {}) # :yield: if nil == attributes attributes = {} elsif "PRETTY" == attributes attributes = { "PRETTY" => true } end pretty = attributes.delete("PRETTY") pretty = " " if true == pretty buf = "".dup if attributes.has_key?("DOCTYPE") if attributes["DOCTYPE"] buf << attributes.delete("DOCTYPE") else attributes.delete("DOCTYPE") end else buf << doctype end buf << super(attributes) if pretty CGI.pretty(buf, pretty) else buf end end
生成一个图像元素作为字符串。
src
是图像的 URL。alt
是图像的替代文本。width
是图像的宽度,height
是其高度。
或者,属性可以指定为哈希。
img("src", "alt", 100, 50) # <IMG SRC="src" ALT="alt" WIDTH="100" HEIGHT="50"> img("SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50) # <IMG SRC="src" ALT="alt" WIDTH="100" HEIGHT="50">
# File lib/cgi/html.rb, line 474 def img(src = "", alt = "", width = nil, height = nil) attributes = if src.kind_of?(String) { "SRC" => src, "ALT" => alt } else src end attributes["WIDTH"] = width.to_s if width attributes["HEIGHT"] = height.to_s if height super(attributes) end
生成一个带有 multipart 编码的表单元素作为 String
。
multipart 编码用于包含文件上传的表单。
action
是要执行的操作。enctype
是编码类型,默认为“multipart/form-data”。
或者,属性可以指定为哈希。
multipart_form{ "string" } # <FORM METHOD="post" ENCTYPE="multipart/form-data">string</FORM> multipart_form("url") { "string" } # <FORM METHOD="post" ACTION="url" ENCTYPE="multipart/form-data">string</FORM>
# File lib/cgi/html.rb, line 500 def multipart_form(action = nil, enctype = "multipart/form-data") attributes = if action == nil { "METHOD" => "post", "ENCTYPE" => enctype } elsif action.kind_of?(String) { "METHOD" => "post", "ACTION" => action, "ENCTYPE" => enctype } else unless action.has_key?("METHOD") action["METHOD"] = "post" end unless action.has_key?("ENCTYPE") action["ENCTYPE"] = enctype end action end if block_given? form(attributes){ yield } else form(attributes) end end
生成一个密码输入元素作为字符串。
name
是输入字段的名称。value
是其默认值。size
是输入字段显示的大小。maxlength
是输入密码的最大长度。
或者,可以将属性指定为哈希。
password_field("name") # <INPUT TYPE="password" NAME="name" SIZE="40"> password_field("name", "value") # <INPUT TYPE="password" NAME="name" VALUE="value" SIZE="40"> password_field("password", "value", 80, 200) # <INPUT TYPE="password" NAME="name" VALUE="value" SIZE="80" MAXLENGTH="200"> password_field("NAME" => "name", "VALUE" => "value") # <INPUT TYPE="password" NAME="name" VALUE="value">
# File lib/cgi/html.rb, line 542 def password_field(name = "", value = nil, size = 40, maxlength = nil) attributes = if name.kind_of?(String) { "TYPE" => "password", "NAME" => name, "VALUE" => value, "SIZE" => size.to_s } else name["TYPE"] = "password" name end attributes["MAXLENGTH"] = maxlength.to_s if maxlength input(attributes) end
生成一系列单选按钮输入元素,作为 String
。
此操作与 checkbox_group()
的工作方式相同。但是,一个组中最多只能选中一个单选按钮。
radio_group("name", "foo", "bar", "baz") # <INPUT TYPE="radio" NAME="name" VALUE="foo">foo # <INPUT TYPE="radio" NAME="name" VALUE="bar">bar # <INPUT TYPE="radio" NAME="name" VALUE="baz">baz radio_group("name", ["foo"], ["bar", true], "baz") # <INPUT TYPE="radio" NAME="name" VALUE="foo">foo # <INPUT TYPE="radio" CHECKED NAME="name" VALUE="bar">bar # <INPUT TYPE="radio" NAME="name" VALUE="baz">baz radio_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz") # <INPUT TYPE="radio" NAME="name" VALUE="1">Foo # <INPUT TYPE="radio" CHECKED NAME="name" VALUE="2">Bar # <INPUT TYPE="radio" NAME="name" VALUE="Baz">Baz radio_group("NAME" => "name", "VALUES" => ["foo", "bar", "baz"]) radio_group("NAME" => "name", "VALUES" => [["foo"], ["bar", true], "baz"]) radio_group("NAME" => "name", "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])
# File lib/cgi/html.rb, line 685 def radio_group(name = "", *values) if name.kind_of?(Hash) values = name["VALUES"] name = name["NAME"] end values.collect{|value| if value.kind_of?(String) radio_button(name, value) + value else if value[-1] == true || value[-1] == false radio_button(name, value[0], value[-1]) + value[-2] else radio_button(name, value[0]) + value[-1] end end }.join end
生成重置按钮输入元素,作为 String
。
这会将表单上的值重置为其初始值。value
是显示在按钮上的文本。name
是此按钮的名称。
或者,属性可以指定为哈希。
reset # <INPUT TYPE="reset"> reset("reset") # <INPUT TYPE="reset" VALUE="reset"> reset("VALUE" => "reset", "ID" => "foo") # <INPUT TYPE="reset" VALUE="reset" ID="foo">
# File lib/cgi/html.rb, line 720 def reset(value = nil, name = nil) attributes = if (not value) or value.kind_of?(String) { "TYPE" => "reset", "VALUE" => value, "NAME" => name } else value["TYPE"] = "reset" value end input(attributes) end
生成一个提交按钮输入元素,作为 String
。
value
是要显示在按钮上的文本。name
是输入的名称。
或者,属性可以指定为哈希。
submit # <INPUT TYPE="submit"> submit("ok") # <INPUT TYPE="submit" VALUE="ok"> submit("ok", "button1") # <INPUT TYPE="submit" VALUE="ok" NAME="button1"> submit("VALUE" => "ok", "NAME" => "button1", "ID" => "foo") # <INPUT TYPE="submit" VALUE="ok" NAME="button1" ID="foo">
# File lib/cgi/html.rb, line 750 def submit(value = nil, name = nil) attributes = if (not value) or value.kind_of?(String) { "TYPE" => "submit", "VALUE" => value, "NAME" => name } else value["TYPE"] = "submit" value end input(attributes) end
生成一个文本字段输入元素,作为 String
。
name
是输入字段的名称。value
是其初始值。size
是输入区域的大小。maxlength
是接受的输入的最大长度。
或者,属性可以指定为哈希。
text_field("name") # <INPUT TYPE="text" NAME="name" SIZE="40"> text_field("name", "value") # <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="40"> text_field("name", "value", 80) # <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="80"> text_field("name", "value", 80, 200) # <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="80" MAXLENGTH="200"> text_field("NAME" => "name", "VALUE" => "value") # <INPUT TYPE="text" NAME="name" VALUE="value">
# File lib/cgi/html.rb, line 782 def text_field(name = "", value = nil, size = 40, maxlength = nil) attributes = if name.kind_of?(String) { "TYPE" => "text", "NAME" => name, "VALUE" => value, "SIZE" => size.to_s } else name["TYPE"] = "text" name end attributes["MAXLENGTH"] = maxlength.to_s if maxlength input(attributes) end
生成一个文本区域元素,作为 String
。
name
是文本区域的名称。cols
是列数,rows
是显示中的行数。
或者,属性可以指定为哈希。
主体由传入的无参数块提供
textarea("name") # = textarea("NAME" => "name", "COLS" => 70, "ROWS" => 10) textarea("name", 40, 5) # = textarea("NAME" => "name", "COLS" => 40, "ROWS" => 5)
# File lib/cgi/html.rb, line 808 def textarea(name = "", cols = 70, rows = 10) # :yield: attributes = if name.kind_of?(String) { "NAME" => name, "COLS" => cols.to_s, "ROWS" => rows.to_s } else name end super(attributes) end