- 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
- 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 {
- statusCode :: Int
- statusReason :: String
- statusContent :: Maybe (WithHTML () IO ())
- newtype Location = Location URL
- data FreeForm = FreeForm {}
- data FileReference = FileReference {}
- newtype Text = Text {}
- newtype NonEmpty = NonEmpty {
- unNonEmpty :: String
- newtype AllDigits = AllDigits {}
- newtype Phone = Phone {}
- newtype EmailAddress = EmailAddress {}
- newtype CreditCardNumber = CreditCardNumber {}
- data CreditCardExp = CreditCardExp {}
- newtype Password = Password {
- unPassword :: String
- data Optional a
- data CGIOption
- = NoPort
- | AutoPort
- | Port Int
- | NoHttps
- | AutoHttps
- | FullURL
- | PartialURL
- | SessionMode { }
- type CGIOptions = [CGIOption]
- newtype URL = URL {}
- makeServlet :: CGI () -> CGIProgram
- makeServletWithHook :: ([String] -> CGI ()) -> CGI () -> CGIProgram
- module WASH.HTML.HTMLMonad98
- module WASH.CGI.Style
- data FrameSet
- data FrameLayout
- data FrameSpacing
- makeFrame :: WithHTML FRAME IO () -> CGI () -> CGI FrameSet
- makeFrameset :: CGIMonad cgi => FrameLayout -> [(FrameSpacing, cgi FrameSet)] -> cgi FrameSet
- framesetPage :: CGIMonad cgi => String -> cgi FrameSet -> cgi ()
Basics
tell :: (CGIMonad cgi, CGIOutput a) => a -> cgi ()Source
Terminates script by sending its argument to the browser.
once :: (CGIMonad cgi, Read a, Show a) => cgi a -> cgi aSource
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 ()Source
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 ()Source
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.
Links and Images
Reference to internal image.
Reference to image by URL.
makeRef :: (CGIMonad cgi, AdmitChildA y, Monad m) => String -> WithHTML A m () -> cgi (WithHTML y m ())Source
makePopupRef :: (CGIMonad cgi, AdmitChildA y) => String -> String -> HTMLField cgi A y ()Source
Page Templates
standardPage :: (AdmitChildHTML y, Monad m) => String -> WithHTML BODY m a -> WithHTML y m ()Source
htmlHeader :: (AdmitChildHTML y, Monad m) => String -> WithHTML HTML m a -> WithHTML y m ()Source
cssPage :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML BODY m a -> WithHTML y m ()Source
cssHeader :: (AdmitChildHTML y, Monad m) => String -> String -> WithHTML HTML m a -> WithHTML y m ()Source
Forms and Widgets
type HTMLField cgi x y a = WithHTML x cgi () -> WithHTML y cgi aSource
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
Form Submission
submit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()Source
defaultSubmit :: (CGIMonad cgi, AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLField cgi INPUT y ()Source
resetField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField () INVALID)Source
activeInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => (a -> cgi ()) -> HTMLField cgi INPUT y ()Source
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)Source
submitLink :: (CGIMonad cgi, AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> cgi ()) -> HTMLCons A y cgi ()Source
submitLink0 :: AdmitChildA y => CGI () -> HTMLCons A y CGI ()Source
defaultSubmitLink :: (AdmitChildA y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLCons A y CGI ()Source
Abstract type of decisions trees. These trees provide structured validation.
dtleaf :: CGIMonad cgi => cgi () -> DTree cgi x ySource
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 ySource
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)Source
textInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField String INVALID)Source
checkedTextInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe String -> Maybe String) -> HTMLField cgi INPUT y (InputField String INVALID)Source
passwordInputField :: (CGIMonad cgi, AdmitChildINPUT y, Reason a, Read a) => HTMLField cgi INPUT y (InputField a INVALID)Source
makeTextarea :: (CGIMonad cgi, AdmitChildTEXTAREA y) => String -> HTMLField cgi TEXTAREA y (InputField String INVALID)Source
Checkbox
checkboxInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)Source
Button
makeButton :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField Bool INVALID)Source
data RadioGroup a x Source
HasValue RadioGroup | |
InputHandle (RadioGroup a) | |
StripHandle (RadioGroup a x) a |
radioGroup :: (CGIMonad cgi, Read a) => WithHTML x cgi (RadioGroup a INVALID)Source
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 ()Source
radioError :: (CGIMonad cgi, AdmitChildIMG x) => RadioGroup a INVALID -> WithHTML x cgi ()Source
Image
imageField :: (CGIMonad cgi, AdmitChildINPUT y) => Image -> HTMLField cgi INPUT y (InputField (Int, Int) INVALID)Source
Selection Box
selectMultiple :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField cgi SELECT y (InputField [a] INVALID)Source
selectSingle :: (CGIMonad cgi, AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField cgi SELECT y (InputField a INVALID)Source
selectBounded :: (CGIMonad cgi, AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField cgi SELECT y (InputField a INVALID)Source
File
fileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => HTMLField cgi INPUT y (InputField FileReference INVALID)Source
checkedFileInputField :: (CGIMonad cgi, AdmitChildINPUT y) => (Maybe FileReference -> Maybe FileReference) -> HTMLField cgi INPUT y (InputField FileReference INVALID)Source
Handle Manipulation
data InputField a x Source
HasValue InputField | |
InputHandle (InputField a) | |
StripHandle (InputField a x) a |
class InputHandle h Source
InputHandle F0 | |
InputHandle (RadioGroup a) | |
InputHandle (InputField a) | |
InputHandle (SelectionGroup a) | |
InputHandle a => InputHandle (FL a) | |
InputHandle a => InputHandle (F1 a) | |
InputHandle b => InputHandle (FA a b) | |
(InputHandle a, InputHandle b) => InputHandle (F2 a b) | |
(InputHandle a, InputHandle b, InputHandle c) => InputHandle (F3 a b c) | |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d) => InputHandle (F4 a b c d) | |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e) => InputHandle (F5 a b c d e) | |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f) => InputHandle (F6 a b c d e f) | |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g) => InputHandle (F7 a b c d e f g) | |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g, InputHandle h) => InputHandle (F8 a b c d e f g h) |
F3 (a x) (b x) (c x) |
(InputHandle a, InputHandle b, InputHandle c) => InputHandle (F3 a b c) |
F4 (a x) (b x) (c x) (d x) |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d) => InputHandle (F4 a b c d) |
F5 (a x) (b x) (c x) (d x) (e x) |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e) => InputHandle (F5 a b c d e) |
F6 (a x) (b x) (c x) (d x) (e x) (f x) |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f) => InputHandle (F6 a b c d e f) |
data F8 a b c d e f g h x Source
F8 (a x) (b x) (c x) (d x) (e x) (f x) (g x) (h x) |
(InputHandle a, InputHandle b, InputHandle c, InputHandle d, InputHandle e, InputHandle f, InputHandle g, InputHandle h) => InputHandle (F8 a b c d e f g h) |
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
FL [a x] |
InputHandle a => InputHandle (FL a) |
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.
FA a (b x) |
InputHandle b => InputHandle (FA a b) |
Attribute Shortcuts
fieldSIZE :: (Monad m, AdmitAttrSIZE e, AttrValueSIZE v) => v -> WithHTML e m ()Source
fieldMAXLENGTH :: (Monad m, AdmitAttrMAXLENGTH e, AttrValueMAXLENGTH v) => v -> WithHTML e m ()Source
fieldVALUE :: (Monad m, AdmitAttrVALUE e, AttrValueVALUE v) => v -> WithHTML e m ()Source
Advanced
Installing Translators
runWithHook :: CGIOptions -> ([String] -> CGI ()) -> CGI () -> IO ()Source
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 ()Source
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 ()Source
Terminates a sequence of translators.
Outputable Stuff
Status | |
|
FreeForm | |
|
data FileReference Source
FileReference | |
|
Predefined Types for Input Fields
Arbitrary string data. No quotes required.
Non-empty strings.
Non-empty strings of digits.
newtype EmailAddress Source
Reads an email address according to RFC 2822
newtype CreditCardNumber Source
Reads a credit card number and performs Luhn check on it.
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.
Lowlevel Options
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 | |
type CGIOptions = [CGIOption]Source
Servlets
makeServlet :: CGI () -> CGIProgramSource
Transform a CGI action into a servlet suitable for running from Marlow's web server.
makeServletWithHook :: ([String] -> CGI ()) -> CGI () -> CGIProgramSource
Like makeServlet
with additional CGI generator as in runWithHook
.
HTML and Style
module WASH.HTML.HTMLMonad98
module WASH.CGI.Style
Experimental Stuff
data FrameLayout Source
Overall layout of a frame set: row-wise or column-wise.
data FrameSpacing Source
Division of space between elements of a frameset. See http://wp.netscape.com/assist/net_sites/frame_syntax.html
FrameAbsolute Int | in pixels |
FrameRelative Int | the |
FramePercent Int | the |
makeFrameset :: CGIMonad cgi => FrameLayout -> [(FrameSpacing, cgi FrameSet)] -> cgi FrameSetSource
Create a frameset, given a layout, its spacing, and its subframe(set)s.