1
0
forked from GitHub/gf-rgl
Files
gf-rgl/doc/MkExxTable.hs
Thomas Hallgren 881753ce3e doc/Makefile: incremental and parallel rebuild of the synopsis
Enough dependencies have been added so that

* If nothing has changed, MkSynopsis.hs will not be run, so synopisis.html
  will not be needlessly regenerated.
* You can use 'make -j' to build examples for different languages in parallel.

Hopefully 'make synopsis' produces the exact same result as before, but if
it turns out that some dependencies are missing and something is not
rebuilt despite of changes, 'make clean' can be used to force a full rebuild.
2018-10-22 23:38:56 +02:00

104 lines
3.2 KiB
Haskell

module MkExxTable (getApiExx, ApiExx, prApiEx, mkEx) where
--import System.Cmd
import System.Environment(getArgs)
import qualified Data.Map as M
import Data.Char
main = do
xx <- getArgs
aexx <- getApiExx xx
return () -- putStrLn $ prApiExx aexx
getApiExx :: [FilePath] -> IO ApiExx
getApiExx xx = do
s <- readFile (head xx)
let aet = getApiExxTrees $ filter validOutput $ mergeOutput $ lines s
aeos <- mapM readApiExxOne xx
let aexx = mkApiExx $ ("API",aet) : aeos
-- putStrLn $ prApiExx aexx
return aexx
readApiExxOne file = do
s <- readFile file
let lang = reverse (take 3 (drop 4 (reverse file))) -- api-exx-*Eng*.txt
let api = getApiExxOne $ filter validOutput $ mergeOutput $ lines s
putStrLn $ unlines $ prApiEx api ---
return (lang,api)
-- map function -> language -> example
type ApiExx = M.Map String (M.Map String String)
-- map function -> example
type ApiExxOne = M.Map String String
-- get a map function -> example
getApiExxOne :: [String] -> ApiExxOne
getApiExxOne = M.fromList . pairs . map cleanUp
where
pairs ss = case ss of
f:_:e:rest -> (f,e) : pairs (drop 1 (dropWhile (notElem '*') rest))
_ -> []
-- get the map function -> tree
getApiExxTrees :: [String] -> ApiExxOne
getApiExxTrees = M.fromList . pairs . map cleanUp
where
pairs ss = case ss of
f:e:_:rest -> (f,e) : pairs (drop 1 (dropWhile (notElem '*') rest))
_ -> []
-- remove leading prompts and spaces
cleanUp = dropWhile (flip elem " >")
--- this makes txt2tags loop...
mergeOutput ls = ls
mergeOutputt ls = case ls of
l@('>':_):ll -> let (ll1,ll2) = span ((/=">") . take 1) ll in unwords (l : map (unwords . words) ll1) : mergeOutput ll2
_:ll -> mergeOutput ll
_ -> []
-- only accept lines starting with prompts (to eliminate multi-line gf uncomputed output)
validOutput = (==">") . take 1
mkApiExx :: [(String,ApiExxOne)] -> ApiExx
mkApiExx ltes =
M.fromList [(t,
M.fromList [(l,maybe "NONE" id (M.lookup t te)) | (l,te) <- ltes])
| t <- M.keys firstL]
where
firstL = snd (head ltes)
prApiExx :: ApiExx -> String
prApiExx aexx = unlines
[unlines (t:prApiEx lexx) | (t,lexx) <- M.toList aexx]
prApiEx :: M.Map String String -> [String]
prApiEx apexx = case M.toList apexx of
(a,e):lexx -> (a ++ ": ``" ++ unwords (words e) ++ "``"):
[l ++ ": //" ++ mkEx l e ++ "//" | (l,e) <- lexx]
mkEx l = unws . bind . mkE . words where
unws = if elem l ["Chi","Jpn","Tha"] then concat else unwords -- remove spaces
mkE e = case e of
"atomic":"term":_ -> ["*"]
"[]":_ -> ["''"]
"(table":es -> ["..."]
"table":es -> ["..."]
('{':_):es -> ["..."]
"pre":p@('{':_):es -> init (init (drop 2 p)) : ["..."]
--- "pre":p@('{':_):es -> init (init (drop 2 p)) : reverse (takeWhile ((/='}') . head) (reverse es))
e0:es -> e0:mkE es
_ -> e
bind ws = case ws of
w : "&+" : u : ws2 -> bind ((w ++ u) : ws2)
w : "Predef.BIND" : u : ws2 -> bind ((w ++ u) : ws2)
w : "Predef.SOFT_BIND" : u : ws2 -> bind ((w ++ u) : ws2)
"&+":ws2 -> bind ws2
"Predef.BIND":ws2 -> bind ws2
"Predef.SOFT_BIND":ws2 -> bind ws2
w : ws2 -> w : bind ws2
w : "++" : ws2 -> w : bind ws2
_ -> ws