git.iko.soy/typeable/pandoc
on master help sign in
Org reader: Fix cite parsing behaviour

Until now, org-ref cite keys included special characters also at the end. This caused problems when citations occur right before colons or at the end of a sentence. With this change, all non alphanumeric characters at the end of a cite key are ignored. This also adds `,` to the list of special characters that are legal in cite keys to better mirror the behaviour of org-export.

commitbfd5c6b172b7b4cc471b1ed80673bac545604f62 authorHerwig Stuetz <herwig@herwigstuetz.com> dateTue 23 May 2017, 21:30 (9 years ago) parent5a71632
2 files changed+46−2
src/Text/Pandoc/Readers/Org/Inlines.hs+10−2 test/Tests/Readers/Org.hs+36
src/Text/Pandoc/Readers/Org/Inlines.hs+10−2
@@ -339,8 +339,16 @@ linkLikeOrgRefCite = try $ do
339339-- | Read a citation key. The characters allowed in citation keys are taken
340340-- from the `org-ref-cite-re` variable in `org-ref.el`.
341341orgRefCiteKey :: PandocMonad m => OrgParser m String
342−orgRefCiteKey = try . many1 . satisfy $ \c ->
343− isAlphaNum c || c `elem` ("-_:\\./"::String)
342+orgRefCiteKey =
343+ let citeKeySpecialChars = "-_:\\./," :: String
344+ isCiteKeySpecialChar c = c `elem` citeKeySpecialChars
345+ isCiteKeyChar c = isAlphaNum c || isCiteKeySpecialChar c
346+
347+ in try $ many1Till (satisfy $ isCiteKeyChar)
348+ $ try . lookAhead $ do
349+ many . satisfy $ isCiteKeySpecialChar
350+ satisfy $ not . isCiteKeyChar
351+
344352
345353-- | Supported citation types. Only a small subset of org-ref types is
346354-- supported for now. TODO: rewrite this, use LaTeX reader as template.
test/Tests/Readers/Org.hs+36
@@ -334,6 +334,18 @@ tests =
334334 }
335335 in (para $ cite [citation] "cite:pandoc")
336336
337+ , "Org-ref simple citation with underscores" =:
338+ "cite:pandoc_org_ref" =?>
339+ let citation = Citation
340+ { citationId = "pandoc_org_ref"
341+ , citationPrefix = mempty
342+ , citationSuffix = mempty
343+ , citationMode = AuthorInText
344+ , citationNoteNum = 0
345+ , citationHash = 0
346+ }
347+ in (para $ cite [citation] "cite:pandoc_org_ref")
348+
337349 , "Org-ref simple citation succeeded by comma" =:
338350 "cite:pandoc," =?>
339351 let citation = Citation
@@ -346,6 +358,30 @@ tests =
346358 }
347359 in (para $ cite [citation] "cite:pandoc" <> str ",")
348360
361+ , "Org-ref simple citation succeeded by dot" =:
362+ "cite:pandoc." =?>
363+ let citation = Citation
364+ { citationId = "pandoc"
365+ , citationPrefix = mempty
366+ , citationSuffix = mempty
367+ , citationMode = AuthorInText
368+ , citationNoteNum = 0
369+ , citationHash = 0
370+ }
371+ in (para $ cite [citation] "cite:pandoc" <> str ".")
372+
373+ , "Org-ref simple citation succeeded by colon" =:
374+ "cite:pandoc:" =?>
375+ let citation = Citation
376+ { citationId = "pandoc"
377+ , citationPrefix = mempty
378+ , citationSuffix = mempty
379+ , citationMode = AuthorInText
380+ , citationNoteNum = 0
381+ , citationHash = 0
382+ }
383+ in (para $ cite [citation] "cite:pandoc" <> str ":")
384+
349385 , "Org-ref simple citep citation" =:
350386 "citep:pandoc" =?>
351387 let citation = Citation