модуль CGI::HtmlExtension
Модуль-примесь, предоставляющий методы для генерации HTML.
Например,
cgi.a("http://www.example.com") { "Example" }
# => "<A HREF=\"http://www.example.com\">Example</A>"
Модули Html3, Html4 и т. д. содержат более базовые методы генерации HTML (title, h1 и т. д.).
Подробный пример см. в классе CGI.
Открытые методы экземпляра
# 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 Генерирует элемент Anchor в виде строки.
href может быть строкой, задающей URL для атрибута HREF, или хешем атрибутов элемента.
Содержимое элемента — строка, возвращаемая переданным блоком без аргументов.
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 115
def base(href = "") # :yield:
attributes = if href.kind_of?(String)
{ "HREF" => href }
else
href
end
super(attributes)
end Генерирует элемент Document Base URI в виде String.
href может быть строкой, задающей базовый URL для атрибута HREF, или хешем атрибутов элемента.
Переданный блок без аргументов игнорируется.
base("http://www.example.com/cgi")
# => "<BASE HREF=\"http://www.example.com/cgi\">"
# 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 Генерирует элемент 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 154
def caption(align = {}) # :yield:
attributes = if align.kind_of?(String)
{ "ALIGN" => align }
else
align
end
super(attributes)
end Генерирует элемент Table Caption в виде строки.
align может быть строкой, задающей выравнивание подписи (одно из значений: top, bottom, left или right), хешем всех атрибутов элемента или может быть опущен.
Содержимое элемента задаётся переданным блоком без аргументов.
caption("left") { "Capital Cities" }
# => <CAPTION ALIGN=\"left\">Capital Cities</CAPTION>
# 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 Генерирует элемент ввода Checkbox в виде строки.
Атрибуты элемента можно указать тремя аргументами: 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 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 Генерирует последовательность элементов флажков в виде String.
У всех флажков будет одинаковый атрибут name. За каждым флажком следует метка. Для каждого значения создаётся отдельный флажок. Каждое значение можно указать как String; оно будет использоваться и как значение атрибута VALUE, и как метка для этого флажка. Массив из одного элемента даёт тот же результат.
Каждое значение также можно указать как массив из трёх элементов. Первый элемент — атрибут VALUE, второй — метка, а третий — логическое значение, указывающее, отмечен ли этот флажок.
Каждое значение также можно указать как массив из двух элементов, опустив либо элемент значения (по умолчанию он совпадает с меткой), либо логический элемент 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 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 Генерирует элемент ввода для загрузки файла 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 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 Генерирует элемент 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>
Генерирует скрытый элемент ввода Hidden в виде строки.
Атрибуты элемента можно указать двумя аргументами: name и value.
В качестве альтернативы атрибуты можно указать хешем.
hidden("name")
# <INPUT TYPE="hidden" NAME="name">
hidden("name", "value")
# <INPUT TYPE="hidden" NAME="name" VALUE="value">
hidden("NAME" => "name", "VALUE" => "reset", "ID" => "foo")
# <INPUT TYPE="hidden" NAME="name" VALUE="value" ID="foo">
# 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 Генерирует корневой 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 448
def image_button(src = "", name = nil, alt = nil)
attributes = if src.kind_of?(String)
{ "TYPE" => "image", "SRC" => src, "NAME" => name,
"ALT" => alt }
else
src["TYPE"] = "image"
src["SRC"] ||= ""
src
end
input(attributes)
end Генерирует элемент ввода Image Button в виде строки.
src — URL изображения, используемого для кнопки. name — имя поля ввода. alt — альтернативный текст изображения.
В качестве альтернативы атрибуты можно указать хешем.
image_button("url")
# <INPUT TYPE="image" SRC="url">
image_button("url", "name", "string")
# <INPUT TYPE="image" SRC="url" NAME="name" ALT="string">
image_button("SRC" => "url", "ALT" => "string")
# <INPUT TYPE="image" SRC="url" ALT="string">
# 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 Генерирует элемент Image в виде строки.
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 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 Генерирует элемент Form с составной кодировкой в виде String.
Составная кодировка используется для форм, содержащих загрузку файлов.
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 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 Генерирует элемент ввода пароля Password в виде строки.
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">
Генерирует элемент Select в виде строки.
name — имя элемента. values — варианты, которые можно выбрать в меню Select. Каждое значение может быть String или массивом из одного, двух или трёх элементов Array. Если это String или массив из одного элемента Array, оно используется и как значение этого варианта, и как отображаемый для него текст. Если это массив из трёх элементов Array, его элементы задают значение варианта, отображаемый текст и логическое значение, указывающее, выбран ли этот вариант изначально. В массиве из двух элементов можно опустить либо значение варианта (по умолчанию оно совпадает с отображаемым текстом), либо логический параметр выбора (по умолчанию false).
Атрибуты и варианты также можно указать хешем. В этом случае варианты задаются массивом значений, как описано выше, с ключом хеша «VALUES».
popup_menu("name", "foo", "bar", "baz")
# <SELECT NAME="name">
# <OPTION VALUE="foo">foo</OPTION>
# <OPTION VALUE="bar">bar</OPTION>
# <OPTION VALUE="baz">baz</OPTION>
# </SELECT>
popup_menu("name", ["foo"], ["bar", true], "baz")
# <SELECT NAME="name">
# <OPTION VALUE="foo">foo</OPTION>
# <OPTION VALUE="bar" SELECTED>bar</OPTION>
# <OPTION VALUE="baz">baz</OPTION>
# </SELECT>
popup_menu("name", ["1", "Foo"], ["2", "Bar", true], "Baz")
# <SELECT NAME="name">
# <OPTION VALUE="1">Foo</OPTION>
# <OPTION SELECTED VALUE="2">Bar</OPTION>
# <OPTION VALUE="Baz">Baz</OPTION>
# </SELECT>
popup_menu("NAME" => "name", "SIZE" => 2, "MULTIPLE" => true,
"VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])
# <SELECT NAME="name" MULTIPLE SIZE="2">
# <OPTION VALUE="1">Foo</OPTION>
# <OPTION SELECTED VALUE="2">Bar</OPTION>
# <OPTION VALUE="Baz">Baz</OPTION>
# </SELECT>
# File lib/cgi/html.rb, line 646
def radio_button(name = "", value = nil, checked = nil)
attributes = if name.kind_of?(String)
{ "TYPE" => "radio", "NAME" => name,
"VALUE" => value, "CHECKED" => checked }
else
name["TYPE"] = "radio"
name
end
input(attributes)
end Генерирует элемент ввода переключателя.
name — имя поля ввода. value — значение поля, если переключатель отмечен. checked указывает, будет ли поле отмечено изначально.
В качестве альтернативы атрибуты можно указать хешем.
radio_button("name", "value")
# <INPUT TYPE="radio" NAME="name" VALUE="value">
radio_button("name", "value", true)
# <INPUT TYPE="radio" NAME="name" VALUE="value" CHECKED>
radio_button("NAME" => "name", "VALUE" => "value", "ID" => "foo")
# <INPUT TYPE="radio" NAME="name" VALUE="value" ID="foo">
# 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.
Работает так же, как 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 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 — имя этой кнопки.
В качестве альтернативы атрибуты можно указать хешем.
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 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.
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 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 — имя поля ввода. 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 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 Генерирует элемент TextArea в виде String.
name — имя текстовой области. cols — количество столбцов, а rows — количество строк в отображаемой области.
В качестве альтернативы атрибуты можно указать хешем.
Содержимое задаётся переданным блоком без аргументов.
textarea("name")
# = textarea("NAME" => "name", "COLS" => 70, "ROWS" => 10)
textarea("name", 40, 5)
# = textarea("NAME" => "name", "COLS" => 40, "ROWS" => 5)
Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.