git.iko.soy/typeable/pandoc
on master help sign in
Moved bibliography processing into readers.

Previously this was done in src/pandoc.hs, which made it difficult for library users. * Removed readerCitations in ReaderOptions. * Added readerReferences and readerCitationStyle to ReaderOptions. * Moved use of processBiblio from main program to the markdown and LaTeX readers.

commitb5dd06d30374edb7a2756ba58019d7f21f3bbfe5 authorJohn MacFarlane <fiddlosopher@gmail.com> dateSat 13 Oct 2012, 11:33 (14 years ago) parent9a77a3f
4 files changed+43−33
src/Text/Pandoc/Options.hs+6−3 src/Text/Pandoc/Readers/LaTeX.hs+5−1 src/Text/Pandoc/Readers/Markdown.hs+8−3 src/pandoc.hs+24−26
src/Text/Pandoc/Options.hs+6−3
@@ -44,6 +44,7 @@ import Data.Set (Set)
4444import qualified Data.Set as Set
4545import Data.Default
4646import Text.Pandoc.Highlighting (Style, pygments)
47+import qualified Text.CSL as CSL
4748
4849-- | Individually selectable syntax extensions.
4950data Extension =
@@ -141,11 +142,12 @@ data ReaderOptions = ReaderOptions{
141142 , readerOldDashes :: Bool -- ^ Use pandoc <= 1.8.2.1 behavior
142143 -- in parsing dashes; -- is em-dash;
143144 -- - before numerial is en-dash
144− , readerCitations :: [String] -- ^ List of available citations
145+ , readerReferences :: [CSL.Reference] -- ^ Bibliographic references
146+ , readerCitationStyle :: Maybe CSL.Style -- ^ Citation style
145147 , readerApplyMacros :: Bool -- ^ Apply macros to TeX math
146148 , readerIndentedCodeClasses :: [String] -- ^ Default classes for
147149 -- indented code blocks
148−} deriving (Show, Read)
150+} deriving (Show {- TODO need update in citeproc-hs , Read -})
149151
150152instance Default ReaderOptions
151153 where def = ReaderOptions{
@@ -157,7 +159,8 @@ instance Default ReaderOptions
157159 , readerColumns = 80
158160 , readerTabStop = 4
159161 , readerOldDashes = False
160− , readerCitations = []
162+ , readerReferences = []
163+ , readerCitationStyle = Nothing
161164 , readerApplyMacros = True
162165 , readerIndentedCodeClasses = []
163166 }
src/Text/Pandoc/Readers/LaTeX.hs+5−1
@@ -36,6 +36,7 @@ module Text.Pandoc.Readers.LaTeX ( readLaTeX,
3636import Text.Pandoc.Definition
3737import Text.Pandoc.Shared
3838import Text.Pandoc.Options
39+import Text.Pandoc.Biblio (processBiblio)
3940import Text.Pandoc.Parsing hiding ((<|>), many, optional, space)
4041import qualified Text.Pandoc.UTF8 as UTF8
4142import Data.Char ( chr, ord )
@@ -63,7 +64,10 @@ parseLaTeX = do
6364 let title' = stateTitle st
6465 let authors' = stateAuthors st
6566 let date' = stateDate st
66− return $ Pandoc (Meta title' authors' date') $ toList bs
67+ refs <- getOption readerReferences
68+ mbsty <- getOption readerCitationStyle
69+ return $ processBiblio mbsty refs
70+ $ Pandoc (Meta title' authors' date') $ toList bs
6771
6872type LP = Parser [Char] ParserState
6973
src/Text/Pandoc/Readers/Markdown.hs+8−3
@@ -45,6 +45,8 @@ import Text.Pandoc.Readers.LaTeX ( rawLaTeXInline, rawLaTeXBlock )
4545import Text.Pandoc.Readers.HTML ( htmlTag, htmlInBalanced, isInlineTag, isBlockTag,
4646 isTextTag, isCommentTag )
4747import Text.Pandoc.XML ( fromEntities )
48+import Text.Pandoc.Biblio (processBiblio)
49+import qualified Text.CSL as CSL
4850import Data.Monoid (mconcat, mempty)
4951import Control.Applicative ((<$>), (<*), (*>), (<$))
5052import Control.Monad
@@ -216,7 +218,10 @@ parseMarkdown = do
216218 (title, authors, date) <- option (mempty,return [],mempty) titleBlock
217219 blocks <- parseBlocks
218220 st <- getState
219− return $ B.setTitle (runF title st)
221+ mbsty <- getOption readerCitationStyle
222+ refs <- getOption readerReferences
223+ return $ processBiblio mbsty refs
224+ $ B.setTitle (runF title st)
220225 $ B.setAuthors (runF authors st)
221226 $ B.setDate (runF date st)
222227 $ B.doc $ runF blocks st
@@ -1542,7 +1547,7 @@ rawHtmlInline = do
15421547cite :: Parser [Char] ParserState (F Inlines)
15431548cite = do
15441549 guardEnabled Ext_citations
1545− getOption readerCitations >>= guard . not . null
1550+ getOption readerReferences >>= guard . not . null
15461551 citations <- textualCite <|> normalCite
15471552 return $ flip B.cite mempty <$> citations
15481553
@@ -1591,7 +1596,7 @@ citeKey = try $ do
15911596 let internal p = try $ p >>~ lookAhead (letter <|> digit)
15921597 rest <- many $ letter <|> digit <|> internal (oneOf ":.#$%&-_?<>~")
15931598 let key = first:rest
1594− citations' <- getOption readerCitations
1599+ citations' <- map CSL.refId <$> getOption readerReferences
15951600 guard $ key `elem` citations'
15961601 return (suppress_author, key)
15971602
src/pandoc.hs+24−26
@@ -52,7 +52,6 @@ import qualified Control.Exception as E
5252import Control.Exception.Extensible ( throwIO )
5353import qualified Text.Pandoc.UTF8 as UTF8
5454import qualified Text.CSL as CSL
55−import Text.Pandoc.Biblio
5655import Control.Monad (when, unless, liftM)
5756import Network.HTTP (simpleHTTP, mkRequest, getResponseBody, RequestMethod(..))
5857import Network.URI (parseURI, isURI, URI(..))
@@ -924,6 +923,24 @@ main = do
924923 reffiles >>=
925924 return . map unescapeRefId . concat
926925
926+ mbsty <- if citeMethod == Citeproc && not (null refs)
927+ then do
928+ csl <- CSL.parseCSL =<<
929+ case mbCsl of
930+ Nothing -> readDataFile datadir "default.csl"
931+ Just cslfile -> do
932+ exists <- doesFileExist cslfile
933+ if exists
934+ then UTF8.readFile cslfile
935+ else do
936+ csldir <- getAppUserDataDirectory "csl"
937+ print csldir
938+ readDataFile datadir (replaceDirectory
939+ (replaceExtension cslfile "csl") csldir)
940+ abbrevs <- maybe (return []) CSL.readJsonAbbrevFile cslabbrevs
941+ return $ Just csl { CSL.styleAbbrevs = abbrevs }
942+ else return Nothing
943+
927944 let sourceDir = if null sources
928945 then "."
929946 else takeDirectory (head sources)
@@ -935,7 +952,8 @@ main = do
935952 , readerColumns = columns
936953 , readerTabStop = tabStop
937954 , readerOldDashes = oldDashes
938− , readerCitations = map CSL.refId refs
955+ , readerReferences = refs
956+ , readerCitationStyle = mbsty
939957 , readerIndentedCodeClasses = codeBlockClasses
940958 , readerApplyMacros = not laTeXOutput
941959 }
@@ -1004,26 +1022,6 @@ main = do
10041022 then bottomUpM rtfEmbedImage doc0
10051023 else return doc0
10061024
1007− doc2 <- do
1008− if citeMethod == Citeproc && not (null refs)
1009− then do
1010− csl <- CSL.parseCSL =<<
1011− case mbCsl of
1012− Nothing -> readDataFile datadir "default.csl"
1013− Just cslfile -> do
1014− exists <- doesFileExist cslfile
1015− if exists
1016− then UTF8.readFile cslfile
1017− else do
1018− csldir <- getAppUserDataDirectory "csl"
1019− print csldir
1020− readDataFile datadir (replaceDirectory
1021− (replaceExtension cslfile "csl") csldir)
1022− abbrevs <- maybe (return []) CSL.readJsonAbbrevFile cslabbrevs
1023− let csl' = csl { CSL.styleAbbrevs = abbrevs }
1024− return $ processBiblio csl' refs doc1
1025− else return doc1
1026−
10271025 let writeBinary :: B.ByteString -> IO ()
10281026 writeBinary = B.writeFile (UTF8.encodePath outputFile)
10291027
@@ -1033,15 +1031,15 @@ main = do
10331031
10341032 case getWriter writerName' of
10351033 Left e -> err 9 e
1036− Right (IOStringWriter f) -> f writerOptions doc2 >>= writerFn outputFile
1037− Right (IOByteStringWriter f) -> f writerOptions doc2 >>= writeBinary
1034+ Right (IOStringWriter f) -> f writerOptions doc1 >>= writerFn outputFile
1035+ Right (IOByteStringWriter f) -> f writerOptions doc1 >>= writeBinary
10381036 Right (PureStringWriter f)
10391037 | pdfOutput -> do
1040− res <- tex2pdf latexEngine $ f writerOptions doc2
1038+ res <- tex2pdf latexEngine $ f writerOptions doc1
10411039 case res of
10421040 Right pdf -> writeBinary pdf
10431041 Left err' -> err 43 $ UTF8.toStringLazy err'
1044− | otherwise -> selfcontain (f writerOptions doc2 ++
1042+ | otherwise -> selfcontain (f writerOptions doc1 ++
10451043 ['\n' | not standalone'])
10461044 >>= writerFn outputFile . handleEntities
10471045 where htmlFormat = writerName' `elem`