@@ -30,7 +30,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30module Text.Pandoc.Biblio ( processBiblio ) where
30module Text.Pandoc.Biblio ( processBiblio ) where
32import Data.List
32import Data.List
34import Data.Char ( isDigit, isPunctuation )
33import Data.Char ( isDigit, isPunctuation )
35import qualified Data.Map as M
34import qualified Data.Map as M
36import Text.CSL hiding ( Cite(..), Citation(..) )
35import Text.CSL hiding ( Cite(..), Citation(..) )
@@ -38,30 +37,24 @@ import qualified Text.CSL as CSL ( Cite(..) )
38import Text.Pandoc.Definition
37import Text.Pandoc.Definition
39import Text.Pandoc.Generic
38import Text.Pandoc.Generic
40import Text.Pandoc.Shared (stringify)
39import Text.Pandoc.Shared (stringify)
41−import Text.Parsec
40+import Text.Parsec hiding (State)
42import Control.Monad
41import Control.Monad
42+import Control.Monad.State
44-- | Process a 'Pandoc' document by adding citations formatted
44-- | Process a 'Pandoc' document by adding citations formatted
45-- according to a CSL style, using 'citeproc' from citeproc-hs.
45-- according to a CSL style, using 'citeproc' from citeproc-hs.
46−processBiblio :: String -> Maybe FilePath -> [Reference] -> Pandoc
46+processBiblio :: Style -> [Reference] -> Pandoc -> Pandoc
48−processBiblio cslStr abrfile r p
47+processBiblio _ [] p = p
49− = if null r then return p
48+processBiblio style r p =
51− csl <- parseCSL cslStr
52− abbrevs <- case abrfile of
53− Just f -> readJsonAbbrevFile f
55− p' <- bottomUpM setHash p
49+ let p' = evalState (bottomUpM setHash p) 1
56− let grps = queryWith getCitation p'
50+ grps = queryWith getCitation p'
57− style = csl { styleAbbrevs = abbrevs }
58− result = citeproc procOpts style r (setNearNote style $
51+ result = citeproc procOpts style r (setNearNote style $
59− map (map toCslCite) grps)
52+ map (map toCslCite) grps)
60− cits_map = M.fromList $ zip grps (citations result)
53+ cits_map = M.fromList $ zip grps (citations result)
61− biblioList = map (renderPandoc' style) (bibliography result)
54+ biblioList = map (renderPandoc' style) (bibliography result)
62− Pandoc m b = bottomUp (processCite style cits_map) p'
55+ Pandoc m b = bottomUp (processCite style cits_map) p'
63− b' = bottomUp mvPunct $ deNote b
56+ b' = bottomUp mvPunct $ deNote b
64− return $ Pandoc m $ b' ++ biblioList
57+ in Pandoc m $ b' ++ biblioList
66-- | Substitute 'Cite' elements with formatted citations.
59-- | Substitute 'Cite' elements with formatted citations.
67processCite :: Style -> M.Map [Citation] [FormattedOutput] -> Inline -> Inline
60processCite :: Style -> M.Map [Citation] [FormattedOutput] -> Inline -> Inline
@@ -116,9 +109,11 @@ getCitation :: Inline -> [[Citation]]
116getCitation i | Cite t _ <- i = [t]
109getCitation i | Cite t _ <- i = [t]
117 | otherwise = []
110 | otherwise = []
119−setHash :: Citation -> IO Citation
112+setHash :: Citation -> State Int Citation
120−setHash (Citation i p s cm nn _)
113+setHash (Citation i p s cm nn _) = do
121− = hashUnique `fmap` newUnique >>= return . Citation i p s cm nn
116+ return $ Citation i p s cm nn ident
123toCslCite :: Citation -> CSL.Cite
118toCslCite :: Citation -> CSL.Cite
124toCslCite c
119toCslCite c