-- Copyright 2017 Marcelo Garlet Millani -- This file is part of dice2tex. -- dice2tex is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- dice2tex is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- You should have received a copy of the GNU General Public License -- along with dice2tex. If not, see . module Main where import Data.List import System.Environment data Action = Action { nColumns :: Int , inFl :: FilePath , outFl :: FilePath , help :: Bool } defaultAction = Action{nColumns = 4, inFl = "", outFl = "", help = False} appname = "dice2tex" appversion = "0.1.0.0" breaks :: [a] -> Int -> [[a]] breaks [] _ = [] breaks xs n = (take n xs) : (breaks (drop n xs) n) latexify page columns pref = concat [ "\\setcounter{dice}{", pageNum ,"}\n" , "\\begin{table}[bp]\n\\centering\n\\begin{tabular}{", concat $ take columns $ repeat "r l|", "}\n" , texpage cls pref , "\\end{tabular}\n\\end{table}\n" , "\\clearpage\n" ] where n = ceiling $ (fromIntegral $ length page) / (fromIntegral columns) cls = breaks page n pageNum = take pref $ fst $ head $ head cls texpage :: [[(String, String)]] -> Int -> String texpage [] _ = [] texpage cls pref | and $ map null cls = [] | otherwise = texline (map mhead cls) pref ++ texpage (map mtail cls) pref where mhead [] = ("", "") mhead (x:xs) = x mtail [] = [] mtail (x:xs) = xs texcell :: Int -> (String, String) -> String texcell pref ("",_) = "&" texcell pref (pos,word) = concat ["& ", texpos $ drop pref pos, ": &", "\\textbf{", tail word, "} "] where texpos pos = if and $ map (=='1') (tail pos) then "\\underline{" ++ pos ++ "}" else (" " ++ tail pos) texline :: [(String, String)] -> Int -> String texline ln pref = (tail $ concatMap (texcell pref) ln) ++ "\\\\\n" parseArgs action [] = action parseArgs action args = case args of "-c":columns:r -> parseArgs action{nColumns = read columns} r "--columns":columns:r -> parseArgs action{nColumns = read columns} r "-h":r -> parseArgs action{help = True} r "--help":r -> parseArgs action{help = True} r "-o":fl:r -> parseArgs action{outFl = fl} r "--output":fl:r -> parseArgs action{outFl = fl} r fl:r -> parseArgs action{inFl = fl} r execute action | help action = do mapM_ putStrLn $ [ appname ++ ": " ++ appversion , "usage:" , "\t" ++ appname ++ " [OPTIONS...] " , " where OPTIONS are" , " -c, --columns N Number of columns in each page for the output (default is " ++ (show $ nColumns defaultAction) ++ ")." , " -o, --output FILE Writes output to FILE instead of stdout." ] | null $ inFl action = execute action{help = True} | otherwise = do lst <- readFile $ inFl action let ws = map (span (\x -> x /= '\t' && x /= ' ')) $ lines lst pref = (length $ fst $ head ws) - 3 pages = groupBy (\(x,_) (y,_) -> (take pref x) == (take pref y)) ws text = concatMap (\p -> latexify p (nColumns action) pref) pages if null $ outFl action then putStr text else writeFile (outFl action) text --mapM_ (\p -> putStr $ latexify p (nColumns action) pref) pages main = do args <- getArgs let action = parseArgs defaultAction args execute action