.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "WML_INTRO 7" .TH WML_INTRO 7 "2021-05-25" "EN Tools" "EN Tools" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" WML Introduction \- An introduction to WML's basic concepts .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\s-1WML\s0 is a free \s-1HTML\s0 generation toolkit for Unix, internally consisting of 9 independent languages. The main idea of \s-1WML\s0 is a sequential filtering scheme where each language provides one of 9 processing passes. So the frontend \&\fIwml\fR reads \fIinputfile\fR (or from \f(CW\*(C`stdin\*(C'\fR if \fIinputfile\fR is a dash or completely missing), applies passes 1\-9 (or only the \fIpasses\fR specified by \&\fB\-p\fR) and finally produces one or more \fIoutputfile\fRs. .PP \&\s-1WML\s0 implements a total of three essential concepts which interact with each other: .SS "\s-1CONCEPT 1: SEQUENTIAL FILTERING SCHEME\s0" .IX Subsection "CONCEPT 1: SEQUENTIAL FILTERING SCHEME" This concept implements the various language features by making use of maximum software leverage, i.e. \s-1WML\s0 is built on top of 9 languages which are run in a well-ordered fashion by the \fIwml\fR frontend. .IP "\fBPass 1: Source Reading and Include File Expansion\fR" 4 .IX Item "Pass 1: Source Reading and Include File Expansion" .Vb 4 \& Processing: explicit \& Implementation: Include Pre\-Processor (IPP) \& Author: Ralf S. Engelschall \& See Also: wml_p1_ipp(3) .Ve .Sp \&\fBDescription:\fR .Sp This first pass reads \fIinputfile\fR and expands all inlined include file directives by (perhaps recursively) substituting them with the contents of the corresponding file. The file itself will be read from the current working directory or from a list of dedicated include directories (compiled in ones and also given via option \fB\-I\fR). When \f(CW\*(C`name=value\*(C'\fR pairs are appended to the include directive \f(CW\*(C`$(name)\*(C'\fR is expanded to \f(CW\*(C`value\*(C'\fR in this particular include file and all its recursively included files. Additionally this Pass provides an End-Of-Line continuation feature and three special strings. ``\f(CW\*(C`_\|_FILE_\|_\*(C'\fR'' and ``\f(CW\*(C`_\|_LINE_\|_\*(C'\fR'' expand to the current include file and line number while ``\f(CW\*(C`_\|_END_\|_\*(C'\fR'' terminates the reading of the current include file. .Sp \&\fBSummary Of Essential Features:\fR .Sp .Vb 4 \& #include \*(Aqfile.wml\*(Aq [name[=value] ...] \& #include "file.wml" [name[=value] ...] \& #include [name[=value] ...] \& #use wml::category::file [name[=value] ...] \& \& some text which is \e \& continued at this line \& \& $(name) \& \& _\|_FILE_\|_, _\|_LINE_\|_ \& _\|_END_\|_ .Ve .Sp \&\fBExample:\fR .Sp .Vb 2 \& #use wml::std::tags \& This FooBar, contained in file _\|_FILE_\|_, line _\|_LINE_\|_. \& \& _\|_END_\|_ \& Documentation of FooBar... .Ve .IP "\fBPass 2: High-Level Macro Construct Expansion\fR" 4 .IX Item "Pass 2: High-Level Macro Construct Expansion" .Vb 5 \& Processing: explicit \& Implementation: Macro Processor for HTML Documents (mp4h) \& Author: Denis Barbier \& See Also: mp4h(1) \& http://www.engelschall.com/sw/mp4h/ .Ve .Sp \&\fBDescription:\fR .Sp This is the HTML-like macro definition and expansion pass. Here new \s-1HTML\s0 tags are defined via \f(CW\*(C`\*(C'\fR and later expanded at the location of their usage (\f(CW\*(C`\*(C'\fR. The goal of this pass is to create new \s-1HTML\s0 tags which encapsulate either raw text or even programmed functionality of Pass 3 (ePerl). .Sp \&\fBSummary Of Essential Features:\fR .Sp .Vb 3 \& \& ...%attributes... \& \& \& \& ...%attributes...%body... \& \& \& \& ... .Ve .Sp \&\fBExample:\fR .Sp .Vb 2 \& RSE \& This is . .Ve .IP "\fBPass 3: Programming Construct Expansion\fR" 4 .IX Item "Pass 3: Programming Construct Expansion" .Vb 5 \& Processing: explicit \& Implementation: Embedded Perl 5 Language (ePerl) \& Author: Ralf S. Engelschall \& See Also: eperl(1) \& http://www.engelschall.com/sw/eperl/ .Ve .Sp \&\fBDescription:\fR .Sp In this pass the real programming takes place. The used language is Larry Wall's Perl 5 scripting language. The language constructs are bristled into the \s-1HTML\s0 markup code by the use of begin (\f(CW\*(C`<:\*(C'\fR) and end (\f(CW\*(C`:>\*(C'\fR) delimiters. Additionally this pass provides some nice shortcut: First a <#if..#elsif..#else..#endif> construct which gets expanded to the corresponding Perl construct, second a shorthand (\f(CW\*(C`<:= ...:>\*(C'\fR) for the construct (\f(CW\*(C`<: print ...:>\*(C'\fR which is used most of the time. And there is a container tag in \fIwml::std::tags\fR which provides the more high-level container tag \f(CW\*(C`\*(C'\fR. .Sp \&\fBSummary Of Essential Features:\fR .Sp .Vb 3 \& ...Perl 5 constructs... \& <: ...Perl 5 constructs... :> \& <:= ... :> .Ve .Sp \&\fBExample:\fR .Sp .Vb 1 \& #use wml::std::tags \& \& \& sub isotime { \& my ($time) = @_; \& \& my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = \& localtime($time); \& my ($str) = sprintf("%04d\-%02d\-%02d %02d:%02d:%02d", \& $year+1900, $mon+1, $mday, $hour, $min, $sec); \& return $str; \& } \& \& \& The current date is <:= &isotime(time()) :>. .Ve .IP "\fBPass 4: Low-Level Macro Construct Expansion\fR" 4 .IX Item "Pass 4: Low-Level Macro Construct Expansion" .Vb 5 \& Processing: explicit \& Implementation: GNU m4 \& Author: Ren\*(Aqe Seindal (FSF) \& See Also: m4(1) \& http://www.gnu.mit.edu/ .Ve .Sp \&\fBDescription:\fR .Sp In this pass another macro processor run takes place. While in pass 2 a macro processor with a HTML-like syntax was used for high-level macro programming, this pass uses a macro processor for low-level programming. Mainly this pass is intended to provide low-level symbol and function definitions (\f(CW\*(C`m4_define()\*(C'\fR. There is a definition in \fIwml::std::tags\fR which provides a more high-level usage via the \f(CW\*(C`\*(C'\fR tag. .Sp \&\fINotice:\fR This pass is run under a special environment: First, all m4 builtin macros have to be prefixed with "\f(CW\*(C`m4_\*(C'\fR". Second, all variables which are defined by \s-1WML\s0 (both internal ones and the ones from the \fB\-D\fR option) are directly accessible via symbols prefixed with \f(CW\*(C`m4_\*(C'\fR, i.e. variable \f(CW\*(C`NAME\*(C'\fR is interpolated when \f(CW\*(C`m4_NAME\*(C'\fR occurs. Third, the quoting characters are disabled per default to prevent problems with the generated content. If you need quotes (for instance in include files) you have to enable them via \&\f(CW\*(C`m4\*(C'\fR\f(CW\*(C`_quotes\*(C'\fR and disable them later via \f(CW\*(C`m4\*(C'\fR\f(CW\*(C`_noquotes\*(C'\fR. .Sp \&\fBSummary Of Essential Features:\fR .Sp .Vb 3 \& m4_quotes \& m4_define(\`name\*(Aq, \`value\*(Aq) \& m4_noquotes \& \& .Ve .Sp \&\fBExample:\fR .Sp .Vb 2 \& #use wml::std::tags \& \& \& foo bar quux .Ve .IP "\fBPass 5: Diversion Filter\fR" 4 .IX Item "Pass 5: Diversion Filter" .Vb 4 \& Processing: explicit \& Implementation: Divert \& Author: Ralf S. Engelschall \& See Also: wml_p5_divert(3) .Ve .Sp \&\fBDescription:\fR .Sp In this pass a flexible and powerful diversion filter is applied. This is intended to provide a mechanism to change and intermix the order of data blocks. Do not intermix this with neither the general macro mechanisms of pass 2 and 4 nor the less powerful \f(CW\*(C`divert\*(C'\fR mechanism of \s-1GNU\s0 m4. The idea is to define \fIlocations\fR (via \f(CW\*(C`{#NAME#}\*(C'\fR) at any point and fill such locations later by diverting the data flow to it (via \f(CW\*(C`{#NAME#:\*(C'\fR and \f(CW\*(C`:#NAME#}\*(C'\fR) at another point. What makes this filter such powerful is the fact that both the definition points and the diversion points can be done in any order and they can even be nested. Again \s-1WML\s0 provides high-level support tags in \fIwml::std::tags\fR for this functionality. .Sp \&\fBSummary Of Essential Features:\fR .Sp .Vb 2 \& {#NAME#} \& \& \& {#NAME#: \& data for location \`NAME\*(Aq \& :##} \& \& \& data for location \`NAME\*(Aq \& \& \& \& data for location \`NAME\*(Aq \& .Ve .Sp \&\fBExample:\fR .Sp .Vb 7 \& \& \& \& \& \& \&
\& \& \& Stuff for the left border \& \& \& \& Stuff for the right border \& \& \& \& The main data \& .Ve .IP "\fBPass 6: Character and String Substitution\fR" 4 .IX Item "Pass 6: Character and String Substitution" .Vb 4 \& Processing: explicit \& Implementation: Area Subst (ASubst) \& Author: Ralf S. Engelschall \& See Also: wml_p6_asubst(3) .Ve .Sp \&\fBDescription:\fR .Sp In this pass single characters or substrings are substituted within dedicated areas (delimited by \f(CW\*(C`{: ... :}\*(C'\fR). The intend is to support ISO\-Latin\-1 or other special characters which will be entered as 8 Bit character codes and are substituted by their \s-1HTML\s0 entity-encoding string. Do not intermix this with macro-expansion of Pass 2 or 4. This is generalized regular expression based substitution pass where you can use Perl's \f(CW\*(C`s/../../\*(C'\fR and \f(CW\*(C`tr/../../\*(C'\fR commands to specify the substitutions. These can be placed anywhere inside the substitution area and just have to be marked by \f(CW\*(C`[[...]]\*(C'\fR delimiters. But the commands are always applied to the whole area. .Sp \&\fBSummary Of Essential Features:\fR .Sp .Vb 2 \& {: ...text..[[s/../../flags]].. \& ...text..[[tr/../../flags]].. :} .Ve .Sp \&\fBExample:\fR .Sp .Vb 3 \& {: [[s|X|ä|]] [[s|X|ü|]] \& Foo Bar Baz Quux with Umlauts X and X \& :} .Ve .IP "\fBPass 7: Markup Code Fixup\fR" 4 .IX Item "Pass 7: Markup Code Fixup" .Vb 4 \& Processing: implicit \& Implementation: HTMLfix \& Author: Ralf S. Engelschall \& See Also: wml_p7_htmlfix(3) .Ve .Sp \&\fBDescription:\fR .Sp In this pass some commonly known \s-1HTML\s0 markup code fixups are done. For instance missing \f(CW\*(C`WIDTH\*(C'\fR and \f(CW\*(C`HEIGHT\*(C'\fR attributes for all \f(CW\*(C`IMG\*(C'\fR tags are calculated and added, \f(CW\*(C`ALT\*(C'\fR tags are added where missing, missing `\f(CW\*(C`#\*(C'\fR' characters in front of hextriple color attributes are added, numeric attribute values are surrounded by quotes, obsolete \s-1HTML\s0 markup code like the proprietary \f(CW\*(C`
\*(C'\fR tag is replaced by new standard \s-1HTML 3.2\s0 tags (\f(CW\*(C`
\*(C'\fR), etc. pp. .IP "\fBPass 8: Markup Code Stripping\fR" 4 .IX Item "Pass 8: Markup Code Stripping" .Vb 4 \& Processing: implicit \& Implementation: HTMLstrip \& Author: Ralf S. Engelschall \& See Also: wml_p8_htmlfix(3) .Ve .Sp \&\fBDescription:\fR .Sp Because macro definitions add newlines to the output (or you have to always use "\f(CW\*(C`...\*(C'\fR<\f(CW\*(C`/define\-tag\*(C'\fR>\f(CW\*(C`;;;\*(C'\fR", etc), additional comments shell-style would be useful and whitespaces can often be stripped from \s-1HTML\s0 markup code without changing the result, this special \s-1HTML\s0 markup code reducement pass is done. The amount of stripping can be controlled by the \s-1WML\s0 option \fB\-O\fR. Default is \fB\-O2\fR which does a really good job without destroying anything. There is one special feature one should know: This pass recognizes pre-formatted areas ( \f(CW\*(C`
..
\*(C'\fR) and skips them. Additionally when you want some area of your input file Threaten like pre-formatted, then this Pass also supports its own container tag named \&\f(CW\*(C`...\*(C'\fR. This has the same effect like \&\f(CW\*(C`
\*(C'\fR but is itself stripped, too.
.IP "\fBPass 9: Markup Code Splitting and Output Generation\fR" 4
.IX Item "Pass 9: Markup Code Splitting and Output Generation"
.Vb 5
\& Processing:     implicit/explicit
\& Implementation: Slice
\& Author:         Ralf S. Engelschall 
\& See Also:       slice(1)
\&                 http://www.engelschall.com/sw/slice/
.Ve
.Sp
\&\fBDescription:\fR
.Sp
The last and final pass is a really tricky one again, because one feature is
still not implemented. We need some way to conditionally create output to
different output files. To accomplish this another source file construct
(\f(CW\*(C`[NAME:...:NAME]\*(C'\fR) is recognized which defines so-called \fIslices\fR.  Those
slices are (possibly overlapped or nested) named areas of the input file which
can be used via \s-1WML\s0's \fB\-o\fR option. This option can contain a \fIslice-term\fR in
front of the filename which selects the slices to be written to the output
file. Such slice-terms are actually set theory terms where slices with the
same name define a set.
.Sp
\&\fBSummary Of Essential Features:\fR
.Sp
.Vb 2
\&  [NAME: ... :NAME]
\&  [NAME: ... :]
.Ve
.Sp
\&\fBExample:\fR
.Sp
.Vb 1
\&  [EN:Welcome to:][DE:Willkommen zu:] Foo Bar Baz Quux!
.Ve
.SS "\s-1CONCEPT 2: WMLRC FILE HIERARCHY AND WMLOPTS VARIABLE\s0"
.IX Subsection "CONCEPT 2: WMLRC FILE HIERARCHY AND WMLOPTS VARIABLE"
The second essential idea of \s-1WML\s0 is the use of \fI.wmlrc\fR files and a
\&\f(CW\*(C`WMLOPTS\*(C'\fR environment variable for additionally command line options.  On
startup the frontend \fIwml\fR first processes all options found in \f(CW\*(C`WMLOPTS\*(C'\fR,
then it reads all options from \fI\f(CI$HOME\fI/.wmlrc\fR followed by the options of all
\&\fI.wmlrc\fR files found in all parent directories (i.e. \fI../.wmlrc\fR,
\&\fI../../.wmlrc\fR, etc) of the directory containing input file.  And finally it
processes all options given on the command line.   For instance this feature
provides you with the ability to setup defaults via \fB\-D\fR options in the
\&\fI.wmlrc\fR file at the top of your Webarea.
.PP
And there is one more special case: The option form
.PP
.Vb 1
\&   \-DNAME~VALUE
.Ve
.PP
is always sticky to its location, i.e. it always gets evaluated for its local
directory context instead of the current working directory where \fIwml\fR was
started. Use this to easily introduce path or \s-1URL\s0 variables which adjust
automatically to the current context of the generated webpage.
.SS "\s-1CONCEPT 3:\s0 AUTO-ADJUSTED \s-1URL AND FILENAME VARIABLES\s0"
.IX Subsection "CONCEPT 3: AUTO-ADJUSTED URL AND FILENAME VARIABLES"
The third essential idea of \s-1WML\s0 is the above shortly described variable
adjustment concept which can be used via variable interpolation.  The frontend
\&\fIwml\fR provides a \fB\-D\fR option for defining variables which get interpolated
in each pass:
.PP
.Vb 2
\&  \-DNAME=VALUE
\&  \-DNAME~VALUE
.Ve
.PP
For both forms the value can be interpolated via <\f(CW\*(C`get\-var NAME\*(C'\fR>
inside Pass 2 and via \f(CW\*(C`<:=$NAME:>\*(C'\fR in Pass 3. The difference between
the two forms is the tricky part of adjustment here:
.ie n .IP """\-D NAME=VALUE""" 4
.el .IP "\f(CW\-D NAME=VALUE\fR" 4
.IX Item "-D NAME=VALUE"
Here the variable \s-1NAME\s0 gets statically set to \s-1VALUE.\s0 Each time you interpolate
the variable the result is exactly \s-1VALUE.\s0
.ie n .IP """\-D NAME~VALUE""" 4
.el .IP "\f(CW\-D NAME~VALUE\fR" 4
.IX Item "-D NAME~VALUE"
Here the variable \s-1NAME\s0 gets initialized with \s-1VALUE\s0 and \s-1VALUE\s0 will be treated
as either a (not fully qualified) \s-1URL\s0 or filename.  When you interpolate the
variable the result is \s-1VALUE\s0 if the current working directory is the same as
where you used the \fB\-D\fR option (either where you run the frontend \fIwml\fR or a
\&\fI.wmlrc\fR file). Else the result is \s-1VALUE\s0 relative path-adjusted for the
current working directory.
.PP
On the first look this seems useless, but combined with \s-1CONCEPT 2\s0 this
provides a very essential feature. Here it provides a powerful mechanism to
automatically let URLs or pathnames re-calculated for the local context.  For
instance when you define \f(CW\*(C`\-DROOT~.\*(C'\fR in your top-level \fI.wmlrc\fR file then the
variable \f(CW\*(C`ROOT\*(C'\fR will be interpolated to `\f(CW\*(C`.\*(C'\fR' at the top-level, to `\f(CW\*(C`..\*(C'\fR'
at the first subdir level, to `\f(CW\*(C`../..\*(C'\fR' at the second subdir level, etc.  Use
this for creating navigation bars or \s-1URL\s0 references across subtrees.
.SH "MORE INFORMATION"
.IX Header "MORE INFORMATION"
Now you've seen the various core languages of \s-1WML.\s0 For a step-by-step
introduction to this functionality and to see real examples, I recommend you
to read the \s-1WML\s0 tutorial in \fBwml_tutorial\fR\|(7) now.
.PP
Additionally can can step through the set of available standard include files
\&\s-1WML\s0 ships with. Start with the top-level include file \fBwml::all\fR\|(3).
.SH "SEE ALSO"
.IX Header "SEE ALSO"
\&\fBwml_tutorial\fR\|(7),
\&\fBwml_tags\fR\|(7).
.PP
\&\fBwml_p1_ipp\fR\|(3),
\&\fBmp4h\fR\|(1),
\&\fBeperl\fR\|(1),
\&\fBm4\fR\|(1),
\&\fBwml_p5_divert\fR\|(3),
\&\fBwml_p6_asubst\fR\|(3),
\&\fBwml_p7_htmlfix\fR\|(3),
\&\fBwml_p8_htmlstrip\fR\|(3),
\&\fBslice\fR\|(1).
.PP
\&\fBwml::all\fR\|(3)