-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | StringTemplate implementation in Haskell. -- -- A port of the Java library by Terrence Parr. @package HStringTemplate @version 0.4.3 module Text.StringTemplate.Classes data SElem a STR :: String -> SElem a STSH :: STShow -> SElem a SM :: (SMap a) -> SElem a LI :: [SElem a] -> SElem a SBLE :: a -> SElem a SNull :: SElem a -- | The StringTemplateShows class should be instantiated for all types -- that are directly displayed in a StringTemplate, but take an optional -- format string. Each such type must have an appropriate ToSElem method -- defined as well. class (Show a) => StringTemplateShows a stringTemplateShow :: (StringTemplateShows a) => a -> String stringTemplateFormattedShow :: (StringTemplateShows a) => String -> a -> String -- | The ToSElem class should be instantiated for all types that can be -- inserted as attributes into a StringTemplate. class ToSElem a toSElem :: (ToSElem a, Stringable b) => a -> SElem b toSElemList :: (ToSElem a, Stringable b) => [a] -> SElem b type SMap a = Map String (SElem a) data STShow STShow :: a -> STShow newtype StFirst a StFirst :: Maybe a -> StFirst a stGetFirst :: StFirst a -> Maybe a -- | The Stringable class should be instantiated with care. Generally, the -- provided instances should be enough for anything. class (Monoid a) => Stringable a stFromString :: (Stringable a) => String -> a stToString :: (Stringable a) => a -> String mconcatMap :: (Stringable a) => [b] -> (b -> a) -> a mintercalate :: (Stringable a) => a -> [a] -> a mlabel :: (Stringable a) => a -> a -> a -- | This method should be used to create ToSElem instances for types -- defining a custom formatted show function. stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem b instance (Eq a) => Eq (StFirst a) instance (Ord a) => Ord (StFirst a) instance (Read a) => Read (StFirst a) instance (Show a) => Show (StFirst a) instance Stringable (Endo String) instance Stringable ByteString instance Stringable ByteString instance Monoid Doc instance Stringable Doc instance Stringable [Char] instance Functor StFirst instance Monoid (StFirst a) -- | Generic Instance for ToSElem using standard Data.Generic libraries. module Text.StringTemplate.GenericStandard instance [overlap ok] (Data a) => ToSElem a module Text.StringTemplate.Base -- | A String with "holes" in it. StringTemplates may be composed of any -- Stringable type, which at the moment includes Strings, -- ByteStrings, PrettyPrinter Docs, and Endo -- Strings, which are actually of type ShowS. When a -- StringTemplate is composed of a type, its internals are as well, so it -- is, so to speak "turtles all the way down." data StringTemplate a STMP :: SEnv a -> (SEnv a -> a) -> StringTemplate a senv :: StringTemplate a -> SEnv a runSTMP :: StringTemplate a -> SEnv a -> a -- | The StringTemplateShows class should be instantiated for all types -- that are directly displayed in a StringTemplate, but take an optional -- format string. Each such type must have an appropriate ToSElem method -- defined as well. class (Show a) => StringTemplateShows a stringTemplateShow :: (StringTemplateShows a) => a -> String stringTemplateFormattedShow :: (StringTemplateShows a) => String -> a -> String -- | The ToSElem class should be instantiated for all types that can be -- inserted as attributes into a StringTemplate. class ToSElem a toSElem :: (ToSElem a, Stringable b) => a -> SElem b toSElemList :: (ToSElem a, Stringable b) => [a] -> SElem b -- | A function that generates StringTemplates. This is conceptually a -- query function into a "group" of StringTemplates. type STGroup a = String -> (StFirst (StringTemplate a)) -- | The Stringable class should be instantiated with care. Generally, the -- provided instances should be enough for anything. class (Monoid a) => Stringable a stFromString :: (Stringable a) => String -> a stToString :: (Stringable a) => a -> String mconcatMap :: (Stringable a) => [b] -> (b -> a) -> a mintercalate :: (Stringable a) => a -> [a] -> a mlabel :: (Stringable a) => a -> a -> a -- | This method should be used to create ToSElem instances for types -- defining a custom formatted show function. stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem b inSGen :: (STGroup a -> STGroup a) -> StringTemplate a -> StringTemplate a -- | Renders a StringTemplate to a String. toString :: StringTemplate String -> String -- | Renders a StringTemplate to a Text.PrettyPrint.HughesPJ.Doc. toPPDoc :: StringTemplate Doc -> Doc -- | Generic render function for a StringTemplate of any type. render :: (Stringable a) => StringTemplate a -> a -- | Parses a String to produce a StringTemplate, with '$'s as delimiters. -- It is constructed with a stub group that cannot look up other -- templates. newSTMP :: (Stringable a) => String -> StringTemplate a -- | Parses a String to produce a StringTemplate, delimited by angle -- brackets. It is constructed with a stub group that cannot look up -- other templates. newAngleSTMP :: (Stringable a) => String -> StringTemplate a -- | Queries an String Template Group and returns Just the appropriate -- StringTemplate if it exists, otherwise, Nothing. getStringTemplate :: (Stringable a) => String -> STGroup a -> Maybe (StringTemplate a) -- | As with getStringTemplate but never inlined, so appropriate for -- use with volatile template groups. getStringTemplate' :: (Stringable a) => String -> STGroup a -> Maybe (StringTemplate a) -- | Yields a StringTemplate with the appropriate attribute set. If the -- attribute already exists, it is appended to a list. setAttribute :: (ToSElem a, Stringable b) => String -> a -> StringTemplate b -> StringTemplate b -- | Yields a StringTemplate with the appropriate attributes set. If any -- attribute already exists, it is appended to a list. setManyAttrib :: (ToSElem a, Stringable b) => [(String, a)] -> StringTemplate b -> StringTemplate b -- | Replaces the attributes of a StringTemplate with those described in -- the second argument. If the argument does not yield a set of named -- attributes but only a single one, that attribute is named, as a -- default, "it". withContext :: (ToSElem a, Stringable b) => StringTemplate b -> a -> StringTemplate b -- | Adds a set of global options to a single template optInsertTmpl :: [(String, String)] -> StringTemplate a -> StringTemplate a -- | Sets an encoding function of a template that all values are rendered -- with. For example one useful encoder would be -- Text.Html.stringToHtmlString. All attributes will be encoded -- once and only once. setEncoder :: (Stringable a) => (String -> String) -> StringTemplate a -> StringTemplate a paddedTrans :: a -> [[a]] -> [[a]] data SEnv a SEnv :: SMap a -> [(String, SEnv a -> SElem a)] -> STGroup a -> (String -> String) -> SEnv a smp :: SEnv a -> SMap a sopts :: SEnv a -> [(String, SEnv a -> SElem a)] sgen :: SEnv a -> STGroup a senc :: SEnv a -> String -> String parseSTMP :: (Stringable a) => (Char, Char) -> String -> SEnv a -> a -- | A special template that simply dumps the values of all the attributes -- set in it. This may be made available to any template as a function by -- adding it to its group. I.e. myNewGroup = addSuperGroup myGroup $ -- groupStringTemplates [(dumpAttribs, dumpAttribs)] dumpAttribs :: (Stringable a) => StringTemplate a -- | Generic Instance for ToSElem using syb-with-class. Inspired -- heavily-to-entirely by Alex Drummond's RJson. module Text.StringTemplate.GenericWithClass instance [overlap ok] (Data ToSElemD t) => ToSElem t instance [overlap ok] (ToSElem a, Data ToSElemD a) => Sat (ToSElemD a) -- | A StringTemplate is a String with "holes" in it. This is a port of the -- Java StringTemplate library written by Terrence Parr. -- (http://www.stringtemplate.org). -- -- This library implements the basic 3.1 grammar, lacking group files -- (though not groups themselves), Regions, and Interfaces. The goal is -- not to blindly copy the StringTemplate API, but rather to take its -- central ideas and implement them in a Haskellish manner. Indentation -- and wrapping, for example, are implemented through the HughesPJ Pretty -- Printing library. Calling toPPDoc on a StringTemplate yields a Doc -- with appropriate paragraph-fill wrapping that can be rendered in the -- usual fashion. -- -- This library extends the current StringTemplate grammar by allowing -- the application of alternating attributes to anonymous as well as -- regular templates, including therefore sets of alternating attributes. -- -- Basic instances are provided of the StringTemplateShows and ToSElem -- class. Any type deriving ToSElem can be passed automatically as a -- StringTemplate attribute. This package can be installed with -- syb-with-class bindings that provide a ToSElem instance for anything -- deriving Data.Generics.SYB.WithClass.Basics.Data. When -- defining an instance of ToSElem that can take a format parameter, you -- should first define an instance of StringTemplateShows, and then -- define an instance of ToSElem where toSElem = stShowsToSE. module Text.StringTemplate -- | A String with "holes" in it. StringTemplates may be composed of any -- Stringable type, which at the moment includes Strings, -- ByteStrings, PrettyPrinter Docs, and Endo -- Strings, which are actually of type ShowS. When a -- StringTemplate is composed of a type, its internals are as well, so it -- is, so to speak "turtles all the way down." data StringTemplate a -- | A function that generates StringTemplates. This is conceptually a -- query function into a "group" of StringTemplates. type STGroup a = String -> (StFirst (StringTemplate a)) -- | The ToSElem class should be instantiated for all types that can be -- inserted as attributes into a StringTemplate. class ToSElem a toSElem :: (ToSElem a, Stringable b) => a -> SElem b toSElemList :: (ToSElem a, Stringable b) => [a] -> SElem b -- | The StringTemplateShows class should be instantiated for all types -- that are directly displayed in a StringTemplate, but take an optional -- format string. Each such type must have an appropriate ToSElem method -- defined as well. class (Show a) => StringTemplateShows a stringTemplateShow :: (StringTemplateShows a) => a -> String stringTemplateFormattedShow :: (StringTemplateShows a) => String -> a -> String -- | This method should be used to create ToSElem instances for types -- defining a custom formatted show function. stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem b -- | The Stringable class should be instantiated with care. Generally, the -- provided instances should be enough for anything. class (Monoid a) => Stringable a stFromString :: (Stringable a) => String -> a stToString :: (Stringable a) => a -> String mconcatMap :: (Stringable a) => [b] -> (b -> a) -> a mintercalate :: (Stringable a) => a -> [a] -> a mlabel :: (Stringable a) => a -> a -> a class (Stringable b) => SEType b a renderf :: (SEType b a) => StringTemplate b -> a -- | Parses a String to produce a StringTemplate, with '$'s as delimiters. -- It is constructed with a stub group that cannot look up other -- templates. newSTMP :: (Stringable a) => String -> StringTemplate a -- | Parses a String to produce a StringTemplate, delimited by angle -- brackets. It is constructed with a stub group that cannot look up -- other templates. newAngleSTMP :: (Stringable a) => String -> StringTemplate a -- | Queries an String Template Group and returns Just the appropriate -- StringTemplate if it exists, otherwise, Nothing. getStringTemplate :: (Stringable a) => String -> STGroup a -> Maybe (StringTemplate a) -- | As with getStringTemplate but never inlined, so appropriate for -- use with volatile template groups. getStringTemplate' :: (Stringable a) => String -> STGroup a -> Maybe (StringTemplate a) -- | Renders a StringTemplate to a String. toString :: StringTemplate String -> String -- | Renders a StringTemplate to a Text.PrettyPrint.HughesPJ.Doc. toPPDoc :: StringTemplate Doc -> Doc -- | Generic render function for a StringTemplate of any type. render :: (Stringable a) => StringTemplate a -> a -- | A special template that simply dumps the values of all the attributes -- set in it. This may be made available to any template as a function by -- adding it to its group. I.e. myNewGroup = addSuperGroup myGroup $ -- groupStringTemplates [(dumpAttribs, dumpAttribs)] dumpAttribs :: (Stringable a) => StringTemplate a -- | Yields a StringTemplate with the appropriate attribute set. If the -- attribute already exists, it is appended to a list. setAttribute :: (ToSElem a, Stringable b) => String -> a -> StringTemplate b -> StringTemplate b (|=) :: (Monad m) => a -> m a1 -> m (a, a1) -- | Yields a StringTemplate with the appropriate attributes set. If any -- attribute already exists, it is appended to a list. setManyAttrib :: (ToSElem a, Stringable b) => [(String, a)] -> StringTemplate b -> StringTemplate b -- | Replaces the attributes of a StringTemplate with those described in -- the second argument. If the argument does not yield a set of named -- attributes but only a single one, that attribute is named, as a -- default, "it". withContext :: (ToSElem a, Stringable b) => StringTemplate b -> a -> StringTemplate b -- | Adds a set of global options to a single template optInsertTmpl :: [(String, String)] -> StringTemplate a -> StringTemplate a -- | Adds a set of global options to a group optInsertGroup :: [(String, String)] -> STGroup a -> STGroup a -- | Sets an encoding function of a template that all values are rendered -- with. For example one useful encoder would be -- Text.Html.stringToHtmlString. All attributes will be encoded -- once and only once. setEncoder :: (Stringable a) => (String -> String) -> StringTemplate a -> StringTemplate a -- | Sets an encoding function of a group that all values are rendered with -- in each enclosed template setEncoderGroup :: (Stringable a) => (String -> String) -> STGroup a -> STGroup a -- | Given a list of named of StringTemplates, returns a group which -- generates them such that they can call one another. groupStringTemplates :: [(String, StringTemplate a)] -> STGroup a -- | Adds a supergroup to any StringTemplate group such that templates from -- the original group are now able to call ones from the supergroup as -- well. addSuperGroup :: STGroup a -> STGroup a -> STGroup a -- | Adds a "subgroup" to any StringTemplate group such that templates from -- the original group now have template calls "shadowed" by the subgroup. addSubGroup :: STGroup a -> STGroup a -> STGroup a -- | Merges two groups into a single group. This function is left-biased, -- prefering bindings from the first group when there is a conflict. mergeSTGroups :: STGroup a -> STGroup a -> STGroup a -- | Given a path, returns a group which generates all files in said -- directory which have the proper "st" extension. This function is -- strict, with all files read once. As it performs file IO, expect it to -- throw the usual exceptions. directoryGroup :: (Stringable a) => FilePath -> IO (STGroup a) -- | Given an integral amount of seconds and a path, returns a group -- generating all files in said directory with the proper "st" extension, -- cached for that amount of seconds. IO errors are "swallowed" by this -- so that exceptions don't arise in unexpected places. This violates -- referential transparency, but can be very useful in developing -- templates for any sort of server application. It should be swapped out -- for production purposes. The dumpAttribs template is added to the -- returned group by default, as it should prove useful for debugging and -- developing templates. unsafeVolatileDirectoryGroup :: (Stringable a) => String -> Int -> IO (STGroup a) -- | Given a path, returns a group which generates all files in said -- directory which have the proper "st" extension. This function is lazy -- in the same way that readFile is lazy, with all files read on demand, -- but no more than once. As it performs file IO, expect it to throw the -- usual exceptions. And, as it is lazy, expect these exceptions in -- unexpected places. directoryGroupLazy :: (Stringable a) => FilePath -> IO (STGroup a) -- | For any requested template, returns a message that the template was -- unable to be found. Useful to add as a super group for a set of -- templates under development, to aid in debugging. nullGroup :: (Stringable a) => STGroup a