|
|
|
|
|
|
Synopsis |
|
data CGI a | | ask :: WithHTML HTML CGI a -> CGI () | | tell :: CGIOutput a => a -> CGI () | | io :: (Read a, Show a) => IO a -> CGI a | | run :: CGI () -> IO () | | once :: (Read a, Show a) => CGI a -> CGI a | | forever :: CGI () -> CGI () | | htell :: WithHTML HTML IO () -> CGI a | | askOffline :: WithHTML HTML CGI a -> (Element -> IO ()) -> CGI () | | data Image | | internalImage :: FreeForm -> String -> WithHTML x CGI Image | | externalImage :: URL -> String -> WithHTML x CGI Image | | makeImg :: AdmitChildIMG y => Image -> HTMLField IMG y () | | makeRef :: (AdmitChildA y, Monad m) => String -> WithHTML A m () -> CGI (WithHTML y m ()) | | makePopupRef :: AdmitChildA y => String -> String -> HTMLField A y () | | makeA :: AdmitChildA y => String -> String -> HTMLField 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 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 :: (AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLField INPUT y () | | submit0 :: AdmitChildINPUT y => CGI () -> HTMLField INPUT y () | | defaultSubmit :: (AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLField INPUT y () | | resetField :: AdmitChildINPUT y => HTMLField INPUT y (InputField () INVALID) | | activeInputField :: (AdmitChildINPUT y, Reason a, Read a) => (a -> CGI ()) -> HTMLField INPUT y () | | activate :: (InputHandle (i a), HasValue i, AdmitChildINPUT y) => (a -> CGI ()) -> HTMLField INPUT y (i a INVALID) -> HTMLField INPUT y (i a INVALID) | | submitLink :: (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 INPUT y -> HTMLField INPUT y () | | data DTree x y | | dtleaf :: CGI () -> DTree x y | | dtnode :: InputHandle h => h INVALID -> (h VALID -> DTree x y) -> DTree x y | | inputField :: (AdmitChildINPUT y, Reason a, Read a) => HTMLField INPUT y (InputField a INVALID) | | textInputField :: AdmitChildINPUT y => HTMLField INPUT y (InputField String INVALID) | | checkedTextInputField :: AdmitChildINPUT y => (Maybe String -> Maybe String) -> HTMLField INPUT y (InputField String INVALID) | | passwordInputField :: (AdmitChildINPUT y, Reason a, Read a) => HTMLField INPUT y (InputField a INVALID) | | makeTextarea :: AdmitChildTEXTAREA y => String -> HTMLField TEXTAREA y (InputField String INVALID) | | checkboxInputField :: AdmitChildINPUT y => HTMLField INPUT y (InputField Bool INVALID) | | makeButton :: AdmitChildINPUT y => HTMLField INPUT y (InputField Bool INVALID) | | data RadioGroup a x | | radioGroup :: Read a => WithHTML x CGI (RadioGroup a INVALID) | | radioButton :: (AdmitChildINPUT y, Show a) => RadioGroup a INVALID -> a -> HTMLField INPUT y () | | radioError :: AdmitChildIMG x => RadioGroup a INVALID -> WithHTML x CGI () | | imageField :: AdmitChildINPUT y => Image -> HTMLField INPUT y (InputField (Int, Int) INVALID) | | selectMultiple :: (AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField SELECT y (InputField [a] INVALID) | | selectSingle :: (AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField SELECT y (InputField a INVALID) | | selectBounded :: (AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField SELECT y (InputField a INVALID) | | fileInputField :: AdmitChildINPUT y => HTMLField INPUT y (InputField FileReference INVALID) | | checkedFileInputField :: AdmitChildINPUT y => (Maybe FileReference -> Maybe FileReference) -> HTMLField 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 | | 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 HTMLMonad98 | | module Style | | data FrameSet | | | | | | makeFrame :: WithHTML FRAME IO () -> CGI () -> CGI FrameSet | | makeFrameset :: FrameLayout -> [(FrameSpacing, CGI FrameSet)] -> CGI FrameSet | | framesetPage :: String -> CGI FrameSet -> CGI () |
|
|
|
Basics |
|
data CGI a |
|
|
ask :: WithHTML HTML CGI a -> CGI () |
|
tell :: 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. |
|
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 :: (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 :: CGI () -> CGI () |
Repeats a CGI action without saving its state so that the size of the
interaction log remains constant. |
|
htell :: WithHTML HTML IO () -> CGI a |
|
askOffline :: WithHTML HTML CGI a -> (Element -> IO ()) -> CGI () |
|
Links and Images |
|
data Image |
|
|
internalImage |
|
|
externalImage |
|
|
makeImg :: AdmitChildIMG y => Image -> HTMLField IMG y () |
|
makeRef :: (AdmitChildA y, Monad m) => String -> WithHTML A m () -> CGI (WithHTML y m ()) |
|
makePopupRef :: AdmitChildA y => String -> String -> HTMLField A y () |
|
makeA :: AdmitChildA y => String -> String -> HTMLField 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 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 :: (AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLField INPUT y () |
|
submit0 :: AdmitChildINPUT y => CGI () -> HTMLField INPUT y () |
|
defaultSubmit :: (AdmitChildINPUT y, InputHandle h) => h INVALID -> (h VALID -> CGI ()) -> HTMLField INPUT y () |
|
resetField :: AdmitChildINPUT y => HTMLField INPUT y (InputField () INVALID) |
|
activeInputField :: (AdmitChildINPUT y, Reason a, Read a) => (a -> CGI ()) -> HTMLField INPUT y () |
|
activate :: (InputHandle (i a), HasValue i, AdmitChildINPUT y) => (a -> CGI ()) -> HTMLField INPUT y (i a INVALID) -> HTMLField INPUT y (i a INVALID) |
|
submitLink :: (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 INPUT y -> HTMLField INPUT y () |
|
data DTree x y |
Abstract type of decisions trees. These trees provide structured validation. |
|
|
dtleaf :: CGI () -> DTree x y |
Create a leaf in a decision tree from a CGI action. |
|
dtnode :: InputHandle h => h INVALID -> (h VALID -> DTree x y) -> DTree 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 :: (AdmitChildINPUT y, Reason a, Read a) => HTMLField INPUT y (InputField a INVALID) |
|
textInputField :: AdmitChildINPUT y => HTMLField INPUT y (InputField String INVALID) |
|
checkedTextInputField :: AdmitChildINPUT y => (Maybe String -> Maybe String) -> HTMLField INPUT y (InputField String INVALID) |
|
passwordInputField :: (AdmitChildINPUT y, Reason a, Read a) => HTMLField INPUT y (InputField a INVALID) |
|
makeTextarea :: AdmitChildTEXTAREA y => String -> HTMLField TEXTAREA y (InputField String INVALID) |
|
Checkbox |
|
checkboxInputField :: AdmitChildINPUT y => HTMLField INPUT y (InputField Bool INVALID) |
|
Button |
|
makeButton :: AdmitChildINPUT y => HTMLField INPUT y (InputField Bool INVALID) |
|
data RadioGroup a x |
|
|
radioGroup :: Read a => WithHTML x CGI (RadioGroup a INVALID) |
Create a handle for a new radio group. This handle is invisible on the screen! |
|
radioButton :: (AdmitChildINPUT y, Show a) => RadioGroup a INVALID -> a -> HTMLField INPUT y () |
|
radioError :: AdmitChildIMG x => RadioGroup a INVALID -> WithHTML x CGI () |
|
Image |
|
imageField :: AdmitChildINPUT y => Image -> HTMLField INPUT y (InputField (Int, Int) INVALID) |
|
Selection Box |
|
selectMultiple :: (AdmitChildSELECT y, Eq a) => (a -> String) -> [a] -> [a] -> (Int, Int) -> HTMLField SELECT y (InputField [a] INVALID) |
|
selectSingle :: (AdmitChildSELECT y, Eq a) => (a -> String) -> Maybe a -> [a] -> HTMLField SELECT y (InputField a INVALID) |
|
selectBounded :: (AdmitChildSELECT y, Enum a, Bounded a, Read a, Show a, Eq a) => Maybe a -> HTMLField SELECT y (InputField a INVALID) |
|
File |
|
fileInputField :: AdmitChildINPUT y => HTMLField INPUT y (InputField FileReference INVALID) |
|
checkedFileInputField :: AdmitChildINPUT y => (Maybe FileReference -> Maybe FileReference) -> HTMLField INPUT y (InputField FileReference INVALID) |
|
Handle Manipulation |
|
data InputField a x |
|
|
data VALID |
|
|
data INVALID |
|
|
value :: HasValue i => i a VALID -> a |
|
class InputHandle h |
| Instances | InputHandle (InputField a) | InputHandle F0 | InputHandle a => InputHandle (F1 a) | (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) | InputHandle a => InputHandle (FL a) | InputHandle b => InputHandle (FA a b) | InputHandle (RadioGroup a) | InputHandle (SelectionGroup a) |
|
|
|
class HasValue i |
|
|
data F0 x |
|
|
data F1 a x |
|
|
data F2 a b x |
|
|
data F3 a b c x |
|
|
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 |
|
|
data Status |
Constructors | Status | | statusCode :: Int | status code | statusReason :: String | reason phrase | statusContent :: (Maybe (WithHTML () IO ())) | more explanation |
|
| Instances | |
|
|
newtype Location |
|
|
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 | CreditCardNumber | | unCreditCardNumber :: String | |
|
| Instances | |
|
|
data CreditCardExp |
Reads credit card expiration dates in format . | Constructors | CreditCardExp | | cceMonth :: Int | | cceYear :: Int | |
|
| 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 | 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 | FullURL | generate full URL including scheme, host, and port | PartialURL | generate absolute path URL, only |
| Instances | |
|
|
type CGIOptions = [CGIOption] |
|
newtype URL |
|
|
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 HTMLMonad98 |
|
module 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 :: FrameLayout -> [(FrameSpacing, CGI FrameSet)] -> CGI FrameSet |
Create a frameset, given a layout, its spacing, and its subframe(set)s. |
|
framesetPage :: 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.6 |