Converts the test data to asciidoc

> import Language.SQL.SimpleSQL.Tests
> import Text.Show.Pretty
> import Control.Monad.State
> import Language.SQL.SimpleSQL.Parse
> import Language.SQL.SimpleSQL.Lex
> import Data.List

> data TableItem = Heading Int String
>                | Row String String

> doc :: Int -> TestItem -> [TableItem]
> -- filter out some groups of tests
> doc n (Group nm _) | "generated" `isInfixOf` nm = []
> doc n (Group nm is) =
>     Heading n nm
>     : concatMap (doc (n + 1)) is
> doc _ (TestScalarExpr _ str e) =
>     [Row str (ppShow e)]
> doc _ (TestQueryExpr _ str e) =
>     [Row str (ppShow e)]
> doc _ (TestStatement _ str e) =
>     [Row str (ppShow e)]
> doc _ (TestStatements _ str e) =
>     [Row str (ppShow e)]
> doc _ (ParseQueryExpr d str) =
>     [Row str (ppShow $ parseQueryExpr d "" Nothing str)]
> doc _ (ParseQueryExprFails d str) =
>     [Row str (ppShow $ parseQueryExpr d "" Nothing str)]
> doc _ (ParseScalarExprFails d str) =
>     [Row str (ppShow $ parseScalarExpr d "" Nothing str)]

> doc _ (LexTest d str t) =
>     [Row str (ppShow $ lexSQL d "" Nothing str)]

> doc _ (LexFails d str) =
>     [Row str (ppShow $ lexSQL d "" Nothing str)]

TODO: should put the dialect in the html output


> render :: [TableItem] -> IO ()
> render = go False
>   where
>     go t (Heading level title : is) = do
>         when t $ putStrLn "|==="
>         -- slight hack
>         when (level > 1) $
>             putStrLn $ "\n" ++ replicate level '=' ++ " " ++ title
>         go False is
>     go t (Row sql hask : is) = do
>         unless t $ putStrLn "[cols=\"2\"]\n|==="
>         let sql' = "\n[source,sql]\n----\n" ++ sql ++ "\n----\n"
>             hask' = "\n[source,haskell]\n----\n" ++ hask ++ "\n----\n"
>         putStrLn $ "a| " ++ escapePipe sql'
>                    ++ "a| " ++ escapePipe hask' ++ " "
>         go True is
>     go t [] = when t $ putStrLn "|==="
>     escapePipe [] = []
>     escapePipe ('\\':'|':xs) = '\\' : '\\' : '\\' : '|' : escapePipe xs
>     escapePipe ('|':xs) = '\\' : '|' : escapePipe xs
>     escapePipe (x:xs) = x : escapePipe xs

> main :: IO ()
> main = do
>        putStrLn "\n:toc:\n\
>                 \:toc-placement: macro\n\
>                 \:sectnums:\n\
>                 \:toclevels: 10\n\
>                 \:sectnumlevels: 10\n\
>                 \:source-highlighter: pygments\n\n\
>                 \= simple-sql-parser examples/test cases\n\n\
>                 \toc::[]\n"
>        render $ doc 1 testData