pandoc-citeproc 0.14 → 0.14.1
raw patch · 7 files changed
+261/−15 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- changelog +13/−0
- pandoc-citeproc.cabal +1/−1
- src/Text/CSL/Pandoc.hs +19/−13
- src/Text/CSL/Proc.hs +15/−1
- tests/issue292.expected.native +9/−0
- tests/issue292.in.native +2/−0
- tests/sage-harvard.csl +202/−0
changelog view
@@ -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).
pandoc-citeproc.cabal view
@@ -1,5 +1,5 @@ name: pandoc-citeproc-version: 0.14+version: 0.14.1 cabal-version: >= 1.12 synopsis: Supports using pandoc with citeproc
src/Text/CSL/Pandoc.hs view
@@ -57,9 +57,8 @@ 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,19 +108,26 @@ 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. mkNociteWildcards :: [Reference] -> [[Citation]] -> [[Citation]]@@ -194,7 +200,7 @@ 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
src/Text/CSL/Proc.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE PatternGuards #-} ----------------------------------------------------------------------------- -- |@@ -19,6 +20,7 @@ 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 @@ 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
+ tests/issue292.expected.native view
@@ -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)."]]]]
+ tests/issue292.in.native view
@@ -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]"]]]
+ tests/sage-harvard.csl view
@@ -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>