-- Copyright 2017 Marcelo Garlet Millani -- This file is part of pictikz. -- pictikz 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. -- pictikz 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 pictikz. If not, see . module Main where import Pictikz.Drawing import Pictikz.Organizer import Pictikz.Graph import Pictikz.Loader import Pictikz.Parser import System.Environment import Data.Char appname = "pictikz" appver = "1.0.0.0" applicense = ", released under GPLv3" data Action a t = Action { help :: Bool , version :: Bool , nodeF :: [t a] -> [t a] , outputF :: Graph a -> IO () , inF :: FilePath } printGraph g = putStrLn $ draw g writeGraph outF g = writeFile outF $ draw g defaultPercent = 0.2 defaultAction = Action{help = False, version = False, nodeF = id, outputF = printGraph, inF = ""} :: Action Float Node parseArgs action args = case args of "-h":r -> parseArgs (action{help = True}) r "--help":r -> parseArgs (action{help = True}) r "-v":r -> parseArgs (action{version = True}) r "--version":r -> parseArgs (action{version = True}) r "-o":f:r -> parseArgs (action{outputF = writeGraph f}) r "--output":f:r -> parseArgs (action{outputF = writeGraph f}) r "-f":ws:hs:r -> let w = read ws :: Float h = read hs :: Float in parseArgs (action{nodeF = (fitToBox w h) . (nodeF action)}) r "--fit":ws:hs:r -> let w = read ws :: Float h = read hs :: Float in parseArgs (action{nodeF = (fitToBox w h) . (nodeF action)}) r "-s":ws:hs:r -> let w = read ws :: Float h = read hs :: Float in parseArgs (action{nodeF = (fitToBox w h) . (nodeF action)}) r "--scale":ws:hs:r -> let w = read ws :: Float h = read hs :: Float in parseArgs (action{nodeF = (scaleToBox w h) . (nodeF action)}) r "-u":r -> parseUniform (genGroup distanceGroup) action r "--uniform":r -> parseUniform (genGroup distanceGroup) action r "-g":r -> parseUniform isometricGroup action r "--grid":r -> parseUniform isometricGroup action r f:r -> parseArgs action{inF = f} r [] -> action where isFloat n = and $ map (\x -> isNumber x || x =='.') n parseUniform f action [] = action{nodeF = (uniformCoordinatesBy f defaultPercent) . (nodeF action)} parseUniform f action (ps:r) | isFloat ps = parseArgs (action{nodeF = (uniformCoordinatesBy f (read ps / 100 :: Float)) . (nodeF action)}) r | otherwise = parseArgs (action{nodeF = (uniformCoordinatesBy f defaultPercent) . (nodeF action)}) (ps:r) showHelp = do mapM_ putStrLn $ [ appname ++ appver ++ applicense , "" , "-f, --fit WIDTH HEIGHT fit coordinates into a box of size WIDTH x HEIGHT without" , " changing aspect ratio." , "-g, --grid [PERCENT] fit coordinates into a grid (implies --uniform [PERCENT])." , " By default PERCENT = " ++ show (floor $ defaultPercent * 100) ++ "." , "-h, --help show help." , "-o, --output FILE writes output into FILE instead of stdout." , "-s, --scale WIDTH HEIGHT scale coordinates into a box of size WIDTH x HEIGHT." , "-u, --uniform [PERCENT] group coordinates by distance. Maximum distance for grouping" , " is PERCENT of the axis in question." , "-v, --version output version and exit." ] showVersion = putStrLn $ appname ++ appver ++ applicense execute action | help action = showHelp | version action = showVersion | inF action == "" = showHelp | otherwise = do svg <- readFile $ inF action let (Graph nodes edges) = loadGraph svg (outputF action) $ Graph ((nodeF action) nodes) edges main :: IO () main = do args <- getArgs let action = parseArgs defaultAction args :: Action Float Node execute action