packages feed

citeproc 0.1.1 → 0.1.1.1

raw patch · 4 files changed

+1511/−7 lines, 4 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -1,5 +1,14 @@ # citeproc changelog +## 0.1.1.1++  * Pay attention to citationNoteNumber in computing position.+    In calculating whether an item is alone in its citation,+    we need to take into account citationNoteNumber, since+    two citations may occur in the same note and they should+    not be ranked "alone." See jgm/pandoc#6813,+    citation-style-language/documentation#121+ ## 0.1.1    * Ensure that uncited references are sorted last
citeproc.cabal view
@@ -1,6 +1,6 @@ cabal-version:       2.2 name:                citeproc-version:             0.1.1+version:             0.1.1.1 synopsis:            Generates citations and bibliography from CSL styles. description:         citeproc parses CSL style files and uses them to                      generate a list of formatted citations and bibliography
src/Citeproc/Eval.hs view
@@ -63,6 +63,7 @@                                           Bool, Maybe Text, Maybe Text)                         -- (citegroup, noteNum, posInGroup,                         --      aloneInCitation, label, locator)+  , stateNoteMap        :: M.Map Int (Set.Set ItemId) -- ids cited in note   , stateRefMap         :: ReferenceMap a   , stateReference      :: Reference a   , stateUsedYearSuffix :: Bool@@ -103,6 +104,7 @@       EvalState       { stateVarCount = VarCount 0 0       , stateLastCitedMap = mempty+      , stateNoteMap = mempty       , stateRefMap = makeReferenceMap refs       , stateReference = Reference mempty mempty Nothing mempty       , stateUsedYearSuffix = False@@ -394,7 +396,8 @@                        | ident <- refIds                        , not (ident `Set.member` citeIds)]   allCites <- withRWST (\ctx st -> (ctx,-                                    st { stateLastCitedMap = mempty })) $+                                    st { stateLastCitedMap = mempty+                                       , stateNoteMap = mempty })) $                mapM (evalLayout False (styleCitation style))                             (zip [1..] (citations ++ ghostCitations)) @@ -452,7 +455,8 @@                      refIds }            -- redo citations            withRWST (\ctx st -> (ctx,-                                 st { stateLastCitedMap = mempty })) $+                                 st { stateLastCitedMap = mempty+                                    , stateNoteMap = mempty })) $              mapM (evalLayout False (styleCitation style))                    (zip [1..] (citations ++ ghostCitations)) @@ -461,7 +465,8 @@     ambiguities -> do       analyzeAmbiguities bibSortKeyMap strategy (map snd ambiguities)       withRWST (\ctx st -> (ctx,-                            st { stateLastCitedMap = mempty })) $+                            st { stateLastCitedMap = mempty+                               , stateNoteMap = mempty })) $         mapM (evalLayout False (styleCitation style)) (zip [1..] citations)   where@@ -974,6 +979,18 @@     unless isBibliography $ do       lastCitedMap <- gets stateLastCitedMap       let notenum = NumVal $ fromMaybe citationGroupNumber mbNoteNumber+      -- keep track of how many citations in each note.+      -- two citations from the same note don't count as "alone"+      -- for ibid purposes. See citation-style-language/documentation#121+      case mbNoteNumber of+        Nothing -> return ()+        Just n  -> modify $ \st ->+                       st{ stateNoteMap = M.alter+                            (maybe+                              (Just (Set.singleton (citationItemId item)))+                              (Just . Set.insert (citationItemId item)))+                            n+                            (stateNoteMap st) }       case M.lookup (citationItemId item) lastCitedMap of         Nothing | isNote -> -- first citation           modify $ \st ->@@ -990,12 +1007,12 @@           st{ stateLastCitedMap =             M.insert (citationItemId item)               (citationGroupNumber, mbNoteNumber, positionInCitation,-               case citationItems citation of+               (case citationItems citation of                   [_]   -> True                   [x,y] -> citationItemId x == citationItemId y                           && citationItemType x == AuthorOnly                           && citationItemType y == SuppressAuthor-                  _     -> False,+                  _     -> False),                citationItemLabel item,                citationItemLocator item)             lastCitedMap }@@ -1054,6 +1071,7 @@ getPosition :: CitationItem a -> Int -> Maybe Int -> Int -> Eval a [Position] getPosition item groupNum mbNoteNum posInGroup = do   lastCitedMap <- gets stateLastCitedMap+  noteMap <- gets stateNoteMap   case M.lookup (citationItemId item) lastCitedMap of     Nothing -> return [FirstPosition]     Just (prevGroupNum, mbPrevNoteNum,@@ -1063,6 +1081,11 @@                            asks (styleNearNoteDistance . contextStyleOptions)       let noteNum = fromMaybe groupNum mbNoteNum       let prevNoteNum = fromMaybe prevGroupNum mbPrevNoteNum+      let prevAloneInNote =+            case M.lookup prevNoteNum noteMap of+              Nothing -> True+              Just s  -> Set.size s <= 1+      let prevAlone = prevAloneInGroup && prevAloneInNote       return $         (if isNote && noteNum - prevNoteNum < nearNoteDistance             then (NearNote :)@@ -1072,7 +1095,7 @@             (groupNum == prevGroupNum + 1 &&               (((-) <$> mbNoteNum <*> mbPrevNoteNum) <= Just 1) &&              posInGroup == 1 &&-             prevAloneInGroup)+             prevAlone)              then case (prevLoc, citationItemLocator item) of                     (Nothing, Just _)  -> (IbidWithLocator :) . (Ibid :)                     (Nothing, Nothing) -> (Ibid :)
+ test/extra/pandoc6813.txt view
@@ -0,0 +1,1472 @@+>>===== MODE =====>>+citation+<<===== MODE =====<<++>>===== RESULT =====>>+Doe, <i>Title A</i>, n.d.+Doe, <i>Title B</i>, n.d.+Doe, <i>Title B</i>, n.d.+<<===== RESULT =====<<++>>===== CSL =====>>+<?xml version="1.0" encoding="utf-8"?>+<style xmlns="http://purl.org/net/xbiblio/csl" class="note" version="1.0" demote-non-dropping-particle="display-and-sort" page-range-format="chicago">+  <info>+    <title>Chicago Manual of Style 17th edition (note)</title>+    <id>http://www.zotero.org/styles/chicago-note-bibliography</id>+    <link href="http://www.zotero.org/styles/chicago-note-bibliography" rel="self"/>+    <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>+    <author>+      <name>Julian Onions</name>+      <email>julian.onions@gmail.com</email>+    </author>+    <contributor>+      <name>Simon Kornblith</name>+      <email>simon@simonster.com</email>+    </contributor>+    <contributor>+      <name>Elena Razlogova</name>+      <email>elena.razlogova@gmail.com</email>+    </contributor>+    <contributor>+      <name>Frank Bennett</name>+      <email>biercenator@gmail.com</email>+    </contributor>+    <contributor>+      <name>Andrew Dunning</name>+      <email>andrew.dunning@utoronto.ca</email>+    </contributor>+    <contributor>+      <name>Sebastian Karcher</name>+    </contributor>+    <contributor>+      <name>Brenton M. Wiernik</name>+    </contributor>+    <category citation-format="note"/>+    <category field="generic-base"/>+    <summary>Chicago format with short notes and bibliography</summary>+    <updated>2017-10-12T12:00:00+00:00</updated>+    <rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>+  </info>+  <locale xml:lang="en">+    <terms>+      <term name="editor" form="verb-short">ed.</term>+      <term name="translator" form="verb-short">trans.</term>+      <term name="translator" form="short">trans.</term>+      <term name="editortranslator" form="verb-short">ed. and trans.</term>+      <term name="editortranslator" form="verb">Edited and translated by</term>+      <term name="translator" form="short">trans.</term>+    </terms>+  </locale>+  <macro name="editor-translator">+    <group delimiter=", ">+      <group delimiter=" ">+        <choose>+          <if variable="container-author reviewed-author" match="any">+            <group>+              <names variable="container-author reviewed-author">+                <label form="verb-short" text-case="lowercase" suffix=" "/>+                <name and="text" delimiter=", "/>+              </names>+            </group>+          </if>+        </choose>+      </group>+      <names variable="editor translator" delimiter=", ">+        <label form="verb-short" text-case="lowercase" suffix=" "/>+        <name and="text" delimiter=", "/>+      </names>+    </group>+  </macro>+  <macro name="secondary-contributors-note">+    <choose>+      <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="none">+        <text macro="editor-translator"/>+      </if>+    </choose>+  </macro>+  <macro name="container-contributors-note">+    <choose>+      <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">+        <text macro="editor-translator"/>+      </if>+    </choose>+  </macro>+  <macro name="secondary-contributors">+    <choose>+      <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="none">+        <names variable="editor translator" delimiter=". ">+          <label form="verb" text-case="capitalize-first" suffix=" "/>+          <name and="text" delimiter=", "/>+        </names>+      </if>+    </choose>+  </macro>+  <macro name="container-contributors">+    <choose>+      <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">+        <group delimiter=", ">+          <choose>+            <if variable="author">+              <choose>+                <if variable="container-author" match="any">+                  <names variable="container-author">+                    <label form="verb-short" text-case="lowercase" suffix=" "/>+                    <name and="text" delimiter=", "/>+                  </names>+                </if>+              </choose>+              <!--This includes page numers after the container author, e.g. for Introductions -->+              <choose>+                <if variable="container-author author" match="all">+                  <group delimiter=". ">+                    <text variable="page"/>+                    <names variable="editor translator" delimiter=", ">+                      <label form="verb" suffix=" "/>+                      <name and="text" delimiter=", "/>+                    </names>+                  </group>+                </if>+                <else>+                  <names variable="editor translator" delimiter=", ">+                    <label form="verb" text-case="lowercase" suffix=" "/>+                    <name and="text" delimiter=", "/>+                  </names>+                </else>+              </choose>+            </if>+          </choose>+        </group>+      </if>+    </choose>+  </macro>+  <macro name="recipient-note">+    <names variable="recipient" delimiter=", ">+      <label form="verb" text-case="lowercase" suffix=" "/>+      <name and="text" delimiter=", "/>+    </names>+  </macro>+  <macro name="contributors-note">+    <group delimiter=" ">+      <names variable="author">+        <name and="text" sort-separator=", " delimiter=", "/>+        <label form="short" prefix=", "/>+        <substitute>+          <names variable="editor"/>+          <names variable="translator"/>+        </substitute>+      </names>+      <text macro="recipient-note"/>+    </group>+  </macro>+  <macro name="editor">+    <names variable="editor">+      <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>+      <label form="short" prefix=", "/>+    </names>+  </macro>+  <macro name="translator">+    <names variable="translator">+      <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>+      <label form="verb-short" prefix=", "/>+    </names>+  </macro>+  <macro name="recipient">+    <group delimiter=" ">+      <choose>+        <if type="personal_communication">+          <choose>+            <if variable="genre">+              <text variable="genre" text-case="capitalize-first"/>+            </if>+            <else>+              <text term="letter" text-case="capitalize-first"/>+            </else>+          </choose>+        </if>+      </choose>+      <text macro="recipient-note"/>+    </group>+  </macro>+  <macro name="contributors">+    <group delimiter=". ">+      <names variable="author">+        <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>+        <substitute>+          <text macro="editor"/>+          <text macro="translator"/>+          <choose>+            <if type="webpage post-weblog" match="any">+              <text variable="container-title"/>+            </if>+          </choose>+        </substitute>+      </names>+      <text macro="recipient"/>+    </group>+  </macro>+  <macro name="recipient-short">+    <names variable="recipient">+      <label form="verb" text-case="lowercase" suffix=" "/>+      <name form="short" and="text" delimiter=", "/>+    </names>+  </macro>+  <macro name="contributors-short">+    <group delimiter=" ">+      <names variable="author">+        <name form="short" and="text" delimiter=", "/>+        <substitute>+          <names variable="editor"/>+          <names variable="translator"/>+        </substitute>+      </names>+      <text macro="recipient-short"/>+    </group>+  </macro>+  <macro name="contributors-sort">+    <names variable="author">+      <name name-as-sort-order="all" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>+      <substitute>+        <names variable="editor"/>+        <names variable="translator"/>+        <text macro="title"/>+      </substitute>+    </names>+  </macro>+  <macro name="interviewer-note">+    <names variable="interviewer" delimiter=", ">+      <label form="verb" text-case="lowercase" suffix=" "/>+      <name and="text" delimiter=", "/>+    </names>+  </macro>+  <macro name="interviewer">+    <names variable="interviewer" delimiter=", ">+      <label form="verb" text-case="capitalize-first" suffix=" "/>+      <name and="text" delimiter=", "/>+    </names>+  </macro>+  <macro name="title-note">+    <choose>+      <if variable="title" match="none">+        <text variable="genre"/>+      </if>+      <else-if type="book graphic map motion_picture song" match="any">+        <text variable="title" text-case="title" font-style="italic"/>+        <group delimiter=" " prefix=", ">+          <text term="version"/>+          <text variable="version"/>+        </group>+      </else-if>+      <else-if type="legal_case interview patent" match="any">+        <text variable="title"/>+      </else-if>+      <else-if variable="reviewed-author">+        <text variable="title" font-style="italic" prefix="review of "/>+      </else-if>+      <else>+        <text variable="title" text-case="title" quotes="true"/>+      </else>+    </choose>+  </macro>+  <macro name="title">+    <choose>+      <if variable="title" match="none">+        <choose>+          <if type="personal_communication" match="none">+            <text variable="genre" text-case="capitalize-first"/>+          </if>+        </choose>+      </if>+      <else-if type="book graphic motion_picture song" match="any">+        <text variable="title" text-case="title" font-style="italic"/>+        <group prefix=" (" suffix=")" delimiter=" ">+          <text term="version"/>+          <text variable="version"/>+        </group>+      </else-if>+      <else-if variable="reviewed-author">+        <group delimiter=", ">+          <text variable="title" font-style="italic" prefix="Review of "/>+          <names variable="reviewed-author">+            <label form="verb-short" text-case="lowercase" suffix=" "/>+            <name and="text" delimiter=", "/>+          </names>+        </group>+      </else-if>+      <else-if type="bill legislation legal_case interview patent" match="any">+        <text variable="title"/>+      </else-if>+      <else>+        <text variable="title" text-case="title" quotes="true"/>+      </else>+    </choose>+  </macro>+  <macro name="title-short">+    <choose>+      <if variable="title" match="none">+        <choose>+          <if type="interview">+            <text term="interview"/>+          </if>+          <else-if type="manuscript speech" match="any">+            <text variable="genre" form="short"/>+          </else-if>+        </choose>+      </if>+      <else-if type="book graphic motion_picture song" match="any">+        <text variable="title" text-case="title" form="short" font-style="italic"/>+      </else-if>+      <else-if type="legal_case" variable="title-short" match="all">+        <text variable="title" font-style="italic" form="short"/>+      </else-if>+      <else-if type="patent interview" match="any">+        <text variable="title" form="short"/>+      </else-if>+      <else-if type="legal_case bill legislation" match="any">+        <text variable="title"/>+      </else-if>+      <else>+        <text variable="title" text-case="title" form="short" quotes="true"/>+      </else>+    </choose>+  </macro>+  <macro name="date-disambiguate">+    <choose>+      <if disambiguate="true" type="personal_communication" match="any">+        <text macro="issued"/>+      </if>+    </choose>+  </macro>+  <macro name="description-note">+    <group delimiter=", ">+      <text macro="interviewer-note"/>+      <text variable="medium"/>+      <choose>+        <if variable="title" match="none"/>+        <else-if type="manuscript thesis speech" match="any"/>+        <else-if type="patent">+          <group delimiter=" ">+            <text variable="authority"/>+            <text variable="number"/>+          </group>+        </else-if>+        <else>+          <text variable="genre"/>+        </else>+      </choose>+      <choose>+        <if type="map">+          <text variable="scale"/>+        </if>+        <else-if type="graphic">+          <text variable="dimensions"/>+        </else-if>+      </choose>+    </group>+  </macro>+  <macro name="description">+    <group delimiter=", ">+      <group delimiter=". ">+        <text macro="interviewer"/>+        <text variable="medium" text-case="capitalize-first"/>+      </group>+      <choose>+        <if variable="title" match="none"/>+        <else-if type="thesis speech" match="any"/>+        <else-if type="patent">+          <group delimiter=" ">+            <text variable="authority"/>+            <text variable="number"/>+          </group>+        </else-if>+        <else>+          <text variable="genre" text-case="capitalize-first"/>+        </else>+      </choose>+      <choose>+        <if type="map">+          <text variable="scale"/>+        </if>+        <else-if type="graphic">+          <text variable="dimensions"/>+        </else-if>+      </choose>+    </group>+  </macro>+  <macro name="container-title-note">+    <group delimiter=" ">+      <choose>+        <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">+          <text term="in"/>+        </if>+      </choose>+      <choose>+        <if type="webpage">+          <text variable="container-title"/>+        </if>+        <else-if type="post-weblog">+          <text variable="container-title" text-case="title" font-style="italic" suffix=" (blog)"/>+        </else-if>+        <else-if type="bill legislation legal_case" match="none">+          <text variable="container-title" text-case="title" font-style="italic"/>+        </else-if>+      </choose>+    </group>+  </macro>+  <macro name="container-title">+    <group delimiter=" ">+      <choose>+        <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">+          <text term="in" text-case="capitalize-first"/>+        </if>+      </choose>+      <choose>+        <if type="webpage">+          <text variable="container-title"/>+        </if>+        <else-if type="post-weblog">+          <text variable="container-title" text-case="title" font-style="italic" suffix=" (blog)"/>+        </else-if>+        <else-if type="bill legislation legal_case" match="none">+          <text variable="container-title" text-case="title" font-style="italic"/>+        </else-if>+      </choose>+    </group>+  </macro>+  <macro name="collection-title">+    <choose>+      <if match="none" type="article-journal">+        <choose>+          <if match="none" is-numeric="collection-number">+            <group delimiter=", ">+              <text variable="collection-title" text-case="title"/>+              <text variable="collection-number"/>+            </group>+          </if>+          <else>+            <group delimiter=" ">+              <text variable="collection-title" text-case="title"/>+              <text variable="collection-number"/>+            </group>+          </else>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="collection-title-journal">+    <choose>+      <if type="article-journal">+        <group delimiter=" ">+          <text variable="collection-title"/>+          <text variable="collection-number"/>+        </group>+      </if>+    </choose>+  </macro>+  <macro name="edition-note">+    <choose>+      <if type="book chapter graphic motion_picture paper-conference report song" match="any">+        <choose>+          <if is-numeric="edition">+            <group delimiter=" ">+              <number variable="edition" form="ordinal"/>+              <text term="edition" form="short"/>+            </group>+          </if>+          <else>+            <text variable="edition"/>+          </else>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="edition">+    <choose>+      <if type="book chapter graphic motion_picture paper-conference report song" match="any">+        <choose>+          <if is-numeric="edition">+            <group delimiter=" ">+              <number variable="edition" form="ordinal"/>+              <text term="edition" form="short"/>+            </group>+          </if>+          <else>+            <text variable="edition" text-case="capitalize-first" suffix="."/>+          </else>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="locators-note-join-with-space">+    <choose>+      <if type="article-journal" variable="volume" match="all">+        <choose>+          <if match="none" variable="collection-title">+            <text macro="locators-note"/>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="locators-note-join-with-comma">+    <choose>+      <if type="article-journal" match="none">+        <text macro="locators-note"/>+      </if>+      <else-if type="article-journal">+        <choose>+          <if variable="volume" match="none">+            <text macro="locators-note"/>+          </if>+          <else-if match="any" variable="collection-title">+            <text macro="locators-note"/>+          </else-if>+        </choose>+      </else-if>+    </choose>+  </macro>+  <macro name="locators-note">+    <choose>+      <if type="article-journal">+        <group delimiter=", ">+          <text macro="collection-title-journal"/>+          <text variable="volume"/>+          <group delimiter=" ">+            <text term="issue" form="short"/>+            <text variable="issue"/>+          </group>+        </group>+      </if>+      <else-if type="bill legislation legal_case" match="any">+        <text macro="legal-cites"/>+      </else-if>+      <else-if type="book chapter graphic motion_picture paper-conference report song" match="any">+        <group delimiter=", ">+          <text macro="edition-note"/>+          <group delimiter=" ">+            <text term="volume" form="short"/>+            <number variable="volume" form="numeric"/>+          </group>+          <choose>+            <if variable="locator" match="none">+              <group delimiter=" ">+                <number variable="number-of-volumes" form="numeric"/>+                <text term="volume" form="short" plural="true"/>+              </group>+            </if>+          </choose>+        </group>+      </else-if>+    </choose>+  </macro>+  <macro name="legal-cites">+    <choose>+      <if type="legal_case" match="any">+        <group delimiter=" ">+          <choose>+            <if variable="container-title">+              <text variable="volume"/>+              <text variable="container-title"/>+              <group delimiter=" ">+                <!--change to label variable="section" as that becomes available -->+                <text term="section" form="symbol"/>+                <text variable="section"/>+              </group>+              <text variable="page"/>+            </if>+            <else>+              <text variable="number" prefix="No. "/>+            </else>+          </choose>+        </group>+      </if>+      <else-if type="bill legislation" match="any">+        <group delimiter=", ">+          <choose>+            <if variable="number">+              <!--There's a public law number-->+              <text variable="number" prefix="Pub. L. No. "/>+              <group delimiter=" ">+                <!--change to label variable="section" as that becomes available -->+                <text term="section" form="symbol"/>+                <text variable="section"/>+              </group>+              <group delimiter=" ">+                <text variable="volume"/>+                <text variable="container-title"/>+                <text variable="page-first"/>+              </group>+            </if>+            <else>+              <group delimiter=" ">+                <text variable="volume"/>+                <text variable="container-title"/>+                <!--change to label variable="section" as that becomes available -->+                <text term="section" form="symbol"/>+                <text variable="section"/>+              </group>+            </else>+          </choose>+        </group>+      </else-if>+    </choose>+  </macro>+  <macro name="locators-join-with-space">+    <choose>+      <if type="article-journal" variable="volume" match="all">+        <choose>+          <if match="none" variable="collection-title">+            <text macro="locators"/>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="locators-join-with-comma">+    <choose>+      <if type="bill chapter legislation legal_case paper-conference" match="any">+        <text macro="locators"/>+      </if>+      <else-if type="article-journal">+        <choose>+          <if variable="volume" match="none">+            <text macro="locators"/>+          </if>+          <else-if match="any" variable="collection-title">+            <text macro="locators"/>+          </else-if>+        </choose>+      </else-if>+    </choose>+  </macro>+  <macro name="locators-join-with-period">+    <choose>+      <if type="bill legislation legal_case article-journal chapter paper-conference" match="none">+        <text macro="locators"/>+      </if>+    </choose>+  </macro>+  <macro name="locators">+    <choose>+      <if type="article-journal">+        <group delimiter=", ">+          <text macro="collection-title-journal"/>+          <text variable="volume"/>+          <group delimiter=" ">+            <text term="issue" form="short"/>+            <text variable="issue"/>+          </group>+        </group>+      </if>+      <else-if type="bill legislation legal_case" match="any">+        <text macro="legal-cites"/>+      </else-if>+      <else-if type="book graphic motion_picture report song" match="any">+        <group delimiter=". ">+          <text macro="edition"/>+          <group delimiter=" ">+            <text term="volume" form="short" text-case="capitalize-first"/>+            <number variable="volume" form="numeric"/>+          </group>+          <group delimiter=" ">+            <number variable="number-of-volumes" form="numeric"/>+            <text term="volume" form="short" plural="true"/>+          </group>+        </group>+      </else-if>+      <else-if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">+        <group delimiter=". ">+          <text macro="edition"/>+          <choose>+            <if variable="page" match="none">+              <group delimiter=" ">+                <text term="volume" form="short" text-case="capitalize-first"/>+                <number variable="volume" form="numeric"/>+              </group>+            </if>+          </choose>+        </group>+      </else-if>+    </choose>+  </macro>+  <macro name="locators-newspaper">+    <choose>+      <if type="article-newspaper">+        <group delimiter=", ">+          <group delimiter=" ">+            <number variable="edition"/>+            <text term="edition"/>+          </group>+          <group delimiter=" ">+            <text term="section" form="short"/>+            <text variable="section"/>+          </group>+        </group>+      </if>+    </choose>+  </macro>+  <macro name="event-note">+    <text variable="event"/>+  </macro>+  <macro name="event">+    <choose>+      <if variable="title">+        <group delimiter=" ">+          <choose>+            <if variable="genre">+              <text term="presented at"/>+            </if>+            <else>+              <text term="presented at" text-case="capitalize-first"/>+            </else>+          </choose>+          <text variable="event"/>+        </group>+      </if>+      <else>+        <group delimiter=" ">+          <text term="presented at" text-case="capitalize-first"/>+          <text variable="event"/>+        </group>+      </else>+    </choose>+  </macro>+  <macro name="originally-published">+    <group delimiter=", ">+      <group delimiter=": ">+        <text variable="original-publisher-place"/>+        <text variable="original-publisher"/>+      </group>+      <choose>+        <if is-uncertain-date="original-date">+          <date variable="original-date" form="numeric" date-parts="year" prefix="[" suffix="?]"/>+        </if>+        <else>+          <date variable="original-date" form="numeric" date-parts="year"/>+        </else>+      </choose>+    </group>+  </macro>+  <macro name="reprint-note">+    <!--needs localization-->+    <choose>+      <if variable="original-date issued" match="all">+        <choose>+          <!--for whatever reason in notes, when we have both original and new publishers, reprint doesn't appear-->+          <if variable="original-publisher original-publisher-place" match="none">+            <text value="repr."/>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="reprint">+    <!--needs localization-->+    <choose>+      <if variable="original-date issued" match="all">+        <text value="reprint" text-case="capitalize-first"/>+      </if>+    </choose>+  </macro>+  <macro name="publisher">+    <choose>+      <if type="thesis">+        <text variable="publisher"/>+      </if>+      <else-if type="speech">+        <text variable="event-place"/>+      </else-if>+      <else>+        <group delimiter=": ">+          <text variable="publisher-place"/>+          <text variable="publisher"/>+        </group>+      </else>+    </choose>+  </macro>+  <macro name="issued">+    <choose>+      <if variable="issued">+        <choose>+          <if type="legal_case">+            <group delimiter=" ">+              <text variable="authority"/>+              <choose>+                <if variable="container-title" match="any">+                  <!--Only print year for cases published in reporters-->+                  <date variable="issued" form="numeric" date-parts="year"/>+                </if>+                <else>+                  <date variable="issued" form="text"/>+                </else>+              </choose>+            </group>+          </if>+          <else-if type="book bill chapter  legislation motion_picture paper-conference song thesis" match="any">+            <choose>+              <if is-uncertain-date="issued">+                <date variable="issued" form="numeric" date-parts="year" prefix="[" suffix="?]"/>+              </if>+              <else>+                <date variable="issued" form="numeric" date-parts="year"/>+              </else>+            </choose>+          </else-if>+          <else-if type="patent">+            <group delimiter=", ">+              <group delimiter=" ">+                <!--Needs Localization-->+                <text value="filed"/>+                <date variable="submitted" form="text"/>+              </group>+              <group delimiter=" ">+                <choose>+                  <if variable="issued submitted" match="all">+                    <text term="and"/>+                  </if>+                </choose>+                <!--Needs Localization-->+                <text value="issued"/>+                <date variable="issued" form="text"/>+              </group>+            </group>+          </else-if>+          <else>+            <choose>+              <if is-uncertain-date="issued">+                <date variable="issued" form="text" prefix="[" suffix="?]"/>+              </if>+              <else>+                <date variable="issued" form="text"/>+              </else>+            </choose>+          </else>+        </choose>+      </if>+      <else-if variable="status">+        <text variable="status"/>+      </else-if>+      <else-if variable="accessed URL" match="all"/>+      <else>+        <text term="no date" form="short"/>+      </else>+    </choose>+  </macro>+  <macro name="point-locators-subsequent">+    <choose>+      <if type="legal_case" variable="locator" match="all">+        <choose>+          <if locator="page">+            <group delimiter=":">+              <text variable="volume"/>+              <text variable="locator"/>+            </group>+          </if>+          <else>+            <group delimiter=" ">+              <label variable="locator" form="short"/>+              <text variable="locator"/>+            </group>+          </else>+        </choose>+      </if>+      <else-if variable="locator">+        <choose>+          <if locator="page" match="none">+            <group delimiter=" ">+              <choose>+                <if type="book graphic motion_picture report song" match="any">+                  <choose>+                    <if variable="volume">+                      <group delimiter=", ">+                        <group delimiter=" ">+                          <text term="volume" form="short"/>+                          <number variable="volume" form="numeric"/>+                        </group>+                        <label variable="locator" form="short"/>+                      </group>+                    </if>+                    <else>+                      <label variable="locator" form="short"/>+                    </else>+                  </choose>+                </if>+                <else>+                  <label variable="locator" form="short"/>+                </else>+              </choose>+              <text variable="locator"/>+            </group>+          </if>+          <else-if type="book graphic motion_picture report song" match="any">+            <group delimiter=":">+              <number variable="volume" form="numeric"/>+              <text variable="locator"/>+            </group>+          </else-if>+          <else>+            <text variable="locator"/>+          </else>+        </choose>+      </else-if>+    </choose>+  </macro>+  <macro name="point-locators-join-with-colon">+    <choose>+      <if type="article-journal">+        <choose>+          <if variable="locator page" match="any">+            <choose>+              <if variable="volume issue" match="any">+                <text macro="point-locators"/>+              </if>+            </choose>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="point-locators-join-with-comma">+    <choose>+      <if type="article-journal" match="none">+        <text macro="point-locators"/>+      </if>+      <else-if variable="volume issue" match="none">+        <text macro="point-locators"/>+      </else-if>+    </choose>+  </macro>+  <macro name="point-locators">+    <choose>+      <if variable="locator" match="none">+        <choose>+          <if type="article-journal chapter paper-conference" match="any">+            <text variable="page"/>+          </if>+        </choose>+      </if>+      <else-if type="article-journal">+        <group delimiter=" ">+          <choose>+            <if locator="page" match="none">+              <label variable="locator" form="short" suffix=" "/>+            </if>+          </choose>+          <text variable="locator"/>+        </group>+      </else-if>+      <else-if type="legal_case"/>+      <else>+        <group delimiter=" ">+          <choose>+            <if locator="page" match="none">+              <label variable="locator" form="short"/>+            </if>+          </choose>+          <text variable="locator"/>+        </group>+      </else>+    </choose>+  </macro>+  <macro name="locators-chapter">+    <choose>+      <if type="chapter entry-dictionary entry-encyclopedia paper-conference" match="any">+        <choose>+          <if variable="author container-author" match="all"/>+          <else>+            <choose>+              <if variable="page">+                <text variable="volume" suffix=":"/>+                <text variable="page"/>+              </if>+            </choose>+          </else>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="locators-journal-join-with-colon">+    <choose>+      <if type="article-journal">+        <choose>+          <if variable="volume issue" match="any">+            <text variable="page"/>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="locators-journal-join-with-comma">+    <choose>+      <if type="article-journal">+        <choose>+          <if variable="volume issue" match="none">+            <text variable="page"/>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="archive-note">+    <choose>+      <if type="thesis">+        <group delimiter=" ">+          <text variable="archive"/>+          <text variable="archive_location" prefix="(" suffix=")"/>+        </group>+      </if>+      <else>+        <group delimiter=", ">+          <text variable="archive_location"/>+          <text variable="archive"/>+          <text variable="archive-place"/>+        </group>+      </else>+    </choose>+  </macro>+  <macro name="archive">+    <choose>+      <if type="thesis">+        <group delimiter=" ">+          <text variable="archive"/>+          <text variable="archive_location" prefix="(" suffix=")"/>+        </group>+      </if>+      <else>+        <group delimiter=". ">+          <text variable="archive_location" text-case="capitalize-first"/>+          <text variable="archive"/>+          <text variable="archive-place"/>+        </group>+      </else>+    </choose>+  </macro>+  <macro name="issue-note-join-with-space">+    <choose>+      <if type="article-journal bill legislation legal_case manuscript thesis" variable="publisher-place event-place publisher" match="any">+        <!--Chicago doesn't use publisher/place for Newspapers and we want the date delimited by a comma-->+        <choose>+          <if type="article-newspaper" match="none">+            <choose>+              <if type="article-journal" match="none">+                <text macro="issue-note"/>+              </if>+              <else-if variable="issue volume" match="any">+                <text macro="issue-note"/>+              </else-if>+            </choose>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="issue-note-join-with-comma">+    <choose>+      <if type="article-journal bill legislation legal_case manuscript speech thesis" variable="publisher-place publisher" match="none">+        <text macro="issue-note"/>+      </if>+      <else-if type="article-newspaper">+        <text macro="issue-note"/>+      </else-if>+      <else-if type="article-journal">+        <choose>+          <if variable="volume issue" match="none">+            <text macro="issue-note"/>+          </if>+        </choose>+      </else-if>+    </choose>+  </macro>+  <macro name="issue-map-graphic">+    <!--See CMoS 17th ed. 14.235 and 14.237-->+    <choose>+      <if type="graphic map" match="any">+        <choose>+          <if variable="publisher publisher-place" match="none">+            <text macro="issued"/>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="issue-note">+    <choose>+      <if type="bill legislation legal_case" match="any">+        <text macro="issued" prefix="(" suffix=")"/>+      </if>+      <else-if type="article-journal">+        <choose>+          <if variable="volume issue" match="any">+            <text macro="issued" prefix="(" suffix=")"/>+          </if>+          <else>+            <text macro="issued"/>+          </else>+        </choose>+      </else-if>+      <else-if type="article-newspaper">+        <text macro="issued"/>+      </else-if>+      <else-if type="manuscript thesis speech" match="any">+        <group delimiter=", " prefix="(" suffix=")">+          <choose>+            <if variable="title" match="any">+              <text variable="genre"/>+            </if>+          </choose>+          <text variable="event"/>+          <text variable="event-place"/>+          <text variable="publisher"/>+          <text macro="issued"/>+        </group>+      </else-if>+      <else-if variable="publisher-place event-place publisher" match="any">+        <group prefix="(" suffix=")" delimiter=", ">+          <text macro="event-note"/>+          <group delimiter="; ">+            <text macro="originally-published"/>+            <group delimiter=", ">+              <text macro="reprint-note"/>+              <text macro="publisher"/>+            </group>+          </group>+          <text macro="issued"/>+        </group>+      </else-if>+      <else>+        <text macro="issued"/>+      </else>+    </choose>+  </macro>+  <macro name="issue-join-with-space">+    <choose>+      <if type="article-journal" match="any">+        <choose>+          <if variable="issue volume" match="any">+            <text macro="issue"/>+          </if>+        </choose>+      </if>+      <else-if type="bill legislation legal_case" match="any">+        <text macro="issue"/>+      </else-if>+    </choose>+  </macro>+  <macro name="issue-join-with-period">+    <choose>+      <if type="article-journal bill legislation legal_case" match="none">+        <choose>+          <if type="speech" variable="publisher publisher-place" match="any">+            <text macro="issue"/>+          </if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="issue-join-with-comma">+    <choose>+      <if type="bill legislation legal_case" match="none">+        <choose>+          <if type="article-journal" match="none">+            <choose>+              <if type="speech" variable="publisher publisher-place" match="none">+                <text macro="issue"/>+              </if>+            </choose>+          </if>+          <else-if variable="volume issue" match="none">+            <text macro="issue"/>+          </else-if>+        </choose>+      </if>+    </choose>+  </macro>+  <macro name="issue">+    <choose>+      <if type="bill legislation legal_case" match="any">+        <text macro="issued" prefix="(" suffix=")"/>+      </if>+      <else-if type="article-journal">+        <choose>+          <if variable="issue volume" match="any">+            <text macro="issued" prefix="(" suffix=")"/>+          </if>+          <else>+            <text macro="issued"/>+          </else>+        </choose>+      </else-if>+      <else-if type="speech">+        <group delimiter=", ">+          <group delimiter=" ">+            <choose>+              <if variable="title" match="none"/>+              <else>+                <text variable="genre" text-case="capitalize-first"/>+              </else>+            </choose>+            <text macro="event"/>+          </group>+          <text variable="event-place"/>+          <text macro="issued"/>+        </group>+      </else-if>+      <!--Chicago doesn't use publisher/place for Newspapers -->+      <else-if type="article-newspaper">+        <text macro="issued"/>+      </else-if>+      <else-if variable="publisher-place publisher" match="any">+        <group delimiter=", ">+          <choose>+            <if type="thesis">+              <text variable="genre" text-case="capitalize-first"/>+            </if>+          </choose>+          <group delimiter=". ">+            <text macro="originally-published"/>+            <group delimiter=", ">+              <text macro="reprint"/>+              <text macro="publisher"/>+            </group>+          </group>+          <text macro="issued"/>+        </group>+      </else-if>+      <!--location for data for maps and artwork is different-->+      <else-if type="graphic map" match="none">+        <text macro="issued"/>+      </else-if>+    </choose>+  </macro>+  <macro name="access-note">+    <group delimiter=", ">+      <choose>+        <if type="graphic report" match="any">+          <text macro="archive-note"/>+        </if>+        <else-if type="article-journal bill book chapter legal_case legislation motion_picture paper-conference" match="none">+          <text macro="archive-note"/>+        </else-if>+      </choose>+      <choose>+        <if variable="issued" match="none">+          <group delimiter=" ">+            <text term="accessed"/>+            <date variable="accessed" form="text"/>+          </group>+        </if>+      </choose>+      <choose>+        <if type="legal_case" match="none">+          <choose>+            <if variable="DOI">+              <text variable="DOI" prefix="https://doi.org/"/>+            </if>+            <else>+              <text variable="URL"/>+            </else>+          </choose>+        </if>+      </choose>+    </group>+  </macro>+  <macro name="access">+    <group delimiter=". ">+      <choose>+        <if type="graphic report" match="any">+          <text macro="archive"/>+        </if>+        <else-if type="article-journal bill book chapter legal_case legislation motion_picture paper-conference" match="none">+          <text macro="archive"/>+        </else-if>+      </choose>+      <choose>+        <if variable="issued" match="none">+          <group delimiter=" ">+            <text term="accessed" text-case="capitalize-first"/>+            <date variable="accessed" form="text"/>+          </group>+        </if>+      </choose>+      <choose>+        <if type="legal_case" match="none">+          <choose>+            <if variable="DOI">+              <text variable="DOI" prefix="https://doi.org/"/>+            </if>+            <else>+              <text variable="URL"/>+            </else>+          </choose>+        </if>+      </choose>+    </group>+  </macro>+  <macro name="case-locator-subsequent">+    <choose>+      <if type="legal_case">+        <group delimiter=" ">+          <text variable="volume"/>+          <text variable="container-title"/>+        </group>+      </if>+    </choose>+  </macro>+  <macro name="case-pinpoint-subsequent">+    <choose>+      <if type="legal_case">+        <group delimiter=" ">+          <choose>+            <if locator="page">+              <text term="at"/>+              <text variable="locator"/>+            </if>+            <else>+              <label variable="locator"/>+              <text variable="locator"/>+            </else>+          </choose>+        </group>+      </if>+    </choose>+  </macro>+  <citation et-al-min="4" et-al-use-first="1" disambiguate-add-names="true">+    <layout suffix="." delimiter="; ">+      <choose>+        <if position="ibid ibid-with-locator" match="any">+          <group delimiter=", ">+            <text macro="contributors-short"/>+            <group delimiter=" ">+              <group delimiter=", ">+                <choose>+                  <if variable="author editor translator" match="none">+                    <text macro="title-short"/>+                  </if>+                </choose>+                <text macro="case-locator-subsequent"/>+              </group>+              <text macro="case-pinpoint-subsequent"/>+            </group>+            <choose>+              <if match="none" type="legal_case">+                <text macro="point-locators-subsequent"/>+              </if>+            </choose>+          </group>+        </if>+        <else>+          <group delimiter=", ">+            <text macro="contributors-short"/>+            <group delimiter=" ">+              <group delimiter=", ">+                <text macro="title-short"/>+                <!--if title & author are the same: -->+                <text macro="date-disambiguate"/>+                <text macro="case-locator-subsequent"/>+              </group>+              <text macro="case-pinpoint-subsequent"/>+            </group>+            <choose>+              <if match="none" type="legal_case">+                <text macro="point-locators-subsequent"/>+              </if>+            </choose>+          </group>+        </else>+      </choose>+    </layout>+  </citation>+  <bibliography hanging-indent="true" et-al-min="11" et-al-use-first="7" subsequent-author-substitute="&#8212;&#8212;&#8212;" entry-spacing="0">+    <sort>+      <key macro="contributors-sort"/>+      <key variable="title"/>+      <key variable="genre"/>+      <key variable="issued"/>+    </sort>+    <layout suffix=".">+      <group delimiter=". ">+        <group delimiter=": ">+          <group delimiter=", ">+            <group delimiter=" ">+              <group delimiter=". ">+                <group delimiter=" ">+                  <group delimiter=", ">+                    <group delimiter=". ">+                      <group delimiter=". ">+                        <text macro="contributors"/>+                        <text macro="title"/>+                        <text macro="issue-map-graphic"/>+                      </group>+                      <text macro="description"/>+                      <text macro="secondary-contributors"/>+                      <group delimiter=", ">+                        <text macro="container-title"/>+                        <text macro="container-contributors"/>+                      </group>+                      <text macro="locators-join-with-period"/>+                    </group>+                    <text macro="locators-join-with-comma"/>+                    <text macro="locators-chapter"/>+                  </group>+                  <text macro="locators-join-with-space"/>+                </group>+                <text macro="collection-title"/>+                <text macro="issue-join-with-period"/>+              </group>+              <text macro="issue-join-with-space"/>+            </group>+            <text macro="issue-join-with-comma"/>+            <text macro="locators-journal-join-with-comma"/>+            <text macro="locators-newspaper"/>+          </group>+          <text macro="locators-journal-join-with-colon"/>+        </group>+        <text macro="access"/>+      </group>+    </layout>+  </bibliography>+</style>+<<===== CSL =====<<++>>===== INPUT =====>>+[+  {+    "author": [+      {+        "family": "Doe",+        "given": "John"+      }+    ],+    "id": "doeA",+    "title": "Title A",+    "type": "book"+  },+  {+    "author": [+      {+        "family": "Doe",+        "given": "John"+      }+    ],+    "id": "doeB",+    "title": "Title B",+    "type": "book"+  }+]+<<===== INPUT =====<<+++>>===== CITATIONS =====>>+[ {"citationItems": [{"id":"doeA"}],+     "citationNoteNumber": 1},+  {"citationItems": [{"id":"doeB"}],+     "citationNoteNumber": 1},+  {"citationItems": [{"id":"doeB"}],+     "citationNoteNumber": 2}+]+<<===== CITATION-ITEMS =====<<++>>===== VERSION =====>>+1.0+<<===== VERSION =====<<+