@@ -1,5 +1,6 @@
1module Parse.Expression (def,term) where
1module Parse.Expression (def,term) where
3+import Control.Arrow ((***))
3import Control.Applicative ((<$>), (<*>))
4import Control.Applicative ((<$>), (<*>))
4import Data.List (foldl')
5import Data.List (foldl')
5import Text.Parsec hiding (newline,spaces)
6import Text.Parsec hiding (newline,spaces)
@@ -51,15 +52,28 @@ negative = do
51-------- Complex Terms --------
52-------- Complex Terms --------
53listTerm :: IParser (Expr t v)
54listTerm :: IParser (Expr t v)
54−listTerm =
55+listTerm = markdown <|> braces (range <|> ExplicitList <$> commaSep expr)
55− (do { try $ string "[markdown|"
56+ where
56− ; md <- filter (/='\r') <$> manyTill anyChar (try $ string "|]")
57+ range = try $ do lo <- expr
58+ whitespace >> string ".." >> whitespace
61+ markdown = try (string "[markdown|") >> closeMarkdown "" []
63+ closeMarkdown md exprs =
64+ choice [ do try (string "|]")
65+ let toMD = Pan.readMarkdown Pan.def . filter (/='\r')
57− ; return . Markdown $ Pan.readMarkdown Pan.def md })
66+ return $ Markdown (toMD md) (reverse exprs)
58− <|> (braces $ choice
67+ , do try (string "{{")
59− [ try $ do { lo <- expr; whitespace; string ".." ; whitespace
68+ whitespace
60− ; Range lo <$> expr }
69+ e <- expr
61− , ExplicitList <$> commaSep expr
70+ whitespace
72+ let span = "<span id=\"md" ++ show (length exprs) ++ "\"></span>"
73+ closeMarkdown (md ++ span) (e:exprs)
75+ closeMarkdown (md ++ [c]) exprs
64parensTerm :: IParser (LExpr t v)
78parensTerm :: IParser (LExpr t v)
65parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)
79parensTerm = try (parens opFn) <|> parens (tupleFn <|> parened)