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