diff options
author | John MacFarlane <jgm@berkeley.edu> | 2020-10-05 21:07:47 -0700 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2020-10-05 21:07:47 -0700 |
commit | 6a32ea71ea9af8613b8585e874fef8d5f29665fa (patch) | |
tree | 12b2ed269b25149bb5620b0c9d09c658f923dd32 /src/Text/Pandoc/Readers/Markdown.hs | |
parent | 89e4f1bf9ad48e3fdefeb5c921e9af62ebc24601 (diff) | |
download | pandoc-6a32ea71ea9af8613b8585e874fef8d5f29665fa.tar.gz |
Add yamlToRefs, yamlBsToRefs.
T.P.Readers.Markdown now exports yamlToRefs. [API change]
T.P.Readers.Metadata exports yamlBsToRefs. [API change]
These allow specifying an id filter so we parse only references
that are used in the document. Improves timing with a 3M
yaml references file from 36s to 17s.
Diffstat (limited to 'src/Text/Pandoc/Readers/Markdown.hs')
-rw-r--r-- | src/Text/Pandoc/Readers/Markdown.hs | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 257788081..65925ee95 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -13,7 +13,10 @@ Conversion of markdown-formatted plain text to 'Pandoc' document. -} -module Text.Pandoc.Readers.Markdown ( readMarkdown, yamlToMeta ) where +module Text.Pandoc.Readers.Markdown ( + readMarkdown, + yamlToMeta, + yamlToRefs ) where import Control.Monad import Control.Monad.Except (throwError) @@ -44,7 +47,7 @@ import Text.Pandoc.Readers.LaTeX (applyMacros, rawLaTeXBlock, rawLaTeXInline) import Text.Pandoc.Shared import qualified Text.Pandoc.UTF8 as UTF8 import Text.Pandoc.XML (fromEntities) -import Text.Pandoc.Readers.Metadata (yamlBsToMeta) +import Text.Pandoc.Readers.Metadata (yamlBsToMeta, yamlBsToRefs) type MarkdownParser m = ParserT Text ParserState m @@ -75,6 +78,26 @@ yamlToMeta opts bstr = do Right result -> return result Left e -> throwError e +-- | Read a YAML string and extract references from the +-- 'references' field, filter using an id predicate and +-- parsing fields as Markdown. +yamlToRefs :: PandocMonad m + => (Text -> Bool) + -> ReaderOptions + -> BL.ByteString + -> m [M.Map Text MetaValue] +yamlToRefs idpred opts bstr = do + let parser = do + refs <- yamlBsToRefs (fmap B.toMetaValue <$> parseBlocks) idpred bstr + return $ runF refs defaultParserState + parsed <- readWithM parser def{ stateOptions = opts } "" + case parsed of + Right result -> return result + Left e -> throwError e + + + + -- -- Constants and data structure definitions -- |