vorige
volgende
inhoudstafel


Hoofdstuk 2: Wireless Markup Language (WML)

2.1 Inleiding

Dit hoofdstuk bespreekt de Wireless Markup Language (WML). WML is een markup- taal, gebaseerd op XML en bedoeld om de inhoud en de gebruikersinterface van toestellen met lage bandbreedte te specificeren, met inbegrip van GSM's en beepers.

WML werd ontworpen met het oog op de beperkingen waar we bij de mobiele terminals rekening moeten houden. Deze beperkingen zijn:

WML omvat tevens vier belangrijke functionele gebieden, die hieronder kort omschreven worden.

Vooreerst is er de voorstelling van tekst en lay-out. WML voorziet in de ondersteuning van tekst en figuren, met een brede waaier aan mogelijkheden voor tekstopmaak. Zo bijvoorbeeld kan tekst in vet worden weergegeven en ook de uitlijning kan worden bepaald.

Vervolgens is ook de deck/card organisatie van belang. Alle informatie in WML wordt georganiseerd in een collectie van cards en decks. Cards omvatten één of meerdere elementen van de interactie met de gebruiker (zoals een keuzemenu of een invoerveld). De gebruiker zal door een reeks van WML cards navigeren, de inhoud bekijken van deze cards, gevraagde informatie invoeren, keuzes maken en naar de volgende card gaan. Cards worden gegroepeerd in een deck. Een WML deck is in feite gelijkaardig aan een HTML pagina, in die zin dat een deck ook via een URL wordt geadresseerd en tevens de eenheid van transmissie is. Er wordt steeds een deck doorgestuurd, net zoals steeds een Webpagina wordt verzonden.

Ten derde is er de navigatie tussen de verschillende cards en het linken van cards. WML voorziet ondersteuning om de navigatie tussen de verschillende cards te controleren. Bovendien zijn er ook voorzieningen om event-handling door te voeren in het toestel. Dit kan voor navigatiedoeleinden gebruikt worden of om scripts uit te voeren.

Het laatste functionele gebied is dat van de string-parametrisatie en state management. Alle WML decks kunnen geparametriseerd worden gebruik makend van een state model. Variabelen kunnen gebruikt worden in de plaats van strings, en vervangen worden in run-time. Deze parametrisatie laat een efficiënter gebruik van de netwerkresources toe.

2.2 De kenmerken van de mobiele terminals

Zoals reeds gezegd is WML speciaal ontworpen om rekening te houden met de beperkingen van de draagbare terminals. Het gaat hierbij steeds om kleine toestellen met lage brandbreedte. Algemeen kunnen we deze toestellen als volgt kenmerken:

2.3 De Wireless Markup Language

2.3.1 Inleiding tot de WML Syntax

WML is een XML-taal en erft dus de tekenset over. In WML is de tekenset van een document een set van alle logische tekens die een document kan bevatten zoals bijvoorbeeld de letter 'T' en een vaste integer die deze letter identificeert. Een WML-document is dus een opeenvolging van integers, die samen een document vormen.

De basiseenheid van WML is een card. Cards worden samen gegroepeerd in decks. Een deck is het hoogste element in een WML document. Wanneer de gebruiker een deck ontvangt, wordt steeds de eerste card uit dat deck geactiveerd en getoond aan de gebruiker. De volgende figuur stelt het card/deck concept eenvoudig voor.

Deck: Card,Card,Card,Card Card,Card,Card,Card
Figuur 4: het deck/card concept van WML

2.3.2 Overzicht van de WML syntax

WML heeft veel van zijn syntax geleend van XML. Lezers die vertrouwd zijn met XML zullen dan ook snel de analogie onderkennen. Ook voor wie reeds voor het World Wide Web heeft ontwikkeld, zal het concept dat hieronder geschetst wordt, niet nieuw zijn.

Het is trouwens steeds een streefdoel geweest om een standaard te ontwikkeling die dicht aanleunt bij bestaande standaarden, vermits een nauwe samenwerking van beide domeinen nodig is. Denk hierbij aan HTML-inhoud die in WML wordt omgezet op verzoek van een user agent.

2.3.2.1 Entiteiten

Tekst in WML kan numerieke of benoemde tekstentiteiten bevatten. Deze entiteiten specificeren bepaalde tekens in de tekenset van het document. Entiteiten worden voor die reden gebruikt omdat bepaalde tekens moeilijk in te geven zijn in een editor. Bijvoorbeeld is het zo dat de ampersand (&) wordt weergegeven door de benoemde entiteit &. Elke entiteit begint met een ampersand en eindigt op een puntkomma.

2.3.2.2 Tags

Een tag beschrijft een taalelement en bevat het type van het element en een unieke identificatie. Een tag kan ook attributen bevatten die andere eigenschappen van het element beschrijven.

WML bestaat uit inhoud die wordt omgeven door tags, die elk omsloten zitten tussen de '<' en '>' tekens.

<tag> Dit is het begin van het element. De starttag kan attributen bevatten.
</tag> Dit is het einde van de beschrijving van het element. (eindtag)
<tag/> Dit is een leeg element, zoals bijvoorbeeld <br/> die een regel splitst.

De tags worden bij het opstellen van de applicatie uitvoerig behandeld. Om de lezer toch al enige voeling te geven met het concept werden onderstaande voorbeelden opgenomen.

a) Het maken van een deck.

Een deck, de basiseenheid in WML, bevat verschillende elementen van de interactie met de gebruiker. Deze 'elementen' die in een deck zitten, staan tussen de tags die in het statement worden vermeld.

WML-syntax:
<wml> De <wml>-tag is het begin van een deck.
... 
</wml> Deze tag sluit een deck af.

In de praktijk zullen in een deck verschillende cards zitten, waarvan de lezer de syntax in voorbeeld twee kan zien. Let op: beide tags uit het eerste voorbeeld hebben geen attributen die verdere informatie over het deck bepalen.

b) Het maken van een card.

Verschillende cards samen vormen een deck. De syntax voor één card vindt de lezer hieronder.

WML-syntax:
<card id="card1" title="Hallo"> Dit vormt het begin van een card.
... 
</card> En deze tag beëindigt de card.

Dit element (een card) heeft dus een begintag die wel attributen bevat. Immers, in de starttag worden twee extra informaties meegegeven van de card: een id, wat een unieke identificatie is van die card binnen een deck, en de titel van de card. De betekenis van deze attributen wordt verder in dit hoofdstuk behandeld.

Wanneer we nu beide combineren, dan krijgen we volgende opbouw. De onderstaande declaratie is deze van één document in WML dat drie cards bevat. Volledigheidshalve vermeld ik hierbij dat het geen volwaardig WML-document is, omdat een aantal vereiste elementen nog ontbreken. Onderstaande syntax wil de lezer enkel voeling geven met het gebruik van tags bij elementen.

WML-syntax:
<wml>                                   // Begin WML-deck

<card id="card1" title="Welcome">       // Begin card1
...
</card>                                 // Einde card1

<card id="card2" title="Main">          // Begin card2
...
</card>                                 // Einde card2

<card id="card3" title="Info">          // Begin card3
...
</card>                                 // Einde card3

</wml>                                  // Einde WML-deck

Meteen kan voor de lezer ook al duidelijk worden waarom bepaalde attributen van een element verplicht zijn, zoals hier het id-attribuut van een card. Immers, geeft men die attribuut niet mee, dan kan geen onderscheid gemaakt worden tussen de verschillende cards, wat voor navigatie knap vervelend kan zijn.

Opmerking: binnen een card worden ook elementen gespecificeerd, maar daar wordt verder op ingegaan in dit boek. Deze elementen werden weggelaten.

2.3.2.3 Elementen

Elementen specificeren alle structurele en markupinformatie in verband met een WML deck. Elementen kunnen een begintag hebben, inhoud en een eindtag. Ze hebben steeds één van de twee geïllustreerde structuren:

<tag> inhoud </tag> Voorbeeld: <card> en </card>
of  
<tag/> Voorbeeld: <br/>

Elementen die inhoud bevatten worden geïdentificeerd via een begintag <tag> en een eindtag </tag>. Een element dat geen inhoud bevat wordt dan door de lege tag <tag/> bepaald, zoals in de tweede mogelijkheid wordt aangegeven.

Het <br/> statement zorgt dat naar een nieuwe regel wordt gesprongen. Het is nutteloos om daar attributen aan toe te kennen, en het heeft ook geen inhoud. Dat is een voorbeeld van wat we een leeg element noemen.

Dit overzicht geeft een opsomming van alle tags die in de Nokia WAP Toolkit 2.0 ondersteund worden, gegroepeerd per categorie.

Categorie WML elementen Deck en card wml card template head access meta Events do ontimer onenterforward onenterbackward onpick onevent postfield Taken go prev refresh noop Variabele setvar Gebruikersinvoer input select option optgroup fieldset Ankers, figuren en timers a anchor img timer Tekstopmaak br p table tr td b i

2.3.2.4 Attributen

Vele WML elementen laten toe dat er attributen voor gespecificeerd worden. Attributen bevatten extra informatie over een element. De attributen kunnen altijd gespecificeerd worden in de starttag van een element, gebruikmakend van de volgende syntax:

<tag attribuut1="waarde1" attribuut2="waarde2">

Elk attribuut wordt gescheiden van een ander door een spatie. De waarde van een attribuut moet steeds tussen dubbele aanhalingstekens geplaatst worden, en de namen van een attribuut mogen nooit in hoofdletters zijn.

Sommige attributen zijn verplicht. Bijvoorbeeld, het go element vereist het href attribuut:

<go href="http://www.nokia.com"/>

Andere attributen zijn optioneel en kunnen standaardwaarden hebben. Een voorbeeld van een optioneel attribuut is het align attribuut voor het img element. Wanneer je het align attribuut niet specificeert, is de standaardwaarde bottom. In hoofdstuk 6 (de applicatie e-Search) wordt dit element verder besproken.

2.3.2.5 Commentaar

Dit is bedoeld voor de WML-ontwikkelaar.De commentaarstijl in WML volgt die van XML, en heeft de volgende syntax:

<! --commentaar -- >

2.3.2.6 Variabelen

Er kunnen parameters gebruikt worden voor cards en decks via het gebruik van variabelen. Om deze variabelen in een card of een deck te substitueren, worden de volgende syntaxen gebruikt:

§identifierVoorbeeld : $amount
§(identifier)Voorbeeld : $(first amount)

De haakjes zijn verplicht als een witte ruimte het einde van de variabele niet aanduidt. Onderstaand voorbeeld illustreert het verschil tussen de eerste en de tweede mogelijkheid.

Als we de een variabele (first amount) zouden willen substitueren met de syntax $first amount (dus niet tussen haakjes), zou dit geïnterpreteerd worden als $first en zou enkel first doorgegeven worden, wat tot een foutmelding zal leiden. De interpreter denkt immers dat een blanco ruimte het einde van de variabele aangeeft!

2.3.2.7 De structuur van een WML document

Een geldig WML deck is een geldig XML document en moet daarom een declaratie van het documenttype bevatten.

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM/DTD WML 1.1//EN"
  http://www.wapforum.org/DTD/wml_1.1.xml>

Een WML deck begint en eindigt met het wml element, en alle andere elementen komen tussen deze begin- en eindtag te staan.

<wml>

alle andere elementen

</wml>

Onderstaand voorbeeld is een eenvoudig WML deck dat één enkele card bevat.

<?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="First_Card" title="First Card">
		<p>
		The first WML example
		</p>
	</card>
</wml>

En dat resulteert in volgende schermuitvoer op de GSM:

First Card - The first WML example
Figuur 5: een WML deck met één card

2.4 Werken met WML elementen

2.4.1 Inleiding

In deze paragraaf worden de verschillende elementen om eenvoudige decks en cards te creëren uitvoerig besproken. Zoals reeds werd uitgelegd, is de basiseenheid van WML een card en de cards worden gegroepeerd in decks. Een WML card kan een grote hoeveelheid gegevens bevatten, maar in dat geval moet de gebruiker veel door het document scrollen om de verschillende regels te kunnen lezen. Daarom is het veel beter, vanuit het oogpunt van de gebruiksvriendelijkheid, om een opdeling te maken in meerdere cards. De lezer kan een aantal praktische tips betreffende het ontwerp van cards en decks nalezen in hoofdstuk 4. De elementen kunnen gebruikt worden om de verschillende componenten van een card te creëren. Men kan een component nodig hebben die de verbinding tussen verschillende documenten verzorgt, of de verbinding tussen bepaalde delen van een document. Deze component is een link. Andere componenten, die we taken noemen, maken dan deel uit van het uitvoeren van een opdracht. Alle elementen worden per categorie besproken, zoals vermeld in het overzicht onder paragraaf 2.3.2.3.

2.4.2 Decks en cards

Onderstaande tabel legt kort uit welke elementen men kan gebruiken om een card te definiëren binnen een deck.

ElementVerklaring
wmlDefinieert een deck en omsluit alle informatie en cards in het deck
cardDuidt de algemene lay-out voor de user agent aan.
templateCreëert een template voor de cards in het deck.
headBevat informatie over het deck als geheel, met inbegrip van meta-gegevens en toegangscontrole.
accessSpecificeert toegangscontrole voor het hele deck.
metaSpecificeert algemene meta-data met betrekking tot het deck

We gaan nog even dieper in op het card element. Onderstaande declaratie is een eenvoudig voorbeeld van een card-element:

<card id="card_name" title="title">
	<p>
	Text containing <i> information </i>
	</p>
</card>

Daar dit werk de lezer enkel een inleiding wil aanbieden tot WML, worden niet alle elementen behandeld. Voor verdere informatie kan de lezer steeds de bibliografie raadplegen.

2.4.3 Events

Men kan onderstaande elementen gebruiken om navigatie en functies te voorzien.

ElementVerklaring
doVoorziet een algemene mogelijkheid om acties op de huidige card uit te voeren.
ontimerSpecificeert een intrinsiek event dat plaatsvindt wanneer de timer afloopt.
onenterforwardSpecificeert een intrinsiek event dat plaatsvindt wanneer de gebruiker een card onder bepaalde voorwaarden opent.
onenterbackwardSpecificeert een intrinsiek event dat plaatsvindt wanneer de gebruiker naar een bepaalde card navigeert via de history.
onpickSpecificeert een intrinsiek event dat plaatsvindt wanneer de gebruiker een item selecteert of een selectie ongedaan maakt waarvoor het event werd gespecificeerd.
oneventVerbindt een taak met een bepaald intrinsiek event.
postfieldSpecificeert een veldnaam en een waarde voor de transmissie naar een origin server tijdens een verzoek.

Het is van belang om toch kort het do element toe te lichten, omwille van het grote belang in de constructie van cards, en ook voor het verband met de taken.

Een card element kan dus do elementen bevatten die taken toewijzen aan een bepaalde toets. Volgende declaratie is een eenvoudige voorbeeld van hoe men het element gebruikt:

<do type="tasktype" label="label" name="name" 
optional="false">

Verklaring:

<do> Dit is de begintag van het do element. Je kan slechts één taak per do element specificeren.

type="tasktype" Dit verwijst naar de taak die moet uitgevoerd worden.
label="label" Bevat het label voor de toets.
name="name" Bevat de naam van de koppeling van de taak aan de toets.
optional="false" Wanneer dit attribuut op "true" wordt gezet, kan de user agent dit element negeren.

2.4.4 Taakelementen

Een do element kan een taak bevatten die specificeert wat de user agent moet doen wanneer de gebruiker een toets activeert door ze in te drukken, of door een card of deck navigeert. Vier taken zijn beschikbaar: go, prev, noop en refresh.

Taak Verklaring go Geeft de locatie weer waarnaar moet genavigeerd worden in het href attribuut. Als daarin een WML card of deck wordt vermeld, wordt het betreffende deck of de card getoond. prev Zorgt voor navigatie naar de voorgaande locatie in de history stack. refresh Zorgt voor een update van de context van de user agent, bijvoorbeeld wat betreft variabelen (gedefinieerd in setvar tags). noop Geeft aan dat niets moet worden gedaan. Omwille van het grote praktische belang van deze taken worden ze alle vier hieronder nog eens kort besproken.

2.4.4.1 De go taak

De go taak zorgt dus voor navigatie naar de locatie die door een href wordt gespecificeerd. Wanneer de href een WML deck of card benoemt, wordt deze getoond. Onderstaande regel is een eenvoudig voorbeeld van hoe het go element wordt gebruikt: <go href="#card2"/> Verklaring: <go> Dit is de begintag van het go element, die duidt op een navigatie naar een href. ref="href" specificeert de bestemming, bijvoorbeeld de locatie van de card die moet worden getoond. Dit attribuut is verplicht!

2.4.4.2 De prev taak

Het prev element declareert een prev taak, wat duidt op de navigatie naar de voorgaande locatie uit de history stack. Een prev voert een pop operatie uit op de history stack (geschiedenis).

2.4.4.3 De refresh taak

Het refresh element definieert een refresh taak, wat betekent dat er een update van de huidige context van de user agent volgt. Zo kunnen bijvoorbeeld variabelen weer hun oorspronkelijke waarde krijgen, op voorwaarde dat de nodige attributen bij het definiëren van de variabele werden voorzien. Er kunnen tijdens het uitvoeren van deze taak enkele neveneffecten optreden die zichtbaar zijn voor de gebruiker, zoals een verandering in de schermuitvoer.

2.4.4.4 De noop taak

Het noop element specificeert dat er eigenlijk niets moet gebeuren, wat dus wil zeggen "no operation". Dit kan handig van pas komen wanneer men bepaalde acties die door een template uitgevoerd worden, wil tenietdoen.

2.4.5 Variabelen

Voor alle inhoud in WML kunnen parameters ingesteld worden. Deze bieden aan de ontwerper heel wat flexibiliteit wat betreft het creëren van cards, het dynamisch wijzigen van de getoonde inhoud en voor navigatie gebaseerd op invoer van de gebruiker. WML variabelen kunnen gebruikt worden in plaats van strings; hun huidige waarde wordt veranderd in run-time. Via het setvar element kan je een variabele specificeren. Daarvoor kan de lezer opnieuw terecht in de bespreking van de toepassing e-Search.

2.4.6 Gebruikersinvoer

Dit element wordt gebruikt om gebruikersinvoer in WML te verwerken. Onderstaande tabel geeft een overzicht van de attributen van dit element, en verklaart wanneer ze worden gebruikt.
ElementVerklaring
inputSpecificeert een object voor tekstinvoer.
selectLaat de gebruiker toe om te kiezen uit een lijst met opties. WML ondersteund zowel keuzelijsten waarop één of meerdere keuzes tezelfdertijd kunnen worden gemaakt.
optionSpecificeert een keuze in een select element.
optgroupStaat toe dat verbonden option elementen (bijvoorbeeld allemaal keuzes uit één lijst) gegroepeerd worden in een groter geheel om zo de lay-out en de presentatie door de user agent te vereenvoudigen.
fieldsetLaat toe dat verbonden velden en tekst gegroepeerd worden.

2.4.7 Ankers, figuren en timers

Element Verklaring anchor = a Specificeert het begin van een verbinding tussen een document en een ander, of tussen een bepaald deel van een document en een ander deel in hetzelfde document. img Plaats afbeeldingen op het scherm. timer Implementeert een 'card time' die kan gebruikt worden om inactiviteit te verwerken.

2.4.8 Tekstopmaak

Element Verklaring br Stelt het begin van een nieuwe lijn vast. P Stelt zowel de 'line wrap' als de uitlijningsparameters voor een paragraaf vast. table Creëert een set van uitgelijnde kolommen van tekst en afbeeldingen in een card. tr Wordt gebruikt bij het table element, en duidt op een container waarin één enkele tabelrij zit. td Wordt gebruikt bij het table element, en duidt op een container waarin één enkele cel uit de tabelrij zit.

2.4.9 Een voorbeelddeck

Het volgende WML voorbeeld toont een deck dat twee cards bevat. Wanneer de gebruiker drukt op de ACCEPT druktoets, die hier het label "Next" meekreeg, navigeert de user agent naar de tweede card van het deck en toont de inhoud ervan.
1.	<?xml version=1.0"?>
2.	<!DOCTYPE wml PUBLIC "-//WAPFORUM/DTD WML1.1//EN"
3.			http://www.wapforum.org/DTD/wml_1.1.xml>
4.	<wml>
5.		<card id="First_Card">
6.			<do type="accept" label="Next">
7.				<go href="#Second_Card"/>
8.			</do>
9.			<p>
10.			Select <b> Next </b> to display next card.
11.			</p>
12.		</card>
13.		<card id="Second_Card">
14.			<p>
15.			This card contains the following…
16.			</p>
17.		</card>
18.	</wml>

In de user agent zorgt bovenstaande code dat onderstaande interface wordt gegenereerd:

Select Next to display the next card./This card contains the following:
Figuur 6: een deck met twee cards

Verklaring van de code:

  1. De eerste drie lijnen komen ons al bekend voor. Ze identificeren de XML subset. Deze identificatie moet aan het begin van elk WML deck opgenomen worden, en wel voor de <wml> tag.
  2. De vierde lijn is het bovenste element van een deck. Elk deck moet beginnen met de <wml> tag en eindigen met de </wml> tag.
  3. De vijfde lijn van het deck is het bovenste element van de eerste card. Net zoals bij decks is het zo dat cards tussen de begintag <card> en de eindtag </card> moeten staan. De meeste WML elementen laten de gebruiker toe om attributen te specificeren. Attributen worden ingevoerd onder volgende vorm: attribuut="waarde", waarbij attribuut de naam is van het attribuut en waarde een numerische of tekstwaarde die door de ontwerper wordt aangeduid.
  4. De zesde lijn definieert een actie, die zegt wat de user agent moet doen wanneer de gebruiker op een bepaalde functietoets duwt. Het attribuut type identificeert de toets (accept-actie) die moet worden ingedrukt en het attribuut label geeft een label voor de bedoelde toets.
  5. De zevende lijn dan specificeert de actie die verbonden is met deze toets. Het attribuut href identificeert de doelbestemming, in dit geval de card met als naam Second_Card.
  6. De resterende lijnen 9 tot en met 16 bepalen de elementen die op de cards staan (er zijn twee cards). De card-opbouw komt ook in de toepassing aan de orde. Lijn 18 sluit het deck af.

vorige
volgende
inhoudstafel