{-# LANGUAGE FlexibleContexts #-}

{- | Module for pretty-printing epub metadata info

   Used internally by Codec.Epub.Format
-}
module Codec.Epub.Format.Metadata
   ( formatMetadata
   )
   where

import Control.Monad.Writer.Lazy ( MonadWriter, execWriter )
import qualified Data.Foldable as Foldable
import qualified Data.Map.Strict as Map
import Text.Printf ( printf )

import Codec.Epub.Format.Util
import Codec.Epub.Data.Metadata


tellTitle :: MonadWriter (Seq Char) m => Title -> m ()
tellTitle :: forall (m :: * -> *). MonadWriter (Seq Char) m => Title -> m ()
tellTitle (Title Maybe String
Nothing Maybe String
Nothing Maybe Int
Nothing String
text) =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
forall r. PrintfType r => String -> r
printf String
"title: %s\n" String
text
tellTitle Title
title =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"title\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"text" (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ Title -> String
titleText Title
title))
      (String -> Maybe String -> String
formatSubline String
"lang" (Title -> Maybe String
titleLang Title
title))
      (String -> Maybe String -> String
formatSubline String
"title-type" (Title -> Maybe String
titleType Title
title))
      (String -> Maybe String -> String
formatSubline String
"display-seq" (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Maybe Int -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Title -> Maybe Int
titleSeq Title
title))


tellCreator :: MonadWriter (Seq Char) m => Creator -> m ()
tellCreator :: forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellCreator (Creator Maybe String
Nothing Maybe String
Nothing Maybe Int
Nothing String
creator) =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
forall r. PrintfType r => String -> r
printf String
"creator: %s\n" String
creator
tellCreator (Creator Maybe String
role Maybe String
fileAs Maybe Int
dseq String
creator) =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"creator\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"text" (String -> Maybe String
forall a. a -> Maybe a
Just String
creator))
      (String -> Maybe String -> String
formatSubline String
"file-as" Maybe String
fileAs)
      (String -> Maybe String -> String
formatSubline String
"role" Maybe String
role)
      (String -> Maybe String -> String
formatSubline String
"display-seq" (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Maybe Int -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Maybe Int
dseq))


tellContributor :: MonadWriter (Seq Char) m => Creator -> m ()
tellContributor :: forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellContributor (Creator Maybe String
Nothing Maybe String
Nothing Maybe Int
Nothing String
contributor) =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
forall r. PrintfType r => String -> r
printf String
"contributor: %s\n" String
contributor
tellContributor (Creator Maybe String
role Maybe String
fileAs Maybe Int
dseq String
contributor) =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"contributor\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"text" (String -> Maybe String
forall a. a -> Maybe a
Just String
contributor))
      (String -> Maybe String -> String
formatSubline String
"file-as" Maybe String
fileAs)
      (String -> Maybe String -> String
formatSubline String
"role" Maybe String
role)
      (String -> Maybe String -> String
formatSubline String
"display-seq" (Int -> String
forall a. Show a => a -> String
show (Int -> String) -> Maybe Int -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Maybe Int
dseq))


tellSource :: MonadWriter (Seq Char) m => Source -> m ()
tellSource :: forall (m :: * -> *). MonadWriter (Seq Char) m => Source -> m ()
tellSource (Source Maybe String
Nothing Maybe String
Nothing Maybe String
Nothing String
source) =
  String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
forall r. PrintfType r => String -> r
printf String
"source: %s\n" String
source
tellSource (Source Maybe String
idType' Maybe String
scheme Maybe String
sourceOf String
source) =
  String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"source\n%s%s%s%s"
    (String -> Maybe String -> String
formatSubline String
"text" (String -> Maybe String
forall a. a -> Maybe a
Just String
source))
    (String -> Maybe String -> String
formatSubline String
"identifier-type" Maybe String
idType')
    (String -> Maybe String -> String
formatSubline String
"scheme" Maybe String
scheme)
    (String -> Maybe String -> String
formatSubline String
"source-of" Maybe String
sourceOf)


tellDate :: MonadWriter (Seq Char) m => (DateEvent, DateValue) -> m ()
tellDate :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
(DateEvent, DateValue) -> m ()
tellDate (DateEvent
event', DateValue String
date') =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"date\n%s%s"
      (String -> Maybe String -> String
formatSubline String
"event" (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String)
-> (DateEvent -> String) -> DateEvent -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DateEvent -> String
dateEventToString (DateEvent -> Maybe String) -> DateEvent -> Maybe String
forall a b. (a -> b) -> a -> b
$ DateEvent
event'))
      (String -> Maybe String -> String
formatSubline String
"text" (String -> Maybe String
forall a. a -> Maybe a
Just String
date'))


tellId :: MonadWriter (Seq Char) m => Identifier -> m ()
tellId :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Identifier -> m ()
tellId Identifier
ident =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"identifier\n%s%s%s%s"
      (String -> Maybe String -> String
formatSubline String
"id" (Identifier -> Maybe String
idId Identifier
ident))
      (String -> Maybe String -> String
formatSubline String
"identifier-type" (Identifier -> Maybe String
idType Identifier
ident))
      (String -> Maybe String -> String
formatSubline String
"scheme" (Identifier -> Maybe String
idScheme Identifier
ident))
      (String -> Maybe String -> String
formatSubline String
"text" (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String)
-> (Identifier -> String) -> Identifier -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identifier -> String
idText (Identifier -> Maybe String) -> Identifier -> Maybe String
forall a b. (a -> b) -> a -> b
$ Identifier
ident))


tellDescription :: MonadWriter (Seq Char) m => Description -> m ()
tellDescription :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Description -> m ()
tellDescription (Description Maybe String
Nothing String
text) =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String
forall r. PrintfType r => String -> r
printf String
"description: %s\n" String
text
tellDescription (Description Maybe String
lang String
text) =
   String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"description\n%s%s"
      (String -> Maybe String -> String
formatSubline String
"lang" Maybe String
lang)
      (String -> Maybe String -> String
formatSubline String
"text" (String -> Maybe String
forall a. a -> Maybe a
Just String
text))


tellSimpleString :: MonadWriter (Seq Char) m => String -> String -> m ()
tellSimpleString :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
label = String -> m ()
forall a (m :: * -> *). MonadWriter (Seq a) m => [a] -> m ()
tellSeq (String -> m ()) -> (String -> String) -> String -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> String -> String
forall r. PrintfType r => String -> r
printf String
"%s: %s\n" String
label)


tellSimpleMbString :: MonadWriter (Seq Char) m => String
   -> Maybe String -> m ()
tellSimpleMbString :: forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> Maybe String -> m ()
tellSimpleMbString String
_     Maybe String
Nothing  = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
tellSimpleMbString String
label (Just String
s) = String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
label String
s


tellMetadata :: MonadWriter (Seq Char) m => Metadata -> m ()
tellMetadata :: forall (m :: * -> *). MonadWriter (Seq Char) m => Metadata -> m ()
tellMetadata (Metadata [Identifier]
ids [Title]
titles [String]
langs [Creator]
contributors [Creator]
creators Map DateEvent DateValue
dates [Source]
sources Maybe String
mType [String]
coverage [Description]
desc [String]
format [String]
publisher [String]
relation [String]
rights [String]
subjects) = do
   (Identifier -> m ()) -> [Identifier] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Identifier -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Identifier -> m ()
tellId [Identifier]
ids
   (Title -> m ()) -> [Title] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Title -> m ()
forall (m :: * -> *). MonadWriter (Seq Char) m => Title -> m ()
tellTitle [Title]
titles
   (String -> m ()) -> [String] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"language") [String]
langs
   (Creator -> m ()) -> [Creator] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Creator -> m ()
forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellContributor [Creator]
contributors
   (Creator -> m ()) -> [Creator] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Creator -> m ()
forall (m :: * -> *). MonadWriter (Seq Char) m => Creator -> m ()
tellCreator [Creator]
creators
   ((DateEvent, DateValue) -> m ())
-> [(DateEvent, DateValue)] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (DateEvent, DateValue) -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
(DateEvent, DateValue) -> m ()
tellDate ([(DateEvent, DateValue)] -> m ())
-> [(DateEvent, DateValue)] -> m ()
forall a b. (a -> b) -> a -> b
$ Map DateEvent DateValue -> [(DateEvent, DateValue)]
forall k a. Map k a -> [(k, a)]
Map.toList Map DateEvent DateValue
dates
   (Source -> m ()) -> [Source] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Source -> m ()
forall (m :: * -> *). MonadWriter (Seq Char) m => Source -> m ()
tellSource [Source]
sources
   String -> Maybe String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> Maybe String -> m ()
tellSimpleMbString String
"type" Maybe String
mType
   (String -> m ()) -> [String] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"coverage") [String]
coverage
   (Description -> m ()) -> [Description] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Description -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
Description -> m ()
tellDescription [Description]
desc
   (String -> m ()) -> [String] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"format") [String]
format
   (String -> m ()) -> [String] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"publisher") [String]
publisher
   (String -> m ()) -> [String] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"relation") [String]
relation
   (String -> m ()) -> [String] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"rights") [String]
rights
   (String -> m ()) -> [String] -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (String -> String -> m ()
forall (m :: * -> *).
MonadWriter (Seq Char) m =>
String -> String -> m ()
tellSimpleString String
"subject") [String]
subjects


{- | Format an epub Metadata structure for pretty printing
-}
formatMetadata :: Metadata -> String
formatMetadata :: Metadata -> String
formatMetadata Metadata
meta = Seq Char -> String
forall a. Seq a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
Foldable.toList (Seq Char -> String)
-> (Writer (Seq Char) () -> Seq Char)
-> Writer (Seq Char) ()
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Writer (Seq Char) () -> Seq Char
forall w a. Writer w a -> w
execWriter
   (Writer (Seq Char) () -> String) -> Writer (Seq Char) () -> String
forall a b. (a -> b) -> a -> b
$ Metadata -> Writer (Seq Char) ()
forall (m :: * -> *). MonadWriter (Seq Char) m => Metadata -> m ()
tellMetadata Metadata
meta