on master help sign in
Enable parsing of basic markdown interpolation

No interpolated values are actually used, but they are type checked.

commit7c159b294a68b60686db2e7e6e64e7f757b175a1 authorEvan Czaplicki <info@elm-lang.org> dateThu 29 Aug 2013, 13:00 (13 years ago) parent1a093ac
8 files changed+35−18
compiler/Generate/JavaScript.hs+1−1 compiler/Generate/Noscript.hs+1−1 compiler/Parse/Expression.hs+23−9 compiler/SourceSyntax/Expression.hs+2−2 compiler/Transform/Canonicalize.hs+1−1 compiler/Transform/SortDefinitions.hs+1−1 compiler/Transform/Substitute.hs+1−1 compiler/Type/Constrain/Expression.hs+5−2
compiler/Generate/JavaScript.hs+1−1
@@ -226,7 +226,7 @@ instance ToJS (Expr t v) where
226226 _ -> jsObj $ ("ctor:" ++ show name) : fields
227227 where fields = zipWith (\n e -> "_" ++ show n ++ ":" ++ e) [0..] fs
228228
229− Markdown doc -> return $ "Text.text('" ++ pad ++ md ++ pad ++ "')"
229+ Markdown doc _ -> return $ "Text.text('" ++ pad ++ md ++ pad ++ "')"
230230 where pad = "<div style=\"height:0;width:0;\">&nbsp;</div>"
231231 md = formatMarkdown $ Pan.writeHtmlString Pan.def doc
232232
compiler/Generate/Noscript.hs+1−1
@@ -49,7 +49,7 @@ instance Extract (Expr t v) where
4949 Case e cases -> concatMap (f . snd) cases
5050 Data _ es -> concatMap f es
5151 MultiIf es -> concatMap (f . snd) es
52− Markdown doc -> [ Pan.writeHtmlString Pan.def doc ]
52+ Markdown doc _ -> [ Pan.writeHtmlString Pan.def doc ]
5353 _ -> []
5454
5555extractLink src txt =
compiler/Parse/Expression.hs+23−9
@@ -1,5 +1,6 @@
11module Parse.Expression (def,term) where
22
3+import Control.Arrow ((***))
34import Control.Applicative ((<$>), (<*>))
45import Data.List (foldl')
56import Text.Parsec hiding (newline,spaces)
@@ -51,15 +52,28 @@ negative = do
5152-------- Complex Terms --------
5253
5354listTerm :: IParser (Expr t v)
54−listTerm =
55− (do { try $ string "[markdown|"
56− ; md <- filter (/='\r') <$> manyTill anyChar (try $ string "|]")
57− ; return . Markdown $ Pan.readMarkdown Pan.def md })
58− <|> (braces $ choice
59− [ try $ do { lo <- expr; whitespace; string ".." ; whitespace
60− ; Range lo <$> expr }
61− , ExplicitList <$> commaSep expr
62− ])
55+listTerm = markdown <|> braces (range <|> ExplicitList <$> commaSep expr)
56+ where
57+ range = try $ do lo <- expr
58+ whitespace >> string ".." >> whitespace
59+ Range lo <$> expr
60+
61+ markdown = try (string "[markdown|") >> closeMarkdown "" []
62+ where
63+ closeMarkdown md exprs =
64+ choice [ do try (string "|]")
65+ let toMD = Pan.readMarkdown Pan.def . filter (/='\r')
66+ return $ Markdown (toMD md) (reverse exprs)
67+ , do try (string "{{")
68+ whitespace
69+ e <- expr
70+ whitespace
71+ string "}}"
72+ let span = "<span id=\"md" ++ show (length exprs) ++ "\"></span>"
73+ closeMarkdown (md ++ span) (e:exprs)
74+ , do c <- anyChar
75+ closeMarkdown (md ++ [c]) exprs
76+ ]
6377
6478parensTerm :: IParser (LExpr t v)
6579parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
compiler/SourceSyntax/Expression.hs+2−2
@@ -30,7 +30,7 @@ data Expr t v
3030 | Insert (LExpr t v) String (LExpr t v)
3131 | Modify (LExpr t v) [(String, LExpr t v)]
3232 | Record [(String, LExpr t v)]
33− | Markdown Pandoc.Pandoc
33+ | Markdown Pandoc.Pandoc [LExpr t v]
3434 deriving (Eq, Show, Data, Typeable)
3535
3636data Def tipe var
@@ -94,7 +94,7 @@ instance Pretty (Expr t v) where
9494 where
9595 field (x,e) = variable x <+> P.text "=" <+> pretty e
9696
97− Markdown _ -> P.text "[markdown| ... |]"
97+ Markdown _ _ -> P.text "[markdown| ... |]"
9898
9999instance Pretty (Def t v) where
100100 pretty def =
compiler/Transform/Canonicalize.hs+1−1
@@ -164,7 +164,7 @@ rename env lexpr@(L s expr) =
164164 branch (pattern,e) = (,) `liftM` format (renamePattern env pattern)
165165 `ap` rename (extend env pattern) e
166166
167− Markdown _ -> return expr
167+ Markdown md es -> Markdown md `liftM` mapM rnm es
168168
169169
170170renamePattern :: Env -> Pattern -> Either String Pattern
compiler/Transform/SortDefinitions.hs+1−1
@@ -97,7 +97,7 @@ reorder lexpr@(L s expr) =
9797 Record fields ->
9898 Record `liftM` mapM reorderField fields
9999
100− Markdown _ -> return expr
100+ Markdown md es -> Markdown md <$> mapM reorder es
101101
102102 -- Actually do some reordering
103103 Let defs body ->
compiler/Transform/Substitute.hs+1−1
@@ -27,4 +27,4 @@ subst old new expr =
2727 Modify r fs -> Modify (f r) (map (second f) fs)
2828 Record fs -> Record (map (second f) fs)
2929 Literal _ -> expr
30− Markdown _ -> expr
30+ Markdown md es -> Markdown md (map f es)
compiler/Type/Constrain/Expression.hs+5−2
@@ -134,8 +134,11 @@ constrain env (L span expr) tipe =
134134 recordType = record fields' (TermN EmptyRecord1)
135135 return . ex vars . and $ tipe === recordType : cs
136136
137− Markdown _ ->
138− return ("Graphics.Element.markdown" <? tipe)
137+ Markdown _ es ->
138+ do vars <- forM es $ \_ -> liftIO (var Flexible)
139+ let tvars = map VarN vars
140+ cs <- zipWithM (constrain env) es tvars
141+ return . ex vars $ and ("Graphics.Element.markdown" <? tipe : cs)
139142
140143 Let defs body ->
141144 do c <- constrain env body tipe