@@ -155,8 +155,11 @@ writeDocx opts doc@(Pandoc meta _) = do
155155 ,("/word/document.xml",
156156 "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml")
157157 ,("/word/footnotes.xml",
158− "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml")
159− ] ++ map mkImageOverride imgs
158+ "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml"),
159+ ("/word/header1.xml",
160+ "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml"),
161+ ("/word/footer1.xml",
162+ "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml") ] ++ map mkImageOverride imgs
160163 let defaultnodes = [mknode "Default"
161164 [("Extension","xml"),("ContentType","application/xml")] (),
162165 mknode "Default"
@@ -191,7 +194,14 @@ writeDocx opts doc@(Pandoc meta _) = do
191194 "theme/theme1.xml")
192195 ,("http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes",
193196 "rId7",
194− "footnotes.xml")]
197+ "footnotes.xml")
198+ ,("http://schemas.openxmlformats.org/officeDocument/2006/relationships/header",
199+ "rId8",
200+ "header1.xml")
201+ ,("http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer",
202+ "rId9",
203+ "footer1.xml")
204+ ]
195205 let toImgRel (ident,path,_,_,_) = mknode "Relationship" [("Type","http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"),("Id",ident),("Target",path)] ()
196206 let imgrels = map toImgRel imgs
197207 let toLinkRel (src,ident) = mknode "Relationship" [("Type","http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"),("Id",ident),("Target",src),("TargetMode","External") ] ()
@@ -207,9 +217,16 @@ writeDocx opts doc@(Pandoc meta _) = do
207217 -- adjust contents to add sectPr from reference.docx
208218 let docpath = "word/document.xml"
209219 parsedDoc <- parseXml refArchive distArchive docpath
210− let sectprs = filterElementsName (\qn -> qPrefix qn == Just "w" &&
211− qName qn == "sectPr")
212− parsedDoc
220+ let mbsectpr = filterElementName (\qn -> qPrefix qn == Just "w" &&
221+ qName qn == "sectPr") parsedDoc
222+ let sectPrProps = case mbsectpr of
223+ Nothing -> []
224+ Just e -> filterElementsName (\qn ->
225+ qPrefix qn == Just "w" &&
226+ qName qn `notElem` ["headerReference","footerReference","sectPr"]) e
227+ let headerPr = mknode "w:headerReference" [("w:type","default"),("r:id","rId8")] $ ()
228+ let footerPr = mknode "w:footerReference" [("w:type","default"),("r:id","rId9")] $ ()
229+ let sectpr = mknode "w:sectPr" [] $ [headerPr, footerPr] ++ sectPrProps
213230
214231 let stdAttributes =
215232 [("xmlns:w","http://schemas.openxmlformats.org/wordprocessingml/2006/main")
@@ -222,7 +239,7 @@ writeDocx opts doc@(Pandoc meta _) = do
222239 ,("xmlns:pic","http://schemas.openxmlformats.org/drawingml/2006/picture")
223240 ,("xmlns:wp","http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing")]
224241
225− let contents' = contents ++ sectprs
242+ let contents' = contents ++ [sectpr]
226243 let docContents = mknode "w:document" stdAttributes
227244 $ mknode "w:body" [] $ contents'
228245
@@ -281,20 +298,25 @@ writeDocx opts doc@(Pandoc meta _) = do
281298 ]
282299 let relsEntry = toEntry relsPath epochtime $ renderXml rels
283300
284− let entryFromArchive path =
301+ let entryFromArchive arch path =
285302 (toEntry path epochtime . renderXml) `fmap`
286− parseXml refArchive distArchive path
287− docPropsAppEntry <- entryFromArchive "docProps/app.xml"
288− themeEntry <- entryFromArchive "word/theme/theme1.xml"
289− fontTableEntry <- entryFromArchive "word/fontTable.xml"
290− settingsEntry <- entryFromArchive "word/settings.xml"
291− webSettingsEntry <- entryFromArchive "word/webSettings.xml"
303+ parseXml arch distArchive path
304+ docPropsAppEntry <- entryFromArchive refArchive "docProps/app.xml"
305+ themeEntry <- entryFromArchive refArchive "word/theme/theme1.xml"
306+ fontTableEntry <- entryFromArchive refArchive "word/fontTable.xml"
307+ -- we take settings.xml from dist archive because the ref archive
308+ -- sometimes references special footnotes and endnotes that may
309+ -- not be defined in footnotes.xml or endnotes.xml.
310+ settingsEntry <- entryFromArchive distArchive "word/settings.xml"
311+ webSettingsEntry <- entryFromArchive distArchive "word/webSettings.xml"
312+ headerEntry <- entryFromArchive refArchive "word/header1.xml"
313+ footerEntry <- entryFromArchive refArchive "word/footer1.xml"
292314 let miscRels = [ f | f <- filesInArchive refArchive
293315 , "word/_rels/" `isPrefixOf` f
294316 , ".xml.rels" `isSuffixOf` f
295317 , f /= "word/_rels/document.xml.rels"
296318 , f /= "word/_rels/footnotes.xml.rels" ]
297− miscRelEntries <- mapM entryFromArchive miscRels
319+ miscRelEntries <- mapM (entryFromArchive refArchive) miscRels
298320
299321 -- Create archive
300322 let archive = foldr addEntryToArchive emptyArchive $
@@ -302,7 +324,7 @@ writeDocx opts doc@(Pandoc meta _) = do
302324 footnoteRelEntry : numEntry : styleEntry : footnotesEntry :
303325 docPropsEntry : docPropsAppEntry : themeEntry :
304326 fontTableEntry : settingsEntry : webSettingsEntry :
305− imageEntries ++ miscRelEntries
327+ headerEntry : footerEntry : imageEntries ++ miscRelEntries
306328 return $ fromArchive archive
307329
308330styleToOpenXml :: Style -> [Element]