summaryrefslogtreecommitdiff
path: root/testsuite/tests/programs/andy_cherry/PrintTEX.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/programs/andy_cherry/PrintTEX.hs')
-rw-r--r--testsuite/tests/programs/andy_cherry/PrintTEX.hs182
1 files changed, 182 insertions, 0 deletions
diff --git a/testsuite/tests/programs/andy_cherry/PrintTEX.hs b/testsuite/tests/programs/andy_cherry/PrintTEX.hs
new file mode 100644
index 0000000000..d8f253f6d4
--- /dev/null
+++ b/testsuite/tests/programs/andy_cherry/PrintTEX.hs
@@ -0,0 +1,182 @@
+
+ module PrintTEX (texPrinter) where
+
+ import GenUtils
+ import DataTypes
+ import Data.Array -- 1.3
+ import Data.Char -- 1.3
+
+
+
+
+
+
+
+ splitUpQuantum :: [Quantum] -> [[Quantum]]
+ splitUpQuantum q = splitUpQuantums q []
+ where
+ splitUpQuantums [] [] = []
+ splitUpQuantums [] mvs = [reverse mvs]
+ splitUpQuantums (mv@(QuantumMove _ _ _ _):rest) mvs
+ = splitUpQuantums rest (mv:mvs)
+ splitUpQuantums (mv@(QuantumNAG _):rest) mvs
+ = splitUpQuantums rest mvs
+ splitUpQuantums (x:xs) [] = [x] : splitUpQuantums xs []
+ splitUpQuantums (x:xs) mvs
+ = [reverse mvs,[x]] ++ splitUpQuantums xs []
+
+ type TeXState =
+ (Bool, -- if Top level !
+ Board, -- current board
+ MoveNumber) -- the Current Move Number
+
+ printTeXQuantums :: TeXState -> [Quantum] -> [String]
+ printTeXQuantums ps
+ = concat . fst . mapAccumL printTeXQuantum ps . splitUpQuantum
+
+ printTeXQuantum :: TeXState -> [Quantum] -> ([String],TeXState)
+ printTeXQuantum state@(_,board,_) [QuantumComment ["\004"]] =
+ (mkTeXBoard board,state)
+ printTeXQuantum state@(_,board,_) [QuantumComment (('\004':comm):comms)] =
+ (mkTeXBoard board ++ formatText 70 (parseSquiggles (comm:comms)),state)
+ printTeXQuantum state [QuantumComment comms] =
+ (formatText 70 (parseSquiggles comms),state)
+ printTeXQuantum (pnt,brd,mv) [QuantumAnalysis anal] =
+ (printTeXQuantums (False,err,decMove mv) anal,(pnt,brd,mv))
+ where err = error "Syntax error using ^D"
+ printTeXQuantum state@(_,board,_) [QuantumResult str] =
+ (mkTeXBoard board ++ [printTeXResult (mkResult str)],state)
+ printTeXQuantum state mvs@(QuantumMove _ _ _ _:_) =
+ printTeXMoves state mvs
+ printTeXQuantum _ _ = error "PANIC: strange Quantum"
+
+
+ parseSquiggles = map parseSquiggle
+ parseSquiggle ('<':'s':'a':'w':'>':r) = "\\wbetter{}" ++ r
+ parseSquiggle ('<':'a':'w':'>':r) = "\\wupperhand{}" ++ r
+ parseSquiggle ('<':'w':'a':'w':'>':r) = "\\wdecisive{}" ++ r
+ parseSquiggle ('<':'s':'a':'b':'>':r) = "\\bbetter{}" ++ r
+ parseSquiggle ('<':'a':'b':'>':r) = "\\bupperhand{}" ++ r
+ parseSquiggle ('<':'w':'a':'b':'>':r) = "\\bdecisive{}" ++ r
+ parseSquiggle wd = wd
+
+
+ printTeXResult :: Result -> String
+ printTeXResult Win = "$1\\!-\\!0$"
+ printTeXResult Loss = "$0\\!-\\!1$"
+ printTeXResult Draw = "${1 \\over 2}\\!-\\!{1 \\over 2}$"
+ printTeXResult Unknown = "$*$"
+
+ printTeXMoves (tl,_,mv) mvs
+ = ([text],(True,brd,incMove last_mv_num))
+ where
+ aux_mvs = zip3 mvs (iterate incMove mv) (False:repeat True)
+
+ (QuantumMove _ _ _ brd,last_mv_num,_) = last aux_mvs
+ text = initText tl
+ ++ concat (fst (mapAccumL (pntMove tl) (mv,False) mvs))
+ ++ endText tl
+
+ initText False =
+ case mv of
+ MoveNumber i Black -> "|" ++ show i ++ "\\ldots~"
+ _ -> "|"
+ initText True =
+ "\\begin{center}|\n" ++
+ "{\\bf" ++
+ "\\begin{tabular}{rp{50pt}p{50pt}}\n" ++
+ case mv of
+ MoveNumber i Black -> show i ++ " & \\ldots"
+ _ -> ""
+
+ endText True = case getMoveColour last_mv_num of
+ White -> "&\\\\\n\\end{tabular}}|\n\\end{center}"
+ Black -> "\\end{tabular}}|\n\\end{center}"
+ endText False = "|"
+
+
+
+ pntMove True (mv@(MoveNumber i White),bl) move
+ = (show i ++ " & "
+ ++ printableMove move,
+ (incMove mv,True))
+ pntMove True (mv@(MoveNumber i Black),bl) move
+ = (" & " ++ printableMove move ++ "\\\\\n",
+ (incMove mv,True))
+ pntMove False (mv@(MoveNumber i White),bl) move
+ = ((if bl then "; " else "") ++ show i ++ ".~"
+ ++ printableMove move,
+ (incMove mv,True))
+ pntMove False (mv@(MoveNumber i Black),bl) move
+ = ((if bl then ", " else "") ++ printableMove move,
+ (incMove mv,True))
+
+ printableMove :: Quantum -> String
+ printableMove (QuantumMove move ch an _) = map fn move ++ rest
+ where
+ fn 'x' = '*'
+ fn 'O' = '0'
+ fn c = c
+ rest = case ch of
+ "#" -> an ++ " mate"
+ _ -> ch ++ an
+
+ mkTeXBoard :: Board -> [String]
+ mkTeXBoard (Board arr _ _) =
+ ["\n\\board"] ++
+ ["{" ++ [ fn ((x-y) `rem` 2 == 0) (arr ! (x,y)) | x <- [1..8]] ++ "}"
+ | y <- reverse [1..8]] ++
+ ["$$\\showboard$$"]
+ where
+ fn _ (WhitesSq p) = head (userFormat p)
+ fn _ (BlacksSq p) = toLower (head (userFormat p))
+ fn True VacantSq = '*'
+ fn False VacantSq = ' '
+
+ printTeXGame :: RealGame -> [String]
+ printTeXGame (Game tags qu) = [
+ "\\clearpage",
+ "\\begin{center}",
+ "\\fbox{\\fbox{\\large\\begin{tabular}{l}",
+ ("Game " ++ gameno ++ " \\hspace{.3 in} "
+ ++ date
+ ++ " \\hspace{.3 in} "
+ ++ result
+ ++ "\\\\"),
+ "\\hline" ++ (if null opening then "" else "\n" ++ opening ++ "\\\\"),
+ "\\raisebox{2.5pt}[11pt]{\\framebox[11pt]{\\rule{0pt}{4.25pt}}} "
+ ++ white ++ "\\\\",
+ "\\rule[-1pt]{11pt}{11pt} "++ black ++ "\\\\",
+ site,
+ "\\end{tabular}}}",
+ "\\end{center}"] ++
+ (printTeXQuantums (True,startBoard,initMoveNumber) qu)
+ where
+ (date,site,game_no,res,white,black,opening) = getHeaderInfo tags
+ gameno = case game_no of
+ Nothing -> ""
+ Just n -> show n
+ result = printTeXResult res
+
+ texPrinter :: [RealGame] -> String
+ texPrinter games =
+ texHeader
+ ++ (unlines(concat(map printTeXGame games)))
+ ++ texFooter
+
+ texHeader =
+ "\\documentstyle[twocolumn,a4wide,chess]{article}\n" ++
+ "\\textwidth 7.0 in\n" ++
+ "\\textheight 63\\baselineskip\n" ++
+ "\\columnsep .4 in\n" ++
+ "\\columnseprule .5 pt\n" ++
+ "\\topmargin -0.5 in\n" ++
+ "\\headheight 0 pt\n" ++
+ "\\headsep 0 pt\n" ++
+ "\\oddsidemargin -0.3 in\n" ++
+ "\\font\\sc=cmcsc10\n\\pagestyle{empty}\n" ++
+ "\\begin{document}\n\\thispagestyle{empty}\n\n"
+
+ texFooter = "\n\\end{document}\n"
+
+