aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Readers/Markdown.hs
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2020-10-05 21:07:47 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2020-10-05 21:07:47 -0700
commit6a32ea71ea9af8613b8585e874fef8d5f29665fa (patch)
tree12b2ed269b25149bb5620b0c9d09c658f923dd32 /src/Text/Pandoc/Readers/Markdown.hs
parent89e4f1bf9ad48e3fdefeb5c921e9af62ebc24601 (diff)
downloadpandoc-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.hs27
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
--