| WashNGo-2.12: WASH is a family of embedded domain specific languages (EDSL) for programming Web applications in Haskell. | Contents | Index |
|
|
|
|
|
|
Synopsis |
|
data CGI a | | class Monad cgi => CGIMonad cgi | | ask :: CGIMonad cgi => WithHTML DOCUMENT cgi a -> cgi () | | tell :: (CGIMonad cgi, CGIOutput a) => a -> cgi () | | io :: (Read a, Show a) => IO a -> CGI a | | run :: CGI () -> IO () | | once :: (CGIMonad cgi, Read a, Show a) => cgi a -> cgi a | | forever :: CGIMonad cgi => cgi () -> cgi () | | callWithCurrentHistory :: (CGIMonad cgi, Read a, Show a) => ((a -> cgi ()) -> a -> cgi ()) -> a -> cgi () | | htell :: CGIMonad cgi => WithHTML HTML IO () -> cgi a | | askOffline :: CGIMonad cgi => WithHTML HTML cgi a -> (Element -> IO ()) -> cgi () | | data Image | | internalImage :: CGIMonad cgi => FreeForm -> String -> WithHTML x cgi Image | | externalImage :: CGIMonad cgi => URL -> String -> WithHTML x cgi Image | | makeImg :: (Monad cgi, AdmitChildIMG y) => Image -> HTMLField cgi IMG y () | | makeRef :: (CGIMonad cgi, AdmitChildA y, Monad m) => String -> WithHTML A m () -> cgi (WithHTML y m ()) | | makePopupRef :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y () | | makeA :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y () | | backLink :: (AdmitChildA x, Monad m) => HTMLCons A x m () | | hlink :: (AdmitChildA y, Monad m) => URL -> HTMLCons A y m () | | popuplink :: (AdmitChildA y, Monad m) => String -> URL -> HTMLCons A y m () | | restart :: CGI () | | standardPage :: (AdmitChildHTML y, Monad m) => String -> WithHTML BODY m a -> WithHTML y m () | | htmlHeader :: (AdmitChildHTML y, Monad m) => String -> WithHTML HTML m a -> WithHTML y m () | | html :: (Monad m, AdmitChildHTML y) => WithHTML HTML m a -> WithHTML y m () | | cssPage :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML BODY m a -> WithHTML y m () | | cssHeader :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML HTML m a -> WithHTML y m () | | type HTMLField cgi x y a = WithHTML x cgi () -> WithHTML y cgi a | | makeForm :: AdmitChildFORM y => WithHTML FORM CGI a -> WithHTML y CGI () | | standardQuery :: String -> WithHTML FORM CGI a -> CGI () | | submit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y () | | submit0 :: (CGIMonad cgi, AdmitChildINPUT y) => cgi () -> HTMLField cgi INPUT y () | | defaultSubmit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y () | | resetField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField () INVALID) | | activeInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => (a -> cgi ()) -> HTMLField cgi INPUT y () | | activate :: (CGIMonad cgi, InputHandle (i a), HasValue i, AdmitChildINPUT y) => (a -> cgi ()) -> HTMLField cgi INPUT y (i a INVALID) -> HTMLField cgi INPUT y (i a INVALID) | | submitLink :: (CGIMonad cgi, AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLCons A y cgi () | | submitLink0 :: AdmitChildA y => CGI () -> HTMLCons A y CGI () | | defaultSubmitLink :: (AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLCons A y CGI () | | submitx :: AdmitChildINPUT y => DTree cgi INPUT y -> HTMLField cgi INPUT y () | | data DTree cgi x y | | dtleaf :: CGIMonad cgi => cgi () -> DTree cgi x y | | dtnode :: (CGIMonad cgi, InputHandle h) => h INVALID -> (h VALID -> DTree cgi x y) -> DTree cgi x y | | inputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID) | | textInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField String INVALID) | | checkedTextInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe String -> Maybe String) -> HTMLField cgi INPUT y (InputField String INVALID) | | passwordInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID) | | makeTextarea :: (CGIMonad cgi, AdmitChildTEXTAREA y) => String -> HTMLField cgi TEXTAREA y (InputField String INVALID) | | checkboxInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID) | | makeButton :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID) | | data RadioGroup a x | | radioGroup :: (CGIMonad cgi, Read a) => WithHTML x cgi (RadioGroup a INVALID) | | radioButton :: (CGIMonad cgi, AdmitChildINPUT y, Show a) => RadioGroup a INVALID -> a -> HTMLField cgi INPUT y () | | radioError :: (CGIMonad cgi, AdmitChildIMG x) => RadioGroup a INVALID -> WithHTML x cgi () | | imageField :: (CGIMonad cgi, AdmitChildINPUT y) => Image -> HTMLField cgi INPUT y (InputField (Int, Int) INVALID) | | selectMultiple :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField cgi SELECT y (InputField [a] INVALID) | | selectSingle :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField cgi SELECT y (InputField a INVALID) | | selectBounded :: (CGIMonad cgi, AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField cgi SELECT y (InputField a INVALID) | | fileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField FileReference INVALID) | | checkedFileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe FileReference -> Maybe FileReference) -> HTMLField cgi INPUT y (InputField FileReference INVALID) | | data InputField a x | | data VALID | | data INVALID | | value :: HasValue i => i a VALID -> a | | class InputHandle h | | class HasValue i where | | | data F0 x = F0 | | data F1 a x = F1 (a x) | | data F2 a b x = F2 (a x) (b x) | | data F3 a b c x = F3 (a x) (b x) (c x) | | data F4 a b c d x = F4 (a x) (b x) (c x) (d x) | | data F5 a b c d e x = F5 (a x) (b x) (c x) (d x) (e x) | | data F6 a b c d e f x = F6 (a x) (b x) (c x) (d x) (e x) (f x) | | data F8 a b c d e f g h x = F8 (a x) (b x) (c x) (d x) (e x) (f x) (g x) (h x) | | data FL a x = FL [a x] | | data FA a b x = FA a (b x) | | fieldSIZE :: (Monad m, AdmitAttrSIZE e, AttrValueSIZE v) => v -> WithHTML e m () | | fieldMAXLENGTH :: (Monad m, AdmitAttrMAXLENGTH e, AttrValueMAXLENGTH v) => v -> WithHTML e m () | | fieldVALUE :: (Monad m, AdmitAttrVALUE e, AttrValueVALUE v) => v -> WithHTML e m () | | runWithHook :: CGIOptions -> ([String] -> CGI ()) -> CGI () -> IO () | | docTranslator :: [FreeForm] -> ([String] -> CGI ()) -> [String] -> CGI () | | lastTranslator :: [String] -> CGI () | | class CGIOutput a | | data Status = Status {} | | newtype Location = Location URL | | data FreeForm = FreeForm {} | | data FileReference = FileReference {} | | newtype Text = Text {} | | newtype NonEmpty = NonEmpty {} | | newtype AllDigits = AllDigits {} | | newtype Phone = Phone {} | | newtype EmailAddress = EmailAddress {} | | newtype CreditCardNumber = CreditCardNumber {} | | data CreditCardExp = CreditCardExp {} | | newtype Password = Password {} | | | | | | type CGIOptions = [CGIOption] | | newtype URL = URL {} | | makeServlet :: CGI () -> CGIProgram | | makeServletWithHook :: ([String] -> CGI ()) -> CGI () -> CGIProgram | | module WASH.HTML.HTMLMonad98 | | module WASH.CGI.Style | | data FrameSet | | | | | | makeFrame :: WithHTML FRAME IO () -> CGI () -> CGI FrameSet | | makeFrameset :: CGIMonad cgi => FrameLayout -> [(FrameSpacing, cgi FrameSet)] -> cgi FrameSet | | framesetPage :: CGIMonad cgi => String -> cgi FrameSet -> cgi () |
|
|
|
Basics
|
|
data CGI a |
Instances | |
|
|
class Monad cgi => CGIMonad cgi |
| Instances | |
|
|
ask :: CGIMonad cgi => WithHTML DOCUMENT cgi a -> cgi () |
|
tell :: (CGIMonad cgi, CGIOutput a) => a -> cgi () |
Terminates script by sending its argument to the browser.
|
|
io :: (Read a, Show a) => IO a -> CGI a |
Safe embedding of an IO action into the CGI monad. Intentionally not
parameterized óver its monad to avoid its use inside of transactions.
|
|
run :: CGI () -> IO () |
Turns a CGI action into an IO action. Used to turn the main CGI action
into the main function of the program. Typical use:
main = run mainCGI
|
|
once :: (CGIMonad cgi, Read a, Show a) => cgi a -> cgi a |
Brackets a CGI action so that only its result is visible. Improves
efficiency by not executing the bracketed action after it has been performed
once. Use this for avoiding the inefficient buildup of long interaction logs.
|
|
forever :: CGIMonad cgi => cgi () -> cgi () |
Repeats a CGI action without saving its state so that the size of the
interaction log remains constant.
|
|
callWithCurrentHistory :: (CGIMonad cgi, Read a, Show a) => ((a -> cgi ()) -> a -> cgi ()) -> a -> cgi () |
Control operator for the CGI monad. Its specification is
callWithCurrentHistory (\backto x -> action x >>= backto) x
==
action x >>= callWithCurrentHistory (\backto x -> action x >>= backto)
However, callWithCurrentHistory is more efficient because it avoids the
buildup of long interaction logs by cutting back every time just before
action gets executed.
|
|
htell :: CGIMonad cgi => WithHTML HTML IO () -> cgi a |
|
askOffline :: CGIMonad cgi => WithHTML HTML cgi a -> (Element -> IO ()) -> cgi () |
|
Links and Images
|
|
data Image |
|
|
internalImage |
|
|
externalImage |
|
|
makeImg :: (Monad cgi, AdmitChildIMG y) => Image -> HTMLField cgi IMG y () |
|
makeRef :: (CGIMonad cgi, AdmitChildA y, Monad m) => String -> WithHTML A m () -> cgi (WithHTML y m ()) |
|
makePopupRef :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y () |
|
makeA :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y () |
|
backLink :: (AdmitChildA x, Monad m) => HTMLCons A x m () |
|
hlink :: (AdmitChildA y, Monad m) => URL -> HTMLCons A y m () |
|
popuplink :: (AdmitChildA y, Monad m) => String -> URL -> HTMLCons A y m () |
|
restart :: CGI () |
|
Page Templates
|
|
standardPage :: (AdmitChildHTML y, Monad m) => String -> WithHTML BODY m a -> WithHTML y m () |
|
htmlHeader :: (AdmitChildHTML y, Monad m) => String -> WithHTML HTML m a -> WithHTML y m () |
|
html :: (Monad m, AdmitChildHTML y) => WithHTML HTML m a -> WithHTML y m () |
|
cssPage :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML BODY m a -> WithHTML y m () |
|
cssHeader :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML HTML m a -> WithHTML y m () |
|
Forms and Widgets
|
|
type HTMLField cgi x y a = WithHTML x cgi () -> WithHTML y cgi a |
Every input widget maps the content generator for the widget (which may
produce HTML elements or attributes) to the content generator of the widget.
|
|
Form Creation
|
|
makeForm :: AdmitChildFORM y => WithHTML FORM CGI a -> WithHTML y CGI () |
|
standardQuery :: String -> WithHTML FORM CGI a -> CGI () |
|
Form Submission
|
|
submit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y () |
|
submit0 :: (CGIMonad cgi, AdmitChildINPUT y) => cgi () -> HTMLField cgi INPUT y () |
|
defaultSubmit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y () |
|
resetField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField () INVALID) |
|
activeInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => (a -> cgi ()) -> HTMLField cgi INPUT y () |
|
activate :: (CGIMonad cgi, InputHandle (i a), HasValue i, AdmitChildINPUT y) => (a -> cgi ()) -> HTMLField cgi INPUT y (i a INVALID) -> HTMLField cgi INPUT y (i a INVALID) |
|
submitLink :: (CGIMonad cgi, AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLCons A y cgi () |
|
submitLink0 :: AdmitChildA y => CGI () -> HTMLCons A y CGI () |
|
defaultSubmitLink :: (AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLCons A y CGI () |
|
submitx :: AdmitChildINPUT y => DTree cgi INPUT y -> HTMLField cgi INPUT y () |
|
data DTree cgi x y |
Abstract type of decisions trees. These trees provide structured validation.
|
|
|
dtleaf :: CGIMonad cgi => cgi () -> DTree cgi x y |
Create a leaf in a decision tree from a CGI action.
|
|
dtnode :: (CGIMonad cgi, InputHandle h) => h INVALID -> (h VALID -> DTree cgi x y) -> DTree cgi x y |
Create a node in a decision tree. Takes an invalid input field and a
continuation. Validates the input field and passes it to the continuation if
the validation was successful. The continuation can dispatch on the value of
the input field and produces a new decision tree.
|
|
Textual Input
|
|
inputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID) |
|
textInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField String INVALID) |
|
checkedTextInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe String -> Maybe String) -> HTMLField cgi INPUT y (InputField String INVALID) |
|
passwordInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID) |
|
makeTextarea :: (CGIMonad cgi, AdmitChildTEXTAREA y) => String -> HTMLField cgi TEXTAREA y (InputField String INVALID) |
|
Checkbox
|
|
checkboxInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID) |
|
Button
|
|
makeButton :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID) |
|
data RadioGroup a x |
Instances | |
|
|
radioGroup :: (CGIMonad cgi, Read a) => WithHTML x cgi (RadioGroup a INVALID) |
Create a handle for a new radio group. This handle is invisible on the screen!
|
|
radioButton :: (CGIMonad cgi, AdmitChildINPUT y, Show a) => RadioGroup a INVALID -> a -> HTMLField cgi INPUT y () |
|
radioError :: (CGIMonad cgi, AdmitChildIMG x) => RadioGroup a INVALID -> WithHTML x cgi () |
|
Image
|
|
imageField :: (CGIMonad cgi, AdmitChildINPUT y) => Image -> HTMLField cgi INPUT y (InputField (Int, Int) INVALID) |
|
Selection Box
|
|
selectMultiple :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField cgi SELECT y (InputField [a] INVALID) |
|
selectSingle :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField cgi SELECT y (InputField a INVALID) |
|
selectBounded :: (CGIMonad cgi, AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField cgi SELECT y (InputField a INVALID) |
|
File
|
|
fileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField FileReference INVALID) |
|
checkedFileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe FileReference -> Maybe FileReference) -> HTMLField cgi INPUT y (InputField FileReference INVALID) |
|
Handle Manipulation
|
|
data InputField a x |
Instances | |
|
|
data VALID |
|
|
data INVALID |
|
|
value :: HasValue i => i a VALID -> a |
extract a value from various kinds of input handles
|
|
class InputHandle h |
| Instances | |
|
|
class HasValue i where |
| Methods | value :: i a VALID -> a | extract a value from various kinds of input handles
|
| | Instances | |
|
|
data F0 x |
Constructors | | Instances | |
|
|
data F1 a x |
Constructors | | Instances | |
|
|
data F2 a b x |
Constructors | | Instances | |
|
|
data F3 a b c x |
Constructors | | Instances | |
|
|
data F4 a b c d x |
Constructors | F4 (a x) (b x) (c x) (d x) | |
| Instances | |
|
|
data F5 a b c d e x |
Constructors | F5 (a x) (b x) (c x) (d x) (e x) | |
| Instances | |
|
|
data F6 a b c d e f x |
Constructors | F6 (a x) (b x) (c x) (d x) (e x) (f x) | |
| Instances | |
|
|
data F8 a b c d e f g h x |
Constructors | F8 (a x) (b x) (c x) (d x) (e x) (f x) (g x) (h x) | |
| Instances | |
|
|
data FL a x |
FL is required to pass an unknown number of handles of the same
type need to the callback function in a form submission. The
handles need to be collected in a list and then wrapped in the FL data constructor
| Constructors | | Instances | |
|
|
data FA a b x |
FA comes handy when you want to tag an input handle with some extra
information, which is not itsefl an input handle and which is not validated
by a form submission. The tag is the first argument and the handle is the
second argument of the data constructor.
| Constructors | | Instances | |
|
|
Attribute Shortcuts
|
|
fieldSIZE :: (Monad m, AdmitAttrSIZE e, AttrValueSIZE v) => v -> WithHTML e m () |
|
fieldMAXLENGTH :: (Monad m, AdmitAttrMAXLENGTH e, AttrValueMAXLENGTH v) => v -> WithHTML e m () |
|
fieldVALUE :: (Monad m, AdmitAttrVALUE e, AttrValueVALUE v) => v -> WithHTML e m () |
|
Advanced
|
|
Installing Translators
|
|
runWithHook :: CGIOptions -> ([String] -> CGI ()) -> CGI () -> IO () |
Variant of run where an additional argument cgigen specifies an action
taken when the script is invoked with a non-empty query string as in
script-name?query-string
|
|
docTranslator :: [FreeForm] -> ([String] -> CGI ()) -> [String] -> CGI () |
A translator is a function [String] -> CGI (). It takes the query string
of the URL (of type [String]) and translates it into a CGI
action. docTranslator docs next
takes a list of FreeForm documents and a next translator. It tries to
select a document by its ffName and falls through to the
next translator if no document matches.
|
|
lastTranslator :: [String] -> CGI () |
Terminates a sequence of translators.
|
|
Outputable Stuff
|
|
class CGIOutput a |
| Instances | |
|
|
data Status |
Constructors | Status | | statusCode :: Int | status code
| statusReason :: String | reason phrase
| statusContent :: (Maybe (WithHTML () IO ())) | more explanation
|
|
| Instances | |
|
|
newtype Location |
Constructors | | Instances | |
|
|
data FreeForm |
Constructors | FreeForm | | ffName :: String | internal name
| ffContentType :: String | MIME type
| ffRawContents :: String | contents as octet stream
|
|
| Instances | |
|
|
data FileReference |
Constructors | FileReference | | fileReferenceName :: FilePath | valid local filename where this file can be accessed
| fileReferenceContentType :: String | | fileReferenceExternalName :: String | |
|
| Instances | |
|
|
Predefined Types for Input Fields
|
|
newtype Text |
Arbitrary string data. No quotes required.
| Constructors | | Instances | |
|
|
newtype NonEmpty |
Non-empty strings.
| Constructors | | Instances | |
|
|
newtype AllDigits |
Non-empty strings of digits.
| Constructors | | Instances | |
|
|
newtype Phone |
Phone numbers.
| Constructors | | Instances | |
|
|
newtype EmailAddress |
Reads an email address according to RFC 2822
| Constructors | | Instances | |
|
|
newtype CreditCardNumber |
Reads a credit card number and performs Luhn check on it.
| Constructors | | Instances | |
|
|
data CreditCardExp |
Reads credit card expiration dates in format .
| Constructors | | Instances | |
|
|
newtype Password |
A Password is a string of length >= 8 with characters taken from at least
three of the four sets: lower case characters, upper case characters, digits,
and special characters.
| Constructors | | Instances | |
|
|
data Optional a |
Data type for transforming a field into an optional one. The Read syntax of
Absent is the empty string, whereas the Read syntax of Present a is just the
Read syntax of a. Analogously for Show.
| Constructors | | Instances | |
|
|
Lowlevel Options
|
|
data CGIOption |
Constructors | NoPort | do not include port number in generated URLs
| AutoPort | include automatically generated port number in generated URLs (default)
| Port Int | use this port number in generated URLs
| NoHttps | do not attempt to detect Https
| AutoHttps | autodetect Https by checking for port number 443 and env var HTTPS (default)
| FullURL | generate full URL including scheme, host, and port
| PartialURL | generate absolute path URL, only (default)
| SessionMode | | |
| Instances | |
|
|
type CGIOptions = [CGIOption] |
|
newtype URL |
Constructors | | Instances | |
|
|
Servlets
|
|
makeServlet :: CGI () -> CGIProgram |
Transform a CGI action into a servlet suitable for running from Marlow's web
server.
|
|
makeServletWithHook :: ([String] -> CGI ()) -> CGI () -> CGIProgram |
Like makeServlet with additional CGI generator as in runWithHook.
|
|
HTML and Style
|
|
module WASH.HTML.HTMLMonad98 |
|
module WASH.CGI.Style |
|
Experimental Stuff
|
|
data FrameSet |
Abstract data type of frame set generators.
|
|
|
data FrameLayout |
Overall layout of a frame set: row-wise or column-wise.
| Constructors | | Instances | |
|
|
data FrameSpacing |
|
|
makeFrame :: WithHTML FRAME IO () -> CGI () -> CGI FrameSet |
|
makeFrameset :: CGIMonad cgi => FrameLayout -> [(FrameSpacing, cgi FrameSet)] -> cgi FrameSet |
Create a frameset, given a layout, its spacing, and its subframe(set)s.
|
|
framesetPage :: CGIMonad cgi => String -> cgi FrameSet -> cgi () |
Required wrapper for pages with frames. Takes a title and a FrameSet
generator and displays the page.
|
|
Produced by Haddock version 0.8 |