64 lines
2 KiB
Haskell
64 lines
2 KiB
Haskell
module Main where
|
|
|
|
import System.Directory
|
|
import Options.Applicative
|
|
import Data.List
|
|
|
|
data CgiState = CgiSuccess
|
|
instance Show CgiState where
|
|
show CgiSuccess = "20 text/gemini; lang=en; charset=utf-8\r"
|
|
|
|
data Args = Args
|
|
{ title :: String
|
|
, directory :: FilePath
|
|
, fileHead :: FilePath
|
|
, verbose :: Bool
|
|
, names :: Bool
|
|
, cgi :: Bool
|
|
}
|
|
|
|
args :: Parser Args
|
|
args = Args
|
|
<$> strOption ( long "title" <> short 't' <> value "Title Left Blank" <> help "Document title" )
|
|
<*> strOption ( long "directory" <> short 'd' <> value "./" <> help "Directory to parse" )
|
|
<*> strOption ( long "header" <> short 'H' <> value "" <> help "Header text" )
|
|
<*> switch ( long "verbose" <> short 'v' <> help "Verbose mode")
|
|
<*> switch ( long "names" <> short 'n' <> help "Generate link names based on first of each document" )
|
|
<*> switch ( long "cgi" <> help "Output gemini file header")
|
|
|
|
main :: IO ()
|
|
main = parseArgs =<< execParser opts
|
|
where
|
|
opts = info ( args <**> helper)
|
|
( fullDesc
|
|
<> progDesc "Generate gemini page index"
|
|
<> header "Generate a gemini page index")
|
|
|
|
parseArgs :: Args -> IO()
|
|
parseArgs (Args t dir h v r c) = do
|
|
if c
|
|
then do print CgiSuccess
|
|
putStrLn $ "# " ++ t
|
|
else putStrLn $ "# " ++ t
|
|
|
|
if not (null h)
|
|
then putStr $ "\n" ++ h ++ "\n\n"
|
|
else putStr "\n"
|
|
|
|
mapM_ (mkIndex r dir) . filter (isSuffixOf ".gmi") =<< getDirectoryContents dir
|
|
|
|
mkIndex :: Bool -> FilePath -> FilePath -> IO ()
|
|
|
|
mkIndex False d l = putStrLn $ "=> " ++ path
|
|
where path = d++"/"++l
|
|
|
|
mkIndex True d l = do
|
|
line <- trim . words . head . lines <$> readFile path
|
|
putStrLn $ "=> " ++ path ++ " " ++ line
|
|
where path = d++"/"++l
|
|
trim s
|
|
| length s >= 8 = (++ "...") . unwords . take 8 . cleanString $ s
|
|
| otherwise = unwords . cleanString $ s
|
|
-- remove all '#' signs and any potential resulting empty lists
|
|
where cleanString = filter(/="") . map (dropWhile (=='#'))
|