packages feed

hakyll-convert-0.3.0.1: app/hakyll-convert.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text as T
import qualified Hakyll.Convert.Blogger as Blogger
import Hakyll.Convert.IO
import Hakyll.Convert.OutputFormat
import qualified Hakyll.Convert.Wordpress as Wordpress
import System.Console.CmdArgs
import System.Environment
import System.FilePath

data InputFormat = Blogger | Wordpress
  deriving (Data, Typeable, Enum, Show)

data Config = Config
  { feed :: FilePath,
    outputDir :: FilePath,
    -- underscore will be turned into a dash when generating a commandline
    -- option
    output_format :: T.Text,
    format :: InputFormat,
    extract_comments :: Bool
  }
  deriving (Show, Data, Typeable)

parameters :: FilePath -> Config
parameters p =
  modes
    [ Config
        { feed = def &= argPos 0 &= typ "ATOM/RSS FILE",
          outputDir = def &= argPos 1 &= typDir,
          output_format = "%o" &= help outputFormatHelp,
          format = Blogger &= help "blogger or wordpress",
          extract_comments = False &= help "Extract comments"
        }
        &= help "Save blog posts Blogger feed into individual posts"
    ]
    &= program (takeFileName p)

outputFormatHelp :: String
outputFormatHelp =
  unlines
    [ "Output filenames format (without extension)",
      "Default: %o",
      "Available formats:",
      "  %% - literal percent sign",
      "  %o - original filename (e.g. 2016/01/02/blog-post)",
      "  %s - original slug (e.g. \"blog-post\")",
      "  %y - publication year, 2 digits",
      "  %Y - publication year, 4 digits",
      "  %m - publication month",
      "  %d - publication day",
      "  %H - publication hour",
      "  %M - publication minute",
      "  %S - publication second"
    ]

-- ---------------------------------------------------------------------
--
-- ---------------------------------------------------------------------

main :: IO ()
main = do
  p <- getProgName
  config <- cmdArgs (parameters p)

  let ofmt = output_format config

  if not (T.null ofmt || validOutputFormat ofmt)
    then fail $ "Invalid output format string: `" ++ T.unpack (output_format config) ++ "'"
    else case format config of
      Blogger -> mainBlogger config
      Wordpress -> mainWordPress config

mainBlogger :: Config -> IO ()
mainBlogger config = do
  mfeed <- Blogger.readPosts (feed config)
  case mfeed of
    Nothing -> fail $ "Could not understand Atom feed: " ++ feed config
    Just fd -> mapM_ process fd
  where
    process fd = do
      let distilled = Blogger.distill (extract_comments config) fd
      fname <- savePost (outputDir config) (output_format config) "html" distilled
      putStrLn fname

mainWordPress :: Config -> IO ()
mainWordPress config = do
  mfeed <- Wordpress.readPosts (feed config)
  case mfeed of
    Nothing -> fail $ "Could not understand RSS feed: " ++ feed config
    Just fd -> mapM_ process fd
  where
    process fd = do
      let distilled = Wordpress.distill (extract_comments config) fd
      fname <- savePost (outputDir config) (output_format config) "markdown" distilled
      putStrLn fname