-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | An implementation of the Jinja2 template language in Haskell -- -- Ginger is Jinja, minus the most blatant pythonisms. Wants to be -- feature complete, but isn't quite there yet. @package ginger @version 0.3.7.1 module Text.PrintfA data PrintfArgT P :: a -> PrintfArgT data PrintfTypeT T :: (forall r. PrintfType r => r) -> PrintfTypeT [unT] :: PrintfTypeT -> forall r. PrintfType r => r printfa :: PrintfType t => String -> [PrintfArgT] -> t -- | A HTML type, useful for implementing type-safe conversion between -- plain text and HTML. The HTML representation used here assumed Unicode -- throughout, and UTF-8 should be used as the encoding when sending -- Html objects as responses to a HTTP client. module Text.Ginger.Html -- | A chunk of HTML source. data Html -- | Convert a chunk of HTML source code into an Html value as-is. -- Note that this bypasses any and all HTML encoding; the caller is -- responsible for taking appropriate measures against XSS and other -- potential vulnerabilities. In other words, the input to this function -- is considered pre-sanitized. unsafeRawHtml :: Text -> Html -- | Safely convert plain text to HTML. html :: Text -> Html -- | Extract HTML source code from an Html value. htmlSource :: Html -> Text -- | Types that support conversion to HTML. class ToHtml s toHtml :: ToHtml s => s -> Html instance GHC.Classes.Ord Text.Ginger.Html.Html instance GHC.Classes.Eq Text.Ginger.Html.Html instance GHC.Show.Show Text.Ginger.Html.Html instance GHC.Base.Monoid Text.Ginger.Html.Html instance Text.Ginger.Html.ToHtml Data.Text.Internal.Text instance Text.Ginger.Html.ToHtml [GHC.Types.Char] instance Text.Ginger.Html.ToHtml Text.Ginger.Html.Html -- | GVal is a generic unitype value, representing the kind of values that -- Ginger can understand. -- -- Most of the types in this module are parametrized over an m -- type, which is the host monad for template execution, as passed to -- runGingerT. For most kinds of values, m is -- transparent, and in many cases a ToGVal instance can be written -- that works for all possible m; the reason we need to -- parametrize the values themselves over the carrier monad is because we -- want to support impure functions, which requires access to the -- underlying carrier monad (e.g. IO). module Text.Ginger.GVal -- | A variant type designed as the unitype for the template language. Any -- value referenced in a template, returned from within a template, or -- used in a template context, will be a GVal. m, in most -- cases, should be a Monad. -- -- Some laws apply here, most notably: -- --
-- >>> asText $ list ("Found " ~: (6 :: Int) ~: " items" ~: [] :: [GVal IO])
-- "Found 6 items"
--
(~:) :: ToGVal m a => a -> Cons m -> Cons m
infixr 5 ~:
-- | Construct a GVal from a list of GVals. This is equivalent to the
-- toGVal implementation of [GVal m], but typed more
-- narrowly for clarity and disambiguation.
list :: Cons m -> GVal m
-- | Check if the given GVal is a list-like object
isList :: GVal m -> Bool
-- | Check if the given GVal is a dictionary-like object
isDict :: GVal m -> Bool
-- | Treat a GVal as a flat list and look up a value by integer
-- index. If the value is not a List, or if the index exceeds the list
-- length, return Nothing.
lookupIndex :: Int -> GVal m -> Maybe (GVal m)
-- | Helper function; look up a value by an integer index when the index
-- may or may not be available. If no index is given, return
-- Nothing.
lookupIndexMay :: Maybe Int -> GVal m -> Maybe (GVal m)
-- | Strictly-typed lookup: treat value as a dictionary-like object and
-- look up the value at a given key.
lookupKey :: Text -> GVal m -> Maybe (GVal m)
-- | Loosely-typed lookup: try dictionary-style lookup first (treat index
-- as a string, and container as a dictionary), if that doesn't yield
-- anything (either because the index is not string-ish, or because the
-- container doesn't provide dictionary-style access), try index-based
-- lookup.
lookupLoose :: GVal m -> GVal m -> Maybe (GVal m)
-- | Like lookupLoose, but fall back to the given default value if
-- the key is not in the dictionary, or if the indexee is not a
-- dictionary-like object.
lookupLooseDef :: GVal m -> GVal m -> GVal m -> GVal m
(~!) :: (FromGVal m v) => GVal m -> GVal m -> Maybe v
-- | Treat a GVal as a dictionary and list all the keys, with no
-- particular ordering.
keys :: GVal m -> Maybe [Text]
-- | Convert a GVal to a number.
toNumber :: GVal m -> Maybe Scientific
-- | Convert a GVal to an Int. The conversion will fail when
-- the value is not numeric, and also if it is too large to fit in an
-- Int.
toInt :: GVal m -> Maybe Int
-- | Convert a GVal to an Int, falling back to the given
-- default if the conversion fails.
toIntDef :: Int -> GVal m -> Int
-- | Convert a GVal to an Int, falling back to zero (0) if
-- the conversion fails.
toInt0 :: GVal m -> Int
-- | Loose cast to boolean.
--
-- Numeric zero, empty strings, empty lists, empty objects,
-- Null, and boolean False are considered falsy, anything
-- else (including functions) is considered true-ish.
toBoolean :: GVal m -> Bool
-- | Dynamically cast to a function. This yields Just a
-- Function if the value is a function, Nothing if it's
-- not.
toFunction :: GVal m -> Maybe (Function m)
picoToScientific :: Pico -> Scientific
scientificToPico :: Scientific -> Pico
class FromGVal m a where fromGValEither = maybe (Left "Conversion from GVal failed") Right . fromGVal fromGVal = either (const Nothing) Just . fromGValEither
fromGValEither :: FromGVal m a => GVal m -> Either String a
fromGVal :: FromGVal m a => GVal m -> Maybe a
fromGValM :: (Monad m, FromGVal m a) => GVal m -> m a
pairwise :: (a -> b) -> (a, a) -> (b, b)
packPair :: ([Char], [Char]) -> (Text, Text)
unpackPair :: (Text, Text) -> ([Char], [Char])
instance Data.Default.Class.Default (Text.Ginger.GVal.GVal m)
instance Data.Aeson.Types.ToJSON.ToJSON (Text.Ginger.GVal.GVal m)
instance GHC.Show.Show (Text.Ginger.GVal.GVal m)
instance Text.Ginger.Html.ToHtml (Text.Ginger.GVal.GVal m)
instance Text.Printf.PrintfArg (Text.Ginger.GVal.GVal m)
instance Text.Ginger.GVal.ToGVal m (Text.Ginger.GVal.GVal m)
instance Text.Ginger.GVal.ToGVal m v => Text.Ginger.GVal.ToGVal m (GHC.Base.Maybe v)
instance Text.Ginger.GVal.ToGVal m v => Text.Ginger.GVal.ToGVal m [v]
instance Text.Ginger.GVal.ToGVal m v => Text.Ginger.GVal.ToGVal m (Data.HashMap.Base.HashMap Data.Text.Internal.Text v)
instance Text.Ginger.GVal.ToGVal m GHC.Types.Int
instance Text.Ginger.GVal.ToGVal m GHC.Integer.Type.Integer
instance Text.Ginger.GVal.ToGVal m Data.Scientific.Scientific
instance Text.Ginger.GVal.ToGVal m Data.Time.Calendar.Days.Day
instance Text.Ginger.GVal.ToGVal m Data.Time.LocalTime.TimeOfDay.TimeOfDay
instance Text.Ginger.GVal.ToGVal m Data.Time.LocalTime.LocalTime.LocalTime
instance Text.Ginger.GVal.ToGVal m Data.Time.LocalTime.TimeZone.TimeZone
instance Text.Ginger.GVal.ToGVal m Data.Time.Format.Locale.TimeLocale
instance Text.Ginger.GVal.ToGVal m Data.Time.LocalTime.LocalTime.ZonedTime
instance (Text.Ginger.GVal.ToGVal m a, Text.Ginger.GVal.ToGVal m b) => Text.Ginger.GVal.ToGVal m (a, b)
instance (Text.Ginger.GVal.ToGVal m a, Text.Ginger.GVal.ToGVal m b, Text.Ginger.GVal.ToGVal m c) => Text.Ginger.GVal.ToGVal m (a, b, c)
instance (Text.Ginger.GVal.ToGVal m a, Text.Ginger.GVal.ToGVal m b, Text.Ginger.GVal.ToGVal m c, Text.Ginger.GVal.ToGVal m d) => Text.Ginger.GVal.ToGVal m (a, b, c, d)
instance Text.Ginger.GVal.ToGVal m GHC.Types.Bool
instance Data.String.IsString (Text.Ginger.GVal.GVal m)
instance Text.Ginger.GVal.ToGVal m GHC.Types.Char
instance Text.Ginger.GVal.ToGVal m Data.Text.Internal.Text
instance Text.Ginger.GVal.ToGVal m Data.Text.Internal.Lazy.Text
instance Text.Ginger.GVal.ToGVal m Text.Ginger.Html.Html
instance Text.Ginger.GVal.ToGVal m Data.Aeson.Types.Internal.Value
instance Text.Ginger.GVal.FromGVal m GHC.Types.Int
instance Text.Ginger.GVal.FromGVal m Data.Scientific.Scientific
instance Text.Ginger.GVal.FromGVal m Data.Text.Internal.Text
instance Text.Ginger.GVal.FromGVal m (Text.Ginger.GVal.GVal m)
instance Text.Ginger.GVal.FromGVal m a => Text.Ginger.GVal.FromGVal m (GHC.Base.Maybe a)
instance Text.Ginger.GVal.FromGVal m GHC.Types.Bool
instance Text.Ginger.GVal.FromGVal m Data.Aeson.Types.Internal.Value
instance Text.Ginger.GVal.FromGVal m ()
instance Text.Ginger.GVal.FromGVal m a => Text.Ginger.GVal.FromGVal m [a]
instance (Text.Ginger.GVal.FromGVal m a, Text.Ginger.GVal.FromGVal m b) => Text.Ginger.GVal.FromGVal m (a, b)
instance (Text.Ginger.GVal.FromGVal m a, Text.Ginger.GVal.FromGVal m b, Text.Ginger.GVal.FromGVal m c) => Text.Ginger.GVal.FromGVal m (a, b, c)
instance (Text.Ginger.GVal.FromGVal m a, Text.Ginger.GVal.FromGVal m b, Text.Ginger.GVal.FromGVal m c, Text.Ginger.GVal.FromGVal m d) => Text.Ginger.GVal.FromGVal m (a, b, c, d)
instance Text.Ginger.GVal.FromGVal m Data.Time.Calendar.Days.Day
instance Text.Ginger.GVal.FromGVal m Data.Time.LocalTime.TimeOfDay.TimeOfDay
instance Text.Ginger.GVal.FromGVal m Data.Time.LocalTime.LocalTime.LocalTime
instance Text.Ginger.GVal.FromGVal m Data.Time.LocalTime.LocalTime.ZonedTime
instance Text.Ginger.GVal.FromGVal m Data.Time.LocalTime.TimeZone.TimeZone
instance Text.Ginger.GVal.FromGVal m Data.Time.Format.Locale.TimeLocale
-- | Implements Ginger's Abstract Syntax Tree.
module Text.Ginger.AST
-- | A context variable name.
type VarName = Text
-- | Top-level data structure, representing a fully parsed template.
data Template
Template :: Statement -> HashMap VarName Block -> Maybe Template -> Template
[templateBody] :: Template -> Statement
[templateBlocks] :: Template -> HashMap VarName Block
[templateParent] :: Template -> Maybe Template
-- | A macro definition ( {% macro %} )
data Macro
Macro :: [VarName] -> Statement -> Macro
[macroArgs] :: Macro -> [VarName]
[macroBody] :: Macro -> Statement
-- | A block definition ( {% block %} )
data Block
Block :: Statement -> Block
[blockBody] :: Block -> Statement
-- | Ginger statements.
data Statement
-- | A sequence of multiple statements
MultiS :: [Statement] -> Statement
-- | Run wrapped statement in a local scope
ScopedS :: Statement -> Statement
-- | Literal output (anything outside of any tag)
LiteralS :: Html -> Statement
-- | {{ expression }}
InterpolationS :: Expression -> Statement
-- | {% if expression %}statement{% else %}statement{% endif %}
IfS :: Expression -> Statement -> Statement -> Statement
-- | {% for index, varname in expression %}statement{% endfor %}
ForS :: (Maybe VarName) -> VarName -> Expression -> Statement -> Statement
-- | {% set varname = expr %}
SetVarS :: VarName -> Expression -> Statement
-- | {% macro varname %}statements{% endmacro %}
DefMacroS :: VarName -> Macro -> Statement
BlockRefS :: VarName -> Statement
-- | {% include "template" %}
PreprocessedIncludeS :: Template -> Statement
-- | The do-nothing statement (NOP)
NullS :: Statement
-- | Expressions, building blocks for the expression minilanguage.
data Expression
-- | String literal expression: "foobar"
StringLiteralE :: Text -> Expression
-- | Numeric literal expression: 123.4
NumberLiteralE :: Scientific -> Expression
-- | Boolean literal expression: true
BoolLiteralE :: Bool -> Expression
-- | Literal null
NullLiteralE :: Expression
-- | Variable reference: foobar
VarE :: VarName -> Expression
-- | List construct: [ expr, expr, expr ]
ListE :: [Expression] -> Expression
-- | Object construct: { expr: expr, expr: expr, ... }
ObjectE :: [(Expression, Expression)] -> Expression
-- | foo[bar] (also dot access)
MemberLookupE :: Expression -> Expression -> Expression
-- | foo(bar=baz, quux)
CallE :: Expression -> [(Maybe Text, Expression)] -> Expression
-- | (foo, bar) -> expr
LambdaE :: [Text] -> Expression -> Expression
-- | expr ? expr : expr
TernaryE :: Expression -> Expression -> Expression -> Expression
instance GHC.Show.Show Text.Ginger.AST.Block
instance GHC.Show.Show Text.Ginger.AST.Template
instance GHC.Show.Show Text.Ginger.AST.Macro
instance GHC.Show.Show Text.Ginger.AST.Statement
instance GHC.Show.Show Text.Ginger.AST.Expression
-- | Ginger parser.
module Text.Ginger.Parse
-- | Parse Ginger source from memory.
parseGinger :: Monad m => IncludeResolver m -> Maybe SourceName -> Source -> m (Either ParserError Template)
-- | Parse Ginger source from a file.
parseGingerFile :: Monad m => IncludeResolver m -> SourceName -> m (Either ParserError Template)
-- | Error information for Ginger parser errors.
data ParserError
ParserError :: String -> Maybe SourceName -> Maybe Int -> Maybe Int -> ParserError
-- | Human-readable error message
[peErrorMessage] :: ParserError -> String
-- | Source name, if any
[peSourceName] :: ParserError -> Maybe SourceName
-- | Line number, if available
[peSourceLine] :: ParserError -> Maybe Int
-- | Column number, if available
[peSourceColumn] :: ParserError -> Maybe Int
-- | Used to resolve includes. Ginger will call this function whenever it
-- encounters an {% include %}, {% import %}, or {% extends %} directive.
-- If the required source code is not available, the resolver should
-- return Nothing, else Just the source.
type IncludeResolver m = SourceName -> m (Maybe Source)
-- | Input type for the parser (source code).
type Source = String
-- | A source identifier (typically a filename).
type SourceName = String
instance GHC.Generics.Generic Text.Ginger.Parse.ParserError
instance GHC.Show.Show Text.Ginger.Parse.ParserError
instance GHC.Exception.Exception Text.Ginger.Parse.ParserError
module Text.Ginger.Run.FuncUtils
unaryFunc :: forall m h. (Monad m) => (GVal (Run m h) -> GVal (Run m h)) -> Function (Run m h)
ignoreArgNames :: ([a] -> b) -> ([(c, a)] -> b)
variadicNumericFunc :: Monad m => Scientific -> ([Scientific] -> Scientific) -> [(Maybe Text, GVal (Run m h))] -> Run m h (GVal (Run m h))
unaryNumericFunc :: Monad m => Scientific -> (Scientific -> Scientific) -> [(Maybe Text, GVal (Run m h))] -> Run m h (GVal (Run m h))
variadicStringFunc :: Monad m => ([Text] -> Text) -> [(Maybe Text, GVal (Run m h))] -> Run m h (GVal (Run m h))
-- | Match args according to a given arg spec, Python style. The return
-- value is a triple of (matched, args, kwargs, unmatchedNames),
-- where matches is a hash map of named captured arguments, args
-- is a list of remaining unmatched positional arguments, kwargs is a
-- list of remaining unmatched named arguments, and
-- unmatchedNames contains the argument names that haven't been
-- matched.
extractArgs :: [Text] -> [(Maybe Text, a)] -> (HashMap Text a, [a], HashMap Text a, [Text])
-- | Parse argument list into type-safe argument structure.
extractArgsT :: ([Maybe a] -> b) -> [Text] -> [(Maybe Text, a)] -> Either ([a], HashMap Text a, [Text]) b
-- | Parse argument list into flat list of matched arguments.
extractArgsL :: [Text] -> [(Maybe Text, a)] -> Either ([a], HashMap Text a, [Text]) [Maybe a]
extractArgsDefL :: [(Text, a)] -> [(Maybe Text, a)] -> Either ([a], HashMap Text a, [Text]) [a]
injectDefaults :: [a] -> [Maybe a] -> [a]
module Text.Ginger.Run.VM
-- | Helper function to run a State action with a temporary state,
-- reverting to the old state after the action has finished.
withLocalState :: (Monad m, MonadState s m) => m a -> m a
-- | Helper function to run a Scope action with a temporary scope,
-- reverting to the old scope after the action has finished.
withLocalScope :: (Monad m) => Run m h a -> Run m h a
setVar :: Monad m => VarName -> GVal (Run m h) -> Run m h ()
getVar :: Monad m => VarName -> Run m h (GVal (Run m h))
clearCapture :: (Monoid h, Monad m) => Run m h ()
appendCapture :: (Monoid h, Monad m) => h -> Run m h ()
fetchCapture :: Monad m => Run m h h
-- | Execute Ginger templates in an arbitrary monad.
--
-- Usage example:
--
-- -- render :: Template -> Text -> Text -> Text -- render template -> username imageURL = do -- let contextLookup varName = -- case varName of -- "username" -> toGVal username -- "imageURL" -> toGVal imageURL -- _ -> def -- def for GVal is equivalent to a NULL value -- context = makeContext contextLookup -- in htmlSource $ runGinger context template --module Text.Ginger.Run -- | Simplified interface to render a ginger template "into" a monad. -- -- easyRenderM emit context template renders the -- template with the given context object (which should -- represent some sort of dictionary-like object) by feeding any output -- to the emit function. easyRenderM :: (Monad m, ContextEncodable h, Monoid h, ToGVal (Run m h) v, ToGVal (Run m h) h) => (h -> m ()) -> v -> Template -> m () -- | Simplified interface to render a ginger template in a pure fashion. -- -- easyRender context template renders the template -- with the given context object (which should represent some -- sort of dictionary-like object) by returning the concatenated output. easyRender :: (ContextEncodable h, Monoid h, ToGVal (Run (Writer h) h) v, ToGVal (Run (Writer h) h) h) => v -> Template -> h easyContext :: (Monad m, ContextEncodable h, ToGVal (Run m h) v) => (h -> m ()) -> v -> GingerContext m h -- | Monadically run a Ginger template. The m parameter is the -- carrier monad. runGingerT :: (ToGVal (Run m h) h, Monoid h, Monad m, Functor m) => GingerContext m h -> Template -> m () -- | Purely expand a Ginger template. The underlying carrier monad is -- Writer h, which is used to collect the output and -- render it into a h value. runGinger :: (ToGVal (Run (Writer h) h) h, Monoid h) => GingerContext (Writer h) h -> Template -> h -- | Deprecated: Compatibility alias for makeContextHtml makeContext :: (VarName -> GVal (Run (Writer Html) Html)) -> GingerContext (Writer Html) Html -- | Deprecated: Compatibility alias for makeContextHtmlM makeContextM :: (Monad m, Functor m) => (VarName -> Run m Html (GVal (Run m Html))) -> (Html -> m ()) -> GingerContext m Html -- | Create an execution context for runGinger. The argument is a lookup -- function that maps top-level context keys to ginger values. -- makeContext is a specialized version of makeContextM, -- targeting the Writer Html monad (which is what is used -- for the non-monadic template interpreter runGinger). -- -- The type of the lookup function may look intimidating, but in most -- cases, marshalling values from Haskell to Ginger is a matter of -- calling toGVal on them, so the 'GVal (Run (Writer Html))' part -- can usually be ignored. See the GVal module for details. makeContext' :: Monoid h => (VarName -> GVal (Run (Writer h) h)) -> (GVal (Run (Writer h) h) -> h) -> GingerContext (Writer h) h -- | Create an execution context for runGingerT. Takes a lookup function, -- which returns ginger values into the carrier monad based on a lookup -- key, and a writer function (outputting HTML by whatever means the -- carrier monad provides, e.g. putStr for IO, or -- tell for Writers). makeContextM' :: (Monad m, Functor m) => (VarName -> Run m h (GVal (Run m h))) -> (h -> m ()) -> (GVal (Run m h) -> h) -> GingerContext m h makeContextHtml :: (VarName -> GVal (Run (Writer Html) Html)) -> GingerContext (Writer Html) Html makeContextHtmlM :: (Monad m, Functor m) => (VarName -> Run m Html (GVal (Run m Html))) -> (Html -> m ()) -> GingerContext m Html makeContextText :: (VarName -> GVal (Run (Writer Text) Text)) -> GingerContext (Writer Text) Text makeContextTextM :: (Monad m, Functor m) => (VarName -> Run m Text (GVal (Run m Text))) -> (Text -> m ()) -> GingerContext m Text -- | Execution context. Determines how to look up variables from the -- environment, and how to write out template output. data GingerContext m h -- | Internal type alias for our template-runner monad stack. type Run m h = StateT (RunState m h) (ReaderT (GingerContext m h) m) -- | Lift a value from the host monad m into the Run monad. liftRun :: Monad m => m a -> Run m h a -- | Lift a function from the host monad m into the Run -- monad. liftRun2 :: Monad m => (a -> m b) -> a -> Run m h b -- | Match args according to a given arg spec, Python style. The return -- value is a triple of (matched, args, kwargs, unmatchedNames), -- where matches is a hash map of named captured arguments, args -- is a list of remaining unmatched positional arguments, kwargs is a -- list of remaining unmatched named arguments, and -- unmatchedNames contains the argument names that haven't been -- matched. extractArgs :: [Text] -> [(Maybe Text, a)] -> (HashMap Text a, [a], HashMap Text a, [Text]) -- | Parse argument list into type-safe argument structure. extractArgsT :: ([Maybe a] -> b) -> [Text] -> [(Maybe Text, a)] -> Either ([a], HashMap Text a, [Text]) b -- | Parse argument list into flat list of matched arguments. extractArgsL :: [Text] -> [(Maybe Text, a)] -> Either ([a], HashMap Text a, [Text]) [Maybe a] extractArgsDefL :: [(Text, a)] -> [(Maybe Text, a)] -> Either ([a], HashMap Text a, [Text]) [a] -- | A syntax tree optimizer module Text.Ginger.Optimizer class Optimizable a optimize :: Optimizable a => a -> a instance GHC.Base.Monoid Text.Ginger.Optimizer.Collected instance GHC.Enum.Bounded Text.Ginger.Optimizer.Purity instance GHC.Classes.Ord Text.Ginger.Optimizer.Purity instance GHC.Read.Read Text.Ginger.Optimizer.Purity instance GHC.Enum.Enum Text.Ginger.Optimizer.Purity instance GHC.Classes.Eq Text.Ginger.Optimizer.Purity instance GHC.Show.Show Text.Ginger.Optimizer.Purity instance Text.Ginger.Optimizer.Optimizable Text.Ginger.AST.Template instance Text.Ginger.Optimizer.Optimizable Text.Ginger.AST.Statement instance Text.Ginger.Optimizer.Optimizable Text.Ginger.AST.Block instance Text.Ginger.Optimizer.Optimizable Text.Ginger.AST.Macro instance Text.Ginger.Optimizer.Optimizable Text.Ginger.AST.Expression instance GHC.Base.Monoid Text.Ginger.Optimizer.Purity instance Text.Ginger.GVal.ToGVal m Text.Ginger.Optimizer.Collected -- | A Haskell implementation of the Jinja2 template language. -- -- Ginger aims to be as close to the original Jinja language as possible, -- but avoiding blatant pythonisms and features that make little sense -- outside of an impure dynamic host language context, especially when -- this would require sacrificing runtime performance. module Text.Ginger