From 4b220d592c163efb0bf5a0e1db2ed7d6be9c69e7 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 18 Dec 2021 12:13:06 -0800
Subject: [PATCH] Citeproc: avoid adding comma before an author-in-text
 citation...

...in a note if it begins with a title (no author).

Closes #7761.
---
 src/Text/Pandoc/Citeproc.hs | 22 ++++++++++++++--------
 test/command/7761.md        | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 8 deletions(-)
 create mode 100644 test/command/7761.md

diff --git a/src/Text/Pandoc/Citeproc.hs b/src/Text/Pandoc/Citeproc.hs
index f235f6e01..03a15e9f6 100644
--- a/src/Text/Pandoc/Citeproc.hs
+++ b/src/Text/Pandoc/Citeproc.hs
@@ -543,7 +543,7 @@ deNote (Note bs) =
   addParens [] = []
   addParens (Cite (c:cs) ils : zs)
     | citationMode c == AuthorInText
-      = Cite (c:cs) (concatMap (noteAfterComma (needsPeriod zs)) ils) :
+      = Cite (c:cs) (addCommas (needsPeriod zs) ils) :
         addParens zs
     | otherwise
       = Cite (c:cs) (concatMap noteInParens ils) : addParens zs
@@ -564,13 +564,19 @@ deNote (Note bs) =
          removeFinalPeriod ils ++ [Str ")"]
   noteInParens x = [x]
 
-  noteAfterComma needsPer (Span ("",["csl-note"],[]) ils)
-    | not (null ils)
-       = Str "," : Space :
-         if needsPer
-            then ils
-            else removeFinalPeriod ils
-  noteAfterComma _ x = [x]
+  -- We want to add a comma before a CSL note citation, but not
+  -- before the author name, and not before the first citation
+  -- if it doesn't begin with an author name.
+  addCommas = addCommas' True -- boolean == "at beginning"
+
+  addCommas' _ _ [] = []
+  addCommas' atBeginning needsPer
+    (Span ("",["csl-note"],[]) ils : rest)
+      | not (null ils)
+       = (if atBeginning then id else ([Str "," , Space] ++)) $
+         (if needsPer then ils else removeFinalPeriod ils) ++
+         addCommas' False needsPer rest
+  addCommas' _ needsPer (il : rest) = il : addCommas' False needsPer rest
 
 deNote x = x
 
diff --git a/test/command/7761.md b/test/command/7761.md
new file mode 100644
index 000000000..0307bcaee
--- /dev/null
+++ b/test/command/7761.md
@@ -0,0 +1,35 @@
+```
+% pandoc --citeproc --csl command/chicago-fullnote-bibliography.csl -t plain
+---
+references:
+- id: noauthor
+  issued: 2020
+  publisher: Oxford University Press
+  publisher-place: Oxford
+  title: Title
+  type: book
+- id: author
+  author:
+  - family: Jones
+    given: Jim
+  issued: 2021
+  title: Title
+  type: book
+  url: "https://duckduckgo.com/cite2021"
+---
+
+Text.[^n]
+
+[^n]: See @author. Another example of a sea level mapping tool with
+similar limitations is @noauthor.
+^D
+Text.[1]
+
+Jones, Jim. Title, 2021. https://duckduckgo.com/cite2021.
+
+Title. Oxford: Oxford University Press, 2020.
+
+[1] See Jim Jones, Title, 2021, https://duckduckgo.com/cite2021. Another
+example of a sea level mapping tool with similar limitations is Title
+(Oxford: Oxford University Press, 2020).
+```