definition module htmlHandler // Converting Clean types to iData for automatic generation and dealing with Html form's .. // (c) MJP 2005 import htmlDataDef, htmlFormData, htmlSettings import GenPrint, GenParse import Gerda generic gForm a :: !(InIDataId a) !*HSt -> *(Form a, !*HSt) // user defined gForms: use "specialize" generic gUpd a :: UpdMode a -> (UpdMode,a) // gUpd can simply be derived derive gForm Int, Real, Bool, String, UNIT, PAIR, EITHER, OBJECT, CONS, FIELD derive gUpd Int, Real, Bool, String, UNIT, PAIR, EITHER, OBJECT, CONS, FIELD derive bimap Form, FormId :: *HSt = { cntr :: Int // counts position in expression , submits :: Bool // True if we are in submitting mode , states :: *FormStates // all form states are collected here ... , world :: *NWorld // to enable all other kinds of I/O } // doHtml main wrapper for generating & handling of a Html form doHtmlServer :: !(*HSt -> (Html,!*HSt)) !*World -> *World // use this application with the built-in Clean server // it will combine both into one application : http://localhost/clean; doHtmlSubServer :: !(!Int,!Int,!Int,!String) !(*HSt -> (Html,!*HSt)) // use this application as a subserver in combination with an external (Clean) server; !*World -> *World // priority (higher number = higher prio), min number, max number of subservers, location, html code doHtml :: !.(*HSt -> (Html,!*HSt)) !*World -> *World // use this application with some external server using a php script; // mkViewForm is the *swiss army knife* function creating stateful interactive forms with a view v of data d. // Make sure that all editors have a unique identifier! mkViewForm :: !(InIDataId d) !(HBimap d v) !*HSt -> (Form d,!*HSt) | iData v // Explicit removal of all (Persistent) IData for which the predicate holds applied on the IData form id deleteIData :: !(String -> Bool) !*HSt -> *HSt // specialize has to be used if one wants to specialize gForm for a user-defined type specialize :: !((InIDataId a) *HSt -> (Form a,*HSt)) !(InIDataId a) !*HSt -> (!Form a,!*HSt) | gUpd {|*|} a // utility functions toHtml :: a -> BodyTag | gForm {|*|} a // toHtml displays any type into a non-editable form toHtmlForm :: !(*HSt -> *(Form a,*HSt)) -> [BodyTag] // toHtmlForm displays any form one can make with a form function | gForm{|*|}, gUpd{|*|}, gPrint{|*|}, gParse{|*|}, TC a toBody :: (Form a) -> BodyTag // just (BodyTag form.body) createDefault :: a | gUpd{|*|} a // creates a default value of requested type :: Inline = Inline String derive gForm Inline derive gUpd Inline derive gParse Inline derive gPrint Inline derive gerda Inline showHtml :: [BodyTag] -> Inline // enabling to show Html code in Clean data // definitions on HSt instance FileSystem HSt // enabling file IO on HSt appWorldHSt :: !.(*World -> *World) !*HSt -> *HSt // enabling World operations on HSt accWorldHSt :: !.(*World -> *(.a,*World)) !*HSt -> (.a,!*HSt) // enabling World operations on HSt // Specialists section... // Added for testing of iData applications with GAST import iDataState runUserApplication :: .(*HSt -> *(.a,*HSt)) *FormStates *NWorld -> *(.a,*FormStates,*NWorld) // Some low level utility functions handy when specialize cannot be used, only to be used by experts !! incrHSt :: Int !*HSt -> *HSt // Cntr := Cntr + 1 CntrHSt :: !*HSt -> (Int,*HSt) // Hst.Cntr mkInput :: !Int !(InIDataId d) Value UpdValue !*HSt -> (BodyTag,*HSt) // Html Form Creation utility getChangedId :: !*HSt -> ([String],!*HSt) // id's of form(s) that has been changed by user :: UpdMode = UpdSearch UpdValue Int // search for indicated postion and update it | UpdCreate [ConsPos] // create new values if necessary | UpdDone // and just copy the remaining stuff