@@ -27,7 +27,7 @@ import Text.Pandoc.Error (PandocError(..))
2727import Text.Pandoc.Extensions (pandocExtensions)
2828import Text.Pandoc.Logging (LogMessage(..))
2929import Text.Pandoc.Options (ReaderOptions(..))
30−import Text.Pandoc.Shared (stringify, ordNub, tshow)
30+import Text.Pandoc.Shared (stringify, ordNub, blocksToInlines, tshow)
3131import qualified Text.Pandoc.UTF8 as UTF8
3232import Text.Pandoc.Walk (query, walk, walkM)
3333import Control.Applicative ((<|>))
@@ -49,7 +49,6 @@ import qualified Data.Text as T
4949import System.FilePath (takeExtension)
5050import Safe (lastMay, initSafe)
5151
52−
5352processCitations :: PandocMonad m => Pandoc -> m Pandoc
5453processCitations (Pandoc meta bs) = do
5554 style <- getStyle (Pandoc meta bs)
@@ -99,10 +98,8 @@ processCitations (Pandoc meta bs) = do
9998 let metanocites = lookupMeta "nocite" meta
10099 let Pandoc meta'' bs' =
101100 maybe id (setMeta "nocite") metanocites .
102− walk (mvPunct moveNotes locale) .
103− (if styleIsNoteStyle sopts
104− then walk addNote . walk deNote
105− else id) .
101+ walk (map capitalizeNoteCitation . mvPunct moveNotes locale) .
102+ walk deNote .
106103 evalState (walkM insertResolvedCitations $ Pandoc meta' bs)
107104 $ cits
108105 return $ Pandoc meta''
@@ -564,62 +561,42 @@ extractText (FancyVal x) = toText x
564561extractText (NumVal n) = T.pack (show n)
565562extractText _ = mempty
566563
567−-- Here we take the Spans with class csl-note that are left
568−-- after deNote has removed nested ones, and convert them
569−-- into real notes.
570−addNote :: Inline -> Inline
571−addNote (Span ("",["csl-note"],[]) ils) =
572− Note [Para $
573− B.toList . addTextCase Nothing CapitalizeFirst . B.fromList $ ils]
574−addNote x = x
575−
576−-- Here we handle citation notes that occur inside footnotes
577−-- or other citation notes, in a note style. We don't want
578−-- notes inside notes, so we convert these to parenthesized
579−-- or comma-separated citations.
580−deNote :: Inline -> Inline
581−deNote (Note bs) =
582− case bs of
583− [Para (cit@(Cite (c:_) _) : ils)]
584− | citationMode c /= AuthorInText ->
585− -- if citation is first in note, no need to parenthesize.
586− Note [Para (walk removeNotes $ cit : walk addParens ils)]
587− _ -> Note (walk removeNotes . walk addParens $ bs)
588−
564+capitalizeNoteCitation :: Inline -> Inline
565+capitalizeNoteCitation (Cite cs [Note [Para ils]]) =
566+ Cite cs
567+ [Note [Para $ B.toList $ addTextCase Nothing CapitalizeFirst
568+ $ B.fromList ils]]
569+capitalizeNoteCitation x = x
570+
571+deNote :: [Inline] -> [Inline]
572+deNote [] = []
573+deNote (Note bs:rest) =
574+ Note (walk go bs) : deNote rest
589575 where
590− addParens [] = []
591− addParens (Cite (c:cs) ils : zs)
576+ go [] = []
577+ go (Cite (c:cs) ils : zs)
592578 | citationMode c == AuthorInText
593− = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) :
594− addParens zs
579+ = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) : go zs
595580 | otherwise
596− = Cite (c:cs) (concatMap noteInParens ils) : addParens zs
597− addParens (x:xs) = x : addParens xs
598−
599− removeNotes (Span ("",["csl-note"],[]) ils) = Span ("",[],[]) ils
600− removeNotes x = x
601−
581+ = Cite (c:cs) (concatMap noteInParens ils) : go zs
582+ go (x:xs) = x : go xs
602583 needsPeriod [] = True
603584 needsPeriod (Str t:_) = case T.uncons t of
604585 Nothing -> False
605586 Just (c,_) -> isUpper c
606587 needsPeriod (Space:zs) = needsPeriod zs
607588 needsPeriod _ = False
608−
609− noteInParens (Span ("",["csl-note"],[]) ils)
589+ noteInParens (Note bs')
610590 = Space : Str "(" :
611− removeFinalPeriod ils ++ [Str ")"]
591+ removeFinalPeriod (blocksToInlines bs') ++ [Str ")"]
612592 noteInParens x = [x]
613−
614− noteAfterComma needsPer (Span ("",["csl-note"],[]) ils)
615− | not (null ils)
593+ noteAfterComma needsPer (Note bs')
616594 = Str "," : Space :
617− if needsPer
618− then ils
619− else removeFinalPeriod ils
595+ (if needsPer
596+ then id
597+ else removeFinalPeriod) (blocksToInlines bs')
620598 noteAfterComma _ x = [x]
621−
622−deNote x = x
599+deNote (x:xs) = x : deNote xs
623600
624601-- Note: we can't use dropTextWhileEnd indiscriminately,
625602-- because this would remove the final period on abbreviations like Ibid.