diff options
author | John MacFarlane <jgm@berkeley.edu> | 2020-06-29 12:38:49 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-29 12:38:49 -0700 |
commit | f1a529508240ddeca75d6d31c475ae9f9e5fbc82 (patch) | |
tree | 72c575031bc9ddd00067e2a4aca36fac03138ea4 /src/Text/Pandoc/App/Opt.hs | |
parent | 5ef315cc6db868a11bd0c3e887b8c55eb2216662 (diff) | |
parent | 42e7f1e976842d975cd2e13bafb9228d7bc92acf (diff) | |
download | pandoc-f1a529508240ddeca75d6d31c475ae9f9e5fbc82.tar.gz |
Merge pull request #6328 from lierdakil/defaults-meta-parse
Unify defaults metadata and markdown metadata parsers
Diffstat (limited to 'src/Text/Pandoc/App/Opt.hs')
-rw-r--r-- | src/Text/Pandoc/App/Opt.hs | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/Text/Pandoc/App/Opt.hs b/src/Text/Pandoc/App/Opt.hs index fb2aeab22..5c39f4ab6 100644 --- a/src/Text/Pandoc/App/Opt.hs +++ b/src/Text/Pandoc/App/Opt.hs @@ -4,6 +4,7 @@ {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE FlexibleContexts #-} {- | Module : Text.Pandoc.App.Opt Copyright : Copyright (C) 2006-2020 John MacFarlane @@ -34,9 +35,12 @@ import Text.Pandoc.Options (TopLevelDivision (TopLevelDefault), ObfuscationMethod (NoObfuscation), CiteMethod (Citeproc)) import Text.Pandoc.Shared (camelCaseStrToHyphenated) -import Text.DocLayout (render) -import Text.DocTemplates (Context(..), Val(..)) +import qualified Text.Pandoc.Parsing as P +import Text.Pandoc.Readers.Metadata (yamlMap) +import Text.Pandoc.Class.PandocPure +import Text.DocTemplates (Context(..)) import Data.Text (Text, unpack) +import Data.Default (def) import qualified Data.Text as T import qualified Data.Map as M import Text.Pandoc.Definition (Meta(..), MetaValue(..), lookupMeta) @@ -185,8 +189,7 @@ doOpt (k',v) = do -- Note: x comes first because <> for Context is left-biased union -- and we want to favor later default files. See #5988. "metadata" -> - parseYAML v >>= \x -> return (\o -> o{ optMetadata = optMetadata o <> - contextToMeta x }) + yamlToMeta v >>= \x -> return (\o -> o{ optMetadata = optMetadata o <> x }) "metadata-files" -> parseYAML v >>= \x -> return (\o -> o{ optMetadataFiles = @@ -475,16 +478,14 @@ defaultOpts = Opt , optStripComments = False } -contextToMeta :: Context Text -> Meta -contextToMeta (Context m) = - Meta . M.map valToMetaVal $ m - -valToMetaVal :: Val Text -> MetaValue -valToMetaVal (MapVal (Context m)) = - MetaMap . M.map valToMetaVal $ m -valToMetaVal (ListVal xs) = MetaList $ map valToMetaVal xs -valToMetaVal (SimpleVal d) = MetaString $ render Nothing d -valToMetaVal NullVal = MetaString "" +yamlToMeta :: Node Pos -> Parser Meta +yamlToMeta (Mapping _ _ m) = + either (fail . show) return $ runEverything (yamlMap pMetaString m) + where + pMetaString = pure . MetaString <$> P.manyChar P.anyChar + runEverything p = runPure (P.readWithM p def "") + >>= fmap (Meta . flip P.runF def) +yamlToMeta _ = return mempty addMeta :: String -> String -> Meta -> Meta addMeta k v meta = |