deck ::= deck-header { action }* { card }+ deck-footer
deck-header ::= <HDML o-version ol(deck-options) >
deck-options ::= o-ttl | o-deckseq | o-public | o-accessdomain | o-accesspath | o-markable
deck-footer ::= </HDML>
o-version ::= version = value
o-ttl ::= ttl = {numeric}+
o-public ::= public = boolean-value
o-accessdomain ::= accessdomain = url
o-accesspath ::= accesspath = path
o-markable ::= markable = boolean-value
boolean-value ::= true | false
card ::= display-card | nodisplay-card | choice-card | entry-card
card-options ::= o-name | o-title | o-bookmark | o-markable
o-name ::= name = identifier
o-title ::= title = value-with-vars
o-bookmark ::= bookmark = destination
display-card ::= display-header display-content display-footer
display-header ::= <DISPLAY ol(display-options) >
display-options ::= card-options
display-content ::= { action }* formatted-text
display-footer ::= </DISPLAY>
nodisplay-card ::= nodisplay-header nodisplay-content nodisplay-footer
nodisplay-header ::= <NODISPLAY ol(nodisplay-options) >
nodisplay-options ::= card-options
nodisplay-content ::= { action }*
nodisplay-footer ::= </NODISPLAY>
choice-card ::= choice-header display-content { entries } choice-footer
choice-header ::= <CHOICE ol(choice-options) >
choice-options ::= card-options | o-method | o-key | o-ikey | o-default | o-idefault
o-method ::= method = method-type
method-type ::= list | alpha
entries ::= { choice-entry }+
choice-footer ::= </CHOICE>
o-key ::= key = identifier
o-ikey ::= ikey = identifier
o-default ::= default = value-with-vars
o-idefault ::= idefault = value-with-vars
choice-entry ::= choice-entry-header choice-entry-content choice-entry-footer
choice-entry-header ::= <CE ol(choice-entry-options) >
choice-entry-options ::= o-value | task-options
choice-entry-content ::= formatted-line
choice-entry-footer ::= { </CE> }
o-value ::= value = value
entry-header ::= <ENTRY ol(entry-options) >
entry-options ::= card-options | o-format | o-noecho | o-emptyok | o-key | o-default
entry-footer ::= </ENTRY>
o-format ::= format = value
o-noecho ::= noecho = boolean-value
o-emptyok ::= emptyok = boolean-value
formatted-line ::= { { line-format } {alignment-format} text-line }
formatted-text ::= formatted-line*
text-line ::= {text | variable | image | text-format | tab-format}*
text-format ::= <B> | <I>
::= </B> | </I>
alignment-format ::= <CENTER> | <RIGHT>
tab-format ::= <TAB>
line-format ::= <WRAP> | <LINE>
::= <BR>
image ::= <IMG ol(image-options) >
image-options ::= o-alt | o-name | o-src
o-alt ::= alt = value-with-vars
o-name ::= name = value-with-vars
o-src ::= src = destination
action ::= <ACTION ol(action-options) >
action-options ::= o-label | o-type | o-image | task-options
o-type ::= type = key
key ::= soft1 | soft2 | soft3 | soft4 | soft5 |
soft6 | soft7 | soft8 |
accept | prev | help
o-label ::= label = value-with-vars
o-image ::= image = url
(phase 1)
destination ::= value-with-vars
url ::= value-with-vars
path ::= value-with-vars
(phase 2)
destination ::= url { # fragment }
url ::= absolute-url | relative-url
absolute-url ::= generic-rl
::= scheme : { uchar | reserved }*
generic-url ::= scheme : relative-url
relative-url ::= net-path | abs-path | rel-path
net-path ::= // net-loc { abs-path }
abs-path ::= / rel-path
rel-path ::= { path } { ; params } { ? query }
path ::= fsegment { / segment }
fsegment ::= { pchar }+
segment ::= { pchar }*
params ::= param { ; param }*
param ::= { pchar | / }*
scheme ::= { alpha-numeric | + | - | . }+
net-loc ::= { pchar | ; | ? }*
query ::= { uchar | reserved }*
fragment ::= { uchar | reserved }*
pchar ::= uchar | : | @ | & | =
uchar ::= unreserved | escape
unreserved ::= alpha-numeric | safe | extra
escape ::= % hex hex
safe ::= $ | - | _ | . | +
extra ::= ! | * | ' | ( | ) | ,
national ::= { | } | | | \ | ^ | ~ | [ | ] | `
reserved ::= ; | / | ? | : | @ | & | =
punctuation ::= < | > | # | % | "
task-options ::= o-task | o-dest | o-vars | o-receive | o-retvals | o-next |
o-cancel | o-sendreferer | o-friend | o-clear | o-confirm |
o-data | o-number | o-go | o-call
o-task ::= task = task-type
task-type ::= go | gosub | prev | return | cancel |
post | call | noop
o-dest ::= dest = destination
o-vars ::= vars = value-with-vars
o-receive ::= receive = receive-list
receive-list ::= { ; }* identifier { ; { identifier } }*
o-retvals ::= retvals = retval-list
retval-list ::= value-with-vars { ; value-with-vars }
o-next ::= next = destination
o-cancel ::= cancel = destination
o-sendreferer ::= sendreferer = boolean-value
o-friend ::= friend = boolean-value
o-clear ::= clear = boolean-value
o-data ::= data = data-list
data-list ::= identifier { ; identifier }
o-number ::= number = value-with-vars
o-go ::= go = destination
o-call ::= call = value-with-vars
variable ::= $ identifier
::= $( identifier { : conversion } )
conversion ::= n { oesc }
::= e { scape }
variable-text ::= variable | text
alpha ::= any alphabetic character a through z or A through Z
numeric ::= any digit 0 through 9
alpha-numeric ::= alpha | numeric
hex ::= numeric | any letter A through F, either case
blank-space ::= { space | tab | new-line }+
space ::= the space character
tab ::= the tab character
new-line ::= the carriage return character
::= the line feed character
::= the sequence carriage return, line feed
word ::= { alpha-numeric }+
identifier ::= alpha { alpha-numeric }*
integer ::= { + | - } { numeric }+
text ::= any ISO-Latin-1 character except <, >, ", &, or $
::= > | < | " | & | | &dol;
::= &# hex hex ;
plain-text ::= text except blank-space