OmniMark is a streaming language and its parsers do not build a parse tree in memory. Instead, OmniMark provides powerful query facilities for retrieving information about the context of the markup currently parsed.
The current elements shelf represents the stack of currently open elements. This allows you to make
complex queries about all open elements. You can iterate over all open elements using repeat over current
elements, inquire about the current element depth with number of current elements or access
any particular element by its item number. The shelf is not keyed nor directly
modifiable by the user.
OmniMark also provides means to quickly access a particular element from the current elements
shelf and to navigate through it.
The element qualifiers listed above can be combined to form more sophisticated queries. For example, the
expression
parent of ancestor "row" is "thead"tests whether there is an element in
current elements other than the lastmost, named row, and whether the item
preceding it in current elements is named thead. Depending on the kind of markup you are
parsing, you can use this expression to establish if your element is a part of the innermost table heading.
Each item of current elements is a markup-element-event, which means that all of the
following information is available about it:
attributes
children
content is
declaration
last content is
last proper content is
last proper subelement is
last subelement is
name
occurrence
specified attributes
status is
status of last subelement is
usemap is
xmlns-name
So, for example, you can ask whether
xmlns-name of element = xmlns-name of doctypeto establish if you are in the same namespace as the root document element, or
occurrence of open element "item" = 1to find out if you are inside the first item of a list.
The most commonly accessed information is name of, attributes of and
specified attributes of an element. OmniMark provides the shortcut attribute notation for
accessing a single item of the attributes shelf by name for any element. Format items %q and
%v allow for an even shorter notation for accessing the element's name and attributes, but only for the
current element.
The attributes and specified attributes shelves represent the declared and specified
attributes of each element. Each item of these two shelves may have the following properties you can inquire
about:
is cdata and other queries about the declared attribute value type
is implied
is defaulted
is specified
repeat over attribute can be used to iterate over tokenized attributes such as numbers.
An attribute declared as entity or notation provides additional information
about the entity or notation it refers to:
name of the entity or notation
data-attributes
notation
entity can be accessed using the appropriate modifiers on %v
notation
Finally, OmniMark maintains certain information about the parse that is not associated with any particular element, attribute, or entity. This information is bound to the lifetime of the current parse.
#appinfo
#current-dtd
#doctype
#markup-error-count
#markup-parser
#markup-warning-count
#xmlns-names
number of current subdocuments
Whether #appinfo, #current-dtd, and #doctype actually provide
information depends on the state of the parsing. They have a value assigned only if the document being parsed,
or the DTD being used to parse it, provides the information. In particular, this means they are never attached
in:
document-start rules,
do sgml-parse or do xml-parse actions prior to a %c operator or
suppress action, unless a precompiled DTD is used,
do sgml-parse or do xml-parse actions after the %c operator or
suppress action, and
document-end rules if errors occurred before this information could be determined.