lhs文書のテストも兼ねて、ここを作るときに使ったあれこれを書き出しておきます。随時更新。
lhsで書いているのでヘッダーのsource
リンクからダウンロードしてそのまま実行する事が可能です。
もくじ
- ハイライトのcssどうするの
- 元々minifyされているcssはライセンス書いてるしcomplessしたくない
- タグごとのページもpaginateしたい
- 表にはtableクラスを付けないとbootstrapが!
- bibtexで引用したい
> {-#LANGUAGE OverloadedStrings #-}
> import Hakyll
> import qualified Text.Highlighting.Kate as Kate
> import qualified Text.HTML.TagSoup as TS
> import Data.List(partition)
>
> main :: IO ()
> main = hakyll $ highlightCss >> cssRules >> posts
ハイライトのcssどうするの
pandocCompiler
で文書をコンパイルすると、コードにはハイライト用のマークアップを付けてくれますが、cssは自分で用意する必要があります。 このハイライト機能はhighlighting-kate
により提供されているものなので、その中に定義されているスタイルを使って、以下の様なルールを書いておけば良いと思います。
> highlightCss :: Rules ()
> highlightCss = create ["css/highlight.css"] $ do
> route idRoute
> compile $ makeItem (Kate.styleToCss Kate.kate)
元々minifyされているcssはライセンス書いてるしcomplessしたくない
Patterns
用の論理演算を使いましょう。
Bool | Patterns |
---|---|
&& | .&&. |
|| | .||. |
not | complement |
> cssRules :: Rules ()
> cssRules = do
> match "css/*.min.css" $ do
> route idRoute
> compile copyFileCompiler
> match ("css/*" .&&. complement "css/*.min.css") $ do
> route idRoute
> compile compressCssCompiler
タグごとのページもpaginateしたい
普通にネストできます。すごい。 長いのでソースコード参照
表にはtableクラスを付けないとbootstrapが!
withTagsを使いましょう。
> addClass :: String -> TS.Tag String -> TS.Tag String
> addClass cls (TS.TagOpen name attr) = case partition ((== "class") . fst) attr of
> ([], _) -> TS.TagOpen name $ ("class", cls) : attr
> ((_,cls'):_, attr') -> TS.TagOpen name $ ("class", cls ++ ' ': cls') : attr'
> addClass _ tag = tag
>
> postCompiler :: Compiler (Item String)
> postCompiler = fmap (withTags process) `fmap` pandocCompiler
> where process tag | TS.isTagOpenName "table" tag = addClass "table" tag
> | otherwise = tag
>
> posts :: Rules ()
> posts = match "posts/**.md" $ do
> route $ setExtension "html"
> compile postCompiler