packages feed

folgerhs-0.1.0.1: app/Stage/Main.hs

module Main (main) where

import Control.Monad
import System.Environment
import Data.List
import Data.Bool
import Data.Maybe

import Text.XML.Light.Input (parseXML)

import Folgerhs.Stage


displayState :: [Character] -> State -> String
displayState gcs (l, s, cs) = l ++ "," ++ s ++ "," ++ displayStageChar gcs cs
    where displayStageChar gcs cs = intercalate "," $ map (bool "0" "1" . (`elem` cs)) gcs

displayStage :: Character -> [Character] -> Character -> String
displayStage s cs c = if s == c
                         then "Speaker"
                         else bool "Absent" "Present" (elem c cs)

displayRow :: [Character] -> State -> String
displayRow gcs (l, s, cs) = l ++ "," ++ intercalate "," (map (displayStage s cs) gcs)

displayCharacter :: Character -> String
displayCharacter c = let n = fromMaybe c (stripPrefix "#" c)
                      in case span (/= '_') $ reverse n of
                           ("", p) -> p
                           (s, "") -> s
                           (s, p) -> reverse $ tail p

displayHeader :: [Character] -> String
displayHeader gcs = "Act.Scene.Line," ++ intercalate "," (map displayCharacter gcs)

characters :: [State] -> [Character]
characters = nub . concatMap (\(_, _, cs) -> cs)

main :: IO ()
main = do args <- getArgs
          if length args /= 1
             then error "Expecting filename."
             else do source <- readFile $ head args
                     let contents = parseXML source
                         results = states (corpus contents) beginning
                         gcs = characters results
                     putStrLn $ displayHeader gcs
                     mapM_ (putStrLn . displayRow gcs) results
                     return ()