installs
This commit is contained in:
		
							parent
							
								
									3d34bd4a40
								
							
						
					
					
						commit
						05dd1b23ac
					
				| 
						 | 
					@ -6,19 +6,20 @@ cabal-version:      >= 1.10
 | 
				
			||||||
executable site
 | 
					executable site
 | 
				
			||||||
  main-is:          site.hs
 | 
					  main-is:          site.hs
 | 
				
			||||||
  build-depends:    base == 4.*
 | 
					  build-depends:    base == 4.*
 | 
				
			||||||
                  , hakyll == 4.16.*
 | 
					 | 
				
			||||||
                  , filepath
 | 
					 | 
				
			||||||
                  , extra
 | 
					 | 
				
			||||||
                  , transformers
 | 
					 | 
				
			||||||
                  , containers
 | 
					                  , containers
 | 
				
			||||||
 | 
					                  , data-default
 | 
				
			||||||
 | 
					                  , extra
 | 
				
			||||||
 | 
					                  , filepath
 | 
				
			||||||
 | 
					                  , hakyll == 4.16.*
 | 
				
			||||||
 | 
					                  , microlens
 | 
				
			||||||
 | 
					                  , microlens-aeson
 | 
				
			||||||
 | 
					                  , microlens-mtl
 | 
				
			||||||
 | 
					                  , microlens-th
 | 
				
			||||||
 | 
					                  , mustache
 | 
				
			||||||
                  , pandoc
 | 
					                  , pandoc
 | 
				
			||||||
                  , pandoc-types
 | 
					                  , pandoc-types
 | 
				
			||||||
                  , microlens
 | 
					 | 
				
			||||||
                  , microlens-th
 | 
					 | 
				
			||||||
                  , microlens-mtl
 | 
					 | 
				
			||||||
                  , microlens-aeson
 | 
					 | 
				
			||||||
                  , data-default
 | 
					 | 
				
			||||||
                  , text
 | 
					                  , text
 | 
				
			||||||
 | 
					                  , transformers
 | 
				
			||||||
                  , yaml
 | 
					                  , yaml
 | 
				
			||||||
  ghc-options:      -threaded -rtsopts -with-rtsopts=-N
 | 
					  ghc-options:      -threaded -rtsopts -with-rtsopts=-N
 | 
				
			||||||
  default-language: Haskell2010
 | 
					  default-language: Haskell2010
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										61
									
								
								site.hs
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								site.hs
									
									
									
									
									
								
							| 
						 | 
					@ -6,9 +6,11 @@ import Control.Monad.IO.Class
 | 
				
			||||||
import Control.Monad.Trans.State.Lazy
 | 
					import Control.Monad.Trans.State.Lazy
 | 
				
			||||||
import Data.Default (def)
 | 
					import Data.Default (def)
 | 
				
			||||||
import Data.Foldable (traverse_)
 | 
					import Data.Foldable (traverse_)
 | 
				
			||||||
 | 
					import Data.List (nub)
 | 
				
			||||||
import Data.List.Extra (stripSuffix)
 | 
					import Data.List.Extra (stripSuffix)
 | 
				
			||||||
import qualified Data.Map as M
 | 
					import qualified Data.Map as M
 | 
				
			||||||
import Data.Maybe (isJust)
 | 
					import Data.Maybe (fromMaybe, isJust)
 | 
				
			||||||
 | 
					import Data.String (fromString)
 | 
				
			||||||
import qualified Data.Text as T
 | 
					import qualified Data.Text as T
 | 
				
			||||||
import qualified Data.Text.Encoding
 | 
					import qualified Data.Text.Encoding
 | 
				
			||||||
import qualified Data.Text.IO as TIO
 | 
					import qualified Data.Text.IO as TIO
 | 
				
			||||||
| 
						 | 
					@ -20,6 +22,7 @@ import Lens.Micro.Mtl
 | 
				
			||||||
import Lens.Micro.TH
 | 
					import Lens.Micro.TH
 | 
				
			||||||
import System.Environment (getArgs)
 | 
					import System.Environment (getArgs)
 | 
				
			||||||
import System.FilePath ((</>), splitPath)
 | 
					import System.FilePath ((</>), splitPath)
 | 
				
			||||||
 | 
					import qualified Text.Mustache as Mu
 | 
				
			||||||
import Text.Pandoc.Class (runIOorExplode)
 | 
					import Text.Pandoc.Class (runIOorExplode)
 | 
				
			||||||
import qualified Text.Pandoc.Definition
 | 
					import qualified Text.Pandoc.Definition
 | 
				
			||||||
import qualified Text.Pandoc.Extensions
 | 
					import qualified Text.Pandoc.Extensions
 | 
				
			||||||
| 
						 | 
					@ -34,17 +37,25 @@ io = liftIO
 | 
				
			||||||
just _ (Just val) = val
 | 
					just _ (Just val) = val
 | 
				
			||||||
just err Nothing = error ("Missing: " ++ err)
 | 
					just err Nothing = error ("Missing: " ++ err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					data PageInfo =
 | 
				
			||||||
 | 
					  PageInfo
 | 
				
			||||||
 | 
					    { _pagePath :: FilePath
 | 
				
			||||||
 | 
					    , _pageMeta :: Y.Value
 | 
				
			||||||
 | 
					    , _pagePandoc :: Text.Pandoc.Definition.Pandoc
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  deriving (Show)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					makeLenses ''PageInfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
data SiteState =
 | 
					data SiteState =
 | 
				
			||||||
  SiteState
 | 
					  SiteState
 | 
				
			||||||
    { _pages :: M.Map FilePath ( FilePath
 | 
					    { _pages :: M.Map FilePath PageInfo
 | 
				
			||||||
                               , Y.Value
 | 
					 | 
				
			||||||
                               , Text.Pandoc.Definition.Pandoc -- loc -> (source, meta, markdown)
 | 
					 | 
				
			||||||
                                )
 | 
					 | 
				
			||||||
    , _redirects :: M.Map FilePath FilePath -- from -> to
 | 
					    , _redirects :: M.Map FilePath FilePath -- from -> to
 | 
				
			||||||
    , _htags :: M.Map [String] [FilePath] -- tag sequence -> tagged locs
 | 
					    , _htags :: M.Map [String] [FilePath] -- tag sequence -> tagged locs
 | 
				
			||||||
    , _installs :: M.Map FilePath FilePath -- file hash -> install location
 | 
					    , _installs :: M.Map FilePath FilePath -- file hash -> install location
 | 
				
			||||||
    , _templates :: M.Map FilePath () -- TODO mustache templates
 | 
					    , _templates :: M.Map FilePath Mu.Template -- TODO mustache templates
 | 
				
			||||||
    , _outputDir :: FilePath
 | 
					    , _outputDir :: FilePath
 | 
				
			||||||
 | 
					    , _defaultTemplate :: FilePath
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  deriving (Show)
 | 
					  deriving (Show)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -58,6 +69,7 @@ emptySiteState out =
 | 
				
			||||||
    , _installs = M.empty
 | 
					    , _installs = M.empty
 | 
				
			||||||
    , _templates = M.empty
 | 
					    , _templates = M.empty
 | 
				
			||||||
    , _outputDir = out
 | 
					    , _outputDir = out
 | 
				
			||||||
 | 
					    , _defaultTemplate = "default.html"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Site a = StateT SiteState IO a
 | 
					type Site a = StateT SiteState IO a
 | 
				
			||||||
| 
						 | 
					@ -90,13 +102,39 @@ loadPage fp = do
 | 
				
			||||||
  md <- io $ runIOorExplode $ readMarkdown markdownReadOpts (T.drop 5 markdown)
 | 
					  md <- io $ runIOorExplode $ readMarkdown markdownReadOpts (T.drop 5 markdown)
 | 
				
			||||||
  let mount =
 | 
					  let mount =
 | 
				
			||||||
        T.unpack . just ("mount point of " ++ fp) $ yml ^? key "title" . _String
 | 
					        T.unpack . just ("mount point of " ++ fp) $ yml ^? key "title" . _String
 | 
				
			||||||
  pages %= M.insert mount (fp, yml, md)
 | 
					  pages %=
 | 
				
			||||||
 | 
					    M.insert mount PageInfo {_pagePath = fp, _pageMeta = yml, _pagePandoc = md}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pageTemplate :: PageInfo -> Site FilePath
 | 
				
			||||||
 | 
					pageTemplate pi = do
 | 
				
			||||||
 | 
					  dt <- use defaultTemplate
 | 
				
			||||||
 | 
					  pure . maybe dt T.unpack $ pi ^? pageMeta . key "template" . _String
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pageTemplates :: Site [FilePath]
 | 
				
			||||||
 | 
					pageTemplates = nub <$> (gets (^.. pages . traverse) >>= traverse pageTemplate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sourceTemplates :: FilePath -> Site ()
 | 
					sourceTemplates :: FilePath -> Site ()
 | 
				
			||||||
sourceTemplates _ = pure ()
 | 
					sourceTemplates templdir = do
 | 
				
			||||||
 | 
					  ts <- pageTemplates
 | 
				
			||||||
 | 
					  templs' <- fmap sequence . traverse (io . Mu.automaticCompile [templdir]) $ ts
 | 
				
			||||||
 | 
					  case templs' of
 | 
				
			||||||
 | 
					    Left err -> error $ "template compilation: " ++ show err
 | 
				
			||||||
 | 
					    Right templs -> templates .= M.fromList (zip ts templs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
installPage :: FilePath -> Site ()
 | 
					indexFilename :: FilePath -> Site FilePath
 | 
				
			||||||
installPage = undefined
 | 
					indexFilename mount = do
 | 
				
			||||||
 | 
					  od <- use outputDir
 | 
				
			||||||
 | 
					  pure (od </> mount </> "index.html")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					installPage :: FilePath -> PageInfo -> Site ()
 | 
				
			||||||
 | 
					installPage mount pi = do
 | 
				
			||||||
 | 
					  tname <- fromString <$> pageTemplate pi
 | 
				
			||||||
 | 
					  templ <- use $ templates . to (M.! tname)
 | 
				
			||||||
 | 
					  file <- indexFilename mount
 | 
				
			||||||
 | 
					  io $ do
 | 
				
			||||||
 | 
					    putStrLn $ ">>> " ++ file
 | 
				
			||||||
 | 
					    makeDirectories file
 | 
				
			||||||
 | 
					    TIO.writeFile file . Mu.substitute templ $ pi ^. pageMeta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
installFile :: FilePath -> Site FilePath
 | 
					installFile :: FilePath -> Site FilePath
 | 
				
			||||||
installFile = undefined
 | 
					installFile = undefined
 | 
				
			||||||
| 
						 | 
					@ -116,6 +154,7 @@ renderTags = undefined
 | 
				
			||||||
main = do
 | 
					main = do
 | 
				
			||||||
  [targetDir] <- getArgs
 | 
					  [targetDir] <- getArgs
 | 
				
			||||||
  flip runStateT (emptySiteState targetDir) $ do
 | 
					  flip runStateT (emptySiteState targetDir) $ do
 | 
				
			||||||
    traverse sourceTemplates ["templates"]
 | 
					 | 
				
			||||||
    traverse sourcePages ["external"]
 | 
					    traverse sourcePages ["external"]
 | 
				
			||||||
 | 
					    sourceTemplates "templates"
 | 
				
			||||||
 | 
					    use pages >>= traverse (uncurry installPage) . M.assocs
 | 
				
			||||||
    get >>= io . print
 | 
					    get >>= io . print
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,6 @@
 | 
				
			||||||
<!doctype html>
 | 
					<html>
 | 
				
			||||||
<html lang="en">
 | 
					{{> head.html}}
 | 
				
			||||||
    <head>
 | 
					 | 
				
			||||||
        <meta charset="utf-8">
 | 
					 | 
				
			||||||
        <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
					 | 
				
			||||||
        <title>My Stuffs - $title$</title>
 | 
					 | 
				
			||||||
    </head>
 | 
					 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
        <h1>$title$</h1>
 | 
					aaaaaa
 | 
				
			||||||
        $body$
 | 
					 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue