diff options
| author | Nikolay Yakimov <root@livid.pp.ru> | 2014-12-06 18:33:12 +0300 | 
|---|---|---|
| committer | Nikolay Yakimov <root@livid.pp.ru> | 2015-03-29 09:03:33 +0300 | 
| commit | 5ab839a187860632c5337b72c807d043107dd88b (patch) | |
| tree | 2ea3bb4791b8bf48774364eb285b13c6f35e68fe | |
| parent | 27078985d54111ad5b674635dd3adc5ac5f86744 (diff) | |
| download | pandoc-5ab839a187860632c5337b72c807d043107dd88b.tar.gz | |
Docx Writer: Initial support for --toc option (issue #458)
Creates a "dirty" TOC at the beginning of document, before abstract
| -rw-r--r-- | src/Text/Pandoc/Writers/Docx.hs | 30 | 
1 files changed, 29 insertions, 1 deletions
| diff --git a/src/Text/Pandoc/Writers/Docx.hs b/src/Text/Pandoc/Writers/Docx.hs index 81369e278..b019ab73f 100644 --- a/src/Text/Pandoc/Writers/Docx.hs +++ b/src/Text/Pandoc/Writers/Docx.hs @@ -581,6 +581,33 @@ mkLvl marker lvl =  getNumId :: WS Int  getNumId = (((baseListId - 1) +) . length) `fmap` gets stLists +makeTOC :: WriterOptions -> WS [Element] +makeTOC opts | writerTableOfContents opts = do +  let depth = "1-"++(show (writerTOCDepth opts)) +  let tocCmd = "TOC \\o \""++depth++"\" \\h \\z \\u" +  title <- withParaPropM (pStyleM "TOC Heading") (blocksToOpenXML opts [Para [Str "Table of Contents"]]) +  return $ +    [mknode "w:sdt" [] ([ +      mknode "w:sdtPr" [] ( +        mknode "w:docPartObj" [] ( +          [mknode "w:docPartGallery" [("w:val","Table of Contents")] (), +          mknode "w:docPartUnique" [] ()] +        ) -- w:docPartObj +      ), -- w:sdtPr +      mknode "w:sdtContent" [] (title++[ +        mknode "w:p" [] ( +          mknode "w:r" [] ([ +            mknode "w:fldChar" [("w:fldCharType","begin"),("w:dirty","true")] (), +            mknode "w:instrText" [("xml:space","preserve")] tocCmd, +            mknode "w:fldChar" [("w:fldCharType","separate")] (), +            mknode "w:fldChar" [("w:fldCharType","end")] () +          ]) -- w:r +        ) -- w:p +      ]) +    ])] -- w:sdt +makeTOC _ = return [] + +  -- | Convert Pandoc document to two lists of  -- OpenXML elements (the main document and footnotes).  writeOpenXML :: WriterOptions -> Pandoc -> WS ([Element], [Element]) @@ -613,7 +640,8 @@ writeOpenXML opts (Pandoc meta blocks) = do    let blocks' = bottomUp convertSpace blocks    doc' <- (setFirstPara >> blocksToOpenXML opts blocks')    notes' <- reverse `fmap` gets stFootnotes -  let meta' = title ++ subtitle ++ authors ++ date ++ abstract +  toc <- makeTOC opts +  let meta' = title ++ subtitle ++ authors ++ date ++ toc ++ abstract    return (meta' ++ doc', notes')  -- | Convert a list of Pandoc blocks to OpenXML. | 
