yesod-static 1.5.2 → 1.5.3
raw patch · 3 files changed
+69/−5 lines, 3 files
Files
- ChangeLog.md +5/−0
- Yesod/Static.hs +63/−4
- yesod-static.cabal +1/−1
ChangeLog.md view
@@ -1,3 +1,8 @@+## 1.5.3++* Add `staticFilesMap` function+* Add `staticFilesMergeMap` function+ ## 1.5.2 * Fix test case for CRLF line endings
Yesod/Static.hs view
@@ -51,6 +51,8 @@ -- * Template Haskell helpers , staticFiles , staticFilesList+ , staticFilesMap+ , staticFilesMergeMap , publicFiles -- * Hashing , base64md5@@ -62,6 +64,7 @@ ) where import System.Directory+import qualified System.FilePath as FP import Control.Monad import Data.FileEmbed (embedDir) @@ -246,7 +249,7 @@ -- files @\"static\/js\/jquery.js\"@ and -- @\"static\/css\/normalize.css\"@, you would use: ----- > staticFilesList \"static\" [\"js\/jquery.js\", \"css\/normalize.css\"]+-- > staticFilesList "static" ["js/jquery.js", "css/normalize.css"] -- -- This can be useful when you have a very large number of static -- files, but only need to refer to a few of them from Haskell.@@ -273,7 +276,54 @@ publicFiles :: FilePath -> Q [Dec] publicFiles dir = mkStaticFiles' dir False +-- | Similar to 'staticFilesList', but takes a mapping of+-- unmunged names to fingerprinted file names.+--+-- @since 1.5.3+staticFilesMap :: FilePath -> M.Map FilePath FilePath -> Q [Dec]+staticFilesMap fp m = mkStaticFilesList' fp (map splitBoth mapList) True+ where+ splitBoth (k, v) = (split k, split v)+ mapList = M.toList m+ split :: FilePath -> [String]+ split [] = []+ split x =+ let (a, b) = break (== '/') x+ in a : split (drop 1 b) +-- | Similar to 'staticFilesMergeMap', but also generates identifiers+-- for all files in the specified directory that don't have a+-- fingerprinted version.+--+-- @since 1.5.3+staticFilesMergeMap :: FilePath -> M.Map FilePath FilePath -> Q [Dec]+staticFilesMergeMap fp m = do+ fs <- qRunIO $ getFileListPieces fp+ let filesList = map FP.joinPath fs+ mergedMapList = M.toList $ foldl' (checkedInsert invertedMap) m filesList+ mkStaticFilesList' fp (map splitBoth mergedMapList) True+ where+ splitBoth (k, v) = (split k, split v)+ swap (x, y) = (y, x)+ mapList = M.toList m+ invertedMap = M.fromList $ map swap mapList+ split :: FilePath -> [String]+ split [] = []+ split x =+ let (a, b) = break (== '/') x+ in a : split (drop 1 b)+ -- We want to keep mappings for all files that are pre-fingerprinted,+ -- so this function checks against all of the existing fingerprinted files and+ -- only inserts a new mapping if it's not a fingerprinted file.+ checkedInsert+ :: M.Map FilePath FilePath -- inverted dictionary+ -> M.Map FilePath FilePath -- accumulating state+ -> FilePath+ -> M.Map FilePath FilePath+ checkedInsert iDict st p = if M.member p iDict+ then st+ else M.insert p p st+ mkHashMap :: FilePath -> IO (M.Map FilePath S8.ByteString) mkHashMap dir = do fs <- getFileListPieces dir@@ -330,7 +380,16 @@ -> [[String]] -- ^ list of files to create identifiers for -> Bool -- ^ append checksum query parameter -> Q [Dec]-mkStaticFilesList fp fs makeHash = do+mkStaticFilesList fp fs makeHash = mkStaticFilesList' fp (zip fs fs) makeHash++mkStaticFilesList'+ :: FilePath -- ^ static directory+ -> [([String], [String])] -- ^ list of files to create identifiers for, where+ -- the first argument of the tuple is the identifier+ -- alias and the second is the actual file name+ -> Bool -- ^ append checksum query parameter+ -> Q [Dec]+mkStaticFilesList' fp fs makeHash = do concat `fmap` mapM mkRoute fs where replace' c@@ -338,8 +397,8 @@ | 'a' <= c && c <= 'z' = c | '0' <= c && c <= '9' = c | otherwise = '_'- mkRoute f = do- let name' = intercalate "_" $ map (map replace') f+ mkRoute (alias, f) = do+ let name' = intercalate "_" $ map (map replace') alias routeName = mkName $ case () of ()
yesod-static.cabal view
@@ -1,5 +1,5 @@ name: yesod-static-version: 1.5.2+version: 1.5.3 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>