3 import Data.List (intercalate)
4 import Data.String hiding (unlines)
5 import Data.Text hiding (map, init, length, splitAt)
6 import Data.Text.IO (putStrLn, putStr)
7 import Data.Text.Lazy (toStrict)
8 import Data.Text.Template
9 import Data.Time.Clock.POSIX
11 import Prelude hiding (putStrLn, putStr, init, unlines)
13 import System.Directory
14 import System.Directory (doesFileExist)
15 import System.Environment
17 import System.File.Tree hiding (map, mapM, mapM_)
20 import Text.JSON.Generic
24 main = getArgs >>= parse
26 continueIfValidProject :: IO () -> IO ()
27 continueIfValidProject nextfn = do
28 jsonExists <- doesFileExist "xyz.json"
31 else putStrLn "This does not appear to be a valid project directory"
35 dirExists <- doesFileExist "xyz.json"
37 then putStrLn "Project already initialised"
38 else do home <- getHomeDirectory
39 themes <- allFilesIn $ home ++ "/.xyz/themes"
40 projectSpec <- initPrompt (map pack themes)
41 createDirectory "entries"
42 writeFile "xyz.json" . encode . toJSObject $ projectSpec
43 putStrLn "\n\nInitialised empty project"
47 fileExists <- doesFileExist "xyz.json"
50 files <- allFilesIn "entries"
51 home <- getHomeDirectory
52 config <- readFile "xyz.json"
53 writeOutProject (decodeJSON config :: ProjectConfig) files >> putStrLn "Build successful"
54 else putStrLn "This does not appear to be a valid project directory"
58 homeDir <- getHomeDirectory
59 entrySpec <- entryPrompt
60 entryNum <- fmap (show . (+1) . length) $ allFilesIn "entries"
61 stamp <- fmap (show . round) getPOSIXTime
62 videoTemplate <- readFile (homeDir ++ "/.xyz/entry-video.txt") >>= return . template . fromString
63 normalTemplate <- readFile (homeDir ++ "/.xyz/entry.txt") >>= return . template . fromString
64 --let filename = "entries/" ++ (show entryNum) ++ "-" ++ (unpack . (toLower. replace " " "-") $ pack entryName) ++ ".txt"
67 Just (title, videoSpec) -> do
68 let filename = "entries/" ++ entryNum ++ "-" ++ (unpack . slugify $ title) ++ ".txt"
70 Just (videoId, videoFilename) -> putStrLn "oh jimmy"
71 Nothing -> putStrLn "oh bimmy"
76 -- Just (videoId, videoFilename) -> do
77 -- let tmplContext = context $ [("timestamp", fromString . show $ (stamp::Integer)), ("title", pack entryName), ("videofilename", pack $ videoFilename), ("videoid", pack videoId)]
78 -- let rawEntry = unpack . toStrict $ render videoTemplate tmplContext
79 -- writeFile filename rawEntry
80 -- callCommand $ "youtube-dl -f 'webm[height<1080]+bestaudio' \"https://www.youtube.com/watch?v=" ++ videoId ++ "\" -o 'build/videos/" ++ videoFilename ++ "'"
82 -- let tmplContext = context $ [("timestamp", fromString . show $ (stamp::Integer)), ("title", pack entryName)]
83 -- let rawEntry = unpack . toStrict $ render normalTemplate tmplContext
84 -- writeFile filename rawEntry
86 -- (putStrLn $ ("Created " ++ filename)) >> build
88 -- push <- yornPrompt "Do you want to push this entry?"
91 -- True -> do callCommand $ "git add . && git commit -m \"" ++ entryName ++ "\" && git push"
94 -- putStrLn "Thanks for using xyz!"
97 usage = putStr . ununlines $ [
98 "usage: xyz <command>",
99 "Commands:", unlines [
100 "\tinit\t\tInitialise a new site",
101 "\tbuild\t\tBuild the site",
102 "\tentry\t\tInitialise an entry"
106 parse ["init"] = init >> exitSuccess
107 parse ["build"] = continueIfValidProject build >> exitSuccess
108 parse ["entry"] = continueIfValidProject entry >> exitSuccess
109 parse [_] = usage >> exit
110 parse [] = usage >> exit
112 exit = exitWith ExitSuccess