модуль 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 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 Создать элемент заголовка таблицы как строку.
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 как строку.
Атрибуты элемента могут быть указаны в виде трех аргументов, 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>
Создать скрытый элемент 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 Создать элемент 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 Генерирует элемент ввода пароля в виде строки.
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 Генерирует элемент радиокнопки Input.
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 Генерирует последовательность элементов радиокнопок Input в виде 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 Генерирует элемент кнопки сброса (reset button) Input в виде 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 Генерирует элемент кнопки отправки (submit button) Input в виде 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 Генерирует текстовое поле Input в виде 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–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.