git.iko.soy/typeable/pandoc
on master help sign in
Org reader: Recognize plain and angle links
c128dabAlbert Krewinkel
src/Text/Pandoc/Readers/Org.hs+25−9
@@ -45,7 +45,7 @@ import Control.Applicative ( Applicative, pure
45 , (<$>), (<$), (<*>), (<*), (*>), (<**>) )
45 , (<$>), (<$), (<*>), (<*), (*>), (<**>) )
46import Control.Monad (foldM, guard, liftM, liftM2, when)
46import Control.Monad (foldM, guard, liftM, liftM2, when)
47import Control.Monad.Reader (Reader, runReader, ask, asks)
47import Control.Monad.Reader (Reader, runReader, ask, asks)
48−import Data.Char (toLower)
48+import Data.Char (isAlphaNum, toLower)
49import Data.Default
49import Data.Default
50import Data.List (intersperse, isPrefixOf, isSuffixOf)
50import Data.List (intersperse, isPrefixOf, isSuffixOf)
51import qualified Data.Map as M
51import qualified Data.Map as M
@@ -209,6 +209,9 @@ instance Monoid a => Monoid (F a) where
209trimInlinesF :: F Inlines -> F Inlines
209trimInlinesF :: F Inlines -> F Inlines
210trimInlinesF = liftM trimInlines
210trimInlinesF = liftM trimInlines
211
211
212+returnF :: a -> OrgParser (F a)
213+returnF = return . return
214+
212
215
213-- | Like @Text.Parsec.Char.newline@, but causes additional state changes.
216-- | Like @Text.Parsec.Char.newline@, but causes additional state changes.
214newline :: OrgParser Char
217newline :: OrgParser Char
@@ -291,9 +294,6 @@ orgBlock = try $ do
291 "src" -> codeBlockWithAttr classArgs content
294 "src" -> codeBlockWithAttr classArgs content
292 _ -> return $ B.divWith ("", [blockType], []) <$> contentBlocks
295 _ -> return $ B.divWith ("", [blockType], []) <$> contentBlocks
293 where
296 where
294− returnF :: a -> OrgParser (F a)
295− returnF = return . return
296−
297 parseVerse :: String -> OrgParser (F Blocks)
297 parseVerse :: String -> OrgParser (F Blocks)
298 parseVerse cs =
298 parseVerse cs =
299 fmap B.para . mconcat . intersperse (pure B.linebreak)
299 fmap B.para . mconcat . intersperse (pure B.linebreak)
@@ -834,7 +834,11 @@ noteMarker = try $ do
834 ]
834 ]
835
835
836linkOrImage :: OrgParser (F Inlines)
836linkOrImage :: OrgParser (F Inlines)
837−linkOrImage = explicitOrImageLink <|> selflinkOrImage <?> "link or image"
837+linkOrImage = explicitOrImageLink
838+ <|> selflinkOrImage
839+ <|> angleLink
840+ <|> plainLink
841+ <?> "link or image"
838
842
839explicitOrImageLink :: OrgParser (F Inlines)
843explicitOrImageLink :: OrgParser (F Inlines)
840explicitOrImageLink = try $ do
844explicitOrImageLink = try $ do
@@ -851,15 +855,27 @@ explicitOrImageLink = try $ do
851selflinkOrImage :: OrgParser (F Inlines)
855selflinkOrImage :: OrgParser (F Inlines)
852selflinkOrImage = try $ do
856selflinkOrImage = try $ do
853 src <- char '[' *> linkTarget <* char ']'
857 src <- char '[' *> linkTarget <* char ']'
854− return . return $ if isImageFilename src
858+ returnF $ if isImageFilename src
855− then B.image src "" ""
859+ then B.image src "" ""
856− else B.link src "" (B.str src)
860+ else B.link src "" (B.str src)
861+
862+plainLink :: OrgParser (F Inlines)
863+plainLink = try $ do
864+ (orig, src) <- uri
865+ returnF $ B.link src "" (B.str orig)
866+
867+angleLink :: OrgParser (F Inlines)
868+angleLink = try $ do
869+ char '<'
870+ link <- plainLink
871+ char '>'
872+ return link
857
873
858selfTarget :: OrgParser String
874selfTarget :: OrgParser String
859selfTarget = try $ char '[' *> linkTarget <* char ']'
875selfTarget = try $ char '[' *> linkTarget <* char ']'
860
876
861linkTarget :: OrgParser String
877linkTarget :: OrgParser String
862−linkTarget = enclosed (char '[') (char ']') (noneOf "\n\r]")
878+linkTarget = enclosed (char '[') (char ']') (noneOf "\n\r[]")
863
879
864isImageFilename :: String -> Bool
880isImageFilename :: String -> Bool
865isImageFilename filename =
881isImageFilename filename =
tests/Tests/Readers/Org.hs+14
@@ -188,6 +188,20 @@ tests =
188 , "Image link" =:
188 , "Image link" =:
189 "[[sunset.png][dusk.svg]]" =?>
189 "[[sunset.png][dusk.svg]]" =?>
190 (para $ link "sunset.png" "" (image "dusk.svg" "" ""))
190 (para $ link "sunset.png" "" (image "dusk.svg" "" ""))
191+
192+ , "Plain link" =:
193+ "Posts on http://zeitlens.com/ can be funny at times." =?>
194+ (para $ spcSep [ "Posts", "on"
195+ , link "http://zeitlens.com/" "" "http://zeitlens.com/"
196+ , "can", "be", "funny", "at", "times."
197+ ])
198+
199+ , "Angle link" =:
200+ "Look at <http://moltkeplatz.de> for fnords." =?>
201+ (para $ spcSep [ "Look", "at"
202+ , link "http://moltkeplatz.de" "" "http://moltkeplatz.de"
203+ , "for", "fnords."
204+ ])
191 ]
205 ]
192
206
193 , testGroup "Meta Information" $
207 , testGroup "Meta Information" $