ginger 0.3.5.1 → 0.3.5.3
raw patch · 2 files changed
+60/−36 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ginger.cabal +1/−1
- src/Text/Ginger/Run/Builtins.hs +59/−35
ginger.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: ginger-version: 0.3.5.1+version: 0.3.5.3 synopsis: An implementation of the Jinja2 template language in Haskell description: Ginger is Jinja, minus the most blatant pythonisms. Wants to be feature complete, but isn't quite there yet.
src/Text/Ginger/Run/Builtins.hs view
@@ -269,46 +269,70 @@ ] args (sortee, sortKey, sortReverse) <- case parsedArgs of- Right [sortee, sortKeyG, reverseG] ->+ Right [sortee, sortKey, reverseG] -> return ( sortee- , asText sortKeyG+ , sortKey , asBoolean reverseG ) _ -> fail "Invalid args to sort()"- let baseComparer :: GVal (Run m h) -> GVal (Run m h) -> Prelude.Ordering- baseComparer a b = Prelude.compare (asText a) (asText b)- extractKey :: Text -> GVal (Run m h) -> GVal (Run m h)- extractKey k g = fromMaybe def $ do- l <- asLookup g- l k- if isDict sortee- then do- let comparer' :: (Text, GVal (Run m h)) -> (Text, GVal (Run m h)) -> Prelude.Ordering- comparer' = case sortKey of- "" -> \(_, a) (_, b) -> baseComparer a b- "__key" -> \(a, _) (b, _) -> Prelude.compare a b- k -> \(_, a) (_, b) ->- baseComparer- (extractKey k a) (extractKey k b)- comparer =- if sortReverse- then flip comparer'- else comparer'- return . toGVal $ List.sortBy comparer (fromMaybe [] $ asDictItems sortee)- else do- let comparer' :: GVal (Run m h) -> GVal (Run m h) -> Prelude.Ordering- comparer' = case sortKey of- "" ->- baseComparer- k -> \a b ->- baseComparer- (extractKey k a) (extractKey k b)- let comparer =- if sortReverse- then flip comparer'- else comparer'- return . toGVal $ List.sortBy comparer (fromMaybe [] $ asList sortee)+ let -- extractByFunc :: Maybe ((Text, GVal (Run m h)) -> Run m h (GVal (Run m h)))+ extractByFunc = do+ f <- asFunction sortKey+ return $ \g ->+ f [(Nothing, snd g)]++ let -- extractByPath :: Maybe ((Text, GVal (Run m h)) -> Run m h (GVal (Run m h)))+ extractByPath = do+ keys <- asList sortKey+ return $ \g ->+ return $ List.foldl' (flip (lookupLooseDef def)) (snd g) keys++ extractByKey :: Monad m => Maybe ((Text, a) -> Run m h (GVal (Run m h)))+ extractByKey =+ if asText sortKey == "__key"+ then Just $ return . toGVal . fst+ else Nothing++ extractByProp =+ if isNull sortKey+ then Nothing+ else return $ return . lookupLooseDef def sortKey . snd++ extractFunc = fromMaybe (return . snd) $+ extractByFunc <|>+ extractByPath <|>+ extractByKey <|>+ extractByProp++ (pack, unpacked) =+ case (asDictItems sortee, asList sortee) of+ (Just dictItems, _) ->+ (orderedDict, dictItems)+ (Nothing, Just listItems) ->+ (toGVal . fmap snd, listToIndexedDict listItems)+ (Nothing, Nothing) ->+ (Prelude.const def, [])++ tagged <- forM unpacked $ \item -> do+ extracted <- extractFunc item+ return (asText extracted, item)+ let compare =+ onFst $ if sortReverse+ then flip Prelude.compare+ else Prelude.compare++ let sorted = pack . fmap snd $ List.sortBy compare tagged++ return sorted++onFst :: (a -> a -> b) -> (a, c) -> (a, d) -> b+onFst f (x, _) (y, _) = f x y++listToIndexedDict :: [a] -> [(Text, a)]+listToIndexedDict values =+ let indexes = fmap (Text.pack . show) [0..]+ in List.zip indexes values center :: Text -> Prelude.Int -> Text -> Text center str width pad =