git.iko.soy/typeable/pandoc
on master help sign in
Moved bibliography processing into readers.
b5dd06dJohn MacFarlane
src/Text/Pandoc/Options.hs+6−3
@@ -44,6 +44,7 @@ import Data.Set (Set)
44import qualified Data.Set as Set
44import qualified Data.Set as Set
45import Data.Default
45import Data.Default
46import Text.Pandoc.Highlighting (Style, pygments)
46import Text.Pandoc.Highlighting (Style, pygments)
47+import qualified Text.CSL as CSL
47
48
48-- | Individually selectable syntax extensions.
49-- | Individually selectable syntax extensions.
49data Extension =
50data Extension =
@@ -141,11 +142,12 @@ data ReaderOptions = ReaderOptions{
141 , readerOldDashes :: Bool -- ^ Use pandoc <= 1.8.2.1 behavior
142 , readerOldDashes :: Bool -- ^ Use pandoc <= 1.8.2.1 behavior
142 -- in parsing dashes; -- is em-dash;
143 -- in parsing dashes; -- is em-dash;
143 -- - before numerial is en-dash
144 -- - 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
145 , readerApplyMacros :: Bool -- ^ Apply macros to TeX math
147 , readerApplyMacros :: Bool -- ^ Apply macros to TeX math
146 , readerIndentedCodeClasses :: [String] -- ^ Default classes for
148 , readerIndentedCodeClasses :: [String] -- ^ Default classes for
147 -- indented code blocks
149 -- indented code blocks
148−} deriving (Show, Read)
150+} deriving (Show {- TODO need update in citeproc-hs , Read -})
149
151
150instance Default ReaderOptions
152instance Default ReaderOptions
151 where def = ReaderOptions{
153 where def = ReaderOptions{
@@ -157,7 +159,8 @@ instance Default ReaderOptions
157 , readerColumns = 80
159 , readerColumns = 80
158 , readerTabStop = 4
160 , readerTabStop = 4
159 , readerOldDashes = False
161 , readerOldDashes = False
160− , readerCitations = []
162+ , readerReferences = []
163+ , readerCitationStyle = Nothing
161 , readerApplyMacros = True
164 , readerApplyMacros = True
162 , readerIndentedCodeClasses = []
165 , readerIndentedCodeClasses = []
163 }
166 }
src/Text/Pandoc/Readers/LaTeX.hs+5−1
@@ -36,6 +36,7 @@ module Text.Pandoc.Readers.LaTeX ( readLaTeX,
36import Text.Pandoc.Definition
36import Text.Pandoc.Definition
37import Text.Pandoc.Shared
37import Text.Pandoc.Shared
38import Text.Pandoc.Options
38import Text.Pandoc.Options
39+import Text.Pandoc.Biblio (processBiblio)
39import Text.Pandoc.Parsing hiding ((<|>), many, optional, space)
40import Text.Pandoc.Parsing hiding ((<|>), many, optional, space)
40import qualified Text.Pandoc.UTF8 as UTF8
41import qualified Text.Pandoc.UTF8 as UTF8
41import Data.Char ( chr, ord )
42import Data.Char ( chr, ord )
@@ -63,7 +64,10 @@ parseLaTeX = do
63 let title' = stateTitle st
64 let title' = stateTitle st
64 let authors' = stateAuthors st
65 let authors' = stateAuthors st
65 let date' = stateDate st
66 let date' = stateDate st
67+ refs <- getOption readerReferences
68+ mbsty <- getOption readerCitationStyle
69+ return $ processBiblio mbsty refs
66− return $ Pandoc (Meta title' authors' date') $ toList bs
70+ $ Pandoc (Meta title' authors' date') $ toList bs
67
71
68type LP = Parser [Char] ParserState
72type LP = Parser [Char] ParserState
69
73
src/Text/Pandoc/Readers/Markdown.hs+8−3
@@ -45,6 +45,8 @@ import Text.Pandoc.Readers.LaTeX ( rawLaTeXInline, rawLaTeXBlock )
45import Text.Pandoc.Readers.HTML ( htmlTag, htmlInBalanced, isInlineTag, isBlockTag,
45import Text.Pandoc.Readers.HTML ( htmlTag, htmlInBalanced, isInlineTag, isBlockTag,
46 isTextTag, isCommentTag )
46 isTextTag, isCommentTag )
47import Text.Pandoc.XML ( fromEntities )
47import Text.Pandoc.XML ( fromEntities )
48+import Text.Pandoc.Biblio (processBiblio)
49+import qualified Text.CSL as CSL
48import Data.Monoid (mconcat, mempty)
50import Data.Monoid (mconcat, mempty)
49import Control.Applicative ((<$>), (<*), (*>), (<$))
51import Control.Applicative ((<$>), (<*), (*>), (<$))
50import Control.Monad
52import Control.Monad
@@ -216,7 +218,10 @@ parseMarkdown = do
216 (title, authors, date) <- option (mempty,return [],mempty) titleBlock
218 (title, authors, date) <- option (mempty,return [],mempty) titleBlock
217 blocks <- parseBlocks
219 blocks <- parseBlocks
218 st <- getState
220 st <- getState
221+ mbsty <- getOption readerCitationStyle
222+ refs <- getOption readerReferences
223+ return $ processBiblio mbsty refs
219− return $ B.setTitle (runF title st)
224+ $ B.setTitle (runF title st)
220 $ B.setAuthors (runF authors st)
225 $ B.setAuthors (runF authors st)
221 $ B.setDate (runF date st)
226 $ B.setDate (runF date st)
222 $ B.doc $ runF blocks st
227 $ B.doc $ runF blocks st
@@ -1542,7 +1547,7 @@ rawHtmlInline = do
1542cite :: Parser [Char] ParserState (F Inlines)
1547cite :: Parser [Char] ParserState (F Inlines)
1543cite = do
1548cite = do
1544 guardEnabled Ext_citations
1549 guardEnabled Ext_citations
1545− getOption readerCitations >>= guard . not . null
1550+ getOption readerReferences >>= guard . not . null
1546 citations <- textualCite <|> normalCite
1551 citations <- textualCite <|> normalCite
1547 return $ flip B.cite mempty <$> citations
1552 return $ flip B.cite mempty <$> citations
1548
1553
@@ -1591,7 +1596,7 @@ citeKey = try $ do
1591 let internal p = try $ p >>~ lookAhead (letter <|> digit)
1596 let internal p = try $ p >>~ lookAhead (letter <|> digit)
1592 rest <- many $ letter <|> digit <|> internal (oneOf ":.#$%&-_?<>~")
1597 rest <- many $ letter <|> digit <|> internal (oneOf ":.#$%&-_?<>~")
1593 let key = first:rest
1598 let key = first:rest
1594− citations' <- getOption readerCitations
1599+ citations' <- map CSL.refId <$> getOption readerReferences
1595 guard $ key `elem` citations'
1600 guard $ key `elem` citations'
1596 return (suppress_author, key)
1601 return (suppress_author, key)
1597
1602
src/pandoc.hs+24−26
@@ -52,7 +52,6 @@ import qualified Control.Exception as E
52import Control.Exception.Extensible ( throwIO )
52import Control.Exception.Extensible ( throwIO )
53import qualified Text.Pandoc.UTF8 as UTF8
53import qualified Text.Pandoc.UTF8 as UTF8
54import qualified Text.CSL as CSL
54import qualified Text.CSL as CSL
55−import Text.Pandoc.Biblio
56import Control.Monad (when, unless, liftM)
55import Control.Monad (when, unless, liftM)
57import Network.HTTP (simpleHTTP, mkRequest, getResponseBody, RequestMethod(..))
56import Network.HTTP (simpleHTTP, mkRequest, getResponseBody, RequestMethod(..))
58import Network.URI (parseURI, isURI, URI(..))
57import Network.URI (parseURI, isURI, URI(..))
@@ -924,6 +923,24 @@ main = do
924 reffiles >>=
923 reffiles >>=
925 return . map unescapeRefId . concat
924 return . map unescapeRefId . concat
926
925
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+
927 let sourceDir = if null sources
944 let sourceDir = if null sources
928 then "."
945 then "."
929 else takeDirectory (head sources)
946 else takeDirectory (head sources)
@@ -935,7 +952,8 @@ main = do
935 , readerColumns = columns
952 , readerColumns = columns
936 , readerTabStop = tabStop
953 , readerTabStop = tabStop
937 , readerOldDashes = oldDashes
954 , readerOldDashes = oldDashes
938− , readerCitations = map CSL.refId refs
955+ , readerReferences = refs
956+ , readerCitationStyle = mbsty
939 , readerIndentedCodeClasses = codeBlockClasses
957 , readerIndentedCodeClasses = codeBlockClasses
940 , readerApplyMacros = not laTeXOutput
958 , readerApplyMacros = not laTeXOutput
941 }
959 }
@@ -1004,26 +1022,6 @@ main = do
1004 then bottomUpM rtfEmbedImage doc0
1022 then bottomUpM rtfEmbedImage doc0
1005 else return doc0
1023 else return doc0
1006
1024
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−
1027 let writeBinary :: B.ByteString -> IO ()
1025 let writeBinary :: B.ByteString -> IO ()
1028 writeBinary = B.writeFile (UTF8.encodePath outputFile)
1026 writeBinary = B.writeFile (UTF8.encodePath outputFile)
1029
1027
@@ -1033,15 +1031,15 @@ main = do
1033
1031
1034 case getWriter writerName' of
1032 case getWriter writerName' of
1035 Left e -> err 9 e
1033 Left e -> err 9 e
1036− Right (IOStringWriter f) -> f writerOptions doc2 >>= writerFn outputFile
1034+ Right (IOStringWriter f) -> f writerOptions doc1 >>= writerFn outputFile
1037− Right (IOByteStringWriter f) -> f writerOptions doc2 >>= writeBinary
1035+ Right (IOByteStringWriter f) -> f writerOptions doc1 >>= writeBinary
1038 Right (PureStringWriter f)
1036 Right (PureStringWriter f)
1039 | pdfOutput -> do
1037 | pdfOutput -> do
1040− res <- tex2pdf latexEngine $ f writerOptions doc2
1038+ res <- tex2pdf latexEngine $ f writerOptions doc1
1041 case res of
1039 case res of
1042 Right pdf -> writeBinary pdf
1040 Right pdf -> writeBinary pdf
1043 Left err' -> err 43 $ UTF8.toStringLazy err'
1041 Left err' -> err 43 $ UTF8.toStringLazy err'
1044− | otherwise -> selfcontain (f writerOptions doc2 ++
1042+ | otherwise -> selfcontain (f writerOptions doc1 ++
1045 ['\n' | not standalone'])
1043 ['\n' | not standalone'])
1046 >>= writerFn outputFile . handleEntities
1044 >>= writerFn outputFile . handleEntities
1047 where htmlFormat = writerName' `elem`
1045 where htmlFormat = writerName' `elem`