------------------------------------------------------------------------------
-- A simple banner program:                             Mark P Jones, 1992
--
-- Many years ago, I was helping out on a stand at a computer show.
-- Or at least, I would have been if anyone had been interested in
-- what we had on the stand.  So instead, I sat down to see if I
-- could write a banner program -- something to print messages out
-- in large letters.
--
-- The original program was in Basic, but here is a version in Hugs.
-- The program itself is only two lines long and that is rather pleasing,
-- but the raw data for the letters (and the function mapping characters
-- to letters) take up rather more space.  I don't have that Basic version
-- anymore.  I wonder whether the complete Hugs code is that much shorter?
--
-- One of the nice things about this program is that the main program is
-- completely independent of the size of characters.  You could easily add
-- a new font, perhaps with higher resolution (bigger letters), or even
-- variable width characters, and the program would take it all in its
-- stride.
--
-- If you have a wide screen (>80 cols), you might like to try evaluating:
--
--            (putStr . concat . map say . lines . say) "Hi"
--
-- and contemplating how easy it might have been to get my original
-- Basic version to perform this trick...
--
-- Enjoy!
------------------------------------------------------------------------------

module Say where
import Char( ord, chr, isSpace, isUpper, isLower, isDigit )
import List( transpose )

sayit :: String -> IO ()
sayit  = putStr . say

say    = ('\n':) . unlines . map join . transpose . map picChar
         where join  = foldr1 (\xs ys -> xs ++ "  " ++ ys)

-- mapping characters to letters: --------------------------------------------

picChar c  | isUpper c  = alphas !! (ord c - ord 'A')
           | isLower c  = alphas !! (ord c - ord 'a')
           | isSpace c  = blank
           | isDigit c  = digits !! (ord c - ord '0')
           | c=='/'     = slant
           | c=='\\'    = reverse slant
           | otherwise  = head ([ letter | (c',letter) <- punct, c'==c ]
                                ++ [nothing])

-- letters data: -------------------------------------------------------------

blank  =  ["     ", "     ", "     ", "     ", "     "]

slant  =  ["    ",  "   ",   "  ",    " ",     ""     ]

nothing=  repeat ""

punct  =  [('.',  ["     ", "     ", "     ", "  .. ", "  .. "]),
           ('?',  [" ??? ", "?   ?", "   ? ", "  ?  ", "  .  "]),
           ('!',  ["  !  ", "  !  ", "  !  ", "  !  ", "  .  "]),
           ('-',  ["     ", "     ", "-----", "     ", "     "]),
           ('+',  ["  +  ", "  +  ", "+++++", "  +  ", "  +  "]),
           (':',  ["     ", "  :: ", "     ", "  :: ", "     "]),
           (';',  ["     ", "  ;; ", "     ", "  ;; ", " ;;  "])
          ]

digits = [[" OOO ", "0  00", "0 0 0", "00  0", " 000 "],
          ["  1  ", " 11  ", "  1  ", "  1  ", "11111"],
          [" 222 ", "2   2", "   2 ", "  2  ", "22222"],
          ["3333 ", "    3", " 333 ", "    3", "3333 "],
          ["   4 ", "  44 ", " 4 4 ", "44444", "   4 "],
          ["55555", "5    ", "5555 ", "    5", "5555 "],
          ["   66", "  6  ", " 666 ", "6   6", " 666 "],
          ["77777", "    7", "   7 ", "   7 ", "  7  "],
          [" 888 ", "8   8", " 888 ", "8   8", " 888 "],
          [" 999 ", "9   9", " 999 ", "  9  ", "99   "]]

alphas = [["  A  ", " A A ", "AAAAA", "A   A", "A   A"],
          ["BBBB ", "B   B", "BBBB ", "B   B", "BBBB "],
          [" CCCC", "C    ", "C    ", "C    ", " CCCC"],
          ["DDDD ", "D   D", "D   D", "D   D", "DDDD "],
          ["EEEEE", "E    ", "EEEEE", "E    ", "EEEEE"],
          ["FFFFF", "F    ", "FFFF ", "F    ", "F    "],
          [" GGGG", "G    ", "G  GG", "G   G", " GGG "],
          ["H   H", "H   H", "HHHHH", "H   H", "H   H"],
          ["IIIII", "  I  ", "  I  ", "  I  ", "IIIII"],
          ["JJJJJ", "   J ", "   J ", "J  J ", " JJ  "],
          ["K   K", "K  K ", "KKK  ", "K  K ", "K   K"],
          ["L    ", "L    ", "L    ", "L    ", "LLLLL"],
          ["M   M", "MM MM", "M M M", "M   M", "M   M"],
          ["N   N", "NN  N", "N N N", "N  NN", "N   N"],
          [" OOO ", "O   O", "O   O", "O   O", " OOO "],
          ["PPPP ", "P   P", "PPPP ", "P    ", "P    "],
          [" QQQ ", "Q   Q", "Q Q Q", "Q  Q ", " QQ Q"],
          ["RRRR ", "R   R", "RRRR ", "R  R ", "R   R"],
          [" SSSS", "S    ", " SSS ", "    S", "SSSS "],
          ["TTTTT", "  T  ", "  T  ", "  T  ", "  T  "],
          ["U   U", "U   U", "U   U", "U   U", " UUU "],
          ["V   V", "V   V", "V   V", " V V ", "  V  "],
          ["W   W", "W   W", "W   W", "W W W", " W W "],
          ["X   X", " X X ", "  X  ", " X X ", "X   X"],
          ["Y   Y", " Y Y ", "  Y  ", "  Y  ", "  Y  "],
          ["ZZZZZ", "   Z ", "  Z  ", " Z   ", "ZZZZZ"]
         ]

-- end of banner program -----------------------------------------------------
