on cbecda2 help sign in
elk/elm/src/Gen/ExtractNoscript.hs
35 lines 1.1 kB history raw
2module ExtractNoscript (extract) where
4import Ast
6extract (Module _ _ _ defs _) =
7 concatMap (\s -> "<p>" ++ s ++ "</p>") $ concatMap (extract' . snd) defs
9extract' expr =
10 let f = extract' in
11 case expr of
12 Str s -> [s]
13 Binop op e1 e2 -> case (op, f e1, f e2) of
14 ("++", [s1], [s2]) -> [s1 ++ s2]
15 (_ , ss1 , ss2 ) -> ss1 ++ ss2
16 Lambda v e -> f e
17 App (App (Var "link") src) txt ->
18 case (f src, f txt) of
19 ([s1],[s2]) -> [ "<a href=\"" ++ s1 ++ "\">" ++ s2 ++ "</a>" ]
20 ( ss1, ss2) -> ss1 ++ ss2
21 App (Var "header") e -> tag "h1" e
22 App (Var "bold") e -> tag "b" e
23 App (Var "italic") e -> tag "i" e
24 App (Var "monospace") e -> tag "code" e
25 App e1 e2 -> f e1 ++ f e2
26 If eb et ef -> f et ++ f ef
27 Let defs e -> concatMap (f . snd) defs ++ f e
28 Var _ -> []
29 Case e cases -> concatMap (f . snd) cases
30 Data _ es -> concatMap f es
31 _ -> []
33tag t e = case extract' e of
34 [s] -> [ concat [ "<", t, ">", s, "</", t, ">" ] ]
35 ss -> ss