@@ -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)
@@ -49,15 +50,28 @@ negative = do
4950-------- Complex Terms --------
5051
5152listTerm :: IParser (Expr t v)
52−listTerm =
53− (do { try $ string "[markdown|"
54− ; md <- filter (/='\r') <$> manyTill anyChar (try $ string "|]")
55− ; return . Markdown $ Pan.readMarkdown Pan.def md })
56− <|> (braces $ choice
57− [ try $ do { lo <- expr; whitespace; string ".." ; whitespace
58− ; Range lo <$> expr }
59− , ExplicitList <$> commaSep expr
60− ])
53+listTerm = markdown <|> braces (range <|> ExplicitList <$> commaSep expr)
54+ where
55+ range = try $ do lo <- expr
56+ whitespace >> string ".." >> whitespace
57+ Range lo <$> expr
58+
59+ markdown = try (string "[markdown|") >> closeMarkdown "" []
60+ where
61+ closeMarkdown md exprs =
62+ choice [ do try (string "|]")
63+ let toMD = Pan.readMarkdown Pan.def . filter (/='\r')
64+ return $ Markdown (toMD md) (reverse exprs)
65+ , do try (string "{{")
66+ whitespace
67+ e <- expr
68+ whitespace
69+ string "}}"
70+ let span = "<span id=\"md" ++ show (length exprs) ++ "\"></span>"
71+ closeMarkdown (md ++ span) (e:exprs)
72+ , do c <- anyChar
73+ closeMarkdown (md ++ [c]) exprs
74+ ]
6175
6276parensTerm :: IParser (LExpr t v)
6377parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)