Removed dependency on citeproc-hs.

Going forward we'll use pandoc-citeproc, as an external filter.

The `--bibliography`, `--csl`, and `--citation-abbreviation` fields
have been removed.  Instead one must include `bibliography`, `csl`,
or `csl-abbrevs` fields in the document's YAML metadata.  The filter
can then be used as follows:

    pandoc --filter pandoc-citeproc

The `Text.Pandoc.Biblio` module has been removed.  Henceforth,
`Text.CSL.Pandoc` from pandoc-citations can be used by library users.

The Markdown and LaTeX readers now longer format bibliographies and
citations.  That must be done using `processCites` or `processCites'`
from Text.CSL.Pandoc.

All bibliography-related fields have been removed from `ReaderOptions`
and `WriterOptions`: `writerBiblioFiles`, `readerReferences`,
`readerCitationStyle`.

API change.
This commit is contained in:
John MacFarlane 2013-08-24 22:27:08 -07:00
parent 74250b6c35
commit deb59b6235
10 changed files with 49 additions and 842 deletions

103
README
View file

@ -598,54 +598,6 @@ Options affecting specific writers
Citation rendering
------------------
`--bibliography=`*FILE*
: Specify bibliography database to be used in resolving
citations. The database type will be determined from the
extension of *FILE*, which may be `.mods` (MODS format),
`.bib` (BibLaTeX format, which will normally work for BibTeX
files as well), `.bibtex` (BibTeX format),
`.ris` (RIS format), `.enl` (EndNote format),
`.xml` (EndNote XML format), `.wos` (ISI format),
`.medline` (MEDLINE format), `.copac` (Copac format),
or `.json` (citeproc JSON). If you want to use multiple
bibliographies, just use this option repeatedly.
`--csl=`*FILE*
: Specify [CSL] style to be used in formatting citations and
the bibliography. If *FILE* is not found, pandoc will look
for it in
$HOME/.csl
in unix,
C:\Documents And Settings\USERNAME\Application Data\csl
in Windows XP, and
C:\Users\USERNAME\AppData\Roaming\csl
in Windows 7. If the `--csl` option is not specified, pandoc
will use a default style: either `default.csl` in the
user data directory (see `--data-dir`), or, if that is
not present, the Chicago author-date style.
`--citation-abbreviations=`*FILE*
: Specify a file containing abbreviations for journal titles and
other bibliographic fields (indicated by setting `form="short"`
in the CSL node for the field). The format is described at
<http://citationstylist.org/2011/10/19/abbreviations-for-zotero-test-release/>.
Here is a short example:
{ "default": {
"container-title": {
"Lloyd's Law Reports": "Lloyd's Rep",
"Estates Gazette": "EG",
"Scots Law Times": "SLT"
}
}
}
`--natbib`
: Use natbib for citations in LaTeX output.
@ -2378,9 +2330,14 @@ Citations
**Extension: `citations`**
Pandoc can automatically generate citations and a bibliography in a number of
styles (using Andrea Rossato's `hs-citeproc`). In order to use this feature,
you will need a bibliographic database in one of the following formats:
Using an external filter, `pandoc-citeproc`, pandoc can automatically generate
citations and a bibliography in a number of styles. Basic usage is
pandoc --filter pandoc-citeproc myinput.txt
In order to use this feature, you will need to specify a bibliography file
using the `bibliography` metadata field in a YAML metadata section.
The bibliography may have any of these formats:
Format File extension
------------ --------------
@ -2398,18 +2355,40 @@ you will need a bibliographic database in one of the following formats:
Note that `.bib` can generally be used with both BibTeX and BibLaTeX
files, but you can use `.bibtex` to force BibTeX.
You will need to specify the bibliography file using the `--bibliography`
command-line option (which may be repeated if you have several
bibliographies).
Alternatively you can use a `references` field in the document's YAML
metadata. This should include an array of YAML-encoded references,
for example:
By default, pandoc will use a Chicago author-date format for citations
and references. To use another style, you will need to use the
`--csl` option to specify a [CSL] 1.0 style file. A primer on
creating and modifying CSL styles can be found at
<http://citationstyles.org/downloads/primer.html>.
A repository of CSL styles can be found at
<https://github.com/citation-style-language/styles>.
See also <http://zotero.org/styles> for easy browsing.
---
references:
- id: fenner2012a
title: One-click science marketing
author:
- family: Fenner
given: Martin
container-title: Nature Materials
volume: 11
URL: 'http://dx.doi.org/10.1038/nmat3283'
DOI: 10.1038/nmat3283
issue: 4
publisher: Nature Publishing Group
page: 261-263
type: article-journal
issued:
year: 2012
month: 3
...
(The program `mods2yaml`, which comes with `pandoc-citeproc`, can help produce
these from a MODS reference collection.)
By default, `pandoc-citeproc` will use a Chicago author-date format for
citations and references. To use another style, you will need to specify
a [CSL] 1.0 style file in the `csl` metadata field. A primer on creating and
modifying CSL styles can be found at
<http://citationstyles.org/downloads/primer.html>. A repository of CSL styles
can be found at <https://github.com/citation-style-language/styles>. See also
<http://zotero.org/styles> for easy browsing.
Citations go inside square brackets and are separated by semicolons.
Each citation must have a key, composed of '@' + the citation

View file

@ -1,458 +0,0 @@
<?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>Chicago Manual of Style (author-date)</title>
<id>http://www.zotero.org/styles/chicago-author-date</id>
<link href="http://www.zotero.org/styles/chicago-author-date" 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>Sebastian Karcher</name>
</contributor>
<contributor>
<name>Richard Karnesky</name>
<email>karnesky+zotero@gmail.com</email>
<uri>http://arc.nucapt.northwestern.edu/Richard_Karnesky</uri>
</contributor>
<category citation-format="author-date"/>
<category field="generic-base"/>
<summary>The author-date variant of the Chicago style</summary>
<updated>2013-03-28T05:37:10+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>
<terms>
<term name="editor" form="verb-short">ed.</term>
<term name="container-author" form="verb">by</term>
<term name="translator" form="verb-short">trans.</term>
<term name="translator" form="short">trans.</term>
</terms>
</locale>
<macro name="secondary-contributors">
<choose>
<if type="chapter paper-conference" match="none">
<group delimiter=". ">
<names variable="editor translator">
<label form="verb" text-case="capitalize-first" suffix=" " plural="never"/>
<name and="text" delimiter=", "/>
</names>
</group>
</if>
</choose>
</macro>
<macro name="container-contributors">
<choose>
<if type="chapter paper-conference" match="any">
<group prefix=", " delimiter=", ">
<names variable="container-author editor" delimiter=", ">
<label form="verb" suffix=" " plural="never"/>
<name and="text" delimiter=", "/>
</names>
</group>
</if>
</choose>
</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="short" prefix=", " plural="never"/>
</names>
</macro>
<macro name="recipient">
<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>
<names variable="recipient" delimiter=", ">
<label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
<name and="text" delimiter=", "/>
</names>
</macro>
<macro name="contributors">
<names variable="author">
<name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
<label form="short" plural="never" prefix=", "/>
<substitute>
<names variable="editor"/>
<names variable="translator"/>
<text macro="title"/>
</substitute>
</names>
<text macro="recipient"/>
</macro>
<macro name="contributors-short">
<names variable="author">
<name form="short" and="text" delimiter=", " initialize-with=". "/>
<substitute>
<names variable="editor"/>
<names variable="translator"/>
<text macro="title"/>
</substitute>
</names>
</macro>
<macro name="interviewer">
<names variable="interviewer" delimiter=", ">
<label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
<name and="text" delimiter=", "/>
</names>
</macro>
<macro name="archive">
<group delimiter=". ">
<text variable="archive_location" text-case="capitalize-first"/>
<text variable="archive"/>
<text variable="archive-place"/>
</group>
</macro>
<macro name="access">
<group delimiter=". ">
<choose>
<if type="graphic report" match="any">
<text macro="archive"/>
</if>
<else-if type="article-magazine article-newspaper bill book chapter graphic legal_case legislation motion_picture paper-conference report song thesis" match="none">
<text macro="archive"/>
</else-if>
</choose>
<text variable="DOI" prefix="doi:"/>
<choose>
<if variable="DOI issued" match="none">
<choose>
<if variable="URL accessed" match="all">
<group delimiter=" ">
<text term="accessed" text-case="capitalize-first"/>
<date variable="accessed" delimiter=" ">
<date-part name="month"/>
<date-part name="day"/>
</date>
</group>
</if>
</choose>
</if>
<else-if type="webpage">
<date variable="issued" delimiter=" ">
<date-part name="month"/>
<date-part name="day"/>
</date>
</else-if>
</choose>
<choose>
<if type="legal_case" match="none">
<text variable="URL"/>
</if>
</choose>
</group>
</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="bill book graphic legal_case legislation motion_picture song" match="any">
<text variable="title" text-case="title" font-style="italic"/>
</else-if>
<else>
<text variable="title" text-case="title" quotes="true"/>
</else>
</choose>
</macro>
<macro name="edition">
<choose>
<if type="bill book graphic legal_case legislation motion_picture report song" match="any">
<choose>
<if is-numeric="edition">
<group delimiter=" " prefix=". ">
<number variable="edition" form="ordinal"/>
<text term="edition" form="short" strip-periods="true"/>
</group>
</if>
<else>
<text variable="edition" prefix=". "/>
</else>
</choose>
</if>
<else-if type="chapter paper-conference" match="any">
<choose>
<if is-numeric="edition">
<group delimiter=" " prefix=", ">
<number variable="edition" form="ordinal"/>
<text term="edition" form="short"/>
</group>
</if>
<else>
<text variable="edition" prefix=", "/>
</else>
</choose>
</else-if>
</choose>
</macro>
<macro name="locators">
<choose>
<if type="article-journal">
<text variable="volume" prefix=" "/>
<text variable="issue" prefix=" (" suffix=")"/>
</if>
<else-if type="legal_case">
<text variable="volume" prefix=", "/>
<text variable="container-title" prefix=" "/>
<text variable="page" prefix=" "/>
</else-if>
<else-if type="bill book graphic legal_case legislation motion_picture report song" match="any">
<group prefix=". " delimiter=". ">
<group>
<text term="volume" form="short" text-case="capitalize-first" suffix=" "/>
<number variable="volume" form="numeric"/>
</group>
<group>
<number variable="number-of-volumes" form="numeric"/>
<text term="volume" form="short" prefix=" " plural="true"/>
</group>
</group>
</else-if>
<else-if type="chapter paper-conference" match="any">
<choose>
<if variable="page" match="none">
<group prefix=". ">
<text term="volume" form="short" text-case="capitalize-first" suffix=" "/>
<number variable="volume" form="numeric"/>
</group>
</if>
</choose>
</else-if>
</choose>
</macro>
<macro name="locators-chapter">
<choose>
<if type="chapter paper-conference" match="any">
<choose>
<if variable="page">
<group prefix=", ">
<text variable="volume" suffix=":"/>
<text variable="page"/>
</group>
</if>
</choose>
</if>
</choose>
</macro>
<macro name="locators-article">
<choose>
<if type="article-newspaper">
<group prefix=", " delimiter=", ">
<group>
<text variable="edition" suffix=" "/>
<text term="edition" prefix=" "/>
</group>
<group>
<text term="section" form="short" suffix=" "/>
<text variable="section"/>
</group>
</group>
</if>
<else-if type="article-journal">
<text variable="page" prefix=": "/>
</else-if>
</choose>
</macro>
<macro name="point-locators">
<choose>
<if variable="locator">
<choose>
<if locator="page" match="none">
<choose>
<if type="bill book graphic legal_case legislation motion_picture report song" match="any">
<choose>
<if variable="volume">
<group>
<text term="volume" form="short" suffix=" "/>
<number variable="volume" form="numeric"/>
<label variable="locator" form="short" prefix=", " suffix=" "/>
</group>
</if>
<else>
<label variable="locator" form="short" suffix=" "/>
</else>
</choose>
</if>
<else>
<label variable="locator" form="short" suffix=" "/>
</else>
</choose>
</if>
<else-if type="bill book graphic legal_case legislation motion_picture report song" match="any">
<number variable="volume" form="numeric" suffix=":"/>
</else-if>
</choose>
<text variable="locator"/>
</if>
</choose>
</macro>
<macro name="container-prefix">
<text term="in" text-case="capitalize-first"/>
</macro>
<macro name="container-title">
<choose>
<if type="chapter paper-conference" match="any">
<text macro="container-prefix" suffix=" "/>
</if>
</choose>
<choose>
<if type="legal_case" match="none">
<text variable="container-title" text-case="title" font-style="italic"/>
</if>
</choose>
</macro>
<macro name="publisher">
<group delimiter=": ">
<text variable="publisher-place"/>
<text variable="publisher"/>
</group>
</macro>
<macro name="date">
<choose>
<if variable="issued">
<date variable="issued">
<date-part name="year"/>
</date>
</if>
<else-if variable="accessed">
<date variable="accessed">
<date-part name="year"/>
</date>
</else-if>
</choose>
</macro>
<macro name="day-month">
<date variable="issued">
<date-part name="month"/>
<date-part name="day" prefix=" "/>
</date>
</macro>
<macro name="collection-title">
<text variable="collection-title" text-case="title"/>
<text variable="collection-number" prefix=" "/>
</macro>
<macro name="event">
<group>
<text term="presented at" suffix=" "/>
<text variable="event"/>
</group>
</macro>
<macro name="description">
<choose>
<if type="interview">
<group delimiter=". ">
<text macro="interviewer"/>
<text variable="medium" text-case="capitalize-first"/>
</group>
</if>
<else>
<text variable="medium" text-case="capitalize-first" prefix=". "/>
</else>
</choose>
<choose>
<if variable="title" match="none"/>
<else-if type="thesis"/>
<else>
<group delimiter=" " prefix=". ">
<text variable="genre" text-case="capitalize-first"/>
<choose>
<if type="report">
<text variable="number"/>
</if>
</choose>
</group>
</else>
</choose>
<!--This is for computer programs only. Localization new to 1.0.1, so may be missing in many locales-->
<group delimiter=" " prefix=" (" suffix=")">
<text term="version"/>
<text variable="version"/>
</group>
</macro>
<macro name="issue">
<choose>
<if type="article-journal">
<text macro="day-month" prefix=" (" suffix=")"/>
</if>
<else-if type="legal_case">
<text variable="authority" prefix=". "/>
</else-if>
<else-if type="speech">
<group prefix=" " delimiter=", ">
<text macro="event"/>
<text macro="day-month"/>
<text variable="event-place"/>
</group>
</else-if>
<else-if type="article-newspaper article-magazine" match="any">
<text macro="day-month" prefix=", "/>
</else-if>
<else>
<group prefix=". " delimiter=", ">
<choose>
<if type="thesis">
<text variable="genre" text-case="capitalize-first"/>
</if>
</choose>
<text macro="publisher"/>
</group>
</else>
</choose>
</macro>
<citation et-al-min="4" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" givenname-disambiguation-rule="primary-name">
<layout prefix="(" suffix=")" delimiter="; ">
<group delimiter=", ">
<group delimiter=" ">
<text macro="contributors-short"/>
<text macro="date"/>
</group>
<text macro="point-locators"/>
</group>
</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"/>
<key variable="issued"/>
</sort>
<layout suffix=".">
<group delimiter=". ">
<text macro="contributors"/>
<text macro="date"/>
<text macro="title"/>
</group>
<text macro="description"/>
<text macro="secondary-contributors" prefix=". "/>
<text macro="container-title" prefix=". "/>
<text macro="container-contributors"/>
<text macro="edition"/>
<text macro="locators-chapter"/>
<text macro="locators"/>
<text macro="collection-title" prefix=". "/>
<text macro="issue"/>
<text macro="locators-article"/>
<text macro="access" prefix=". "/>
</layout>
</bibliography>
</style>

View file

@ -99,8 +99,6 @@ Data-Files:
data/slideous/slideous.js,
-- data for dzslides writer
data/dzslides/template.html,
-- data for citeproc
data/default.csl,
-- sample lua custom writer
data/sample.lua
-- documentation
@ -250,7 +248,6 @@ Library
xml >= 1.3.12 && < 1.4,
random >= 1 && < 1.1,
extensible-exceptions >= 0.1 && < 0.2,
citeproc-hs >= 0.3.7 && < 0.4,
pandoc-types >= 1.12 && < 1.13,
aeson >= 0.6 && < 0.7,
tagsoup >= 0.12.5 && < 0.14,
@ -323,7 +320,6 @@ Library
Text.Pandoc.UTF8,
Text.Pandoc.Templates,
Text.Pandoc.XML,
Text.Pandoc.Biblio,
Text.Pandoc.SelfContained,
Text.Pandoc.Process
Other-Modules: Text.Pandoc.Readers.Haddock.Lex,
@ -353,8 +349,7 @@ Executable pandoc
extensible-exceptions >= 0.1 && < 0.2,
highlighting-kate >= 0.5.5 && < 0.6,
aeson >= 0.6 && < 0.7,
HTTP >= 4000.0.5 && < 4000.3,
citeproc-hs >= 0.3.7 && < 0.4
HTTP >= 4000.0.5 && < 4000.3
Ghc-Options: -rtsopts -with-rtsopts=-K16m -Wall -fno-warn-unused-do-bind
Ghc-Prof-Options: -auto-all -caf-all -rtsopts -with-rtsopts=-K16m
if os(windows)

View file

@ -35,7 +35,7 @@ import Text.Pandoc.PDF (makePDF)
import Text.Pandoc.Readers.LaTeX (handleIncludes)
import Text.Pandoc.Shared ( tabFilter, readDataFileUTF8, readDataFile,
safeRead, headerShift, normalize, err, warn )
import Text.Pandoc.XML ( toEntities, fromEntities )
import Text.Pandoc.XML ( toEntities )
import Text.Pandoc.SelfContained ( makeSelfContained )
import Text.Pandoc.Process (pipeProcess)
import Text.Highlighting.Kate ( languages, Style, tango, pygments,
@ -46,20 +46,18 @@ import System.FilePath
import System.Console.GetOpt
import Data.Char ( toLower )
import Data.List ( intercalate, isPrefixOf, sort )
import System.Directory ( getAppUserDataDirectory, doesFileExist, findExecutable )
import System.Directory ( getAppUserDataDirectory, findExecutable )
import System.IO ( stdout, stderr )
import System.IO.Error ( isDoesNotExistError )
import qualified Control.Exception as E
import Control.Exception.Extensible ( throwIO )
import qualified Text.Pandoc.UTF8 as UTF8
import qualified Text.CSL as CSL
import Control.Monad (when, unless, liftM)
import Data.Foldable (foldrM)
import Network.HTTP (simpleHTTP, mkRequest, getResponseBody, RequestMethod(..))
import Network.URI (parseURI, isURI, URI(..))
import qualified Data.ByteString.Lazy as B
import qualified Data.ByteString as BS
import Text.CSL.Reference (Reference(..))
import Data.Aeson (eitherDecode', encode)
copyrightMessage :: String
@ -70,7 +68,7 @@ copyrightMessage = "\nCopyright (C) 2006-2013 John MacFarlane\n" ++
compileInfo :: String
compileInfo =
"\nCompiled with citeproc-hs " ++ VERSION_citeproc_hs ++ ", texmath " ++
"\nCompiled with texmath " ++
VERSION_texmath ++ ", highlighting-kate " ++ VERSION_highlighting_kate ++
".\nSyntax highlighting is supported for the following languages:\n " ++
wrapWords 4 78
@ -146,9 +144,6 @@ data Opt = Opt
, optIndentedCodeClasses :: [String] -- ^ Default classes for indented code blocks
, optDataDir :: Maybe FilePath
, optCiteMethod :: CiteMethod -- ^ Method to output cites
, optBibliography :: [String]
, optCslFile :: Maybe FilePath
, optAbbrevsFile :: Maybe FilePath
, optListings :: Bool -- ^ Use listings package for code blocks
, optLaTeXEngine :: String -- ^ Program to use for latex -> pdf
, optSlideLevel :: Maybe Int -- ^ Header level that creates slides
@ -203,9 +198,6 @@ defaultOpts = Opt
, optIndentedCodeClasses = []
, optDataDir = Nothing
, optCiteMethod = Citeproc
, optBibliography = []
, optCslFile = Nothing
, optAbbrevsFile = Nothing
, optListings = False
, optLaTeXEngine = "pdflatex"
, optSlideLevel = Nothing
@ -650,24 +642,6 @@ options =
"PROGRAM")
"" -- "Name of latex program to use in generating PDF"
, Option "" ["bibliography"]
(ReqArg
(\arg opt -> return opt { optBibliography = (optBibliography opt) ++ [arg] })
"FILENAME")
""
, Option "" ["csl"]
(ReqArg
(\arg opt -> return opt { optCslFile = Just arg })
"FILENAME")
""
, Option "" ["citation-abbreviations"]
(ReqArg
(\arg opt -> return opt { optAbbrevsFile = Just arg })
"FILENAME")
""
, Option "" ["natbib"]
(NoArg
(\opt -> return opt { optCiteMethod = Natbib }))
@ -904,9 +878,6 @@ main = do
, optIdentifierPrefix = idPrefix
, optIndentedCodeClasses = codeBlockClasses
, optDataDir = mbDataDir
, optBibliography = reffiles
, optCslFile = mbCsl
, optAbbrevsFile = cslabbrevs
, optCiteMethod = citeMethod
, optListings = listings
, optLaTeXEngine = latexEngine
@ -1007,36 +978,6 @@ main = do
$ lines dztempl
return $ ("dzslides-core", dzcore) : variables'
else return variables'
-- unescape reference ids, which may contain XML entities, so
-- that we can do lookups with regular string equality
let unescapeRefId ref = ref{ refId = fromEntities (refId ref) }
refs <- mapM (\f -> E.catch (CSL.readBiblioFile f)
(\e -> let _ = (e :: E.SomeException)
in err 23 $ "Error reading bibliography `" ++ f ++
"'" ++ "\n" ++ show e))
reffiles >>=
return . map unescapeRefId . concat
mbsty <- if citeMethod == Citeproc && not (null refs)
then do
csl <- CSL.parseCSL =<<
case mbCsl of
Nothing -> readDataFileUTF8 datadir
"default.csl"
Just cslfile -> do
exists <- doesFileExist cslfile
if exists
then UTF8.readFile cslfile
else do
csldir <- getAppUserDataDirectory "csl"
readDataFileUTF8 (Just csldir)
(replaceExtension cslfile "csl")
abbrevs <- maybe (return []) CSL.readJsonAbbrevFile cslabbrevs
return $ Just csl { CSL.styleAbbrevs = abbrevs }
else return Nothing
let sourceURL = case sources of
[] -> Nothing
(x:_) -> case parseURI x of
@ -1054,8 +995,6 @@ main = do
, readerColumns = columns
, readerTabStop = tabStop
, readerOldDashes = oldDashes
, readerReferences = refs
, readerCitationStyle = mbsty
, readerIndentedCodeClasses = codeBlockClasses
, readerApplyMacros = not laTeXOutput
, readerDefaultImageExtension = defaultImageExtension
@ -1069,7 +1008,6 @@ main = do
writerHTMLMathMethod = mathMethod,
writerIncremental = incremental,
writerCiteMethod = citeMethod,
writerBiblioFiles = reffiles,
writerIgnoreNotes = False,
writerNumberSections = numberSections,
writerNumberOffset = numberFrom,

View file

@ -1,216 +0,0 @@
{-# LANGUAGE PatternGuards #-}
{-
Copyright (C) 2008 Andrea Rossato <andrea.rossato@ing.unitn.it>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-}
{- |
Module : Text.Pandoc.Biblio
Copyright : Copyright (C) 2008-2010 Andrea Rossato
License : GNU GPL, version 2 or above
Maintainer : Andrea Rossato <andrea.rossato@unitn.it>
Stability : alpha
Portability : portable
-}
module Text.Pandoc.Biblio ( processBiblio ) where
import Data.List
import Data.Char ( isDigit, isPunctuation )
import qualified Data.Map as M
import Text.CSL hiding ( Cite(..), Citation(..), endWithPunct )
import qualified Text.CSL as CSL ( Cite(..) )
import Text.Pandoc.Definition
import Text.Pandoc.Generic
import Text.Pandoc.Walk
import Text.Pandoc.Shared (stringify)
import Text.Parsec hiding (State)
import Control.Monad
import Control.Monad.State
-- | Process a 'Pandoc' document by adding citations formatted
-- according to a CSL style, using 'citeproc' from citeproc-hs.
processBiblio :: Maybe Style -> [Reference] -> Pandoc -> Pandoc
processBiblio Nothing _ p = p
processBiblio _ [] p = p
processBiblio (Just style) r p =
let p' = evalState (bottomUpM setHash p) 1
grps = query getCitation p'
result = citeproc procOpts style r (setNearNote style $
map (map toCslCite) grps)
cits_map = M.fromList $ zip grps (citations result)
biblioList = map (renderPandoc' style) (bibliography result)
Pandoc m b = bottomUp mvPunct . deNote . topDown (processCite style cits_map) $ p'
(bs, lastb) = case reverse b of
x@(Header _ _ _) : xs -> (reverse xs, [x])
_ -> (b, [])
in Pandoc m $ bs ++ [Div ("",["references"],[]) (lastb ++ biblioList)]
-- | Substitute 'Cite' elements with formatted citations.
processCite :: Style -> M.Map [Citation] [FormattedOutput] -> Inline -> Inline
processCite s cs (Cite t _) =
case M.lookup t cs of
Just (x:xs)
| isTextualCitation t && not (null xs) ->
let xs' = renderPandoc s xs
in if styleClass s == "note"
then Cite t (renderPandoc s [x] ++ [Note [Para xs']])
else Cite t (renderPandoc s [x] ++ [Space | not (startWithPunct xs')] ++ xs')
| otherwise -> if styleClass s == "note"
then Cite t [Note [Para $ renderPandoc s (x:xs)]]
else Cite t (renderPandoc s (x:xs))
_ -> Strong [Str "???"] -- TODO raise error instead?
processCite _ _ x = x
isNote :: Inline -> Bool
isNote (Note _) = True
isNote (Cite _ [Note _]) = True
isNote _ = False
mvPunct :: [Inline] -> [Inline]
mvPunct (Space : Space : xs) = Space : xs
mvPunct (Space : x : ys) | isNote x, startWithPunct ys =
Str (headInline ys) : x : tailFirstInlineStr ys
mvPunct (Space : x : ys) | isNote x = x : ys
mvPunct xs = xs
-- A replacement for citeproc-hs's endWithPunct, which wrongly treats
-- a sentence ending in '.)' as not ending with punctuation, leading
-- to an extra period.
endWithPunct :: [Inline] -> Bool
endWithPunct [] = True
endWithPunct xs@(_:_) = case reverse (stringify [last xs]) of
[] -> True
(')':c:_) | isEndPunct c -> True
(c:_) | isEndPunct c -> True
| otherwise -> False
where isEndPunct c = c `elem` ".,;:!?"
deNote :: Pandoc -> Pandoc
deNote = topDown go
where go (Cite (c:cs) [Note xs]) =
Cite (c:cs) [Note $ bottomUp go' $ sanitize c xs]
go (Note xs) = Note $ bottomUp go' xs
go x = x
go' (Note [Para xs]:ys) =
if startWithPunct ys && endWithPunct xs
then initInline xs ++ ys
else xs ++ ys
go' xs = xs
sanitize :: Citation -> [Block] -> [Block]
sanitize Citation{citationPrefix = pref} [Para xs] =
case (null pref, endWithPunct xs) of
(True, False) -> [Para $ xs ++ [Str "."]]
(True, True) -> [Para xs]
(False, False) -> [Para $ toCapital $ xs ++ [Str "."]]
(False, True) -> [Para $ toCapital xs]
sanitize _ bs = bs
isTextualCitation :: [Citation] -> Bool
isTextualCitation (c:_) = citationMode c == AuthorInText
isTextualCitation _ = False
-- | Retrieve all citations from a 'Pandoc' docuument. To be used with
-- 'query'.
getCitation :: Inline -> [[Citation]]
getCitation i | Cite t _ <- i = [t]
| otherwise = []
setHash :: Citation -> State Int Citation
setHash c = do
ident <- get
put $ ident + 1
return c{ citationHash = ident }
toCslCite :: Citation -> CSL.Cite
toCslCite c
= let (l, s) = locatorWords $ citationSuffix c
(la,lo) = parseLocator l
s' = case (l,s) of
-- treat a bare locator as if it begins with space
-- so @item1 [blah] is like [@item1, blah]
("",(x:_))
| not (isPunct x) -> [Space] ++ s
_ -> s
isPunct (Str (x:_)) = isPunctuation x
isPunct _ = False
citMode = case citationMode c of
AuthorInText -> (True, False)
SuppressAuthor -> (False,True )
NormalCitation -> (False,False)
in emptyCite { CSL.citeId = citationId c
, CSL.citePrefix = PandocText $ citationPrefix c
, CSL.citeSuffix = PandocText s'
, CSL.citeLabel = la
, CSL.citeLocator = lo
, CSL.citeNoteNumber = show $ citationNoteNum c
, CSL.authorInText = fst citMode
, CSL.suppressAuthor = snd citMode
, CSL.citeHash = citationHash c
}
locatorWords :: [Inline] -> (String, [Inline])
locatorWords inp =
case parse pLocatorWords "suffix" $ breakup inp of
Right r -> r
Left _ -> ("",inp)
where breakup [] = []
breakup (Str x : xs) = map Str (splitup x) ++ breakup xs
breakup (x : xs) = x : breakup xs
splitup = groupBy (\x y -> x /= '\160' && y /= '\160')
pLocatorWords :: Parsec [Inline] st (String, [Inline])
pLocatorWords = do
l <- pLocator
s <- getInput -- rest is suffix
if length l > 0 && last l == ','
then return (init l, Str "," : s)
else return (l, s)
pMatch :: (Inline -> Bool) -> Parsec [Inline] st Inline
pMatch condition = try $ do
t <- anyToken
guard $ condition t
return t
pSpace :: Parsec [Inline] st Inline
pSpace = pMatch (\t -> t == Space || t == Str "\160")
pLocator :: Parsec [Inline] st String
pLocator = try $ do
optional $ pMatch (== Str ",")
optional pSpace
f <- (guardFollowingDigit >> return [Str "p"]) -- "page" the default
<|> many1 (notFollowedBy pSpace >> anyToken)
gs <- many1 pWordWithDigits
return $ stringify f ++ (' ' : unwords gs)
guardFollowingDigit :: Parsec [Inline] st ()
guardFollowingDigit = do
t <- lookAhead anyToken
case t of
Str (d:_) | isDigit d -> return ()
_ -> mzero
pWordWithDigits :: Parsec [Inline] st String
pWordWithDigits = try $ do
optional pSpace
r <- many1 (notFollowedBy pSpace >> anyToken)
let s = stringify r
guard $ any isDigit s
return s

View file

@ -48,7 +48,6 @@ import Data.Set (Set)
import qualified Data.Set as Set
import Data.Default
import Text.Pandoc.Highlighting (Style, pygments)
import qualified Text.CSL as CSL
-- | Individually selectable syntax extensions.
data Extension =
@ -205,8 +204,6 @@ data ReaderOptions = ReaderOptions{
, readerOldDashes :: Bool -- ^ Use pandoc <= 1.8.2.1 behavior
-- in parsing dashes; -- is em-dash;
-- - before numerial is en-dash
, readerReferences :: [CSL.Reference] -- ^ Bibliographic references
, readerCitationStyle :: Maybe CSL.Style -- ^ Citation style
, readerApplyMacros :: Bool -- ^ Apply macros to TeX math
, readerIndentedCodeClasses :: [String] -- ^ Default classes for
-- indented code blocks
@ -223,8 +220,6 @@ instance Default ReaderOptions
, readerColumns = 80
, readerTabStop = 4
, readerOldDashes = False
, readerReferences = []
, readerCitationStyle = Nothing
, readerApplyMacros = True
, readerIndentedCodeClasses = []
, readerDefaultImageExtension = ""
@ -289,7 +284,6 @@ data WriterOptions = WriterOptions
, writerSourceURL :: Maybe String -- ^ Absolute URL + directory of 1st source file
, writerUserDataDir :: Maybe FilePath -- ^ Path of user data directory
, writerCiteMethod :: CiteMethod -- ^ How to print cites
, writerBiblioFiles :: [FilePath] -- ^ Biblio files to use for citations
, writerHtml5 :: Bool -- ^ Produce HTML5
, writerHtmlQTags :: Bool -- ^ Use @<q>@ tags for quotes in HTML
, writerBeamer :: Bool -- ^ Produce beamer LaTeX slide show
@ -332,7 +326,6 @@ instance Default WriterOptions where
, writerSourceURL = Nothing
, writerUserDataDir = Nothing
, writerCiteMethod = Citeproc
, writerBiblioFiles = []
, writerHtml5 = False
, writerHtmlQTags = False
, writerBeamer = False

View file

@ -38,7 +38,6 @@ import Text.Pandoc.Definition
import Text.Pandoc.Walk
import Text.Pandoc.Shared
import Text.Pandoc.Options
import Text.Pandoc.Biblio (processBiblio)
import Text.Pandoc.Parsing hiding ((<|>), many, optional, space)
import qualified Text.Pandoc.UTF8 as UTF8
import Data.Char ( chr, ord )
@ -67,9 +66,7 @@ parseLaTeX = do
eof
st <- getState
let meta = stateMeta st
refs <- getOption readerReferences
mbsty <- getOption readerCitationStyle
let (Pandoc _ bs') = processBiblio mbsty refs $ doc bs
let (Pandoc _ bs') = doc bs
return $ Pandoc meta bs'
type LP = Parser [Char] ParserState

View file

@ -54,7 +54,6 @@ import Text.Pandoc.Parsing hiding (tableWith)
import Text.Pandoc.Readers.LaTeX ( rawLaTeXInline, rawLaTeXBlock )
import Text.Pandoc.Readers.HTML ( htmlTag, htmlInBalanced, isInlineTag, isBlockTag,
isTextTag, isCommentTag )
import Text.Pandoc.Biblio (processBiblio)
import Data.Monoid (mconcat, mempty)
import Control.Applicative ((<$>), (<*), (*>), (<$))
import Control.Monad
@ -327,9 +326,7 @@ parseMarkdown = do
st <- getState
let meta = runF (stateMeta' st) st
let Pandoc _ bs = B.doc $ runF blocks st
mbsty <- getOption readerCitationStyle
refs <- getOption readerReferences
return $ processBiblio mbsty refs $ Pandoc meta bs
return $ Pandoc meta bs
addWarning :: Maybe SourcePos -> String -> MarkdownParser ()
addWarning mbpos msg =

View file

@ -43,7 +43,6 @@ import Data.Char ( toLower, isPunctuation )
import Control.Applicative ((<|>))
import Control.Monad.State
import Text.Pandoc.Pretty
import System.FilePath (dropExtension)
import Text.Pandoc.Slides
import Text.Pandoc.Highlighting (highlight, styleToLaTeX,
formatLaTeXInline, formatLaTeXBlock,
@ -120,7 +119,6 @@ pandocToLaTeX options (Pandoc meta blocks) = do
(biblioTitle :: String) <- liftM (render colwidth) $ inlineListToLaTeX lastHeader
let main = render colwidth $ vsep body
st <- get
let biblioFiles = intercalate "," $ map dropExtension $ writerBiblioFiles options
let context = defField "toc" (writerTableOfContents options) $
defField "toc-depth" (show (writerTOCDepth options -
if writerChapters options
@ -152,11 +150,9 @@ pandocToLaTeX options (Pandoc meta blocks) = do
$ writerHighlightStyle options )
else id) $
(case writerCiteMethod options of
Natbib -> defField "biblio-files" biblioFiles .
defField "biblio-title" biblioTitle .
Natbib -> defField "biblio-title" biblioTitle .
defField "natbib" True
Biblatex -> defField "biblio-files" biblioFiles .
defField "biblio-title" biblioTitle .
Biblatex -> defField "biblio-title" biblioTitle .
defField "biblatex" True
_ -> id) $
metadata

View file

@ -63,7 +63,6 @@ tests = [ testGroup "markdown"
"markdown-reader-more.txt" "markdown-reader-more.native"
, lhsReaderTest "markdown+lhs"
]
, testGroup "citations" markdownCitationTests
]
, testGroup "rst"
[ testGroup "writer" (writerTests "rst" ++ lhsWriterTests "rst")
@ -190,19 +189,6 @@ fb2WriterTest title opts inputfile normfile =
ignoreBinary = unlines . filter (not . startsWith "<binary ") . lines
startsWith tag str = all (uncurry (==)) $ zip tag str
markdownCitationTests :: [Test]
markdownCitationTests
= map styleToTest ["chicago-author-date","ieee","mhra"]
++ [test "natbib" wopts "markdown-citations.txt"
"markdown-citations.txt"]
where
ropts = ["-r", "markdown", "-w", "markdown-citations", "--bibliography",
"biblio.bib", "--no-wrap"]
wopts = ["-r", "markdown", "-w", "markdown", "--no-wrap", "--natbib"]
styleToTest style = test style (ropts ++ ["--csl", style ++ ".csl"])
"markdown-citations.txt"
("markdown-citations." ++ style ++ ".txt")
-- | Run a test without normalize function, return True if test passed.
test :: String -- ^ Title of test
-> [String] -- ^ Options to pass to pandoc