geek-1.0.0.9: src/Web/Geek/ImportFromBamboo.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
module Web.Geek.ImportFromBamboo where
import Air.Data.Record.SimpleLabel hiding (get)
import Air.Env
import Air.Extra hiding (date)
import Air.Spec
import Air.TH (mkDefault, here)
import Control.Concurrent.Chan
import Control.Monad hiding (join)
import Data.Aeson.Generic (encode)
import Data.Function (on)
import Data.IORef
import Data.List (find)
import Data.List (sortBy)
import Data.Maybe (fromMaybe, catMaybes)
import Data.Text (Text)
import Data.Time (formatTime, fromGregorianValid, UTCTime(..))
import Data.UUID (toString)
import Filesystem.Path.CurrentOS (encodeString, decodeString)
import Hack2 (Application)
import Hack2.Contrib.Middleware.Static
import Hack2.Contrib.Utils (use, unescape_uri)
import Network.Curl
import Network.Miku
import Safe
import System.Directory
import System.FSNotify
import System.FilePath
import System.FilePath.Glob
import System.Locale (defaultTimeLocale)
import System.Random
import Test.Hspec
import Text.Printf
import Web.Geek.Application
import Web.Geek.Config
import Web.Geek.DefaultConfig
import Web.Geek.MarkupEngine.Markdown
import Web.Geek.Post
import Web.Geek.Type
import qualified Data.ByteString.Char8 as B
import qualified Data.Default as Default
import qualified Data.Text as T
import qualified Data.Text.IO as TextIO
import qualified Prelude as P
{-
Description:
convert bamboo tag file format into front_matter style embeded format
Requiements:
put bamboo `blog` directory inside current directory
rename `blog/blog` to `blog/posts`
create a new empty directory `blog/posts2`
then run `get_post_from_path` from ghci
-}
import Web.Geek.Config
import Web.Geek.Runtime
convert_tags_from_bamboo :: IO ()
convert_tags_from_bamboo = do
let
_meta_tag_keyword = _config.meta_tag_keyword
_config = default_config
_posts <- get_posts _config [markdown]
tags <- getDirectoryContents "blog/tag" ^ reject (belongs_to [".", ".."])
tag_map <- tags.mapM (\tag -> TextIO.readFile - "blog/tag" / tag)
-- puts - printf "tags: %s" - show tag_map
let
find_tag post =
zip tags tag_map.map (\(tag_name, tag_content) ->
if post.title `T.isInfixOf` tag_content
then
Just tag_name
else
Nothing
)
.catMaybes
forM_ _posts - \_post -> do
let _title = _post.title.T.unpack
if _post.meta.is []
then
case _post.find_tag of
[] ->
-- puts - printf "no tags found for %s" - _title
return ()
_tags -> do
-- puts - printf "found tags: %s for %s" (show _tags) _title
let front_matter = "---\ncategories: " + _tags.join ", ".T.pack + "\n---\n\n"
_body <- TextIO.readFile - _post.path
let _export_path = "blog/posts2/" + _post.path.takeBaseName + ".md"
puts - "exporting: " + _export_path
TextIO.writeFile _export_path - front_matter + _body
else
-- puts - printf "%s has front_matter already" _title
return ()