模块 CGI::HtmlExtension
混合模块,提供 HTML 生成方法。
例如:
cgi.a("http://www.example.com") { "Example" } # => "<A HREF=\"http://www.example.com\">Example</A>"
模块 Html3,Html4 等包含更基本的 HTML 生成方法 (#title
, #h1
等)。
有关详细示例,请参阅 CGI
类。
公共实例方法
生成一个 Anchor 元素作为字符串。
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 cgi/html.rb, line 97 def a(href = "") # :yield: attributes = if href.kind_of?(String) { "HREF" => href } else href end super(attributes) end
生成一个文档基础 URI 元素作为字符串。
href
可以是字符串,给出 HREF 属性的基础 URL;或者它可以是元素属性的哈希。
传入的无参数块将被忽略。
base("http://www.example.com/cgi") # => "<BASE HREF=\"http://www.example.com/cgi\">"
# File 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 cgi/html.rb, line 134 def blockquote(cite = {}) # :yield: attributes = if cite.kind_of?(String) { "CITE" => cite } else cite end super(attributes) end
生成一个复选框输入元素作为字符串。
元素的属性可以指定为三个参数:name
,value
和 checked
。checked
是一个布尔值;如果为 true,则 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 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
生成一系列复选框元素作为字符串。
复选框将都具有相同的 name
属性。每个复选框后面都有一个标签。每个值将有一个复选框。每个值可以指定为字符串,该字符串将同时用作 VALUE 属性的值和该复选框的标签。单元素数组具有相同的效果。
每个值也可以指定为三元素数组。第一个元素是 VALUE 属性;第二个元素是标签;第三个元素是指定此复选框是否被选中的布尔值。
每个值也可以指定为双元素数组,方法是省略值元素(默认为与标签相同)或布尔选中的元素(默认为 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 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
生成一个文件上传输入元素作为字符串。
元素的属性可以指定为三个参数: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 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
生成一个表单元素作为字符串。
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 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 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 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
生成一个使用多部分编码的表单元素作为字符串。
多部分编码用于包含文件上传的表单。
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 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 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
生成一系列单选按钮输入元素作为字符串。
这与 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 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
生成一个重置按钮输入元素作为字符串。
这将表单上的值重置为其初始值。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 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
生成一个提交按钮输入元素作为字符串。
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 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
生成一个文本字段输入元素作为字符串。
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 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
生成一个文本区域元素作为字符串。
name
是文本区域的名称。cols
是显示的列数,而 rows
是显示的行数。
或者,属性可以指定为哈希。
正文由传入的无参数块提供。
textarea("name") # = textarea("NAME" => "name", "COLS" => 70, "ROWS" => 10) textarea("name", 40, 5) # = textarea("NAME" => "name", "COLS" => 40, "ROWS" => 5)
# File 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