@@ -36,8 +36,9 @@ import Control.Monad.Except (catchError)
3636import Control.Monad.State.Strict
3737import qualified Data.ByteString.Lazy as B
3838import Data.Generics (everywhere', mkT)
39−import Data.List (isPrefixOf)
39+import Data.List (isPrefixOf, intercalate)
4040import Data.Maybe (fromMaybe)
41+import qualified Data.Map as Map
4142import qualified Data.Text.Lazy as TL
4243import System.FilePath (takeDirectory, takeExtension, (<.>))
4344import Text.Pandoc.BCP47 (Lang (..), getLang, renderLang)
@@ -49,7 +50,8 @@ import Text.Pandoc.Logging
4950import Text.Pandoc.MIME (extensionFromMimeType, getMimeType)
5051import Text.Pandoc.Options (WrapOption (..), WriterOptions (..))
5152import Text.Pandoc.Pretty
52−import Text.Pandoc.Shared (stringify)
53+import Text.Pandoc.Shared (stringify, normalizeDate)
54+import Text.Pandoc.Writers.Shared (lookupMetaString)
5355import Text.Pandoc.UTF8 (fromStringLazy, fromTextLazy, toStringLazy)
5456import Text.Pandoc.Walk
5557import Text.Pandoc.Writers.OpenDocument (writeOpenDocument)
@@ -81,6 +83,7 @@ pandocToODT :: PandocMonad m
8183 -> O m B.ByteString
8284pandocToODT opts doc@(Pandoc meta _) = do
8385 let title = docTitle meta
86+ let authors = docAuthors meta
8487 lang <- toLang (getLang opts meta)
8588 refArchive <-
8689 case writerReferenceDoc opts of
@@ -123,6 +126,15 @@ pandocToODT opts doc@(Pandoc meta _) = do
123126 )
124127 )
125128 let archive' = addEntryToArchive manifestEntry archive
129+ let userDefinedMetaFields = [k | k <- Map.keys (unMeta meta)
130+ , k `notElem` ["title", "lang", "author", "date"]]
131+ let escapedText = text . escapeStringForXML
132+ let userDefinedMeta =
133+ map (\k -> inTags False "meta:user-defined"
134+ [ ("meta_name", escapeStringForXML k)
135+ ,("meta-value-type", "string")
136+ ] (escapedText $ lookupMetaString k meta)) userDefinedMetaFields
137+ let metaTag metafield = inTagsSimple metafield . escapedText
126138 let metaEntry = toEntry "meta.xml" epochtime
127139 $ fromStringLazy $ render Nothing
128140 $ text "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
@@ -134,14 +146,21 @@ pandocToODT opts doc@(Pandoc meta _) = do
134146 ,("xmlns:meta","urn:oasis:names:tc:opendocument:xmlns:meta:1.0")
135147 ,("xmlns:ooo","http://openoffice.org/2004/office")
136148 ,("xmlns:grddl","http://www.w3.org/2003/g/data-view#")
137− ,("office:version","1.2")] ( inTagsSimple "office:meta" $
138− ( inTagsSimple "dc:title"
139− (text $ escapeStringForXML (stringify title))
149+ ,("office:version","1.2")] ( inTags True "office:meta" [] $
150+ ( metaTag "dc:title" (stringify title)
140151 $$
141152 case lang of
142− Just l -> inTagsSimple "dc:language"
143− (text (escapeStringForXML (renderLang l)))
153+ Just l -> metaTag "dc:language" (renderLang l)
144154 Nothing -> empty
155+ $$
156+ metaTag "dc:creator"
157+ (intercalate "; " (map stringify authors))
158+ $$
159+ maybe mempty
160+ (metaTag "dc:date")
161+ (normalizeDate (lookupMetaString "date" meta))
162+ $$
163+ vcat userDefinedMeta
145164 )
146165 )
147166 )