b9f77ed03d
Issue #1977 Most markdown processors support the [shortcut format] for reference links. Pandoc's markdown reader parsed this shortcuts unoptionally. Pandoc's markdown writer (with --reference-links option) never shortcutted links. This commit adds an extension `shortcut_reference_links`. The extension is enabled by default for those markdown flavors that support reading shortcut reference links, namely: - pandoc - strict pandoc - github flavoured - PHPmarkdown If extension is enabled, reader parses the shortcuts in the same way as it preveously did. Otherwise it would parse them as normal text. If extension is enabled, writer outputs shortcut reference links unless doing so would cause problems (see test cases in `tests/Tests/Writers/Markdown.hs`).
127 lines
5 KiB
Haskell
127 lines
5 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
|
|
module Tests.Writers.Markdown (tests) where
|
|
|
|
import Test.Framework
|
|
import Text.Pandoc.Builder
|
|
import Text.Pandoc
|
|
import Tests.Helpers
|
|
import Tests.Arbitrary()
|
|
|
|
markdown :: (ToString a, ToPandoc a) => a -> String
|
|
markdown = writeMarkdown def . toPandoc
|
|
|
|
{-
|
|
"my test" =: X =?> Y
|
|
|
|
is shorthand for
|
|
|
|
test markdown "my test" $ X =?> Y
|
|
|
|
which is in turn shorthand for
|
|
|
|
test markdown "my test" (X,Y)
|
|
-}
|
|
|
|
infix 4 =:
|
|
(=:) :: (ToString a, ToPandoc a)
|
|
=> String -> (a, String) -> Test
|
|
(=:) = test markdown
|
|
|
|
tests :: [Test]
|
|
tests = [ "indented code after list"
|
|
=: (orderedList [ para "one" <> para "two" ] <> codeBlock "test")
|
|
=?> "1. one\n\n two\n\n<!-- -->\n\n test"
|
|
, "list with tight sublist"
|
|
=: bulletList [ plain "foo" <> bulletList [ plain "bar" ],
|
|
plain "baz" ]
|
|
=?> "- foo\n - bar\n- baz\n"
|
|
] ++ [shortcutLinkRefsTests]
|
|
|
|
shortcutLinkRefsTests :: Test
|
|
shortcutLinkRefsTests =
|
|
let infix 4 =:
|
|
(=:) :: (ToString a, ToPandoc a)
|
|
=> String -> (a, String) -> Test
|
|
(=:) = test (writeMarkdown (def {writerReferenceLinks = True}) . toPandoc)
|
|
in testGroup "Shortcut reference links"
|
|
[ "Simple link (shortcutable)"
|
|
=: (para (link "/url" "title" "foo"))
|
|
=?> "[foo]\n\n [foo]: /url \"title\""
|
|
, "Followed by another link (unshortcutable)"
|
|
=: (para ((link "/url1" "title1" "first")
|
|
<> (link "/url2" "title2" "second")))
|
|
=?> unlines [ "[first][][second]"
|
|
, ""
|
|
, " [first]: /url1 \"title1\""
|
|
, " [second]: /url2 \"title2\""
|
|
]
|
|
, "Followed by space and another link (unshortcutable)"
|
|
=: (para ((link "/url1" "title1" "first") <> " "
|
|
<> (link "/url2" "title2" "second")))
|
|
=?> unlines [ "[first][] [second]"
|
|
, ""
|
|
, " [first]: /url1 \"title1\""
|
|
, " [second]: /url2 \"title2\""
|
|
]
|
|
, "Reference link is used multiple times (unshortcutable)"
|
|
=: (para ((link "/url1" "" "foo") <> (link "/url2" "" "foo")
|
|
<> (link "/url3" "" "foo")))
|
|
=?> unlines [ "[foo][][foo][1][foo][2]"
|
|
, ""
|
|
, " [foo]: /url1"
|
|
, " [1]: /url2"
|
|
, " [2]: /url3"
|
|
]
|
|
, "Reference link is used multiple times (unshortcutable)"
|
|
=: (para ((link "/url1" "" "foo") <> " " <> (link "/url2" "" "foo")
|
|
<> " " <> (link "/url3" "" "foo")))
|
|
=?> unlines [ "[foo][] [foo][1] [foo][2]"
|
|
, ""
|
|
, " [foo]: /url1"
|
|
, " [1]: /url2"
|
|
, " [2]: /url3"
|
|
]
|
|
, "Reference link is followed by text in brackets"
|
|
=: (para ((link "/url" "" "link") <> "[text in brackets]"))
|
|
=?> unlines [ "[link][][text in brackets]"
|
|
, ""
|
|
, " [link]: /url"
|
|
]
|
|
, "Reference link is followed by space and text in brackets"
|
|
=: (para ((link "/url" "" "link") <> " [text in brackets]"))
|
|
=?> unlines [ "[link][] [text in brackets]"
|
|
, ""
|
|
, " [link]: /url"
|
|
]
|
|
, "Reference link is followed by RawInline"
|
|
=: (para ((link "/url" "" "link") <> rawInline "markdown" "[rawText]"))
|
|
=?> unlines [ "[link][][rawText]"
|
|
, ""
|
|
, " [link]: /url"
|
|
]
|
|
, "Reference link is followed by space and RawInline"
|
|
=: (para ((link "/url" "" "link") <> space <> rawInline "markdown" "[rawText]"))
|
|
=?> unlines [ "[link][] [rawText]"
|
|
, ""
|
|
, " [link]: /url"
|
|
]
|
|
, "Reference link is followed by RawInline with space"
|
|
=: (para ((link "/url" "" "link") <> rawInline "markdown" " [rawText]"))
|
|
=?> unlines [ "[link][] [rawText]"
|
|
, ""
|
|
, " [link]: /url"
|
|
]
|
|
, "Reference link is followed by citation"
|
|
=: (para ((link "/url" "" "link") <> cite [Citation "author" [] [] NormalCitation 0 0] (str "[@author]")))
|
|
=?> unlines [ "[link][][@author]"
|
|
, ""
|
|
, " [link]: /url"
|
|
]
|
|
, "Reference link is followed by space and citation"
|
|
=: (para ((link "/url" "" "link") <> space <> cite [Citation "author" [] [] NormalCitation 0 0] (str "[@author]")))
|
|
=?> unlines [ "[link][] [@author]"
|
|
, ""
|
|
, " [link]: /url"
|
|
]
|
|
]
|