citeproc 0.1.0.3 → 0.1.1
raw patch · 8 files changed
+582/−24 lines, 8 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Citeproc.Types: instance Data.Foldable.Foldable Citeproc.Types.Result
+ Citeproc.Types: instance Data.Traversable.Traversable Citeproc.Types.Result
+ Citeproc.Types: instance GHC.Base.Functor Citeproc.Types.Result
Files
- CHANGELOG.md +13/−0
- README.md +8/−1
- citeproc.cabal +1/−1
- src/Citeproc/Eval.hs +17/−18
- src/Citeproc/Pandoc.hs +1/−2
- src/Citeproc/Types.hs +1/−1
- test/Spec.hs +1/−1
- test/extra/issue22.txt +540/−0
CHANGELOG.md view
@@ -1,5 +1,18 @@ # citeproc changelog +## 0.1.1++ * Ensure that uncited references are sorted last+ when it comes to assigning citation numbers (#22).+ * Remove "capitalize initial term" feature. This is required by+ the test suite but not the spec. It makes more sense for us to do+ this capitalization in the calling program, e.g. pandoc. For some+ citations in note styles may already be in notes and thus not+ trigger separate footnotes. If initial terms had been capitalized,+ we'd need to uncapitalize, and that is hard to do reliably.+ * Treat empty `FancyVal` as an empty value.+ * Derive Functor, Traversable, Foldable for Result [API change].+ ## 0.1.0.3 * Better handling of author-only/suppress-author.
README.md view
@@ -89,7 +89,14 @@ Although this library is much more accurate in implementing the CSL spec than pandoc-citeproc was, it still fails some of the-tests from the CSL test suite (58/845). However, most of the+tests from the CSL test suite (63/845). However, most of the failures are on minor corner cases, and in many cases the expected behavior goes beyond what is required by the CSL spec.+(For example, we intentionally refrain from capitalizing+terms in initial position in note styles. It makes more sense+for the calling program, e.g. pandoc, to do the capitalization+when it puts the citations in notes, since some citations+in note styles may already be in notes and in this case+their rendering may not require capitalization. It is easy+to capitalize reliably, hard to uncapitalize reliably.)
citeproc.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: citeproc-version: 0.1.0.3+version: 0.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
@@ -132,8 +132,9 @@ (concatMap (map citationItemId . citationItems) citations) [(1 :: Int)..] let citeIds = M.keysSet citationOrder- let sortedCiteIds = sortOn (`M.lookup` citationOrder)- (map referenceId refs)+ let sortedCiteIds = sortOn+ (fromMaybe maxBound . (`M.lookup` citationOrder))+ (map referenceId refs) assignCitationNumbers sortedCiteIds -- sorting of bibliography, insertion of citation-number (bibCitations, bibSortKeyMap) <-@@ -901,9 +902,6 @@ _ -> [1..] items <- mapM evalItem (zip positions (citationItems citation)) - styleOpts <- asks contextStyleOptions- let isNote = styleIsNoteStyle styleOpts- -- see display_SecondFieldAlignMigratePunctuation.txt let moveSuffixInsideDisplay zs = case (lastMay zs, formatSuffix formatting) of@@ -919,13 +917,10 @@ | otherwise -> (\ys' -> initSafe zs ++ [Formatted f ys']) <$> moveSuffixInsideDisplay ys _ -> Nothing- let items' = if isNote- then capitalizeInitialTerm items- else items return $- case moveSuffixInsideDisplay items' of- Nothing -> formatted formatting items'- Just items'' -> formatted formatting{ formatSuffix = Nothing } items''+ case moveSuffixInsideDisplay items of+ Nothing -> formatted formatting items+ Just items' -> formatted formatting{ formatSuffix = Nothing } items' where formatting = layoutFormatting layout @@ -2202,11 +2197,8 @@ HasVariable "locator" -> hasLocator HasVariable t -> case lookupVariable t ref of- Just (TextVal x) -> x /= mempty- Just (FancyVal x) -> toText x /= mempty- Just (NamesVal xs) -> not (null xs)- Just _ -> True- Nothing -> False+ Just x -> isNonEmpty x+ Nothing -> False HasType t -> lookupVariable "type" ref == Just (TextVal t) IsUncertainDate t -> case lookupVariable t ref of Just (DateVal d) -> dateCirca d@@ -2331,12 +2323,19 @@ askVariable v = do ref <- gets stateReference case lookupVariable v ref of- Just x -> do+ Just x | isNonEmpty x -> do updateVarCount 1 1 return $ Just x- Nothing -> do+ _ -> do updateVarCount 1 0 return Nothing++isNonEmpty :: CiteprocOutput a => Val a -> Bool+isNonEmpty (TextVal t) = not (T.null t)+isNonEmpty (FancyVal x) = x /= mempty+isNonEmpty (NamesVal []) = False+isNonEmpty (DateVal (Date [] _ Nothing Nothing)) = False+isNonEmpty _ = True citationLabel :: Reference a -> Val a citationLabel ref = TextVal trigraph
src/Citeproc/Pandoc.hs view
@@ -69,8 +69,7 @@ DisplayRightInline -> B.spanWith ("",["csl-right-inline"],[]) DisplayIndent -> B.spanWith ("",["csl-indent"],[]) addQuotes = B.doubleQuoted . flipFlopQuotes DoubleQuote- inNote = B.note . B.para .- addTextCase Nothing CapitalizeFirst+ inNote = B.note . B.para movePunctuationInsideQuotes = punctuationInsideQuotes mapText f = walk go
src/Citeproc/Types.hs view
@@ -1654,7 +1654,7 @@ -- each a pair consisting of the item identifier and -- the formatted entry , resultWarnings :: [Text] -- ^ Warnings from citation processing- } deriving (Show)+ } deriving (Show, Functor, Traversable, Foldable) instance ToJSON a => ToJSON (Result a) where toJSON res = object
test/Spec.hs view
@@ -319,7 +319,7 @@ (length (skipped counts)) case length (failed counts) + length (errored counts) of 0 -> exitWith ExitSuccess- n | n <= 58 -> do+ n | n <= 63 -> do putStrLn "We have passed all the CSL tests we expect to..." exitWith ExitSuccess | otherwise -> exitWith $ ExitFailure n
+ test/extra/issue22.txt view
@@ -0,0 +1,540 @@+>>===== MODE =====>>+citation+<<===== MODE =====<<++>>===== RESULT =====>>+<sup>1</sup>+<<===== RESULT =====<<++>>===== CSL =====>>+<?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="sort-only" page-range-format="minimal">+ <info>+ <title>Vancouver (superscript)</title>+ <id>http://www.zotero.org/styles/vancouver-superscript</id>+ <link href="http://www.zotero.org/styles/vancouver-superscript" rel="self"/>+ <link href="http://www.nlm.nih.gov/bsd/uniform_requirements.html" rel="documentation"/>+ <author>+ <name>Michael Berkowitz</name>+ <email>mberkowi@gmu.edu</email>+ </author>+ <contributor>+ <name>Sean Takats</name>+ <email>stakats@gmu.edu</email>+ </contributor>+ <contributor>+ <name>Sebastian Karcher</name>+ </contributor>+ <category citation-format="numeric"/>+ <category field="medicine"/>+ <summary>Vancouver style as outlined by International Committee of Medical Journal Editors Uniform Requirements for Manuscripts Submitted to Biomedical Journals: Sample References</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">+ <date form="text" delimiter=" ">+ <date-part name="year"/>+ <date-part name="month" form="short" strip-periods="true"/>+ <date-part name="day"/>+ </date>+ <terms>+ <term name="collection-editor" form="long">+ <single>editor</single>+ <multiple>editors</multiple>+ </term>+ <term name="presented at">presented at</term>+ <term name="available at">available from</term>+ <term name="section" form="short">sect.</term>+ </terms>+ </locale>+ <locale xml:lang="fr">+ <date form="text" delimiter=" ">+ <date-part name="day"/>+ <date-part name="month" form="short" strip-periods="true"/>+ <date-part name="year"/>+ </date>+ </locale>+ <macro name="author">+ <names variable="author">+ <name sort-separator=" " initialize-with="" name-as-sort-order="all" delimiter=", " delimiter-precedes-last="always"/>+ <label form="long" prefix=", "/>+ <substitute>+ <names variable="editor"/>+ </substitute>+ </names>+ </macro>+ <macro name="editor">+ <names variable="editor" suffix=".">+ <name sort-separator=" " initialize-with="" name-as-sort-order="all" delimiter=", " delimiter-precedes-last="always"/>+ <label form="long" prefix=", "/>+ </names>+ </macro>+ <macro name="chapter-marker">+ <choose>+ <if type="chapter paper-conference entry-dictionary entry-encyclopedia" match="any">+ <text term="in" text-case="capitalize-first"/>+ </if>+ </choose>+ </macro>+ <macro name="publisher">+ <choose>+ <!--discard publisher info for articles-->+ <if type="article-journal article-magazine article-newspaper" match="none">+ <group delimiter=": " suffix=";">+ <choose>+ <if type="thesis">+ <text variable="publisher-place" prefix="[" suffix="]"/>+ </if>+ <else-if type="speech"/>+ <else>+ <text variable="publisher-place"/>+ </else>+ </choose>+ <text variable="publisher"/>+ </group>+ </if>+ </choose>+ </macro>+ <macro name="access">+ <choose>+ <if variable="URL">+ <group delimiter=": ">+ <text term="available at" text-case="capitalize-first"/>+ <text variable="URL"/>+ </group>+ </if>+ </choose>+ </macro>+ <macro name="accessed-date">+ <choose>+ <if variable="URL">+ <group prefix="[" suffix="]" delimiter=" ">+ <text term="cited" text-case="lowercase"/>+ <date variable="accessed" form="text"/>+ </group>+ </if>+ </choose>+ </macro>+ <macro name="container-title">+ <choose>+ <if type="article-journal article-magazine chapter paper-conference article-newspaper review review-book entry-dictionary entry-encyclopedia" match="any">+ <group suffix="." delimiter=" ">+ <choose>+ <if type="article-journal review review-book" match="any">+ <text variable="container-title" form="short" strip-periods="true"/>+ </if>+ <else>+ <text variable="container-title" strip-periods="true"/>+ </else>+ </choose>+ <choose>+ <if variable="URL">+ <text term="internet" prefix="[" suffix="]" text-case="capitalize-first"/>+ </if>+ </choose>+ </group>+ <text macro="edition" prefix=" "/>+ </if>+ <!--add event-name and event-place once they become available-->+ <else-if type="bill legislation" match="any">+ <group delimiter=", ">+ <group delimiter=". ">+ <text variable="container-title"/>+ <group delimiter=" ">+ <text term="section" form="short" text-case="capitalize-first"/>+ <text variable="section"/>+ </group>+ </group>+ <text variable="number"/>+ </group>+ </else-if>+ <else-if type="speech">+ <group delimiter=": " suffix=";">+ <group delimiter=" ">+ <text variable="genre" text-case="capitalize-first"/>+ <text term="presented at"/>+ </group>+ <text variable="event"/>+ </group>+ </else-if>+ <else>+ <group delimiter=", " suffix=".">+ <choose>+ <if variable="collection-title" match="none">+ <group delimiter=" ">+ <label variable="volume" form="short" text-case="capitalize-first"/>+ <text variable="volume"/>+ </group>+ </if>+ </choose>+ <text variable="container-title"/>+ </group>+ </else>+ </choose>+ </macro>+ <macro name="title">+ <text variable="title"/>+ <choose>+ <if type="article-journal article-magazine chapter paper-conference article-newspaper review review-book entry-dictionary entry-encyclopedia" match="none">+ <choose>+ <if variable="URL">+ <text term="internet" prefix=" [" suffix="]" text-case="capitalize-first"/>+ </if>+ </choose>+ <text macro="edition" prefix=". "/>+ </if>+ </choose>+ <choose>+ <if type="thesis">+ <text variable="genre" prefix=" [" suffix="]"/>+ </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="date">+ <choose>+ <if type="article-journal article-magazine article-newspaper review review-book" match="any">+ <group suffix=";" delimiter=" ">+ <date variable="issued" form="text"/>+ <text macro="accessed-date"/>+ </group>+ </if>+ <else-if type="bill legislation" match="any">+ <group delimiter=", ">+ <date variable="issued" delimiter=" ">+ <date-part name="month" form="short" strip-periods="true"/>+ <date-part name="day"/>+ </date>+ <date variable="issued">+ <date-part name="year"/>+ </date>+ </group>+ </else-if>+ <else-if type="report">+ <date variable="issued" delimiter=" ">+ <date-part name="year"/>+ <date-part name="month" form="short" strip-periods="true"/>+ </date>+ <text macro="accessed-date" prefix=" "/>+ </else-if>+ <else-if type="patent">+ <group suffix=".">+ <group delimiter=", ">+ <text variable="number"/>+ <date variable="issued">+ <date-part name="year"/>+ </date>+ </group>+ <text macro="accessed-date" prefix=" "/>+ </group>+ </else-if>+ <else-if type="speech">+ <group delimiter="; ">+ <group delimiter=" ">+ <date variable="issued" delimiter=" ">+ <date-part name="year"/>+ <date-part name="month" form="short" strip-periods="true"/>+ <date-part name="day"/>+ </date>+ <text macro="accessed-date"/>+ </group>+ <text variable="event-place"/>+ </group>+ </else-if>+ <else>+ <group suffix=".">+ <date variable="issued">+ <date-part name="year"/>+ </date>+ <text macro="accessed-date" prefix=" "/>+ </group>+ </else>+ </choose>+ </macro>+ <macro name="pages">+ <choose>+ <if type="article-journal article-magazine article-newspaper review review-book" match="any">+ <text variable="page" prefix=":"/>+ </if>+ <else-if type="book" match="any">+ <text variable="number-of-pages" prefix=" "/>+ <choose>+ <if is-numeric="number-of-pages">+ <label variable="number-of-pages" form="short" prefix=" " plural="never"/>+ </if>+ </choose>+ </else-if>+ <else>+ <group prefix=" " delimiter=" ">+ <label variable="page" form="short" plural="never"/>+ <text variable="page"/>+ </group>+ </else>+ </choose>+ </macro>+ <macro name="journal-location">+ <choose>+ <if type="article-journal article-magazine review review-book" match="any">+ <text variable="volume"/>+ <text variable="issue" prefix="(" suffix=")"/>+ </if>+ </choose>+ </macro>+ <macro name="collection-details">+ <choose>+ <if type="article-journal article-magazine article-newspaper review review-book" match="none">+ <choose>+ <if variable="collection-title">+ <group delimiter=" " prefix="(" suffix=")">+ <names variable="collection-editor" suffix=".">+ <name sort-separator=" " initialize-with="" name-as-sort-order="all" delimiter=", " delimiter-precedes-last="always"/>+ <label form="long" prefix=", "/>+ </names>+ <group delimiter="; ">+ <text variable="collection-title"/>+ <group delimiter=" ">+ <label variable="volume" form="short"/>+ <text variable="volume"/>+ </group>+ </group>+ </group>+ </if>+ </choose>+ </if>+ </choose>+ </macro>+ <macro name="report-details">+ <choose>+ <if type="report">+ <text variable="number" prefix="Report No.: "/>+ </if>+ </choose>+ </macro>+ <citation collapse="citation-number">+ <sort>+ <key variable="citation-number"/>+ </sort>+ <layout delimiter="," vertical-align="sup">+ <text variable="citation-number"/>+ </layout>+ </citation>+ <bibliography et-al-min="7" et-al-use-first="6" second-field-align="flush">+ <layout>+ <text variable="citation-number" suffix=". "/>+ <group delimiter=". " suffix=". ">+ <text macro="author"/>+ <text macro="title"/>+ </group>+ <group delimiter=" " suffix=". ">+ <group delimiter=": ">+ <text macro="chapter-marker"/>+ <group delimiter=" ">+ <text macro="editor"/>+ <text macro="container-title"/>+ </group>+ </group>+ <text macro="publisher"/>+ <group>+ <text macro="date"/>+ <text macro="journal-location"/>+ <text macro="pages"/>+ </group>+ </group>+ <text macro="collection-details" suffix=". "/>+ <text macro="report-details" suffix=". "/>+ <text macro="access"/>+ </layout>+ </bibliography>+</style>+<<===== CSL =====<<++>>===== INPUT =====>>+[+ {+ "URL": "https://global.ihs.com/doc_detail.cfm?&rid=TIA&item_s_key=00125234&item_key_date=870024&input_doc_number=232&input_doc_title=&org_code=TIA",+ "author": [+ {+ "literal": "Telecommunications Industry Association"+ }+ ],+ "edition": "Revision F",+ "id": "tia232",+ "issued": {+ "date-parts": [+ [+ 1997,+ 10+ ]+ ]+ },+ "language": "en",+ "number-of-pages": "54",+ "publisher": "Telecommunications Industry Association",+ "title": "TIA-232 Interface Between Data Terminal Equipment and Data Circuit- Terminating Equipment Employing Serial Binary Data Interchange",+ "title-short": "TIA-232-F",+ "type": "book"+ },+ {+ "URL": "https://www.iso.org/obp/ui/#iso:std:iso-iec:11172:-1:ed-1:v1:en",+ "author": [+ {+ "literal": "ISO/IEC Joint Technical Committee 1"+ }+ ],+ "id": "iso/iec11172-1",+ "issued": {+ "date-parts": [+ [+ 1993,+ 8+ ]+ ]+ },+ "language": "en",+ "number-of-pages": "6",+ "publisher": "International Organization for Standardization",+ "title": "ISO/IEC 11172-1 Information technology — Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s — Part 1: Systems",+ "title-short": "ISO/IEC 11172-1:1993(E)",+ "type": "book"+ },+ {+ "URL": "https://www.iso.org/obp/ui/#iso:std:iso-iec:11172:-2:ed-1:v1:en",+ "author": [+ {+ "literal": "ISO/IEC Joint Technical Committee 1"+ }+ ],+ "id": "iso/iec11172-2",+ "issued": {+ "date-parts": [+ [+ 1993,+ 8+ ]+ ]+ },+ "language": "en",+ "number-of-pages": "112",+ "publisher": "International Organization for Standardization",+ "title": "ISO/IEC 11172-2 Information technology — Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s — Part 2: Video",+ "title-short": "ISO/IEC 11172-2:1993(E)",+ "type": "book"+ },+ {+ "URL": "https://www.iso.org/obp/ui/#iso:std:iso-iec:11172:-3:ed-1:v1:en",+ "author": [+ {+ "literal": "ISO/IEC Joint Technical Committee 1"+ }+ ],+ "id": "iso/iec11172-3",+ "issued": {+ "date-parts": [+ [+ 1993,+ 8+ ]+ ]+ },+ "language": "en",+ "number-of-pages": "150",+ "publisher": "International Organization for Standardization",+ "title": "ISO/IEC 11172-3 Information technology — Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s — Part 3: Audio",+ "title-short": "ISO/IEC 11172-3:1993(E)",+ "type": "book"+ },+ {+ "URL": "https://www.iso.org/standard/75928.html",+ "author": [+ {+ "literal": "ISO/IEC Joint Technical Committee 1"+ }+ ],+ "edition": "7",+ "id": "iso/iec13818-1",+ "issued": {+ "date-parts": [+ [+ 2019,+ 7+ ]+ ]+ },+ "language": "en",+ "number-of-pages": "288",+ "publisher": "International Organization for Standardization",+ "title": "ISO/IEC 13818-1 Information technology — Generic coding of moving pictures and associated audio information — Part 1: Systems",+ "title-short": "ISO/IEC 13818-1:2019(E)",+ "type": "book"+ },+ {+ "URL": "https://gwg.nga.mil/misb/docs/standards/ST1602.1.pdf",+ "author": [+ {+ "literal": "Motion Imagery Standards Board"+ }+ ],+ "edition": "1",+ "id": "misbst1602",+ "issued": {+ "date-parts": [+ [+ 2018,+ 11+ ]+ ]+ },+ "language": "en",+ "number-of-pages": "19",+ "publisher": "Motion Imagery Standards Board",+ "title": "MISB ST 1602 Composite Imaging Local Set",+ "title-short": "MISB ST 1602",+ "type": "book"+ },+ {+ "URL": "https://www.gwg.nga.mil/misb/docs/standards/ST0603.5.pdf",+ "author": [+ {+ "literal": "Motion Imagery Standards Board"+ }+ ],+ "edition": "5",+ "id": "msibst0603",+ "issued": {+ "date-parts": [+ [+ 2017,+ 10+ ]+ ]+ },+ "language": "en",+ "number-of-pages": "8",+ "title": "MISB ST 0603 MISP Time System and Timestamps",+ "title-short": "MISB ST 0603",+ "type": "book"+ }+]+<<===== INPUT =====<<+++>>===== CITATION-ITEMS =====>>+[[{"id":"misbst1602"}]]+<<===== CITATION-ITEMS =====<<++>>===== VERSION =====>>+1.0+<<===== VERSION =====<<+