packages feed

doctemplates 0.9 → 0.10

raw patch · 6 files changed

+63/−22 lines, 6 filesdep ~aesonPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: aeson

API changes (from Hackage documentation)

+ Text.DocTemplates.Internal: instance Data.Data.Data a => Data.Data.Data (Text.DocTemplates.Internal.Resolved a)
+ Text.DocTemplates.Internal: instance Data.Foldable.Foldable Text.DocTemplates.Internal.Resolved
+ Text.DocTemplates.Internal: instance Data.Traversable.Traversable Text.DocTemplates.Internal.Resolved
+ Text.DocTemplates.Internal: instance GHC.Base.Functor Text.DocTemplates.Internal.Resolved
+ Text.DocTemplates.Internal: instance GHC.Base.Monoid (Text.DocTemplates.Internal.Resolved a)
+ Text.DocTemplates.Internal: instance GHC.Base.Semigroup (Text.DocTemplates.Internal.Resolved a)
+ Text.DocTemplates.Internal: instance GHC.Classes.Eq a => GHC.Classes.Eq (Text.DocTemplates.Internal.Resolved a)
+ Text.DocTemplates.Internal: instance GHC.Classes.Ord a => GHC.Classes.Ord (Text.DocTemplates.Internal.Resolved a)
+ Text.DocTemplates.Internal: instance GHC.Generics.Generic (Text.DocTemplates.Internal.Resolved a)
+ Text.DocTemplates.Internal: instance GHC.Read.Read a => GHC.Read.Read (Text.DocTemplates.Internal.Resolved a)
+ Text.DocTemplates.Internal: instance GHC.Show.Show a => GHC.Show.Show (Text.DocTemplates.Internal.Resolved a)

Files

README.md view
@@ -126,9 +126,16 @@ matched delimiters) and ends with `endif` (enclosed in matched delimiters).  It may optionally contain an `else` (enclosed in matched delimiters).  The `if` section is used if-`variable` has a non-empty value, otherwise the `else`-section is used (if present).  (Note that even the-string `false` counts as a true value.) Examples:+`variable` has a true value, otherwise the `else`+section is used (if present).  The following values+count as true:++- any map+- any array containing at least one true value+- any nonempty string (even `false`)+- boolean True++Examples:  ``` $if(foo)$bar$endif$
changelog.md view
@@ -1,5 +1,18 @@ # doctemplates +## 0.10++  * Change rendering and conditional behavior with booleans.+    Previously, `$if(foo)$` evaluated to false iff `foo`+    would render as the empty string. This forced us to render+    a boolean False value as an empty string, rather than `false`.+    And this has caused various problems with templates+    (#16, jgm/pandoc#7402).  Now, boolean False values render as+    `false` -- just as True values render as `true`.  And conditionals+    are now sensitive to booleans, so `$if(foo)$` evaluates to false+    when `foo` is a boolean False value, even though it would render+    as the nonempty string `false`.+ ## 0.9    * Add BoolVal constructor to Val.  This gives a smoother
doctemplates.cabal view
@@ -1,5 +1,5 @@ name:                doctemplates-version:             0.9+version:             0.10 synopsis:            Pandoc-style document templates description:         This is the text templating system used by pandoc.                      It supports variable interpolation, iteration,
src/Text/DocTemplates.hs view
@@ -104,6 +104,8 @@     verbatim. (Note that no escaping is done; the assumption is that the     calling program will escape the strings appropriately for the output     format.)+-   If the value of the variable is a boolean value, it will be rendered+    as @true@ if true, or as empty if false. -   If the value is a list, the values will be concatenated. -   If the value is a map, the string @true@ will be rendered. -   Every other value will be rendered as the empty string.@@ -113,17 +115,21 @@  -   If the value is a number, it will be rendered as an integer if     possible, otherwise as a floating-point number.--   If the value is a JSON boolean, it will be rendered as @true@ if-    true, and as the empty string if false.  == Conditionals  A conditional begins with @if(variable)@ (enclosed in matched delimiters) and ends with @endif@ (enclosed in matched delimiters). It may optionally contain an @else@ (enclosed in matched delimiters). The-@if@ section is used if @variable@ has a non-empty value, otherwise the-@else@ section is used (if present). (Note that even the string @false@-counts as a true value.) Examples:+@if@ section is used if @variable@ has a true value, otherwise the+@else@ section is used (if present). The following values count as true:++-   any map+-   any array containing at least one true value+-   any nonempty string (even @false@)+-   boolean True++Examples:  > $if(foo)$bar$endif$ >
src/Text/DocTemplates/Internal.hs view
@@ -396,20 +396,34 @@     Just v' -> multiLookup vs v' multiLookup _ _ = NullVal -resolveVariable :: TemplateTarget a => Variable -> Context a -> [Doc a]+-- The Bool indicates whether it's a true or false value.+data Resolved a = Resolved Bool [Doc a]+   deriving (Show, Read, Data, Typeable, Generic, Eq, Ord,+             Foldable, Traversable, Functor)++instance Semigroup (Resolved a) where+  Resolved b1 x1 <> Resolved b2 x2 = Resolved (b1 || b2) (x1 <> x2)++instance Monoid (Resolved a) where+  mappend = (<>)+  mempty = Resolved False []++resolveVariable :: TemplateTarget a+                => Variable -> Context a -> Resolved a resolveVariable v ctx = resolveVariable' v (MapVal ctx) -resolveVariable' :: TemplateTarget a => Variable -> Val a -> [Doc a]+resolveVariable' :: TemplateTarget a+                 => Variable -> Val a -> Resolved a resolveVariable' v val =   case applyPipes (varPipes v) $ multiLookup (varParts v) val of-    ListVal xs    -> concatMap (resolveVariable' mempty) xs+    ListVal xs    -> mconcat $ map (resolveVariable' mempty) xs     SimpleVal d-      | DL.isEmpty d -> []-      | otherwise    -> [removeFinalNl d]-    MapVal _      -> ["true"]-    BoolVal True  -> ["true"]-    BoolVal False -> []-    NullVal       -> []+      | DL.isEmpty d -> Resolved False []+      | otherwise    -> Resolved True [removeFinalNl d]+    MapVal _      -> Resolved True ["true"]+    BoolVal True  -> Resolved True ["true"]+    BoolVal False -> Resolved False ["false"]+    NullVal       -> Resolved False []  removeFinalNl :: Doc a -> Doc a removeFinalNl DL.NewLine        = mempty@@ -455,11 +469,12 @@            => Template a -> Context a -> RenderState (Doc a) renderTemp (Literal t) _ = updateColumn t renderTemp (Interpolate v) ctx =-  updateColumn $ mconcat $ resolveVariable v ctx+  case resolveVariable v ctx of+    Resolved _ xs -> updateColumn (mconcat xs) renderTemp (Conditional v ift elset) ctx =   case resolveVariable v ctx of-    [] -> renderTemp elset ctx-    _  -> renderTemp ift ctx+    Resolved False _ -> renderTemp elset ctx+    Resolved True _  -> renderTemp ift ctx renderTemp (Iterate v t sep) ctx = do   xs <- withVariable v ctx (renderTemp t)   sep' <- renderTemp sep ctx
test/boolean.test view
@@ -8,6 +8,6 @@ $if(bar)$XXX$else$YYY$endif$ . true-+false XXX YYY