git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #2037 from lierdakil/issue458
91128aaJohn MacFarlane
data/docx/word/styles.xml+19
@@ -340,4 +340,23 @@
340 <w:color w:val="4F81BD" w:themeColor="accent1" />
340 <w:color w:val="4F81BD" w:themeColor="accent1" />
341 </w:rPr>
341 </w:rPr>
342 </w:style>
342 </w:style>
343+ <w:style w:type="paragraph" w:styleId="TOCHeading">
344+ <w:name w:val="TOC Heading" />
345+ <w:basedOn w:val="Heading1" />
346+ <w:next w:val="BodyText" />
347+ <w:uiPriority w:val="39" />
348+ <w:unhideWhenUsed />
349+ <w:qFormat />
350+ <w:pPr>
351+ <w:spacing w:before="240" w:line="259" w:lineRule="auto" />
352+ <w:outlineLvl w:val="9" />
353+ </w:pPr>
354+ <w:rPr>
355+ <w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi" />
356+ <w:b w:val="0" />
357+ <w:bCs w:val="0" />
358+ <w:color w:val="365F91" w:themeColor="accent1"
359+ w:themeShade="BF" />
360+ </w:rPr>
361+ </w:style>
343</w:styles>
362</w:styles>
src/Text/Pandoc/Writers/Docx.hs+29−1
@@ -598,6 +598,33 @@ mkLvl marker lvl =
598getNumId :: WS Int
598getNumId :: WS Int
599getNumId = (((baseListId - 1) +) . length) `fmap` gets stLists
599getNumId = (((baseListId - 1) +) . length) `fmap` gets stLists
600
600
601+makeTOC :: WriterOptions -> WS [Element]
602+makeTOC opts | writerTableOfContents opts = do
603+ let depth = "1-"++(show (writerTOCDepth opts))
604+ let tocCmd = "TOC \\o \""++depth++"\" \\h \\z \\u"
605+ title <- withParaPropM (pStyleM "TOC Heading") (blocksToOpenXML opts [Para [Str "Table of Contents"]])
606+ return $
607+ [mknode "w:sdt" [] ([
608+ mknode "w:sdtPr" [] (
609+ mknode "w:docPartObj" [] (
610+ [mknode "w:docPartGallery" [("w:val","Table of Contents")] (),
611+ mknode "w:docPartUnique" [] ()]
612+ ) -- w:docPartObj
613+ ), -- w:sdtPr
614+ mknode "w:sdtContent" [] (title++[
615+ mknode "w:p" [] (
616+ mknode "w:r" [] ([
617+ mknode "w:fldChar" [("w:fldCharType","begin"),("w:dirty","true")] (),
618+ mknode "w:instrText" [("xml:space","preserve")] tocCmd,
619+ mknode "w:fldChar" [("w:fldCharType","separate")] (),
620+ mknode "w:fldChar" [("w:fldCharType","end")] ()
621+ ]) -- w:r
622+ ) -- w:p
623+ ])
624+ ])] -- w:sdt
625+makeTOC _ = return []
626+
627+
601-- | Convert Pandoc document to two lists of
628-- | Convert Pandoc document to two lists of
602-- OpenXML elements (the main document and footnotes).
629-- OpenXML elements (the main document and footnotes).
603writeOpenXML :: WriterOptions -> Pandoc -> WS ([Element], [Element])
630writeOpenXML :: WriterOptions -> Pandoc -> WS ([Element], [Element])
@@ -630,7 +657,8 @@ writeOpenXML opts (Pandoc meta blocks) = do
630 let blocks' = bottomUp convertSpace blocks
657 let blocks' = bottomUp convertSpace blocks
631 doc' <- (setFirstPara >> blocksToOpenXML opts blocks')
658 doc' <- (setFirstPara >> blocksToOpenXML opts blocks')
632 notes' <- reverse `fmap` gets stFootnotes
659 notes' <- reverse `fmap` gets stFootnotes
660+ toc <- makeTOC opts
633− let meta' = title ++ subtitle ++ authors ++ date ++ abstract
661+ let meta' = title ++ subtitle ++ authors ++ date ++ abstract ++ toc
634 return (meta' ++ doc', notes')
662 return (meta' ++ doc', notes')
635
663
636-- | Convert a list of Pandoc blocks to OpenXML.
664-- | Convert a list of Pandoc blocks to OpenXML.