@@ -37,6 +37,7 @@ import Text.Pandoc.Parsing hiding (newline, orderedListMarker, updateL
37import Text.Pandoc.Shared (compactify')
37import Text.Pandoc.Shared (compactify')
39import Control.Applicative (pure, (<$>), (<$), (<*>), (<*), (*>), (<**>))
39import Control.Applicative (pure, (<$>), (<$), (<*>), (<*), (*>), (<**>))
40+import Control.Arrow ((***))
40import Control.Monad (guard, when)
41import Control.Monad (guard, when)
41import Data.Char (toLower)
42import Data.Char (toLower)
42import Data.Default
43import Data.Default
@@ -158,6 +159,7 @@ block = choice [ mempty <$ blanklines
158 , orgBlock
159 , orgBlock
159 , example
160 , example
161 , specialLine
163 , specialLine
@@ -252,6 +254,43 @@ drawerEnd = try $
252 skipSpaces *> stringAnyCase ":END:" <* skipSpaces <* newline
254 skipSpaces *> stringAnyCase ":END:" <* skipSpaces <* newline
261+-- Figures (Image on a line by itself, preceded by name and/or caption)
262+figure :: OrgParser Blocks
264+ (tit, cap) <- (maybe mempty withFigPrefix *** fromMaybe mempty)
265+ <$> nameAndOrCaption
266+ src <- skipSpaces *> selfTarget <* skipSpaces <* newline
267+ guard (isImageFilename src)
268+ return . B.para $ B.image src tit cap
269+ where withFigPrefix cs = if "fig:" `isPrefixOf` cs
273+nameAndOrCaption :: OrgParser (Maybe String, Maybe Inlines)
274+nameAndOrCaption = try $ nameFirst <|> captionFirst
276+ nameFirst = try $ do
278+ c <- optionMaybe caption
280+ captionFirst = try $ do
282+ n <- optionMaybe name
285+caption :: OrgParser Inlines
286+caption = try $ annotation "CAPTION" *> inlinesTillNewline
288+name :: OrgParser String
289+name = try $ annotation "NAME" *> skipSpaces *> manyTill anyChar newline
291+annotation :: String -> OrgParser String
292+annotation ann = try $ metaLineStart *> stringAnyCase ann <* char ':'
255-- Comments, Options and Metadata
294-- Comments, Options and Metadata
256specialLine :: OrgParser Blocks
295specialLine :: OrgParser Blocks
257specialLine = try $ metaLine <|> commentLine
296specialLine = try $ metaLine <|> commentLine
@@ -277,7 +316,7 @@ declarationLine = try $ do
277 return mempty
316 return mempty
279metaValue :: OrgParser MetaValue
318metaValue :: OrgParser MetaValue
280−metaValue = MetaInlines . B.toList . trimInlines <$> restOfLine
319+metaValue = MetaInlines . B.toList <$> inlinesTillNewline
282metaKey :: OrgParser String
321metaKey :: OrgParser String
283metaKey = map toLower <$> many1 (noneOf ": \n\r")
322metaKey = map toLower <$> many1 (noneOf ": \n\r")
@@ -288,7 +327,7 @@ metaKey = map toLower <$> many1 (noneOf ": \n\r")
288header :: OrgParser Blocks
327header :: OrgParser Blocks
289header = try $
328header = try $
290 B.header <$> headerStart
329 B.header <$> headerStart
291− <*> (trimInlines <$> restOfLine)
330+ <*> inlinesTillNewline
293headerStart :: OrgParser Int
332headerStart :: OrgParser Int
294headerStart = try $
333headerStart = try $
@@ -424,13 +463,10 @@ setAligns aligns t = t{ orgTableAlignments = aligns }
424-- Paragraphs or Plain text
463-- Paragraphs or Plain text
425paraOrPlain :: OrgParser Blocks
464paraOrPlain :: OrgParser Blocks
426paraOrPlain = try $
465paraOrPlain = try $
427− trimInlines . mconcat
430− (try $ newline *> pure B.para)
466+ parseInlines <**> option B.plain (try $ newline *> pure B.para)
432−restOfLine :: OrgParser Inlines
468+inlinesTillNewline :: OrgParser Inlines
433−restOfLine = mconcat <$> manyTill inline newline
469+inlinesTillNewline = trimInlines . mconcat <$> manyTill inline newline
@@ -523,6 +559,8 @@ inline =
523 ] <* (guard =<< newlinesCountWithinLimits)
559 ] <* (guard =<< newlinesCountWithinLimits)
524 <?> "inline"
560 <?> "inline"
562+parseInlines :: OrgParser Inlines
563+parseInlines = trimInlines . mconcat <$> many1 inline
527-- treat these as potentially non-text when parsing inline:
565-- treat these as potentially non-text when parsing inline:
528specialChars :: [Char]
566specialChars :: [Char]
@@ -580,6 +618,9 @@ selflinkOrImage = try $ do
580 then B.image src "" ""
618 then B.image src "" ""
581 else B.link src "" (B.str src)
619 else B.link src "" (B.str src)
621+selfTarget :: OrgParser String
622+selfTarget = try $ char '[' *> linkTarget <* char ']'
583linkTarget :: OrgParser String
624linkTarget :: OrgParser String
584linkTarget = enclosed (char '[') (char ']') (noneOf "\n\r]")
625linkTarget = enclosed (char '[') (char ']') (noneOf "\n\r]")