aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Writers/Docx.hs
diff options
context:
space:
mode:
authorAgustín Martín Barbero <agusmbaterra@gmail.com>2019-01-26 16:14:35 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2019-01-26 16:14:35 -0800
commit9894d05fe3fd239247f755c60dc22247360be958 (patch)
tree92f5d6240edfd3bf72cc3c30295d18bef76a4077 /src/Text/Pandoc/Writers/Docx.hs
parentff0aaa549d51384ef3cdcb063706dee4f6143444 (diff)
downloadpandoc-9894d05fe3fd239247f755c60dc22247360be958.tar.gz
Improve writing metadata for docx, pptx and odt (#5252)
* docx writer: support custom properties. Solves the writer part of #3024. Also supports additional core properties: `subject`, `lang`, `category`, `description`. * odt writer: improve standard properties, including the following core properties: `generator` (Pandoc/VERSION), `description`, `subject`, `keywords`, `initial-creator` (from authors), `creation-date` (actual creation date). Also fix date. * pptx writer: support custom properties. Also supports additional core properties: `subject`, `category`, `description`. * Includes golden tests. * MANUAL: document metadata support for docx, odt, pptx writers
Diffstat (limited to 'src/Text/Pandoc/Writers/Docx.hs')
-rw-r--r--src/Text/Pandoc/Writers/Docx.hs19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs
index 4f642871a..cee339ac7 100644
--- a/src/Text/Pandoc/Writers/Docx.hs
+++ b/src/Text/Pandoc/Writers/Docx.hs
@@ -496,7 +496,17 @@ writeDocx opts doc@(Pandoc meta _) = do
Just (MetaList xs) -> map stringify xs
_ -> []
+ -- docProps/core.xml
let docPropsPath = "docProps/core.xml"
+ let extraCoreProps = ["subject","lang","category","description"]
+ let extraCorePropsMap = M.fromList $ zip extraCoreProps
+ ["dc:subject","dc:language","cp:category","dc:description"]
+ let lookupMetaString' :: String -> Meta -> String
+ lookupMetaString' key' meta' =
+ case key' of
+ "description" -> intercalate "_x000d_\n" (map stringify $ lookupMetaBlocks "description" meta')
+ _ -> lookupMetaString key' meta'
+
let docProps = mknode "cp:coreProperties"
[("xmlns:cp","http://schemas.openxmlformats.org/package/2006/metadata/core-properties")
,("xmlns:dc","http://purl.org/dc/elements/1.1/")
@@ -505,14 +515,19 @@ writeDocx opts doc@(Pandoc meta _) = do
,("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")]
$ mknode "dc:title" [] (stringify $ docTitle meta)
: mknode "dc:creator" [] (intercalate "; " (map stringify $ docAuthors meta))
- : mknode "cp:keywords" [] (intercalate ", " keywords)
+ : [ mknode (M.findWithDefault "" k extraCorePropsMap) [] (lookupMetaString' k meta)
+ | k <- M.keys (unMeta meta), k `elem` extraCoreProps]
+ ++ mknode "cp:keywords" [] (intercalate ", " keywords)
: (\x -> [ mknode "dcterms:created" [("xsi:type","dcterms:W3CDTF")] x
, mknode "dcterms:modified" [("xsi:type","dcterms:W3CDTF")] x
]) (formatTime defaultTimeLocale "%FT%XZ" utctime)
let docPropsEntry = toEntry docPropsPath epochtime $ renderXml docProps
+ -- docProps/custom.xml
let customProperties :: [(String, String)]
- customProperties = [] -- FIXME
+ customProperties = [(k, lookupMetaString k meta) | k <- M.keys (unMeta meta)
+ , k `notElem` (["title", "author", "keywords"]
+ ++ extraCoreProps)]
let mkCustomProp (k, v) pid = mknode "property"
[("fmtid","{D5CDD505-2E9C-101B-9397-08002B2CF9AE}")
,("pid", show pid)