git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #6941 from tarleb/docx-raw

Docx writer: keep raw openxml strings verbatim

commit32902d0fad22af823fa765603d22437580b4b5e2 authorJohn MacFarlane <jgm@berkeley.edu> dateSun 13 Dec 2020, 11:08 (6 years ago) parentc3aa90b00031fc
6 files changed+97−59
src/Text/Pandoc/Writers/Docx.hs+78−59 test/Tests/Writers/Docx.hs+10 test/docx/golden/raw-blocks.docx test/docx/golden/raw-bookmarks.docx test/docx/raw-blocks.native+6 test/docx/raw-bookmarks.native+3
src/Text/Pandoc/Writers/Docx.hs+78−59
@@ -441,7 +441,7 @@ writeDocx opts doc = do
441441 Nothing -> mknode "w:sectPr" [] ()
442442
443443 -- let sectpr = fromMaybe (mknode "w:sectPr" [] ()) mbsectpr'
444− let contents' = contents ++ [sectpr]
444+ let contents' = contents ++ [Elem sectpr]
445445 let docContents = mknode "w:document" stdAttributes
446446 $ mknode "w:body" [] contents'
447447
@@ -538,7 +538,8 @@ writeDocx opts doc = do
538538
539539 -- docProps/custom.xml
540540 let customProperties :: [(String, String)]
541− customProperties = [(T.unpack k, T.unpack $ lookupMetaString k meta) | k <- M.keys (unMeta meta)
541+ customProperties = [ (T.unpack k, T.unpack $ lookupMetaString k meta)
542+ | k <- M.keys (unMeta meta)
542543 , k `notElem` (["title", "author", "keywords"]
543544 ++ extraCoreProps)]
544545 let mkCustomProp (k, v) pid = mknode "property"
@@ -788,7 +789,7 @@ makeTOC opts = do
788789 mknode "w:docPartUnique" [] ()]
789790 -- w:docPartObj
790791 ), -- w:sdtPr
791− mknode "w:sdtContent" [] (title++[
792+ mknode "w:sdtContent" [] (title ++ [ Elem $
792793 mknode "w:p" [] (
793794 mknode "w:r" [] [
794795 mknode "w:fldChar" [("w:fldCharType","begin"),("w:dirty","true")] (),
@@ -802,7 +803,9 @@ makeTOC opts = do
802803
803804-- | Convert Pandoc document to two lists of
804805-- OpenXML elements (the main document and footnotes).
805−writeOpenXML :: (PandocMonad m) => WriterOptions -> Pandoc -> WS m ([Element], [Element],[Element])
806+writeOpenXML :: (PandocMonad m)
807+ => WriterOptions -> Pandoc
808+ -> WS m ([Content], [Element], [Element])
806809writeOpenXML opts (Pandoc meta blocks) = do
807810 let tit = docTitle meta
808811 let auths = docAuthors meta
@@ -830,6 +833,7 @@ writeOpenXML opts (Pandoc meta blocks) = do
830833 return $
831834 mknode "w:comment" [('w':':':T.unpack k,T.unpack v) | (k,v) <- kvs]
832835 [ mknode "w:p" [] $
836+ map Elem
833837 [ mknode "w:pPr" []
834838 [ mknode "w:pStyle" [("w:val", "CommentText")] () ]
835839 , mknode "w:r" []
@@ -844,11 +848,11 @@ writeOpenXML opts (Pandoc meta blocks) = do
844848 toc <- if includeTOC
845849 then makeTOC opts
846850 else return []
847− let meta' = title ++ subtitle ++ authors ++ date ++ abstract ++ toc
851+ let meta' = title ++ subtitle ++ authors ++ date ++ abstract ++ map Elem toc
848852 return (meta' ++ doc', notes', comments')
849853
850854-- | Convert a list of Pandoc blocks to OpenXML.
851−blocksToOpenXML :: (PandocMonad m) => WriterOptions -> [Block] -> WS m [Element]
855+blocksToOpenXML :: (PandocMonad m) => WriterOptions -> [Block] -> WS m [Content]
852856blocksToOpenXML opts = fmap concat . mapM (blockToOpenXML opts) . separateTables
853857
854858-- Word combines adjacent tables unless you put an empty paragraph between
@@ -884,10 +888,10 @@ dynamicStyleKey :: T.Text
884888dynamicStyleKey = "custom-style"
885889
886890-- | Convert a Pandoc block element to OpenXML.
887−blockToOpenXML :: (PandocMonad m) => WriterOptions -> Block -> WS m [Element]
891+blockToOpenXML :: (PandocMonad m) => WriterOptions -> Block -> WS m [Content]
888892blockToOpenXML opts blk = withDirection $ blockToOpenXML' opts blk
889893
890−blockToOpenXML' :: (PandocMonad m) => WriterOptions -> Block -> WS m [Element]
894+blockToOpenXML' :: (PandocMonad m) => WriterOptions -> Block -> WS m [Content]
891895blockToOpenXML' _ Null = return []
892896blockToOpenXML' opts (Div (ident,_classes,kvs) bs) = do
893897 stylemod <- case lookup dynamicStyleKey kvs of
@@ -921,18 +925,18 @@ blockToOpenXML' opts (Header lev (ident,_,kvs) lst) = do
921925 Just n -> do
922926 num <- withTextPropM (rStyleM "SectionNumber")
923927 (inlineToOpenXML opts (Str n))
924− return $ num ++ [mknode "w:r" [] [mknode "w:tab" [] ()]]
928+ return $ num ++ [Elem $ mknode "w:r" [] [mknode "w:tab" [] ()]]
925929 Nothing -> return []
926930 else return []
927931 contents <- (number ++) <$> inlinesToOpenXML opts lst
928932 if T.null ident
929− then return [mknode "w:p" [] (paraProps ++ contents)]
933+ then return [Elem $ mknode "w:p" [] (map Elem paraProps ++ contents)]
930934 else do
931935 let bookmarkName = ident
932936 modify $ \s -> s{ stSectionIds = Set.insert bookmarkName
933937 $ stSectionIds s }
934938 bookmarkedContents <- wrapBookmark bookmarkName contents
935− return [mknode "w:p" [] (paraProps ++ bookmarkedContents)]
939+ return [Elem $ mknode "w:p" [] (map Elem paraProps ++ bookmarkedContents)]
936940blockToOpenXML' opts (Plain lst) = do
937941 isInTable <- gets stInTable
938942 isInList <- gets stInList
@@ -952,7 +956,9 @@ blockToOpenXML' opts (Para [Image attr alt (src,T.stripPrefix "fig:" -> Just tit
952956 contents <- inlinesToOpenXML opts [Image attr alt (src,tit)]
953957 captionNode <- withParaPropM (pStyleM "Image Caption")
954958 $ blockToOpenXML opts (Para alt)
955− return $ mknode "w:p" [] (paraProps ++ contents) : captionNode
959+ return $
960+ Elem (mknode "w:p" [] (map Elem paraProps ++ contents))
961+ : captionNode
956962blockToOpenXML' opts (Para lst)
957963 | null lst && not (isEnabled Ext_empty_paragraphs opts) = return []
958964 | otherwise = do
@@ -969,10 +975,12 @@ blockToOpenXML' opts (Para lst)
969975 ps -> ps
970976 modify $ \s -> s { stFirstPara = False }
971977 contents <- inlinesToOpenXML opts lst
972− return [mknode "w:p" [] (paraProps' ++ contents)]
978+ return [Elem $ mknode "w:p" [] (map Elem paraProps' ++ contents)]
973979blockToOpenXML' opts (LineBlock lns) = blockToOpenXML opts $ linesToPara lns
974980blockToOpenXML' _ b@(RawBlock format str)
975− | format == Format "openxml" = return [ x | Elem x <- parseXML str ]
981+ | format == Format "openxml" = return [
982+ Text (CData CDataRaw (T.unpack str) Nothing)
983+ ]
976984 | otherwise = do
977985 report $ BlockNotRendered b
978986 return []
@@ -987,7 +995,7 @@ blockToOpenXML' opts (CodeBlock attrs@(ident, _, _) str) = do
987995 wrapBookmark ident p
988996blockToOpenXML' _ HorizontalRule = do
989997 setFirstPara
990− return [
998+ return [ Elem $
991999 mknode "w:p" [] $ mknode "w:r" [] $ mknode "w:pict" []
9921000 $ mknode "v:rect" [("style","width:0;height:1.5pt"),
9931001 ("o:hralign","center"),
@@ -1006,26 +1014,28 @@ blockToOpenXML' opts (Table _ blkCapt specs thead tbody tfoot) = do
10061014 -- Not in the spec but in Word 2007, 2010. See #4953.
10071015 let cellToOpenXML (al, cell) = do
10081016 es <- withParaProp (alignmentFor al) $ blocksToOpenXML opts cell
1009− return $ if any (\e -> qName (elName e) == "p") es
1017+ return $ if any (\e -> qName (elName e) == "p") (onlyElems es)
10101018 then es
1011− else es ++ [mknode "w:p" [] ()]
1019+ else es ++ [Elem $ mknode "w:p" [] ()]
10121020 headers' <- mapM cellToOpenXML $ zip aligns headers
10131021 rows' <- mapM (mapM cellToOpenXML . zip aligns) rows
1014− let borderProps = mknode "w:tcPr" []
1022+ let borderProps = Elem $ mknode "w:tcPr" []
10151023 [ mknode "w:tcBorders" []
10161024 $ mknode "w:bottom" [("w:val","single")] ()
10171025 , mknode "w:vAlign" [("w:val","bottom")] () ]
10181026 compactStyle <- pStyleM "Compact"
1019− let emptyCell' = [mknode "w:p" [] [mknode "w:pPr" [] [compactStyle]]]
1027+ let emptyCell' = [Elem $ mknode "w:p" [] [mknode "w:pPr" [] [compactStyle]]]
10201028 let mkcell border contents = mknode "w:tc" []
10211029 $ [ borderProps | border ] ++
10221030 if null contents
10231031 then emptyCell'
10241032 else contents
1025− let mkrow border cells = mknode "w:tr" [] $
1026− [mknode "w:trPr" [] [
1027− mknode "w:cnfStyle" [("w:firstRow","1")] ()] | border]
1028− ++ map (mkcell border) cells
1033+ let mkrow border cells =
1034+ mknode "w:tr" [] $
1035+ [ mknode "w:trPr" []
1036+ [ mknode "w:cnfStyle" [("w:firstRow","1")] ()]
1037+ | border]
1038+ ++ map (mkcell border) cells
10291039 let textwidth = 7920 -- 5.5 in in twips, 1/20 pt
10301040 let fullrow = 5000 -- 100% specified in pct
10311041 let rowwidth = fullrow * sum widths
@@ -1035,7 +1045,8 @@ blockToOpenXML' opts (Table _ blkCapt specs thead tbody tfoot) = do
10351045 modify $ \s -> s { stInTable = False }
10361046 return $
10371047 caption' ++
1038− [mknode "w:tbl" []
1048+ [Elem $
1049+ mknode "w:tbl" []
10391050 ( mknode "w:tblPr" []
10401051 ( mknode "w:tblStyle" [("w:val","Table")] () :
10411052 mknode "w:tblW" [("w:type", "pct"), ("w:w", show rowwidth)] () :
@@ -1070,7 +1081,9 @@ blockToOpenXML' opts (DefinitionList items) = do
10701081 setFirstPara
10711082 return l
10721083
1073−definitionListItemToOpenXML :: (PandocMonad m) => WriterOptions -> ([Inline],[[Block]]) -> WS m [Element]
1084+definitionListItemToOpenXML :: (PandocMonad m)
1085+ => WriterOptions -> ([Inline],[[Block]])
1086+ -> WS m [Content]
10741087definitionListItemToOpenXML opts (term,defs) = do
10751088 term' <- withParaPropM (pStyleM "Definition Term")
10761089 $ blockToOpenXML opts (Para term)
@@ -1083,8 +1096,11 @@ addList marker = do
10831096 lists <- gets stLists
10841097 modify $ \st -> st{ stLists = lists ++ [marker] }
10851098
1086−listItemToOpenXML :: (PandocMonad m) => WriterOptions -> Int -> [Block] -> WS m [Element]
1087−listItemToOpenXML _ _ [] = return []
1099+listItemToOpenXML :: (PandocMonad m)
1100+ => WriterOptions
1101+ -> Int -> [Block]
1102+ -> WS m [Content]
1103+listItemToOpenXML _ _ [] = return []
10881104listItemToOpenXML opts numid (first:rest) = do
10891105 oldInList <- gets stInList
10901106 modify $ \st -> st{ stInList = True }
@@ -1111,7 +1127,7 @@ alignmentToString alignment = case alignment of
11111127 AlignDefault -> "left"
11121128
11131129-- | Convert a list of inline elements to OpenXML.
1114−inlinesToOpenXML :: (PandocMonad m) => WriterOptions -> [Inline] -> WS m [Element]
1130+inlinesToOpenXML :: PandocMonad m => WriterOptions -> [Inline] -> WS m [Content]
11151131inlinesToOpenXML opts lst = concat `fmap` mapM (inlineToOpenXML opts) lst
11161132
11171133withNumId :: (PandocMonad m) => Int -> WS m a -> WS m a
@@ -1186,12 +1202,12 @@ setFirstPara :: PandocMonad m => WS m ()
11861202setFirstPara = modify $ \s -> s { stFirstPara = True }
11871203
11881204-- | Convert an inline element to OpenXML.
1189−inlineToOpenXML :: PandocMonad m => WriterOptions -> Inline -> WS m [Element]
1205+inlineToOpenXML :: PandocMonad m => WriterOptions -> Inline -> WS m [Content]
11901206inlineToOpenXML opts il = withDirection $ inlineToOpenXML' opts il
11911207
1192−inlineToOpenXML' :: PandocMonad m => WriterOptions -> Inline -> WS m [Element]
1208+inlineToOpenXML' :: PandocMonad m => WriterOptions -> Inline -> WS m [Content]
11931209inlineToOpenXML' _ (Str str) =
1194− formattedString str
1210+ map Elem <$> formattedString str
11951211inlineToOpenXML' opts Space = inlineToOpenXML opts (Str " ")
11961212inlineToOpenXML' opts SoftBreak = inlineToOpenXML opts (Str " ")
11971213inlineToOpenXML' opts (Span ("",["csl-block"],[]) ils) =
@@ -1199,10 +1215,11 @@ inlineToOpenXML' opts (Span ("",["csl-block"],[]) ils) =
11991215inlineToOpenXML' opts (Span ("",["csl-left-margin"],[]) ils) =
12001216 inlinesToOpenXML opts ils
12011217inlineToOpenXML' opts (Span ("",["csl-right-inline"],[]) ils) =
1202− ([mknode "w:r" []
1203− (mknode "w:t"
1204− [("xml:space","preserve")]
1205− ("\t" :: String))] ++)
1218+ ([Elem $
1219+ mknode "w:r" []
1220+ (mknode "w:t"
1221+ [("xml:space","preserve")]
1222+ ("\t" :: String))] ++)
12061223 <$> inlinesToOpenXML opts ils
12071224inlineToOpenXML' opts (Span ("",["csl-indent"],[]) ils) =
12081225 inlinesToOpenXML opts ils
@@ -1212,18 +1229,18 @@ inlineToOpenXML' _ (Span (ident,["comment-start"],kvs) ils) = do
12121229 let ident' = fromMaybe ident (lookup "id" kvs)
12131230 kvs' = filter (("id" /=) . fst) kvs
12141231 modify $ \st -> st{ stComments = (("id",ident'):kvs', ils) : stComments st }
1215− return [ mknode "w:commentRangeStart" [("w:id", T.unpack ident')] () ]
1232+ return [ Elem $ mknode "w:commentRangeStart" [("w:id", T.unpack ident')] () ]
12161233inlineToOpenXML' _ (Span (ident,["comment-end"],kvs) _) =
12171234 -- prefer the "id" in kvs, since that is the one produced by the docx
12181235 -- reader.
12191236 let ident' = fromMaybe ident (lookup "id" kvs)
1220− in
1221− return [ mknode "w:commentRangeEnd" [("w:id", T.unpack ident')] ()
1222− , mknode "w:r" []
1223− [ mknode "w:rPr" []
1224− [ mknode "w:rStyle" [("w:val", "CommentReference")] () ]
1225− , mknode "w:commentReference" [("w:id", T.unpack ident')] () ]
1226− ]
1237+ in return . map Elem $
1238+ [ mknode "w:commentRangeEnd" [("w:id", T.unpack ident')] ()
1239+ , mknode "w:r" []
1240+ [ mknode "w:rPr" []
1241+ [ mknode "w:rStyle" [("w:val", "CommentReference")] () ]
1242+ , mknode "w:commentReference" [("w:id", T.unpack ident')] () ]
1243+ ]
12271244inlineToOpenXML' opts (Span (ident,classes,kvs) ils) = do
12281245 stylemod <- case lookup dynamicStyleKey kvs of
12291246 Just (fromString . T.unpack -> sty) -> do
@@ -1255,8 +1272,9 @@ inlineToOpenXML' opts (Span (ident,classes,kvs) ils) = do
12551272 modify $ \s -> s{stInsId = insId + 1}
12561273 return $ \f -> do
12571274 x <- f
1258− return [ mknode "w:ins"
1259− (("w:id", show insId) : changeAuthorDate) x]
1275+ return [Elem $
1276+ mknode "w:ins"
1277+ (("w:id", show insId) : changeAuthorDate) x]
12601278 else return id
12611279 delmod <- if "deletion" `elem` classes
12621280 then do
@@ -1265,8 +1283,8 @@ inlineToOpenXML' opts (Span (ident,classes,kvs) ils) = do
12651283 modify $ \s -> s{stDelId = delId + 1}
12661284 return $ \f -> local (\env->env{envInDel=True}) $ do
12671285 x <- f
1268− return [mknode "w:del"
1269− (("w:id", show delId) : changeAuthorDate) x]
1286+ return [Elem $ mknode "w:del"
1287+ (("w:id", show delId) : changeAuthorDate) x]
12701288 else return id
12711289 contents <- insmod $ delmod $ dirmod $ stylemod $ pmod
12721290 $ inlinesToOpenXML opts ils
@@ -1294,9 +1312,10 @@ inlineToOpenXML' opts (SmallCaps lst) =
12941312inlineToOpenXML' opts (Strikeout lst) =
12951313 withTextProp (mknode "w:strike" [] ())
12961314 $ inlinesToOpenXML opts lst
1297−inlineToOpenXML' _ LineBreak = return [br]
1315+inlineToOpenXML' _ LineBreak = return [Elem br]
12981316inlineToOpenXML' _ il@(RawInline f str)
1299− | f == Format "openxml" = return [ x | Elem x <- parseXML str ]
1317+ | f == Format "openxml" = return
1318+ [Text (CData CDataRaw (T.unpack str) Nothing)]
13001319 | otherwise = do
13011320 report $ InlineNotRendered il
13021321 return []
@@ -1309,13 +1328,13 @@ inlineToOpenXML' opts (Math mathType str) = do
13091328 when (mathType == DisplayMath) setFirstPara
13101329 res <- (lift . lift) (convertMath writeOMML mathType str)
13111330 case res of
1312− Right r -> return [r]
1331+ Right r -> return [Elem r]
13131332 Left il -> inlineToOpenXML' opts il
13141333inlineToOpenXML' opts (Cite _ lst) = inlinesToOpenXML opts lst
13151334inlineToOpenXML' opts (Code attrs str) = do
13161335 let alltoktypes = [KeywordTok ..]
13171336 tokTypesMap <- mapM (\tt -> (,) tt <$> rStyleM (fromString $ show tt)) alltoktypes
1318− let unhighlighted = intercalate [br] `fmap`
1337+ let unhighlighted = (map Elem . intercalate [br]) `fmap`
13191338 mapM formattedString (T.lines str)
13201339 formatOpenXML _fmtOpts = intercalate [br] . map (map toHlTok)
13211340 toHlTok (toktype,tok) =
@@ -1328,7 +1347,7 @@ inlineToOpenXML' opts (Code attrs str) = do
13281347 then unhighlighted
13291348 else case highlight (writerSyntaxMap opts)
13301349 formatOpenXML attrs str of
1331− Right h -> return h
1350+ Right h -> return (map Elem h)
13321351 Left msg -> do
13331352 unless (T.null msg) $ report $ CouldNotHighlight msg
13341353 unhighlighted
@@ -1351,14 +1370,14 @@ inlineToOpenXML' opts (Note bs) = do
13511370 $ insertNoteRef bs)
13521371 let newnote = mknode "w:footnote" [("w:id", notenum)] contents
13531372 modify $ \s -> s{ stFootnotes = newnote : notes }
1354− return [ mknode "w:r" []
1373+ return [ Elem $ mknode "w:r" []
13551374 [ mknode "w:rPr" [] footnoteStyle
13561375 , mknode "w:footnoteReference" [("w:id", notenum)] () ] ]
13571376-- internal link:
13581377inlineToOpenXML' opts (Link _ txt (T.uncons -> Just ('#', xs),_)) = do
13591378 contents <- withTextPropM (rStyleM "Hyperlink") $ inlinesToOpenXML opts txt
13601379 return
1361− [ mknode "w:hyperlink" [("w:anchor", T.unpack $ toBookmarkName xs)] contents ]
1380+ [ Elem $ mknode "w:hyperlink" [("w:anchor", T.unpack $ toBookmarkName xs)] contents ]
13621381-- external link:
13631382inlineToOpenXML' opts (Link _ txt (src,_)) = do
13641383 contents <- withTextPropM (rStyleM "Hyperlink") $ inlinesToOpenXML opts txt
@@ -1370,7 +1389,7 @@ inlineToOpenXML' opts (Link _ txt (src,_)) = do
13701389 modify $ \st -> st{ stExternalLinks =
13711390 M.insert (T.unpack src) i extlinks }
13721391 return i
1373− return [ mknode "w:hyperlink" [("r:id",id')] contents ]
1392+ return [ Elem $ mknode "w:hyperlink" [("r:id",id')] contents ]
13741393inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
13751394 pageWidth <- asks envPrintWidth
13761395 imgs <- gets stImages
@@ -1434,7 +1453,7 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
14341453 imgElt
14351454
14361455 wrapBookmark imgident =<< case stImage of
1437− Just imgData -> return [generateImgElt imgData]
1456+ Just imgData -> return [Elem $ generateImgElt imgData]
14381457 Nothing -> ( do --try
14391458 (img, mt) <- P.fetchItem src
14401459 ident <- ("rId"++) `fmap` getUniqueId
@@ -1462,7 +1481,7 @@ inlineToOpenXML' opts (Image attr@(imgident, _, _) alt (src, title)) = do
14621481 else do
14631482 -- insert mime type to use in constructing [Content_Types].xml
14641483 modify $ \st -> st { stImages = M.insert (T.unpack src) imgData $ stImages st }
1465− return [generateImgElt imgData]
1484+ return [Elem $ generateImgElt imgData]
14661485 )
14671486 `catchError` ( \e -> do
14681487 report $ CouldNotFetchResource src $ T.pack (show e)
@@ -1512,7 +1531,7 @@ withDirection x = do
15121531 , envTextProperties = EnvProps textStyle textProps'
15131532 }
15141533
1515−wrapBookmark :: (PandocMonad m) => T.Text -> [Element] -> WS m [Element]
1534+wrapBookmark :: (PandocMonad m) => T.Text -> [Content] -> WS m [Content]
15161535wrapBookmark "" contents = return contents
15171536wrapBookmark ident contents = do
15181537 id' <- getUniqueId
@@ -1520,7 +1539,7 @@ wrapBookmark ident contents = do
15201539 [("w:id", id')
15211540 ,("w:name", T.unpack $ toBookmarkName ident)] ()
15221541 bookmarkEnd = mknode "w:bookmarkEnd" [("w:id", id')] ()
1523− return $ bookmarkStart : contents ++ [bookmarkEnd]
1542+ return $ Elem bookmarkStart : contents ++ [Elem bookmarkEnd]
15241543
15251544-- Word imposes a 40 character limit on bookmark names and requires
15261545-- that they begin with a letter. So we just use a hash of the
test/Tests/Writers/Docx.hs+10
@@ -128,6 +128,16 @@ tests = [ testGroup "inlines"
128128 def
129129 "docx/codeblock.native"
130130 "docx/golden/codeblock.docx"
131+ , docxTest
132+ "raw OOXML blocks"
133+ def
134+ "docx/raw-blocks.native"
135+ "docx/golden/raw-blocks.docx"
136+ , docxTest
137+ "raw bookmark markers"
138+ def
139+ "docx/raw-bookmarks.native"
140+ "docx/golden/raw-bookmarks.docx"
131141 ]
132142 , testGroup "track changes"
133143 [ docxTest
test/docx/golden/raw-blocks.docxnew file

Binary file not shown.

test/docx/golden/raw-bookmarks.docxnew file

Binary file not shown.

test/docx/raw-blocks.nativenew file+6
@@ -0,0 +1,6 @@
1+[Para [Str "Cell",Space,Str "compartments"]
2+,RawBlock (Format "openxml") "<w:tbl>\n<w:tblPr>\n<w:tblW w:w=\"2000\" w:type=\"pct\"/>\n<w:tblBorders>\n<w:top w:val=\"single\" w:sz=\"4\" w:color=\"198200\"/>\n<w:start w:val=\"single\" w:sz=\"4\" w:color=\"198200\"/>\n<w:bottom w:val=\"single\" w:sz=\"4\" w:color=\"198200\"/>\n<w:end w:val=\"single\" w:sz=\"4\" w:color=\"198200\"/>\n</w:tblBorders>\n</w:tblPr>\n<w:tblGrid>\n<w:gridCol w:w=\"1871\" />\n<w:gridCol w:w=\"1872\" />\n</w:tblGrid>\n<w:tr>\n<w:tc>"
3+,Para [Str "Ribosome"]
4+,RawBlock (Format "openxml") "</w:tc>\n<w:tc>"
5+,Para [Str "Lysosome"]
6+,RawBlock (Format "openxml") "</w:tc>\n</w:tr>\n</w:tbl>"]
test/docx/raw-bookmarks.nativenew file+3
@@ -0,0 +1,3 @@
1+[Para [Str "Manual",Space,Str "endnotes."]
2+,Para [Str "Nullam",Space,Str "eu",Space,Str "ante",Space,Str "vel",Space,Str "est",Space,Str "convallis",Space,Str "dignissim.",Space,Str "Nunc",Space,Str "porta",Space,Str "vulputate",Space,Str "tellus.",Space,Str "Nunc",Space,Str "rutrum",Space,Str "turpis",Space,Str "sed",Space,Str "pede.",Space,Str "Sed",Space,Str "bibendum.",RawInline (Format "openxml") "<w:bookmarkStart w:id=\"0\" w:name=\"Aliquam\"/>",Str "Aliquam",Space,Str "posuere."]
3+,Para [Str "Nunc",Space,Str "aliquet,",Space,Str "augue",Space,Str "nec",Space,Str "adipiscing",Space,Str "interdum,",Space,Str "lacus",Space,Str "tellus",Space,Str "malesuada",Space,Str "massa,",Space,Str "quis",Space,Str "varius",Space,Str "mi",Space,Str "purus",Space,Str "non",Space,Str "odio.",RawInline (Format "openxml") "<w:bookmarkEnd w:id=\"0\"/>",Str "Pellentesque",Space,Str "condimentum,",Space,Str "magna",Space,Str "ut",Space,Str "suscipit",Space,Str "hendrerit,",Space,Str "ipsum",Space,Str "augue",Space,Str "ornare",Space,Str "nulla,",Space,Str "non",Space,Str "luctus",Space,Str "diam",Space,Str "neque",Space,Str "sit",Space,Str "amet",Space,Str "urna.",Space,Str "Curabitur",Space,Str "vulputate",Space,Str "vestibulum",Space,Str "lorem."]]