forked from GitHub/gf-rgl
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.
104 lines
3.2 KiB
Haskell
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
|