Dylan Server Pages (DSP)¶
Overview¶
Dylan Server Pages (DSP) is a template engine for providing dynamic web site
content. All dynamic content is invoked via DSP tag calls, which take the form
<taglib:tag-name/>
, where taglib
is a tag library you define and
tag-name
is the name of a tag in that tag library.
Currently, a DSP application is implemented as a Dylan project that uses the HTTP server library. This effectively means that each DSP application has to run on a different server and therefore on a different HTTP port. (The plan is to eventually fix it to load DSP application libraries at runtime, based on configuration files.)
DSP Content Authoring¶
Authoring Overview¶
DSP templates contain normal HTML plus DSP tag calls. DSP tag calls generate
the dynamic content of your web pages. They use standard XML syntax.
For example, <mylib:mytag arg="foo"/>
is tag call with no body that passes
one argument, arg, to mytag when it is invoked. “mylib” tells the DSP template
engine what tag library (taglib for short) “mytag” will be found in.
There are several special tags called DSP Directives defined that
couldn’t easily have been defined by the user. DSP directives use the same
syntax as other tags, but they use the special tag library name %dsp
. For
example, the include directive looks like this:
<%dsp:include location="foo.dsp"/>
Each top-level template file must have a corresponding instance of
<dylan-server-page>
associated with it. This is accomplished with the
define page
macro, which also publishes the URLs associated with the page.
DSP template files may have any filename extension, but the extension “.dsp”
may be treated specially in the future. For example, .dsp files may eventually
be automatically exported as <dylan-server-page>
.
DSP Directives¶
A DSP directive is used much like a normal DSP tag, but it couldn’t be written
as a normal tag without special support from the DSP engine. DSP directives
are distinguished by the %dsp
tag prefix.
There are two built in DSP directives:
- %dsp:include
Includes another DSP template (or plain HTML file) in the current page. Example usage:
<%dsp:include location="header.dsp"/>
Note that if the location given is absolute (i.e., begins with a slash) then the document is looked up relative to the document root directory. Otherwise it is looked up relative to the directory containing the current document.
- %dsp:taglib
Declares another tag library to be in effect for the remainder of the page. Taglib directives are cumulative. That is, using two or more
%dsp:taglib
directives on the same page means that tags in either taglib may be used on that page. Example usage:<%dsp:taglib name="my-taglib" prefix="xx"/> ... <xx:my-tag/> ...
The value of the name argument must be the same as the name in a
taglib-definer
form. The prefix may contain any characters except for<
and:
and may not be%dsp
.
The “dsp” Tag Library¶
The “dsp” taglib defines a few tags that are generally useful for any web application.
- dsp:if
Conditionally includes its body content if a predicate returns true. Example usage:
<dsp:if test="my-predicate?"> <dsp:then>...true part...</dsp:then> <dsp:else>...false part...</dsp:else> </dsp:if>
Note that there may be multiple
dsp:then
anddsp:else
tags inside the samedsp:if
tag body. If there is any plain HTML in the body of thedsp:if
, and outside of anydsp:then
ordsp:else
tags, it will always be displayed.- dsp:then
Executes its body only if the test predicate of the containing
dsp:if
tag returned true. When not contained in the body of adsp:if
tag its body will not be executed.- dsp:else
Executes its body only if the test predicate of the containing
dsp:if
tag returned false. When not contained in the body of adsp:if
tag its body will not be executed.- dsp:table
TBD. Haven’t quite settled on a design here yet.
- dsp:table-row-number
Displays the one-based number of the row currently being displayed.
DSP Programming¶
Tag Libraries¶
Tags can be organized into separate tag libraries if needed (e.g., for large
web apps). Each DSP page may use the %dsp:taglib
directive to specify
which tag libraries are active for that page. The built-in “dsp” tag library
is automatically available to all DSP pages, without having to use the
%dsp:taglib
directive to make it active. The “dsp” taglib includes some tags
that are useful for almost all web pages.
Taglibs are fairly uninteresting as far as programming a DSP application goes. They are only used when defining tags and named methods, to specify which taglib those objects belongs to. They are defined as follows:
define taglib demo ()
end;
The above defines a taglib named “demo”. See the Tags section for how the taglib is specified when defining a tag. This taglib would be included in a page with the following directive:
<%dsp:taglib name="demo" prefix="xyz"/>
and its tags would then be used like this:
<xyz:tag-one/>
Note that prefix
is optional, and defaults to the value of name
.
Tags¶
Tags are defined with the define tag
macro. The syntax is:
define [body] tag tag-name [in taglib-name]
(method-parameters)
(tag-parameters)
...code...
end;
The following example tag should clear things up a bit:
define tag current-time in demo
(page :: <dylan-server-page>)
(style)
write(output-stream(current-response()), current-time(style));
end;
The above defines a tag called current-time
in the demo
taglib which
outputs the current time in the DSP page. See the tag-definer
macro
for a full description tag definition. The above tag would be called like this:
<%dsp:taglib name="demo" prefix="xyz"/>
<xyz:current-time style="24hr"/>
Note that style
defines a parameter for the tag call such that the style
variable is bound to the value of that parameter in the body of the tag
definition.
The tag function must always accept one argument: page
, an instance of
<dylan-server-page>
.