diff options
-rw-r--r-- | src/Text/Pandoc/Biblio.hs | 5 | ||||
-rw-r--r-- | src/Text/Pandoc/Readers/LaTeX.hs | 111 | ||||
-rw-r--r-- | src/Text/Pandoc/Readers/Markdown.hs | 30 | ||||
-rw-r--r-- | tests/Tests/Readers/LaTeX.hs | 13 |
4 files changed, 82 insertions, 77 deletions
diff --git a/src/Text/Pandoc/Biblio.hs b/src/Text/Pandoc/Biblio.hs index 934b9222e..e5b8fe197 100644 --- a/src/Text/Pandoc/Biblio.hs +++ b/src/Text/Pandoc/Biblio.hs @@ -111,10 +111,10 @@ getCitation i | Cite t _ <- i = [t] | otherwise = [] setHash :: Citation -> State Int Citation -setHash (Citation i p s cm nn _) = do +setHash c = do ident <- get put $ ident + 1 - return $ Citation i p s cm nn ident + return c{ citationHash = ident } toCslCite :: Citation -> CSL.Cite toCslCite c @@ -140,6 +140,7 @@ toCslCite c , CSL.citeNoteNumber = show $ citationNoteNum c , CSL.authorInText = fst citMode , CSL.suppressAuthor = snd citMode + , CSL.suppressParens = citationSuppressParens c , CSL.citeHash = citationHash c } diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs index c56ca0bde..54a39f24f 100644 --- a/src/Text/Pandoc/Readers/LaTeX.hs +++ b/src/Text/Pandoc/Readers/LaTeX.hs @@ -426,65 +426,61 @@ inlineCommands = M.fromList $ pure (link url "" lab)) , ("includegraphics", skipopts *> (unescapeURL <$> braced) >>= (\src -> pure (image src "" (str "image")))) - , ("cite", citation "cite" AuthorInText False) - , ("citep", citation "citep" NormalCitation False) - , ("citep*", citation "citep*" NormalCitation False) - , ("citeal", citation "citeal" NormalCitation False) - , ("citealp", citation "citealp" NormalCitation False) - , ("citealp*", citation "citealp*" NormalCitation False) - , ("autocite", citation "autocite" NormalCitation False) - , ("footcite", inNote <$> citation "footcite" NormalCitation False) - , ("parencite", citation "parencite" NormalCitation False) - , ("supercite", citation "supercite" NormalCitation False) - , ("footcitetext", inNote <$> citation "footcitetext" NormalCitation False) - , ("citeyearpar", citation "citeyearpar" SuppressAuthor False) - , ("citeyear", citation "citeyear" SuppressAuthor False) - , ("autocite*", citation "autocite*" SuppressAuthor False) - , ("cite*", citation "cite*" SuppressAuthor False) - , ("parencite*", citation "parencite*" SuppressAuthor False) - , ("textcite", citation "textcite" AuthorInText False) - , ("citet", citation "citet" AuthorInText False) - , ("citet*", citation "citet*" AuthorInText False) - , ("citealt", citation "citealt" AuthorInText False) - , ("citealt*", citation "citealt*" AuthorInText False) - , ("textcites", citation "textcites" AuthorInText True) - , ("cites", citation "cites" NormalCitation True) - , ("autocites", citation "autocites" NormalCitation True) - , ("footcites", inNote <$> citation "footcites" NormalCitation True) - , ("parencites", citation "parencites" NormalCitation True) - , ("supercites", citation "supercites" NormalCitation True) - , ("footcitetexts", inNote <$> citation "footcitetexts" NormalCitation True) - , ("Autocite", citation "Autocite" NormalCitation False) - , ("Footcite", citation "Footcite" NormalCitation False) - , ("Parencite", citation "Parencite" NormalCitation False) - , ("Supercite", citation "Supercite" NormalCitation False) - , ("Footcitetext", inNote <$> citation "Footcitetext" NormalCitation False) - , ("Citeyearpar", citation "Citeyearpar" SuppressAuthor False) - , ("Citeyear", citation "Citeyear" SuppressAuthor False) - , ("Autocite*", citation "Autocite*" SuppressAuthor False) - , ("Cite*", citation "Cite*" SuppressAuthor False) - , ("Parencite*", citation "Parencite*" SuppressAuthor False) - , ("Textcite", citation "Textcite" AuthorInText False) - , ("Textcites", citation "Textcites" AuthorInText True) - , ("Cites", citation "Cites" NormalCitation True) - , ("Autocites", citation "Autocites" NormalCitation True) - , ("Footcites", citation "Footcites" NormalCitation True) - , ("Parencites", citation "Parencites" NormalCitation True) - , ("Supercites", citation "Supercites" NormalCitation True) - , ("Footcitetexts", inNote <$> citation "Footcitetexts" NormalCitation True) + , ("cite", citation "cite" AuthorInText False False) + , ("citep", citation "citep" NormalCitation False False) + , ("citep*", citation "citep*" NormalCitation False False) + , ("citeal", citation "citeal" NormalCitation False False) + , ("citealp", citation "citealp" NormalCitation False False) + , ("citealp*", citation "citealp*" NormalCitation False False) + , ("autocite", citation "autocite" NormalCitation False False) + , ("footcite", citation "footcite" NormalCitation False True) + , ("parencite", citation "parencite" NormalCitation False False) + , ("supercite", citation "supercite" NormalCitation False False) + , ("footcitetext", citation "footcitetext" NormalCitation False True) + , ("citeyearpar", citation "citeyearpar" SuppressAuthor False False) + , ("citeyear", citation "citeyear" SuppressAuthor False False) + , ("autocite*", citation "autocite*" SuppressAuthor False False) + , ("cite*", citation "cite*" SuppressAuthor False False) + , ("parencite*", citation "parencite*" SuppressAuthor False False) + , ("textcite", citation "textcite" AuthorInText False False) + , ("citet", citation "citet" AuthorInText False False) + , ("citet*", citation "citet*" AuthorInText False False) + , ("citealt", citation "citealt" AuthorInText False False) + , ("citealt*", citation "citealt*" AuthorInText False False) + , ("textcites", citation "textcites" AuthorInText True False) + , ("cites", citation "cites" NormalCitation True False) + , ("autocites", citation "autocites" NormalCitation True False) + , ("footcites", citation "footcites" NormalCitation True True) + , ("parencites", citation "parencites" NormalCitation True False) + , ("supercites", citation "supercites" NormalCitation True False) + , ("footcitetexts", citation "footcitetexts" NormalCitation True True) + , ("Autocite", citation "Autocite" NormalCitation False False) + , ("Footcite", citation "Footcite" NormalCitation False False) + , ("Parencite", citation "Parencite" NormalCitation False False) + , ("Supercite", citation "Supercite" NormalCitation False False) + , ("Footcitetext", citation "Footcitetext" NormalCitation False True) + , ("Citeyearpar", citation "Citeyearpar" SuppressAuthor False False) + , ("Citeyear", citation "Citeyear" SuppressAuthor False False) + , ("Autocite*", citation "Autocite*" SuppressAuthor False False) + , ("Cite*", citation "Cite*" SuppressAuthor False False) + , ("Parencite*", citation "Parencite*" SuppressAuthor False False) + , ("Textcite", citation "Textcite" AuthorInText False False) + , ("Textcites", citation "Textcites" AuthorInText True False) + , ("Cites", citation "Cites" NormalCitation True False) + , ("Autocites", citation "Autocites" NormalCitation True False) + , ("Footcites", citation "Footcites" NormalCitation True False) + , ("Parencites", citation "Parencites" NormalCitation True False) + , ("Supercites", citation "Supercites" NormalCitation True False) + , ("Footcitetexts", citation "Footcitetexts" NormalCitation True True) , ("citetext", complexNatbibCitation NormalCitation) , ("citeauthor", (try (tok *> optional sp *> controlSeq "citetext") *> complexNatbibCitation AuthorInText) - <|> citation "citeauthor" AuthorInText False) + <|> citation "citeauthor" AuthorInText False False) ] ++ map ignoreInlines -- these commands will be ignored unless --parse-raw is specified, -- in which case they will appear as raw latex blocks: [ "noindent", "index", "nocite" ] -inNote :: Inlines -> Inlines -inNote ils = - note $ para $ ils <> str "." - unescapeURL :: String -> String unescapeURL ('\\':x:xs) | isEscapable x = x:unescapeURL xs where isEscapable '%' = True @@ -899,6 +895,7 @@ simpleCiteArgs = try $ do , citationSuffix = [] , citationMode = NormalCitation , citationHash = 0 + , citationSuppressParens = False , citationNoteNum = 0 } return $ addPrefix pre $ addSuffix suf $ map conv keys @@ -917,10 +914,14 @@ cites mode multi = try $ do AuthorInText -> c {citationMode = mode} : cs _ -> map (\a -> a {citationMode = mode}) (c:cs) -citation :: String -> CitationMode -> Bool -> LP Inlines -citation name mode multi = do - (c,raw) <- withRaw $ cites mode multi - return $ cite c (rawInline "latex" $ "\\" ++ name ++ raw) +citation :: String -> CitationMode -> Bool -> Bool -> LP Inlines +citation name mode multi inNote = do + (cs,raw) <- withRaw $ cites mode multi + let cs' = if inNote then map (\c -> c{ citationSuppressParens = True }) cs else cs + let cit = cite cs' (rawInline "latex" $ "\\" ++ name ++ raw) + if inNote + then return $ note $ para $ cit <> str "." + else return cit complexNatbibCitation :: CitationMode -> LP Inlines complexNatbibCitation mode = try $ do diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index ab8069a75..1b69660e6 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -1554,12 +1554,13 @@ cite = do textualCite :: Parser [Char] ParserState (F [Citation]) textualCite = try $ do (_, key) <- citeKey - let first = Citation{ citationId = key - , citationPrefix = [] - , citationSuffix = [] - , citationMode = AuthorInText - , citationNoteNum = 0 - , citationHash = 0 + let first = Citation{ citationId = key + , citationPrefix = [] + , citationSuffix = [] + , citationMode = AuthorInText + , citationNoteNum = 0 + , citationSuppressParens = False + , citationHash = 0 } mbrest <- option Nothing $ try $ spnl >> Just <$> normalCite case mbrest of @@ -1624,14 +1625,15 @@ citation = try $ do return $ do x <- pref y <- suff - return $ Citation{ citationId = key - , citationPrefix = B.toList x - , citationSuffix = B.toList y - , citationMode = if suppress_author - then SuppressAuthor - else NormalCitation - , citationNoteNum = 0 - , citationHash = 0 + return $ Citation{ citationId = key + , citationPrefix = B.toList x + , citationSuffix = B.toList y + , citationMode = if suppress_author + then SuppressAuthor + else NormalCitation + , citationNoteNum = 0 + , citationSuppressParens = False + , citationHash = 0 } smart :: Parser [Char] ParserState (F Inlines) diff --git a/tests/Tests/Readers/LaTeX.hs b/tests/Tests/Readers/LaTeX.hs index febc91765..ade998388 100644 --- a/tests/Tests/Readers/LaTeX.hs +++ b/tests/Tests/Readers/LaTeX.hs @@ -62,12 +62,13 @@ tests = [ testGroup "basic" ] baseCitation :: Citation -baseCitation = Citation{ citationId = "item1" - , citationPrefix = [] - , citationSuffix = [] - , citationMode = AuthorInText - , citationNoteNum = 0 - , citationHash = 0 } +baseCitation = Citation{ citationId = "item1" + , citationPrefix = [] + , citationSuffix = [] + , citationMode = AuthorInText + , citationNoteNum = 0 + , citationSuppressParens = False + , citationHash = 0 } rt :: String -> Inlines rt = rawInline "latex" |