glabrous 0.1.0.0 → 0.1.0.1
raw patch · 4 files changed
+37/−9 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Text.Glabrous: Partial :: Template -> [Tag] -> Result
+ Text.Glabrous: Partial :: !Template -> ![Tag] -> Result
- Text.Glabrous: Template :: [Token] -> Template
+ Text.Glabrous: Template :: ![Token] -> Template
- Text.Glabrous: [content] :: Template -> [Token]
+ Text.Glabrous: [content] :: Template -> ![Token]
- Text.Glabrous: [tags] :: Result -> [Tag]
+ Text.Glabrous: [tags] :: Result -> ![Tag]
- Text.Glabrous: [template] :: Result -> Template
+ Text.Glabrous: [template] :: Result -> !Template
- Text.Glabrous.Types: Partial :: Template -> [Tag] -> Result
+ Text.Glabrous.Types: Partial :: !Template -> ![Tag] -> Result
- Text.Glabrous.Types: Template :: [Token] -> Template
+ Text.Glabrous.Types: Template :: ![Token] -> Template
- Text.Glabrous.Types: [content] :: Template -> [Token]
+ Text.Glabrous.Types: [content] :: Template -> ![Token]
- Text.Glabrous.Types: [tags] :: Result -> [Tag]
+ Text.Glabrous.Types: [tags] :: Result -> ![Tag]
- Text.Glabrous.Types: [template] :: Result -> Template
+ Text.Glabrous.Types: [template] :: Result -> !Template
Files
- glabrous.cabal +1/−1
- src/Text/Glabrous.hs +19/−2
- src/Text/Glabrous/Types.hs +2/−2
- tests/hspec.hs +15/−4
glabrous.cabal view
@@ -1,5 +1,5 @@ name: glabrous-version: 0.1.0.0+version: 0.1.0.1 synopsis: A template library description: A minimalistic, Mustache-like syntax, truly logic-less, pure Text template library
src/Text/Glabrous.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE BangPatterns #-} -- | A minimalistic Mustache-like syntax, truly logic-less, -- pure 'T.Text' template library@@ -89,7 +90,7 @@ fromList ts = Context { variables = H.fromList ts } -- | Extract 'Tag's from a 'Template' and build--- a 'Context' with all its empty variables.+-- a 'Context' with all its variables empty. fromTemplate :: Template -> Context fromTemplate t = setVariables ((\e -> (e,T.empty)) <$> tagsOf t) initContext @@ -98,11 +99,27 @@ readContextFile f = decode <$> L.readFile f -- | Write a 'Context' to a file.+--+-- @+-- {+-- "something": "something else"+-- "etc.": "...",+-- }+-- @+-- writeContextFile :: FilePath -> Context -> IO () writeContextFile f c = L.writeFile f $ encodePretty c -- | Based on the given 'Context', write a -- 'Context' file with all its variables empty.+--+-- @+-- {+-- "something": ""+-- "etc.": "",+-- }+-- @+-- initContextFile :: FilePath -> Context -> IO () initContextFile f Context{..} = L.writeFile f $ encodePretty Context { variables = H.map (const T.empty) variables }@@ -200,7 +217,7 @@ (f,[]) -> Final $ toTextWithContext (const T.empty) c (content f) (p,p') -> G.Partial p p' where- trans (c',ts) t' =+ trans (!c',ts) t' = case t' of Tag k -> case H.lookup k variables of
src/Text/Glabrous/Types.hs view
@@ -8,7 +8,7 @@ data Token = Tag T.Text | Literal T.Text deriving (Show,Eq) -data Template = Template { content :: [Token] } deriving (Show,Eq)+data Template = Template { content :: ![Token] } deriving (Show,Eq) data Context = Context { variables :: H.HashMap T.Text T.Text } deriving (Show,Eq) @@ -24,5 +24,5 @@ type Tag = T.Text -data Result = Final T.Text | Partial { template :: Template, tags :: [Tag]} deriving (Show,Eq)+data Result = Final T.Text | Partial { template :: !Template, tags :: ![Tag]} deriving (Show,Eq)
tests/hspec.hs view
@@ -10,6 +10,9 @@ import Text.Glabrous import Text.Glabrous.Types +templateText :: Text+templateText = "Affirmanti incumbit probatio. Lorem {{ipsum}} dolor sit amet, consectetur adipiscing elit. Proin bibendum mauris vitae dui venenatis pretium. Maecenas vestibulum justo at accumsan mattis. Nulla id finibus sem. Cras dolor nunc, consectetur in tincidunt id, facilisis in lorem. Nullam sed eros venenatis, tempor felis in, ultrices enim. Donec sit amet ligula ac orci cursus finibus ut eget lectus. Praesent feugiat massa non mi venenatis faucibus. Proin sollicitudin ultrices sapien, eu venenatis purus sollicitudin vel. Donec maximus id ligula in {congue}. Ut neque erat, dictum vehicula justo vel, dapibus facilisis est. Proin elementum finibus magna. Maecenas varius ultrices arcu, et auctor lectus egestas nec. Nulla facilisi. Donec eros urna, mattis viverra dapibus et, aliquet vel {{tortor}}. Etiam rutrum lacinia turpis, vitae faucibus nibh pharetra gravida.\n\nVivamus venenatis nec sapien eu rutrum. Mauris {{lectus}} tortor, suscipit eget tristique in, finibus a augue. Nulla euismod fermentum ligula, eget viverra eros porttitor eget. Integer lacinia id libero vitae laoreet. Vivamus sit amet molestie mi, in posuere diam. Nulla ornare luctus diam, at sodales neque porta ac. Nunc mi lectus, imperdiet in lorem pretium, volutpat {{vehicula}} sem. Aliquam quis orci eu nisl consequat bibendum. Fusce efficitur {{bibendum}} tristique. Integer lacinia turpis sit amet neque imperdiet tempor. Aenean {dolor}} odio, congue sed lorem nec, {{condimentum}} tempor lorem. Ut maximus lorem in augue tincidunt, nec dapibus erat luctus. Vivamus varius vitae lacus sed elementum. Nulla feugiat porttitor dictum. Donec posuere nisl at tincidunt gravida. Fusce semper maximus metus sit amet tempus. Quisque tempus neque ligula, efficitur molestie quam convallis vel. Donec porttitor rutrum {{tellus}}, vel faucibus felis dapibus at. Mauris id tortor {{faucibus}}, tempus velit sit amet, pretium tellus. Aliquam luctus mauris dui,{{cursus}} volutpat quam egestas vel. In vel neque eu eros efficitur aliquam. Donec efficitur tortor massa. Praesent molestie enim justo, ac gravida enim tristique nec. In non rutrum mi. Morbi viverra, mi vestibulum gravida iaculis, nulla ipsum fringilla nisl, at vestibulum nisl neque at est. Proin viverra varius nisi, quis tincidunt odio suscipit nec. Vestibulum nisi justo, fermentum {{commodo}} accumsan id, dictum dictum felis. Fusce rutrum suscipit urna in ornare. Duis volutpat arcu et rutrum pulvinar. Vestibulum mattis scelerisque ligula, ut fermentum ligula. Fusce ut semper ipsum, at {{vestibulum}} felis. Ut semper turpis sit amet diam commodo bibendum. Ut vulputate quam nec massa pretium, vitae sodales quam ultrices. Fusce imperdiet mi sed maximus {{lobortis}}. Donec nulla quam, luctus a placerat vel, scelerisque et lacus. Nulla sagittis ipsum ac viverra eleifend. Praesent et sem ut erat ornare rutrum. Praesent ullamcorper dolor nunc, nec aliquam massa varius sed.\n\nUt luctus ante ut venenatis blandit. Aenean cursus leo non finibus cursus. Suspendisse sed enim hendrerit neque {{fermentum}} rutrum eu ut nulla. Curabitur consequat orci quam, et condimentum lacus rutrum interdum. In in {{maximus}} eros. Duis rhoncus nisi at volutpat aliquam. Quisque vestibulum {{venenatis}} nisi, sed {{sagittis}} est ultrices ut. Morbi quis ipsum {{vitae}} erat mollis egestas nec viverra diam. Aenean imperdiet vestibulum risus vel bibendum. Aenean eget augue luctus, congue erat vel, hendrerit nunc. Ut metus risus, viverra non varius in, {{rhoncus}} sed. Fabricando fit faber."+ variablesList :: [(Text,Text)] variablesList = [("ipsum","IPSUM"),("lobortis","LOBORTIS"),("condimentum","CONDIMENTUM"),("maximus","MAXIMUS"),("sagittis","SAGITTIS"),("vestibulum","VESTIBULUM"),("cursus","CURSUS"),("vehicula","VEHICULA"),("faucibus","FAUCILUS"),("vitae","VITAE"),("tellus","TELLUS"),("lectus","LECTUS")] @@ -29,14 +32,20 @@ contextFile = "./tests/template.json" clean :: IO ()-clean = removeFile contextFile+clean = do+ removeFile contextFile+ removeFile templateFile main :: IO () main = hspec $ do + describe "writeTemplateFile" $+ it "write a template to a file as it is" $+ writeTemplateFile templateFile $ fromRight' $ fromText templateText+ describe "readTemplateFile" $ it "loads a template from a file" $ do- readTemplateFile "./tests/template" `shouldReturn` Right (Template {content = [Literal "Affirmanti incumbit probatio. Lorem ",Tag "ipsum",Literal " dolor sit amet, consectetur adipiscing elit. Proin bibendum mauris vitae dui venenatis pretium. Maecenas vestibulum justo at accumsan mattis. Nulla id finibus sem. Cras dolor nunc, consectetur in tincidunt id, facilisis in lorem. Nullam sed eros venenatis, tempor felis in, ultrices enim. Donec sit amet ligula ac orci cursus finibus ut eget lectus. Praesent feugiat massa non mi venenatis faucibus. Proin sollicitudin ultrices sapien, eu venenatis purus sollicitudin vel. Donec maximus id ligula in ",Literal "{",Literal "congue",Literal "}",Literal ". Ut neque erat, dictum vehicula justo vel, dapibus facilisis est. Proin elementum finibus magna. Maecenas varius ultrices arcu, et auctor lectus egestas nec. Nulla facilisi. Donec eros urna, mattis viverra dapibus et, aliquet vel ",Tag "tortor",Literal ". Etiam rutrum lacinia turpis, vitae faucibus nibh pharetra gravida.\n\nVivamus venenatis nec sapien eu rutrum. Mauris ",Tag "lectus",Literal " tortor, suscipit eget tristique in, finibus a augue. Nulla euismod fermentum ligula, eget viverra eros porttitor eget. Integer lacinia id libero vitae laoreet. Vivamus sit amet molestie mi, in posuere diam. Nulla ornare luctus diam, at sodales neque porta ac. Nunc mi lectus, imperdiet in lorem pretium, volutpat ",Tag "vehicula",Literal " sem. Aliquam quis orci eu nisl consequat bibendum. Fusce efficitur ",Tag "bibendum",Literal " tristique. Integer lacinia turpis sit amet neque imperdiet tempor. Aenean ",Literal "{",Literal "dolor",Literal "}}",Literal " odio, congue sed lorem nec, ",Tag "condimentum",Literal " tempor lorem. Ut maximus lorem in augue tincidunt, nec dapibus erat luctus. Vivamus varius vitae lacus sed elementum. Nulla feugiat porttitor dictum. Donec posuere nisl at tincidunt gravida. Fusce semper maximus metus sit amet tempus. Quisque tempus neque ligula, efficitur molestie quam convallis vel. Donec porttitor rutrum ",Tag "tellus",Literal ", vel faucibus felis dapibus at. Mauris id tortor ",Tag "faucibus",Literal ", tempus velit sit amet, pretium tellus. Aliquam luctus mauris dui,",Tag "cursus",Literal " volutpat quam egestas vel. In vel neque eu eros efficitur aliquam. Donec efficitur tortor massa. Praesent molestie enim justo, ac gravida enim tristique nec. In non rutrum mi. Morbi viverra, mi vestibulum gravida iaculis, nulla ipsum fringilla nisl, at vestibulum nisl neque at est. Proin viverra varius nisi, quis tincidunt odio suscipit nec. Vestibulum nisi justo, fermentum ",Tag "commodo",Literal " accumsan id, dictum dictum felis. Fusce rutrum suscipit urna in ornare. Duis volutpat arcu et rutrum pulvinar. Vestibulum mattis scelerisque ligula, ut fermentum ligula. Fusce ut semper ipsum, at ",Tag "vestibulum",Literal " felis. Ut semper turpis sit amet diam commodo bibendum. Ut vulputate quam nec massa pretium, vitae sodales quam ultrices. Fusce imperdiet mi sed maximus ",Tag "lobortis",Literal ". Donec nulla quam, luctus a placerat vel, scelerisque et lacus. Nulla sagittis ipsum ac viverra eleifend. Praesent et sem ut erat ornare rutrum. Praesent ullamcorper dolor nunc, nec aliquam massa varius sed.\n\nUt luctus ante ut venenatis blandit. Aenean cursus leo non finibus cursus. Suspendisse sed enim hendrerit neque ",Tag "fermentum",Literal " rutrum eu ut nulla. Curabitur consequat orci quam, et condimentum lacus rutrum interdum. In in ",Tag "maximus",Literal " eros. Duis rhoncus nisi at volutpat aliquam. Quisque vestibulum ",Tag "venenatis",Literal " nisi, sed ",Tag "sagittis",Literal " est ultrices ut. Morbi quis ipsum ",Tag "vitae",Literal " erat mollis egestas nec viverra diam. Aenean imperdiet vestibulum risus vel bibendum. Aenean eget augue luctus, congue erat vel, hendrerit nunc. Ut metus risus, viverra non varius in, ",Tag "rhoncus",Literal " sed. Fabricando fit faber.\n"]})+ readTemplateFile "./tests/template" `shouldReturn` Right (Template {content = [Literal "Affirmanti incumbit probatio. Lorem ",Tag "ipsum",Literal " dolor sit amet, consectetur adipiscing elit. Proin bibendum mauris vitae dui venenatis pretium. Maecenas vestibulum justo at accumsan mattis. Nulla id finibus sem. Cras dolor nunc, consectetur in tincidunt id, facilisis in lorem. Nullam sed eros venenatis, tempor felis in, ultrices enim. Donec sit amet ligula ac orci cursus finibus ut eget lectus. Praesent feugiat massa non mi venenatis faucibus. Proin sollicitudin ultrices sapien, eu venenatis purus sollicitudin vel. Donec maximus id ligula in ",Literal "{",Literal "congue",Literal "}",Literal ". Ut neque erat, dictum vehicula justo vel, dapibus facilisis est. Proin elementum finibus magna. Maecenas varius ultrices arcu, et auctor lectus egestas nec. Nulla facilisi. Donec eros urna, mattis viverra dapibus et, aliquet vel ",Tag "tortor",Literal ". Etiam rutrum lacinia turpis, vitae faucibus nibh pharetra gravida.\n\nVivamus venenatis nec sapien eu rutrum. Mauris ",Tag "lectus",Literal " tortor, suscipit eget tristique in, finibus a augue. Nulla euismod fermentum ligula, eget viverra eros porttitor eget. Integer lacinia id libero vitae laoreet. Vivamus sit amet molestie mi, in posuere diam. Nulla ornare luctus diam, at sodales neque porta ac. Nunc mi lectus, imperdiet in lorem pretium, volutpat ",Tag "vehicula",Literal " sem. Aliquam quis orci eu nisl consequat bibendum. Fusce efficitur ",Tag "bibendum",Literal " tristique. Integer lacinia turpis sit amet neque imperdiet tempor. Aenean ",Literal "{",Literal "dolor",Literal "}}",Literal " odio, congue sed lorem nec, ",Tag "condimentum",Literal " tempor lorem. Ut maximus lorem in augue tincidunt, nec dapibus erat luctus. Vivamus varius vitae lacus sed elementum. Nulla feugiat porttitor dictum. Donec posuere nisl at tincidunt gravida. Fusce semper maximus metus sit amet tempus. Quisque tempus neque ligula, efficitur molestie quam convallis vel. Donec porttitor rutrum ",Tag "tellus",Literal ", vel faucibus felis dapibus at. Mauris id tortor ",Tag "faucibus",Literal ", tempus velit sit amet, pretium tellus. Aliquam luctus mauris dui,",Tag "cursus",Literal " volutpat quam egestas vel. In vel neque eu eros efficitur aliquam. Donec efficitur tortor massa. Praesent molestie enim justo, ac gravida enim tristique nec. In non rutrum mi. Morbi viverra, mi vestibulum gravida iaculis, nulla ipsum fringilla nisl, at vestibulum nisl neque at est. Proin viverra varius nisi, quis tincidunt odio suscipit nec. Vestibulum nisi justo, fermentum ",Tag "commodo",Literal " accumsan id, dictum dictum felis. Fusce rutrum suscipit urna in ornare. Duis volutpat arcu et rutrum pulvinar. Vestibulum mattis scelerisque ligula, ut fermentum ligula. Fusce ut semper ipsum, at ",Tag "vestibulum",Literal " felis. Ut semper turpis sit amet diam commodo bibendum. Ut vulputate quam nec massa pretium, vitae sodales quam ultrices. Fusce imperdiet mi sed maximus ",Tag "lobortis",Literal ". Donec nulla quam, luctus a placerat vel, scelerisque et lacus. Nulla sagittis ipsum ac viverra eleifend. Praesent et sem ut erat ornare rutrum. Praesent ullamcorper dolor nunc, nec aliquam massa varius sed.\n\nUt luctus ante ut venenatis blandit. Aenean cursus leo non finibus cursus. Suspendisse sed enim hendrerit neque ",Tag "fermentum",Literal " rutrum eu ut nulla. Curabitur consequat orci quam, et condimentum lacus rutrum interdum. In in ",Tag "maximus",Literal " eros. Duis rhoncus nisi at volutpat aliquam. Quisque vestibulum ",Tag "venenatis",Literal " nisi, sed ",Tag "sagittis",Literal " est ultrices ut. Morbi quis ipsum ",Tag "vitae",Literal " erat mollis egestas nec viverra diam. Aenean imperdiet vestibulum risus vel bibendum. Aenean eget augue luctus, congue erat vel, hendrerit nunc. Ut metus risus, viverra non varius in, ",Tag "rhoncus",Literal " sed. Fabricando fit faber."]}) describe "tagsOf" $ it "returns the list of tags in a template" $@@ -62,7 +71,7 @@ it "gets a Context made of unset variables of the given context" $ fromJust <$> unsetContext <$> setVariables variablesList <$> fromTemplate <$> fromRight' <$> readTemplateFile templateFile `shouldReturn` Context {variables = H.fromList [("tortor",""),("commodo",""),("fermentum",""),("rhoncus",""),("bibendum",""),("venenatis","")]} - describe "writeContextFile" $ afterAll_ clean $+ describe "writeContextFile" $ it "writes a context to a file" $ do !acontext <- fromJust <$> readContextFile contextFile writeContextFile contextFile acontext@@ -79,6 +88,8 @@ it "apply to a template with a subcontext outputs a template with its tags" $ (return $ partialProcess' template' pcontext) `shouldReturn` Partial {template = Template {content = [Literal "Affirmanti incumbit probatio. Lorem ",Literal " Dolor! ",Literal " sit amet, ",Tag "consectetur",Literal " adipiscing elit. Proin bibendum mauris ",Literal " Vitae! ",Literal " dui venenatis pretium. Maecenas vestibulum justo at accumsan ",Tag "mattis",Literal ". Nulla id finibus sem. Cras dolor nunc, consectetur in tincidunt id, facilisis in lorem. Nullam sed eros venenatis, tempor felis in, ultrices enim. Donec sit amet ligula ac orci cursus finibus ut eget lectus. Praesent feugiat massa non mi venenatis ",Literal " Faucibus! ",Literal ". Fabricando fit faber."]}, tags = ["consectetur","mattis"]} - describe "partialProcess'" $+ describe "partialProcess'" $ afterAll_ clean $ it "apply to a template with a context outputs a final text" $ (return $ partialProcess' template' context') `shouldReturn` Final "Affirmanti incumbit probatio. Lorem Dolor! sit amet, Consectetur! adipiscing elit. Proin bibendum mauris Vitae! dui venenatis pretium. Maecenas vestibulum justo at accumsan Mattis! . Nulla id finibus sem. Cras dolor nunc, consectetur in tincidunt id, facilisis in lorem. Nullam sed eros venenatis, tempor felis in, ultrices enim. Donec sit amet ligula ac orci cursus finibus ut eget lectus. Praesent feugiat massa non mi venenatis Faucibus! . Fabricando fit faber."++