From deb59b62354e38df9c85ce6985e5c28dd2301ee7 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 24 Aug 2013 22:27:08 -0700
Subject: 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.
---
 src/Text/Pandoc/Biblio.hs           | 216 ------------------------------------
 src/Text/Pandoc/Options.hs          |   7 --
 src/Text/Pandoc/Readers/LaTeX.hs    |   5 +-
 src/Text/Pandoc/Readers/Markdown.hs |   5 +-
 src/Text/Pandoc/Writers/LaTeX.hs    |   8 +-
 5 files changed, 4 insertions(+), 237 deletions(-)
 delete mode 100644 src/Text/Pandoc/Biblio.hs

(limited to 'src')

diff --git a/src/Text/Pandoc/Biblio.hs b/src/Text/Pandoc/Biblio.hs
deleted file mode 100644
index 1c0975f11..000000000
--- a/src/Text/Pandoc/Biblio.hs
+++ /dev/null
@@ -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
-
diff --git a/src/Text/Pandoc/Options.hs b/src/Text/Pandoc/Options.hs
index c7c37d6b8..48e418ab2 100644
--- a/src/Text/Pandoc/Options.hs
+++ b/src/Text/Pandoc/Options.hs
@@ -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
diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs
index ded57df5a..e558ed1b9 100644
--- a/src/Text/Pandoc/Readers/LaTeX.hs
+++ b/src/Text/Pandoc/Readers/LaTeX.hs
@@ -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
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 05662d9b5..658335202 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -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 =
diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs
index ab579a326..6a781ddec 100644
--- a/src/Text/Pandoc/Writers/LaTeX.hs
+++ b/src/Text/Pandoc/Writers/LaTeX.hs
@@ -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
-- 
cgit v1.2.3