{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE NoImplicitPrelude #-} 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 ()