org-to-mafiauniverse/app/Main.hs

91 lines
2.5 KiB
Haskell
Raw Normal View History

2022-10-26 09:57:55 +00:00
module Main where
2022-10-27 10:20:36 +00:00
import Control.Applicative hiding (some)
import Control.Monad
import Data.Functor
import Data.Void
import System.Environment
import System.Exit
2022-10-28 11:29:21 +00:00
import Text.Megaparsec
2022-10-27 10:20:36 +00:00
import Text.Megaparsec.Char
2022-10-26 10:37:48 +00:00
2022-10-26 22:15:32 +00:00
type Parser = Parsec Void String
newtype URL = URL String
data Info =
Bread String |
List [Info] |
Header String |
Subheader String |
Subsubheader String |
Image URL |
Video URL |
Link URL Info |
Spoiler Info
instance Show Info where
show :: Info -> String
show info = case info of
Bread text -> text
2022-10-28 11:29:21 +00:00
List texts -> "[LIST]" ++ concatMap ((++) "[*] " . show) texts ++ "[/LIST]"
Header text -> "[TITLE]" ++ text ++ "[/TITLE]"
Subheader text -> "[SIZE=4]" ++ text ++ "[/SIZE]"
Subsubheader text -> "[SIZE=2]" ++ text ++ "[/SIZE]"
Image (URL url) -> "[IMG]" ++ url ++ "[/IMG]"
Video (URL url) -> "[VIDEO]" ++ url ++ "[/VIDEO]"
Link (URL url) inf -> "[URL=\"" ++ url ++ "\"]" ++ show inf ++ "[/IMG]"
Spoiler inf -> "[SPOILER]" ++ show inf ++ "[/SPOILER]"
newtype Post = Post [Info]
2022-10-28 11:29:21 +00:00
instance Show Post where
show :: Post -> String
show (Post a) = concatMap show a
parseHelper :: Parser a -> String -> a
parseHelper parser x = case parse parser "" x of
Left bundle -> error $ errorBundlePretty bundle
2022-10-27 10:20:36 +00:00
Right text -> text
2022-10-28 11:29:21 +00:00
parseFile :: String -> Post
parseFile = Post . map (parseHelper fileParser) . lines
2022-10-26 22:15:32 +00:00
2022-10-28 11:29:21 +00:00
fileParser :: Parser Info
fileParser = undefined
-- try $
-- string' "* " <|>
-- string' "** " <|>
-- string' "*** " <|>
-- string' "- " <|>
-- string' "[[" <|>
-- string' "#+BEGIN" <|>
-- string' "#+END"
2022-10-26 10:03:45 +00:00
2022-10-28 11:29:21 +00:00
parseCli :: [String] -> IO Post
parseCli [] = return $ Post [usage]
2022-10-27 10:20:36 +00:00
parseCli [x] =
if head x /= '-'
then parseFile <$> readFile x
else return $ useArgs $ parseHelper argParse x
parseCli [x, _] = return $ useArgs $ parseHelper argParse x
2022-10-27 10:20:36 +00:00
parseCli _ = fail "Too many arugemnts"
2022-10-26 10:37:48 +00:00
2022-10-26 22:15:32 +00:00
argParse :: Parser String
2022-10-27 10:20:36 +00:00
argParse = string "-" >> some alphaNumChar
2022-10-26 10:37:48 +00:00
2022-10-28 11:29:21 +00:00
useArgs :: String -> Post
useArgs [] = Post [Bread ""]
useArgs ('h' : _) = Post [usage]
useArgs ('v' : _) = Post [version]
2022-10-27 10:20:36 +00:00
useArgs (_ : xs) = useArgs xs
2022-10-26 10:37:48 +00:00
2022-10-28 11:29:21 +00:00
usage :: Info
usage = Bread "Usage: otm [-hv] [file]"
2022-10-28 11:29:21 +00:00
version :: Info
version = Bread "otm 0.1"
main :: IO ()
2022-10-28 11:29:21 +00:00
main = putStr . show =<< parseCli =<< getArgs