diff options
Diffstat (limited to 'compiler/src')
-rw-r--r-- | compiler/src/Lib.hs | 68 |
1 files changed, 47 insertions, 21 deletions
diff --git a/compiler/src/Lib.hs b/compiler/src/Lib.hs index 6cecfc5..e21751c 100644 --- a/compiler/src/Lib.hs +++ b/compiler/src/Lib.hs | |||
@@ -40,7 +40,7 @@ import Data.Text (Text, empty, pack) | |||
40 | import Data.Yaml (ParseException, decodeFileEither) | 40 | import Data.Yaml (ParseException, decodeFileEither) |
41 | import Data.Aeson | 41 | import Data.Aeson |
42 | 42 | ||
43 | import System.FilePath (isExtensionOf) | 43 | import System.FilePath ((</>), dropFileName, dropExtension, isExtensionOf) |
44 | import qualified System.FilePath.Posix (joinPath) | 44 | import qualified System.FilePath.Posix (joinPath) |
45 | import System.Directory.Tree | 45 | import System.Directory.Tree |
46 | import System.Directory | 46 | import System.Directory |
@@ -147,44 +147,70 @@ joinURLPath :: [FileName] -> Text | |||
147 | joinURLPath = pack . System.FilePath.Posix.joinPath | 147 | joinURLPath = pack . System.FilePath.Posix.joinPath |
148 | 148 | ||
149 | 149 | ||
150 | toItemTree :: (MonadIO m) => FilePath -> FilePath -> DirTree SidecarItemMetadata -> m Item | 150 | toItemTree :: (MonadIO m) => FilePath -> FilePath -> DirTree SidecarItemMetadata -> m (Item, DirTree SidecarItemMetadata) |
151 | toItemTree itemsDir thumbnailsDir = nodeToItem [] | 151 | toItemTree itemsDir thumbnailsDir = nodeToItem [] |
152 | where | 152 | where |
153 | nodeToItem pathTo d@(Dir dname dcontents) = | 153 | nodeToItem pathTo d@(Dir dname dcontents) = |
154 | mapM (nodeToItem path) dcontents | 154 | mapM (nodeToItem path) dcontents |
155 | >>= \items -> return Item | 155 | >>= return . unzip |
156 | { title = pack dname | 156 | >>= \(items, _) -> return |
157 | , date = empty | 157 | ( Item |
158 | , description = empty | 158 | { title = pack dname |
159 | , tags = aggregateTags items | 159 | , date = empty |
160 | , path = joinURLPath $ itemsDir:path | 160 | , description = empty |
161 | , thumbnail = Nothing | 161 | , tags = aggregateTags items |
162 | , properties = Directory { items = items } } | 162 | , path = joinURLPath $ itemsDir:path |
163 | , thumbnail = Nothing | ||
164 | , properties = Directory { items = items } } | ||
165 | , d) | ||
163 | where | 166 | where |
164 | path = pathTo ++ [dname] | 167 | path = pathTo ++ [dname] |
165 | aggregateTags = unique . concatMap (\item -> tags (item::Item)) | 168 | aggregateTags = unique . concatMap (\item -> tags (item::Item)) |
166 | 169 | ||
167 | nodeToItem pathTo f@(File fname metadata) = | 170 | nodeToItem pathTo f@(File fname metadata) = |
168 | return Item | 171 | return |
169 | { title = optMeta title (pack fname) | 172 | ( Item |
170 | , date = optMeta date empty -- TODO: check and normalise dates | 173 | { title = optMeta title $ pack $ dropExtension fname |
171 | , description = optMeta description empty | 174 | , date = optMeta date empty -- TODO: check and normalise dates |
172 | , tags = optMeta tags [] | 175 | , description = optMeta description empty |
173 | , path = joinURLPath $ itemsDir:path | 176 | , tags = optMeta tags [] |
174 | , thumbnail = Just $ joinURLPath $ thumbnailsDir:path | 177 | , path = joinURLPath $ itemsDir:path |
175 | , properties = Unknown } -- TODO | 178 | , thumbnail = Just $ joinURLPath $ thumbnailsDir:path |
179 | , properties = Unknown } -- TODO | ||
180 | , f) | ||
176 | where | 181 | where |
177 | path = pathTo ++ [fname] | 182 | path = pathTo ++ [fname] |
178 | optMeta get fallback = fromMaybe fallback $ get (metadata::SidecarItemMetadata) | 183 | optMeta get fallback = fromMaybe fallback $ get (metadata::SidecarItemMetadata) |
179 | 184 | ||
180 | 185 | ||
186 | unrooted :: AnchoredDirTree a -> DirTree a | ||
187 | unrooted t = (dirTree t) { name = "" } | ||
188 | |||
189 | |||
190 | writeJSON :: ToJSON a => FilePath -> a -> IO () | ||
191 | writeJSON path obj = | ||
192 | createDirectoryIfMissing True (dropFileName path) | ||
193 | >> Data.Aeson.encodeFile path obj | ||
194 | |||
195 | |||
196 | infixl 1 >>>>>> | ||
197 | (>>>>>>) :: Monad m => m a -> (a -> m b) -> m a | ||
198 | a >>>>>> f = a >>= f >>= return a | ||
199 | |||
200 | |||
181 | process :: FilePath -> FilePath -> IO () | 201 | process :: FilePath -> FilePath -> IO () |
182 | process inputDir outputDir = | 202 | process inputDir outputDir = |
183 | readDirectoryWith return inputDir | 203 | readDirectoryWith return inputDir |
184 | >>= metadataDirTree . dirTree | 204 | >>= return . unrooted |
185 | >>= toItemTree "items" "thumbnails" | 205 | >>= metadataDirTree |
186 | >>= return . show . toEncoding | 206 | >>= toItemTree itemsDir thumbnailsDir |
207 | >>>>>> writeJSON (outputDir </> indexFile) . fst | ||
208 | >>= return . show . toEncoding . fst | ||
187 | >>= liftIO . putStrLn | 209 | >>= liftIO . putStrLn |
210 | where | ||
211 | itemsDir = "items" | ||
212 | thumbnailsDir = "thumbnails" | ||
213 | indexFile = "index.json" | ||
188 | 214 | ||
189 | 215 | ||
190 | testRun :: IO () | 216 | testRun :: IO () |