site: commit and use hakyll-std, a generic site builder
This commit is contained in:
		
							parent
							
								
									7d81ca0e8f
								
							
						
					
					
						commit
						f788c53217
					
				
							
								
								
									
										24
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								Makefile
									
									
									
									
									
								
							| @ -817,19 +817,27 @@ $(call def-help-subsection,DOCUMENTATION:) | |||||||
| # 	\
 | # 	\
 | ||||||
| # 	)
 | # 	)
 | ||||||
| 
 | 
 | ||||||
| site: \ | doc/site/hakyll-std hakyll-std: \ | ||||||
| 	$(call def-help,site, generate the hledger.org website with hakyll-std (a generic hakyll script) ) #olddocs | 	doc/site/hakyll-std.hs \
 | ||||||
| 	-cd doc/site; hakyll build | 	doc/site/TableOfContents.hs \
 | ||||||
|  | 	doc/site/hakyll-std.cabal \
 | ||||||
|  | 	doc/site/stack.yaml \
 | ||||||
|  | 	$(call def-help,hakyll-std, build a generic hakyll site builder script ) | ||||||
|  | 	cd doc/site; stack ghc hakyll-std | ||||||
| 
 | 
 | ||||||
| site-clean: \ | site: doc/site/hakyll-std \ | ||||||
|  | 	$(call def-help,site, generate the hledger.org website with hakyll-std ) | ||||||
|  | 	-cd doc/site; ./hakyll-std build | ||||||
|  | 
 | ||||||
|  | site-clean: doc/site/hakyll-std \ | ||||||
| 	$(call def-help,site-clean, remove hakyll-generated files (& take down the website) ) #cleanolddocs | 	$(call def-help,site-clean, remove hakyll-generated files (& take down the website) ) #cleanolddocs | ||||||
| 	-cd doc/site; hakyll clean | 	-cd doc/site; ./hakyll-std clean | ||||||
| #	rm -rf doc/site/_site/*
 | #	rm -rf doc/site/_site/*
 | ||||||
| 
 | 
 | ||||||
| # XXX hakyll preview/watch mostly don't live-update any more
 | # XXX hakyll watch & preview mostly don't live-update any more
 | ||||||
| site-preview: \ | site-preview: doc/site/hakyll-std \ | ||||||
| 	$(call def-help,site-preview, run a hakyll server to preview the website  ) #doc/site/site | 	$(call def-help,site-preview, run a hakyll server to preview the website  ) #doc/site/site | ||||||
| 	cd doc/site; hakyll preview | 	-cd doc/site; ./hakyll-std watch # -h hledger.org | ||||||
| 
 | 
 | ||||||
| # site-view: site \
 | # site-view: site \
 | ||||||
| # 	$(call def-help,site-view,\
 | # 	$(call def-help,site-view,\
 | ||||||
|  | |||||||
							
								
								
									
										30
									
								
								doc/site/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								doc/site/LICENSE
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | Copyright (c) 2015 | ||||||
|  | 
 | ||||||
|  | All rights reserved. | ||||||
|  | 
 | ||||||
|  | Redistribution and use in source and binary forms, with or without | ||||||
|  | modification, are permitted provided that the following conditions are met: | ||||||
|  | 
 | ||||||
|  |     * Redistributions of source code must retain the above copyright | ||||||
|  |       notice, this list of conditions and the following disclaimer. | ||||||
|  | 
 | ||||||
|  |     * Redistributions in binary form must reproduce the above | ||||||
|  |       copyright notice, this list of conditions and the following | ||||||
|  |       disclaimer in the documentation and/or other materials provided | ||||||
|  |       with the distribution. | ||||||
|  | 
 | ||||||
|  |     * Neither the name of Your name here nor the names of other | ||||||
|  |       contributors may be used to endorse or promote products derived | ||||||
|  |       from this software without specific prior written permission. | ||||||
|  | 
 | ||||||
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
							
								
								
									
										2
									
								
								doc/site/Setup.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								doc/site/Setup.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | import Distribution.Simple | ||||||
|  | main = defaultMain | ||||||
							
								
								
									
										82
									
								
								doc/site/TableOfContents.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								doc/site/TableOfContents.hs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,82 @@ | |||||||
|  | {-# LANGUAGE OverloadedStrings #-} | ||||||
|  | -- from https://github.com/blaenk/blaenk.github.io | ||||||
|  | 
 | ||||||
|  | module TableOfContents ( | ||||||
|  |   tableOfContents, | ||||||
|  |   ignoreTOC, | ||||||
|  |   collectHeaders, | ||||||
|  |   removeTOCMarker | ||||||
|  | ) where | ||||||
|  | 
 | ||||||
|  | import Text.Pandoc | ||||||
|  | import Text.Pandoc.Walk (walk, query) | ||||||
|  | 
 | ||||||
|  | import Data.List (groupBy) | ||||||
|  | import Data.Tree (Forest, Tree(Node)) | ||||||
|  | import Data.Monoid ((<>), mconcat) | ||||||
|  | import Data.Function (on) | ||||||
|  | import Data.Maybe (fromMaybe) | ||||||
|  | 
 | ||||||
|  | import Text.Blaze.Html (preEscapedToHtml, (!)) | ||||||
|  | import Text.Blaze.Html.Renderer.String (renderHtml) | ||||||
|  | import qualified Text.Blaze.Html5 as H | ||||||
|  | import qualified Text.Blaze.Html5.Attributes as A | ||||||
|  | 
 | ||||||
|  | headerLevel :: Block -> Int | ||||||
|  | headerLevel (Header level _ _) = level | ||||||
|  | headerLevel _ = error "not a header" | ||||||
|  | 
 | ||||||
|  | ignoreTOC :: Block -> Block | ||||||
|  | ignoreTOC (Header level (ident, classes, params) inline) = | ||||||
|  |   Header level (ident, "notoc" : classes, params) inline | ||||||
|  | ignoreTOC x = x | ||||||
|  | 
 | ||||||
|  | removeTOCMarker :: Block -> Block | ||||||
|  | removeTOCMarker (BulletList (( (( Plain ((Str "toc"):_)):_)):_)) = Null | ||||||
|  | removeTOCMarker x = x | ||||||
|  | 
 | ||||||
|  | collectHeaders :: Block -> [Block] | ||||||
|  | collectHeaders header@(Header _ (_, classes, _) _) = | ||||||
|  |   if "notoc" `elem` classes | ||||||
|  |     then [] | ||||||
|  |     else [header] | ||||||
|  | collectHeaders _ = [] | ||||||
|  | 
 | ||||||
|  | groupByHierarchy :: [Block] -> Forest Block | ||||||
|  | groupByHierarchy = map (\(x:xs) -> Node x (groupByHierarchy xs)) . groupBy ((<) `on` headerLevel) | ||||||
|  | 
 | ||||||
|  | markupHeader :: Tree Block -> H.Html | ||||||
|  | markupHeader (Node (Header _ (ident, _, keyvals) inline) headers) | ||||||
|  |   | headers == [] = H.li $ link | ||||||
|  |   | otherwise     = H.li $ link <> (H.ol $ markupHeaders headers) | ||||||
|  |   where render x  = writeHtmlString def (Pandoc nullMeta [(Plain x)]) | ||||||
|  |         section   = fromMaybe (render inline) (lookup "toc" keyvals) | ||||||
|  |         link      = H.a ! A.href (H.toValue $ "#" ++ ident) $ preEscapedToHtml section | ||||||
|  | markupHeader _ = error "what" | ||||||
|  | 
 | ||||||
|  | markupHeaders :: Forest Block -> H.Html | ||||||
|  | markupHeaders = mconcat . map markupHeader | ||||||
|  | 
 | ||||||
|  | createTable :: Forest Block -> H.Html | ||||||
|  | createTable headers = | ||||||
|  |   (H.nav ! A.id "toc") $ do | ||||||
|  |     H.p "Contents" | ||||||
|  |     H.ol $ markupHeaders headers | ||||||
|  | 
 | ||||||
|  | generateTOC :: [Block] -> String -> Block -> Block | ||||||
|  | generateTOC [] _     x = x | ||||||
|  | generateTOC headers alignment x@(BulletList (( (( Plain ((Str "toc"):_)):_)):_)) | ||||||
|  |   | alignment == "right" = render . (! A.class_ "right-toc") . table $ headers | ||||||
|  |   | alignment == "left"  = render . table $ headers | ||||||
|  |   | otherwise            = x | ||||||
|  |   where render = (RawBlock "html") . renderHtml | ||||||
|  |         table  = createTable . groupByHierarchy | ||||||
|  | generateTOC _ _ x = x | ||||||
|  | 
 | ||||||
|  | tableOfContents :: String -> Pandoc -> Pandoc | ||||||
|  | tableOfContents alignment ast = | ||||||
|  |   if alignment /= "off" | ||||||
|  |     then let headers = query collectHeaders ast | ||||||
|  |          in walk (generateTOC headers alignment) ast | ||||||
|  |     else walk ignoreTOC ast | ||||||
|  | 
 | ||||||
							
								
								
									
										39
									
								
								doc/site/hakyll-std.cabal
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								doc/site/hakyll-std.cabal
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | name:                hakyll-std | ||||||
|  | version:             0.1.0 | ||||||
|  | synopsis:            Generic hakyll site builder script. | ||||||
|  | description:         Generic hakyll site builder script. | ||||||
|  | homepage:            http://github.com/simonmichael/hledger | ||||||
|  | license:             BSD3 | ||||||
|  | license-file:        LICENSE | ||||||
|  | author:              Simon Michael | ||||||
|  | maintainer:          simon@joyful.com | ||||||
|  | -- copyright:            | ||||||
|  | category:            Web | ||||||
|  | build-type:          Simple | ||||||
|  | -- extra-source-files:   | ||||||
|  | cabal-version:       >=1.10 | ||||||
|  | 
 | ||||||
|  | -- library | ||||||
|  | --   hs-source-dirs:      src | ||||||
|  | --   build-depends:       base >= 4.7 && < 5 | ||||||
|  | --   default-language:    Haskell2010 | ||||||
|  | 
 | ||||||
|  | executable hakyll-std | ||||||
|  |   default-language:    Haskell2010 | ||||||
|  |   ghc-options:         -threaded -rtsopts -with-rtsopts=-N | ||||||
|  |   hs-source-dirs:      . | ||||||
|  |   main-is:             hakyll-std.hs | ||||||
|  |   other-modules:       TableOfContents | ||||||
|  |   build-depends:       base >= 4.7 && < 5 | ||||||
|  |                       ,hakyll >=4.7 | ||||||
|  |                       ,pandoc >=1.15 | ||||||
|  |                       ,pandoc-types | ||||||
|  |                       ,process | ||||||
|  |                       ,directory | ||||||
|  |                       ,data-default | ||||||
|  |                       ,blaze-html | ||||||
|  |                       ,containers | ||||||
|  | 
 | ||||||
|  | -- source-repository head | ||||||
|  | --   type:     git | ||||||
|  | --   location: https://github.com/simonmichael/hledger | ||||||
							
								
								
									
										146
									
								
								doc/site/hakyll-std.hs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										146
									
								
								doc/site/hakyll-std.hs
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,146 @@ | |||||||
|  | #!/usr/bin/env stack | ||||||
|  | -- stack --resolver nightly-2015-07-01 --install-ghc runghc --package hakyll --package pandoc | ||||||
|  | {-# LANGUAGE OverloadedStrings #-} | ||||||
|  | {- | | ||||||
|  | 
 | ||||||
|  | A simple hakyll website builder suitable for software project sites, | ||||||
|  | intended to be used as-is without recompilation. Functionality: | ||||||
|  | 
 | ||||||
|  | - copies these static files to _site/ : | ||||||
|  |   *.{html,htm,css,js,gif,jpg,jpeg,png} | ||||||
|  |   {css,img,js,files}/** (** means everything below) | ||||||
|  |   site/{css,img,js,files,etc}/** | ||||||
|  |   doc/**.{html,htm,txt,gif,jpg,jpeg,png} | ||||||
|  | 
 | ||||||
|  | - renders these markdown files to _site/*.html : | ||||||
|  |   *.{md,mdwn,markdown} | ||||||
|  |   doc/**.{md,mdwn,markdown} | ||||||
|  | 
 | ||||||
|  | - applies this template file to markdown content: | ||||||
|  |   site.tmpl or site/site.tmpl (the first found) | ||||||
|  | 
 | ||||||
|  | - a single markdown list item containing the word "toc" is replaced by | ||||||
|  |   a table of contents based on headings | ||||||
|  | 
 | ||||||
|  | - syntax highlighting of fenced code blocks in markdown is enabled | ||||||
|  |   (if you provide suitable kate styles, eg a syntax.css) | ||||||
|  | 
 | ||||||
|  | Usage: | ||||||
|  | 
 | ||||||
|  | $ hakyll-std [--help|clean|build|preview|...]   # standard hakyll options | ||||||
|  | 
 | ||||||
|  | -} | ||||||
|  | 
 | ||||||
|  | import Control.Monad | ||||||
|  | import Data.Default | ||||||
|  | import Hakyll | ||||||
|  | import System.Directory | ||||||
|  | import System.Environment (getArgs) | ||||||
|  | import System.Exit (exitSuccess) | ||||||
|  | import System.Process (system) | ||||||
|  | -- import Text.Highlighting.Kate (pygments, kate, espresso, tango, haddock, monochrome, zenburn) | ||||||
|  | import Text.Pandoc.Options | ||||||
|  | 
 | ||||||
|  | import TableOfContents (tableOfContents) | ||||||
|  | 
 | ||||||
|  | import Debug.Trace | ||||||
|  | strace :: Show a => a -> a | ||||||
|  | strace a = trace (show a) a | ||||||
|  | 
 | ||||||
|  | filesToCopy = | ||||||
|  |   ["site/css/**" | ||||||
|  |   ,"site/js/**" | ||||||
|  |   ,"site/img/**" | ||||||
|  |   ,"site/images/**" | ||||||
|  |   ,"site/fonts/**" | ||||||
|  |   ,"site/files/**" | ||||||
|  |   ,"site/etc/**" | ||||||
|  |   ,"site/*.html" | ||||||
|  |   ,"site/*.htm" | ||||||
|  |   ,"site/*.gif" | ||||||
|  |   ,"site/*.jpg" | ||||||
|  |   ,"site/*.jpeg" | ||||||
|  |   ,"site/*.png" | ||||||
|  |   ,"site/*.css" | ||||||
|  |   ,"site/*.js" | ||||||
|  |   ,"css/**" | ||||||
|  |   ,"js/**" | ||||||
|  |   ,"img/**" | ||||||
|  |   ,"images/**" | ||||||
|  |   ,"fonts/**" | ||||||
|  |   ,"files/**" | ||||||
|  |   ,"doc/**.html" | ||||||
|  |   ,"doc/**.htm" | ||||||
|  |   ,"doc/**.txt" | ||||||
|  |   ,"doc/**.gif" | ||||||
|  |   ,"doc/**.jpg" | ||||||
|  |   ,"doc/**.jpeg" | ||||||
|  |   ,"doc/**.png" | ||||||
|  |   ,"*.html" | ||||||
|  |   ,"*.htm" | ||||||
|  |   ,"*.css" | ||||||
|  |   ,"*.js" | ||||||
|  |   ,"*.gif" | ||||||
|  |   ,"*.jpg" | ||||||
|  |   ,"*.jpeg" | ||||||
|  |   ,"*.png" | ||||||
|  |   ] | ||||||
|  | 
 | ||||||
|  | filesToRender = | ||||||
|  |   ["*.md" | ||||||
|  |   ,"*.mdwn" | ||||||
|  |   ,"*.markdown" | ||||||
|  |   ,"doc/**.md" | ||||||
|  |   ,"doc/**.mdwn" | ||||||
|  |   ,"doc/**.markdown" | ||||||
|  |   ] | ||||||
|  | 
 | ||||||
|  | -- http://hackage.haskell.org/package/pandoc-1.13/docs/src/Text-Pandoc-Options.html#ReaderOptions | ||||||
|  | pandocReaderOptions = def | ||||||
|  | 
 | ||||||
|  | -- http://hackage.haskell.org/package/pandoc-1.13/docs/src/Text-Pandoc-Options.html#WriterOptions | ||||||
|  | pandocWriterOptions = def | ||||||
|  |   {writerHighlight=True | ||||||
|  |   -- this would change the value of pandoc's $highlight-css$ var | ||||||
|  |   -- for now, let the user provide these styles | ||||||
|  |   -- ,writerHighlightStyle=tango | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | pandocTransform = tableOfContents "right" | ||||||
|  | 
 | ||||||
|  | main = do | ||||||
|  |   args <- getArgs | ||||||
|  |   when (any (`elem` args) ["--version"]) $ do | ||||||
|  |     putStrLn "hakyll standard site builder v0.1" | ||||||
|  |     exitSuccess | ||||||
|  | 
 | ||||||
|  |   hakyll $ do | ||||||
|  | 
 | ||||||
|  |     match (foldl1 (.||.) filesToCopy) $ route idRoute >> compile copyFileCompiler | ||||||
|  | 
 | ||||||
|  |     -- there might or might not be a site template in ./ or ./site/ | ||||||
|  |     mtmpl <- preprocess $ do | ||||||
|  |       t1 <- doesFileExist "site.tmpl" | ||||||
|  |       t2 <- doesFileExist "site/site.tmpl" | ||||||
|  |       return $ case (t1, t2) of (False, True)  -> Just "site/site.tmpl" | ||||||
|  |                                 (True, _)      -> Just "site.tmpl" | ||||||
|  |                                 (False, False) -> Nothing | ||||||
|  |     case mtmpl of | ||||||
|  |       Just tmpl -> match tmpl $ compile templateCompiler | ||||||
|  |       Nothing   -> return () | ||||||
|  | 
 | ||||||
|  |     match (foldl1 (.||.) filesToRender) $ do | ||||||
|  |       route   $ setExtension "html" | ||||||
|  |       compile $ | ||||||
|  |         pandocCompilerWithTransformM pandocReaderOptions pandocWriterOptions (return . pandocTransform) | ||||||
|  |         >>= (case mtmpl of | ||||||
|  |                 Just tmpl -> loadAndApplyTemplate (fromCapture tmpl "") defaultContext | ||||||
|  |                 Nothing   -> return) | ||||||
|  |         >>= relativizeUrls | ||||||
|  | 
 | ||||||
|  |     -- this fails the first time after a clean because it runs before README.html generation | ||||||
|  |     -- when ("build" `elem` args) $ preprocess linkReadmeToIndex | ||||||
|  | 
 | ||||||
|  |   -- can't do anything here, hakyll exits | ||||||
|  | 
 | ||||||
|  | linkReadmeToIndex = system "ln -sf README.html _site/index.html" >> return () | ||||||
							
								
								
									
										6
									
								
								doc/site/stack.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								doc/site/stack.yaml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | # stack.yaml for hakyll-std | ||||||
|  | extra-deps: [] | ||||||
|  | resolver: nightly-2015-07-01 | ||||||
|  | flags: {} | ||||||
|  | packages: | ||||||
|  | - '.' | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user