git.iko.soy/typeable/pandoc
on master help sign in
Org reader: Support inline images
commit652c781e375f3678a0ec821663240d4958f324de authorAlbert Krewinkel <tarleb@moltkeplatz.de> dateSat 5 Apr 2014, 16:10 (13 years ago) parentd76d2b7
2 files changed+34−12
src/Text/Pandoc/Readers/Org.hs+24−10 tests/Tests/Readers/Org.hs+10−2
src/Text/Pandoc/Readers/Org.hs+24−10
@@ -39,7 +39,7 @@ import Control.Applicative (pure, (<$>), (<$), (<*>), (<*), (*>), (<**
3939import Control.Monad (guard, mzero)
4040import Data.Char (toLower)
4141import Data.Default
42−import Data.List (foldl')
42+import Data.List (foldl', isPrefixOf, isSuffixOf)
4343import Data.Maybe (listToMaybe, fromMaybe)
4444import Data.Monoid (mconcat, mempty, mappend)
4545
@@ -484,20 +484,26 @@ endline = try $ do
484484 return B.space
485485
486486link :: OrgParser Inlines
487−link = explicitLink <|> selfLink <?> "link"
487+link = explicitOrImageLink <|> selflinkOrImage <?> "link"
488488
489−explicitLink :: OrgParser Inlines
490−explicitLink = try $ do
489+explicitOrImageLink :: OrgParser Inlines
490+explicitOrImageLink = try $ do
491491 char '['
492− src <- enclosedRaw (char '[') (char ']')
493− title <- enclosedInlines (char '[') (char ']')
492+ src <- enclosedRaw (char '[') (char ']')
493+ title <- enclosedRaw (char '[') (char ']')
494+ title' <- parseFromString (mconcat . butLast <$> many inline) (title++"\n")
494495 char ']'
495− return $ B.link src "" title
496+ return $ if (isImage src) && (isImage title)
497+ then B.link src "" (B.image title "" "")
498+ else B.link src "" title'
499+ where butLast = reverse . tail . reverse
496500
497−selfLink :: OrgParser Inlines
498−selfLink = try $ do
501+selflinkOrImage :: OrgParser Inlines
502+selflinkOrImage = try $ do
499503 src <- enclosedRaw (string "[[") (string "]]")
500− return $ B.link src "" (B.str src)
504+ return $ if isImage src
505+ then B.image src "" ""
506+ else B.link src "" (B.str src)
501507
502508emph :: OrgParser Inlines
503509emph = B.emph <$> inlinesEnclosedBy '/'
@@ -606,3 +612,11 @@ endsOnThisLine input c doOnOtherLines = do
606612 then return ()
607613 else endsOnThisLine rest c doOnOtherLines
608614 _ -> mzero
615+
616+isImage filename =
617+ any (\x -> ('.':x) `isSuffixOf` filename) imageExtensions &&
618+ any (\x -> (x++":") `isPrefixOf` filename) protocols ||
619+ ':' `notElem` filename
620+ where
621+ imageExtensions = [ "jpeg" , "jpg" , "png" , "gif" , "svg" ]
622+ protocols = [ "file", "http", "https" ]
tests/Tests/Readers/Org.hs+10−2
@@ -94,14 +94,22 @@ tests =
9494 , (strong ("is" <> space <> "not"))
9595 , "emph/" ])
9696
97+ , "Image" =:
98+ "[[./sunset.jpg]]" =?>
99+ (para $ image "./sunset.jpg" "" "")
100+
97101 , "Explicit link" =:
98− "[[http://zeitlens.com/][pseudo-random nonsense]]" =?>
102+ "[[http://zeitlens.com/][pseudo-random /nonsense/]]" =?>
99103 (para $ link "http://zeitlens.com/" ""
100− ("pseudo-random" <> space <> "nonsense"))
104+ ("pseudo-random" <> space <> emph "nonsense"))
101105
102106 , "Self-link" =:
103107 "[[http://zeitlens.com/]]" =?>
104108 (para $ link "http://zeitlens.com/" "" "http://zeitlens.com/")
109+
110+ , "Image link" =:
111+ "[[sunset.png][dusk.svg]]" =?>
112+ (para $ link "sunset.png" "" (image "dusk.svg" "" ""))
105113 ]
106114
107115 , testGroup "Meta Information" $