WML (Wireless Markup Language) - язык разметки для работы в Интернет беспроводных устройств (WAP), основанный на XML. Назначение WML - описание информационного контента и пользовательского интерфейса для особого класса узкополосных устройств, типа Palm Pilot, сотовых телефонов и пейджеров.
В языке "визуальной разметки" для WAP устройств свое законное место заняла
идея хорошо структурированных данных - WML наследует синтаксис
XML. XML- язык разметки, получивший невероятную
поддержку благодаря своей способности описывать данные. HTML -
предопределяет те тэги, которые могут быть использованы для описания
страницы так, чтобы ее смог правильно понять и обработать броузер.
XML, в свою очередь, позволяет создателю документа определять такой
набор тэгов, которой он считает необходимым. Этот набор тэгов
группируется затем в набор грамматических "правил", называемых
Определение Типа Документа или проще DTD. DTD, используемый для описания WML, расположен по
адресу: http://www.wapforum.org/DTD/wml_1.1.xml
Используемые компоненты синтаксиса в WML - это символьные сущности,
элементы, атрибуты, комментарии, переменные и секции CDATA.
Самая первая фраза внутри любого XML-документа
называется пролог. Поскольку стандартен, он содержит две строчки
кода: определение версии XML и DTD (указатель на файл, содержащий
DTD)
Пролог выглядит следующим образом.
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
Следом за прологом, в каждом XML-документе
содержится один единственный элемент, который содержит в себе
остальные подэлементы и entities. Так же как и в HTML этими
элементами являются угловые скобки: <> и </>. Например:
<element>data</element>. В документе должен содержаться
только один элемент описывающий сам документ. В WML этим элементом
является <wml>. Все остальные элементы содержатся уже внутри
него.
Два самых распространенных способа хранения
информации внутри XML-документа это элементы и их атрибуты. Элементы
определяют структурную разметку внутри документа открытием и
закрытием определенных тэгов. Элементы, в свою очередь могут
содержать подэлементы. Атрибуты в основном используются для описания
элементов.
Набор поддерживаемых WML
тегов невелик, и язык основан на метафоре колоды карт.
WML был разработан для для устройств с низкой
пропускной способностью и маленьким дисплеем. В качестве составной
этого дизайна была применена концепция дек и карт. Один WML-документ
(а точнее элементы, содержащиеся внутри элемента <wml>)
называется декой (deck). Интерактивное взаимодействие с
пользователем осуществляется с помощью карт (card). Достоинство
такой реализации заключается в том, что несколько экранов могут быть
загружены на клиентское устройство за один раз. Используя WMLScript,
обработка действий пользователя может быть произведена с
использованием находящихся в одной деке карт, исключая тем самым
множественные транзакции с сервером. Конечно, в связи с
ограниченными ресурсами клиентского устройства возникает другая
проблема. Поэтому вам вполне возможно придется разбрасывать ваши
карты по разным деками во избежании чрезмерного увеличения объема
одного файла.
Как только wml-файл загружен в устройство с сервера, пользователь
может листать экраны, переходить к следующему или возвращаться к
предыдущему, не ожидая загрузки с сайта, что, конечно, выгодно по
скорости.
WML колода из одной карты
<wml>
<card>
<p>Welcome</p>
</card>
</wml>
Структура языка во многом родственна HTML:
теги <wml>...</wml> начинают и завершают документ, а
тело карт заключается в <card>...</card>. В WML есть глобальные переменные, в которых можно запоминать
информацию на уровне текущего сеанса. Их присутствие в языке вызвано
уменьшением обмена с сервером, и это отличается от традиций HTML.
Поскольку в одной деке
может содержаться несколько карт, то нужен механизм хранения
информации из одной карты для ее последующего использования в
другой. Этот механизм обеспечивается переменными. Переменные могут
быть созданы и определены, используя несколько различных методов.
Используя элемент <setvar> в качестве результата
выполнения пользователем определенных действий. Кроме того, этот
элемент может быть использован для определения переменной внутри
следующих элементов: <go>, <prev>, <refresh>.
Следующий элемент создает переменную x и присваивает ей значение
"123".
<setvar name="x" value="123"/>
Переменным также присваивается значение через использование
элементов <input>, <select>, <option> и других.
При этом автоматически создается переменная с именем этого
элемента. По окончании ввода, ей присваивается значение
соответствующее выбору пользователя. Например следующий элемент
создаст переменную с именем "x"
<select name="x" title="X Value:">
Строительные блоки и функциональные средства WML можно условно
разделить на четыре категории: форматирование, навигация, ввод
данных и управление действиями/событиями.
Форматирование
Поскольку на экран выводится по одной карте, то в элементе
card предусмотрен атрибут id - внутренний
идентификатор для переходов, а также видимый на экране заголовок
title. Для форматирования текста, почти аналогично HTML,
используются такие элементы, как:
p для параграфов, В <p> можно указывать атрибуты
align и mode. align принимает значения right, center или left, а
mode задает, будет ли текст на экране с авто-переносом (wrap) или
нет (nowrap).
em и I - для выделения курсивом,
strong - для "полужирного начертания.
u - для подчеркивания,
big - для текста большего размера
small - для текста маленького размера.
table для таблиц, с привычными <tr> и <td>
<br/ > - для перехода на новую строку,
<img/ > для графики.
Навигация
Для навигации и установки гиперссылок предусмотрены теги
anchor
и a
Семантика a повторяет HTML, а в элементе anchor
используется либо подэлемент go с атрибутом href, задающим
адрес ссылки, либо prev - вернуться к предыдущему экрану.
Вызвав страницу,пользователь получает первую карточку. Чтобы перейти к
следующей, необходимо как-то адресоваться к картам, для чего служит
id тега <card> - уникальный идентификатор карты. Еще есть "title" - название карточки, имеющее смысл, в частности, для закладок.
<anchor>List of Tales
<go href="tales.wml"/></anchor>
<anchor>Previous page<prev/></anchor>
<a href="story.wml">goto Story</a><br/>
В примере выше ссылки устанавливаются при помощи anchor и
традиционного тега <a>. У anchor два атрибута: "href"
определяет объект, на который мы ссылаемся, и "title" - экранная
надпись, идентифицирующая связь, которую броузер может опционально
показывать.
Элементы ввода
Всю мощь идея переменных приобретает при возможности
что-то получить от пользователя. Для этого предусмотрен комплект
тегов ввода, достаточно близких к своим HTML аналогам:
Поле input предназначено для ввода данных пользователем
select/option - поле выбора из заранее заданного
списка.
postfield - аналог скрытых input в HTML-формах. На
самом деле, это даже более мощная вещь, так как имея переменные, в
postfields сейчас можно собирать и перегруппировывать информацию.
Атрибуты name тегов <input> и <select>
хранятся как переменные на всем пространстве колоды и выступают
параметрами в переходах по go и a. Посредством других
атрибутов <input,> типа type, format и maxlength, можно
управлять форматным вводом. Пользуясь тегом fieldset, можно
задавать некоторые стили оформления.
Здесь атрибут name - имя переменной, куда заносится значение,
type - тип формы (текст или число), value - значение по умолчанию
(до ввода), a emptyok показывает, допустима ли в качестве значения
пустая строка.
Управление действиями
"Действия" (tasks, do) используются для структур типа меню и для
описания отдельных действий, например, для выбора новой
карты/ссылки. Типовые "исполнительные" теги действий - это
go,prev, refresh (перечитать текущую карту) или
noop (ничего не делать). Действия на уровне конкретной карты
описываются в тегах do, а на уровне всей колоды - в элементе
template.
При помощи тега timer и атрибута
ontimer тега card можно, например, на время 'заморозить' страницу.
На практике часто применяется ontimer="url", говорящий, что некое
время карта должна отображаться, а затем должен загрузиться ресурс с
адреса url. Время в value выражается в 0,1 сек.
Согласно WML-спецификации, у элементов do должны быть уникальные
name, но если какое-либо из имен опущено, то подразумевается, что
оно берется из type. В таких случаях различные элементы do легко
могут начать пересекаться по именам, что может стать источником
трудно диагностируемых ошибок.
В WML есть также возможность назначать клавиши навигации. Тег
<onevent type="button"><действие></onevent>
позволяет приписать к одной из кнопок телефона (зависит от модели)
пользовательское событие. В качестве действия обычно используется
<go href="url"/>. Так, добавив к карте строку <onevent
type= "GO"><go href="#card2"/></onevent>, можно
кнопке GO поставить в соответствие переход непосредственно в меню. Вариант
иллюстрирует другой вариант переназначения стандартного меню
телефона и способ передачи переменных в сервер-ориентированные
скрипты. Значение параметра type показывает, какая именно клавиша
будет переопределена (в данном случае кнопка, соответствующая OK).
Префикс $ перед именем переменной говорит о том, что будет
использовано значение переменной, а не само слово "varsearch".
Графика
В настоящее время в WML поддерживается графический формат,
называемый WBMP (Wireless BMP type 0) - монохромные (двуцветные)
изображения. Формат WBMP type 0 имеет следующие характеристики :
No compression
One bit color (white=1, black=0)
One bit color deep (monochrome)
Для вставки в wml картинки предназначен тег
<img />, где, как в HTML, для ссылки на источник картинки
используется атрибут "src". Типичные параметры img:
Атрибут localsrc позволяет, как замену src, указать в качестве
источника внутреннюю пиктограмму броузера. Атрибут "align" задает
выравнивание картинки с опциями top, bottom и middle.
WBMP в качестве ссылки
Для конвертирования в формат WBMP лучше всего выбирать маленькие
контрастные изображения.
Максимальный размер картинки в
байтах зависит от устройства, но не должен превышать ограничений на
размер карты (около 1,4k). Соответственно,
предельный размер в пикселах например для Nokia 7110 составляет
около 96 x 65 (width, height), хотя физический экран (без
скроллинга) еще меньше и ограничен 96 x 44 (4 строки по 11
пикселов), а к примеру, для Ericsson R320 - 101x52 (строка в 13
пикселов). Следует учитывать, что пикселы отдельных устройств не
всегда квадратные.