module Panda.Model.Comment where
import Panda.Helper.Env hiding (title, body, size, path, meta)
import Prelude hiding ((.), (/), (^), id, readFile, writeFile)
import qualified Panda.Config.Global as G
import Panda.Type.Reader
import qualified Panda.Model.Post as Post
import System.Directory
import Panda.Helper.StateHelper
import Network.Gravatar
data Comment = Comment
{ uid :: String
, author :: String
, body :: String
, author_email :: String
, author_link :: String
}
deriving (Show, Eq)
data CommentData =
Author
| AuthorEmail
| AuthorLink
| Body
| PostId
deriving (Show)
data SpamFilter =
HumanHack
| EmptyField
| LeftNumber
| RightNumber
| Operator
deriving (Show)
instance Resource Comment where
resource_title = uid >>> spaced_url
instance Markable Comment where
markup x = render_to_html Markdown (x.body)
instance Datable Comment where
date x = x.uid.split "/".last.default_parse_date
instance Default Comment where
def = Comment def def def def def
list_for post_id = do
has_comments <- doesDirectoryExist d
if has_comments
then ls d ^ reject (match "\\.meta$" >>> isJust) ^ rsort ^ map (G.comment_id / r /) >>= mapM (from_utf8 >>> get)
else return []
where
d = (G.comment_uri / r)
r = post_id.id_to_resource.to_utf8
path id = G.flat_uri / id.to_utf8
meta = (++ ".meta")
get id = do
meta_exists <- id.path.meta.doesFileExist
if meta_exists
then get_from_new_format id
else get_from_old_format id
get_from_new_format id = do
body <- id.path.readFile
meta <- id.path.meta.parse_config_io
let at s = meta.lookup (s.show_data) .fromJust
let author = at Author
let author_email = at AuthorEmail
let author_link = at AuthorLink
return $ Comment id author body author_email author_link
get_from_old_format id = do
xs <- id.path.readFile ^ lines
let author = xs.first
let author_email = ""
let author_link = xs.drop 2.first
let body = xs.drop 4.unlines
return $ Comment id author body author_email author_link
create h = do
let at s = h.lookup (s.show_data) .fromJust
let body = at Body
let post_id = at PostId
timestamp <- ( getClockTime >>= toCalendarTime ) ^ format_date G.comment_date_format
let comment_path = post_id_to_uid post_id .to_utf8
createDirectoryIfMissing True comment_path
let uid = comment_path / timestamp
writeFile uid body
let meta = [Author, AuthorLink, AuthorEmail] .labeling at .map_fst show_data
write_config_io (uid ++ ".meta") meta
from_post_id x = def { uid = post_id_to_uid x }
post_id_to_uid x = G.flat_uri / G.comment_id / x.split "/" .last
uid_to_post_id x = G.post_id / x.split "/" .last
fill_comment_size x = do
size <- x.Post.uid.list_for ^ length
return $ x { Post.comment_size = size }
gravatar_default_size = size 40
gravatar_link x = gravatarWith (x.author_email) def gravatar_default_size def