@@ -27,7 +27,7 @@ import Text.Pandoc.Error (PandocError(..))
27import Text.Pandoc.Extensions (pandocExtensions)
27import Text.Pandoc.Extensions (pandocExtensions)
28import Text.Pandoc.Logging (LogMessage(..))
28import Text.Pandoc.Logging (LogMessage(..))
29import Text.Pandoc.Options (ReaderOptions(..))
29import Text.Pandoc.Options (ReaderOptions(..))
30−import Text.Pandoc.Shared (stringify, ordNub, blocksToInlines, tshow)
30+import Text.Pandoc.Shared (stringify, ordNub, tshow)
31import qualified Text.Pandoc.UTF8 as UTF8
31import qualified Text.Pandoc.UTF8 as UTF8
32import Text.Pandoc.Walk (query, walk, walkM)
32import Text.Pandoc.Walk (query, walk, walkM)
33import Control.Applicative ((<|>))
33import Control.Applicative ((<|>))
@@ -49,6 +49,7 @@ import qualified Data.Text as T
49import System.FilePath (takeExtension)
49import System.FilePath (takeExtension)
50import Safe (lastMay, initSafe)
50import Safe (lastMay, initSafe)
52processCitations :: PandocMonad m => Pandoc -> m Pandoc
53processCitations :: PandocMonad m => Pandoc -> m Pandoc
53processCitations (Pandoc meta bs) = do
54processCitations (Pandoc meta bs) = do
54 style <- getStyle (Pandoc meta bs)
55 style <- getStyle (Pandoc meta bs)
@@ -99,7 +100,9 @@ processCitations (Pandoc meta bs) = do
99 let Pandoc meta'' bs' =
100 let Pandoc meta'' bs' =
100 maybe id (setMeta "nocite") metanocites .
101 maybe id (setMeta "nocite") metanocites .
101 walk (map capitalizeNoteCitation . mvPunct moveNotes locale) .
102 walk (map capitalizeNoteCitation . mvPunct moveNotes locale) .
103+ (if styleIsNoteStyle sopts
102− walk deNote .
104+ then walk addNote . walk deNote
103 evalState (walkM insertResolvedCitations $ Pandoc meta' bs)
106 evalState (walkM insertResolvedCitations $ Pandoc meta' bs)
105 return $ Pandoc meta''
108 return $ Pandoc meta''
@@ -568,33 +571,46 @@ capitalizeNoteCitation (Cite cs [Note [Para ils]]) =
568 $ B.fromList ils]]
571 $ B.fromList ils]]
569capitalizeNoteCitation x = x
572capitalizeNoteCitation x = x
574+addNote :: Inline -> Inline
575+addNote (Span ("",["csl-note"],[]) ils) = Note [Para ils]
571deNote :: [Inline] -> [Inline]
578deNote :: [Inline] -> [Inline]
572deNote [] = []
579deNote [] = []
573deNote (Note bs:rest) =
580deNote (Note bs:rest) =
582+ [Para (cit@(Cite (c:_) _) : ils)]
583+ | citationMode c /= AuthorInText ->
584+ -- if citation is first in note, no need to parenthesize.
585+ Note [Para (walk removeNotes $ cit : walk addParens ils)]
574− Note (walk go bs) : deNote rest
587+ _ -> Note (walk removeNotes . walk addParens $ bs) : deNote rest
576− go [] = []
589+ addParens [] = []
577− go (Cite (c:cs) ils : zs)
590+ addParens (Cite (c:cs) ils : zs)
578 | citationMode c == AuthorInText
591 | citationMode c == AuthorInText
579− = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) : go zs
592+ = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) :
580 | otherwise
594 | otherwise
581− = Cite (c:cs) (concatMap noteInParens ils) : go zs
595+ = Cite (c:cs) (concatMap noteInParens ils) : addParens zs
582− go (x:xs) = x : go xs
596+ addParens (x:xs) = x : addParens xs
597+ removeNotes (Span ("",["csl-note"],[]) ils) = Span ("",[],[]) ils
583 needsPeriod [] = True
599 needsPeriod [] = True
584 needsPeriod (Str t:_) = case T.uncons t of
600 needsPeriod (Str t:_) = case T.uncons t of
585 Nothing -> False
601 Nothing -> False
586 Just (c,_) -> isUpper c
602 Just (c,_) -> isUpper c
587 needsPeriod (Space:zs) = needsPeriod zs
603 needsPeriod (Space:zs) = needsPeriod zs
588 needsPeriod _ = False
604 needsPeriod _ = False
589− noteInParens (Note bs')
605+ noteInParens (Span ("",["csl-note"],[]) ils)
590 = Space : Str "(" :
606 = Space : Str "(" :
591− removeFinalPeriod (blocksToInlines bs') ++ [Str ")"]
607+ removeFinalPeriod ils ++ [Str ")"]
592 noteInParens x = [x]
608 noteInParens x = [x]
593− noteAfterComma needsPer (Note bs')
609+ noteAfterComma needsPer (Span ("",["csl-note"],[]) ils)
594 = Str "," : Space :
610 = Str "," : Space :
595− (if needsPer
611+ if needsPer
596− then id
612+ then ils
597− else removeFinalPeriod) (blocksToInlines bs')
613+ else removeFinalPeriod ils
598 noteAfterComma _ x = [x]
614 noteAfterComma _ x = [x]
599deNote (x:xs) = x : deNote xs
615deNote (x:xs) = x : deNote xs