From 5b35285daa62fb9c10280fb43e340ba7b0746f5a Mon Sep 17 00:00:00 2001 From: pacien Date: Wed, 25 Dec 2019 22:48:34 +0100 Subject: compiler: add gallery config file handling --- compiler/src/Files.hs | 2 +- compiler/src/Input.hs | 13 ++++++------- compiler/src/Lib.hs | 41 +++++++++++++++++++++++++++++++++++------ 3 files changed, 42 insertions(+), 14 deletions(-) (limited to 'compiler/src') diff --git a/compiler/src/Files.hs b/compiler/src/Files.hs index 7948842..30e4b94 100644 --- a/compiler/src/Files.hs +++ b/compiler/src/Files.hs @@ -32,9 +32,9 @@ import Data.Bool (bool) import Data.List (isPrefixOf, length, deleteBy) import Data.Function ((&)) import System.Directory (doesDirectoryExist, listDirectory) + import qualified System.FilePath import qualified System.FilePath.Posix -import Utils type FileName = String diff --git a/compiler/src/Input.hs b/compiler/src/Input.hs index 78622bf..fa36d59 100644 --- a/compiler/src/Input.hs +++ b/compiler/src/Input.hs @@ -20,7 +20,8 @@ module Input - ( Sidecar, title, date, description, tags + ( decodeYamlFile + , Sidecar, title, date, description, tags , InputTree(..), readInputTree ) where @@ -42,12 +43,10 @@ import Utils data LoadException = LoadException String ParseException deriving Show instance Exception LoadException -decodeYamlFile :: (MonadIO m, FromJSON a) => Path -> m a +decodeYamlFile :: (MonadIO m, FromJSON a) => FileName -> m a decodeYamlFile path = - liftIO $ Data.Yaml.decodeFileEither fpath - >>= either (throwIO . LoadException fpath) return - where - fpath = localPath path + liftIO $ Data.Yaml.decodeFileEither path + >>= either (throwIO . LoadException path) return -- | Tree representing the input from the input directory. @@ -75,7 +74,7 @@ readInputTree (AnchoredFSNode anchor root@Dir{}) = where mkInputNode :: FSNode -> IO (Maybe InputTree) mkInputNode (File path@(filename:pathto)) | ".yaml" `isExtensionOf` filename = - decodeYamlFile (anchor /> path) + decodeYamlFile (localPath $ anchor /> path) >>= return . InputFile ((dropExtension filename):pathto) >>= return . Just mkInputNode File{} = return Nothing diff --git a/compiler/src/Lib.hs b/compiler/src/Lib.hs index bab7e9c..abdbeb7 100644 --- a/compiler/src/Lib.hs +++ b/compiler/src/Lib.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE DuplicateRecordFields, DeriveGeneric, DeriveAnyClass #-} + -- ldgallery - A static generator which turns a collection of tagged -- pictures into a searchable web gallery. -- @@ -26,23 +28,32 @@ import GHC.Generics (Generic) import Data.Function ((&)) import System.Directory (createDirectoryIfMissing) import System.FilePath (dropFileName, ()) -import Data.Aeson (ToJSON, encodeFile) +import Data.Aeson (Object, ToJSON, FromJSON, encodeFile) import Files (FileName, readDirectory) -import Input (readInputTree) +import Input (decodeYamlFile, readInputTree) import Resource (buildResourceTree) import Gallery (buildGalleryTree) -writeJSON :: ToJSON a => FileName -> a -> IO () -writeJSON path obj = - createDirectoryIfMissing True (dropFileName path) - >> encodeFile path obj +data CompilerConfig = CompilerConfig + { dummy :: Maybe String -- TODO + } deriving (Generic, FromJSON, Show) + +data GalleryConfig = GalleryConfig + { compiler :: CompilerConfig + , viewer :: Data.Aeson.Object + } deriving (Generic, FromJSON, Show) + +readConfig :: FileName -> IO GalleryConfig +readConfig = decodeYamlFile process :: FilePath -> FilePath -> IO () process inputDirPath outputDirPath = do + config <- readConfig (inputDirPath "gallery.yaml") + inputDir <- readDirectory inputDirPath putStrLn "\nINPUT DIR" putStrLn (show inputDir) @@ -60,10 +71,28 @@ process inputDirPath outputDirPath = putStrLn (show resourceTree) -- TODO: make buildResourceTree build a resource compilation strategy + -- (need to know the settings) + -- flatten the tree of resources and their strategies + -- filter resources that are already up to date + -- (or recompile everything if the config file has changed!) + -- execute in parallel + -- TODO: clean up output dir by comparing its content with the resource tree + -- aggregate both trees as list + -- compute the difference + -- sort by deepest and erase files and dirs + -- TODO: execute (in parallel) the resource compilation strategy list + -- need to find a good library for that buildGalleryTree resourceTree & writeJSON (outputDirPath "index.json") + writeJSON (outputDirPath "viewer.json") (viewer config) + + where + writeJSON :: ToJSON a => FileName -> a -> IO () + writeJSON path obj = + createDirectoryIfMissing True (dropFileName path) + >> encodeFile path obj testRun :: IO () -- cgit v1.2.3