@@ -88,7 +88,7 @@ nested p = do
8888 return res
8989
9090specialChars :: [Char]
91−specialChars = "'[]<=&*{}"
91+specialChars = "'[]<=&*{}|"
9292
9393spaceChars :: [Char]
9494spaceChars = " \n\t"
@@ -318,6 +318,7 @@ inline = whitespace
318318 <|> str
319319 <|> strong
320320 <|> emph
321+ <|> image
321322 <|> internalLink
322323 <|> externalLink
323324 <|> inlineTag
@@ -374,9 +375,30 @@ endline = () <$ try (newline <*
374375 notFollowedBy' hrule <*
375376 notFollowedBy anyListStart)
376377
378+image :: MWParser Inlines
379+image = try $ do
380+ sym "[["
381+ sym "File:"
382+ fname <- many1 (noneOf "|]")
383+ _ <- many (try $ char '|' *> imageOption)
384+ caption <- (B.str fname <$ sym "]]")
385+ <|> try (char '|' *> (mconcat <$> manyTill inline (sym "]]")))
386+ return $ B.image fname "image" caption
387+
388+imageOption :: MWParser String
389+imageOption =
390+ try (oneOfStrings [ "border", "thumbnail", "frameless"
391+ , "thumb", "upright", "left", "right"
392+ , "center", "none", "baseline", "sub"
393+ , "super", "top", "text-top", "middle"
394+ , "bottom", "text-bottom" ])
395+ <|> try (string "frame")
396+ <|> try (many1 (oneOf "x0123456789") <* string "px")
397+ <|> try (oneOfStrings ["link=","alt=","page=","class="] <* many (noneOf "|]"))
398+
377399internalLink :: MWParser Inlines
378400internalLink = try $ do
379− string "[["
401+ sym "[["
380402 let addUnderscores x = let (pref,suff) = break (=='#') x
381403 in pref ++ intercalate "_" (words suff)
382404 pagename <- unwords . words <$> many (noneOf "|]")
@@ -385,7 +407,7 @@ internalLink = try $ do
385407 -- the "pipe trick"
386408 -- [[Help:Contents|] -> "Contents"
387409 <|> (return $ B.text $ drop 1 $ dropWhile (/=':') pagename) )
388− string "]]"
410+ sym "]]"
389411 linktrail <- B.text <$> many (char '\'' <|> letter)
390412 return $ B.link (addUnderscores pagename) "wikilink" (label <> linktrail)
391413