модуль 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 Input в виде строки.
Атрибуты элемента могут быть заданы тремя аргументами, 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 Генерирует последовательность элементов checkbox в виде 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 Upload Input в виде строки.
Атрибуты элемента могут быть заданы тремя аргументами, 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 Input в виде строки.
Атрибуты элемента могут быть заданы двумя аргументами, 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 Input в виде строки.
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 Генерирует элемент изображения как строку.
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 Генерирует элемент формы с кодировкой 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 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 Генерирует элемент ввода пароля как строку.
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 — это опции, которые можно выбрать в раскрывающемся меню. Каждое значение может быть 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 — имя textarea. 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–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.