git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #3699 from herwigstuetz/org-ref-cites

Org: Fix reading of citations before punctuation

commit345bf8b6156938e60562f1f0f6b6e3354575cfcd authorJohn MacFarlane <jgm@berkeley.edu> dateMon 29 May 2017, 09:25 (9 years ago) parentafb5514bfd5c6b
5 files changed+54−9
src/Text/Pandoc/Parsing.hs+3−2 src/Text/Pandoc/Readers/Org/Inlines.hs+12−4 src/Text/Pandoc/Readers/TWiki.hs+2−2 src/Text/Pandoc/Readers/Textile.hs+1−1 test/Tests/Readers/Org.hs+36
src/Text/Pandoc/Parsing.hs+3−2
@@ -274,11 +274,12 @@ indentWith num = do
274274 , try (char '\t' >> indentWith (num - tabStop)) ]
275275
276276-- | Like @manyTill@, but reads at least one item.
277−many1Till :: Stream s m t
277+many1Till :: (Show end, Stream s m t)
278278 => ParserT s st m a
279279 -> ParserT s st m end
280280 -> ParserT s st m [a]
281281many1Till p end = do
282+ notFollowedBy' end
282283 first <- p
283284 rest <- manyTill p end
284285 return (first:rest)
@@ -343,7 +344,7 @@ blanklines :: Stream s m Char => ParserT s st m [Char]
343344blanklines = many1 blankline
344345
345346-- | Parses material enclosed between start and end parsers.
346−enclosed :: Stream s m Char => ParserT s st m t -- ^ start parser
347+enclosed :: (Show end, Stream s m Char) => ParserT s st m t -- ^ start parser
347348 -> ParserT s st m end -- ^ end parser
348349 -> ParserT s st m a -- ^ content parser (to be used repeatedly)
349350 -> ParserT s st m [a]
src/Text/Pandoc/Readers/Org/Inlines.hs+12−4
@@ -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.
@@ -687,13 +695,13 @@ mathEnd c = try $ do
687695 return res
688696
689697
690−enclosedInlines :: PandocMonad m => OrgParser m a
698+enclosedInlines :: (PandocMonad m, Show b) => OrgParser m a
691699 -> OrgParser m b
692700 -> OrgParser m (F Inlines)
693701enclosedInlines start end = try $
694702 trimInlinesF . mconcat <$> enclosed start end inline
695703
696−enclosedRaw :: PandocMonad m => OrgParser m a
704+enclosedRaw :: (PandocMonad m, Show b) => OrgParser m a
697705 -> OrgParser m b
698706 -> OrgParser m String
699707enclosedRaw start end = try $
src/Text/Pandoc/Readers/TWiki.hs+2−2
@@ -349,13 +349,13 @@ linebreak = newline >> notFollowedBy newline >> (lastNewline <|> innerNewline)
349349 where lastNewline = eof >> return mempty
350350 innerNewline = return B.space
351351
352−between :: (Monoid c, PandocMonad m)
352+between :: (Monoid c, PandocMonad m, Show b)
353353 => TWParser m a -> TWParser m b -> (TWParser m b -> TWParser m c)
354354 -> TWParser m c
355355between start end p =
356356 mconcat <$> try (start >> notFollowedBy whitespace >> many1Till (p end) end)
357357
358−enclosed :: (Monoid b, PandocMonad m)
358+enclosed :: (Monoid b, PandocMonad m, Show a)
359359 => TWParser m a -> (TWParser m a -> TWParser m b) -> TWParser m b
360360enclosed sep p = between sep (try $ sep <* endMarker) p
361361 where
src/Text/Pandoc/Readers/Textile.hs+1−1
@@ -692,7 +692,7 @@ langAttr = do
692692 return $ \(id',classes,keyvals) -> (id',classes,("lang",lang):keyvals)
693693
694694-- | Parses material surrounded by a parser.
695−surrounded :: PandocMonad m
695+surrounded :: (PandocMonad m, Show t)
696696 => ParserT [Char] st m t -- ^ surrounding parser
697697 -> ParserT [Char] st m a -- ^ content parser (to be used repeatedly)
698698 -> ParserT [Char] st m [a]
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