diff options
| author | Miguel <m.i@gmx.at> | 2019-02-01 12:24:16 +0100 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2019-02-01 12:24:16 +0100 |
| commit | d0a2a6ed5ed787fc613f73ba74439d1beba0d1c1 (patch) | |
| tree | 360c935d6afce86332651cbec7a5e85f8be049d2 /src/WWWStaticusPlugins.hs | |
first commmit after cleanup and switching to stack
Diffstat (limited to 'src/WWWStaticusPlugins.hs')
| -rw-r--r-- | src/WWWStaticusPlugins.hs | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/WWWStaticusPlugins.hs b/src/WWWStaticusPlugins.hs new file mode 100644 index 0000000..fe17583 --- /dev/null +++ b/src/WWWStaticusPlugins.hs @@ -0,0 +1,115 @@ +module WWWStaticusPlugins + ( staticusPluginsDefault + ,staticusPluginInit + ,staticusPluginCopy + ,staticusPluginPandoc + ,staticusPluginFill + ,staticusPluginWrite + ) where + +import WWWStaticus +import qualified Data.Map.Strict as M +import qualified Data.Text as T +import System.Directory +import Control.Monad +import Data.Maybe +import Data.Either +import Data.List +import Data.List.Split +import Data.List.Utils +import Text.Pandoc + +-- +-- TODOS: +-- +-- timestamp plugin/ do not refresh if md did not change? dir timestamp? +-- +-- super `gallery and everythin` plugin, just throw images,videos, +-- zips,tars,source files,mds etc inside a folder-> gen page! +-- +-- flexible layout, main pic, secondary pics +-- +-- scale images +-- +-- asciinema, git, videos +-- +-- contact form? (use nginx log? save post request??) +-- +-- pdf plugin +-- autotranslate plugin :P +-- + +-- |little helper to get values out of a map easily +par k m = case M.lookup k m of + Just x -> x + Nothing -> error $ "key not found: "++k + +-- |A default set of plugins that you can use to kickstart your page +-- Use now, Adapt later. +staticusPluginsDefault::[StaticusPlugin] +staticusPluginsDefault=[ staticusPluginInit + ,staticusPluginCopy [".jpg",".png",".zip",".css",".js"] + ,staticusPluginPandoc + ,staticusPluginFill + ,staticusPluginWrite + ] + +-- |Creates target directory and sets basic params in map: +-- outdir +staticusPluginInit::StaticusPlugin +staticusPluginInit = StaticusPlugin "init" id runIO + where runIO m = + do when (not isHome) (createDirectory outdir) + c <- getDirList (par "path" m) + t <- getDirList (par "dir_in" m) + let menutop= concat $ map (\x->"<li class=\"navitem\"><a class=\"nav-link\" href=\""++par "dir_out" m++"/"++x++"/index.html\">"++x++"</a></li>") (menu t) + let submenu= if isHome then "" else concat $ map (\x->"<li><a href=\""++outdir++"/"++x++"/index.html\">"++x++"</a></li>") (menu c) +-- let breadcrumbs=concat brc + let breadcrumbs="" + --TODO: check top dirs until file found! add ./config + md <- readFile $ par "path" m++"/"++"index.md" + tmpl <- readFile $ par "dir_in" m++"/"++"template.html" + return $ M.union (M.fromList [ ("outdir",outdir) + ,("index.md",md) + ,("template.html",tmpl) + ,("menutop",menutop) + ,("submenu",submenu) + ,("breadcrumbs",breadcrumbs) + ]) m + where outdir = par "dir_out" m ++ "/" ++ intercalate "/" brc + brc = remUnder $ splitOn "/" (drop (length (par "dir_in" m)) (par "path" m)) + remUnder = filter (not.null) . map (dropWhile(=='_').dropWhile(/='_')) + menu = remUnder . filter (not . isPrefixOf "00_") . map (last.splitOn "/") . sortBy (flip compare) + isHome = par "path" m==par "dir_in" m + +-- |This plugin will simply copy files of given extension from source +-- to the target directory. give it a list of extensions. +staticusPluginCopy::[String]->StaticusPlugin +staticusPluginCopy ext = StaticusPlugin "copy by extension" id runIO + where runIO m = do + let tst x=or $ map ($x) (map isSuffixOf ext) + dl <- filter tst <$> listDirectory (par "path" m) + mapM_ (\x->copyFile (par "path" m++"/"++x) (par "outdir" m++"/"++x)) dl + return m + +-- |pipes 'index.md' value through pandoc and saves in 'content' +staticusPluginPandoc::StaticusPlugin +staticusPluginPandoc = StaticusPlugin "pandoc" run return + where run m = let f = runPure $ do doc <- readMarkdown def{readerExtensions=(enableExtension Ext_raw_html pandocExtensions )} $ T.pack (par "index.md" m) + writeHtml5String def doc + in M.union (M.fromList [("content",T.unpack (fromRight (T.pack "err") f))]) m + +-- |Plugin for filling the 'template.html' value with 'content' +-- and storing in 'final' +staticusPluginFill::StaticusPlugin +staticusPluginFill = StaticusPlugin "fill template" run return + where run m = M.union (M.fromList [("final", + replace "###BREADCRUMBS###" (par "breadcrumbs" m) $ replace "###SUBMENU###" (par "submenu" m) $ replace "###MENU###" (par "menutop" m) (replace "###CONTENT###" (par "content" m) (par "template.html" m)))]) m + + +-- |write final index.html file +staticusPluginWrite::StaticusPlugin +staticusPluginWrite = StaticusPlugin "writer" id runIO + where runIO m = do + writeFile ((par "outdir" m)++"/index.html") (par "final" m) + return m |
