packages feed

corebot-bliki-0.2: src/Yesod/CoreBot/Bliki/Cache/UpdateHTML.hs

module Yesod.CoreBot.Bliki.Cache.UpdateHTML where

import Yesod.CoreBot.Bliki.Prelude

import Yesod.CoreBot.Bliki.Config
import Yesod.CoreBot.Bliki.Resources.Base
import Yesod.CoreBot.Bliki.Store
import Yesod.CoreBot.Bliki.DB

import HereDoc

import Control.Monad.Reader

import qualified Data.ByteString.Lazy as B

import Data.FileStore ( Revision(..) 
                      , TimeRange(..)
                      , Resource
                      , RevisionId
                      )
import qualified Data.FileStore as FileStore

import qualified Data.Text as Text

import qualified Data.Text.Lazy          as TL
import qualified Data.Text.Lazy.Encoding as TL

import Text.Pandoc 
import Text.Pandoc.Shared

import System.Directory

pandoc_write_options :: ConfigM master m
                     => Maybe Bloggable 
                     -> m WriterOptions
pandoc_write_options mprev_update = do
    extra_vars <- case mprev_update of
                    Nothing -> return []
                    Just (UpdateBloggable _ prev_rev_ID _) -> do
                        link_URL <- revision_blog_URL prev_rev_ID
                        return $ ( "prev-blog-update"
                                 , prev_rev_ID 
                                 ) :
                                 ( "prev-blog-update-URL"
                                 , link_URL
                                 ) : []
                    Just (WikiBloggable prev_entry_path prev_rev_ID _) -> do
                        link_URL <- entry_at_rev_URL prev_entry_path prev_rev_ID
                        return $ ( "prev-node-update"
                                 , prev_entry_path
                                 ) : 
                                 ( "prev-node-update-rev"
                                 , prev_rev_ID
                                 ) :
                                 ( "prev-node-update-URL"
                                 , link_URL
                                 ) : []
    return $ defaultWriterOptions
        { writerHtml5 = True
        , writerHTMLMathMethod = MathJax "http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
        , writerEmailObfuscation = JavascriptObfuscation
        , writerStandalone = True
        , writerVariables = extra_vars ++ writerVariables defaultWriterOptions
        , writerTemplate = [heredoc|
$for(include-before)$
$include-before$
$endfor$
$if(title)$
<header>
<h1 class="title">$title$</h1>
$for(author)$
<h2 class="author">$author$</h2>
$endfor$
$if(date)$
<h3 class="date">$date$</h3>
$endif$
</header>
$endif$
$if(toc)$
<nav id="$idprefix$TOC">
$toc$
</nav>
$endif$
$body$
$for(include-after)$
$include-after$
$endfor$
<div class="previous_update_summary">
$if(prev-node-update)$
Previously, node $prev-node-update$ was modified to revision <a href="$prev-node-update-URL$">$prev-node-update-rev$</a>
$endif$
$if(prev-blog-update)$
Previously, blog for update revision <a href="$prev-blog-update-URL$">$prev-blog-update$</a>
$endif$
</div>
|]
    }

build_blog_HTML :: ( MonadIO m, ConfigM master m )
                => Maybe Bloggable 
                -> RevisionId 
                -> String 
                -> m ()
build_blog_HTML mprev_update rev_ID txt = do
    out_path <- asks blog_HTML_path <*> pure rev_ID
    out_exists <- liftIO $ doesFileExist out_path 
    case out_exists of
        True  -> return ()
        False -> do
            liftIO $ putStrLn $ "build HTML for " ++ rev_ID ++ " log"
            let pandoc = readMarkdown defaultParserState txt
            write_opts <- pandoc_write_options mprev_update
            let html_string = writeHtmlString write_opts pandoc
            liftIO $ cache_str out_path html_string
    
build_node_HTML :: ( MonadIO m, StoreM m, ConfigM master m )
                => Maybe Bloggable 
                -> RevisionId 
                -> FilePath 
                -> m ()
build_node_HTML mprev_update rev_ID node_path = do
    out_path <- asks node_HTML_path <*> pure rev_ID <*> pure node_path
    out_exists <- liftIO $ doesFileExist out_path
    case out_exists of
        True  -> return ()
        False -> do
            liftIO $ putStrLn $ "build HTML for " ++ node_path ++ " " ++ show rev_ID
            store_data <- data_for_node_rev node_path rev_ID
            let markdown_data = FileStore.toByteString store_data
                markdown_text = TL.unpack $ TL.decodeUtf8 markdown_data
                pandoc        = readMarkdown    defaultParserState  markdown_text
            write_opts <- pandoc_write_options mprev_update
            let html_string   = writeHtmlString write_opts pandoc
            liftIO $ cache_str out_path html_string