summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnMacFarlane <>2017-12-16 00:12:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2017-12-16 00:12:00 (GMT)
commit47a9d0936afa44f2cb095d888499e96ef15d5887 (patch)
treeb50108621d01f1f990d5e2ccd429efd9892b2ce8
parent941471af53bc55464a15556f1cc03aa3dd6d9ee8 (diff)
version 0.12.1.10.12.1.1
-rw-r--r--changelog5
-rw-r--r--pandoc-citeproc.cabal2
-rw-r--r--src/Text/CSL/Pandoc.hs42
-rw-r--r--src/Text/CSL/Proc/Collapse.hs9
-rw-r--r--stack.yaml14
-rw-r--r--tests/issue152.expected.native9
-rw-r--r--tests/issue152.in.native4
-rw-r--r--tests/modern-language-association-7th-edition.csl460
8 files changed, 520 insertions, 25 deletions
diff --git a/changelog b/changelog
index 124af2d..050a4b0 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,8 @@
+pandoc-citeproc (0.12.1.1)
+
+ * Avoid double punctuation when citation ends with 'et al.' (#262).
+ * Fix collapsing for items that lack an author (#152).
+
pandoc-citeproc (0.12.1)
* Fixed cases where we got plural instead of singular "issue"
diff --git a/pandoc-citeproc.cabal b/pandoc-citeproc.cabal
index a0c13a0..8fb7b5a 100644
--- a/pandoc-citeproc.cabal
+++ b/pandoc-citeproc.cabal
@@ -1,5 +1,5 @@
name: pandoc-citeproc
-version: 0.12.1
+version: 0.12.1.1
cabal-version: >= 1.12
synopsis: Supports using pandoc with citeproc
diff --git a/src/Text/CSL/Pandoc.hs b/src/Text/CSL/Pandoc.hs
index 72b360d..d7c9443 100644
--- a/src/Text/CSL/Pandoc.hs
+++ b/src/Text/CSL/Pandoc.hs
@@ -31,7 +31,8 @@ import qualified Control.Exception as E
import Control.Monad.State
import System.FilePath
import System.Directory (getAppUserDataDirectory)
-import Text.CSL.Util (findFile, splitStrWhen, tr', parseRomanNumeral, trim)
+import Text.CSL.Util (findFile, splitStrWhen, tr', parseRomanNumeral, trim,
+ lastInline)
import Text.CSL.Exception
import System.IO.Error (isDoesNotExistError)
import Data.Maybe (fromMaybe)
@@ -262,23 +263,33 @@ isSpacy SoftBreak = True
isSpacy _ = False
mvPunct :: Bool -> Style -> [Inline] -> [Inline]
-mvPunct _ _ (x : Space : xs) | isSpacy x = x : xs
-mvPunct moveNotes _ (s : x : ys) | isSpacy s, isNote x, startWithPunct ys =
- if moveNotes
- then Str (headInline ys) : x : tailInline ys
- else x : ys
-mvPunct moveNotes _ (Cite cs ils : ys) |
- length ils > 1
+mvPunct _ _ (x : Space : xs)
+ | isSpacy x = x : xs
+mvPunct moveNotes _ (s : x : ys)
+ | isSpacy s
+ , isNote x
+ , startWithPunct ys
+ = if moveNotes
+ then Str (headInline ys) : x : tailInline ys
+ else x : ys
+mvPunct moveNotes _ (Cite cs ils : ys)
+ | length ils > 1
, isNote (last ils)
, startWithPunct ys
, moveNotes
- = Cite cs (init ils ++ [Str (headInline ys) | not (endWithPunct False (init ils))]
+ = Cite cs (init ils
+ ++ [Str (headInline ys) | not (endWithPunct False (init ils))]
++ [last ils]) : tailInline ys
mvPunct moveNotes sty (q@(Quoted _ _) : w@(Str _) : x : ys)
- | isNote x, isPunctuationInQuote sty, moveNotes =
- mvPunctInsideQuote q w ++ (x : ys)
+ | isNote x
+ , isPunctuationInQuote sty
+ , moveNotes
+ = mvPunctInsideQuote q w ++ (x : ys)
mvPunct _ _ (s : x : ys) | isSpacy s, isNote x = x : ys
mvPunct _ _ (s : x@(Cite _ (Superscript _ : _)) : ys) | isSpacy s = x : ys
+mvPunct _ _ (Cite cs ils : Str "." : ys)
+ | lastInline ils == "."
+ = Cite cs ils : ys
mvPunct _ _ xs = xs
endWithPunct :: Bool -> [Inline] -> Bool
@@ -287,10 +298,11 @@ endWithPunct onlyFinal xs@(_:_) =
case reverse (stringify xs) of
[] -> True
-- covers .), .", etc.:
- (d:c:_) | isPunctuation d && not onlyFinal
- && isEndPunct c -> True
- (c:_) | isEndPunct c -> True
- | otherwise -> False
+ (d:c:_) | isPunctuation d
+ && not onlyFinal
+ && isEndPunct c -> True
+ (c:_) | isEndPunct c -> True
+ | otherwise -> False
where isEndPunct c = c `elem` (".,;:!?" :: String)
startWithPunct :: [Inline] -> Bool
diff --git a/src/Text/CSL/Proc/Collapse.hs b/src/Text/CSL/Proc/Collapse.hs
index 0fc0665..42d67be 100644
--- a/src/Text/CSL/Proc/Collapse.hs
+++ b/src/Text/CSL/Proc/Collapse.hs
@@ -72,10 +72,11 @@ collapseNumber (CG _ f d os) = mapCitationGroup process $ CG [] f d os
groupCites :: [(Cite, Output)] -> [(Cite, Output)]
groupCites [] = []
-groupCites (x:xs) = let equal = filter ((==) (namesOf $ snd x) . namesOf . snd) xs
- notequal = filter ((/=) (namesOf $ snd x) . namesOf . snd) xs
+groupCites (x:xs) = let equal = filter (hasSameNamesAs x) xs
+ notequal = filter (not . hasSameNamesAs x) xs
in x : equal ++ groupCites notequal
where
+ hasSameNamesAs w y = namesOf (snd w) == namesOf (snd y)
contribsQ o
| OContrib _ _ c _ _ <- o = [c]
| otherwise = []
@@ -138,7 +139,9 @@ collapseYear s ranged (CG cs f d os) = CG cs f [] (process os)
| OContrib _ _ c _ _ <- o = [proc' rmHashAndGivenNames c]
| otherwise = []
namesOf = query contribsQ
- process = doCollapse . groupBy (\a b -> namesOf (snd a) == namesOf (snd b)) . groupCites
+ hasSameNames a b = not (null (namesOf (snd a))) &&
+ namesOf (snd a) == namesOf (snd b)
+ process = doCollapse . groupBy hasSameNames . groupCites
collapseYearSuf :: Bool -> String -> [(Cite,Output)] -> [Output]
collapseYearSuf ranged ysd = process
diff --git a/stack.yaml b/stack.yaml
index a710dbf..74c264f 100644
--- a/stack.yaml
+++ b/stack.yaml
@@ -9,17 +9,19 @@ flags:
packages:
- '.'
extra-deps:
-- pandoc-2.0.1
-- texmath-0.9.4.2
-- hslua-0.9.2
-- skylighting-0.4.2
+- pandoc-2.0.5
+- texmath-0.10
+- hslua-0.9.3
+- hslua-module-text-0.1.2.1
+- skylighting-0.5
- cmark-gfm-0.1.1
- QuickCheck-2.10.0.1
- tasty-quickcheck-0.9.1
+- tagsoup-0.14.2
- doctemplates-0.2.1
- haddock-library-1.4.3
-- pandoc-types-1.17.2
+- pandoc-types-1.17.3
# needed for now:
- hs-bibutils-6.2.0.1
- rfc5051-0.1.0.3
-resolver: lts-9.9
+resolver: lts-9.14
diff --git a/tests/issue152.expected.native b/tests/issue152.expected.native
new file mode 100644
index 0000000..55eb4ac
--- /dev/null
+++ b/tests/issue152.expected.native
@@ -0,0 +1,9 @@
+Pandoc (Meta {unMeta = fromList [("csl",MetaInlines [Str "tests/apa.csl"]),("references",MetaList [MetaMap (fromList [("URL",MetaInlines [Str "http://geekfeminism.wikia.com/wiki/Geek_Feminism"]),("accessed",MetaMap (fromList [("day",MetaString "10"),("month",MetaString "4"),("year",MetaString "2013")])),("container-title",MetaInlines [Str "Geek",Space,Str "Feminism"]),("custom2",MetaInlines [Str "ok.mm"]),("id",MetaInlines [Str "Feminism2013gf"]),("issued",MetaMap (fromList [("day",MetaString "10"),("month",MetaString "4"),("year",MetaString "2013")])),("keyword",MetaInlines [Str "gender"]),("title",MetaInlines [Str "Geek",Space,Str "Feminism"]),("type",MetaInlines [Str "webpage"])]),MetaMap (fromList [("URL",MetaInlines [Str "http://geekfeminism.wikia.com/wiki/Category:Communities"]),("accessed",MetaMap (fromList [("day",MetaString "19"),("month",MetaString "10"),("year",MetaString "2011")])),("container-title",MetaInlines [Str "Geek",Space,Str "Feminism"]),("custom2",MetaInlines [Str "gender.mm"]),("id",MetaInlines [Str "Feminism2011ces"]),("issued",MetaMap (fromList [("day",MetaString "14"),("month",MetaString "8"),("year",MetaString "2011")])),("keyword",MetaInlines [Str "gender"]),("title",MetaInlines [Str "Communities"]),("type",MetaInlines [Str "entry-encyclopedia"])])])]})
+[Header 1 ("test",[],[]) [Str "Test"]
+,Para [Str "I",Space,Str "have",Space,Str "two",Space,Str "citations",Space,Cite [Citation {citationId = "Feminism2013gf", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 1},Citation {citationId = "Feminism2011ces", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 2}] [Str "(",Str "\8220Communities,\8221",Space,Str "2011;",Space,Str "\8220Geek",Space,Str "Feminism,\8221",Space,Str "2013)"],Str "."]
+,Header 1 ("references",["unnumbered"],[]) [Str "References"]
+,Div ("refs",["references"],[])
+ [Div ("ref-Feminism2011ces",[],[])
+ [Para [Str "Communities.",Space,Str "(2011,",Space,Str "August",Space,Str "14).",Space,Str "In",Space,Emph [Str "Geek",Space,Str "Feminism"],Str ".",Space,Str "Retrieved",Space,Str "from",Space,Link ("",[],[]) [Str "http://geekfeminism.wikia.com/wiki/Category:Communities"] ("http://geekfeminism.wikia.com/wiki/Category:Communities","")]]
+ ,Div ("ref-Feminism2013gf",[],[])
+ [Para [Str "Geek",Space,Str "Feminism.",Space,Str "(2013,",Space,Str "April",Space,Str "10).",Space,Emph [Str "Geek",Space,Str "Feminism"],Str ".",Space,Str "Retrieved",Space,Str "April",Space,Str "10,",Space,Str "2013,",Space,Str "from",Space,Link ("",[],[]) [Str "http://geekfeminism.wikia.com/wiki/Geek_Feminism"] ("http://geekfeminism.wikia.com/wiki/Geek_Feminism","")]]]]
diff --git a/tests/issue152.in.native b/tests/issue152.in.native
new file mode 100644
index 0000000..cef969c
--- /dev/null
+++ b/tests/issue152.in.native
@@ -0,0 +1,4 @@
+Pandoc (Meta {unMeta = fromList [("csl",MetaInlines [Str "tests/apa.csl"]),("references",MetaList [MetaMap (fromList [("URL",MetaInlines [Str "http://geekfeminism.wikia.com/wiki/Geek_Feminism"]),("accessed",MetaMap (fromList [("day",MetaString "10"),("month",MetaString "4"),("year",MetaString "2013")])),("container-title",MetaInlines [Str "Geek",Space,Str "Feminism"]),("custom2",MetaInlines [Str "ok.mm"]),("id",MetaInlines [Str "Feminism2013gf"]),("issued",MetaMap (fromList [("day",MetaString "10"),("month",MetaString "4"),("year",MetaString "2013")])),("keyword",MetaInlines [Str "gender"]),("title",MetaInlines [Str "Geek",Space,Str "Feminism"]),("type",MetaInlines [Str "webpage"])]),MetaMap (fromList [("URL",MetaInlines [Str "http://geekfeminism.wikia.com/wiki/Category:Communities"]),("accessed",MetaMap (fromList [("day",MetaString "19"),("month",MetaString "10"),("year",MetaString "2011")])),("container-title",MetaInlines [Str "Geek",Space,Str "Feminism"]),("custom2",MetaInlines [Str "gender.mm"]),("id",MetaInlines [Str "Feminism2011ces"]),("issued",MetaMap (fromList [("day",MetaString "14"),("month",MetaString "8"),("year",MetaString "2011")])),("keyword",MetaInlines [Str "gender"]),("title",MetaInlines [Str "Communities"]),("type",MetaInlines [Str "entry-encyclopedia"])])])]})
+[Header 1 ("test",[],[]) [Str "Test"]
+,Para [Str "I",Space,Str "have",Space,Str "two",Space,Str "citations",Space,Cite [Citation {citationId = "Feminism2013gf", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "Feminism2011ces", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [Str "[@Feminism2013gf;",Space,Str "@Feminism2011ces]"],Str "."]
+,Header 1 ("references",[],[]) [Str "References"]]
diff --git a/tests/modern-language-association-7th-edition.csl b/tests/modern-language-association-7th-edition.csl
new file mode 100644
index 0000000..c2fc292
--- /dev/null
+++ b/tests/modern-language-association-7th-edition.csl
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8"?>
+<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="never">
+ <info>
+ <title>Modern Language Association 7th edition</title>
+ <title-short>MLA</title-short>
+ <id>http://www.zotero.org/styles/modern-language-association-7th-edition</id>
+ <link href="http://www.zotero.org/styles/modern-language-association-7th-edition" rel="self"/>
+ <link href="http://owl.english.purdue.edu/owl/section/2/11/" rel="documentation"/>
+ <author>
+ <name>Ilouise S. Bradford</name>
+ <email>isbradford@gmail.com</email>
+ </author>
+ <contributor>
+ <name>Sarah Ficke</name>
+ <email>sficke@email.unc.edu</email>
+ </contributor>
+ <contributor>
+ <name>Sebastian Karcher</name>
+ <email>karcher@u.northwestern.edu</email>
+ </contributor>
+ <contributor>
+ <name>Christian Werthschulte</name>
+ <email>Christian.Werthschulte@rub.de</email>
+ </contributor>
+ <contributor>
+ <name>Simon Kornblith</name>
+ <email>simon@simonster.com</email>
+ </contributor>
+ <contributor>
+ <name>James Johnston</name>
+ <email>thejamesjohnston@gmail.com</email>
+ </contributor>
+ <category citation-format="author"/>
+ <category field="generic-base"/>
+ <summary>This style adheres to the MLA 7th edition handbook and contains modifications to these types of sources: e-mail, forum posts, interviews, manuscripts, maps, presentations, TV broadcasts, and web pages.</summary>
+ <updated>2017-04-27T18:03:35+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="month-01" form="short">Jan.</term>
+ <term name="month-02" form="short">Feb.</term>
+ <term name="month-03" form="short">Mar.</term>
+ <term name="month-04" form="short">Apr.</term>
+ <term name="month-05" form="short">May</term>
+ <term name="month-06" form="short">June</term>
+ <term name="month-07" form="short">July</term>
+ <term name="month-08" form="short">Aug.</term>
+ <term name="month-09" form="short">Sept.</term>
+ <term name="month-10" form="short">Oct.</term>
+ <term name="month-11" form="short">Nov.</term>
+ <term name="month-12" form="short">Dec.</term>
+ <term name="volume" form="short">
+ <single>Vol.</single>
+ <multiple>vols</multiple>
+ </term>
+ <term name="edition" form="short">ed</term>
+ <term name="editor" form="verb-short">ed.</term>
+ <term name="translator" form="verb-short">trans.</term>
+ <term name="translator" form="short">trans.</term>
+ </terms>
+ </locale>
+ <macro name="editor-translator">
+ <names variable="editor translator" delimiter=". ">
+ <label form="verb-short" text-case="capitalize-first" suffix=" "/>
+ <name and="text" delimiter=", "/>
+ </names>
+ </macro>
+ <macro name="author">
+ <names variable="author">
+ <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
+ <label form="short" prefix=", "/>
+ <substitute>
+ <names variable="editor"/>
+ <names variable="translator"/>
+ <text macro="title"/>
+ </substitute>
+ </names>
+ </macro>
+ <macro name="author-short">
+ <names variable="author">
+ <name form="short" and="text" delimiter=", " initialize-with=". "/>
+ <substitute>
+ <names variable="editor"/>
+ <names variable="translator"/>
+ <text macro="title-short"/>
+ </substitute>
+ </names>
+ </macro>
+ <macro name="access">
+ <group delimiter=" ">
+ <date variable="accessed">
+ <date-part name="day" suffix=" "/>
+ <date-part name="month" form="short" suffix=" "/>
+ <date-part name="year"/>
+ </date>
+ </group>
+ </macro>
+ <macro name="issued-full-date">
+ <choose>
+ <if variable="issued">
+ <date variable="issued">
+ <date-part name="day" suffix=" "/>
+ <date-part name="month" form="short" suffix=" " strip-periods="false"/>
+ <date-part name="year"/>
+ </date>
+ </if>
+ <else>
+ <text term="no date" form="short"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="medium">
+ <choose>
+ <if type="motion_picture">
+ <choose>
+ <if variable="medium">
+ <text variable="medium" prefix=" "/>
+ </if>
+ <else>
+ <text value="Film" prefix=" "/>
+ </else>
+ </choose>
+ </if>
+ <else-if type="broadcast">
+ <choose>
+ <if variable="medium">
+ <text variable="medium" prefix=" "/>
+ </if>
+ <else>
+ <text value="Television" prefix=" "/>
+ </else>
+ </choose>
+ </else-if>
+ <else-if type="manuscript">
+ <text value=""/>
+ </else-if>
+ <else-if type="personal_communication" match="any">
+ <text value="" prefix=" "/>
+ </else-if>
+ <else-if type="speech" match="any">
+ <text value=""/>
+ </else-if>
+ <else-if type="interview">
+ <text variable="medium" prefix=" "/>
+ </else-if>
+ <else-if type="song">
+ <choose>
+ <if variable="medium">
+ <text variable="medium" prefix=" "/>
+ </if>
+ <else>
+ <text value="Audio Recording" prefix=" "/>
+ </else>
+ </choose>
+ </else-if>
+ <else-if type="graphic" variable="medium" match="all">
+ <text variable="medium" prefix=" "/>
+ </else-if>
+ <else>
+ <choose>
+ <if variable="URL DOI" match="any">
+ <text variable="source" prefix=" " suffix="." font-style="italic"/>
+ <group>
+ <text value="Web." prefix=" "/>
+ </group>
+ <text prefix=" " suffix="." macro="access"/>
+ </if>
+ <else>
+ <text value="Print" prefix=" "/>
+ </else>
+ </choose>
+ </else>
+ </choose>
+ </macro>
+ <macro name="title">
+ <choose>
+ <if type="bill book graphic legal_case legislation manuscript motion_picture report song" match="any">
+ <text variable="title" font-style="italic" text-case="title"/>
+ </if>
+ <else-if type="interview personal_communication" match="any">
+ <text variable="title" text-case="title" quotes="false"/>
+ </else-if>
+ <else>
+ <text variable="title" text-case="title" quotes="true"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="title-short">
+ <choose>
+ <if type="bill book graphic legal_case legislation manuscript motion_picture report song" match="any">
+ <text variable="title" text-case="title" form="short" font-style="italic"/>
+ </if>
+ <else>
+ <text variable="title" text-case="title" form="short" quotes="true"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="pages">
+ <choose>
+ <if variable="page">
+ <text variable="page"/>
+ </if>
+ <else-if type="personal_communication interview" match="any">
+ <text value=""/>
+ </else-if>
+ <else>
+ <text value="n. pag"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="edition">
+ <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>
+ </macro>
+ <macro name="volume">
+ <choose>
+ <if is-numeric="volume">
+ <group delimiter=" ">
+ <text term="volume" form="short" strip-periods="false"/>
+ <number variable="volume"/>
+ </group>
+ </if>
+ <else>
+ <text variable="volume"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="number-of-volumes-only">
+ <choose>
+ <if variable="volume" match="none">
+ <choose>
+ <if is-numeric="number-of-volumes">
+ <group delimiter=" ">
+ <number variable="number-of-volumes"/>
+ <text term="volume" form="short" plural="true" strip-periods="true"/>
+ </group>
+ </if>
+ <else>
+ <text variable="number-of-volumes"/>
+ </else>
+ </choose>
+ </if>
+ </choose>
+ </macro>
+ <macro name="number-of-volumes-optional">
+ <choose>
+ <if variable="volume">
+ <choose>
+ <if is-numeric="number-of-volumes">
+ <group delimiter=" ">
+ <number variable="number-of-volumes"/>
+ <text term="volume" form="short" plural="true" strip-periods="true"/>
+ </group>
+ </if>
+ <else>
+ <text variable="number-of-volumes"/>
+ </else>
+ </choose>
+ </if>
+ </choose>
+ </macro>
+ <macro name="collection-title">
+ <text variable="collection-title" text-case="title" prefix=" "/>
+ </macro>
+ <macro name="collection-number">
+ <text variable="collection-number" prefix=" " suffix="."/>
+ </macro>
+ <macro name="publisher">
+ <choose>
+ <if variable="publisher">
+ <text variable="publisher"/>
+ </if>
+ <else>
+ <text value="N.p."/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="publisher-year">
+ <group delimiter=", ">
+ <group delimiter=": ">
+ <text variable="publisher-place"/>
+ <text macro="publisher"/>
+ </group>
+ <date variable="issued">
+ <date-part name="year"/>
+ </date>
+ </group>
+ </macro>
+ <citation et-al-min="2" et-al-use-first="1" disambiguate-add-names="true" disambiguate-add-givenname="true">
+ <layout prefix="(" suffix=")" delimiter="; ">
+ <group delimiter=" ">
+ <choose>
+ <if variable="author editor translator" match="any">
+ <group delimiter=", ">
+ <text macro="author-short"/>
+ <choose>
+ <if disambiguate="true">
+ <text macro="title-short"/>
+ </if>
+ </choose>
+ </group>
+ </if>
+ <else>
+ <text macro="title-short"/>
+ </else>
+ </choose>
+ <text variable="locator"/>
+ </group>
+ </layout>
+ </citation>
+ <bibliography hanging-indent="true" et-al-min="4" et-al-use-first="1" line-spacing="2" entry-spacing="0" subsequent-author-substitute="---">
+ <sort>
+ <key macro="author"/>
+ <key variable="title"/>
+ </sort>
+ <layout suffix=".">
+ <text macro="author" suffix="."/>
+ <text macro="title" prefix=" " suffix="."/>
+ <choose>
+ <if type="bill book graphic legal_case legislation motion_picture report song" match="any">
+ <text macro="editor-translator" prefix=" " suffix="."/>
+ <text macro="edition" prefix=" " suffix="."/>
+ <text macro="volume" prefix=" " suffix="."/>
+ <text macro="number-of-volumes-only" prefix=" " suffix="."/>
+ <text macro="publisher-year" prefix=" " suffix="."/>
+ </if>
+ <else-if type="chapter paper-conference" match="any">
+ <group>
+ <text variable="container-title" text-case="title" font-style="italic" prefix=" " suffix="."/>
+ <text macro="editor-translator" prefix=" " suffix="."/>
+ <text macro="edition" prefix=" " suffix="."/>
+ <text macro="volume" prefix=" " suffix="."/>
+ <text macro="number-of-volumes-only" prefix=" " suffix="."/>
+ <text macro="publisher-year" prefix=" " suffix="."/>
+ </group>
+ <text variable="page" prefix=" " suffix="."/>
+ </else-if>
+ <else-if type="thesis">
+ <text variable="genre" prefix=" " suffix="."/>
+ <group delimiter=", ">
+ <text macro="publisher" prefix=" "/>
+ <date variable="issued" prefix=" " suffix=".">
+ <date-part name="year"/>
+ </date>
+ </group>
+ <text variable="archive_location" prefix=" " suffix="."/>
+ </else-if>
+ <else-if type="manuscript">
+ <date variable="issued" prefix=" " suffix=".">
+ <date-part name="year"/>
+ </date>
+ <text variable="genre" prefix=" " suffix="."/>
+ <text variable="archive_location" prefix=" " suffix="."/>
+ <text variable="publisher-place" prefix=" "/>
+ </else-if>
+ <else-if type="personal_communication">
+ <date variable="issued" prefix=" " suffix=".">
+ <date-part name="day" suffix=" "/>
+ <date-part name="month" form="short" suffix=" "/>
+ <date-part name="year"/>
+ </date>
+ <choose>
+ <if variable="genre">
+ <text prefix=" " suffix="." variable="genre"/>
+ </if>
+ <else>
+ <text prefix=" " suffix="." value="E-mail"/>
+ </else>
+ </choose>
+ </else-if>
+ <else-if type="map">
+ <text variable="genre" prefix=" " suffix="."/>
+ <text variable="publisher-place" prefix=" " suffix=":"/>
+ <text macro="publisher" prefix=" "/>
+ <date variable="issued" prefix=" " suffix=",">
+ <date-part name="year"/>
+ </date>
+ </else-if>
+ <else-if type="speech">
+ <text variable="event" prefix=" " suffix="."/>
+ <text variable="publisher-place" prefix=" " suffix="."/>
+ <date variable="issued" prefix=" " suffix=".">
+ <date-part name="year"/>
+ </date>
+ <text variable="genre" prefix=" " suffix="."/>
+ </else-if>
+ <else-if type="webpage post-weblog" match="any">
+ <text variable="genre" prefix=" " suffix="."/>
+ <text variable="container-title" font-style="italic" prefix=" " suffix="."/>
+ <group delimiter=", " prefix=" ">
+ <text macro="publisher"/>
+ <text macro="issued-full-date" suffix="."/>
+ </group>
+ </else-if>
+ <else-if type="broadcast">
+ <text variable="container-title" font-style="italic" prefix=" " suffix="."/>
+ <text macro="publisher" prefix=" " suffix=","/>
+ <date variable="issued" prefix=" " suffix=".">
+ <date-part name="day" suffix=" "/>
+ <date-part name="month" form="short" suffix=" " strip-periods="false"/>
+ <date-part name="year"/>
+ </date>
+ </else-if>
+ <else>
+ <group prefix=" " suffix="." delimiter=": ">
+ <group delimiter=" ">
+ <text macro="editor-translator" suffix="."/>
+ <text variable="container-title" font-style="italic"/>
+ <choose>
+ <if type="article-journal">
+ <group delimiter=" ">
+ <group delimiter=".">
+ <text variable="volume"/>
+ <text variable="issue"/>
+ </group>
+ <date variable="issued" prefix="(" suffix="):">
+ <date-part name="year"/>
+ </date>
+ </group>
+ <text macro="pages" prefix=" "/>
+ </if>
+ <else>
+ <group>
+ <date variable="issued">
+ <date-part name="day" suffix=" "/>
+ <date-part name="month" form="short" suffix=" " strip-periods="false"/>
+ <date-part name="year"/>
+ </date>
+ <choose>
+ <if variable="URL DOI" match="any">
+ <text variable="page" prefix=": "/>
+ </if>
+ <else>
+ <text macro="pages" prefix=": "/>
+ </else>
+ </choose>
+ </group>
+ </else>
+ </choose>
+ </group>
+ </group>
+ </else>
+ </choose>
+ <text macro="medium" suffix="."/>
+ <text macro="number-of-volumes-optional" suffix="." prefix=" "/>
+ <text macro="collection-title"/>
+ <text macro="collection-number"/>
+ </layout>
+ </bibliography>
+</style>