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