Skip to content

Instantly share code, notes, and snippets.

@co-dan
Created December 22, 2012 10:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save co-dan/4358385 to your computer and use it in GitHub Desktop.
Save co-dan/4358385 to your computer and use it in GitHub Desktop.
Generating HTML page from Calibre's catalog
{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}
module Main where
import Text.Blaze.Html5
import qualified Text.Blaze.Html5 as H
import Text.Blaze.Html5.Attributes
import qualified Text.Blaze.Html5.Attributes as A
import Text.Blaze.Html.Renderer.Pretty
import Data.Csv
-- import qualified Data.Csv.Streaming as CSVS
-- import Data.Foldable
import Data.Time
import System.Locale
import Control.Applicative
import Data.Monoid (mempty, (<>))
import Data.String (fromString)
import qualified Data.Vector as V
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Char8 as B8
data Book = Book
{ author :: String
, cover :: FilePath
, pubdate :: UTCTime
, publisher :: String
, tags :: String
, title :: String
} deriving Show
instance ToMarkup Book where
toMarkup b@(Book author cover pubdate publisher tags booktitle) =
H.div ! A.id "book" $ do
p $ do
toHtml $ booktitle
H.i $ toHtml ("by " ++ author)
H.br
H.img ! src (fromString cover)
preEscapedToMarkup = toMarkup
instance FromNamedRecord Book where
parseNamedRecord r = Book <$> r .: "authors"
<*> r .: "cover"
<*> r .: "pubdate"
<*> r .: "publisher"
<*> r .: "tags"
<*> r .: "title"
instance FromField UTCTime where
parseField f =
case parseTime defaultTimeLocale "%Y-%m-%dT%l:%M:%S+%l:%M" (B8.unpack f) of
Nothing -> fail $ "expected UTCTime, got " ++ show (B8.unpack f)
Just x -> pure x
generatePage :: V.Vector Book -> Html
generatePage v = docTypeHtml $ do
H.head $ do
H.title "Book list"
H.body $ do
contents
p "Generated"
where
contents = V.foldr compose mempty v
compose book html = toHtml book <> H.hr <> html
main :: IO ()
main = do
csvData <- BL.readFile "/Users/dan/Desktop/test.csv"
case decodeByName csvData of
Left err -> putStrLn err
Right (h,v :: V.Vector Book) -> putStrLn $ renderHtml $ generatePage v
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment