git.iko.soy/typeable/pandoc
on master help sign in
Jira: support citations, attachment links, and user links

Closes: #6231 Closes: #6238 Closes: #6239

commitc3f539364aea5065be1d6774cd62f40a1918e773 authorAlbert Krewinkel <albert@zeitkraut.de> dateSat 4 Apr 2020, 14:27 (7 years ago) parentd867cac
6 files changed+109−9
pandoc.cabal+1−1 src/Text/Pandoc/Readers/Jira.hs+15−1 src/Text/Pandoc/Writers/Jira.hs+25−3 stack.yaml+1−1 test/Tests/Readers/Jira.hs+33−3 test/Tests/Writers/Jira.hs+34
pandoc.cabal+1−1
@@ -412,7 +412,7 @@ library
412412 blaze-html >= 0.9 && < 0.10,
413413 blaze-markup >= 0.8 && < 0.9,
414414 vector >= 0.10 && < 0.13,
415− jira-wiki-markup >= 1.2.1 && < 1.3,
415+ jira-wiki-markup >= 1.3 && < 1.4,
416416 hslua >= 1.0.1 && < 1.2,
417417 hslua-module-system >= 0.2 && < 0.3,
418418 hslua-module-text >= 0.2 && < 0.3,
src/Text/Pandoc/Readers/Jira.hs+15−1
@@ -119,13 +119,14 @@ jiraToPandocInlines :: Jira.Inline -> Inlines
119119jiraToPandocInlines = \case
120120 Jira.Anchor t -> spanWith (t, [], []) mempty
121121 Jira.AutoLink url -> link (Jira.fromURL url) "" (str (Jira.fromURL url))
122+ Jira.Citation ils -> str "—" <> space <> emph (fromInlines ils)
122123 Jira.ColorInline c ils -> spanWith ("", [], [("color", colorName c)]) $
123124 fromInlines ils
124125 Jira.Emoji icon -> str . iconUnicode $ icon
125126 Jira.Entity entity -> str . fromEntity $ entity
126127 Jira.Image params url -> let (title, attr) = imgParams params
127128 in imageWith attr (Jira.fromURL url) title mempty
128− Jira.Link alias url -> link (Jira.fromURL url) "" (fromInlines alias)
129+ Jira.Link lt alias url -> jiraLinkToPandoc lt alias url
129130 Jira.Linebreak -> linebreak
130131 Jira.Monospaced inlns -> code . stringify . toList . fromInlines $ inlns
131132 Jira.Space -> space
@@ -157,6 +158,19 @@ jiraToPandocInlines = \case
157158 _ -> let kv = (Jira.parameterKey p, Jira.parameterValue p)
158159 in (title, (ident, classes, kv:kvs))
159160
161+-- | Convert a Jira link to pandoc inlines.
162+jiraLinkToPandoc :: Jira.LinkType -> [Jira.Inline] -> Jira.URL -> Inlines
163+jiraLinkToPandoc linkType alias url =
164+ let url' = (if linkType == Jira.User then ("~" <>) else id) $ Jira.fromURL url
165+ alias' = case alias of
166+ [] -> str url'
167+ _ -> foldMap jiraToPandocInlines alias
168+ in case linkType of
169+ Jira.External -> link url' "" alias'
170+ Jira.Email -> link ("mailto:" <> url') "" alias'
171+ Jira.Attachment -> linkWith ("", ["attachment"], []) url' "" alias'
172+ Jira.User -> linkWith ("", ["user-account"], []) url' "" alias'
173+
160174-- | Get unicode representation of a Jira icon.
161175iconUnicode :: Jira.Icon -> Text
162176iconUnicode = \case
src/Text/Pandoc/Writers/Jira.hs+25−3
@@ -1,5 +1,6 @@
11{-# LANGUAGE LambdaCase #-}
22{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE PatternGuards #-}
34{- |
45 Module : Text.Pandoc.Writers.Jira
56 Copyright : © 2010-2020 Albert Krewinkel, John MacFarlane
@@ -25,7 +26,7 @@ import Text.Pandoc.Class.PandocMonad (PandocMonad)
2526import Text.Pandoc.Definition
2627import Text.Pandoc.Options (WriterOptions (writerTemplate, writerWrapText),
2728 WrapOption (..))
28−import Text.Pandoc.Shared (linesToPara)
29+import Text.Pandoc.Shared (linesToPara, stringify)
2930import Text.Pandoc.Templates (renderTemplate)
3031import Text.Pandoc.Writers.Math (texMathToInlines)
3132import Text.Pandoc.Writers.Shared (defField, metaToContext)
@@ -193,8 +194,7 @@ toJiraInlines inlines = do
193194 Emph xs -> styled Jira.Emphasis xs
194195 Image attr _ tgt -> imageToJira attr (fst tgt) (snd tgt)
195196 LineBreak -> pure . singleton $ Jira.Linebreak
196− Link _ xs (tgt, _) -> singleton . flip Jira.Link (Jira.URL tgt)
197− <$> toJiraInlines xs
197+ Link attr xs tgt -> toJiraLink attr tgt xs
198198 Math mtype cs -> mathToJira mtype cs
199199 Note bs -> registerNotes bs
200200 Quoted qt xs -> quotedToJira qt xs
@@ -242,6 +242,28 @@ imageToJira (_, classes, kvs) src title =
242242 else Jira.Parameter "title" title : imgParams
243243 in pure . singleton $ Jira.Image imgParams' (Jira.URL src)
244244
245+-- | Creates a Jira Link element.
246+toJiraLink :: PandocMonad m
247+ => Attr
248+ -> Target
249+ -> [Inline]
250+ -> JiraConverter m [Jira.Inline]
251+toJiraLink (_, classes, _) (url, _) alias = do
252+ let (linkType, url') = toLinkType url
253+ description <- if url `elem` [stringify alias, "mailto:" <> stringify alias]
254+ then pure mempty
255+ else toJiraInlines alias
256+ pure . singleton $ Jira.Link linkType description (Jira.URL url')
257+ where
258+ toLinkType url'
259+ | Just email <- T.stripPrefix "mailto:" url' = (Jira.Email, email)
260+ | "user-account" `elem` classes = (Jira.User, dropTilde url)
261+ | "attachment" `elem` classes = (Jira.Attachment, url)
262+ | otherwise = (Jira.External, url)
263+ dropTilde txt = case T.uncons txt of
264+ Just ('~', username) -> username
265+ _ -> txt
266+
245267mathToJira :: PandocMonad m
246268 => MathType
247269 -> Text
stack.yaml+1−1
@@ -20,7 +20,7 @@ extra-deps:
2020- regex-pcre-builtin-0.95.0.8.8.35
2121- doclayout-0.3
2222- emojis-0.1
23−- jira-wiki-markup-1.2.0
23+- jira-wiki-markup-1.3.0
2424- HsYAML-0.2.0.0
2525- HsYAML-aeson-0.2.0.0
2626- doctemplates-0.8.1
test/Tests/Readers/Jira.hs+33−3
@@ -111,6 +111,10 @@ tests =
111111 "HCO ~3~^-^" =?>
112112 para ("HCO " <> subscript "3" <> superscript "-")
113113
114+ , "citation" =:
115+ "Et tu, Brute? ??Caesar??" =?>
116+ para ("Et tu, Brute? — " <> emph "Caesar")
117+
114118 , "color" =:
115119 "This is {color:red}red{color}." =?>
116120 para ("This is " <> spanWith ("", [], [("color", "red")]) "red" <> ".")
@@ -123,9 +127,35 @@ tests =
123127 "first\nsecond" =?>
124128 para ("first" <> linebreak <> "second")
125129
126− , "link" =:
127− "[Example|https://example.org]" =?>
128− para (link "https://example.org" "" "Example")
130+ , testGroup "links"
131+ [ "external" =:
132+ "[Example|https://example.org]" =?>
133+ para (link "https://example.org" "" "Example")
134+
135+ , "email" =:
136+ "[mailto:me@example.org]" =?>
137+ para (link "mailto:me@example.org" "" "me@example.org")
138+
139+ , "email with description" =:
140+ "[email|mailto:me@example.org]" =?>
141+ para (link "mailto:me@example.org" "" "email")
142+
143+ , "attachment" =:
144+ "[^example.txt]" =?>
145+ para (linkWith ("", ["attachment"], []) "example.txt" "" "example.txt")
146+
147+ , "attachment with description" =:
148+ "[an example^example.txt]" =?>
149+ para (linkWith ("", ["attachment"], []) "example.txt" "" "an example")
150+
151+ , "user" =:
152+ "[~johndoe]" =?>
153+ para (linkWith ("", ["user-account"], []) "~johndoe" "" "~johndoe")
154+
155+ , "user with description" =:
156+ "[John Doe|~johndoe]" =?>
157+ para (linkWith ("", ["user-account"], []) "~johndoe" "" "John Doe")
158+ ]
129159
130160 , "image" =:
131161 "!https://example.com/image.jpg!" =?>
test/Tests/Writers/Jira.hs+34
@@ -28,5 +28,39 @@ tests =
2828 imageWith ("", [], [("align", "right"), ("height", "50")])
2929 "image.png" "" mempty =?>
3030 "!image.png|align=right, height=50!"
31+
32+ , testGroup "links"
33+ [ "external link" =:
34+ link "https://example.com/test.php" "" "test" =?>
35+ "[test|https://example.com/test.php]"
36+
37+ , "external link without description" =:
38+ link "https://example.com/tmp.js" "" "https://example.com/tmp.js" =?>
39+ "[https://example.com/tmp.js]"
40+
41+ , "email link" =:
42+ link "mailto:me@example.com" "" "Jane" =?>
43+ "[Jane|mailto:me@example.com]"
44+
45+ , "email link without description" =:
46+ link "mailto:me@example.com" "" "me@example.com" =?>
47+ "[mailto:me@example.com]"
48+
49+ , "attachment link" =:
50+ linkWith ("", ["attachment"], []) "foo.txt" "" "My file" =?>
51+ "[My file^foo.txt]"
52+
53+ , "attachment link without description" =:
54+ linkWith ("", ["attachment"], []) "foo.txt" "" "foo.txt" =?>
55+ "[^foo.txt]"
56+
57+ , "user link" =:
58+ linkWith ("", ["user-account"], []) "~johndoe" "" "John Doe" =?>
59+ "[John Doe|~johndoe]"
60+
61+ , "user link with user as description" =:
62+ linkWith ("", ["user-account"], []) "~johndoe" "" "~johndoe" =?>
63+ "[~johndoe]"
64+ ]
3165 ]
3266 ]