summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnMacFarlane <>2018-02-01 01:01:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2018-02-01 01:01:00 (GMT)
commitb1c57707da5aa56df9a1638c621b97a837a20af0 (patch)
treecaf9ea7cf233c15f3ee56fae8bef290f0d177c0e
parentbcb70ab799002b0b54703dd5dd0ce2998fb9f408 (diff)
version 0.14.10.14.1
-rw-r--r--changelog13
-rw-r--r--pandoc-citeproc.cabal2
-rw-r--r--src/Text/CSL/Pandoc.hs32
-rw-r--r--src/Text/CSL/Proc.hs16
-rw-r--r--tests/issue292.expected.native9
-rw-r--r--tests/issue292.in.native2
-rw-r--r--tests/sage-harvard.csl202
7 files changed, 261 insertions, 15 deletions
diff --git a/changelog b/changelog
index bc82ba8..0b90c23 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,16 @@
+pandoc-citeproc (0.14.1)
+
+ * More robust handling of boolean metadata values.
+ * Keep position of citations with prefixes when sorting (behavior
+ change, #292). If citations with prefixes are moved around,
+ gibberish can result. E.g.:
+ `A fascinating research tidbit [@Zanadu1999, p. 35; see
+ for comparison @Aalto2005]` can become
+ "A fascinating research tidbit (see for comparison Aalto, 2005;
+ Zanadu, 1999: 35)" with a sorting style like sage-harvard.csl.
+ This change causes sorting to be applied only to subgroups of citations
+ that lack prefixes.
+
pandoc-citeproc (0.14)
* Fix non-numerical season parsing in RefDate (#316).
diff --git a/pandoc-citeproc.cabal b/pandoc-citeproc.cabal
index 9152213..999d9da 100644
--- a/pandoc-citeproc.cabal
+++ b/pandoc-citeproc.cabal
@@ -1,5 +1,5 @@
name: pandoc-citeproc
-version: 0.14
+version: 0.14.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 5c1293b..6663812 100644
--- a/src/Text/CSL/Pandoc.hs
+++ b/src/Text/CSL/Pandoc.hs
@@ -57,9 +57,8 @@ processCites style refs (Pandoc m1 b1) =
map (map (toCslCite locMap)) grps)
cits_map = tr' "cits_map" $ M.fromList $ zip grps (citations result)
biblioList = map (renderPandoc' style) $ zip (bibliography result) (citationIds result)
- moveNotes = case lookupMeta "notes-after-punctuation" m1 of
- Just (MetaBool False) -> False
- _ -> True
+ moveNotes = maybe True truish $
+ lookupMeta "notes-after-punctuation" m1
Pandoc m3 bs = walk (mvPunct moveNotes style) . deNote .
walk (processCite style cits_map) $ Pandoc m2 b2
m = case metanocites of
@@ -109,18 +108,25 @@ refTitle meta =
isRefRemove :: Meta -> Bool
isRefRemove meta =
- case lookupMeta "suppress-bibliography" meta of
- Just (MetaBool True) -> True
- _ -> False
+ maybe False truish $ lookupMeta "suppress-bibliography" meta
isLinkCitations :: Meta -> Bool
isLinkCitations meta =
- case lookupMeta "link-citations" meta of
- Just (MetaBool True) -> True
- Just (MetaString s) -> map toLower s `elem` yesValues
- Just (MetaInlines ils) -> map toLower (stringify ils) `elem` yesValues
- _ -> False
- where yesValues = ["true", "yes", "on"]
+ maybe False truish $ lookupMeta "link-citations" meta
+
+truish :: MetaValue -> Bool
+truish (MetaBool t) = t
+truish (MetaString s) = isYesValue (map toLower s)
+truish (MetaInlines ils) = isYesValue (map toLower (stringify ils))
+truish (MetaBlocks [Plain ils]) = isYesValue (map toLower (stringify ils))
+truish _ = False
+
+isYesValue :: String -> Bool
+isYesValue "t" = True
+isYesValue "true" = True
+isYesValue "yes" = True
+isYesValue "on" = True
+isYesValue _ = False
-- if the 'nocite' Meta field contains a citation with id = '*',
-- create a cite with to all the references.
@@ -194,7 +200,7 @@ processCites' (Pandoc meta blocks) = do
let idpred = if "*" `Set.member` citids
then const True
else (`Set.member` citids)
- bibRefs <- getBibRefs idpred $ Data.Maybe.fromMaybe (MetaList [])
+ bibRefs <- getBibRefs idpred $ fromMaybe (MetaList [])
$ lookupMeta "bibliography" meta
let refs = inlineRefs ++ bibRefs
let cslAbbrevFile = lookupMeta "citation-abbreviations" meta >>= toPath
diff --git a/src/Text/CSL/Proc.hs b/src/Text/CSL/Proc.hs
index e23521e..85ffdb1 100644
--- a/src/Text/CSL/Proc.hs
+++ b/src/Text/CSL/Proc.hs
@@ -1,4 +1,5 @@
{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PatternGuards #-}
-----------------------------------------------------------------------------
-- |
@@ -19,6 +20,7 @@ module Text.CSL.Proc where
import Control.Applicative ((<|>))
import Control.Arrow (second, (&&&), (>>>))
+import Control.Monad.State (execState, modify)
import Data.Aeson
import Data.Char (isDigit, isLetter, toLower)
import Data.List
@@ -304,7 +306,19 @@ procGroup Style {citation = ct, csMacros = ms , styleLocale = l,
format (c,r) = (c, evalLayout (citLayout ct) (EvalCite c) False l ms opts' as r)
sort_ (c,r) = evalSorting (EvalSorting c) l ms opts' (citSort ct) as r
process = map (second (flip Output emptyFormatting) . format &&& sort_)
- result = sortItems $ process cr
+ result = concatMap sortItems $ toChunks $ process cr
+ -- toChunks splits the citations up into groups, such that
+ -- a citation with a non-null prefix is by itself in its
+ -- group, otherwise preserving the order (see #292 for
+ -- motivation; we don't want to move prefixed citations
+ -- around)
+ toChunks xs = reverse $ execState (toChunks' xs) []
+ toChunks' xs = do
+ case break hasPrefix xs of
+ ([], []) -> return ()
+ ([], y:ys) -> modify ([y]:) >> toChunks' ys
+ (zs, ys) -> modify (zs:) >> toChunks' ys
+ hasPrefix ((c,_),_) = citePrefix c /= mempty
formatBiblioLayout :: Formatting -> Delimiter -> [Output] -> [Output]
formatBiblioLayout f d = appendOutput f . addDelim d
diff --git a/tests/issue292.expected.native b/tests/issue292.expected.native
new file mode 100644
index 0000000..19d02ff
--- /dev/null
+++ b/tests/issue292.expected.native
@@ -0,0 +1,9 @@
+Pandoc (Meta {unMeta = fromList [("csl",MetaInlines [Str "tests/sage-harvard.csl"]),("references",MetaList [MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Doe"])])),("id",MetaInlines [Str "doe"]),("issued",MetaMap (fromList [("year",MetaString "2007")])),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Zoe"])])),("id",MetaInlines [Str "zoe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2009")])]),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Roe"])])),("id",MetaInlines [Str "roe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2007")])]),("type",MetaInlines [Str "article"])])])]})
+[Para [Cite [Citation {citationId = "zoe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 1},Citation {citationId = "roe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 2},Citation {citationId = "doe", citationPrefix = [Str "see",Space,Str "for",Space,Str "comparison"], citationSuffix = [Str ",",Space,Str "p.\160\&3"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 3}] [Str "(Roe,",Space,Str "2007;",Space,Str "Zoe,",Space,Str "2009;",Space,Str "see",Space,Str "for",Space,Str "comparison",Space,Str "Doe,",Space,Str "2007:",Space,Str "3)"]]
+,Div ("refs",["references"],[])
+ [Div ("ref-doe",[],[])
+ [Para [Str "Doe",Space,Str "(2007)."]]
+ ,Div ("ref-roe",[],[])
+ [Para [Str "Roe",Space,Str "(2007)."]]
+ ,Div ("ref-zoe",[],[])
+ [Para [Str "Zoe",Space,Str "(2009)."]]]]
diff --git a/tests/issue292.in.native b/tests/issue292.in.native
new file mode 100644
index 0000000..fda446e
--- /dev/null
+++ b/tests/issue292.in.native
@@ -0,0 +1,2 @@
+Pandoc (Meta {unMeta = fromList [("csl",MetaInlines [Str "tests/sage-harvard.csl"]),("references",MetaList [MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Doe"])])),("id",MetaInlines [Str "doe"]),("issued",MetaMap (fromList [("year",MetaString "2007")])),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Zoe"])])),("id",MetaInlines [Str "zoe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2009")])]),("type",MetaInlines [Str "article"])]),MetaMap (fromList [("author",MetaMap (fromList [("family",MetaInlines [Str "Roe"])])),("id",MetaInlines [Str "roe"]),("issued",MetaList [MetaMap (fromList [("year",MetaString "2007")])]),("type",MetaInlines [Str "article"])])])]})
+[Para [Cite [Citation {citationId = "zoe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "roe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0},Citation {citationId = "doe", citationPrefix = [Str "see",Space,Str "for",Space,Str "comparison"], citationSuffix = [Str ",",Space,Str "p.\160\&3"], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [Str "[@zoe;",Space,Str "@roe;",Space,Str "see",Space,Str "for",Space,Str "comparison",Space,Str "@doe,",Space,Str "p.",Space,Str "3]"]]]
diff --git a/tests/sage-harvard.csl b/tests/sage-harvard.csl
new file mode 100644
index 0000000..2798c08
--- /dev/null
+++ b/tests/sage-harvard.csl
@@ -0,0 +1,202 @@
+<?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" default-locale="en-GB">
+ <info>
+ <title>SAGE - Harvard</title>
+ <id>http://www.zotero.org/styles/sage-harvard</id>
+ <link href="http://www.zotero.org/styles/sage-harvard" rel="self"/>
+ <link href="http://www.zotero.org/styles/the-open-university-harvard" rel="template"/>
+ <link href="http://www.uk.sagepub.com/repository/binaries/pdf/SAGE_Harvard_reference_style.pdf" rel="documentation"/>
+ <author>
+ <name>Joseph Reagle</name>
+ </author>
+ <category citation-format="author-date"/>
+ <category field="generic-base"/>
+ <summary>The SAGE Harvard author-date style</summary>
+ <updated>2012-09-27T22:06:38+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-GB">
+ <terms>
+ <term name="editor" form="short">
+ <single>ed.</single>
+ <multiple>eds</multiple>
+ </term>
+ </terms>
+ </locale>
+ <macro name="editor">
+ <names variable="editor" delimiter=", ">
+ <name and="text" initialize-with="" delimiter=", " sort-separator=" " name-as-sort-order="all"/>
+ <label form="short" prefix=" (" suffix=")"/>
+ </names>
+ </macro>
+ <macro name="author">
+ <names variable="author">
+ <name initialize-with="" name-as-sort-order="all" and="text" sort-separator=" " delimiter=", " delimiter-precedes-last="never" form="long"/>
+ <label form="short" prefix=" (" suffix=")"/>
+ <substitute>
+ <names variable="editor"/>
+ <names variable="translator"/>
+ <text variable="container-title" font-style="italic"/>
+ <text macro="title"/>
+ </substitute>
+ </names>
+ </macro>
+ <macro name="author-count">
+ <names variable="author">
+ <name form="count"/>
+ <substitute>
+ <names variable="editor"/>
+ </substitute>
+ </names>
+ </macro>
+ <macro name="author-short">
+ <names variable="author">
+ <name form="short" and="text" delimiter=", " delimiter-precedes-last="never" initialize-with=""/>
+ <substitute>
+ <names variable="editor"/>
+ <names variable="translator"/>
+ <text variable="container-title" font-style="italic"/>
+ <text macro="title"/>
+ </substitute>
+ </names>
+ </macro>
+ <macro name="access">
+ <choose>
+ <if variable="URL">
+ <text value="Available from: "/>
+ <text variable="URL"/>
+ <group prefix=" (" delimiter=" " suffix=")">
+ <text term="accessed"/>
+ <date variable="accessed">
+ <date-part name="day" suffix=" "/>
+ <date-part name="month" suffix=" "/>
+ <date-part name="year"/>
+ </date>
+ </group>
+ </if>
+ </choose>
+ </macro>
+ <macro name="title">
+ <choose>
+ <if type="bill book graphic legal_case motion_picture report song" match="any">
+ <text variable="title" font-style="italic"/>
+ </if>
+ <else>
+ <text variable="title"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="publisher">
+ <group delimiter=": ">
+ <text variable="publisher-place"/>
+ <text variable="publisher"/>
+ </group>
+ </macro>
+ <macro name="year-date">
+ <choose>
+ <if variable="issued">
+ <date variable="issued">
+ <date-part name="year"/>
+ </date>
+ </if>
+ <else>
+ <text term="no date" form="short"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="locator">
+ <choose>
+ <if type="article-journal">
+ <text variable="volume"/>
+ <text variable="issue" prefix="(" suffix=")"/>
+ </if>
+ </choose>
+ </macro>
+ <macro name="published-date">
+ <choose>
+ <if type="article-newspaper">
+ <date variable="issued">
+ <date-part name="day" form="ordinal" suffix=" "/>
+ <date-part name="month" form="long"/>
+ </date>
+ </if>
+ </choose>
+ </macro>
+ <macro name="pages">
+ <choose>
+ <if type="chapter paper-conference" match="any">
+ <group delimiter=" " prefix=", ">
+ <label variable="page" form="short" suffix=" "/>
+ <text variable="page"/>
+ </group>
+ </if>
+ <else-if type="article-journal">
+ <text variable="page" prefix=": "/>
+ </else-if>
+ </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" suffix="."/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="container-prefix">
+ <choose>
+ <if type="chapter paper-conference" match="any">
+ <text term="in" text-case="capitalize-first" suffix=": "/>
+ </if>
+ </choose>
+ </macro>
+ <citation et-al-min="3" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" collapse="year">
+ <sort>
+ <key macro="author-short"/>
+ <key macro="year-date"/>
+ </sort>
+ <layout prefix="(" suffix=")" delimiter="; ">
+ <group delimiter=": ">
+ <group delimiter=", ">
+ <text macro="author-short"/>
+ <text macro="year-date"/>
+ </group>
+ <text variable="locator"/>
+ </group>
+ </layout>
+ </citation>
+ <bibliography hanging-indent="true" et-al-min="4" et-al-use-first="3">
+ <sort>
+ <key macro="author" names-min="1" names-use-first="1"/>
+ <key macro="author-count" names-min="3" names-use-first="3"/>
+ <key macro="author" names-min="3" names-use-first="1"/>
+ <key macro="year-date"/>
+ <key variable="title"/>
+ </sort>
+ <layout suffix=".">
+ <group delimiter=" ">
+ <text macro="author"/>
+ <text macro="year-date" prefix="(" suffix=")"/>
+ <text macro="title" suffix="."/>
+ <text macro="edition"/>
+ <text macro="container-prefix"/>
+ <group delimiter=", ">
+ <text macro="editor"/>
+ <text variable="container-title" font-style="italic"/>
+ <text variable="collection-title"/>
+ <text variable="genre"/>
+ <text macro="publisher"/>
+ <text macro="published-date"/>
+ </group>
+ <text macro="locator"/>
+ </group>
+ <text macro="pages"/>
+ <text macro="access" prefix=". "/>
+ </layout>
+ </bibliography>
+</style>