WML (Wireless Markup Language) – язык разметки для
работы в Интернет беспроводных устройств (WAP),
основанный на XML. Назначение WML – описание
контента и пользовательского интерфейса для
особого класса узкополосных устройств, типа Palm
Pilot, сотовых телефонов и пейджеров.
WML специально "заточен" (и продолжает
"затачиваться") с ориентацией на
ограничения подобных устройств, а именно:
малоформатный экран, узкую полосу пропускания
канала связи, малую собственную память и
ограничения на "вычислительные"
способности. По этой причине, и из-за острой нужды
в стандартизации, в языке "визуальной
разметки" для WAP устройств свое законное место
заняла идея хорошо структурированных данных – WML
наследует синтаксис XML.
Трудно ожидать, что кто-то будет подключать к
сотовому телефону мышь, поэтому модель
"point-and-click" для WAP не годится (по крайней мере,
видимо так считает группа разработчиков языка), и
большая роль в WML отводится другим механизмам
событий. Доводы здесь те, что у пользователя
должен быть шанс на управление голосом, либо еще
какие-то варианты, кроме кнопочных. Экраны WAP
устройств выглядят достаточно по-разному,
встречаются вертикальные и горизонтальные, но
объединяет их все то, что они предельно
малоформатны.
Сам WML выглядит как "HTML для бедных",
но с чуть более жесткими требованиями к парности
тегов, использованию регистра и обрамлению
атрибутов кавычками. Используемые компоненты
синтаксиса в WML – это символьные сущности,
элементы, атрибуты, комментарии, переменные и
секции CDATA.
WML скуп на возможности представления –
набор поддерживаемых тегов невелик, и язык
основан на нетипичной метафоре колоды карт, хотя
сильных аргументов в защиту этого построения из
просмотренных источников у меня не сложилось.
Нельзя сказать, что особым успехом увенчались и
попытки осознать до конца модель WML tasks/events. Но,
похоже, я не одинок – имеющиеся в сети материалы
страдают схожими проблемами.
Метафора игральных карт
Краеугольный камень WML-дизайна – колода
игральных карт – набор показываемых по
отдельности карточек (экранов), хранящихся в
памяти. То есть, если для обычного сайта единицей
является Web-page, то единица WML – это т. н. deck,
состоящая из одной или нескольких card,
составляющих вместе WML-документ (wml-файл).
Как только wml-файл загружен в
устройство с сервера, пользователь может листать
экраны, переходить к следующему или возвращаться
к предыдущему, не ожидая загрузки с сайта, что,
конечно, выгодно по скорости.
Пример 1. WML-колода из одной карты
<wml>
<card>
<p>Welcome</p>
</card>
</wml>
Нетрудно заметить, что структура языка
во многом родственна HTML: теги <wml>...</wml>
начинают и завершают документ, а тело карт
заключается в <card>...</card>.
Впрочем, пример выше еще не вполне завершен. WML -
это ветвь XML, а любой XML-документ сначала должен
пройти проверку на соответствие своему DTD (Document
Type Definition). Следовательно, в любом wml-файле, как
документе, необходимо указать полный путь к WML DTD.
В полном примере ниже DTD-ссылка указывает
на сайт W@PForum,
координирующий сегодня WAP-разработки, и это DTD
описывает все обязательные элементы стандарта
WML, интерпретируемые всеми микро-броузерами.
Впрочем, если кому-то не так важно, что это такое,
и не суть важны сторонние расширения, которыми
тоже можно пользоваться на предмет правильности
разметки, то можно просто копировать эту типовую
декларацию, особо не задумываясь.
Пример 2. WML-колода из трех карт
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="home" title="Welcome">
<p align="center">Taler's HP<br/>
<img src="logo.wbmp" alt="home"/><br/>
<do type="accept" label="next"><go href="#card1"/></do></p>
</card>
<card id="card1" title="Page 1">
<p>This is the first card.</p>
<do type="accept" label="next"><go href="#card2"/></do>
<do type="prev" label="back"><prev/></do>
</card>
<card id="card2" title="Page 2">
<p>This is the second card.</p>
<do type="accept" label="home"><go href="#home"/></do>
</card>
</wml>
В Web есть программы-имитаторы, с помощью
которых wml-файлы можно "видеть" даже без
реального устройства, а просто на базе
имеющегося броузера. Например здесь
Примечание: размер загружаемых в WAP-устройства файлов ограничен – не более что-то
около 1.4k (1397, 1492, .. байт – граница зависит от устройства).
Переменные
В WML есть глобальные переменные, в
которых можно запоминать информацию на уровне
текущего сеанса. Их присутствие в языке вызвано
уменьшением обмена с сервером, и это отличается
от традиций HTML.
Если присвоить в одной карте переменной $myname
значение Andy, а в другой карте есть текст "Welcome
$myname", то он будет выведен как "Welcome Andy".
Простенько и со вкусом!
Основные типы тегов WML
Строительные блоки и функциональные
средства 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 – название
карточки, имеющее смысл, в частности, для
закладок.
Пример 3
<anchor>List of Tales
<go href="tales.wml"/></anchor>
<anchor>Previous page<prev/></anchor>
<a href="story.wml">goto Story</a><br/>
В примере 3 ссылки устанавливаются
при помощи 'якоря' anchor и традиционного тега a.
У anchor два атрибута: href определяет объект,
на который мы ссылаемся, и title – экранная
надпись, идентифицирующая связь, которую браузер
может опционально показывать.
Элементы ввода
Безусловно, всю мощь идея переменных приобретает при возможности что-то получить от
пользователя. Для этого предусмотрен комплект тегов ввода, достаточно близких к своим HTML
аналогам:
input – для ввода данных пользователем,
select/option - поле выбора из заранее заданного
списка,
postfield – аналог скрытых input в HTML-формах. На
самом деле, это даже более мощная вещь, так как
имея переменные, в postfield сейчас можно собирать и
перегруппировывать информацию.
Атрибуты 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.
Назначение атрибутов большей частью
очевидно. Пояснения требует лишь localsrc, позволяя,
как замену src, указать в качестве источника
внутреннюю пиктограмму броузера. Атрибут
align задает выравнивание картинки с опциями
top, bottom и middle.
Для конвертирования в формат WBMP лучше
всего выбирать маленькие контрастные
изображения.
Максимальный размер картинки в байтах зависит от
устройства, но не должен превышать ограничений
на размер карты (как упоминалось выше, около 1,4k).
Соответственно, предельный размер в пикселах
для, скажем, Nokia 7110 составляет около 96 x 65 (width, height),
хотя физический экран (без скроллинга) еще меньше
и ограничен 96 x 44 (4 строки по 11 пикселов), а к
примеру, для Ericsson R320 – 101x52 (строка в 13 пикселов).
Следует учитывать, что пикселы отдельных
устройств не всегда квадратные.
Список ресурсов для работы с WBMP можно
найти, например, здесь.
Photoshop позволяет сохранять в виде WBMP рисунки или Paintshop Pro на платформе Windows (в команде меню Save As появится пункт "UnWired.wbmp").
Wapaint.dll(от Wapaint.com) – ActiveX Server module, предназначенный для работы
в ASP-скриптах на сервере и удобный для генерации динамических картинок (типа статистических диаграмм и пр.).
Присмотритесь также к редактору изображений из Nokia SDK.
WML для вызова динамимических картинок через ASP и Wapaint.dll
<wml>
<card id="home" title="example">
REM GRAPH.asp is the image to construct
<p align="center">example<br/>
<img src="GRAPH.asp" alt="problem"/><br/></p>
<do type="prev" label="prev"> <prev/> </do>
</card>
</wml>
Если вы пользуетесь имитатором, необходимо тщательно протестировать страницы на
реальном телефоне, потому что многие имитаторы плохо поддерживают графические файлы.
Желательно проверить все в реальных условиях – это единственный способ застраховаться от
неприятностей.
Советы по разработки WML приложений
Устройства WAP ограничены по возможностям из-за памяти, процессора, скорости
передачи т. д., однако кое-что все-таки можно делать, зная об этих ограничениях. А технологии
совершенствуются, и появляются новые улучшенные решения.
Приложения необходимо проектировать, исходя из
принципа 'колоды карт'. Так как она загружается
целиком, это уменьшает обмен данными с сервером.
Любой запрос на другую колоду инициирует новое
соединение с сервером, что потребует
дополнительного времени – так устроена
WAP-технология.
Из-за малого размера экрана особое внимание
нужно уделить читабельности текста. Размер
"страницы" лучше ограничить 4- 5-ю экранами.
Для удобной навигации и быстрого управления
предпочтительнее теги select/option (выбор из списка),
чем какие-то другие средства.
Из-за маленькой памяти стоит избегать графики.
Не следует пренебрегать alt для изображений
(альтернативный текст для случаев, когда броузер
не поддерживает картинок) – если среди
Internet-броузеров отсутствие такой поддержки
является анахронизмом, то в WAP это
распространенное явление.
WAP стандарты не фиксируют соглашений о
навигации, типа back, forward и home, как это принято в
Internet-броузерах. Проработка этих вопросов
остается на усмотрение дизайнера.