aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2015-11-23 20:26:31 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2015-11-23 20:40:27 -0800
commit4361dc0245a65d4f24f2df062684cdb1a0c3bc5a (patch)
treedd7a1815cf85465bf4465e8063253eeddbbd7654
parent902c63ebea779cce95b2bca041ad56cbf84ff727 (diff)
downloadpandoc-4361dc0245a65d4f24f2df062684cdb1a0c3bc5a.tar.gz
Define a `meta-json` variable for all writers.
This contains a JSON version of all the metadata, in the format selected for the writer. So, for example, to get just the YAML metadata, you can run pandoc with the following custom template: $meta-json$ Closes #2019. The intent is to make it easier for static site generators and other tools to get at the metadata.
-rw-r--r--README5
-rw-r--r--src/Text/Pandoc/Writers/Markdown.hs3
-rw-r--r--src/Text/Pandoc/Writers/Shared.hs6
3 files changed, 10 insertions, 4 deletions
diff --git a/README b/README
index 9f00c5749..e40b822e1 100644
--- a/README
+++ b/README
@@ -1035,7 +1035,7 @@ depending on the output format, but include metadata fields as well as the follo
...
`subtitle`
-: document subtitle; also used as subject in PDF metadata
+: document subtitle
`abstract`
: document summary, included in LaTeX, ConTeXt, AsciiDoc, and Word docx
@@ -1064,6 +1064,9 @@ depending on the output format, but include metadata fields as well as the follo
`body`
: body of document
+`meta-json`
+: JSON representation of all of the document's metadata
+
Language variables
------------------
diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs
index 731fa86c4..9f06aa054 100644
--- a/src/Text/Pandoc/Writers/Markdown.hs
+++ b/src/Text/Pandoc/Writers/Markdown.hs
@@ -126,7 +126,8 @@ jsonToYaml (Object hashmap) =
| otherwise -> (k' <> ":") $$ x
(k', Object _, x) -> (k' <> ":") $$ nest 2 x
(_, String "", _) -> empty
- (k', _, x) -> k' <> ":" <> space <> hang 2 "" x)
+ (k', _, x) | k == "meta-json" -> empty
+ | otherwise -> k' <> ":" <> space <> hang 2 "" x)
$ sortBy (comparing fst) $ H.toList hashmap
jsonToYaml (Array vec) =
vcat $ map (\v -> hang 2 "- " (jsonToYaml v)) $ V.toList vec
diff --git a/src/Text/Pandoc/Writers/Shared.hs b/src/Text/Pandoc/Writers/Shared.hs
index d94dbac46..865d10123 100644
--- a/src/Text/Pandoc/Writers/Shared.hs
+++ b/src/Text/Pandoc/Writers/Shared.hs
@@ -45,7 +45,8 @@ import Text.Pandoc.Options (WriterOptions(..))
import qualified Data.HashMap.Strict as H
import qualified Data.Map as M
import qualified Data.Text as T
-import Data.Aeson (FromJSON(..), fromJSON, ToJSON (..), Value(Object), Result(..))
+import Data.Aeson (FromJSON(..), fromJSON, ToJSON (..), Value(Object), Result(..), encode)
+import Text.Pandoc.UTF8 (toStringLazy)
import qualified Data.Traversable as Traversable
import Data.List ( groupBy )
@@ -67,7 +68,8 @@ metaToJSON opts blockWriter inlineWriter (Meta metamap)
renderedMap <- Traversable.mapM
(metaValueToJSON blockWriter inlineWriter)
metamap
- return $ M.foldWithKey defField baseContext renderedMap
+ let metadata = M.foldWithKey defField baseContext renderedMap
+ return $ defField "meta-json" (toStringLazy $ encode metadata) metadata
| otherwise = return (Object H.empty)
metaValueToJSON :: Monad m