From 267c6f2ac71f92999e969232431ba04678e7437e Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 07:54:39 +0200 Subject: Adding upstream version 4:24.2.0. Signed-off-by: Daniel Baumann --- sw/qa/extras/README | 274 ++ .../accessibility/accessible_relation_set.cxx | 204 + sw/qa/extras/accessibility/basics.cxx | 96 + sw/qa/extras/accessibility/dialogs.cxx | 199 + sw/qa/extras/accessibility/tdf155705.cxx | 57 + .../accessibility/testdocuments/tdf155705.fodt | 130 + .../accessibility/testdocuments/unicode.fodf | 135 + sw/qa/extras/accessibility/unicode.cxx | 102 + sw/qa/extras/data/odt/test.odt | Bin 0 -> 8486 bytes sw/qa/extras/docbookexport/data/simple.docx | Bin 0 -> 3759 bytes sw/qa/extras/docbookexport/data/tdf91095.docx | Bin 0 -> 19141 bytes sw/qa/extras/docbookexport/docbookexport.cxx | 40 + sw/qa/extras/fodfexport/data/SvgImageTest.fodt | 321 ++ .../fodfexport/data/tdf113696-writerimage.odt | Bin 0 -> 18341 bytes sw/qa/extras/fodfexport/data/tdf113696.odt | Bin 0 -> 10731 bytes sw/qa/extras/fodfexport/fodfexport.cxx | 79 + sw/qa/extras/globalfilter/data/BulletAsImage.odt | Bin 0 -> 9113 bytes sw/qa/extras/globalfilter/data/SvgImageTest.odt | Bin 0 -> 13608 bytes sw/qa/extras/globalfilter/data/char_background.odt | Bin 0 -> 9737 bytes .../globalfilter/data/char_background_editing.docx | Bin 0 -> 12672 bytes sw/qa/extras/globalfilter/data/char_highlight.docx | Bin 0 -> 13213 bytes .../globalfilter/data/checkbox_form_field.odt | Bin 0 -> 8258 bytes sw/qa/extras/globalfilter/data/date_form_field.odt | Bin 0 -> 8830 bytes .../data/date_form_field_char_formatting.odt | Bin 0 -> 8432 bytes .../data/document_with_linked_graphic.odt | Bin 0 -> 21466 bytes .../globalfilter/data/document_with_two_images.odt | Bin 0 -> 204546 bytes .../globalfilter/data/dropdown_form_field.odt | Bin 0 -> 8285 bytes .../globalfilter/data/fieldmark_QUOTE_nest.docx | Bin 0 -> 13179 bytes .../globalfilter/data/fieldmark_QUOTE_nest.fodt | 133 + .../globalfilter/data/fieldmark_QUOTE_nest.rtf | 249 ++ sw/qa/extras/globalfilter/data/graphic_shape.odt | Bin 0 -> 100009 bytes .../globalfilter/data/images_with_special_IDs.odt | Bin 0 -> 169464 bytes sw/qa/extras/globalfilter/data/linked_graphic.jpg | Bin 0 -> 35738 bytes .../data/multiple_identical_graphics.odt | Bin 0 -> 13826 bytes sw/qa/extras/globalfilter/data/skipimages.doc | Bin 0 -> 19968 bytes sw/qa/extras/globalfilter/data/skipimages.docx | Bin 0 -> 10925 bytes .../data/tdf138345_charstyle_highlight.odt | Bin 0 -> 13304 bytes sw/qa/extras/globalfilter/data/tdf143311-1.docx | Bin 0 -> 34371 bytes sw/qa/extras/globalfilter/data/text13e.odt | Bin 0 -> 9718 bytes sw/qa/extras/globalfilter/data/text_form_field.odt | Bin 0 -> 8376 bytes sw/qa/extras/globalfilter/globalfilter.cxx | 2267 +++++++++++ sw/qa/extras/htmlexport/data/HTMLImage.odt | Bin 0 -> 9721 bytes sw/qa/extras/htmlexport/data/NestingInA1.fodt | 47 + sw/qa/extras/htmlexport/data/TableWithIndent.fodt | 22 + sw/qa/extras/htmlexport/data/charborder.odt | Bin 0 -> 7773 bytes .../htmlexport/data/checkbox-radiobutton.doc | Bin 0 -> 35328 bytes sw/qa/extras/htmlexport/data/clearing-break.html | 8 + sw/qa/extras/htmlexport/data/embedded_formula.fodt | 30 + sw/qa/extras/htmlexport/data/extb.html | 10 + sw/qa/extras/htmlexport/data/fdo62336.docx | Bin 0 -> 21361 bytes sw/qa/extras/htmlexport/data/fdo81276.html | 21 + sw/qa/extras/htmlexport/data/fdo86857.html | 29 + sw/qa/extras/htmlexport/data/field-shade-reqif.odt | Bin 0 -> 8903 bytes sw/qa/extras/htmlexport/data/field-shade.odt | Bin 0 -> 8592 bytes sw/qa/extras/htmlexport/data/frameWithText.fodt | 25 + sw/qa/extras/htmlexport/data/hello.html | 8 + .../data/image_anchored_to_paragraph_no_wrap.fodt | 20 + sw/qa/extras/htmlexport/data/list.html | 4 + .../extras/htmlexport/data/listItemSubheader.fodt | 31 + .../extras/htmlexport/data/listsWithNumFormat.fodt | 74 + sw/qa/extras/htmlexport/data/no-ole2-pres-data.odt | Bin 0 -> 25483 bytes .../extras/htmlexport/data/ole1-pres-data-wmf.odt | Bin 0 -> 41595 bytes sw/qa/extras/htmlexport/data/ole2.odt | Bin 0 -> 19450 bytes sw/qa/extras/htmlexport/data/ole2.ole | 1014 +++++ sw/qa/extras/htmlexport/data/ole2.png | Bin 0 -> 766 bytes .../htmlexport/data/paint-ole-bitmap-format.odt | Bin 0 -> 21219 bytes sw/qa/extras/htmlexport/data/paint-ole.ole | 199 + sw/qa/extras/htmlexport/data/paint-ole.png | Bin 0 -> 1505 bytes sw/qa/extras/htmlexport/data/paint-ole.xhtml | 9 + sw/qa/extras/htmlexport/data/pdf-ole.odt | Bin 0 -> 41839 bytes .../htmlexport/data/reqif-aschar-objsize.odt | Bin 0 -> 70411 bytes sw/qa/extras/htmlexport/data/reqif-chinese.odt | Bin 0 -> 8350 bytes sw/qa/extras/htmlexport/data/reqif-jpg-img.xhtml | 4 + sw/qa/extras/htmlexport/data/reqif-list.xhtml | 11 + sw/qa/extras/htmlexport/data/reqif-no-lang.odt | Bin 0 -> 8340 bytes .../data/reqif-objdata-presentationdatasize.odt | Bin 0 -> 95777 bytes sw/qa/extras/htmlexport/data/reqif-ole-data.ole | 1 + sw/qa/extras/htmlexport/data/reqif-ole-data.xhtml | 3 + sw/qa/extras/htmlexport/data/reqif-ole-img.jpg | Bin 0 -> 696 bytes sw/qa/extras/htmlexport/data/reqif-ole-img.png | Bin 0 -> 766 bytes sw/qa/extras/htmlexport/data/reqif-ole-img.xhtml | 6 + sw/qa/extras/htmlexport/data/reqif-ole-nodata.odt | Bin 0 -> 8178 bytes sw/qa/extras/htmlexport/data/reqif-ole-odg.ole | 146 + sw/qa/extras/htmlexport/data/reqif-ole-odg.png | Bin 0 -> 1486 bytes sw/qa/extras/htmlexport/data/reqif-ole-odg.xhtml | 9 + sw/qa/extras/htmlexport/data/reqif-ole2.xhtml | 5 + sw/qa/extras/htmlexport/data/reqif-p.xhtml | 8 + sw/qa/extras/htmlexport/data/reqif-png-img.xhtml | 4 + sw/qa/extras/htmlexport/data/reqif-table.xhtml | 9 + sw/qa/extras/htmlexport/data/reqif-table2.odt | Bin 0 -> 8489 bytes .../htmlexport/data/reqif-transparent-tif-img.odt | Bin 0 -> 13339 bytes .../data/skipimage-embedded-document.docx | Bin 0 -> 21379 bytes .../extras/htmlexport/data/skipimage-embedded.doc | Bin 0 -> 35840 bytes sw/qa/extras/htmlexport/data/sub_li_and_ctd.fodt | 33 + sw/qa/extras/htmlexport/data/tableRight.fodt | 22 + .../extras/htmlexport/data/table_cell_padding.fodt | 34 + .../data/table_with_wide_horizontal_border.fodt | 27 + sw/qa/extras/htmlexport/data/tdf126879.odt | Bin 0 -> 8250 bytes sw/qa/extras/htmlexport/data/tdf132739.odt | Bin 0 -> 8832 bytes sw/qa/extras/htmlexport/data/tdf155871.fodt | 21 + sw/qa/extras/htmlexport/data/tdf66822.odt | Bin 0 -> 10294 bytes sw/qa/extras/htmlexport/data/tdf76291.odt | Bin 0 -> 10342 bytes sw/qa/extras/htmlexport/data/tdf83890.odt | Bin 0 -> 9292 bytes sw/qa/extras/htmlexport/data/tdf90905.odt | Bin 0 -> 12166 bytes .../htmlexport/data/test_no_space_preserve.fodt | 25 + sw/qa/extras/htmlexport/data/textAndImage.docx | Bin 0 -> 6037 bytes sw/qa/extras/htmlexport/data/transparent-image.odt | Bin 0 -> 12432 bytes sw/qa/extras/htmlexport/data/transparent.png | Bin 0 -> 2950 bytes .../htmlexport/data/twoListsWithSameStyle.fodt | 19 + sw/qa/extras/htmlexport/data/xhtml-css.odt | Bin 0 -> 8559 bytes sw/qa/extras/htmlexport/htmlexport.cxx | 3037 ++++++++++++++ sw/qa/extras/htmlexport/xhtmlexport.cxx | 187 + .../htmlimport/data/PageAndParagraphFilled.html | 45 + .../data/allowed-rtf-ole-mime-types.xhtml | 5 + sw/qa/extras/htmlimport/data/data.ole | 1 + sw/qa/extras/htmlimport/data/emojis16BE.html | Bin 0 -> 142 bytes sw/qa/extras/htmlimport/data/green-highlight.html | 1 + sw/qa/extras/htmlimport/data/hidden-textframe.html | 8 + sw/qa/extras/htmlimport/data/image-lazy-read.html | 11 + sw/qa/extras/htmlimport/data/image-size.html | 25 + sw/qa/extras/htmlimport/data/image-width-auto.html | 40 + sw/qa/extras/htmlimport/data/inlined_image.html | 21 + sw/qa/extras/htmlimport/data/libreoffice.jpg | Bin 0 -> 6065 bytes sw/qa/extras/htmlimport/data/list-style.html | 58 + .../extras/htmlimport/data/meta-ISO8601-dates.html | 20 + sw/qa/extras/htmlimport/data/meta-changedby.html | 21 + sw/qa/extras/htmlimport/data/ole-data.xhtml | 7 + sw/qa/extras/htmlimport/data/ole-data2.xhtml | 12 + sw/qa/extras/htmlimport/data/ole-img-svg.xhtml | 7 + sw/qa/extras/htmlimport/data/ole-img.xhtml | 7 + sw/qa/extras/htmlimport/data/ole2.gif | Bin 0 -> 521 bytes sw/qa/extras/htmlimport/data/ole2.ole | 1014 +++++ sw/qa/extras/htmlimport/data/ole2.png | Bin 0 -> 766 bytes sw/qa/extras/htmlimport/data/ole2.svg | 3 + sw/qa/extras/htmlimport/data/outline-level.html | 5 + sw/qa/extras/htmlimport/data/picture.html | 20 + sw/qa/extras/htmlimport/data/reqif-br.xhtml | 1 + .../extras/htmlimport/data/reqif-page-style.xhtml | 1 + sw/qa/extras/htmlimport/data/reqif-table.xhtml | 79 + sw/qa/extras/htmlimport/data/table_border_1px.html | 22 + sw/qa/extras/htmlimport/data/tdf118579.html | 67 + sw/qa/extras/htmlimport/data/tdf122789.html | 7 + sw/qa/extras/htmlimport/data/tdf142781.html | 3 + sw/qa/extras/htmlimport/data/tdf153341.html | 13 + sw/qa/extras/htmlimport/data/tdf154273.html | 9 + sw/qa/extras/htmlimport/data/tdf155011.html | 31 + .../extras/htmlimport/data/tdf80194_subscript.html | 4 + sw/qa/extras/htmlimport/htmlimport.cxx | 616 +++ sw/qa/extras/indexing/IndexingExportTest.cxx | 318 ++ sw/qa/extras/indexing/SearchResultLocatorTest.cxx | 184 + .../indexing/data/IndexingExport_Fontwork.odt | Bin 0 -> 12090 bytes .../indexing/data/IndexingExport_Header_Footer.odt | Bin 0 -> 9644 bytes .../extras/indexing/data/IndexingExport_Images.odt | Bin 0 -> 14607 bytes sw/qa/extras/indexing/data/IndexingExport_OLE.odt | Bin 0 -> 14358 bytes .../indexing/data/IndexingExport_Sections.odt | Bin 0 -> 10245 bytes .../extras/indexing/data/IndexingExport_Shapes.odt | Bin 0 -> 11209 bytes .../extras/indexing/data/IndexingExport_Tables.odt | Bin 0 -> 10748 bytes .../data/IndexingExport_VariousParagraphs.odt | Bin 0 -> 11111 bytes sw/qa/extras/layout/README | 2 + sw/qa/extras/layout/data/Hyphenated-link.fodt | 254 ++ sw/qa/extras/layout/data/Hyphenated-link.rtf | 41 + sw/qa/extras/layout/data/LIBREOFFICE-N4LA0OHZ.rtf | 347 ++ sw/qa/extras/layout/data/LIBREOFFICE-UXTSOREL.rtf | Bin 0 -> 108970 bytes sw/qa/extras/layout/data/Tdf121509.odt | Bin 0 -> 9984 bytes sw/qa/extras/layout/data/TextBoxFrame.odt | Bin 0 -> 9414 bytes sw/qa/extras/layout/data/abi11870-2.odt | Bin 0 -> 117201 bytes sw/qa/extras/layout/data/btlr-cell.odt | Bin 0 -> 9223 bytes sw/qa/extras/layout/data/changed_table_rows.fodt | 203 + sw/qa/extras/layout/data/endOfLineComments.odt | Bin 0 -> 10823 bytes sw/qa/extras/layout/data/fdo43573-2-min.docx | Bin 0 -> 60965 bytes sw/qa/extras/layout/data/fdo56797-2-min.odt | Bin 0 -> 13111 bytes sw/qa/extras/layout/data/fld-in-tbl.docx | Bin 0 -> 12615 bytes sw/qa/extras/layout/data/footer-fly-table.fodt | 1158 ++++++ .../layout/data/forcepoint-swfootnoteframe-1.rtf | 1 + sw/qa/extras/layout/data/forcepoint100.html | Bin 0 -> 21528 bytes sw/qa/extras/layout/data/forcepoint102.rtf | 178 + sw/qa/extras/layout/data/forcepoint103.html | Bin 0 -> 13413 bytes sw/qa/extras/layout/data/forcepoint72-1.rtf | Bin 0 -> 5734 bytes sw/qa/extras/layout/data/forcepoint75-1.rtf | Bin 0 -> 88709 bytes sw/qa/extras/layout/data/forcepoint76-1.rtf | 3388 ++++++++++++++++ sw/qa/extras/layout/data/forcepoint89.html | Bin 0 -> 3321 bytes sw/qa/extras/layout/data/forcepoint90.rtf | 1 + sw/qa/extras/layout/data/forcepoint91.html | Bin 0 -> 49256 bytes sw/qa/extras/layout/data/forcepoint92.doc | Bin 0 -> 29200 bytes sw/qa/extras/layout/data/forcepoint93-1.rtf | Bin 0 -> 88310 bytes sw/qa/extras/layout/data/forcepoint93-2.rtf | Bin 0 -> 5456 bytes sw/qa/extras/layout/data/forcepoint94.html | Bin 0 -> 12370 bytes sw/qa/extras/layout/data/forcepoint98.html | Bin 0 -> 7171 bytes sw/qa/extras/layout/data/forcepoint99.html | Bin 0 -> 14035 bytes .../extras/layout/data/hidden-para-separator.docx | Bin 0 -> 11739 bytes sw/qa/extras/layout/data/horizontal_multilevel.odt | Bin 0 -> 13425 bytes sw/qa/extras/layout/data/image-comment.odt | Bin 0 -> 10445 bytes sw/qa/extras/layout/data/in_056132_mod.odt | Bin 0 -> 13647 bytes sw/qa/extras/layout/data/keep-with-next-fly.fodt | 146 + sw/qa/extras/layout/data/legend-itemorder-min.docx | Bin 0 -> 27053 bytes .../layout/data/linked_frames_section_bug.odt | Bin 0 -> 13663 bytes sw/qa/extras/layout/data/long_legendentry.docx | Bin 0 -> 24393 bytes .../extras/layout/data/no-line-break-at-slash.fodt | 50 + sw/qa/extras/layout/data/ofz64109-1.fodt | Bin 0 -> 3899 bytes .../layout/data/outside_long_data_label.docx | Bin 0 -> 27245 bytes sw/qa/extras/layout/data/piechart_leaderline.odt | Bin 0 -> 15625 bytes sw/qa/extras/layout/data/redline_charatr.fodt | 164 + .../layout/data/redline_footnote_pagination.fodt | 792 ++++ sw/qa/extras/layout/data/redline_footnotes.odt | Bin 0 -> 9004 bytes sw/qa/extras/layout/data/redline_sections.fodt | 110 + sw/qa/extras/layout/data/redline_table.fodt | 128 + sw/qa/extras/layout/data/s4_min2.fodt | 360 ++ sw/qa/extras/layout/data/space+break.fodt | 50 + .../data/stable-at-page-anchored-fly-position.odt | Bin 0 -> 11244 bytes sw/qa/extras/layout/data/tab-over-margin.odt | Bin 0 -> 15051 bytes .../extras/layout/data/tabellen_test_windows_1.odt | Bin 0 -> 11954 bytes sw/qa/extras/layout/data/table-extrusion1.odt | Bin 0 -> 9234 bytes sw/qa/extras/layout/data/table-extrusion2.odt | Bin 0 -> 9259 bytes sw/qa/extras/layout/data/table_cell_overlap.fodt | 161 + sw/qa/extras/layout/data/table_in_text_change.fodt | 66 + sw/qa/extras/layout/data/tdf104797.docx | Bin 0 -> 11710 bytes sw/qa/extras/layout/data/tdf105481.odt | Bin 0 -> 26172 bytes sw/qa/extras/layout/data/tdf106153.docx | Bin 0 -> 10461 bytes sw/qa/extras/layout/data/tdf106234.fodt | 31 + sw/qa/extras/layout/data/tdf106390.odt | Bin 0 -> 13081 bytes sw/qa/extras/layout/data/tdf108021.odt | Bin 0 -> 14663 bytes sw/qa/extras/layout/data/tdf109077.docx | Bin 0 -> 13945 bytes sw/qa/extras/layout/data/tdf109137.docx | Bin 0 -> 19429 bytes sw/qa/extras/layout/data/tdf112290.docx | Bin 0 -> 13174 bytes sw/qa/extras/layout/data/tdf113014.fodt | 108 + sw/qa/extras/layout/data/tdf114163.odt | Bin 0 -> 17376 bytes sw/qa/extras/layout/data/tdf115094.docx | Bin 0 -> 31044 bytes sw/qa/extras/layout/data/tdf115523.fodt | 42 + sw/qa/extras/layout/data/tdf115524.fodt | 44 + sw/qa/extras/layout/data/tdf115630.docx | Bin 0 -> 26224 bytes sw/qa/extras/layout/data/tdf116256.docx | Bin 0 -> 21085 bytes sw/qa/extras/layout/data/tdf116486.docx | Bin 0 -> 21691 bytes sw/qa/extras/layout/data/tdf116501.odt | Bin 0 -> 51229 bytes sw/qa/extras/layout/data/tdf116830.odt | Bin 0 -> 8963 bytes sw/qa/extras/layout/data/tdf116848.odt | Bin 0 -> 12329 bytes sw/qa/extras/layout/data/tdf116925.docx | Bin 0 -> 13476 bytes sw/qa/extras/layout/data/tdf117028.docx | Bin 0 -> 13619 bytes sw/qa/extras/layout/data/tdf117187.odt | Bin 0 -> 9673 bytes sw/qa/extras/layout/data/tdf117188.docx | Bin 0 -> 1857 bytes sw/qa/extras/layout/data/tdf117245.odt | Bin 0 -> 10142 bytes sw/qa/extras/layout/data/tdf117923.doc | Bin 0 -> 29696 bytes sw/qa/extras/layout/data/tdf117923.docx | Bin 0 -> 21227 bytes sw/qa/extras/layout/data/tdf117982.docx | Bin 0 -> 9700 bytes sw/qa/extras/layout/data/tdf118058.fodt | 37 + sw/qa/extras/layout/data/tdf118672.odt | Bin 0 -> 10205 bytes sw/qa/extras/layout/data/tdf119875.odt | Bin 0 -> 7314 bytes sw/qa/extras/layout/data/tdf120287.fodt | 40 + sw/qa/extras/layout/data/tdf120287b.fodt | 45 + sw/qa/extras/layout/data/tdf120287c.fodt | 46 + sw/qa/extras/layout/data/tdf121658.odt | Bin 0 -> 19195 bytes sw/qa/extras/layout/data/tdf122014.docx | Bin 0 -> 27324 bytes sw/qa/extras/layout/data/tdf122225.docx | Bin 0 -> 25656 bytes sw/qa/extras/layout/data/tdf122607.odt | Bin 0 -> 23271 bytes sw/qa/extras/layout/data/tdf122607_leerzeile.odt | Bin 0 -> 23398 bytes sw/qa/extras/layout/data/tdf122800.odt | Bin 0 -> 14018 bytes sw/qa/extras/layout/data/tdf122878.docx | Bin 0 -> 17740 bytes sw/qa/extras/layout/data/tdf123163-1.docx | Bin 0 -> 25730 bytes sw/qa/extras/layout/data/tdf123268.odt | Bin 0 -> 12629 bytes sw/qa/extras/layout/data/tdf123651.docx | Bin 0 -> 34012 bytes sw/qa/extras/layout/data/tdf123898.odt | Bin 0 -> 9642 bytes sw/qa/extras/layout/data/tdf124261.docx | Bin 0 -> 22327 bytes sw/qa/extras/layout/data/tdf124423.docx | Bin 0 -> 12054 bytes sw/qa/extras/layout/data/tdf124423.odt | Bin 0 -> 4863 bytes sw/qa/extras/layout/data/tdf124600.docx | Bin 0 -> 16899 bytes sw/qa/extras/layout/data/tdf124601.doc | Bin 0 -> 23552 bytes sw/qa/extras/layout/data/tdf124601b.doc | Bin 0 -> 62976 bytes sw/qa/extras/layout/data/tdf124796.odt | Bin 0 -> 14342 bytes sw/qa/extras/layout/data/tdf125300.docx | Bin 0 -> 14147 bytes sw/qa/extras/layout/data/tdf125334.odt | Bin 0 -> 16170 bytes sw/qa/extras/layout/data/tdf125335.odt | Bin 0 -> 17360 bytes sw/qa/extras/layout/data/tdf125893.docx | Bin 0 -> 23032 bytes sw/qa/extras/layout/data/tdf126244.docx | Bin 0 -> 25928 bytes sw/qa/extras/layout/data/tdf127118.docx | Bin 0 -> 10819 bytes sw/qa/extras/layout/data/tdf127235.odt | Bin 0 -> 3239 bytes sw/qa/extras/layout/data/tdf127304.odt | Bin 0 -> 13381 bytes sw/qa/extras/layout/data/tdf128198-1.docx | Bin 0 -> 17048 bytes sw/qa/extras/layout/data/tdf128399.docx | Bin 0 -> 13132 bytes sw/qa/extras/layout/data/tdf128611.fodt | 77 + sw/qa/extras/layout/data/tdf128959.docx | Bin 0 -> 24490 bytes sw/qa/extras/layout/data/tdf128966-2-min.odt | Bin 0 -> 14185 bytes sw/qa/extras/layout/data/tdf128996.docx | Bin 0 -> 26061 bytes sw/qa/extras/layout/data/tdf129054.docx | Bin 0 -> 25456 bytes sw/qa/extras/layout/data/tdf129095.docx | Bin 0 -> 26028 bytes sw/qa/extras/layout/data/tdf129357.fodt | 48 + sw/qa/extras/layout/data/tdf130031.docx | Bin 0 -> 27382 bytes sw/qa/extras/layout/data/tdf130088.docx | Bin 0 -> 16961 bytes sw/qa/extras/layout/data/tdf130218.fodt | 86 + sw/qa/extras/layout/data/tdf130242.odt | Bin 0 -> 13515 bytes sw/qa/extras/layout/data/tdf130380.docx | Bin 0 -> 28262 bytes sw/qa/extras/layout/data/tdf130969.docx | Bin 0 -> 26299 bytes sw/qa/extras/layout/data/tdf131707_flyWrap.doc | Bin 0 -> 41472 bytes sw/qa/extras/layout/data/tdf132956.docx | Bin 0 -> 25937 bytes sw/qa/extras/layout/data/tdf133005.odt | Bin 0 -> 13251 bytes sw/qa/extras/layout/data/tdf134146.docx | Bin 0 -> 27259 bytes sw/qa/extras/layout/data/tdf134235.docx | Bin 0 -> 27348 bytes sw/qa/extras/layout/data/tdf134277.docx | Bin 0 -> 15350 bytes sw/qa/extras/layout/data/tdf134298.ott | Bin 0 -> 40880 bytes sw/qa/extras/layout/data/tdf134463.docx | Bin 0 -> 11999 bytes sw/qa/extras/layout/data/tdf134472.odt | Bin 0 -> 13403 bytes sw/qa/extras/layout/data/tdf134548.odt | Bin 0 -> 10592 bytes sw/qa/extras/layout/data/tdf134659.docx | Bin 0 -> 25623 bytes sw/qa/extras/layout/data/tdf134676.docx | Bin 0 -> 27317 bytes sw/qa/extras/layout/data/tdf134685.docx | Bin 0 -> 23322 bytes sw/qa/extras/layout/data/tdf134866.docx | Bin 0 -> 27169 bytes sw/qa/extras/layout/data/tdf135035.docx | Bin 0 -> 13724 bytes sw/qa/extras/layout/data/tdf135035.odt | Bin 0 -> 9562 bytes sw/qa/extras/layout/data/tdf135991.odt | Bin 0 -> 12299 bytes sw/qa/extras/layout/data/tdf136061.docx | Bin 0 -> 25928 bytes sw/qa/extras/layout/data/tdf136588.docx | Bin 0 -> 17297 bytes sw/qa/extras/layout/data/tdf136613.docx | Bin 0 -> 25224 bytes sw/qa/extras/layout/data/tdf136816.odt | Bin 0 -> 14115 bytes sw/qa/extras/layout/data/tdf137025.docx | Bin 0 -> 14726 bytes sw/qa/extras/layout/data/tdf137116.docx | Bin 0 -> 17637 bytes sw/qa/extras/layout/data/tdf137154.docx | Bin 0 -> 27388 bytes sw/qa/extras/layout/data/tdf137185.odt | Bin 0 -> 9657 bytes sw/qa/extras/layout/data/tdf137523-1-min.fodt | 319 ++ sw/qa/extras/layout/data/tdf137819.fodt | 284 ++ sw/qa/extras/layout/data/tdf138018.docx | Bin 0 -> 27131 bytes sw/qa/extras/layout/data/tdf138039.odt | Bin 0 -> 29534 bytes sw/qa/extras/layout/data/tdf138465min.docx | Bin 0 -> 19331 bytes sw/qa/extras/layout/data/tdf138592-a-acute.fodt | 31 + sw/qa/extras/layout/data/tdf138773.docx | Bin 0 -> 26209 bytes sw/qa/extras/layout/data/tdf138782.docx | Bin 0 -> 17574 bytes sw/qa/extras/layout/data/tdf138951.odt | Bin 0 -> 9894 bytes ...6_ColumnsWithFootnoteDoNotOccupyEntirePage.docx | Bin 0 -> 17622 bytes sw/qa/extras/layout/data/tdf141079.odt | Bin 0 -> 8787 bytes sw/qa/extras/layout/data/tdf141220.docx | Bin 0 -> 10459 bytes sw/qa/extras/layout/data/tdf142694-1.odt | Bin 0 -> 32867 bytes sw/qa/extras/layout/data/tdf143239-1-min.odt | Bin 0 -> 20308 bytes sw/qa/extras/layout/data/tdf144057.fodt | 387 ++ sw/qa/extras/layout/data/tdf145719.odt | Bin 0 -> 12051 bytes sw/qa/extras/layout/data/tdf145826.odt | Bin 0 -> 21108 bytes sw/qa/extras/layout/data/tdf146272.odt | Bin 0 -> 183377 bytes .../layout/data/tdf146704_EndnoteInSection.odt | Bin 0 -> 9426 bytes sw/qa/extras/layout/data/tdf147485-forcepoint.docx | Bin 0 -> 65646 bytes sw/qa/extras/layout/data/tdf148897.odt | Bin 0 -> 13404 bytes sw/qa/extras/layout/data/tdf149248.odt | Bin 0 -> 20313 bytes sw/qa/extras/layout/data/tdf149324.odt | Bin 0 -> 20206 bytes sw/qa/extras/layout/data/tdf149420.odt | Bin 0 -> 38885 bytes sw/qa/extras/layout/data/tdf149709.fodt | 41 + sw/qa/extras/layout/data/tdf149710.fodt | 31 + sw/qa/extras/layout/data/tdf149711.docx | Bin 0 -> 13619 bytes sw/qa/extras/layout/data/tdf150200.docx | Bin 0 -> 14090 bytes sw/qa/extras/layout/data/tdf150200.odt | Bin 0 -> 37464 bytes sw/qa/extras/layout/data/tdf150438.docx | Bin 0 -> 12185 bytes sw/qa/extras/layout/data/tdf150438.odt | Bin 0 -> 21339 bytes sw/qa/extras/layout/data/tdf150606-1-min.odt | Bin 0 -> 52456 bytes sw/qa/extras/layout/data/tdf150642.odt | Bin 0 -> 9487 bytes sw/qa/extras/layout/data/tdf150717.odt | Bin 0 -> 10603 bytes sw/qa/extras/layout/data/tdf150790.fodt | 9 + sw/qa/extras/layout/data/tdf151954.docx | Bin 0 -> 12688 bytes sw/qa/extras/layout/data/tdf152031-stair.odt | Bin 0 -> 9625 bytes .../extras/layout/data/tdf152085-section-tblr.odt | Bin 0 -> 8626 bytes sw/qa/extras/layout/data/tdf152106.odt | Bin 0 -> 13518 bytes sw/qa/extras/layout/data/tdf152307.odt | Bin 0 -> 54963 bytes sw/qa/extras/layout/data/tdf152413.fodt | 117 + sw/qa/extras/layout/data/tdf152983-1-min.docx | Bin 0 -> 100691 bytes sw/qa/extras/layout/data/tdf153136.docx | Bin 0 -> 16667 bytes sw/qa/extras/layout/data/tdf155177-1-min.odt | Bin 0 -> 7797 bytes .../data/tdf155611_table_and_nested_section.fodt | 33 + sw/qa/extras/layout/data/tdf156725.fodt | 163 + .../extras/layout/data/tdf159050-wrap-adjust.fodt | 25 + sw/qa/extras/layout/data/tdf159085.fodt | 61 + sw/qa/extras/layout/data/tdf40260.odt | Bin 0 -> 17192 bytes sw/qa/extras/layout/data/tdf42748.fodt | 57 + ...olumnsWithFootnoteDoNotOccupyEntirePage_New.odt | Bin 0 -> 10799 bytes ...olumnsWithFootnoteDoNotOccupyEntirePage_Old.odt | Bin 0 -> 10216 bytes sw/qa/extras/layout/data/tdf54819.fodt | 9 + sw/qa/extras/layout/data/tdf64222.docx | Bin 0 -> 11201 bytes sw/qa/extras/layout/data/tdf69647_images.odt | Bin 0 -> 13188 bytes sw/qa/extras/layout/data/tdf69647_text.docx | Bin 0 -> 5353 bytes sw/qa/extras/layout/data/tdf69648.docx | Bin 0 -> 26434 bytes sw/qa/extras/layout/data/tdf72727.odt | Bin 0 -> 13943 bytes sw/qa/extras/layout/data/tdf75659.docx | Bin 0 -> 25109 bytes sw/qa/extras/layout/data/tdf85610.fodt | 56 + sw/qa/extras/layout/data/tdf88496.docx | Bin 0 -> 25175 bytes .../layout/data/testAreaChartNumberFormat.docx | Bin 0 -> 26115 bytes .../extras/layout/data/testTruncatedAxisLabel.odt | Bin 0 -> 13764 bytes sw/qa/extras/layout/data/three_sections.fodt | 18 + .../extras/layout/data/tox-update-wrong-pages.odt | Bin 0 -> 18234 bytes .../layout/data/user-field-type-language.fodt | 21 + sw/qa/extras/layout/data/wideBoxInFootnote.fodt | 24 + .../layout/data/writer-image-no-capture.docx | Bin 0 -> 14531 bytes sw/qa/extras/layout/data/xaxis-labelbreak.docx | Bin 0 -> 27222 bytes sw/qa/extras/layout/layout.cxx | 3726 ++++++++++++++++++ sw/qa/extras/layout/layout2.cxx | 3037 ++++++++++++++ sw/qa/extras/layout/layout3.cxx | 2258 +++++++++++ .../data/10-testing-addresses-writer-merged.odt | Bin 0 -> 12810 bytes .../mailmerge/data/10-testing-addresses-writer.odt | Bin 0 -> 12849 bytes .../extras/mailmerge/data/10-testing-addresses.ods | Bin 0 -> 14816 bytes sw/qa/extras/mailmerge/data/4_v01.ods | Bin 0 -> 18847 bytes sw/qa/extras/mailmerge/data/5-with-blanks.ods | Bin 0 -> 9193 bytes sw/qa/extras/mailmerge/data/bookmarkcondition.fodt | 91 + sw/qa/extras/mailmerge/data/bookmarkcondition.ods | Bin 0 -> 6881 bytes sw/qa/extras/mailmerge/data/db_pagecounttest.ods | Bin 0 -> 9154 bytes sw/qa/extras/mailmerge/data/empty.odt | Bin 0 -> 7241 bytes sw/qa/extras/mailmerge/data/grabbagtest.docx | Bin 0 -> 11920 bytes sw/qa/extras/mailmerge/data/linked-labels.odt | Bin 0 -> 10918 bytes .../mailmerge/data/linked-with-condition.odt | Bin 0 -> 9193 bytes .../mailmerge/data/missing-default-line-color.ott | Bin 0 -> 15093 bytes .../data/multiple-page-anchored-draws.odt | Bin 0 -> 9257 bytes sw/qa/extras/mailmerge/data/one-empty-address.ods | Bin 0 -> 8013 bytes sw/qa/extras/mailmerge/data/onecell.xlsx | Bin 0 -> 4846 bytes sw/qa/extras/mailmerge/data/pagecounttest.ott | Bin 0 -> 12132 bytes sw/qa/extras/mailmerge/data/section_ps.odt | Bin 0 -> 9011 bytes .../extras/mailmerge/data/sections_first_last.odt | Bin 0 -> 9010 bytes .../mailmerge/data/simple-mail-merge-2pages.odt | Bin 0 -> 8616 bytes sw/qa/extras/mailmerge/data/simple-mail-merge.odt | Bin 0 -> 8363 bytes sw/qa/extras/mailmerge/data/tdf118113.ods | Bin 0 -> 7637 bytes sw/qa/extras/mailmerge/data/tdf118113.odt | Bin 0 -> 21041 bytes sw/qa/extras/mailmerge/data/tdf118845.fodt | 28 + sw/qa/extras/mailmerge/data/tdf125522.odt | Bin 0 -> 9794 bytes sw/qa/extras/mailmerge/data/tdf128148.odt | Bin 0 -> 9289 bytes sw/qa/extras/mailmerge/data/tdf35798-legacy.fodt | 37 + sw/qa/extras/mailmerge/data/tdf35798-legacy.odt | Bin 0 -> 9557 bytes sw/qa/extras/mailmerge/data/tdf35798-new.fodt | 38 + sw/qa/extras/mailmerge/data/tdf35798-new.odt | Bin 0 -> 9556 bytes sw/qa/extras/mailmerge/data/tdf62364.odt | Bin 0 -> 9832 bytes sw/qa/extras/mailmerge/data/tdf78611.odt | Bin 0 -> 14517 bytes sw/qa/extras/mailmerge/data/tdf81750.odt | Bin 0 -> 9460 bytes sw/qa/extras/mailmerge/data/tdf89214.odt | Bin 0 -> 9832 bytes sw/qa/extras/mailmerge/data/tdf92623.odt | Bin 0 -> 12615 bytes sw/qa/extras/mailmerge/data/writer-mail-merge.odt | Bin 0 -> 8410 bytes .../mailmerge/data/writer-merged-mail-merge.odt | Bin 0 -> 8421 bytes sw/qa/extras/mailmerge/mailmerge.cxx | 951 +++++ sw/qa/extras/mailmerge/mailmerge2.cxx | 750 ++++ sw/qa/extras/odfexport/data/2_MathType3.docx | Bin 0 -> 15260 bytes .../odfexport/data/CrossRefHeadingBookmark.fodt | 120 + sw/qa/extras/odfexport/data/Custom-Style-TOC.docx | Bin 0 -> 13994 bytes .../data/Formcontrol needs high z-index.odt | Bin 0 -> 25828 bytes sw/qa/extras/odfexport/data/IsLegal.fodt | 28 + sw/qa/extras/odfexport/data/MadeByLO7.odt | Bin 0 -> 17354 bytes .../odfexport/data/ParagraphMarkerMarkup.fodt | 22 + sw/qa/extras/odfexport/data/WordTest_edit.odt | Bin 0 -> 6496 bytes sw/qa/extras/odfexport/data/allow-overlap.odt | Bin 0 -> 9853 bytes .../odfexport/data/arabic-zero-numbering.odt | Bin 0 -> 8730 bytes .../odfexport/data/arabic-zero3-numbering.odt | Bin 0 -> 9166 bytes .../odfexport/data/arabic-zero4-numbering.odt | Bin 0 -> 8702 bytes .../odfexport/data/arabic-zero5-numbering.odt | Bin 0 -> 8779 bytes sw/qa/extras/odfexport/data/border_types.odt | Bin 0 -> 10656 bytes sw/qa/extras/odfexport/data/btlr-cell.odt | Bin 0 -> 9174 bytes sw/qa/extras/odfexport/data/btlr-frame.odt | Bin 0 -> 8564 bytes .../odfexport/data/chapter-number-new-line.odt | Bin 0 -> 8649 bytes sw/qa/extras/odfexport/data/charborder.odt | Bin 0 -> 8704 bytes .../extras/odfexport/data/embedded-font-props.odt | Bin 0 -> 8097 bytes sw/qa/extras/odfexport/data/embedded-pdf.odt | Bin 0 -> 23502 bytes sw/qa/extras/odfexport/data/fdo38244.odt | Bin 0 -> 10334 bytes sw/qa/extras/odfexport/data/fdo43807.odt | Bin 0 -> 7630 bytes sw/qa/extras/odfexport/data/fdo58949.docx | Bin 0 -> 26510 bytes sw/qa/extras/odfexport/data/fdo60769.odt | Bin 0 -> 9482 bytes sw/qa/extras/odfexport/data/fdo79358.odt | Bin 0 -> 9356 bytes sw/qa/extras/odfexport/data/fdo86963.odt | Bin 0 -> 39845 bytes sw/qa/extras/odfexport/data/fillbitmap3.odt | Bin 0 -> 10748 bytes .../data/footnote-collect-at-end-of-section.fodt | 192 + sw/qa/extras/odfexport/data/framebackgrounds.odt | Bin 0 -> 14327 bytes sw/qa/extras/odfexport/data/gerrit13858.odt | Bin 0 -> 10200 bytes sw/qa/extras/odfexport/data/gutter-left.odt | Bin 0 -> 8519 bytes sw/qa/extras/odfexport/data/image-mimetype.odt | Bin 0 -> 88597 bytes sw/qa/extras/odfexport/data/listformat.docx | Bin 0 -> 13082 bytes sw/qa/extras/odfexport/data/listformat.odt | Bin 0 -> 9221 bytes .../extras/odfexport/data/nestedTableInFooter.odt | Bin 0 -> 8611 bytes .../odfexport/data/ooo321_stylepagenumber.odt | Bin 0 -> 8558 bytes sw/qa/extras/odfexport/data/oooxml_embedded.sxw | Bin 0 -> 21943 bytes .../extras/odfexport/data/page-content-bottom.odt | Bin 0 -> 8502 bytes sw/qa/extras/odfexport/data/page-content-top.odt | Bin 0 -> 8561 bytes .../odfexport/data/pagestyle_background_lo64.odt | Bin 0 -> 9947 bytes .../odfexport/data/pagestyle_background_lo70.odt | Bin 0 -> 10125 bytes .../odfexport/data/pagestyle_background_ooo33.odt | Bin 0 -> 9127 bytes sw/qa/extras/odfexport/data/protection-key.fodt | 48 + sw/qa/extras/odfexport/data/qrcode-properties.odt | Bin 0 -> 11634 bytes sw/qa/extras/odfexport/data/redlineTextFrame.odt | Bin 0 -> 8560 bytes sw/qa/extras/odfexport/data/referencelanguage.odt | Bin 0 -> 16137 bytes sw/qa/extras/odfexport/data/relh-page-tdf80282.odt | Bin 0 -> 128045 bytes sw/qa/extras/odfexport/data/relh-page.odt | Bin 0 -> 10183 bytes sw/qa/extras/odfexport/data/relw-page.odt | Bin 0 -> 10221 bytes sw/qa/extras/odfexport/data/resolved-comment.odt | Bin 0 -> 8912 bytes sw/qa/extras/odfexport/data/rovas-numbering.odt | Bin 0 -> 8786 bytes sw/qa/extras/odfexport/data/ruby-position.odt | Bin 0 -> 8325 bytes .../odfexport/data/section-columns-separator.fodt | 24 + sw/qa/extras/odfexport/data/sender-initials.fodt | 71 + sw/qa/extras/odfexport/data/sha1_correct.odt | Bin 0 -> 8587 bytes sw/qa/extras/odfexport/data/sha1_wrong.odt | Bin 0 -> 8435 bytes sw/qa/extras/odfexport/data/shape-relsize.odt | Bin 0 -> 10706 bytes .../extras/odfexport/data/shape-with-hyperlink.odt | Bin 0 -> 10149 bytes sw/qa/extras/odfexport/data/shapes-hyperlink.odt | Bin 0 -> 12199 bytes .../odfexport/data/signatureline-properties.fodt | 596 +++ .../odfexport/data/spellout-numberingtypes.odt | Bin 0 -> 10222 bytes sw/qa/extras/odfexport/data/style-link.fodt | 15 + sw/qa/extras/odfexport/data/sw_hatch.odt | Bin 0 -> 6560 bytes .../table-in-frame-in-table-in-header-base.odt | Bin 0 -> 10398 bytes .../odfexport/data/table_number_format_3.docx | Bin 0 -> 5130 bytes sw/qa/extras/odfexport/data/table_styles_1.odt | Bin 0 -> 9874 bytes sw/qa/extras/odfexport/data/table_styles_2.odt | Bin 0 -> 10727 bytes sw/qa/extras/odfexport/data/table_styles_3.odt | Bin 0 -> 9376 bytes sw/qa/extras/odfexport/data/table_styles_4.odt | Bin 0 -> 9094 bytes sw/qa/extras/odfexport/data/table_styles_5.odt | Bin 0 -> 9841 bytes sw/qa/extras/odfexport/data/tdf100492.odt | Bin 0 -> 19671 bytes sw/qa/extras/odfexport/data/tdf101710.odt | Bin 0 -> 9350 bytes sw/qa/extras/odfexport/data/tdf101856.odt | Bin 0 -> 9406 bytes .../extras/odfexport/data/tdf101856_overlapped.odt | Bin 0 -> 9233 bytes sw/qa/extras/odfexport/data/tdf103091.fodt | 307 ++ sw/qa/extras/odfexport/data/tdf103567.odt | Bin 0 -> 13562 bytes .../odfexport/data/tdf104254_noHeaderWrapping.odt | Bin 0 -> 63167 bytes sw/qa/extras/odfexport/data/tdf107292.odt | Bin 0 -> 9921 bytes sw/qa/extras/odfexport/data/tdf107696.odt | Bin 0 -> 11122 bytes .../odfexport/data/tdf111891_frameVertStyle.odt | Bin 0 -> 8814 bytes sw/qa/extras/odfexport/data/tdf114287.odt | Bin 0 -> 10067 bytes sw/qa/extras/odfexport/data/tdf115815.odt | Bin 0 -> 9809 bytes sw/qa/extras/odfexport/data/tdf118502.odt | Bin 0 -> 76491 bytes sw/qa/extras/odfexport/data/tdf118637.odt | Bin 0 -> 10547 bytes sw/qa/extras/odfexport/data/tdf121658.odt | Bin 0 -> 20057 bytes .../data/tdf124470TableAndEmbeddedUsedFonts.odt | Bin 0 -> 10880 bytes sw/qa/extras/odfexport/data/tdf128504.docx | Bin 0 -> 3969 bytes sw/qa/extras/odfexport/data/tdf129520.docx | Bin 0 -> 15574 bytes sw/qa/extras/odfexport/data/tdf129568-ui.fodt | 368 ++ sw/qa/extras/odfexport/data/tdf129568.fodt | 368 ++ sw/qa/extras/odfexport/data/tdf130314.docx | Bin 0 -> 31668 bytes sw/qa/extras/odfexport/data/tdf130950.odt | Bin 0 -> 28785 bytes .../odfexport/data/tdf131025_noZerosInTable.odt | Bin 0 -> 11544 bytes sw/qa/extras/odfexport/data/tdf131621.ott | Bin 0 -> 29145 bytes sw/qa/extras/odfexport/data/tdf131812.odt | Bin 0 -> 8683 bytes .../odfexport/data/tdf132642_keepWithNextTable.odt | Bin 0 -> 10030 bytes .../data/tdf133507_contextualSpacingSection.odt | Bin 0 -> 40288 bytes sw/qa/extras/odfexport/data/tdf134987.docx | Bin 0 -> 39541 bytes sw/qa/extras/odfexport/data/tdf135144.docx | Bin 0 -> 40894 bytes .../data/tdf135338_firstLeftPageFooter.odt | Bin 0 -> 10687 bytes sw/qa/extras/odfexport/data/tdf136645.odt | Bin 0 -> 18408 bytes sw/qa/extras/odfexport/data/tdf137199.docx | Bin 0 -> 13281 bytes sw/qa/extras/odfexport/data/tdf139126.odt | Bin 0 -> 11105 bytes sw/qa/extras/odfexport/data/tdf140437.odt | Bin 0 -> 8641 bytes sw/qa/extras/odfexport/data/tdf142483.odt | Bin 0 -> 9011 bytes sw/qa/extras/odfexport/data/tdf143605.odt | Bin 0 -> 8729 bytes .../odfexport/data/tdf143793_noBodyWrapping.odt | Bin 0 -> 117036 bytes sw/qa/extras/odfexport/data/tdf144319.odt | Bin 0 -> 28531 bytes sw/qa/extras/odfexport/data/tdf145226.fodt | 188 + sw/qa/extras/odfexport/data/tdf145361.odt | Bin 0 -> 9513 bytes sw/qa/extras/odfexport/data/tdf145871.odt | Bin 0 -> 15877 bytes sw/qa/extras/odfexport/data/tdf146264.odt | Bin 0 -> 13422 bytes sw/qa/extras/odfexport/data/tdf149248.odt | Bin 0 -> 20313 bytes sw/qa/extras/odfexport/data/tdf149324.odt | Bin 0 -> 20206 bytes sw/qa/extras/odfexport/data/tdf149420.odt | Bin 0 -> 38885 bytes sw/qa/extras/odfexport/data/tdf150149.fodt | 79 + sw/qa/extras/odfexport/data/tdf150394.odt | Bin 0 -> 35943 bytes sw/qa/extras/odfexport/data/tdf151100.docx | Bin 0 -> 17741 bytes sw/qa/extras/odfexport/data/tdf152710.odt | Bin 0 -> 11650 bytes sw/qa/extras/odfexport/data/tdf156905.odt | Bin 0 -> 30831 bytes .../odfexport/data/tdf43569_conditionalfield.doc | Bin 0 -> 22016 bytes .../odfexport/data/tdf57317_autoListName.odt | Bin 0 -> 10953 bytes sw/qa/extras/odfexport/data/tdf66305.odt | Bin 0 -> 12685 bytes sw/qa/extras/odfexport/data/tdf77961.odt | Bin 0 -> 11510 bytes sw/qa/extras/odfexport/data/tdf92379.fodt | 89 + sw/qa/extras/odfexport/data/tdf95806.docx | Bin 0 -> 16907 bytes sw/qa/extras/odfexport/data/tdf99631.docx | Bin 0 -> 32417 bytes .../odfexport/data/testTdf52065_centerTabs.odt | Bin 0 -> 11274 bytes .../odfexport/data/textbox-rounded-corners.odt | Bin 0 -> 13249 bytes sw/qa/extras/odfexport/data/textframe-gradient.odt | Bin 0 -> 9800 bytes .../data/textframe-transparent-shadow.odt | Bin 0 -> 9634 bytes .../extras/odfexport/data/textframe-vertadjust.odt | Bin 0 -> 12850 bytes .../extras/odfexport/data/user-field-decl-fly.odt | Bin 0 -> 9167 bytes sw/qa/extras/odfexport/data/user-field-decl.odt | Bin 0 -> 8597 bytes .../odfexport/data/userdefattr-tablecell.odt | Bin 0 -> 9172 bytes sw/qa/extras/odfexport/data/whitespace.odt | Bin 0 -> 10981 bytes sw/qa/extras/odfexport/odfexport.cxx | 2708 +++++++++++++ sw/qa/extras/odfexport/odfexport2.cxx | 1133 ++++++ .../odfimport/data/BibliographyEntryField.odt | Bin 0 -> 9194 bytes .../odfimport/data/PageAnchorZIndexFirstPage.fodt | 120 + .../odfimport/data/PageAnchorZIndexSecondPage.fodt | 120 + sw/qa/extras/odfimport/data/PageBackground.odt | Bin 0 -> 13301 bytes .../extras/odfimport/data/Word2010AsCharShape.odt | Bin 0 -> 4604 bytes sw/qa/extras/odfimport/data/ZoneMacroTest.odt | Bin 0 -> 16240 bytes .../odfimport/data/annotation-formatting.odt | Bin 0 -> 11215 bytes sw/qa/extras/odfimport/data/bnc800714.fodt | 35 + sw/qa/extras/odfimport/data/borders_ooo33.odt | Bin 0 -> 9890 bytes sw/qa/extras/odfimport/data/dateFormFormats.odt | Bin 0 -> 10664 bytes .../odfimport/data/empty-svg-family-name.odt | Bin 0 -> 12527 bytes .../data/emptyParagraphLoosesFontHeight.fodt | 21 + sw/qa/extras/odfimport/data/fdo37606.odt | Bin 0 -> 11389 bytes sw/qa/extras/odfimport/data/fdo47267-3.odt | Bin 0 -> 223670 bytes sw/qa/extras/odfimport/data/fdo53210.odt | Bin 0 -> 11355 bytes sw/qa/extras/odfimport/data/fdo55814.odt | Bin 0 -> 10200 bytes sw/qa/extras/odfimport/data/fdo56272.odt | Bin 0 -> 10522 bytes sw/qa/extras/odfimport/data/fdo60842.odt | Bin 0 -> 4300 bytes sw/qa/extras/odfimport/data/fdo68839.odt | Bin 0 -> 17657 bytes sw/qa/extras/odfimport/data/fdo69862.odt | Bin 0 -> 9743 bytes sw/qa/extras/odfimport/data/fdo69979.odt | Bin 0 -> 9462 bytes sw/qa/extras/odfimport/data/fdo75872_aoo40.odt | Bin 0 -> 8625 bytes sw/qa/extras/odfimport/data/fdo75872_ooo33.odt | Bin 0 -> 8348 bytes sw/qa/extras/odfimport/data/fdo79269.odt | Bin 0 -> 8883 bytes sw/qa/extras/odfimport/data/fdo79269_header.odt | Bin 0 -> 8913 bytes sw/qa/extras/odfimport/data/fdo81223.odt | Bin 0 -> 9428 bytes sw/qa/extras/odfimport/data/fdo82165.odt | Bin 0 -> 10663 bytes sw/qa/extras/odfimport/data/fdo90130-1.odt | Bin 0 -> 8606 bytes sw/qa/extras/odfimport/data/fdo90130-2.odt | Bin 0 -> 9148 bytes sw/qa/extras/odfimport/data/feature_image_jpg.odt | Bin 0 -> 63012 bytes sw/qa/extras/odfimport/data/feature_table.odt | Bin 0 -> 8251 bytes .../odfimport/data/feature_table_merged-cells.odt | Bin 0 -> 8343 bytes .../data/feature_table_merged-cells_all.odt | Bin 0 -> 8299 bytes sw/qa/extras/odfimport/data/feature_table_text.odt | Bin 0 -> 8588 bytes sw/qa/extras/odfimport/data/feature_text.odt | Bin 0 -> 8269 bytes .../data/feature_text_background-color.odt | Bin 0 -> 8341 bytes sw/qa/extras/odfimport/data/feature_text_bold.odt | Bin 0 -> 8425 bytes .../extras/odfimport/data/feature_text_italic.odt | Bin 0 -> 8427 bytes sw/qa/extras/odfimport/data/forcepoint101.fodt | 13 + sw/qa/extras/odfimport/data/forcepoint108.fodt | 67 + sw/qa/extras/odfimport/data/hello.odt | Bin 0 -> 8159 bytes sw/qa/extras/odfimport/data/i61225.sxw | Bin 0 -> 53844 bytes sw/qa/extras/odfimport/data/incorrectsum.odt | Bin 0 -> 17356 bytes sw/qa/extras/odfimport/data/ooo32780-1.odt | Bin 0 -> 34072 bytes sw/qa/extras/odfimport/data/ooo77837-1.odt | Bin 0 -> 15724 bytes .../data/paste-first-para-direct-format.odt | Bin 0 -> 8313 bytes sw/qa/extras/odfimport/data/space.odt | Bin 0 -> 3839 bytes sw/qa/extras/odfimport/data/spellmenu-redline.odt | Bin 0 -> 7959 bytes sw/qa/extras/odfimport/data/tdf100033_1.odt | Bin 0 -> 9367 bytes sw/qa/extras/odfimport/data/tdf100033_2.odt | Bin 0 -> 9401 bytes sw/qa/extras/odfimport/data/tdf101729.odt | Bin 0 -> 23049 bytes sw/qa/extras/odfimport/data/tdf103025.odt | Bin 0 -> 5694 bytes sw/qa/extras/odfimport/data/tdf107392.odt | Bin 0 -> 43338 bytes sw/qa/extras/odfimport/data/tdf107776.fodt | 29 + sw/qa/extras/odfimport/data/tdf108482.odt | Bin 0 -> 9421 bytes sw/qa/extras/odfimport/data/tdf109080_loext_ns.odt | Bin 0 -> 9217 bytes sw/qa/extras/odfimport/data/tdf109080_style_ns.odt | Bin 0 -> 9219 bytes sw/qa/extras/odfimport/data/tdf109228.odt | Bin 0 -> 13753 bytes sw/qa/extras/odfimport/data/tdf113289.odt | Bin 0 -> 8768 bytes sw/qa/extras/odfimport/data/tdf115079.odt | Bin 0 -> 22717 bytes sw/qa/extras/odfimport/data/tdf116195.odt | Bin 0 -> 123370 bytes sw/qa/extras/odfimport/data/tdf120677.fodt | 13 + sw/qa/extras/odfimport/data/tdf123829.odt | Bin 0 -> 10676 bytes sw/qa/extras/odfimport/data/tdf123968.odt | Bin 0 -> 9591 bytes sw/qa/extras/odfimport/data/tdf128737.odt | Bin 0 -> 18111 bytes sw/qa/extras/odfimport/data/tdf133459.odt | Bin 0 -> 8061 bytes sw/qa/extras/odfimport/data/tdf134971a.odt | Bin 0 -> 9960 bytes sw/qa/extras/odfimport/data/tdf134971b.odt | Bin 0 -> 8599 bytes sw/qa/extras/odfimport/data/tdf138879.odt | Bin 0 -> 9347 bytes sw/qa/extras/odfimport/data/tdf146257.odt | Bin 0 -> 12148 bytes sw/qa/extras/odfimport/data/tdf146597.odt | Bin 0 -> 13307 bytes sw/qa/extras/odfimport/data/tdf149978.fodt | 53 + sw/qa/extras/odfimport/data/tdf151375.ott | Bin 0 -> 14048 bytes sw/qa/extras/odfimport/data/tdf152015.odt | Bin 0 -> 37633 bytes .../odfimport/data/tdf41542_borderlessPadding.odt | Bin 0 -> 15669 bytes sw/qa/extras/odfimport/data/tdf74524.odt | Bin 0 -> 9015 bytes sw/qa/extras/odfimport/data/tdf75221.odt | Bin 0 -> 9131 bytes .../data/tdf76322_columnBreakInHeader.docx | Bin 0 -> 11357 bytes .../odfimport/data/tdf76349_1columnBreak.odt | Bin 0 -> 8561 bytes sw/qa/extras/odfimport/data/tdf89802.fodt | 56 + sw/qa/extras/odfimport/data/tdf92586.odt | Bin 0 -> 10517 bytes sw/qa/extras/odfimport/data/tdf94882.odt | Bin 0 -> 9704 bytes sw/qa/extras/odfimport/data/tdf96113.odt | Bin 0 -> 13364 bytes sw/qa/extras/odfimport/data/timeFormFormats.odt | Bin 0 -> 9518 bytes sw/qa/extras/odfimport/data/vmerge-cell-border.odt | Bin 0 -> 8996 bytes sw/qa/extras/odfimport/odffeatures.cxx | 30 + sw/qa/extras/odfimport/odfimport.cxx | 1538 ++++++++ .../data/090716_Studentische_Arbeit_VWS.docx | Bin 0 -> 42368 bytes sw/qa/extras/ooxmlexport/data/1-table-1-page.docx | Bin 0 -> 11658 bytes sw/qa/extras/ooxmlexport/data/128197_compat14.docx | Bin 0 -> 13797 bytes sw/qa/extras/ooxmlexport/data/128197_compat15.docx | Bin 0 -> 13778 bytes sw/qa/extras/ooxmlexport/data/151384Hyperlink.odt | Bin 0 -> 9372 bytes sw/qa/extras/ooxmlexport/data/1_page.docx | Bin 0 -> 20552 bytes sw/qa/extras/ooxmlexport/data/2-id.docx | Bin 0 -> 12782 bytes sw/qa/extras/ooxmlexport/data/2120112713.docx | Bin 0 -> 41022 bytes .../ooxmlexport/data/2120112713_OpenBrace.docx | Bin 0 -> 23146 bytes sw/qa/extras/ooxmlexport/data/2129393649.docx | Bin 0 -> 50312 bytes sw/qa/extras/ooxmlexport/data/2_table_doc.docx | Bin 0 -> 10090 bytes sw/qa/extras/ooxmlexport/data/2col-header.docx | Bin 0 -> 17060 bytes sw/qa/extras/ooxmlexport/data/99_Fields.docx | Bin 0 -> 15788 bytes sw/qa/extras/ooxmlexport/data/AnchorId.docx | Bin 0 -> 17942 bytes .../ooxmlexport/data/Chart_BorderLine_Style.docx | Bin 0 -> 25288 bytes .../data/Chart_Plot_BorderLine_Style.docx | Bin 0 -> 25114 bytes .../extras/ooxmlexport/data/ColorOverwritten.docx | Bin 0 -> 17647 bytes sw/qa/extras/ooxmlexport/data/CommentDone.docx | Bin 0 -> 20946 bytes sw/qa/extras/ooxmlexport/data/CommentReply.docx | Bin 0 -> 10353 bytes .../ooxmlexport/data/EmbeddedExcelChart.docx | Bin 0 -> 21785 bytes .../data/Encrypted_LO_Standard_abc.docx | Bin 0 -> 7680 bytes .../ooxmlexport/data/Encrypted_MSO2007_abc.docx | Bin 0 -> 18432 bytes .../ooxmlexport/data/Encrypted_MSO2010_abc.docx | Bin 0 -> 19456 bytes .../ooxmlexport/data/Encrypted_MSO2013_abc.docx | Bin 0 -> 17920 bytes .../data/EquationAsScientificNumbering.docx | Bin 0 -> 16850 bytes .../data/EquationWithAboveAndBelowCaption.docx | Bin 0 -> 15211 bytes sw/qa/extras/ooxmlexport/data/FDO73034.docx | Bin 0 -> 11655 bytes sw/qa/extras/ooxmlexport/data/FDO73546.docx | Bin 0 -> 27528 bytes sw/qa/extras/ooxmlexport/data/FDO74105.docx | Bin 0 -> 13804 bytes sw/qa/extras/ooxmlexport/data/FDO74106.docx | Bin 0 -> 17030 bytes sw/qa/extras/ooxmlexport/data/FDO74215.docx | Bin 0 -> 24322 bytes sw/qa/extras/ooxmlexport/data/FDO74774.docx | Bin 0 -> 118904 bytes sw/qa/extras/ooxmlexport/data/FDO74775.docx | Bin 0 -> 16685 bytes sw/qa/extras/ooxmlexport/data/FDO75133.docx | Bin 0 -> 16659 bytes sw/qa/extras/ooxmlexport/data/FDO76248.docx | Bin 0 -> 22330 bytes sw/qa/extras/ooxmlexport/data/FDO76312.docx | Bin 0 -> 37560 bytes sw/qa/extras/ooxmlexport/data/FDO77715.docx | Bin 0 -> 120055 bytes sw/qa/extras/ooxmlexport/data/FDO78292.docx | Bin 0 -> 586141 bytes sw/qa/extras/ooxmlexport/data/FDO78590.docx | Bin 0 -> 59732 bytes .../ooxmlexport/data/FigureAsLabelPicture.docx | Bin 0 -> 109122 bytes .../ooxmlexport/data/FileWithInvalidImageLink.docx | Bin 0 -> 15118 bytes sw/qa/extras/ooxmlexport/data/Hau_min_list2.fodt | 334 ++ sw/qa/extras/ooxmlexport/data/ImageCrop.docx | Bin 0 -> 71650 bytes sw/qa/extras/ooxmlexport/data/IndexFieldFlagF.docx | Bin 0 -> 15781 bytes .../ooxmlexport/data/LineStyle_DashType.docx | Bin 0 -> 22867 bytes .../ooxmlexport/data/LineStyle_DashType_VML.docx | Bin 0 -> 15661 bytes sw/qa/extras/ooxmlexport/data/LinkedTextBoxes.docx | Bin 0 -> 62194 bytes .../ooxmlexport/data/NoFillAttrInImagedata.docx | Bin 0 -> 272326 bytes sw/qa/extras/ooxmlexport/data/NumberedList.docx | Bin 0 -> 55519 bytes .../extras/ooxmlexport/data/PreserveWfieldTOC.docx | Bin 0 -> 18485 bytes .../extras/ooxmlexport/data/PreserveXfieldTOC.docx | Bin 0 -> 18620 bytes sw/qa/extras/ooxmlexport/data/SdtContent.docx | Bin 0 -> 24609 bytes sw/qa/extras/ooxmlexport/data/Shape.docx | Bin 0 -> 15602 bytes .../ooxmlexport/data/ShapeOverlappingWithSdt.docx | Bin 0 -> 29760 bytes sw/qa/extras/ooxmlexport/data/Simple-TOC.odt | Bin 0 -> 10289 bytes sw/qa/extras/ooxmlexport/data/SvgImageTest.odt | Bin 0 -> 13608 bytes .../extras/ooxmlexport/data/TC-table-DnD-move.docx | Bin 0 -> 12977 bytes .../ooxmlexport/data/TC-table-Separate-Move.docx | Bin 0 -> 13407 bytes .../ooxmlexport/data/TC-table-rowDND-front.docx | Bin 0 -> 13389 bytes sw/qa/extras/ooxmlexport/data/TC-table-rowDND.docx | Bin 0 -> 13378 bytes sw/qa/extras/ooxmlexport/data/TCTagMisMatch.docx | Bin 0 -> 16327 bytes sw/qa/extras/ooxmlexport/data/TOC_field_b.docx | Bin 0 -> 15114 bytes sw/qa/extras/ooxmlexport/data/TOC_field_f.docx | Bin 0 -> 15697 bytes sw/qa/extras/ooxmlexport/data/Table-of-Figures.odt | Bin 0 -> 9748 bytes .../ooxmlexport/data/TableWithAboveCaptions.docx | Bin 0 -> 14761 bytes .../data/Table_cell_auto_width_fdo69656.docx | Bin 0 -> 18939 bytes sw/qa/extras/ooxmlexport/data/Tdf147485.docx | Bin 0 -> 62544 bytes sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt | Bin 0 -> 15349 bytes sw/qa/extras/ooxmlexport/data/TestVMLData.docx | Bin 0 -> 50255 bytes .../data/Test_CharUnderlineThemeColor.docx | Bin 0 -> 13339 bytes .../ooxmlexport/data/Test_ThemeBorderColor.docx | Bin 0 -> 14743 bytes .../data/Test_ThemePortionLevel_CharColor.docx | Bin 0 -> 14672 bytes .../data/Test_ThemePortionLevel_CharColor.fodt | 420 ++ .../data/Test_ThemeTextParaBackgroundColor.docx | Bin 0 -> 15662 bytes .../data/TextEffects_Glow_Shadow_Reflection.docx | Bin 0 -> 11925 bytes .../ooxmlexport/data/TextEffects_Groupshapes.docx | Bin 0 -> 44427 bytes .../ooxmlexport/data/TextEffects_InStyle.docx | Bin 0 -> 13028 bytes ...fects_Props3d_Ligatures_NumForm_NumSpacing.docx | Bin 0 -> 12144 bytes .../data/TextEffects_StylisticSets_CntxtAlts.docx | Bin 0 -> 11988 bytes .../ooxmlexport/data/TextEffects_TextFill.docx | Bin 0 -> 11937 bytes .../ooxmlexport/data/TextEffects_TextOutline.docx | Bin 0 -> 11918 bytes .../extras/ooxmlexport/data/TextFrameRotation.docx | Bin 0 -> 25798 bytes .../ooxmlexport/data/UnknownStyleInRedline.docx | Bin 0 -> 14030 bytes .../ooxmlexport/data/Unsupportedtextfields.docx | Bin 0 -> 15608 bytes sw/qa/extras/ooxmlexport/data/WPGbodyPr.docx | Bin 0 -> 24700 bytes sw/qa/extras/ooxmlexport/data/a4andborders.docx | Bin 0 -> 10014 bytes sw/qa/extras/ooxmlexport/data/abi11739.docx | Bin 0 -> 11635 bytes sw/qa/extras/ooxmlexport/data/absolute-link.docx | Bin 0 -> 10533 bytes .../extras/ooxmlexport/data/activex_checkbox.docx | Bin 0 -> 13851 bytes .../ooxmlexport/data/activex_control_align.odt | Bin 0 -> 9737 bytes .../data/activex_control_at_run_end.odt | Bin 0 -> 9601 bytes .../data/activex_option_button_group.docx | Bin 0 -> 15877 bytes sw/qa/extras/ooxmlexport/data/activex_textbox.docx | Bin 0 -> 16937 bytes sw/qa/extras/ooxmlexport/data/afterlines.docx | Bin 0 -> 12622 bytes sw/qa/extras/ooxmlexport/data/all_gaps_word.docx | Bin 0 -> 10226 bytes .../data/alphabeticalIndex_AutoColumn.docx | Bin 0 -> 15891 bytes .../data/alphabeticalIndex_MultipleColumns.docx | Bin 0 -> 15937 bytes sw/qa/extras/ooxmlexport/data/anchor-position.docx | Bin 0 -> 14599 bytes .../ooxmlexport/data/annotation-formatting.docx | Bin 0 -> 14298 bytes .../ooxmlexport/data/arabic-zero-numbering.docx | Bin 0 -> 5730 bytes .../ooxmlexport/data/arabic-zero3-numbering.docx | Bin 0 -> 5934 bytes .../ooxmlexport/data/arabic-zero4-numbering.docx | Bin 0 -> 5238 bytes .../ooxmlexport/data/arabic-zero5-numbering.docx | Bin 0 -> 14411 bytes .../extras/ooxmlexport/data/artistic_effects.docx | Bin 0 -> 31934 bytes sw/qa/extras/ooxmlexport/data/author-property.docx | Bin 0 -> 18198 bytes sw/qa/extras/ooxmlexport/data/autofit.docx | Bin 0 -> 13763 bytes sw/qa/extras/ooxmlexport/data/bad.docm | Bin 0 -> 9672 bytes sw/qa/extras/ooxmlexport/data/behinddoc.docx | Bin 0 -> 17341 bytes sw/qa/extras/ooxmlexport/data/bezier.odt | Bin 0 -> 12174 bytes sw/qa/extras/ooxmlexport/data/bnc581614.doc | Bin 0 -> 31744 bytes sw/qa/extras/ooxmlexport/data/bnc637947.odt | Bin 0 -> 9408 bytes .../extras/ooxmlexport/data/bnc780044_spacing.docx | Bin 0 -> 7437 bytes sw/qa/extras/ooxmlexport/data/bnc834035.odt | Bin 0 -> 18557 bytes sw/qa/extras/ooxmlexport/data/bnc837302.docx | Bin 0 -> 13904 bytes sw/qa/extras/ooxmlexport/data/bnc865381.docx | Bin 0 -> 19510 bytes sw/qa/extras/ooxmlexport/data/bnc884615.docx | Bin 0 -> 14343 bytes sw/qa/extras/ooxmlexport/data/bnc891663.docx | Bin 0 -> 7911 bytes sw/qa/extras/ooxmlexport/data/btlr-frame.odt | Bin 0 -> 8564 bytes sw/qa/extras/ooxmlexport/data/btlr-textbox.docx | Bin 0 -> 15965 bytes sw/qa/extras/ooxmlexport/data/calendar1.docx | Bin 0 -> 14148 bytes sw/qa/extras/ooxmlexport/data/calendar2.docx | Bin 0 -> 12180 bytes sw/qa/extras/ooxmlexport/data/calendar3.docx | Bin 0 -> 9235 bytes sw/qa/extras/ooxmlexport/data/calendar4.docx | Bin 0 -> 9218 bytes sw/qa/extras/ooxmlexport/data/calendar5.docx | Bin 0 -> 12584 bytes sw/qa/extras/ooxmlexport/data/caption.docx | Bin 0 -> 13773 bytes sw/qa/extras/ooxmlexport/data/cell-btlr.docx | Bin 0 -> 4392 bytes sw/qa/extras/ooxmlexport/data/cell-grid-span.docx | Bin 0 -> 14652 bytes .../extras/ooxmlexport/data/cell-sdt-redline.docx | Bin 0 -> 11268 bytes sw/qa/extras/ooxmlexport/data/charborder.odt | Bin 0 -> 8052 bytes sw/qa/extras/ooxmlexport/data/chart-dupe.docx | Bin 0 -> 25367 bytes sw/qa/extras/ooxmlexport/data/chart-in-footer.docx | Bin 0 -> 29207 bytes sw/qa/extras/ooxmlexport/data/chart-prop.docx | Bin 0 -> 17749 bytes sw/qa/extras/ooxmlexport/data/chart-size.docx | Bin 0 -> 18128 bytes sw/qa/extras/ooxmlexport/data/chart.docx | Bin 0 -> 24453 bytes .../extras/ooxmlexport/data/checkbox-control.docx | Bin 0 -> 13493 bytes sw/qa/extras/ooxmlexport/data/chtoutline.docx | Bin 0 -> 15406 bytes sw/qa/extras/ooxmlexport/data/cjklist30.docx | Bin 0 -> 13395 bytes sw/qa/extras/ooxmlexport/data/cjklist31.docx | Bin 0 -> 13406 bytes sw/qa/extras/ooxmlexport/data/cjklist34.docx | Bin 0 -> 13414 bytes sw/qa/extras/ooxmlexport/data/cjklist35.docx | Bin 0 -> 13394 bytes sw/qa/extras/ooxmlexport/data/cjklist44.docx | Bin 0 -> 13384 bytes sw/qa/extras/ooxmlexport/data/clearing-break.docx | Bin 0 -> 15739 bytes sw/qa/extras/ooxmlexport/data/columnbreak.docx | Bin 0 -> 12703 bytes .../extras/ooxmlexport/data/combobox-control.docx | Bin 0 -> 21561 bytes sw/qa/extras/ooxmlexport/data/comment_initials.odt | Bin 0 -> 9335 bytes sw/qa/extras/ooxmlexport/data/comments-nested.odt | Bin 0 -> 11343 bytes .../extras/ooxmlexport/data/conditional-text.fodt | 8 + .../data/conditionalstyles-tbllook.docx | Bin 0 -> 11531 bytes .../ooxmlexport/data/content-control-grab-bag.docx | Bin 0 -> 30547 bytes .../ooxmlexport/data/content-control-shape.docx | Bin 0 -> 59050 bytes sw/qa/extras/ooxmlexport/data/controlshape.fodt | 182 + sw/qa/extras/ooxmlexport/data/cp1000015.odt | Bin 0 -> 8044 bytes sw/qa/extras/ooxmlexport/data/crop-pixel.docx | Bin 0 -> 28063 bytes sw/qa/extras/ooxmlexport/data/crop-roundtrip.docx | Bin 0 -> 143445 bytes .../extras/ooxmlexport/data/croppedAndRotated.odt | Bin 0 -> 11188 bytes .../extras/ooxmlexport/data/custom-properties.docx | Bin 0 -> 10968 bytes .../ooxmlexport/data/custom-styles-TOC-comma.docx | Bin 0 -> 14735 bytes .../data/custom-styles-TOC-semicolon.docx | Bin 0 -> 14902 bytes sw/qa/extras/ooxmlexport/data/customxml.docx | Bin 0 -> 23402 bytes .../dashed_line_custdash_1000th_of_percent.docx | Bin 0 -> 16895 bytes .../data/dashed_line_custdash_percentage.docx | Bin 0 -> 16895 bytes sw/qa/extras/ooxmlexport/data/date-control.docx | Bin 0 -> 20936 bytes .../data/date_field_at_end_of_paragraph.docx | Bin 0 -> 22693 bytes .../ooxmlexport/data/date_field_in_shape.docx | Bin 0 -> 21746 bytes .../data/decimal-numbering-no-leveltext.docx | Bin 0 -> 13517 bytes .../ooxmlexport/data/default-sect-break-cols.docx | Bin 0 -> 9993 bytes sw/qa/extras/ooxmlexport/data/defaultStyle.docx | Bin 0 -> 5126 bytes sw/qa/extras/ooxmlexport/data/dkvert.docx | Bin 0 -> 20751 bytes .../ooxmlexport/data/dml-charheight-default.docx | Bin 0 -> 15770 bytes .../data/dml-customgeometry-cubicbezier.docx | Bin 0 -> 8702 bytes .../ooxmlexport/data/dml-gradientfill-theme.docx | Bin 0 -> 15771 bytes .../data/dml-groupshape-capitalization.docx | Bin 0 -> 17676 bytes .../data/dml-groupshape-childposition.docx | Bin 0 -> 17609 bytes .../data/dml-groupshape-paraspacing.docx | Bin 0 -> 17128 bytes .../ooxmlexport/data/dml-groupshape-relsize.docx | Bin 0 -> 17223 bytes .../ooxmlexport/data/dml-groupshape-runfonts.docx | Bin 0 -> 16971 bytes .../ooxmlexport/data/dml-groupshape-sdt.docx | Bin 0 -> 19727 bytes .../ooxmlexport/data/dml-picture-in-textframe.docx | Bin 0 -> 17252 bytes .../ooxmlexport/data/dml-rectangle-relsize.docx | Bin 0 -> 17858 bytes .../ooxmlexport/data/dml-shape-fillbitmapcrop.docx | Bin 0 -> 33037 bytes .../ooxmlexport/data/dml-shape-fillpattern.docx | Bin 0 -> 27380 bytes .../extras/ooxmlexport/data/dml-shape-relsize.docx | Bin 0 -> 15499 bytes sw/qa/extras/ooxmlexport/data/dml-shape-title.docx | Bin 0 -> 13772 bytes .../ooxmlexport/data/dml-solidfill-alpha.docx | Bin 0 -> 17049 bytes .../ooxmlexport/data/dml-textframe-vertadjust.docx | Bin 0 -> 18296 bytes sw/qa/extras/ooxmlexport/data/dml-textshape.docx | Bin 0 -> 16554 bytes sw/qa/extras/ooxmlexport/data/dml-textshapeB.docx | Bin 0 -> 15148 bytes sw/qa/extras/ooxmlexport/data/dml-zorder.odt | Bin 0 -> 9704 bytes .../ooxmlexport/data/docxopenhyperlinkbox.docx | Bin 0 -> 18197 bytes .../ooxmlexport/data/dont-add-new-styles.docx | Bin 0 -> 13305 bytes .../ooxmlexport/data/drawinglayer-pic-pos.docx | Bin 0 -> 17617 bytes sw/qa/extras/ooxmlexport/data/drawingml-flipv.docx | Bin 0 -> 15580 bytes .../extras/ooxmlexport/data/dropdown-in-cell.docx | Bin 0 -> 13262 bytes .../ooxmlexport/data/duplicate-east-asia.odt | Bin 0 -> 9514 bytes .../ooxmlexport/data/effect-extent-inline.docx | Bin 0 -> 25805 bytes .../ooxmlexport/data/effect-extent-line-width.docx | Bin 0 -> 23257 bytes sw/qa/extras/ooxmlexport/data/effect-extent.docx | Bin 0 -> 14715 bytes .../ooxmlexport/data/effectextent-margin.docx | Bin 0 -> 13144 bytes sw/qa/extras/ooxmlexport/data/em.docx | Bin 0 -> 10016 bytes sw/qa/extras/ooxmlexport/data/embedded-xlsx.docx | Bin 0 -> 33370 bytes sw/qa/extras/ooxmlexport/data/embedded_chart.odt | Bin 0 -> 23955 bytes sw/qa/extras/ooxmlexport/data/embedded_images.odt | Bin 0 -> 19334 bytes .../ooxmlexport/data/empty-annotation-mark.docx | Bin 0 -> 13339 bytes .../extras/ooxmlexport/data/empty-date-control.odt | Bin 0 -> 8668 bytes sw/qa/extras/ooxmlexport/data/empty.odt | Bin 0 -> 8466 bytes .../ooxmlexport/data/endingSectionProps.docx | Bin 0 -> 6506 bytes sw/qa/extras/ooxmlexport/data/fail_bracePair.odt | Bin 0 -> 9394 bytes sw/qa/extras/ooxmlexport/data/fdo106029.docx | Bin 0 -> 4336 bytes sw/qa/extras/ooxmlexport/data/fdo38244.docx | Bin 0 -> 12424 bytes sw/qa/extras/ooxmlexport/data/fdo38414.docx | Bin 0 -> 21800 bytes sw/qa/extras/ooxmlexport/data/fdo43093.docx | Bin 0 -> 9547 bytes sw/qa/extras/ooxmlexport/data/fdo43093b.docx | Bin 0 -> 12959 bytes .../ooxmlexport/data/fdo44689_start_page_0.docx | Bin 0 -> 16875 bytes .../ooxmlexport/data/fdo44689_start_page_7.docx | Bin 0 -> 16849 bytes sw/qa/extras/ooxmlexport/data/fdo46361.docx | Bin 0 -> 13791 bytes sw/qa/extras/ooxmlexport/data/fdo47669.docx | Bin 0 -> 3908 bytes sw/qa/extras/ooxmlexport/data/fdo48557.odt | Bin 0 -> 16782 bytes sw/qa/extras/ooxmlexport/data/fdo51034.odt | Bin 0 -> 9922 bytes sw/qa/extras/ooxmlexport/data/fdo51550.odt | Bin 0 -> 13611 bytes sw/qa/extras/ooxmlexport/data/fdo52208.docx | Bin 0 -> 13356 bytes sw/qa/extras/ooxmlexport/data/fdo53985.docx | Bin 0 -> 20115 bytes sw/qa/extras/ooxmlexport/data/fdo55187.docx | Bin 0 -> 12759 bytes sw/qa/extras/ooxmlexport/data/fdo55381.docx | Bin 0 -> 4710 bytes sw/qa/extras/ooxmlexport/data/fdo56679.docx | Bin 0 -> 15993 bytes sw/qa/extras/ooxmlexport/data/fdo58577.odt | Bin 0 -> 9427 bytes sw/qa/extras/ooxmlexport/data/fdo59273.docx | Bin 0 -> 4358 bytes sw/qa/extras/ooxmlexport/data/fdo59638.docx | Bin 0 -> 12166 bytes sw/qa/extras/ooxmlexport/data/fdo60922.docx | Bin 0 -> 4503 bytes sw/qa/extras/ooxmlexport/data/fdo60957-2.docx | Bin 0 -> 24075 bytes sw/qa/extras/ooxmlexport/data/fdo60990.odt | Bin 0 -> 10945 bytes sw/qa/extras/ooxmlexport/data/fdo61343.docx | Bin 0 -> 114220 bytes sw/qa/extras/ooxmlexport/data/fdo63053.docx | Bin 0 -> 5044 bytes sw/qa/extras/ooxmlexport/data/fdo63685.docx | Bin 0 -> 10964 bytes sw/qa/extras/ooxmlexport/data/fdo64350.docx | Bin 0 -> 16139 bytes sw/qa/extras/ooxmlexport/data/fdo64826.docx | Bin 0 -> 12018 bytes sw/qa/extras/ooxmlexport/data/fdo65090.docx | Bin 0 -> 10409 bytes sw/qa/extras/ooxmlexport/data/fdo65265.docx | Bin 0 -> 14520 bytes sw/qa/extras/ooxmlexport/data/fdo65295.docx | Bin 0 -> 26411 bytes sw/qa/extras/ooxmlexport/data/fdo65400.docx | Bin 0 -> 16108 bytes sw/qa/extras/ooxmlexport/data/fdo65632.docx | Bin 0 -> 12862 bytes sw/qa/extras/ooxmlexport/data/fdo65718.docx | Bin 0 -> 62876 bytes sw/qa/extras/ooxmlexport/data/fdo65833.docx | Bin 0 -> 34539 bytes sw/qa/extras/ooxmlexport/data/fdo66474.docx | Bin 0 -> 96326 bytes sw/qa/extras/ooxmlexport/data/fdo66543.docx | Bin 0 -> 16196 bytes sw/qa/extras/ooxmlexport/data/fdo66688.docx | Bin 0 -> 24042 bytes sw/qa/extras/ooxmlexport/data/fdo66773.docx | Bin 0 -> 16239 bytes sw/qa/extras/ooxmlexport/data/fdo66781.docx | Bin 0 -> 21428 bytes sw/qa/extras/ooxmlexport/data/fdo66929.docx | Bin 0 -> 21624 bytes sw/qa/extras/ooxmlexport/data/fdo67013.docx | Bin 0 -> 27038 bytes sw/qa/extras/ooxmlexport/data/fdo67737.docx | Bin 0 -> 21349 bytes sw/qa/extras/ooxmlexport/data/fdo68418.docx | Bin 0 -> 13897 bytes sw/qa/extras/ooxmlexport/data/fdo68607.docx | Bin 0 -> 36117 bytes sw/qa/extras/ooxmlexport/data/fdo68787.docx | Bin 0 -> 14436 bytes sw/qa/extras/ooxmlexport/data/fdo69548.docx | Bin 0 -> 3802 bytes sw/qa/extras/ooxmlexport/data/fdo69616.docx | Bin 0 -> 22253 bytes sw/qa/extras/ooxmlexport/data/fdo69636.docx | Bin 0 -> 23779 bytes sw/qa/extras/ooxmlexport/data/fdo69644.docx | Bin 0 -> 18215 bytes sw/qa/extras/ooxmlexport/data/fdo69649.docx | Bin 0 -> 35048 bytes sw/qa/extras/ooxmlexport/data/fdo70457.docx | Bin 0 -> 20296 bytes sw/qa/extras/ooxmlexport/data/fdo70812.docx | Bin 0 -> 5530 bytes sw/qa/extras/ooxmlexport/data/fdo70838.docx | Bin 0 -> 4103 bytes sw/qa/extras/ooxmlexport/data/fdo70942.docx | Bin 0 -> 15520 bytes sw/qa/extras/ooxmlexport/data/fdo71302.docx | Bin 0 -> 13418 bytes sw/qa/extras/ooxmlexport/data/fdo71646.docx | Bin 0 -> 22792 bytes sw/qa/extras/ooxmlexport/data/fdo71785.docx | Bin 0 -> 54366 bytes sw/qa/extras/ooxmlexport/data/fdo71834.docx | Bin 0 -> 20967 bytes sw/qa/extras/ooxmlexport/data/fdo72560.docx | Bin 0 -> 15144 bytes sw/qa/extras/ooxmlexport/data/fdo72560b.docx | Bin 0 -> 9969 bytes sw/qa/extras/ooxmlexport/data/fdo72560c.docx | Bin 0 -> 9969 bytes sw/qa/extras/ooxmlexport/data/fdo72560d.docx | Bin 0 -> 8116 bytes sw/qa/extras/ooxmlexport/data/fdo72560e.docx | Bin 0 -> 9934 bytes sw/qa/extras/ooxmlexport/data/fdo73215.docx | Bin 0 -> 17846 bytes sw/qa/extras/ooxmlexport/data/fdo73227.docx | Bin 0 -> 206920 bytes sw/qa/extras/ooxmlexport/data/fdo73247.docx | Bin 0 -> 17526 bytes sw/qa/extras/ooxmlexport/data/fdo73389.docx | Bin 0 -> 11067 bytes sw/qa/extras/ooxmlexport/data/fdo73541.docx | Bin 0 -> 16446 bytes sw/qa/extras/ooxmlexport/data/fdo73550.docx | Bin 0 -> 7671 bytes sw/qa/extras/ooxmlexport/data/fdo73556.docx | Bin 0 -> 12124 bytes .../ooxmlexport/data/fdo73596_AlphaSeparator.docx | Bin 0 -> 16099 bytes .../ooxmlexport/data/fdo73596_RunInStyle.docx | Bin 0 -> 15886 bytes sw/qa/extras/ooxmlexport/data/fdo74110.docx | Bin 0 -> 22916 bytes sw/qa/extras/ooxmlexport/data/fdo74153.docx | Bin 0 -> 11506 bytes sw/qa/extras/ooxmlexport/data/fdo74357.docx | Bin 0 -> 11930 bytes sw/qa/extras/ooxmlexport/data/fdo74401.docx | Bin 0 -> 18425 bytes sw/qa/extras/ooxmlexport/data/fdo74566.docx | Bin 0 -> 12675 bytes sw/qa/extras/ooxmlexport/data/fdo74605.docx | Bin 0 -> 180916 bytes sw/qa/extras/ooxmlexport/data/fdo74745.docx | Bin 0 -> 32560 bytes sw/qa/extras/ooxmlexport/data/fdo74792.docx | Bin 0 -> 127945 bytes sw/qa/extras/ooxmlexport/data/fdo75431.docx | Bin 0 -> 13275 bytes sw/qa/extras/ooxmlexport/data/fdo76016.docx | Bin 0 -> 15182 bytes sw/qa/extras/ooxmlexport/data/fdo76098.docx | Bin 0 -> 79411 bytes sw/qa/extras/ooxmlexport/data/fdo76101.docx | Bin 0 -> 88435 bytes sw/qa/extras/ooxmlexport/data/fdo76163.docx | Bin 0 -> 41001 bytes sw/qa/extras/ooxmlexport/data/fdo76249.docx | Bin 0 -> 121643 bytes sw/qa/extras/ooxmlexport/data/fdo76316.docx | Bin 0 -> 653222 bytes sw/qa/extras/ooxmlexport/data/fdo76586.docx | Bin 0 -> 12277 bytes sw/qa/extras/ooxmlexport/data/fdo76587.docx | Bin 0 -> 13605 bytes sw/qa/extras/ooxmlexport/data/fdo76589.docx | Bin 0 -> 13790 bytes sw/qa/extras/ooxmlexport/data/fdo76591.docx | Bin 0 -> 109793 bytes sw/qa/extras/ooxmlexport/data/fdo76597.docx | Bin 0 -> 83390 bytes sw/qa/extras/ooxmlexport/data/fdo76741.docx | Bin 0 -> 18895 bytes sw/qa/extras/ooxmlexport/data/fdo76803.docx | Bin 0 -> 36516 bytes sw/qa/extras/ooxmlexport/data/fdo76934.docx | Bin 0 -> 31867 bytes sw/qa/extras/ooxmlexport/data/fdo76979.docx | Bin 0 -> 41973 bytes sw/qa/extras/ooxmlexport/data/fdo77117.docx | Bin 0 -> 23755 bytes sw/qa/extras/ooxmlexport/data/fdo77129.docx | Bin 0 -> 106404 bytes sw/qa/extras/ooxmlexport/data/fdo77476.docx | Bin 0 -> 935746 bytes sw/qa/extras/ooxmlexport/data/fdo77716.docx | Bin 0 -> 12915 bytes sw/qa/extras/ooxmlexport/data/fdo77718.docx | Bin 0 -> 554994 bytes sw/qa/extras/ooxmlexport/data/fdo77719.docx | Bin 0 -> 16680 bytes sw/qa/extras/ooxmlexport/data/fdo77725.docx | Bin 0 -> 53579 bytes sw/qa/extras/ooxmlexport/data/fdo77727.docx | Bin 0 -> 48777 bytes sw/qa/extras/ooxmlexport/data/fdo77759.docx | Bin 0 -> 23880 bytes sw/qa/extras/ooxmlexport/data/fdo77812.docx | Bin 0 -> 13485 bytes sw/qa/extras/ooxmlexport/data/fdo77887.docx | Bin 0 -> 39281 bytes sw/qa/extras/ooxmlexport/data/fdo77890.docx | Bin 0 -> 31759 bytes sw/qa/extras/ooxmlexport/data/fdo78284.docx | Bin 0 -> 26129 bytes sw/qa/extras/ooxmlexport/data/fdo78300.docx | Bin 0 -> 14358 bytes sw/qa/extras/ooxmlexport/data/fdo78384.docx | Bin 0 -> 13134 bytes sw/qa/extras/ooxmlexport/data/fdo78420.docx | Bin 0 -> 687154 bytes sw/qa/extras/ooxmlexport/data/fdo78432.docx | Bin 0 -> 29365 bytes sw/qa/extras/ooxmlexport/data/fdo78469.docx | Bin 0 -> 31664 bytes sw/qa/extras/ooxmlexport/data/fdo78474.docx | Bin 0 -> 116064 bytes sw/qa/extras/ooxmlexport/data/fdo78599.docx | Bin 0 -> 38560 bytes sw/qa/extras/ooxmlexport/data/fdo78651.docx | Bin 0 -> 20283 bytes sw/qa/extras/ooxmlexport/data/fdo78654.docx | Bin 0 -> 40927 bytes sw/qa/extras/ooxmlexport/data/fdo78658.docx | Bin 0 -> 54504 bytes sw/qa/extras/ooxmlexport/data/fdo78659.docx | Bin 0 -> 86548 bytes sw/qa/extras/ooxmlexport/data/fdo78663.docx | Bin 0 -> 30861 bytes sw/qa/extras/ooxmlexport/data/fdo78882.docx | Bin 0 -> 22429 bytes sw/qa/extras/ooxmlexport/data/fdo78883.docx | Bin 0 -> 18303 bytes sw/qa/extras/ooxmlexport/data/fdo78886.docx | Bin 0 -> 40499 bytes sw/qa/extras/ooxmlexport/data/fdo78887.docx | Bin 0 -> 14813 bytes sw/qa/extras/ooxmlexport/data/fdo78904.docx | Bin 0 -> 14388 bytes sw/qa/extras/ooxmlexport/data/fdo78907.docx | Bin 0 -> 38642 bytes sw/qa/extras/ooxmlexport/data/fdo78910.docx | Bin 0 -> 22596 bytes sw/qa/extras/ooxmlexport/data/fdo78939.docx | Bin 0 -> 73680 bytes sw/qa/extras/ooxmlexport/data/fdo78957.docx | Bin 0 -> 54098 bytes sw/qa/extras/ooxmlexport/data/fdo79008.docx | Bin 0 -> 53143 bytes sw/qa/extras/ooxmlexport/data/fdo79062.docx | Bin 0 -> 17422 bytes sw/qa/extras/ooxmlexport/data/fdo79256.docx | Bin 0 -> 15170 bytes sw/qa/extras/ooxmlexport/data/fdo79535.docx | Bin 0 -> 22547 bytes sw/qa/extras/ooxmlexport/data/fdo79540.docx | Bin 0 -> 26279 bytes sw/qa/extras/ooxmlexport/data/fdo79591.docx | Bin 0 -> 25140 bytes sw/qa/extras/ooxmlexport/data/fdo79668.docx | Bin 0 -> 27444 bytes sw/qa/extras/ooxmlexport/data/fdo79738.docx | Bin 0 -> 10159 bytes sw/qa/extras/ooxmlexport/data/fdo79817.docx | Bin 0 -> 22303 bytes sw/qa/extras/ooxmlexport/data/fdo79822.docx | Bin 0 -> 40902 bytes sw/qa/extras/ooxmlexport/data/fdo79915.docx | Bin 0 -> 20751 bytes sw/qa/extras/ooxmlexport/data/fdo79968.docx | Bin 0 -> 51338 bytes sw/qa/extras/ooxmlexport/data/fdo79969_xlsb.docx | Bin 0 -> 25622 bytes sw/qa/extras/ooxmlexport/data/fdo79969_xlsm.docx | Bin 0 -> 26157 bytes sw/qa/extras/ooxmlexport/data/fdo80097.docx | Bin 0 -> 36655 bytes sw/qa/extras/ooxmlexport/data/fdo80410.docx | Bin 0 -> 24733 bytes sw/qa/extras/ooxmlexport/data/fdo80522.docx | Bin 0 -> 31344 bytes sw/qa/extras/ooxmlexport/data/fdo80523_pptm.docx | Bin 0 -> 50693 bytes sw/qa/extras/ooxmlexport/data/fdo80523_sldm.docx | Bin 0 -> 50663 bytes sw/qa/extras/ooxmlexport/data/fdo80555.docx | Bin 0 -> 15018 bytes sw/qa/extras/ooxmlexport/data/fdo80800.docx | Bin 0 -> 13128 bytes .../ooxmlexport/data/fdo80800b_tableStyle.docx | Bin 0 -> 11946 bytes sw/qa/extras/ooxmlexport/data/fdo80895.docx | Bin 0 -> 23133 bytes sw/qa/extras/ooxmlexport/data/fdo80897.docx | Bin 0 -> 16332 bytes sw/qa/extras/ooxmlexport/data/fdo80898.docx | Bin 0 -> 21989 bytes sw/qa/extras/ooxmlexport/data/fdo80902.docx | Bin 0 -> 10795 bytes sw/qa/extras/ooxmlexport/data/fdo80997.docx | Bin 0 -> 20222 bytes sw/qa/extras/ooxmlexport/data/fdo81031.docx | Bin 0 -> 25264 bytes sw/qa/extras/ooxmlexport/data/fdo81341.docx | Bin 0 -> 12678 bytes sw/qa/extras/ooxmlexport/data/fdo81381.docx | Bin 0 -> 51656 bytes sw/qa/extras/ooxmlexport/data/fdo81486.docx | Bin 0 -> 13354 bytes sw/qa/extras/ooxmlexport/data/fdo81492.docx | Bin 0 -> 45995 bytes sw/qa/extras/ooxmlexport/data/fdo81945.docx | Bin 0 -> 14037 bytes sw/qa/extras/ooxmlexport/data/fdo81946.docx | Bin 0 -> 34561 bytes sw/qa/extras/ooxmlexport/data/fdo82123.docx | Bin 0 -> 36087 bytes sw/qa/extras/ooxmlexport/data/fdo82492.docx | Bin 0 -> 25948 bytes sw/qa/extras/ooxmlexport/data/fdo83044.docx | Bin 0 -> 25970 bytes sw/qa/extras/ooxmlexport/data/fdo83048.docx | Bin 0 -> 29731 bytes sw/qa/extras/ooxmlexport/data/fdo83057.docx | Bin 0 -> 25032 bytes sw/qa/extras/ooxmlexport/data/fdo83428.docx | Bin 0 -> 4386 bytes sw/qa/extras/ooxmlexport/data/fdo85542.docx | Bin 0 -> 10299 bytes sw/qa/extras/ooxmlexport/data/field-rotated.fodt | 44 + sw/qa/extras/ooxmlexport/data/file_crash.docx | Bin 0 -> 17243 bytes .../extras/ooxmlexport/data/fixed-date-field.docx | Bin 0 -> 5066 bytes sw/qa/extras/ooxmlexport/data/flip_and_rotate.odt | Bin 0 -> 9403 bytes .../ooxmlexport/data/floating-table-position.docx | Bin 0 -> 13236 bytes .../ooxmlexport/data/floating-tables-anchor.docx | Bin 0 -> 16348 bytes .../ooxmlexport/data/floatingtbl_with_formula.docx | Bin 0 -> 17046 bytes .../data/floattable-nested-cell-start.odt | Bin 0 -> 12811 bytes .../extras/ooxmlexport/data/floattable-nested.odt | Bin 0 -> 11635 bytes sw/qa/extras/ooxmlexport/data/fly_fieldmark.fodt | 60 + .../ooxmlexport/data/font-name-is-empty.docx | Bin 0 -> 6991 bytes .../ooxmlexport/data/footer-body-distance.docx | Bin 0 -> 17891 bytes .../ooxmlexport/data/footer-contain-hyperlink.docx | Bin 0 -> 12196 bytes .../ooxmlexport/data/footer-margin-lost.docx | Bin 0 -> 21058 bytes sw/qa/extras/ooxmlexport/data/footnote.docx | Bin 0 -> 15779 bytes sw/qa/extras/ooxmlexport/data/footnotesep.fodt | 86 + sw/qa/extras/ooxmlexport/data/frame-wrap-auto.docx | Bin 0 -> 10348 bytes sw/qa/extras/ooxmlexport/data/frame.fodt | 75 + .../extras/ooxmlexport/data/frame_size_export.docx | Bin 0 -> 13929 bytes .../extras/ooxmlexport/data/glossaryWithEmail.docx | Bin 0 -> 19290 bytes sw/qa/extras/ooxmlexport/data/grabbag.docx | Bin 0 -> 9989 bytes .../data/gradient-fill-preservation.docx | Bin 0 -> 9390 bytes .../ooxmlexport/data/graphic-object-fliph.docx | Bin 0 -> 14408 bytes sw/qa/extras/ooxmlexport/data/gridbefore.docx | Bin 0 -> 4987 bytes sw/qa/extras/ooxmlexport/data/grouped_link.docx | Bin 0 -> 21001 bytes .../ooxmlexport/data/groupshape-picture.docx | Bin 0 -> 24669 bytes .../ooxmlexport/data/groupshape-rotation.docx | Bin 0 -> 10462 bytes .../ooxmlexport/data/groupshape-smarttag.docx | Bin 0 -> 10694 bytes .../ooxmlexport/data/groupshape-textbox.docx | Bin 0 -> 17394 bytes .../ooxmlexport/data/groupshape-theme-font.docx | Bin 0 -> 13871 bytes .../data/groupshape-trackedchanges.docx | Bin 0 -> 17667 bytes sw/qa/extras/ooxmlexport/data/gutter-left.docx | Bin 0 -> 11860 bytes sw/qa/extras/ooxmlexport/data/gutter-top.docx | Bin 0 -> 13032 bytes sw/qa/extras/ooxmlexport/data/header-border.docx | Bin 0 -> 15503 bytes sw/qa/extras/ooxmlexport/data/hello.docm | Bin 0 -> 12709 bytes sw/qa/extras/ooxmlexport/data/hello.docx | Bin 0 -> 12578 bytes sw/qa/extras/ooxmlexport/data/hidemark.docx | Bin 0 -> 12816 bytes sw/qa/extras/ooxmlexport/data/hyperlink-field.odt | Bin 0 -> 15543 bytes sw/qa/extras/ooxmlexport/data/hyperlink.docx | Bin 0 -> 12564 bytes sw/qa/extras/ooxmlexport/data/hyperlinkshape.docx | Bin 0 -> 17780 bytes sw/qa/extras/ooxmlexport/data/hyphenation.odt | Bin 0 -> 16416 bytes sw/qa/extras/ooxmlexport/data/i120928.docx | Bin 0 -> 16550 bytes sw/qa/extras/ooxmlexport/data/i124106.docx | Bin 0 -> 4810 bytes .../ooxmlexport/data/image-comment-at-char.docx | Bin 0 -> 6385 bytes sw/qa/extras/ooxmlexport/data/image-noborder.docx | Bin 0 -> 14305 bytes sw/qa/extras/ooxmlexport/data/image_data.docx | Bin 0 -> 50255 bytes .../ooxmlexport/data/image_through_shape.docx | Bin 0 -> 18888 bytes sw/qa/extras/ooxmlexport/data/imgshadow.docx | Bin 0 -> 29629 bytes sw/qa/extras/ooxmlexport/data/indentation.docx | Bin 0 -> 16945 bytes sw/qa/extras/ooxmlexport/data/indents.docx | Bin 0 -> 11553 bytes .../ooxmlexport/data/inheritFirstHeader.docx | Bin 0 -> 15002 bytes .../extras/ooxmlexport/data/inline-groupshape.docx | Bin 0 -> 16992 bytes .../extras/ooxmlexport/data/inline-sdt-header.docx | Bin 0 -> 14930 bytes .../ooxmlexport/data/internal_hyperlink_frame.odt | Bin 0 -> 9021 bytes .../ooxmlexport/data/internal_hyperlink_ole.odt | Bin 0 -> 13400 bytes .../ooxmlexport/data/internal_hyperlink_region.odt | Bin 0 -> 8744 bytes .../ooxmlexport/data/internal_hyperlink_table.odt | Bin 0 -> 8866 bytes .../ooxmlexport/data/invalid_date_form_field.docx | Bin 0 -> 4386 bytes sw/qa/extras/ooxmlexport/data/kde216114-1.odt | Bin 0 -> 22717 bytes sw/qa/extras/ooxmlexport/data/kde302504-1.odt | Bin 0 -> 10014 bytes sw/qa/extras/ooxmlexport/data/kern.docx | Bin 0 -> 12832 bytes sw/qa/extras/ooxmlexport/data/large-twips.docx | Bin 0 -> 5365 bytes .../data/lastEmptyLineWithDirectFormatting.docx | Bin 0 -> 1816 bytes .../ooxmlexport/data/layout-flow-alt-alone.docx | Bin 0 -> 7669 bytes sw/qa/extras/ooxmlexport/data/libreoffice.png | Bin 0 -> 767 bytes sw/qa/extras/ooxmlexport/data/listWithLgl.docx | Bin 0 -> 3009 bytes .../ooxmlexport/data/list_notcounted_indent.fodt | 141 + .../extras/ooxmlexport/data/longBookmarkName.fodt | 13 + sw/qa/extras/ooxmlexport/data/lorem_hyperlink.fodt | 40 + sw/qa/extras/ooxmlexport/data/lvlPicBulletId.docx | Bin 0 -> 32450 bytes sw/qa/extras/ooxmlexport/data/mailmerge.docx | Bin 0 -> 17580 bytes .../ooxmlexport/data/margins_from_style.docx | Bin 0 -> 13878 bytes sw/qa/extras/ooxmlexport/data/math-accents.docx | Bin 0 -> 3555 bytes sw/qa/extras/ooxmlexport/data/math-d.docx | Bin 0 -> 3633 bytes sw/qa/extras/ooxmlexport/data/math-escape.docx | Bin 0 -> 13422 bytes sw/qa/extras/ooxmlexport/data/math-escaping.docx | Bin 0 -> 3481 bytes sw/qa/extras/ooxmlexport/data/math-lim.docx | Bin 0 -> 3512 bytes sw/qa/extras/ooxmlexport/data/math-literal.docx | Bin 0 -> 3850 bytes sw/qa/extras/ooxmlexport/data/math-matrix.docx | Bin 0 -> 3507 bytes sw/qa/extras/ooxmlexport/data/math-mso2k7.docx | Bin 0 -> 12207 bytes sw/qa/extras/ooxmlexport/data/math-nary.docx | Bin 0 -> 3562 bytes .../data/math-overbrace_underbrace.docx | Bin 0 -> 3567 bytes sw/qa/extras/ooxmlexport/data/math-overstrike.docx | Bin 0 -> 3507 bytes .../extras/ooxmlexport/data/math-placeholders.docx | Bin 0 -> 3467 bytes sw/qa/extras/ooxmlexport/data/math-rad.docx | Bin 0 -> 3507 bytes sw/qa/extras/ooxmlexport/data/math-subscripts.docx | Bin 0 -> 3669 bytes .../ooxmlexport/data/math-vertical_stacks.docx | Bin 0 -> 3522 bytes sw/qa/extras/ooxmlexport/data/mathtype.docx | Bin 0 -> 12533 bytes sw/qa/extras/ooxmlexport/data/mce-nested.docx | Bin 0 -> 32734 bytes sw/qa/extras/ooxmlexport/data/mce-wpg.docx | Bin 0 -> 17404 bytes sw/qa/extras/ooxmlexport/data/mce.docx | Bin 0 -> 15667 bytes sw/qa/extras/ooxmlexport/data/missing-path.docx | Bin 0 -> 15860 bytes sw/qa/extras/ooxmlexport/data/missing_newline.odt | Bin 0 -> 10524 bytes sw/qa/extras/ooxmlexport/data/mso-spt180.docx | Bin 0 -> 10496 bytes .../ooxmlexport/data/msobrightnesscontrast.docx | Bin 0 -> 18972 bytes .../data/multi-column-line-separator-SAVED.docx | Bin 0 -> 5640 bytes .../data/multi-column-separator-with-line.docx | Bin 0 -> 11618 bytes sw/qa/extras/ooxmlexport/data/multi-page-toc.docx | Bin 0 -> 18321 bytes sw/qa/extras/ooxmlexport/data/multi_space_url.fodt | 9 + sw/qa/extras/ooxmlexport/data/n592908-frame.docx | Bin 0 -> 13589 bytes sw/qa/extras/ooxmlexport/data/n592908-picture.docx | Bin 0 -> 62593 bytes sw/qa/extras/ooxmlexport/data/n652364.docx | Bin 0 -> 8975 bytes sw/qa/extras/ooxmlexport/data/n693238.docx | Bin 0 -> 9933 bytes sw/qa/extras/ooxmlexport/data/n705956-1.docx | Bin 0 -> 7861 bytes sw/qa/extras/ooxmlexport/data/n705956-2.docx | Bin 0 -> 9363 bytes sw/qa/extras/ooxmlexport/data/n747461.docx | Bin 0 -> 6489 bytes sw/qa/extras/ooxmlexport/data/n750255.docx | Bin 0 -> 10102 bytes sw/qa/extras/ooxmlexport/data/n751054.docx | Bin 0 -> 13100 bytes sw/qa/extras/ooxmlexport/data/n751117.docx | Bin 0 -> 10312 bytes sw/qa/extras/ooxmlexport/data/n764005.docx | Bin 0 -> 13088 bytes sw/qa/extras/ooxmlexport/data/n766481.docx | Bin 0 -> 10021 bytes sw/qa/extras/ooxmlexport/data/n766487.docx | Bin 0 -> 9273 bytes sw/qa/extras/ooxmlexport/data/n775906.docx | Bin 0 -> 11750 bytes sw/qa/extras/ooxmlexport/data/n777337.docx | Bin 0 -> 13409 bytes sw/qa/extras/ooxmlexport/data/n778828.docx | Bin 0 -> 10012 bytes sw/qa/extras/ooxmlexport/data/n778836.docx | Bin 0 -> 9649 bytes sw/qa/extras/ooxmlexport/data/n779630.docx | Bin 0 -> 12500 bytes sw/qa/extras/ooxmlexport/data/n779642.docx | Bin 0 -> 85485 bytes sw/qa/extras/ooxmlexport/data/n779834.docx | Bin 0 -> 22624 bytes sw/qa/extras/ooxmlexport/data/n779941.docx | Bin 0 -> 10316 bytes sw/qa/extras/ooxmlexport/data/n780563.docx | Bin 0 -> 24144 bytes sw/qa/extras/ooxmlexport/data/n780843.docx | Bin 0 -> 12614 bytes sw/qa/extras/ooxmlexport/data/n780843b.docx | Bin 0 -> 13623 bytes sw/qa/extras/ooxmlexport/data/n780853.docx | Bin 0 -> 9261 bytes sw/qa/extras/ooxmlexport/data/n782345.docx | Bin 0 -> 12607 bytes sw/qa/extras/ooxmlexport/data/n783638.docx | Bin 0 -> 19119 bytes sw/qa/extras/ooxmlexport/data/n785767.docx | Bin 0 -> 12848 bytes sw/qa/extras/ooxmlexport/data/n789482.docx | Bin 0 -> 12916 bytes sw/qa/extras/ooxmlexport/data/n792778.docx | Bin 0 -> 15329 bytes sw/qa/extras/ooxmlexport/data/n793262.docx | Bin 0 -> 15449 bytes sw/qa/extras/ooxmlexport/data/n793998.docx | Bin 0 -> 13167 bytes sw/qa/extras/ooxmlexport/data/n816593.docx | Bin 0 -> 17030 bytes sw/qa/extras/ooxmlexport/data/n820509.docx | Bin 0 -> 12047 bytes sw/qa/extras/ooxmlexport/data/n822175.odt | Bin 0 -> 7633 bytes sw/qa/extras/ooxmlexport/data/n830205.docx | Bin 0 -> 33186 bytes .../data/negative-cell-margin-twips.docx | Bin 0 -> 5902 bytes .../extras/ooxmlexport/data/nested-text-frames.odt | Bin 0 -> 13013 bytes .../ooxmlexport/data/nestedAlternateContent.docx | Bin 0 -> 19109 bytes .../ooxmlexport/data/no-numlevel-but-indented.odt | Bin 0 -> 19535 bytes sw/qa/extras/ooxmlexport/data/noDefault.docx | Bin 0 -> 9238 bytes sw/qa/extras/ooxmlexport/data/non_ascii_link.docx | Bin 0 -> 12061 bytes sw/qa/extras/ooxmlexport/data/nonbmpchar.docx | Bin 0 -> 4194 bytes .../ooxmlexport/data/num-override-lvltext.docx | Bin 0 -> 13708 bytes .../ooxmlexport/data/num-override-start.docx | Bin 0 -> 14327 bytes .../extras/ooxmlexport/data/num-parent-style.docx | Bin 0 -> 14002 bytes .../ooxmlexport/data/number-portion-format.odt | Bin 0 -> 8984 bytes sw/qa/extras/ooxmlexport/data/numbering-font.docx | Bin 0 -> 11014 bytes sw/qa/extras/ooxmlexport/data/numbering1.docx | Bin 0 -> 14346 bytes sw/qa/extras/ooxmlexport/data/numlist-zhcn.odt | Bin 0 -> 10410 bytes sw/qa/extras/ooxmlexport/data/numlist-zhtw.odt | Bin 0 -> 10419 bytes .../ooxmlexport/data/object_cross_reference.odt | Bin 0 -> 38788 bytes sw/qa/extras/ooxmlexport/data/ooo106020-1.odt | Bin 0 -> 11044 bytes .../ooxmlexport/data/ooo30436-1-minimized.sxw | Bin 0 -> 8793 bytes sw/qa/extras/ooxmlexport/data/ooo34469-1.odt | Bin 0 -> 16812 bytes sw/qa/extras/ooxmlexport/data/ooo39250-1-min.rtf | 42 + sw/qa/extras/ooxmlexport/data/ooo39845-7.odt | Bin 0 -> 14361 bytes sw/qa/extras/ooxmlexport/data/ooo47778-3.odt | Bin 0 -> 9872 bytes sw/qa/extras/ooxmlexport/data/ooo47778-4.odt | Bin 0 -> 9815 bytes sw/qa/extras/ooxmlexport/data/ooo67471-2.odt | Bin 0 -> 9511 bytes sw/qa/extras/ooxmlexport/data/ooo72950-1.odt | Bin 0 -> 12591 bytes sw/qa/extras/ooxmlexport/data/ooo96040-2.odt | Bin 0 -> 289214 bytes sw/qa/extras/ooxmlexport/data/ooxml-triangle.docx | Bin 0 -> 13289 bytes .../extras/ooxmlexport/data/open-as-read-only.docx | Bin 0 -> 4594 bytes .../ooxmlexport/data/outline-number-types.odt | Bin 0 -> 13600 bytes sw/qa/extras/ooxmlexport/data/page-background.docx | Bin 0 -> 10041 bytes .../ooxmlexport/data/page-border-shadow.docx | Bin 0 -> 10012 bytes .../data/page-borders-export-case-2.docx | Bin 0 -> 16156 bytes .../extras/ooxmlexport/data/page-break-before.docx | Bin 0 -> 12943 bytes .../ooxmlexport/data/page-content-bottom.docx | Bin 0 -> 5007 bytes .../ooxmlexport/data/page-graphic-background.odt | Bin 0 -> 32296 bytes sw/qa/extras/ooxmlexport/data/pageBreak_after.odt | Bin 0 -> 10162 bytes sw/qa/extras/ooxmlexport/data/pagerelsize.docx | Bin 0 -> 17318 bytes .../ooxmlexport/data/para-adjust-distribute.docx | Bin 0 -> 11326 bytes .../extras/ooxmlexport/data/para-auto-spacing.docx | Bin 0 -> 30380 bytes sw/qa/extras/ooxmlexport/data/para-shading.docx | Bin 0 -> 12609 bytes sw/qa/extras/ooxmlexport/data/para-shadow.docx | Bin 0 -> 4056 bytes .../ooxmlexport/data/para-style-char-position.docx | Bin 0 -> 9628 bytes .../ooxmlexport/data/para-style-num-level.docx | Bin 0 -> 13101 bytes .../ooxmlexport/data/paragraph-mark-nonempty.odt | Bin 0 -> 8769 bytes sw/qa/extras/ooxmlexport/data/paragraph-mark.docx | Bin 0 -> 13113 bytes sw/qa/extras/ooxmlexport/data/paragraph-mark2.docx | Bin 0 -> 31782 bytes sw/qa/extras/ooxmlexport/data/paragraph-sdt.docx | Bin 0 -> 34035 bytes .../ooxmlexport/data/paragraphWithComments.docx | Bin 0 -> 14255 bytes .../data/parasplit-on-section-border.odt | Bin 0 -> 17642 bytes .../picture-artistic-effects-preservation.docx | Bin 0 -> 17272 bytes .../data/picture-effects-preservation.docx | Bin 0 -> 33275 bytes .../ooxmlexport/data/picture-with-schemecolor.docx | Bin 0 -> 35489 bytes .../ooxmlexport/data/picture-wrap-polygon.docx | Bin 0 -> 15997 bytes .../extras/ooxmlexport/data/pictureWatermark.docx | Bin 0 -> 798086 bytes .../data/picture_colormode_black_white.odt | Bin 0 -> 32725 bytes .../data/picture_colormode_grayscale.docx | Bin 0 -> 36515 bytes .../data/picture_colormode_watermark.odt | Bin 0 -> 32345 bytes .../extras/ooxmlexport/data/plausable-border.docx | Bin 0 -> 15719 bytes .../ooxmlexport/data/position-and-rotation.docx | Bin 0 -> 18502 bytes .../ooxmlexport/data/preserve_Z_field_TOC.docx | Bin 0 -> 18381 bytes sw/qa/extras/ooxmlexport/data/preset-shape.docx | Bin 0 -> 16054 bytes sw/qa/extras/ooxmlexport/data/protectedform.docx | Bin 0 -> 18511 bytes sw/qa/extras/ooxmlexport/data/quicktables.docx | Bin 0 -> 12205 bytes sw/qa/extras/ooxmlexport/data/rel-size-round.docx | Bin 0 -> 15098 bytes sw/qa/extras/ooxmlexport/data/relative-link.docx | Bin 0 -> 13415 bytes sw/qa/extras/ooxmlexport/data/relorientation.docx | Bin 0 -> 22931 bytes sw/qa/extras/ooxmlexport/data/rhbz1180114.docx | Bin 0 -> 3435 bytes sw/qa/extras/ooxmlexport/data/rhbz988516.docx | Bin 0 -> 15513 bytes sw/qa/extras/ooxmlexport/data/rot180-flipv.docx | Bin 0 -> 15903 bytes sw/qa/extras/ooxmlexport/data/rot270-flipv.docx | Bin 0 -> 15887 bytes sw/qa/extras/ooxmlexport/data/rot90-fliph.docx | Bin 0 -> 15683 bytes sw/qa/extras/ooxmlexport/data/rotated_shape.fodt | 81 + .../extras/ooxmlexport/data/rprchange_closed.docx | Bin 0 -> 24695 bytes sw/qa/extras/ooxmlexport/data/rtl-gutter.docx | Bin 0 -> 8843 bytes sw/qa/extras/ooxmlexport/data/rubyhyperlink.fodt | 45 + sw/qa/extras/ooxmlexport/data/sample.dotx | Bin 0 -> 11338 bytes sw/qa/extras/ooxmlexport/data/sdt-2-para.docx | Bin 0 -> 15487 bytes sw/qa/extras/ooxmlexport/data/sdt-2-run.docx | Bin 0 -> 12849 bytes sw/qa/extras/ooxmlexport/data/sdt-alias.docx | Bin 0 -> 12872 bytes .../extras/ooxmlexport/data/sdt-before-field.docx | Bin 0 -> 12995 bytes .../extras/ooxmlexport/data/sdt-citation-run.docx | Bin 0 -> 12817 bytes .../ooxmlexport/data/sdt-company-multipara.docx | Bin 0 -> 19521 bytes .../ooxmlexport/data/sdt-date-duplicate.docx | Bin 0 -> 34071 bytes .../extras/ooxmlexport/data/sdt-duplicated-id.docx | Bin 0 -> 11940 bytes sw/qa/extras/ooxmlexport/data/sdt-header.docx | Bin 0 -> 18551 bytes .../ooxmlexport/data/sdt-ignored-footer.docx | Bin 0 -> 18299 bytes sw/qa/extras/ooxmlexport/data/sdt-run-picture.docx | Bin 0 -> 15444 bytes .../ooxmlexport/data/sdt_after_section_break.docx | Bin 0 -> 1185 bytes .../data/section_break_after_table.docx | Bin 0 -> 12583 bytes .../ooxmlexport/data/section_break_numbering.docx | Bin 0 -> 5614 bytes sw/qa/extras/ooxmlexport/data/sectionprot.odt | Bin 0 -> 8612 bytes sw/qa/extras/ooxmlexport/data/sectionprot2.odt | Bin 0 -> 8568 bytes .../data/shape-3d-effect-preservation.docx | Bin 0 -> 19676 bytes .../ooxmlexport/data/shape-atpage-in-table.fodt | 185 + .../data/shape-effect-preservation.docx | Bin 0 -> 23996 bytes .../ooxmlexport/data/shape-in-floattable.docx | Bin 0 -> 26161 bytes .../ooxmlexport/data/shape-theme-preservation.docx | Bin 0 -> 18757 bytes .../data/signature-line-all-props-set.docx | Bin 0 -> 13169 bytes sw/qa/extras/ooxmlexport/data/simple-sdts.docx | Bin 0 -> 25424 bytes sw/qa/extras/ooxmlexport/data/smartart.docx | Bin 0 -> 20453 bytes sw/qa/extras/ooxmlexport/data/strict-smartart.docx | Bin 0 -> 18661 bytes sw/qa/extras/ooxmlexport/data/strict.docx | Bin 0 -> 25636 bytes .../extras/ooxmlexport/data/style-inheritance.docx | Bin 0 -> 26321 bytes .../ooxmlexport/data/symbol_chicago_list.docx | Bin 0 -> 8909 bytes sw/qa/extras/ooxmlexport/data/table-alignment.docx | Bin 0 -> 13187 bytes .../data/table-auto-column-fixed-size.docx | Bin 0 -> 17672 bytes .../data/table-auto-column-fixed-size2.docx | Bin 0 -> 12907 bytes .../extras/ooxmlexport/data/table-auto-nested.docx | Bin 0 -> 10297 bytes .../extras/ooxmlexport/data/table-black_fill.docx | Bin 0 -> 17978 bytes sw/qa/extras/ooxmlexport/data/table-borders.docx | Bin 0 -> 13489 bytes .../extras/ooxmlexport/data/table-btlr-center.docx | Bin 0 -> 10686 bytes .../extras/ooxmlexport/data/table-cell-margin.docx | Bin 0 -> 13708 bytes .../ooxmlexport/data/table-floating-margins.docx | Bin 0 -> 14346 bytes sw/qa/extras/ooxmlexport/data/table-floating.docx | Bin 0 -> 14996 bytes sw/qa/extras/ooxmlexport/data/table-ltr.docx | Bin 0 -> 5242 bytes sw/qa/extras/ooxmlexport/data/table-pagebreak.docx | Bin 0 -> 10148 bytes .../extras/ooxmlexport/data/table-position-14.docx | Bin 0 -> 13708 bytes .../extras/ooxmlexport/data/table-position-15.docx | Bin 0 -> 12264 bytes .../data/table-row-data-displayed-twice.docx | Bin 0 -> 27239 bytes sw/qa/extras/ooxmlexport/data/table-rtl.docx | Bin 0 -> 13449 bytes .../extras/ooxmlexport/data/table-start-2-sdt.docx | Bin 0 -> 34077 bytes .../data/table-style-border-export.docx | Bin 0 -> 13984 bytes .../ooxmlexport/data/table-style-border.docx | Bin 0 -> 14552 bytes .../data/table-style-cell-back-color.docx | Bin 0 -> 13646 bytes .../ooxmlexport/data/table-style-conf-nested.docx | Bin 0 -> 13167 bytes .../ooxmlexport/data/table-style-parprop.docx | Bin 0 -> 10098 bytes .../ooxmlexport/data/table-style-rPr-sz.docx | Bin 0 -> 10771 bytes .../ooxmlexport/data/table-theme-preservation.docx | Bin 0 -> 37575 bytes sw/qa/extras/ooxmlexport/data/table.fodt | 70 + sw/qa/extras/ooxmlexport/data/table.odt | Bin 0 -> 8889 bytes sw/qa/extras/ooxmlexport/data/tableCurrupt.docx | Bin 0 -> 28750 bytes .../ooxmlexport/data/tablePreferredWidth.docx | Bin 0 -> 13130 bytes sw/qa/extras/ooxmlexport/data/table_atleast.docx | Bin 0 -> 13029 bytes .../ooxmlexport/data/table_cross_reference.odt | Bin 0 -> 10243 bytes .../data/table_cross_reference_custom_format.odt | Bin 0 -> 12089 bytes sw/qa/extras/ooxmlexport/data/table_lineRule.docx | Bin 0 -> 13998 bytes .../ooxmlexport/data/tableborder-finedash.docx | Bin 0 -> 10266 bytes sw/qa/extras/ooxmlexport/data/tblppr-shape.docx | Bin 0 -> 13497 bytes sw/qa/extras/ooxmlexport/data/tblr-height.docx | Bin 0 -> 10466 bytes sw/qa/extras/ooxmlexport/data/tbrl-frame-vml.docx | Bin 0 -> 22756 bytes sw/qa/extras/ooxmlexport/data/tbrl-textbox.docx | Bin 0 -> 17300 bytes sw/qa/extras/ooxmlexport/data/tdf100075.docx | Bin 0 -> 11834 bytes sw/qa/extras/ooxmlexport/data/tdf100581.odt | Bin 0 -> 24334 bytes .../ooxmlexport/data/tdf100751_arrowBothFlip.docx | Bin 0 -> 15546 bytes .../data/tdf101122_noFillForCustomShape.odt | Bin 0 -> 15232 bytes .../ooxmlexport/data/tdf101589_dontSplitTable.odt | Bin 0 -> 11314 bytes sw/qa/extras/ooxmlexport/data/tdf102466.docx | Bin 0 -> 101162 bytes sw/qa/extras/ooxmlexport/data/tdf103001.docx | Bin 0 -> 33883 bytes sw/qa/extras/ooxmlexport/data/tdf103090.odt | Bin 0 -> 8845 bytes sw/qa/extras/ooxmlexport/data/tdf103389.docx | Bin 0 -> 13983 bytes sw/qa/extras/ooxmlexport/data/tdf103544.docx | Bin 0 -> 15012 bytes sw/qa/extras/ooxmlexport/data/tdf103573.docx | Bin 0 -> 16155 bytes sw/qa/extras/ooxmlexport/data/tdf103651.docx | Bin 0 -> 14459 bytes .../ooxmlexport/data/tdf103975_notPageBreakB.docx | Bin 0 -> 13971 bytes .../ooxmlexport/data/tdf103975_notPageBreakC.docx | Bin 0 -> 13955 bytes .../ooxmlexport/data/tdf103975_notPageBreakD.docx | Bin 0 -> 21482 bytes .../ooxmlexport/data/tdf103975_notPageBreakE.docx | Bin 0 -> 14047 bytes sw/qa/extras/ooxmlexport/data/tdf103976.docx | Bin 0 -> 51017 bytes sw/qa/extras/ooxmlexport/data/tdf103982.docx | Bin 0 -> 12085 bytes .../data/tdf104061_tableSectionColumns.docx | Bin 0 -> 103497 bytes sw/qa/extras/ooxmlexport/data/tdf104115.docx | Bin 0 -> 13044 bytes sw/qa/extras/ooxmlexport/data/tdf104150.docx | Bin 0 -> 12621 bytes sw/qa/extras/ooxmlexport/data/tdf104162.docx | Bin 0 -> 14541 bytes .../ooxmlexport/data/tdf104348_contextMargin.docx | Bin 0 -> 19145 bytes sw/qa/extras/ooxmlexport/data/tdf104354-2.docx | Bin 0 -> 15263 bytes sw/qa/extras/ooxmlexport/data/tdf104354.docx | Bin 0 -> 10182 bytes .../data/tdf104354_firstParaInSection.docx | Bin 0 -> 6828 bytes .../ooxmlexport/data/tdf104394_lostTextbox.docx | Bin 0 -> 18979 bytes sw/qa/extras/ooxmlexport/data/tdf104418.odt | Bin 0 -> 12437 bytes .../ooxmlexport/data/tdf104420_lostParagraph.docx | Bin 0 -> 103469 bytes sw/qa/extras/ooxmlexport/data/tdf104539.odt | Bin 0 -> 12783 bytes .../ooxmlexport/data/tdf104565_ArrowPosition.docx | Bin 0 -> 4980 bytes .../ooxmlexport/data/tdf104707_urlComment.odt | Bin 0 -> 9942 bytes .../data/tdf104713_undefinedStyles.docx | Bin 0 -> 2331 bytes sw/qa/extras/ooxmlexport/data/tdf104797.docx | Bin 0 -> 11710 bytes sw/qa/extras/ooxmlexport/data/tdf104823.docx | Bin 0 -> 21260 bytes .../ooxmlexport/data/tdf105035_framePrB.docx | Bin 0 -> 23142 bytes .../ooxmlexport/data/tdf105035_framePrC.docx | Bin 0 -> 24095 bytes sw/qa/extras/ooxmlexport/data/tdf105095.docx | Bin 0 -> 15756 bytes sw/qa/extras/ooxmlexport/data/tdf105215.docx | Bin 0 -> 5654 bytes sw/qa/extras/ooxmlexport/data/tdf105444.docx | Bin 0 -> 4928 bytes sw/qa/extras/ooxmlexport/data/tdf105485.docx | Bin 0 -> 7804 bytes .../data/tdf105490_negativeMargins.docx | Bin 0 -> 12389 bytes sw/qa/extras/ooxmlexport/data/tdf105688.docx | Bin 0 -> 31745 bytes .../data/tdf105875_VmlShapeRotationWithFlip.docx | Bin 0 -> 23175 bytes sw/qa/extras/ooxmlexport/data/tdf106001-2.odt | Bin 0 -> 8159 bytes sw/qa/extras/ooxmlexport/data/tdf106001.docx | Bin 0 -> 5021 bytes .../data/tdf106062_nonHangingFootnote.odt | Bin 0 -> 14255 bytes sw/qa/extras/ooxmlexport/data/tdf106132.docx | Bin 0 -> 5851 bytes .../ooxmlexport/data/tdf106174_rtlParaAlign.docx | Bin 0 -> 5266 bytes sw/qa/extras/ooxmlexport/data/tdf106492.docx | Bin 0 -> 7896 bytes .../data/tdf106541_noinheritChapterNumbering.odt | Bin 0 -> 13859 bytes sw/qa/extras/ooxmlexport/data/tdf106690-cell.docx | Bin 0 -> 14385 bytes sw/qa/extras/ooxmlexport/data/tdf106690.docx | Bin 0 -> 20653 bytes sw/qa/extras/ooxmlexport/data/tdf106724.docx | Bin 0 -> 21692 bytes sw/qa/extras/ooxmlexport/data/tdf106843.fodt | 43 + sw/qa/extras/ooxmlexport/data/tdf106953.docx | Bin 0 -> 13833 bytes sw/qa/extras/ooxmlexport/data/tdf106970.docx | Bin 0 -> 23255 bytes .../ooxmlexport/data/tdf106974_int32Crop.docx | Bin 0 -> 374376 bytes sw/qa/extras/ooxmlexport/data/tdf107020.docx | Bin 0 -> 404889 bytes sw/qa/extras/ooxmlexport/data/tdf107033.docx | Bin 0 -> 12577 bytes sw/qa/extras/ooxmlexport/data/tdf107035.docx | Bin 0 -> 4240 bytes sw/qa/extras/ooxmlexport/data/tdf107104.docx | Bin 0 -> 15648 bytes sw/qa/extras/ooxmlexport/data/tdf107111.docx | Bin 0 -> 451082 bytes sw/qa/extras/ooxmlexport/data/tdf107119.docx | Bin 0 -> 12207 bytes .../ooxmlexport/data/tdf107359-char-pitch.docx | Bin 0 -> 12806 bytes sw/qa/extras/ooxmlexport/data/tdf107618.doc | Bin 0 -> 28160 bytes sw/qa/extras/ooxmlexport/data/tdf107626.odt | Bin 0 -> 12912 bytes sw/qa/extras/ooxmlexport/data/tdf107684.odt | Bin 0 -> 12357 bytes sw/qa/extras/ooxmlexport/data/tdf107837.odt | Bin 0 -> 9059 bytes sw/qa/extras/ooxmlexport/data/tdf107889.docx | Bin 0 -> 11207 bytes sw/qa/extras/ooxmlexport/data/tdf107969.docx | Bin 0 -> 28622 bytes sw/qa/extras/ooxmlexport/data/tdf108269.docm | Bin 0 -> 20187 bytes .../ooxmlexport/data/tdf108350_noFontdefaults.docx | Bin 0 -> 7502 bytes sw/qa/extras/ooxmlexport/data/tdf108493.docx | Bin 0 -> 27322 bytes sw/qa/extras/ooxmlexport/data/tdf108496.docx | Bin 0 -> 19421 bytes sw/qa/extras/ooxmlexport/data/tdf108505.docx | Bin 0 -> 16732 bytes sw/qa/extras/ooxmlexport/data/tdf108682.docx | Bin 0 -> 12653 bytes .../data/tdf108944_footnoteSeparator2.odt | Bin 0 -> 10646 bytes .../data/tdf108973_backgroundTextbox.docx | Bin 0 -> 10429 bytes .../data/tdf108973_foregroundTextbox.docx | Bin 0 -> 10478 bytes sw/qa/extras/ooxmlexport/data/tdf109063.docx | Bin 0 -> 13191 bytes sw/qa/extras/ooxmlexport/data/tdf109184.docx | Bin 0 -> 20720 bytes sw/qa/extras/ooxmlexport/data/tdf109306.docx | Bin 0 -> 1427 bytes .../data/tdf109310_endnoteStyleForMSO.docx | Bin 0 -> 5109 bytes sw/qa/extras/ooxmlexport/data/tdf111964.docx | Bin 0 -> 1481 bytes .../ooxmlexport/data/tdf112103_tablebgnofill.docx | Bin 0 -> 19239 bytes sw/qa/extras/ooxmlexport/data/tdf112118.docx | Bin 0 -> 11702 bytes sw/qa/extras/ooxmlexport/data/tdf112169.odt | Bin 0 -> 23366 bytes sw/qa/extras/ooxmlexport/data/tdf112287.docx | Bin 0 -> 12695 bytes sw/qa/extras/ooxmlexport/data/tdf112287B.docx | Bin 0 -> 12700 bytes .../data/tdf112312_AutoFitForLegacyShapes.odt | Bin 0 -> 11123 bytes .../data/tdf112352_nextPageColumns.docx | Bin 0 -> 14346 bytes .../ooxmlexport/data/tdf112446_frameStyle.docx | Bin 0 -> 18766 bytes sw/qa/extras/ooxmlexport/data/tdf113183.docx | Bin 0 -> 17163 bytes sw/qa/extras/ooxmlexport/data/tdf113258.docx | Bin 0 -> 17327 bytes .../data/tdf113258_noBeforeAutospacing.docx | Bin 0 -> 16284 bytes sw/qa/extras/ooxmlexport/data/tdf113399.doc | Bin 0 -> 73728 bytes sw/qa/extras/ooxmlexport/data/tdf113547.docx | Bin 0 -> 14424 bytes .../data/tdf113608_runAwayNumbering.docx | Bin 0 -> 17300 bytes sw/qa/extras/ooxmlexport/data/tdf114308.docx | Bin 0 -> 21487 bytes .../data/tdf114537_conditional-text2.doc | Bin 0 -> 19968 bytes sw/qa/extras/ooxmlexport/data/tdf114703.docx | Bin 0 -> 26969 bytes .../data/tdf114734_commentFormating.docx | Bin 0 -> 10056 bytes sw/qa/extras/ooxmlexport/data/tdf114882.docx | Bin 0 -> 14888 bytes sw/qa/extras/ooxmlexport/data/tdf115030.docx | Bin 0 -> 14926 bytes sw/qa/extras/ooxmlexport/data/tdf115094v3.docx | Bin 0 -> 11652 bytes sw/qa/extras/ooxmlexport/data/tdf115212.docx | Bin 0 -> 11275 bytes sw/qa/extras/ooxmlexport/data/tdf115557.docx | Bin 0 -> 12284 bytes sw/qa/extras/ooxmlexport/data/tdf115719.docx | Bin 0 -> 18668 bytes sw/qa/extras/ooxmlexport/data/tdf115719b.docx | Bin 0 -> 19145 bytes sw/qa/extras/ooxmlexport/data/tdf115861.docx | Bin 0 -> 15035 bytes sw/qa/extras/ooxmlexport/data/tdf116084.docx | Bin 0 -> 18209 bytes sw/qa/extras/ooxmlexport/data/tdf116194.docx | Bin 0 -> 17227 bytes sw/qa/extras/ooxmlexport/data/tdf116371.odt | Bin 0 -> 13384 bytes sw/qa/extras/ooxmlexport/data/tdf116394.docx | Bin 0 -> 11537 bytes sw/qa/extras/ooxmlexport/data/tdf116410.docx | Bin 0 -> 49192 bytes .../extras/ooxmlexport/data/tdf116436_rowFill.odt | Bin 0 -> 10835 bytes sw/qa/extras/ooxmlexport/data/tdf116801.docx | Bin 0 -> 28554 bytes sw/qa/extras/ooxmlexport/data/tdf116883.docx | Bin 0 -> 10422 bytes sw/qa/extras/ooxmlexport/data/tdf116976.docx | Bin 0 -> 14983 bytes sw/qa/extras/ooxmlexport/data/tdf116985.docx | Bin 0 -> 13508 bytes sw/qa/extras/ooxmlexport/data/tdf117137.docx | Bin 0 -> 17888 bytes .../ooxmlexport/data/tdf117297_tableStyle.docx | Bin 0 -> 12279 bytes .../data/tdf117504_numberingIndent.docx | Bin 0 -> 15821 bytes sw/qa/extras/ooxmlexport/data/tdf117805.odt | Bin 0 -> 14897 bytes sw/qa/extras/ooxmlexport/data/tdf117988.docx | Bin 0 -> 10553 bytes sw/qa/extras/ooxmlexport/data/tdf118169.docx | Bin 0 -> 5650 bytes sw/qa/extras/ooxmlexport/data/tdf118242.odt | Bin 0 -> 30562 bytes .../data/tdf118361_RTLfootnoteSeparator.docx | Bin 0 -> 13551 bytes .../ooxmlexport/data/tdf118521_marginsLR.docx | Bin 0 -> 11538 bytes sw/qa/extras/ooxmlexport/data/tdf118535.odt | Bin 0 -> 12032 bytes sw/qa/extras/ooxmlexport/data/tdf118682.fodt | 36 + sw/qa/extras/ooxmlexport/data/tdf118691.docx | Bin 0 -> 27096 bytes sw/qa/extras/ooxmlexport/data/tdf118701.docx | Bin 0 -> 21644 bytes sw/qa/extras/ooxmlexport/data/tdf118702.odt | Bin 0 -> 8620 bytes .../data/tdf118812_tableStyles-comprehensive.docx | Bin 0 -> 12382 bytes .../ooxmlexport/data/tdf118947_tableStyle.docx | Bin 0 -> 9461 bytes .../ooxmlexport/data/tdf118947_tableStyle2.docx | Bin 0 -> 9578 bytes sw/qa/extras/ooxmlexport/data/tdf119037.odt | Bin 0 -> 12291 bytes sw/qa/extras/ooxmlexport/data/tdf119054.docx | Bin 0 -> 18842 bytes sw/qa/extras/ooxmlexport/data/tdf119143.docx | Bin 0 -> 17052 bytes .../data/tdf119188_list_margin_in_cell.docx | Bin 0 -> 13663 bytes sw/qa/extras/ooxmlexport/data/tdf119201.docx | Bin 0 -> 24206 bytes .../data/tdf119760_positionCellBorder.docx | Bin 0 -> 13144 bytes .../data/tdf119760_tableInTablePosition.docx | Bin 0 -> 4698 bytes sw/qa/extras/ooxmlexport/data/tdf119800.docx | Bin 0 -> 14336 bytes sw/qa/extras/ooxmlexport/data/tdf119809.docx | Bin 0 -> 22211 bytes .../data/tdf119952_negativeMargins.docx | Bin 0 -> 23533 bytes .../data/tdf120224_textControlCrossRef.docx | Bin 0 -> 16356 bytes sw/qa/extras/ooxmlexport/data/tdf120315.docx | Bin 0 -> 12276 bytes sw/qa/extras/ooxmlexport/data/tdf120338.docx | Bin 0 -> 14898 bytes .../ooxmlexport/data/tdf120344_FontTypes.docx | Bin 0 -> 13217 bytes sw/qa/extras/ooxmlexport/data/tdf120394.docx | Bin 0 -> 11032 bytes .../data/tdf120412_400PercentSubscript.docx | Bin 0 -> 10691 bytes .../ooxmlexport/data/tdf120511_eatenSection.docx | Bin 0 -> 29319 bytes .../ooxmlexport/data/tdf120760_ZOrderInHeader.docx | Bin 0 -> 40418 bytes .../data/tdf120852_readOnlyProtection.docx | Bin 0 -> 7727 bytes .../data/tdf120852_readOnlyUnProtected.docx | Bin 0 -> 11446 bytes sw/qa/extras/ooxmlexport/data/tdf121045.docx | Bin 0 -> 28392 bytes sw/qa/extras/ooxmlexport/data/tdf121176.docx | Bin 0 -> 30973 bytes .../ooxmlexport/data/tdf121374_sectionHF.odt | Bin 0 -> 9719 bytes .../ooxmlexport/data/tdf121374_sectionHF2.doc | Bin 0 -> 127488 bytes sw/qa/extras/ooxmlexport/data/tdf121441.docx | Bin 0 -> 23346 bytes sw/qa/extras/ooxmlexport/data/tdf121456.docx | Bin 0 -> 5277 bytes .../ooxmlexport/data/tdf121456_tabsOffset.odt | Bin 0 -> 14208 bytes sw/qa/extras/ooxmlexport/data/tdf121597.odt | Bin 0 -> 10592 bytes sw/qa/extras/ooxmlexport/data/tdf121658.docx | Bin 0 -> 20859 bytes .../data/tdf121659_loseColumnBrNextToShape.docx | Bin 0 -> 23557 bytes sw/qa/extras/ooxmlexport/data/tdf121661.docx | Bin 0 -> 20885 bytes sw/qa/extras/ooxmlexport/data/tdf121663.docx | Bin 0 -> 21773 bytes .../data/tdf121665_back2backColumnBreaks.docx | Bin 0 -> 5127 bytes .../ooxmlexport/data/tdf121666_lostPage.docx | Bin 0 -> 20235 bytes .../ooxmlexport/data/tdf121669_equalColumns.docx | Bin 0 -> 20227 bytes .../data/tdf121670_columnsInSectionsOnly.docx | Bin 0 -> 11270 bytes sw/qa/extras/ooxmlexport/data/tdf121784.docx | Bin 0 -> 5937 bytes sw/qa/extras/ooxmlexport/data/tdf121867.odt | Bin 0 -> 7856 bytes .../ooxmlexport/data/tdf122186_input_list.odt | Bin 0 -> 8068 bytes .../data/tdf122201_editUnprotectedText.odt | Bin 0 -> 7104 bytes sw/qa/extras/ooxmlexport/data/tdf122342.docx | Bin 0 -> 12443 bytes sw/qa/extras/ooxmlexport/data/tdf122563.docx | Bin 0 -> 24895 bytes sw/qa/extras/ooxmlexport/data/tdf122594.docx | Bin 0 -> 23235 bytes sw/qa/extras/ooxmlexport/data/tdf122648.docx | Bin 0 -> 4767 bytes sw/qa/extras/ooxmlexport/data/tdf123054.docx | Bin 0 -> 29457 bytes sw/qa/extras/ooxmlexport/data/tdf123104.docx | Bin 0 -> 24314 bytes .../data/tdf123116_oversizedRowSplit.odt | Bin 0 -> 11843 bytes sw/qa/extras/ooxmlexport/data/tdf123243.docx | Bin 0 -> 11905 bytes .../data/tdf123262_textFootnoteSeparators.docx | Bin 0 -> 29044 bytes ...RelativeAnchorHeightFromTopMarginHasHeader.docx | Bin 0 -> 20882 bytes ...tRelativeAnchorHeightFromTopMarginNoHeader.docx | Bin 0 -> 14683 bytes .../ooxmlexport/data/tdf123346_ArrowMarker.docx | Bin 0 -> 12804 bytes .../data/tdf123351_UnderlineGroupSapeText.docx | Bin 0 -> 33000 bytes sw/qa/extras/ooxmlexport/data/tdf123354.fodt | 40 + sw/qa/extras/ooxmlexport/data/tdf123355.docx | Bin 0 -> 74156 bytes sw/qa/extras/ooxmlexport/data/tdf123356.fodt | 40 + sw/qa/extras/ooxmlexport/data/tdf123381.docx | Bin 0 -> 11895 bytes sw/qa/extras/ooxmlexport/data/tdf123382.docx | Bin 0 -> 17952 bytes sw/qa/extras/ooxmlexport/data/tdf123386.docx | Bin 0 -> 14928 bytes sw/qa/extras/ooxmlexport/data/tdf123388.docx | Bin 0 -> 19614 bytes sw/qa/extras/ooxmlexport/data/tdf123389.docx | Bin 0 -> 13649 bytes sw/qa/extras/ooxmlexport/data/tdf123390.fodt | 40 + sw/qa/extras/ooxmlexport/data/tdf123401.fodt | 36 + sw/qa/extras/ooxmlexport/data/tdf123435.docx | Bin 0 -> 27738 bytes sw/qa/extras/ooxmlexport/data/tdf123460.docx | Bin 0 -> 13060 bytes .../data/tdf123569_rotWriterImage_46deg.odt | Bin 0 -> 18450 bytes .../ooxmlexport/data/tdf123610_handle_upright.docx | Bin 0 -> 14711 bytes sw/qa/extras/ooxmlexport/data/tdf123621.docx | Bin 0 -> 14753 bytes sw/qa/extras/ooxmlexport/data/tdf123622.docx | Bin 0 -> 13441 bytes sw/qa/extras/ooxmlexport/data/tdf123627.docx | Bin 0 -> 12153 bytes sw/qa/extras/ooxmlexport/data/tdf123628.odt | Bin 0 -> 8410 bytes .../data/tdf123636_newlinePageBreak.docx | Bin 0 -> 10107 bytes .../data/tdf123636_newlinePageBreak2.docx | Bin 0 -> 15014 bytes .../data/tdf123636_newlinePageBreak3.docx | Bin 0 -> 10411 bytes .../data/tdf123636_newlinePageBreak4.docx | Bin 0 -> 10347 bytes sw/qa/extras/ooxmlexport/data/tdf123642.docx | Bin 0 -> 17814 bytes sw/qa/extras/ooxmlexport/data/tdf123705.docx | Bin 0 -> 49292 bytes sw/qa/extras/ooxmlexport/data/tdf123757.docx | Bin 0 -> 16781 bytes sw/qa/extras/ooxmlexport/data/tdf123873.docx | Bin 0 -> 6951 bytes .../ooxmlexport/data/tdf123912_protectedForm.odt | Bin 0 -> 9604 bytes sw/qa/extras/ooxmlexport/data/tdf124367.docx | Bin 0 -> 12180 bytes sw/qa/extras/ooxmlexport/data/tdf124384.docx | Bin 0 -> 37437 bytes .../data/tdf124399_SingleCellTableBorders.docx | Bin 0 -> 12183 bytes sw/qa/extras/ooxmlexport/data/tdf124472.docx | Bin 0 -> 13354 bytes sw/qa/extras/ooxmlexport/data/tdf124491.docx | Bin 0 -> 12794 bytes sw/qa/extras/ooxmlexport/data/tdf124594.docx | Bin 0 -> 18592 bytes sw/qa/extras/ooxmlexport/data/tdf124600b.docx | Bin 0 -> 15959 bytes sw/qa/extras/ooxmlexport/data/tdf124604.docx | Bin 0 -> 35311 bytes .../ooxmlexport/data/tdf124637_sectionMargin.docx | Bin 0 -> 21535 bytes .../data/tdf124678_no_leading_paragraph.odt | Bin 0 -> 9122 bytes .../data/tdf124678_with_leading_paragraph.odt | Bin 0 -> 9164 bytes sw/qa/extras/ooxmlexport/data/tdf124795-5.docx | Bin 0 -> 36739 bytes sw/qa/extras/ooxmlexport/data/tdf124986.docx | Bin 0 -> 12108 bytes .../data/tdf125038_conditionalText3.docx | Bin 0 -> 19938 bytes sw/qa/extras/ooxmlexport/data/tdf125268.odt | Bin 0 -> 8432 bytes .../tdf125298_crossreflink_nonascii_charlimit.docx | Bin 0 -> 5194 bytes sw/qa/extras/ooxmlexport/data/tdf125324.docx | Bin 0 -> 14007 bytes sw/qa/extras/ooxmlexport/data/tdf125338.docm | Bin 0 -> 20187 bytes sw/qa/extras/ooxmlexport/data/tdf125518.odt | Bin 0 -> 34438 bytes sw/qa/extras/ooxmlexport/data/tdf125546.docx | Bin 0 -> 20716 bytes sw/qa/extras/ooxmlexport/data/tdf125657.docx | Bin 0 -> 19731 bytes .../data/tdf125778_lostPageBreakTOX.docx | Bin 0 -> 18696 bytes sw/qa/extras/ooxmlexport/data/tdf125894.docx | Bin 0 -> 23870 bytes .../data/tdf125936_numberingSuperscript.docx | Bin 0 -> 25589 bytes sw/qa/extras/ooxmlexport/data/tdf126206.docx | Bin 0 -> 12509 bytes sw/qa/extras/ooxmlexport/data/tdf126245.docx | Bin 0 -> 19219 bytes sw/qa/extras/ooxmlexport/data/tdf126287.docx | Bin 0 -> 8701 bytes .../data/tdf126363_LineWidthRounding.docx | Bin 0 -> 9956 bytes sw/qa/extras/ooxmlexport/data/tdf126590.docx | Bin 0 -> 12046 bytes sw/qa/extras/ooxmlexport/data/tdf126723.docx | Bin 0 -> 18689 bytes sw/qa/extras/ooxmlexport/data/tdf126768.docx | Bin 0 -> 12242 bytes sw/qa/extras/ooxmlexport/data/tdf126792.odt | Bin 0 -> 8403 bytes .../data/tdf126795_TabsRelativeToIndent0.odt | Bin 0 -> 16401 bytes .../data/tdf126795_TabsRelativeToIndent1.odt | Bin 0 -> 16424 bytes .../ooxmlexport/data/tdf126994_lostPageBreak.docx | Bin 0 -> 17107 bytes sw/qa/extras/ooxmlexport/data/tdf127085.docx | Bin 0 -> 34263 bytes sw/qa/extras/ooxmlexport/data/tdf127116.odt | Bin 0 -> 8573 bytes .../ooxmlexport/data/tdf127316_autoEscapement.odt | Bin 0 -> 11475 bytes sw/qa/extras/ooxmlexport/data/tdf127339.docx | Bin 0 -> 13057 bytes sw/qa/extras/ooxmlexport/data/tdf127362.odt | Bin 0 -> 9702 bytes sw/qa/extras/ooxmlexport/data/tdf127579.odt | Bin 0 -> 8551 bytes sw/qa/extras/ooxmlexport/data/tdf127605.odt | Bin 0 -> 9958 bytes .../extras/ooxmlexport/data/tdf127622_framePr.docx | Bin 0 -> 32759 bytes sw/qa/extras/ooxmlexport/data/tdf127741.docx | Bin 0 -> 19275 bytes sw/qa/extras/ooxmlexport/data/tdf127814.docx | Bin 0 -> 29713 bytes sw/qa/extras/ooxmlexport/data/tdf127864.docx | Bin 0 -> 4726 bytes sw/qa/extras/ooxmlexport/data/tdf127925.odt | Bin 0 -> 8677 bytes sw/qa/extras/ooxmlexport/data/tdf128156.docx | Bin 0 -> 42256 bytes sw/qa/extras/ooxmlexport/data/tdf128207.docx | Bin 0 -> 50324 bytes sw/qa/extras/ooxmlexport/data/tdf128245.docx | Bin 0 -> 8276 bytes sw/qa/extras/ooxmlexport/data/tdf128290.odt | Bin 0 -> 9782 bytes sw/qa/extras/ooxmlexport/data/tdf128304.odt | Bin 0 -> 15138 bytes sw/qa/extras/ooxmlexport/data/tdf128646.docx | Bin 0 -> 24912 bytes sw/qa/extras/ooxmlexport/data/tdf128752.docx | Bin 0 -> 13621 bytes sw/qa/extras/ooxmlexport/data/tdf128820.fodt | 16 + sw/qa/extras/ooxmlexport/data/tdf128889.fodt | 15 + sw/qa/extras/ooxmlexport/data/tdf128913.docx | Bin 0 -> 10392 bytes .../ooxmlexport/data/tdf129242_InsideBorders.docx | Bin 0 -> 12222 bytes sw/qa/extras/ooxmlexport/data/tdf129353.docx | Bin 0 -> 4420 bytes .../ooxmlexport/data/tdf129442_RightBorder.docx | Bin 0 -> 12167 bytes .../ooxmlexport/data/tdf129450_BottomBorder.docx | Bin 0 -> 12195 bytes .../ooxmlexport/data/tdf129452_BottomBorders.docx | Bin 0 -> 11237 bytes .../ooxmlexport/data/tdf129452_excessBorder.docx | Bin 0 -> 11115 bytes .../data/tdf129522_removeShadowStyle.odt | Bin 0 -> 14253 bytes sw/qa/extras/ooxmlexport/data/tdf129525.rtf | 262 ++ .../ooxmlexport/data/tdf129575-directAfter.docx | Bin 0 -> 18625 bytes .../ooxmlexport/data/tdf129575-directBefore.docx | Bin 0 -> 19246 bytes .../ooxmlexport/data/tdf129575-docDefault.docx | Bin 0 -> 38088 bytes .../ooxmlexport/data/tdf129575-styleAfter.docx | Bin 0 -> 18620 bytes sw/qa/extras/ooxmlexport/data/tdf129888dml.docx | Bin 0 -> 17003 bytes sw/qa/extras/ooxmlexport/data/tdf129888vml.docx | Bin 0 -> 17979 bytes sw/qa/extras/ooxmlexport/data/tdf130088.docx | Bin 0 -> 16961 bytes sw/qa/extras/ooxmlexport/data/tdf130120.docx | Bin 0 -> 23067 bytes sw/qa/extras/ooxmlexport/data/tdf130494.docx | Bin 0 -> 17455 bytes .../data/tdf130610_bold_in_2_styles.ott | Bin 0 -> 10062 bytes sw/qa/extras/ooxmlexport/data/tdf130690.docx | Bin 0 -> 13323 bytes sw/qa/extras/ooxmlexport/data/tdf130814.docx | Bin 0 -> 18008 bytes sw/qa/extras/ooxmlexport/data/tdf130907.docx | Bin 0 -> 12201 bytes sw/qa/extras/ooxmlexport/data/tdf131203.docx | Bin 0 -> 3890 bytes sw/qa/extras/ooxmlexport/data/tdf131258.docx | Bin 0 -> 18939 bytes sw/qa/extras/ooxmlexport/data/tdf131260.docx | Bin 0 -> 14773 bytes sw/qa/extras/ooxmlexport/data/tdf131420.docx | Bin 0 -> 11981 bytes sw/qa/extras/ooxmlexport/data/tdf131537.odt | Bin 0 -> 15318 bytes sw/qa/extras/ooxmlexport/data/tdf131539.odt | Bin 0 -> 35907 bytes sw/qa/extras/ooxmlexport/data/tdf131540.odt | Bin 0 -> 36613 bytes .../data/tdf131561_necessaryBorder.docx | Bin 0 -> 9385 bytes sw/qa/extras/ooxmlexport/data/tdf131594.docx | Bin 0 -> 17358 bytes sw/qa/extras/ooxmlexport/data/tdf131722.docx | Bin 0 -> 18825 bytes .../data/tdf131775_SpacingGroupShapeText.docx | Bin 0 -> 16290 bytes .../data/tdf131776_StrikeoutGroupShapeText.docx | Bin 0 -> 42520 bytes sw/qa/extras/ooxmlexport/data/tdf131801.docx | Bin 0 -> 12067 bytes .../data/tdf131922_LanguageInGroupShape.docx | Bin 0 -> 18178 bytes .../extras/ooxmlexport/data/tdf132149_pgBreak.odt | Bin 0 -> 14309 bytes .../extras/ooxmlexport/data/tdf132149_pgBreak2.odt | Bin 0 -> 17550 bytes .../extras/ooxmlexport/data/tdf132149_pgBreakB.odt | Bin 0 -> 14621 bytes sw/qa/extras/ooxmlexport/data/tdf132185.docx | Bin 0 -> 2183 bytes sw/qa/extras/ooxmlexport/data/tdf132271.docx | Bin 0 -> 12861 bytes sw/qa/extras/ooxmlexport/data/tdf132305.docx | Bin 0 -> 13398 bytes .../ooxmlexport/data/tdf132475_printField.docx | Bin 0 -> 11229 bytes sw/qa/extras/ooxmlexport/data/tdf132483.docx | Bin 0 -> 21183 bytes .../tdf132491_UnderlineColorGroupedShapes.docx | Bin 0 -> 16784 bytes sw/qa/extras/ooxmlexport/data/tdf132514.docx | Bin 0 -> 16787 bytes sw/qa/extras/ooxmlexport/data/tdf132752.docx | Bin 0 -> 26741 bytes sw/qa/extras/ooxmlexport/data/tdf132754.docx | Bin 0 -> 13249 bytes sw/qa/extras/ooxmlexport/data/tdf132766.docx | Bin 0 -> 5241 bytes sw/qa/extras/ooxmlexport/data/tdf132802.docx | Bin 0 -> 12960 bytes sw/qa/extras/ooxmlexport/data/tdf132807.docx | Bin 0 -> 13154 bytes .../ooxmlexport/data/tdf132898_extraBorder.docx | Bin 0 -> 11252 bytes .../ooxmlexport/data/tdf132898_missingBorder.docx | Bin 0 -> 25304 bytes ...2976_testRelativeAnchorWidthFromLeftMargin.docx | Bin 0 -> 14864 bytes .../data/tdf133000_numStyleFormatting.docx | Bin 0 -> 13761 bytes sw/qa/extras/ooxmlexport/data/tdf133030.docx | Bin 0 -> 12451 bytes sw/qa/extras/ooxmlexport/data/tdf133035.docx | Bin 0 -> 16259 bytes ...45_TestShapeAlignmentRelativeFromTopMargin.docx | Bin 0 -> 19805 bytes sw/qa/extras/ooxmlexport/data/tdf133052.docx | Bin 0 -> 13891 bytes sw/qa/extras/ooxmlexport/data/tdf133065.odt | Bin 0 -> 64161 bytes ...ativeAnchorHeightFromBottomMarginHasFooter.docx | Bin 0 -> 19378 bytes ...lativeAnchorHeightFromBottomMarginNoFooter.docx | Bin 0 -> 14632 bytes sw/qa/extras/ooxmlexport/data/tdf133163.fodt | 36 + .../ooxmlexport/data/tdf133334_followPgStyle.odt | Bin 0 -> 19219 bytes sw/qa/extras/ooxmlexport/data/tdf133363.docx | Bin 0 -> 13891 bytes .../ooxmlexport/data/tdf133370_columnBreak.odt | Bin 0 -> 18388 bytes sw/qa/extras/ooxmlexport/data/tdf133455.docx | Bin 0 -> 15724 bytes sw/qa/extras/ooxmlexport/data/tdf133457.docx | Bin 0 -> 4525 bytes sw/qa/extras/ooxmlexport/data/tdf133473.docx | Bin 0 -> 83030 bytes sw/qa/extras/ooxmlexport/data/tdf133605.docx | Bin 0 -> 21862 bytes sw/qa/extras/ooxmlexport/data/tdf133605_2.docx | Bin 0 -> 21978 bytes sw/qa/extras/ooxmlexport/data/tdf133643.doc | Bin 0 -> 27136 bytes sw/qa/extras/ooxmlexport/data/tdf133647.docx | Bin 0 -> 14536 bytes ...670_testRelativeAnchorWidthFromRightMargin.docx | Bin 0 -> 14953 bytes sw/qa/extras/ooxmlexport/data/tdf133701.docx | Bin 0 -> 12392 bytes sw/qa/extras/ooxmlexport/data/tdf133702.docx | Bin 0 -> 12138 bytes sw/qa/extras/ooxmlexport/data/tdf133771.odt | Bin 0 -> 12738 bytes ...RelativeAnchorWidthFromInsideOutsideMargin.docx | Bin 0 -> 10536 bytes sw/qa/extras/ooxmlexport/data/tdf133924.docx | Bin 0 -> 12612 bytes sw/qa/extras/ooxmlexport/data/tdf134063.docx | Bin 0 -> 19378 bytes .../ooxmlexport/data/tdf134114_allowOverlap.docx | Bin 0 -> 19264 bytes sw/qa/extras/ooxmlexport/data/tdf134260.docx | Bin 0 -> 14233 bytes .../ooxmlexport/data/tdf134569_nestedTable.docx | Bin 0 -> 17060 bytes sw/qa/extras/ooxmlexport/data/tdf134606.docx | Bin 0 -> 21603 bytes .../ooxmlexport/data/tdf134609_gridAfter.docx | Bin 0 -> 11574 bytes sw/qa/extras/ooxmlexport/data/tdf134618.doc | Bin 0 -> 23552 bytes .../ooxmlexport/data/tdf134619_numberingProps.doc | Bin 0 -> 75264 bytes sw/qa/extras/ooxmlexport/data/tdf134648.docx | Bin 0 -> 15198 bytes .../ooxmlexport/data/tdf134649_pageBreak.fodt | 86 + sw/qa/extras/ooxmlexport/data/tdf134784.docx | Bin 0 -> 28416 bytes .../ooxmlexport/data/tdf134951_duplicates.odt | Bin 0 -> 59232 bytes .../data/tdf135047_ImageSpaceSettings.fodt | 42 + .../data/tdf135164_cancelledNumbering.docx | Bin 0 -> 19962 bytes sw/qa/extras/ooxmlexport/data/tdf135187.docx | Bin 0 -> 19696 bytes .../ooxmlexport/data/tdf135329_lostImage.odt | Bin 0 -> 29541 bytes .../data/tdf135343_columnSectionBreak_c12v3.docx | Bin 0 -> 11087 bytes .../data/tdf135343_columnSectionBreak_c14.docx | Bin 0 -> 11891 bytes .../data/tdf135343_columnSectionBreak_c14v2.docx | Bin 0 -> 11298 bytes .../data/tdf135343_columnSectionBreak_c15.docx | Bin 0 -> 11890 bytes .../ooxmlexport/data/tdf135595_HFtableWrap.odt | Bin 0 -> 97647 bytes .../data/tdf135595_HFtableWrap_c12.docx | Bin 0 -> 74051 bytes sw/qa/extras/ooxmlexport/data/tdf135653.docx | Bin 0 -> 15117 bytes sw/qa/extras/ooxmlexport/data/tdf135655.odt | Bin 0 -> 18707 bytes sw/qa/extras/ooxmlexport/data/tdf135660.docx | Bin 0 -> 20134 bytes sw/qa/extras/ooxmlexport/data/tdf135665.docx | Bin 0 -> 25099 bytes sw/qa/extras/ooxmlexport/data/tdf135667.odt | Bin 0 -> 16180 bytes .../data/tdf135774_numberingCRProps.docx | Bin 0 -> 9989 bytes .../data/tdf135774_numberingShading.docx | Bin 0 -> 5435 bytes sw/qa/extras/ooxmlexport/data/tdf135786.docx | Bin 0 -> 5569 bytes sw/qa/extras/ooxmlexport/data/tdf135906.docx | Bin 0 -> 35926 bytes sw/qa/extras/ooxmlexport/data/tdf135923-min.docx | Bin 0 -> 16777 bytes ...35943_shapeWithText_LayoutInCell0_compat15.docx | Bin 0 -> 16850 bytes .../data/tdf135949_anchoredBeforeBreak.docx | Bin 0 -> 49510 bytes sw/qa/extras/ooxmlexport/data/tdf135973.odt | Bin 0 -> 14301 bytes sw/qa/extras/ooxmlexport/data/tdf136059.odt | Bin 0 -> 17964 bytes .../data/tdf136386_WrapPolygonCurve.odt | Bin 0 -> 15739 bytes .../data/tdf136386_WrapPolygonLineShape.odt | Bin 0 -> 15715 bytes sw/qa/extras/ooxmlexport/data/tdf136404.fodt | 65 + .../data/tdf136441_commentInFootnote.odt | Bin 0 -> 11777 bytes .../ooxmlexport/data/tdf136589_paraHadField.docx | Bin 0 -> 39738 bytes sw/qa/extras/ooxmlexport/data/tdf136617.docx | Bin 0 -> 20185 bytes sw/qa/extras/ooxmlexport/data/tdf136667.docx | Bin 0 -> 12729 bytes sw/qa/extras/ooxmlexport/data/tdf136814.odt | Bin 0 -> 8249 bytes sw/qa/extras/ooxmlexport/data/tdf136841.docx | Bin 0 -> 15697 bytes sw/qa/extras/ooxmlexport/data/tdf136850.docx | Bin 0 -> 31943 bytes .../data/tdf136929_framesOfParagraph.odt | Bin 0 -> 179339 bytes .../ooxmlexport/data/tdf136952_pgBreak3B.odt | Bin 0 -> 14321 bytes sw/qa/extras/ooxmlexport/data/tdf137295.doc | Bin 0 -> 26624 bytes sw/qa/extras/ooxmlexport/data/tdf137466.docx | Bin 0 -> 20243 bytes sw/qa/extras/ooxmlexport/data/tdf137593.docx | Bin 0 -> 15697 bytes .../data/tdf137641_RelativeFromTopMargin.docx | Bin 0 -> 19650 bytes .../data/tdf137642_Vertical_Alignment_toppage.docx | Bin 0 -> 13163 bytes sw/qa/extras/ooxmlexport/data/tdf137655.docx | Bin 0 -> 33098 bytes .../data/tdf137678_testVmlLineShapeMirroredY.docx | Bin 0 -> 13192 bytes .../data/tdf137683_charHighlightTests.docx | Bin 0 -> 9877 bytes sw/qa/extras/ooxmlexport/data/tdf137742.docx | Bin 0 -> 6925 bytes .../data/tdf137765_testVmlLineShapeRotated.docx | Bin 0 -> 13280 bytes .../ooxmlexport/data/tdf137850_compat14ZOrder.docx | Bin 0 -> 24821 bytes .../ooxmlexport/data/tdf137850_compat15ZOrder.docx | Bin 0 -> 24816 bytes sw/qa/extras/ooxmlexport/data/tdf138093.docx | Bin 0 -> 39532 bytes .../data/tdf138345_charStyleHighlight.docx | Bin 0 -> 4434 bytes .../data/tdf138345_numberingHighlight.docx | Bin 0 -> 5752 bytes sw/qa/extras/ooxmlexport/data/tdf138374.odt | Bin 0 -> 10053 bytes sw/qa/extras/ooxmlexport/data/tdf138612.docx | Bin 0 -> 36179 bytes sw/qa/extras/ooxmlexport/data/tdf138739.docx | Bin 0 -> 16780 bytes sw/qa/extras/ooxmlexport/data/tdf138771.docx | Bin 0 -> 26757 bytes sw/qa/extras/ooxmlexport/data/tdf138780.odt | Bin 0 -> 9383 bytes .../ooxmlexport/data/tdf138892_noNumbering.docx | Bin 0 -> 18468 bytes sw/qa/extras/ooxmlexport/data/tdf138899.docx | Bin 0 -> 22715 bytes sw/qa/extras/ooxmlexport/data/tdf139128.odt | Bin 0 -> 8645 bytes sw/qa/extras/ooxmlexport/data/tdf139549.docx | Bin 0 -> 18155 bytes sw/qa/extras/ooxmlexport/data/tdf139580.odt | Bin 0 -> 17378 bytes .../data/tdf139759_commentHighlightBackground.docx | Bin 0 -> 10319 bytes sw/qa/extras/ooxmlexport/data/tdf139948.docx | Bin 0 -> 12765 bytes sw/qa/extras/ooxmlexport/data/tdf140137.docx | Bin 0 -> 28792 bytes .../ooxmlexport/data/tdf140182_extraPagebreak.docx | Bin 0 -> 34729 bytes .../ooxmlexport/data/tdf140336_paraNoneShading.odt | Bin 0 -> 10529 bytes .../data/tdf140572_docDefault_superscript.docx | Bin 0 -> 16387 bytes sw/qa/extras/ooxmlexport/data/tdf140597.docx | Bin 0 -> 13966 bytes sw/qa/extras/ooxmlexport/data/tdf140668.docx | Bin 0 -> 14629 bytes sw/qa/extras/ooxmlexport/data/tdf141172.docx | Bin 0 -> 16286 bytes .../ooxmlexport/data/tdf141173_missingFrames.rtf | 61 + .../data/tdf141231_arabicHebrewNumbering.docx | Bin 0 -> 20367 bytes sw/qa/extras/ooxmlexport/data/tdf141548.docx | Bin 0 -> 4675 bytes sw/qa/extras/ooxmlexport/data/tdf141550.docx | Bin 0 -> 18735 bytes sw/qa/extras/ooxmlexport/data/tdf141660.docx | Bin 0 -> 35150 bytes .../data/tdf141966_chapterNumberTortureTest.docx | Bin 0 -> 6323 bytes .../data/tdf141966_chapterNumbering.docx | Bin 0 -> 6846 bytes .../ooxmlexport/data/tdf142361ShadowDirection.odt | Bin 0 -> 9135 bytes sw/qa/extras/ooxmlexport/data/tdf142387.docx | Bin 0 -> 13268 bytes .../data/tdf142404_tabOverMarginC15.docx | Bin 0 -> 9218 bytes .../data/tdf142404_tabOverSpacingC15.odt | Bin 0 -> 16596 bytes .../ooxmlexport/data/tdf142404_tabSpacing.docx | Bin 0 -> 9287 bytes sw/qa/extras/ooxmlexport/data/tdf142407.docx | Bin 0 -> 13527 bytes .../data/tdf142433_WrapPolygonCustomShape.odt | Bin 0 -> 13306 bytes sw/qa/extras/ooxmlexport/data/tdf142464_ampm.docx | Bin 0 -> 15171 bytes .../ooxmlexport/data/tdf142486_FrameShadow.odt | Bin 0 -> 14129 bytes .../data/tdf142486_LeftMarginShadowLeft.docx | Bin 0 -> 21616 bytes .../data/tdf142542_cancelledAutospacing.docx | Bin 0 -> 23239 bytes .../data/tdf142693_hugePaperSizeImport.docx | Bin 0 -> 4371 bytes sw/qa/extras/ooxmlexport/data/tdf142700.docx | Bin 0 -> 18373 bytes sw/qa/extras/ooxmlexport/data/tdf143175.docx | Bin 0 -> 4651 bytes .../data/tdf143219ContourWrap_glow_rotate.docx | Bin 0 -> 27622 bytes .../data/tdf143219ContourWrap_stroke_shadow.docx | Bin 0 -> 20398 bytes .../tdf143384_tableInFoot_negativeMargins.docx | Bin 0 -> 58566 bytes sw/qa/extras/ooxmlexport/data/tdf143399.docx | Bin 0 -> 10556 bytes .../data/tdf143432_Frame_WrapTextMode.odt | Bin 0 -> 14147 bytes .../data/tdf143583_emptyParaAtEndOfFootnote.docx | Bin 0 -> 8777 bytes .../data/tdf143692_outlineLevelTortureTest.docx | Bin 0 -> 20964 bytes .../data/tdf143860_NonPrimitiveCustomShape.odt | Bin 0 -> 9408 bytes sw/qa/extras/ooxmlexport/data/tdf144362.odt | Bin 0 -> 10328 bytes sw/qa/extras/ooxmlexport/data/tdf144563.docx | Bin 0 -> 17488 bytes sw/qa/extras/ooxmlexport/data/tdf144668.odt | Bin 0 -> 8913 bytes .../data/tdf145998_unnecessaryPageStyles.odt | Bin 0 -> 11742 bytes sw/qa/extras/ooxmlexport/data/tdf146171.docx | Bin 0 -> 11710 bytes sw/qa/extras/ooxmlexport/data/tdf146346.docx | Bin 0 -> 20285 bytes sw/qa/extras/ooxmlexport/data/tdf146491.odt | Bin 0 -> 31278 bytes sw/qa/extras/ooxmlexport/data/tdf146515.odt | Bin 0 -> 12991 bytes sw/qa/extras/ooxmlexport/data/tdf146802.docx | Bin 0 -> 72360 bytes sw/qa/extras/ooxmlexport/data/tdf146851_1.docx | Bin 0 -> 12378 bytes sw/qa/extras/ooxmlexport/data/tdf146851_2.docx | Bin 0 -> 14171 bytes sw/qa/extras/ooxmlexport/data/tdf146955.odt | Bin 0 -> 77189 bytes .../ooxmlexport/data/tdf146984_anchorInShape.docx | Bin 0 -> 279883 bytes .../ooxmlexport/data/tdf147115_defaultStyle.docx | Bin 0 -> 12060 bytes .../data/tdf147646_mergedCellNumbering.docx | Bin 0 -> 16540 bytes sw/qa/extras/ooxmlexport/data/tdf147724.docx | Bin 0 -> 9928 bytes sw/qa/extras/ooxmlexport/data/tdf147810.odt | Bin 0 -> 10890 bytes .../ooxmlexport/data/tdf147861_customField.docx | Bin 0 -> 6473 bytes sw/qa/extras/ooxmlexport/data/tdf147892.fodt | 25 + .../data/tdf147978_enhancedPath_commandABVW.odt | Bin 0 -> 11581 bytes sw/qa/extras/ooxmlexport/data/tdf148026.fodt | 14 + sw/qa/extras/ooxmlexport/data/tdf148052.docx | Bin 0 -> 17854 bytes sw/qa/extras/ooxmlexport/data/tdf148111.docx | Bin 0 -> 18731 bytes sw/qa/extras/ooxmlexport/data/tdf148132.docx | Bin 0 -> 3702 bytes .../data/tdf148273_sectionBulletFormatLeak.docx | Bin 0 -> 15161 bytes sw/qa/extras/ooxmlexport/data/tdf148360.docx | Bin 0 -> 3574 bytes sw/qa/extras/ooxmlexport/data/tdf148361.docx | Bin 0 -> 10663 bytes .../ooxmlexport/data/tdf148380_createField.docx | Bin 0 -> 12312 bytes .../ooxmlexport/data/tdf148380_fldLocked.docx | Bin 0 -> 12547 bytes .../ooxmlexport/data/tdf148380_modifiedField.docx | Bin 0 -> 7267 bytes .../ooxmlexport/data/tdf148380_printField.docx | Bin 0 -> 9399 bytes .../ooxmlexport/data/tdf148380_usernameField.docx | Bin 0 -> 16239 bytes sw/qa/extras/ooxmlexport/data/tdf148455_1.docx | Bin 0 -> 3038 bytes sw/qa/extras/ooxmlexport/data/tdf148455_2.docx | Bin 0 -> 3022 bytes sw/qa/extras/ooxmlexport/data/tdf148494.docx | Bin 0 -> 11605 bytes sw/qa/extras/ooxmlexport/data/tdf148671.docx | Bin 0 -> 33869 bytes sw/qa/extras/ooxmlexport/data/tdf148720.odt | Bin 0 -> 11848 bytes .../ooxmlexport/data/tdf148834_lineNumbering.odt | Bin 0 -> 17756 bytes sw/qa/extras/ooxmlexport/data/tdf148952.odt | Bin 0 -> 11038 bytes .../data/tdf148956_directEndFormatting.docx | Bin 0 -> 6147 bytes sw/qa/extras/ooxmlexport/data/tdf149089.docx | Bin 0 -> 100716 bytes sw/qa/extras/ooxmlexport/data/tdf149198.docx | Bin 0 -> 3018 bytes sw/qa/extras/ooxmlexport/data/tdf149200.docx | Bin 0 -> 2880 bytes sw/qa/extras/ooxmlexport/data/tdf149313.docx | Bin 0 -> 2106 bytes sw/qa/extras/ooxmlexport/data/tdf149388.docx | Bin 0 -> 20546 bytes sw/qa/extras/ooxmlexport/data/tdf149388_fly.docx | Bin 0 -> 20251 bytes sw/qa/extras/ooxmlexport/data/tdf149546.docx | Bin 0 -> 23264 bytes .../ooxmlexport/data/tdf149551_mongolianVert.docx | Bin 0 -> 19164 bytes sw/qa/extras/ooxmlexport/data/tdf149649.docx | Bin 0 -> 26280 bytes sw/qa/extras/ooxmlexport/data/tdf149708.docx | Bin 0 -> 5633 bytes sw/qa/extras/ooxmlexport/data/tdf149711.docx | Bin 0 -> 13619 bytes sw/qa/extras/ooxmlexport/data/tdf150166.docx | Bin 0 -> 15751 bytes sw/qa/extras/ooxmlexport/data/tdf150542.docx | Bin 0 -> 2978 bytes sw/qa/extras/ooxmlexport/data/tdf150824.fodt | 48 + .../ooxmlexport/data/tdf150966_regularInset.docx | Bin 0 -> 17569 bytes .../data/tdf151548_activeContentDemo.docm | Bin 0 -> 47797 bytes .../data/tdf151704_thinColumnHeight.docx | Bin 0 -> 14184 bytes sw/qa/extras/ooxmlexport/data/tdf151912.docx | Bin 0 -> 3666 bytes .../ooxmlexport/data/tdf152200-field+textbox.docx | Bin 0 -> 15009 bytes sw/qa/extras/ooxmlexport/data/tdf152203.docx | Bin 0 -> 7778 bytes sw/qa/extras/ooxmlexport/data/tdf152425.docx | Bin 0 -> 16904 bytes sw/qa/extras/ooxmlexport/data/tdf152506.docx | Bin 0 -> 7803 bytes .../ooxmlexport/data/tdf152636_lostPageBreak.odt | Bin 0 -> 8632 bytes .../ooxmlexport/data/tdf152636_lostPageBreak2.docx | Bin 0 -> 16206 bytes .../ooxmlexport/data/tdf153042_largeTab.docx | Bin 0 -> 14504 bytes sw/qa/extras/ooxmlexport/data/tdf153042_noTab.docx | Bin 0 -> 14550 bytes sw/qa/extras/ooxmlexport/data/tdf153104.docx | Bin 0 -> 16519 bytes sw/qa/extras/ooxmlexport/data/tdf153128.docx | Bin 0 -> 13425 bytes sw/qa/extras/ooxmlexport/data/tdf153255.docx | Bin 0 -> 14233 bytes .../data/tdf153526_commentInNumbering.docx | Bin 0 -> 8910 bytes .../ooxmlexport/data/tdf153592_columnBreaks.docx | Bin 0 -> 6866 bytes .../data/tdf153613_anchoredAfterPgBreak.docx | Bin 0 -> 21473 bytes .../data/tdf153613_anchoredAfterPgBreak2.docx | Bin 0 -> 18324 bytes .../data/tdf153613_anchoredAfterPgBreak3.docx | Bin 0 -> 18336 bytes .../data/tdf153613_anchoredAfterPgBreak6.docx | Bin 0 -> 18330 bytes .../data/tdf153613_inlineAfterPgBreak.docx | Bin 0 -> 21240 bytes .../data/tdf153613_inlineAfterPgBreak2.docx | Bin 0 -> 15272 bytes .../data/tdf153613_sdtAfterPgBreak.docx | Bin 0 -> 46930 bytes .../data/tdf153613_textboxAfterPgBreak3.docx | Bin 0 -> 22616 bytes sw/qa/extras/ooxmlexport/data/tdf153804.docx | Bin 0 -> 8159 bytes sw/qa/extras/ooxmlexport/data/tdf153891.docx | Bin 0 -> 24988 bytes .../data/tdf153964_firstIndentAfterBreak14.docx | Bin 0 -> 18361 bytes .../data/tdf153964_numberingAfterBreak14.docx | Bin 0 -> 13436 bytes .../data/tdf153964_topMarginAfterBreak14.docx | Bin 0 -> 14353 bytes .../data/tdf153964_topMarginAfterBreak15.docx | Bin 0 -> 14358 bytes .../ooxmlexport/data/tdf154129_framePr1.docx | Bin 0 -> 21425 bytes sw/qa/extras/ooxmlexport/data/tdf154478.docx | Bin 0 -> 46878 bytes sw/qa/extras/ooxmlexport/data/tdf154481.docx | Bin 0 -> 46878 bytes .../extras/ooxmlexport/data/tdf154703_framePr.docx | Bin 0 -> 14038 bytes .../extras/ooxmlexport/data/tdf154703_framePr2.rtf | 187 + .../data/tdf154703_framePrTextDirection.docx | Bin 0 -> 13534 bytes .../data/tdf154703_framePrWrapSpacing.docx | Bin 0 -> 13991 bytes .../data/tdf154751_dualStrikethrough.docx | Bin 0 -> 11980 bytes sw/qa/extras/ooxmlexport/data/tdf155690.docx | Bin 0 -> 17677 bytes .../data/tdf155736_PageNumbers_footer.docx | Bin 0 -> 29799 bytes sw/qa/extras/ooxmlexport/data/tdf155903.odt | Bin 0 -> 11839 bytes sw/qa/extras/ooxmlexport/data/tdf155945.docx | Bin 0 -> 1892 bytes sw/qa/extras/ooxmlexport/data/tdf156372.doc | Bin 0 -> 31232 bytes .../data/tdf157011_ins_del_empty_cols.docx | Bin 0 -> 9954 bytes .../data/tdf157136_TwoContentControls.docx | Bin 0 -> 22502 bytes .../ooxmlexport/data/tdf157572_defaultVAnchor.docx | Bin 0 -> 12702 bytes .../data/tdf157572_insidiousCombination.docx | Bin 0 -> 12689 bytes .../ooxmlexport/data/tdf157572_noVAlignAsText.docx | Bin 0 -> 12704 bytes sw/qa/extras/ooxmlexport/data/tdf157598.docx | Bin 0 -> 15043 bytes sw/qa/extras/ooxmlexport/data/tdf158044.odt | Bin 0 -> 14032 bytes sw/qa/extras/ooxmlexport/data/tdf158436.docx | Bin 0 -> 12243 bytes .../data/tdf36117_verticalAdjustment.docx | Bin 0 -> 13309 bytes .../data/tdf37153_considerWrapOnObjPos.docx | Bin 0 -> 8960 bytes .../data/tdf38778_properties_in_run_for_field.doc | Bin 0 -> 25600 bytes .../data/tdf41466_testVmlShapeWithTextbox.docx | Bin 0 -> 21651 bytes .../data/tdf41542_borderlessPadding.odt | Bin 0 -> 15669 bytes .../ooxmlexport/data/tdf41542_imagePadding.odt | Bin 0 -> 17926 bytes sw/qa/extras/ooxmlexport/data/tdf44278.docx | Bin 0 -> 14451 bytes .../data/tdf44832_section_new_header.odt | Bin 0 -> 19830 bytes sw/qa/extras/ooxmlexport/data/tdf44986.docx | Bin 0 -> 14593 bytes .../ooxmlexport/data/tdf46938_clearTabStop.docx | Bin 0 -> 10264 bytes .../tdf46940_dontEquallyDistributeColumns.docx | Bin 0 -> 8068 bytes sw/qa/extras/ooxmlexport/data/tdf48569.odt | Bin 0 -> 13858 bytes sw/qa/extras/ooxmlexport/data/tdf49073.docx | Bin 0 -> 17584 bytes .../data/tdf53856_conflictingStyle.docx | Bin 0 -> 16157 bytes .../ooxmlexport/data/tdf55427_footnote2endnote.odt | Bin 0 -> 13291 bytes .../ooxmlexport/data/tdf57589_hashColor.docx | Bin 0 -> 11515 bytes .../data/tdf58944-repeating-table-header.docx | Bin 0 -> 16640 bytes sw/qa/extras/ooxmlexport/data/tdf59274.docx | Bin 0 -> 5167 bytes sw/qa/extras/ooxmlexport/data/tdf59699.docx | Bin 0 -> 13232 bytes .../ooxmlexport/data/tdf63561_clearTabs.docx | Bin 0 -> 4499 bytes .../ooxmlexport/data/tdf63561_clearTabs2.docx | Bin 0 -> 11915 bytes sw/qa/extras/ooxmlexport/data/tdf64264.docx | Bin 0 -> 13501 bytes .../data/tdf64372_continuousBreaks.docx | Bin 0 -> 11735 bytes sw/qa/extras/ooxmlexport/data/tdf64531.docx | Bin 0 -> 13683 bytes sw/qa/extras/ooxmlexport/data/tdf65955.odt | Bin 0 -> 8827 bytes sw/qa/extras/ooxmlexport/data/tdf65955_2.odt | Bin 0 -> 8898 bytes sw/qa/extras/ooxmlexport/data/tdf66039.docx | Bin 0 -> 23717 bytes .../ooxmlexport/data/tdf66398_permissions.docx | Bin 0 -> 10420 bytes sw/qa/extras/ooxmlexport/data/tdf66401.docx | Bin 0 -> 16369 bytes sw/qa/extras/ooxmlexport/data/tdf66496.docx | Bin 0 -> 21752 bytes sw/qa/extras/ooxmlexport/data/tdf67207.docx | Bin 0 -> 5186 bytes sw/qa/extras/ooxmlexport/data/tdf70234.docx | Bin 0 -> 12301 bytes sw/qa/extras/ooxmlexport/data/tdf73499.docx | Bin 0 -> 16470 bytes sw/qa/extras/ooxmlexport/data/tdf73547-dash.docx | Bin 0 -> 7308 bytes .../ooxmlexport/data/tdf76022_textboxWrap.odt | Bin 0 -> 13878 bytes .../data/tdf76683_negativeTwipsMeasure.docx | Bin 0 -> 12051 bytes .../ooxmlexport/data/tdf77219_backgroundShape.docx | Bin 0 -> 10550 bytes .../ooxmlexport/data/tdf77219_foregroundShape.docx | Bin 0 -> 10554 bytes .../data/tdf77236_MissingSolidFill.docx | Bin 0 -> 21999 bytes sw/qa/extras/ooxmlexport/data/tdf77417.docx | Bin 0 -> 57079 bytes sw/qa/extras/ooxmlexport/data/tdf77796.docx | Bin 0 -> 60288 bytes sw/qa/extras/ooxmlexport/data/tdf78352.docx | Bin 0 -> 15491 bytes .../data/tdf78657_picture_hyperlink.docx | Bin 0 -> 21039 bytes sw/qa/extras/ooxmlexport/data/tdf78749.docx | Bin 0 -> 18316 bytes sw/qa/extras/ooxmlexport/data/tdf78902.docx | Bin 0 -> 30230 bytes .../ooxmlexport/data/tdf79272_strictDxa.docx | Bin 0 -> 12279 bytes sw/qa/extras/ooxmlexport/data/tdf79329.docx | Bin 0 -> 21212 bytes .../data/tdf79435_legacyInputFields.doc | Bin 0 -> 13312 bytes .../ooxmlexport/data/tdf80526_word_wrap.docx | Bin 0 -> 15114 bytes sw/qa/extras/ooxmlexport/data/tdf81100.docx | Bin 0 -> 29760 bytes sw/qa/extras/ooxmlexport/data/tdf81345.docx | Bin 0 -> 221506 bytes sw/qa/extras/ooxmlexport/data/tdf81507.docx | Bin 0 -> 20183 bytes sw/qa/extras/ooxmlexport/data/tdf81567.odt | Bin 0 -> 10892 bytes .../data/tdf82065_Ind_start_strict.docx | Bin 0 -> 12533 bytes .../ooxmlexport/data/tdf82173_endnoteStyle.docx | Bin 0 -> 14321 bytes .../ooxmlexport/data/tdf82173_footnoteStyle.docx | Bin 0 -> 14012 bytes .../data/tdf82175_noStyleInheritance.docx | Bin 0 -> 5432 bytes .../data/tdf82177_insideCellBorders.docx | Bin 0 -> 7885 bytes .../data/tdf82177_outsideCellBorders.docx | Bin 0 -> 8990 bytes .../ooxmlexport/data/tdf82177_tblBorders.docx | Bin 0 -> 9673 bytes sw/qa/extras/ooxmlexport/data/tdf8255.docx | Bin 0 -> 27607 bytes sw/qa/extras/ooxmlexport/data/tdf83227.docx | Bin 0 -> 14647 bytes sw/qa/extras/ooxmlexport/data/tdf83300.docx | Bin 0 -> 9948 bytes sw/qa/extras/ooxmlexport/data/tdf83309.docx | Bin 0 -> 111543 bytes sw/qa/extras/ooxmlexport/data/tdf84678.docx | Bin 0 -> 17834 bytes sw/qa/extras/ooxmlexport/data/tdf85161.docx | Bin 0 -> 15730 bytes sw/qa/extras/ooxmlexport/data/tdf86374.docx | Bin 0 -> 13194 bytes sw/qa/extras/ooxmlexport/data/tdf86926_A3.docx | Bin 0 -> 5465 bytes .../ooxmlexport/data/tdf87348_linkedTextboxes.docx | Bin 0 -> 18697 bytes sw/qa/extras/ooxmlexport/data/tdf87460.docx | Bin 0 -> 17343 bytes .../ooxmlexport/data/tdf87569_drawingml.docx | Bin 0 -> 14935 bytes sw/qa/extras/ooxmlexport/data/tdf87569_vml.docx | Bin 0 -> 50503 bytes sw/qa/extras/ooxmlexport/data/tdf87924.docx | Bin 0 -> 15925 bytes sw/qa/extras/ooxmlexport/data/tdf88496.docx | Bin 0 -> 25175 bytes sw/qa/extras/ooxmlexport/data/tdf88583.odt | Bin 0 -> 8471 bytes sw/qa/extras/ooxmlexport/data/tdf89165.docx | Bin 0 -> 89495 bytes .../tdf89377_tableWithBreakBeforeParaStyle.docx | Bin 0 -> 11507 bytes sw/qa/extras/ooxmlexport/data/tdf89702.docx | Bin 0 -> 13147 bytes sw/qa/extras/ooxmlexport/data/tdf89774.fodt | 11 + sw/qa/extras/ooxmlexport/data/tdf89791.docx | Bin 0 -> 3989 bytes sw/qa/extras/ooxmlexport/data/tdf89890.docx | Bin 0 -> 41925 bytes sw/qa/extras/ooxmlexport/data/tdf89991.docx | Bin 0 -> 5543 bytes sw/qa/extras/ooxmlexport/data/tdf90153.docx | Bin 0 -> 4856 bytes sw/qa/extras/ooxmlexport/data/tdf90611.docx | Bin 0 -> 14706 bytes sw/qa/extras/ooxmlexport/data/tdf90681-1.odt | Bin 0 -> 13089 bytes sw/qa/extras/ooxmlexport/data/tdf90681-2.odt | Bin 0 -> 16590 bytes .../data/tdf90697_complexBreaksHeaders.docx | Bin 0 -> 42783 bytes sw/qa/extras/ooxmlexport/data/tdf90789-2.docx | Bin 0 -> 12372 bytes sw/qa/extras/ooxmlexport/data/tdf90789.docx | Bin 0 -> 12023 bytes sw/qa/extras/ooxmlexport/data/tdf90810short.docx | Bin 0 -> 22286 bytes .../extras/ooxmlexport/data/tdf90906_colAuto.docx | Bin 0 -> 37477 bytes .../extras/ooxmlexport/data/tdf90906_colAutoB.docx | Bin 0 -> 9479 bytes sw/qa/extras/ooxmlexport/data/tdf91122.docx | Bin 0 -> 16946 bytes sw/qa/extras/ooxmlexport/data/tdf91260.docx | Bin 0 -> 16422 bytes sw/qa/extras/ooxmlexport/data/tdf91261.docx | Bin 0 -> 22081 bytes sw/qa/extras/ooxmlexport/data/tdf91417.docx | Bin 0 -> 13007 bytes sw/qa/extras/ooxmlexport/data/tdf91429.docx | Bin 0 -> 7989 bytes sw/qa/extras/ooxmlexport/data/tdf91594.docx | Bin 0 -> 13037 bytes sw/qa/extras/ooxmlexport/data/tdf92045.docx | Bin 0 -> 12629 bytes sw/qa/extras/ooxmlexport/data/tdf92124.docx | Bin 0 -> 7042 bytes sw/qa/extras/ooxmlexport/data/tdf92157.docx | Bin 0 -> 25188 bytes sw/qa/extras/ooxmlexport/data/tdf92335.docx | Bin 0 -> 5287 bytes sw/qa/extras/ooxmlexport/data/tdf92454.docx | Bin 0 -> 32409 bytes .../ooxmlexport/data/tdf92470_footnoteRestart.docx | Bin 0 -> 5154 bytes sw/qa/extras/ooxmlexport/data/tdf92472.docx | Bin 0 -> 27734 bytes sw/qa/extras/ooxmlexport/data/tdf92521.odt | Bin 0 -> 8891 bytes .../extras/ooxmlexport/data/tdf92524_autoColor.doc | Bin 0 -> 62464 bytes .../ooxmlexport/data/tdf92526_ShapeLineWidth.odt | Bin 0 -> 9163 bytes .../data/tdf92724_continuousBreaksComplex.docx | Bin 0 -> 26913 bytes .../data/tdf92724_continuousBreaksComplex2.docx | Bin 0 -> 16057 bytes sw/qa/extras/ooxmlexport/data/tdf93676-1.odt | Bin 0 -> 18743 bytes sw/qa/extras/ooxmlexport/data/tdf93919.docx | Bin 0 -> 15336 bytes sw/qa/extras/ooxmlexport/data/tdf94043.docx | Bin 0 -> 12326 bytes sw/qa/extras/ooxmlexport/data/tdf94374.docx | Bin 0 -> 12578 bytes sw/qa/extras/ooxmlexport/data/tdf94628.docx | Bin 0 -> 10434 bytes sw/qa/extras/ooxmlexport/data/tdf94801.docx | Bin 0 -> 16128 bytes sw/qa/extras/ooxmlexport/data/tdf95031.docx | Bin 0 -> 14024 bytes sw/qa/extras/ooxmlexport/data/tdf95033.docx | Bin 0 -> 22773 bytes sw/qa/extras/ooxmlexport/data/tdf95189.docx | Bin 0 -> 27705 bytes sw/qa/extras/ooxmlexport/data/tdf95213.docx | Bin 0 -> 17747 bytes .../data/tdf95367_inheritFollowStyle.docx | Bin 0 -> 13861 bytes sw/qa/extras/ooxmlexport/data/tdf95374.docx | Bin 0 -> 42873 bytes sw/qa/extras/ooxmlexport/data/tdf95376.docx | Bin 0 -> 25375 bytes sw/qa/extras/ooxmlexport/data/tdf95377.docx | Bin 0 -> 11982 bytes sw/qa/extras/ooxmlexport/data/tdf95495.docx | Bin 0 -> 102240 bytes sw/qa/extras/ooxmlexport/data/tdf95775.docx | Bin 0 -> 22523 bytes sw/qa/extras/ooxmlexport/data/tdf95777.docx | Bin 0 -> 19126 bytes sw/qa/extras/ooxmlexport/data/tdf95848.docx | Bin 0 -> 34087 bytes sw/qa/extras/ooxmlexport/data/tdf95848_2.docx | Bin 0 -> 14087 bytes .../ooxmlexport/data/tdf96750_landscapeFollow.docx | Bin 0 -> 24129 bytes sw/qa/extras/ooxmlexport/data/tdf97090.docx | Bin 0 -> 29899 bytes sw/qa/extras/ooxmlexport/data/tdf97371.docx | Bin 0 -> 18800 bytes .../data/tdf97517_testVmlLineShapeMirroredX.docx | Bin 0 -> 11539 bytes .../data/tdf97618_testVmlShapeTextWordWrap.docx | Bin 0 -> 16115 bytes .../ooxmlexport/data/tdf97648_relativeWidth.docx | Bin 0 -> 17613 bytes .../ooxmlexport/data/tdf98000_changePageStyle.odt | Bin 0 -> 9418 bytes .../ooxmlexport/data/tdf98620_environmentBiDi.odt | Bin 0 -> 9321 bytes .../ooxmlexport/data/tdf98700_keepWithNext.odt | Bin 0 -> 12680 bytes sw/qa/extras/ooxmlexport/data/tdf99074.docx | Bin 0 -> 12608 bytes .../ooxmlexport/data/tdf99090_pgbrkAfterTable.docx | Bin 0 -> 14726 bytes sw/qa/extras/ooxmlexport/data/tdf99140.docx | Bin 0 -> 13349 bytes sw/qa/extras/ooxmlexport/data/tdf99227.docx | Bin 0 -> 15636 bytes .../data/tdf99602_charStyleSubscript.docx | Bin 0 -> 10669 bytes .../data/tdf99602_charStyleSubscript2.odt | Bin 0 -> 12475 bytes .../data/tdf99602_subscript_charStyleSize.docx | Bin 0 -> 10623 bytes .../ooxmlexport/data/tdf99616_hidemarkb.docx | Bin 0 -> 11742 bytes sw/qa/extras/ooxmlexport/data/tdf99631.docx | Bin 0 -> 32417 bytes .../ooxmlexport/data/tdf99810-lost-arrow.odt | Bin 0 -> 9720 bytes sw/qa/extras/ooxmlexport/data/test76108.docx | Bin 0 -> 14419 bytes sw/qa/extras/ooxmlexport/data/test76317.docx | Bin 0 -> 17705 bytes sw/qa/extras/ooxmlexport/data/test76317_2K10.docx | Bin 0 -> 20751 bytes sw/qa/extras/ooxmlexport/data/test76734_2K7.docx | Bin 0 -> 10446 bytes sw/qa/extras/ooxmlexport/data/test77219.docx | Bin 0 -> 82015 bytes .../ooxmlexport/data/testCrashWhileSave.docx | Bin 0 -> 40873 bytes .../data/testCustomShapePresetExport.odt | Bin 0 -> 86157 bytes sw/qa/extras/ooxmlexport/data/testFootnote.docx | Bin 0 -> 24191 bytes sw/qa/extras/ooxmlexport/data/testGlossary.docx | Bin 0 -> 25741 bytes sw/qa/extras/ooxmlexport/data/testOuterShdw.docx | Bin 0 -> 272537 bytes sw/qa/extras/ooxmlexport/data/testPageref.docx | Bin 0 -> 26321 bytes .../ooxmlexport/data/testParaListRightIndent.docx | Bin 0 -> 12774 bytes sw/qa/extras/ooxmlexport/data/testPgMargin.docx | Bin 0 -> 10448 bytes sw/qa/extras/ooxmlexport/data/testTOCFlag_u.docx | Bin 0 -> 17390 bytes sw/qa/extras/ooxmlexport/data/testTcBorders.docx | Bin 0 -> 55225 bytes .../data/testTdf130167_spilloverHeader.docx | Bin 0 -> 47532 bytes .../extras/ooxmlexport/data/testTextBoxZOrder.docx | Bin 0 -> 17635 bytes sw/qa/extras/ooxmlexport/data/testTitlePage.docx | Bin 0 -> 16479 bytes .../testTrackChangesDeletedEmptyParagraph.docx | Bin 0 -> 12394 bytes .../data/testTrackChangesDeletedParagraphMark.docx | Bin 0 -> 16364 bytes .../data/testTrackChangesDeletedTableCell.docx | Bin 0 -> 13744 bytes .../data/testTrackChangesDeletedTableRow.docx | Bin 0 -> 16518 bytes ...testTrackChangesEmptyParagraphsInADeletion.docx | Bin 0 -> 13952 bytes .../testTrackChangesInsertedParagraphMark.docx | Bin 0 -> 16376 bytes .../data/testTrackChangesInsertedTableCell.docx | Bin 0 -> 13842 bytes .../data/testTrackChangesInsertedTableRow.docx | Bin 0 -> 16290 bytes .../data/testTrackChangesParagraphProperties.docx | Bin 0 -> 16307 bytes sw/qa/extras/ooxmlexport/data/testWPGZOrder.docx | Bin 0 -> 30061 bytes .../extras/ooxmlexport/data/testWPGtextboxes.docx | Bin 0 -> 19842 bytes .../data/testWordArtWithinDraingtool.docx | Bin 0 -> 45324 bytes .../ooxmlexport/data/test_GIF_ImageCrop.docx | Bin 0 -> 19624 bytes .../ooxmlexport/data/test_PNG_ImageCrop.docx | Bin 0 -> 57502 bytes .../extras/ooxmlexport/data/test_extra_image.docx | Bin 0 -> 120620 bytes .../extras/ooxmlexport/data/test_indentation.docx | Bin 0 -> 12896 bytes .../extras/ooxmlexport/data/test_line_spacing.docx | Bin 0 -> 9997 bytes .../extras/ooxmlexport/data/test_msword_hang.docx | Bin 0 -> 11209 bytes sw/qa/extras/ooxmlexport/data/test_ole_object.docx | Bin 0 -> 286633 bytes .../ooxmlexport/data/test_sdt_datepicker.docx | Bin 0 -> 20357 bytes .../ooxmlexport/data/test_segfault_while_save.docx | Bin 0 -> 55619 bytes sw/qa/extras/ooxmlexport/data/test_tdf120412.docx | Bin 0 -> 11820 bytes sw/qa/extras/ooxmlexport/data/textWatermark.docx | Bin 0 -> 17870 bytes .../ooxmlexport/data/text_cardinal_list.docx | Bin 0 -> 8844 bytes .../extras/ooxmlexport/data/text_number_list.docx | Bin 0 -> 8966 bytes .../extras/ooxmlexport/data/text_ordinal_list.docx | Bin 0 -> 8907 bytes .../ooxmlexport/data/textbox-right-edge.docx | Bin 0 -> 13896 bytes .../ooxmlexport/data/textbox-rounded-corners.docx | Bin 0 -> 16225 bytes sw/qa/extras/ooxmlexport/data/textbox-table.docx | Bin 0 -> 16404 bytes .../extras/ooxmlexport/data/textbox-wpg-only.docx | Bin 0 -> 16526 bytes .../ooxmlexport/data/textbox_picturefill.docx | Bin 0 -> 383971 bytes .../extras/ooxmlexport/data/textframe-borders.docx | Bin 0 -> 10440 bytes .../ooxmlexport/data/textframe-gradient.docx | Bin 0 -> 13655 bytes sw/qa/extras/ooxmlexport/data/textframes.odt | Bin 0 -> 8853 bytes sw/qa/extras/ooxmlexport/data/textinput.odt | Bin 0 -> 9544 bytes .../ooxmlexport/data/theme-preservation.docx | Bin 0 -> 15173 bytes sw/qa/extras/ooxmlexport/data/toc_doc.docx | Bin 0 -> 15698 bytes .../ooxmlexport/data/tools-line-numbering.docx | Bin 0 -> 15052 bytes .../extras/ooxmlexport/data/toxmarkhyperlink.fodt | 52 + .../ooxmlexport/data/transparent-shadow.docx | Bin 0 -> 14091 bytes sw/qa/extras/ooxmlexport/data/tscp.docx | Bin 0 -> 4878 bytes .../ooxmlexport/data/unbalanced-columns.docx | Bin 0 -> 12820 bytes .../ooxmlexport/data/unwanted-section-break.docx | Bin 0 -> 15710 bytes .../ooxmlexport/data/vml-text-vertical-adjust.docx | Bin 0 -> 10578 bytes sw/qa/extras/ooxmlexport/data/watermark-font.docx | Bin 0 -> 18824 bytes .../ooxmlexport/data/watermark-shapetype.docx | Bin 0 -> 17830 bytes sw/qa/extras/ooxmlexport/data/watermark.docx | Bin 0 -> 19473 bytes sw/qa/extras/ooxmlexport/data/wpg-nested.docx | Bin 0 -> 34068 bytes sw/qa/extras/ooxmlexport/data/wpg-only.docx | Bin 0 -> 13503 bytes sw/qa/extras/ooxmlexport/data/wps-char-color.docx | Bin 0 -> 15589 bytes sw/qa/extras/ooxmlexport/data/wps-only.docx | Bin 0 -> 13180 bytes .../ooxmlexport/data/wrap-tight-through.docx | Bin 0 -> 18524 bytes sw/qa/extras/ooxmlexport/data/zoom.docx | Bin 0 -> 10625 bytes sw/qa/extras/ooxmlexport/ooxml_ThemeExport.cxx | 145 + sw/qa/extras/ooxmlexport/ooxmlencryption.cxx | 52 + sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 982 +++++ sw/qa/extras/ooxmlexport/ooxmlexport10.cxx | 739 ++++ sw/qa/extras/ooxmlexport/ooxmlexport11.cxx | 874 +++++ sw/qa/extras/ooxmlexport/ooxmlexport12.cxx | 2348 +++++++++++ sw/qa/extras/ooxmlexport/ooxmlexport13.cxx | 1341 +++++++ sw/qa/extras/ooxmlexport/ooxmlexport14.cxx | 1610 ++++++++ sw/qa/extras/ooxmlexport/ooxmlexport15.cxx | 1065 +++++ sw/qa/extras/ooxmlexport/ooxmlexport16.cxx | 1098 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport17.cxx | 1157 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport18.cxx | 879 +++++ sw/qa/extras/ooxmlexport/ooxmlexport19.cxx | 1224 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport2.cxx | 1153 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport20.cxx | 1125 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport3.cxx | 1234 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport4.cxx | 1313 +++++++ sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 699 ++++ sw/qa/extras/ooxmlexport/ooxmlexport6.cxx | 1055 +++++ sw/qa/extras/ooxmlexport/ooxmlexport7.cxx | 1150 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport8.cxx | 1240 ++++++ sw/qa/extras/ooxmlexport/ooxmlexport9.cxx | 1604 ++++++++ sw/qa/extras/ooxmlexport/ooxmlexport_template.cxx | 36 + sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx | 972 +++++ sw/qa/extras/ooxmlexport/ooxmllinks.cxx | 226 ++ sw/qa/extras/ooxmlexport/ooxmlw14export.cxx | 636 +++ sw/qa/extras/ooxmlimport/data/105975.docx | Bin 0 -> 12783 bytes sw/qa/extras/ooxmlimport/data/WordArt.docx | Bin 0 -> 10417 bytes sw/qa/extras/ooxmlimport/data/bnc773061.docx | Bin 0 -> 8872 bytes sw/qa/extras/ooxmlimport/data/bnc779620.docx | Bin 0 -> 10299 bytes sw/qa/extras/ooxmlimport/data/bnc821804.docx | Bin 0 -> 5601 bytes sw/qa/extras/ooxmlimport/data/btlr-frame-vml.docx | Bin 0 -> 22765 bytes .../data/dml-groupshape-paraadjust.docx | Bin 0 -> 17764 bytes sw/qa/extras/ooxmlimport/data/fdo43641.docx | Bin 0 -> 11966 bytes sw/qa/extras/ooxmlimport/data/fdo75722-dml.docx | Bin 0 -> 15469 bytes sw/qa/extras/ooxmlimport/data/fdo75722-vml.docx | Bin 0 -> 10146 bytes sw/qa/extras/ooxmlimport/data/fdo76583.docx | Bin 0 -> 14007 bytes sw/qa/extras/ooxmlimport/data/fdo87488.docx | Bin 0 -> 26418 bytes .../data/floating-table-section-columns.docx | Bin 0 -> 5668 bytes .../data/groupshape-child-rotation.docx | Bin 0 -> 15960 bytes .../ooxmlimport/data/groupshape-fontname.docx | Bin 0 -> 61000 bytes sw/qa/extras/ooxmlimport/data/groupshape-line.docx | Bin 0 -> 10291 bytes .../ooxmlimport/data/groupshape-relsize.docx | Bin 0 -> 20145 bytes sw/qa/extras/ooxmlimport/data/groupshape-sdt.docx | Bin 0 -> 10742 bytes sw/qa/extras/ooxmlimport/data/image-hyperlink.docx | Bin 0 -> 13467 bytes sw/qa/extras/ooxmlimport/data/image-lazy-read.docx | Bin 0 -> 9392 bytes sw/qa/extras/ooxmlimport/data/ink.docx | Bin 0 -> 14339 bytes sw/qa/extras/ooxmlimport/data/line-rotation.docx | Bin 0 -> 14772 bytes sw/qa/extras/ooxmlimport/data/line-wps-only.docx | Bin 0 -> 8721 bytes .../ooxmlimport/data/math-malformed_xml.docx | Bin 0 -> 4320 bytes sw/qa/extras/ooxmlimport/data/n751017.docx | Bin 0 -> 10194 bytes sw/qa/extras/ooxmlimport/data/n751077.docx | Bin 0 -> 22131 bytes sw/qa/extras/ooxmlimport/data/n757890.docx | Bin 0 -> 11098 bytes sw/qa/extras/ooxmlimport/data/n758883.docx | Bin 0 -> 11896 bytes sw/qa/extras/ooxmlimport/data/n760764.docx | Bin 0 -> 10079 bytes .../extras/ooxmlimport/data/n764745-alignment.docx | Bin 0 -> 5635 bytes sw/qa/extras/ooxmlimport/data/n766477.docx | Bin 0 -> 10104 bytes sw/qa/extras/ooxmlimport/data/n773061.docx | Bin 0 -> 7081 bytes sw/qa/extras/ooxmlimport/data/n775899.docx | Bin 0 -> 10264 bytes sw/qa/extras/ooxmlimport/data/n777345.docx | Bin 0 -> 9360 bytes sw/qa/extras/ooxmlimport/data/n778140.docx | Bin 0 -> 9564 bytes sw/qa/extras/ooxmlimport/data/n779627.docx | Bin 0 -> 30152 bytes sw/qa/extras/ooxmlimport/data/n779627b.docx | Bin 0 -> 5805 bytes sw/qa/extras/ooxmlimport/data/n780645.docx | Bin 0 -> 4014 bytes sw/qa/extras/ooxmlimport/data/n782061.docx | Bin 0 -> 12654 bytes sw/qa/extras/ooxmlimport/data/n820504.docx | Bin 0 -> 23684 bytes sw/qa/extras/ooxmlimport/data/n820788.docx | Bin 0 -> 10267 bytes .../extras/ooxmlimport/data/numbering-circle.docx | Bin 0 -> 4952 bytes sw/qa/extras/ooxmlimport/data/ole-anchor.docx | Bin 0 -> 12393 bytes .../ooxmlimport/data/strict-lockedcanvas.docx | Bin 0 -> 12345 bytes sw/qa/extras/ooxmlimport/data/table_width.docx | Bin 0 -> 6572 bytes sw/qa/extras/ooxmlimport/data/tdf100072.docx | Bin 0 -> 7034 bytes sw/qa/extras/ooxmlimport/data/tdf100830.docx | Bin 0 -> 22171 bytes sw/qa/extras/ooxmlimport/data/tdf101626.docx | Bin 0 -> 12420 bytes sw/qa/extras/ooxmlimport/data/tdf101627.docx | Bin 0 -> 45695 bytes sw/qa/extras/ooxmlimport/data/tdf103664.docx | Bin 0 -> 11444 bytes sw/qa/extras/ooxmlimport/data/tdf103931.docx | Bin 0 -> 3542 bytes sw/qa/extras/ooxmlimport/data/tdf104167.docx | Bin 0 -> 10909 bytes sw/qa/extras/ooxmlimport/data/tdf105127.docx | Bin 0 -> 10430 bytes sw/qa/extras/ooxmlimport/data/tdf105143.docx | Bin 0 -> 13098 bytes sw/qa/extras/ooxmlimport/data/tdf105975.docx | Bin 0 -> 12754 bytes sw/qa/extras/ooxmlimport/data/tdf106606.docx | Bin 0 -> 73530 bytes sw/qa/extras/ooxmlimport/data/tdf107784.docx | Bin 0 -> 14852 bytes sw/qa/extras/ooxmlimport/data/tdf108350.docx | Bin 0 -> 1271 bytes sw/qa/extras/ooxmlimport/data/tdf108408.docx | Bin 0 -> 1298 bytes .../data/tdf108545_embeddedDocxIcon.docx | Bin 0 -> 28843 bytes sw/qa/extras/ooxmlimport/data/tdf108714.docx | Bin 0 -> 1376 bytes sw/qa/extras/ooxmlimport/data/tdf108806.docx | Bin 0 -> 1315 bytes sw/qa/extras/ooxmlimport/data/tdf108849.docx | Bin 0 -> 1360 bytes sw/qa/extras/ooxmlimport/data/tdf109053.docx | Bin 0 -> 12195 bytes .../ooxmlimport/data/tdf109316_dropCaps.docx | Bin 0 -> 13058 bytes sw/qa/extras/ooxmlimport/data/tdf109524.docx | Bin 0 -> 1291 bytes sw/qa/extras/ooxmlimport/data/tdf111550.docx | Bin 0 -> 1362 bytes sw/qa/extras/ooxmlimport/data/tdf112443.docx | Bin 0 -> 26990 bytes sw/qa/extras/ooxmlimport/data/tdf113182.docx | Bin 0 -> 12561 bytes sw/qa/extras/ooxmlimport/data/tdf113946.docx | Bin 0 -> 15580 bytes sw/qa/extras/ooxmlimport/data/tdf114212.docx | Bin 0 -> 4791 bytes sw/qa/extras/ooxmlimport/data/tdf114217.docx | Bin 0 -> 11524 bytes sw/qa/extras/ooxmlimport/data/tdf115094.docx | Bin 0 -> 15064 bytes sw/qa/extras/ooxmlimport/data/tdf115094v2.docx | Bin 0 -> 32186 bytes sw/qa/extras/ooxmlimport/data/tdf115719b.docx | Bin 0 -> 19843 bytes sw/qa/extras/ooxmlimport/data/tdf115883.docx | Bin 0 -> 33313 bytes sw/qa/extras/ooxmlimport/data/tdf117843.docx | Bin 0 -> 26926 bytes sw/qa/extras/ooxmlimport/data/tdf118693.docx | Bin 0 -> 26072 bytes .../data/tdf119039_bad_embedded_compound.docx | Bin 0 -> 13876 bytes sw/qa/extras/ooxmlimport/data/tdf119200.docx | Bin 0 -> 20728 bytes sw/qa/extras/ooxmlimport/data/tdf120547.docx | Bin 0 -> 40512 bytes sw/qa/extras/ooxmlimport/data/tdf120548.docx | Bin 0 -> 13745 bytes sw/qa/extras/ooxmlimport/data/tdf120551.docx | Bin 0 -> 31758 bytes sw/qa/extras/ooxmlimport/data/tdf121203.docx | Bin 0 -> 12702 bytes sw/qa/extras/ooxmlimport/data/tdf121440.docx | Bin 0 -> 23209 bytes sw/qa/extras/ooxmlimport/data/tdf121664.docx | Bin 0 -> 12709 bytes sw/qa/extras/ooxmlimport/data/tdf121804.docx | Bin 0 -> 17629 bytes sw/qa/extras/ooxmlimport/data/tdf122224.docx | Bin 0 -> 19306 bytes sw/qa/extras/ooxmlimport/data/tdf122717.docx | Bin 0 -> 4940 bytes sw/qa/extras/ooxmlimport/data/tdf123386.docx | Bin 0 -> 14928 bytes sw/qa/extras/ooxmlimport/data/tdf123389.docx | Bin 0 -> 13649 bytes sw/qa/extras/ooxmlimport/data/tdf124398.docx | Bin 0 -> 79734 bytes sw/qa/extras/ooxmlimport/data/tdf124600.docx | Bin 0 -> 15746 bytes sw/qa/extras/ooxmlimport/data/tdf124670.docx | Bin 0 -> 1434 bytes sw/qa/extras/ooxmlimport/data/tdf124754.docx | Bin 0 -> 20960 bytes sw/qa/extras/ooxmlimport/data/tdf125038.docx | Bin 0 -> 12690 bytes sw/qa/extras/ooxmlimport/data/tdf125038b.docx | Bin 0 -> 12649 bytes sw/qa/extras/ooxmlimport/data/tdf125038c.docx | Bin 0 -> 12677 bytes sw/qa/extras/ooxmlimport/data/tdf126114.docx | Bin 0 -> 16877 bytes sw/qa/extras/ooxmlimport/data/tdf126426.docx | Bin 0 -> 15785 bytes sw/qa/extras/ooxmlimport/data/tdf127825.docx | Bin 0 -> 13297 bytes sw/qa/extras/ooxmlimport/data/tdf128076.docx | Bin 0 -> 18928 bytes sw/qa/extras/ooxmlimport/data/tdf129237.docx | Bin 0 -> 13162 bytes sw/qa/extras/ooxmlimport/data/tdf129659.docx | Bin 0 -> 18584 bytes sw/qa/extras/ooxmlimport/data/tdf129912.docx | Bin 0 -> 19435 bytes sw/qa/extras/ooxmlimport/data/tdf130214.docx | Bin 0 -> 23057 bytes sw/qa/extras/ooxmlimport/data/tdf130804.docx | Bin 0 -> 182772 bytes .../data/tdf131841_HighlightColorGroupedShape.docx | Bin 0 -> 20448 bytes sw/qa/extras/ooxmlimport/data/tdf133448.docx | Bin 0 -> 92038 bytes sw/qa/extras/ooxmlimport/data/tdf133647.docx | Bin 0 -> 14536 bytes .../extras/ooxmlimport/data/tdf133647_unicode.docx | Bin 0 -> 20920 bytes sw/qa/extras/ooxmlimport/data/tdf134572.docx | Bin 0 -> 21846 bytes .../ooxmlimport/data/tdf136952_pgBreak3.docx | Bin 0 -> 5145 bytes .../data/tdf141969-font_in_table_with_style.docx | Bin 0 -> 2058 bytes .../data/tdf143219_ContourWrap_rotate.docx | Bin 0 -> 19636 bytes .../data/tdf143475_rotatedWord2007image.docx | Bin 0 -> 30338 bytes .../data/tdf143475_rotatedWord2007imageInline.docx | Bin 0 -> 29345 bytes .../data/tdf143476_lockedCanvas_image_line.docx | Bin 0 -> 11649 bytes .../data/tdf143476_lockedCanvas_position.docx | Bin 0 -> 278044 bytes .../data/tdf143476_lockedCanvas_twoShapes.docx | Bin 0 -> 22179 bytes .../data/tdf152200-bad_fldChar_end.docx | Bin 0 -> 10153 bytes .../data/tdf153791-shd_overrides_fontRef.docx | Bin 0 -> 16264 bytes .../data/tdf154319-ToC_with_s_and_d.docx | Bin 0 -> 18797 bytes sw/qa/extras/ooxmlimport/data/tdf154370.docx | Bin 0 -> 6333 bytes .../ooxmlimport/data/tdf154695-ToC_no_numbers.docx | Bin 0 -> 16145 bytes .../tdf156078_rightTabOutsideParaRightIndent.docx | Bin 0 -> 2272 bytes sw/qa/extras/ooxmlimport/data/tdf43017.docx | Bin 0 -> 14890 bytes .../data/tdf48658_transparentOLEheader.docx | Bin 0 -> 181161 bytes sw/qa/extras/ooxmlimport/data/tdf60351.docx | Bin 0 -> 26060 bytes .../ooxmlimport/data/tdf74367_MarginsZeroed.docx | Bin 0 -> 12600 bytes .../ooxmlimport/data/tdf75573_lostTable.docx | Bin 0 -> 25590 bytes .../ooxmlimport/data/tdf75573_page1frame.docx | Bin 0 -> 29488 bytes sw/qa/extras/ooxmlimport/data/tdf76446.docx | Bin 0 -> 10135 bytes sw/qa/extras/ooxmlimport/data/tdf82824.docx | Bin 0 -> 24581 bytes sw/qa/extras/ooxmlimport/data/tdf85232.docx | Bin 0 -> 24373 bytes sw/qa/extras/ooxmlimport/data/tdf85523.docx | Bin 0 -> 21015 bytes sw/qa/extras/ooxmlimport/data/tdf87533_bidi.docx | Bin 0 -> 13857 bytes sw/qa/extras/ooxmlimport/data/tdf95755.docx | Bin 0 -> 16864 bytes sw/qa/extras/ooxmlimport/data/tdf95970.docx | Bin 0 -> 13092 bytes sw/qa/extras/ooxmlimport/data/tdf96218.docx | Bin 0 -> 41900 bytes sw/qa/extras/ooxmlimport/data/tdf96674.docx | Bin 0 -> 14947 bytes sw/qa/extras/ooxmlimport/data/tdf97038.docx | Bin 0 -> 64161 bytes sw/qa/extras/ooxmlimport/data/tdf98882.docx | Bin 0 -> 18390 bytes sw/qa/extras/ooxmlimport/data/tdf99135.docx | Bin 0 -> 12122 bytes sw/qa/extras/ooxmlimport/data/testfdo90720.docx | Bin 0 -> 11844 bytes sw/qa/extras/ooxmlimport/data/text-copy.docx | Bin 0 -> 16288 bytes .../extras/ooxmlimport/data/textbox-wps-only.docx | Bin 0 -> 13988 bytes .../data/unbalanced-columns-compat.docx | Bin 0 -> 10118 bytes sw/qa/extras/ooxmlimport/data/vml-adjustments.docx | Bin 0 -> 12987 bytes sw/qa/extras/ooxmlimport/data/xml_space.docx | Bin 0 -> 1309 bytes sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 1884 +++++++++ sw/qa/extras/ooxmlimport/ooxmlimport2.cxx | 1272 ++++++ sw/qa/extras/pdf/HybridPdfTest.cxx | 75 + .../Hybrid_AdditionalStreamsAndPDFAttachedFile.pdf | Bin 0 -> 20671 bytes .../pdf/data/Hybrid_AdditionalStreamsOnly.pdf | Bin 0 -> 20314 bytes sw/qa/extras/pdf/data/PDFOnly.pdf | Bin 0 -> 9783 bytes sw/qa/extras/rtfexport/data/FORMDROPDOWN.rtf | 33 + sw/qa/extras/rtfexport/data/abi10039.odt | Bin 0 -> 12293 bytes sw/qa/extras/rtfexport/data/abi10076.odt | Bin 0 -> 98498 bytes sw/qa/extras/rtfexport/data/all_gaps_word.rtf | 381 ++ sw/qa/extras/rtfexport/data/anchor.fodt | 101 + .../rtfexport/data/arabic-zero-numbering.rtf | 14 + sw/qa/extras/rtfexport/data/bin-skipping.rtf | 19 + sw/qa/extras/rtfexport/data/bookmark.rtf | 7 + sw/qa/extras/rtfexport/data/btlr-cell.rtf | 9 + sw/qa/extras/rtfexport/data/btlr-frame.odt | Bin 0 -> 8564 bytes sw/qa/extras/rtfexport/data/char-color.rtf | 29 + sw/qa/extras/rtfexport/data/charborder.odt | Bin 0 -> 8052 bytes sw/qa/extras/rtfexport/data/cjklist12.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist13.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist16.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist20.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist21.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist24.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist25.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist30.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist31.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist34.rtf | 225 ++ sw/qa/extras/rtfexport/data/cjklist38.rtf | 225 ++ .../rtfexport/data/classification-confidential.rtf | 11 + sw/qa/extras/rtfexport/data/classification-no.rtf | 1 + sw/qa/extras/rtfexport/data/classification-yes.rtf | 11 + sw/qa/extras/rtfexport/data/clearing-break.rtf | 22 + sw/qa/extras/rtfexport/data/comments-nested.odt | Bin 0 -> 11343 bytes .../rtfexport/data/copypaste-footnote-paste.rtf | 2 + sw/qa/extras/rtfexport/data/copypaste-footnote.rtf | 6 + .../rtfexport/data/copypaste-pagestyle-paste.rtf | 17 + .../extras/rtfexport/data/copypaste-pagestyle.rtf | 3 + sw/qa/extras/rtfexport/data/cp1000018.rtf | 27 + sw/qa/extras/rtfexport/data/cs-bold.rtf | 12 + sw/qa/extras/rtfexport/data/custom-doc-props.rtf | 25 + sw/qa/extras/rtfexport/data/do-dhgt-old.rtf | 10 + sw/qa/extras/rtfexport/data/do-dhgt.rtf | 9 + sw/qa/extras/rtfexport/data/dplinehollow.rtf | 7 + sw/qa/extras/rtfexport/data/dppolyline.rtf | 6 + sw/qa/extras/rtfexport/data/dprect-anchor.rtf | 4 + sw/qa/extras/rtfexport/data/dptxbx-relation.rtf | 5 + sw/qa/extras/rtfexport/data/em.rtf | 8 + sw/qa/extras/rtfexport/data/fdo30983.rtf | 43 + sw/qa/extras/rtfexport/data/fdo32613.odt | Bin 0 -> 10434 bytes sw/qa/extras/rtfexport/data/fdo36089.rtf | 9 + sw/qa/extras/rtfexport/data/fdo37716.rtf | 5 + sw/qa/extras/rtfexport/data/fdo38176.rtf | 3 + sw/qa/extras/rtfexport/data/fdo38244.rtf | 15 + sw/qa/extras/rtfexport/data/fdo38786.rtf | 2 + sw/qa/extras/rtfexport/data/fdo39001.rtf | 22 + sw/qa/extras/rtfexport/data/fdo39053.rtf | Bin 0 -> 22118 bytes sw/qa/extras/rtfexport/data/fdo42109.rtf | 29 + sw/qa/extras/rtfexport/data/fdo42465.rtf | 4 + sw/qa/extras/rtfexport/data/fdo43965.rtf | 16 + sw/qa/extras/rtfexport/data/fdo44053.rtf | 15 + sw/qa/extras/rtfexport/data/fdo44174.rtf | 6 + sw/qa/extras/rtfexport/data/fdo44176.rtf | 10 + sw/qa/extras/rtfexport/data/fdo44211.rtf | 4 + sw/qa/extras/rtfexport/data/fdo44715.rtf | 42 + sw/qa/extras/rtfexport/data/fdo45187.rtf | 32 + sw/qa/extras/rtfexport/data/fdo45394.rtf | 19 + sw/qa/extras/rtfexport/data/fdo45543.rtf | 8 + sw/qa/extras/rtfexport/data/fdo45553.rtf | 2 + sw/qa/extras/rtfexport/data/fdo45563.rtf | 5 + sw/qa/extras/rtfexport/data/fdo46955.rtf | 1 + sw/qa/extras/rtfexport/data/fdo46966.rtf | 10 + sw/qa/extras/rtfexport/data/fdo47107.rtf | 21 + sw/qa/extras/rtfexport/data/fdo47326.rtf | 5 + sw/qa/extras/rtfexport/data/fdo47495.rtf | 164 + sw/qa/extras/rtfexport/data/fdo47764.rtf | 4 + sw/qa/extras/rtfexport/data/fdo47802.rtf | 46 + sw/qa/extras/rtfexport/data/fdo48023.rtf | 8 + sw/qa/extras/rtfexport/data/fdo48033.rtf | 22 + sw/qa/extras/rtfexport/data/fdo48037.rtf | 13 + sw/qa/extras/rtfexport/data/fdo48104.rtf | 6 + sw/qa/extras/rtfexport/data/fdo48193.rtf | 10 + sw/qa/extras/rtfexport/data/fdo48335.odt | Bin 0 -> 9612 bytes sw/qa/extras/rtfexport/data/fdo48356.rtf | 3 + sw/qa/extras/rtfexport/data/fdo48440.rtf | 5 + sw/qa/extras/rtfexport/data/fdo48446.rtf | 7 + sw/qa/extras/rtfexport/data/fdo48876.rtf | 5 + sw/qa/extras/rtfexport/data/fdo49271.rtf | 3 + sw/qa/extras/rtfexport/data/fdo49501.rtf | 5 + sw/qa/extras/rtfexport/data/fdo49655.rtf | 5 + sw/qa/extras/rtfexport/data/fdo49659.rtf | 19 + sw/qa/extras/rtfexport/data/fdo49683.rtf | 5 + sw/qa/extras/rtfexport/data/fdo49893-2.rtf | 5 + sw/qa/extras/rtfexport/data/fdo49934.rtf | 7 + sw/qa/extras/rtfexport/data/fdo50087.rtf | 8 + sw/qa/extras/rtfexport/data/fdo50539.rtf | 4 + sw/qa/extras/rtfexport/data/fdo50665.rtf | 16 + sw/qa/extras/rtfexport/data/fdo50831.rtf | 11 + sw/qa/extras/rtfexport/data/fdo51916.rtf | 319 ++ sw/qa/extras/rtfexport/data/fdo52286.odt | Bin 0 -> 9130 bytes sw/qa/extras/rtfexport/data/fdo52389.rtf | 3 + sw/qa/extras/rtfexport/data/fdo52475.rtf | 5 + sw/qa/extras/rtfexport/data/fdo52989.rtf | 12 + sw/qa/extras/rtfexport/data/fdo53113.odt | Bin 0 -> 9276 bytes sw/qa/extras/rtfexport/data/fdo53594.rtf | 42 + sw/qa/extras/rtfexport/data/fdo53604.odt | Bin 0 -> 8808 bytes sw/qa/extras/rtfexport/data/fdo54473.rtf | 10 + sw/qa/extras/rtfexport/data/fdo54612.rtf | 34 + sw/qa/extras/rtfexport/data/fdo54900.rtf | 17 + sw/qa/extras/rtfexport/data/fdo55493.rtf | 142 + sw/qa/extras/rtfexport/data/fdo55939.odt | Bin 0 -> 8853 bytes sw/qa/extras/rtfexport/data/fdo56512.rtf | 5 + sw/qa/extras/rtfexport/data/fdo57678.rtf | 34 + sw/qa/extras/rtfexport/data/fdo57886.rtf | 23 + sw/qa/extras/rtfexport/data/fdo58076-2.rtf | 24 + sw/qa/extras/rtfexport/data/fdo58076.rtf | 5 + sw/qa/extras/rtfexport/data/fdo58646.rtf | 7 + sw/qa/extras/rtfexport/data/fdo58646line.rtf | 1 + sw/qa/extras/rtfexport/data/fdo58933.rtf | 28 + sw/qa/extras/rtfexport/data/fdo59419.rtf | 5 + sw/qa/extras/rtfexport/data/fdo59638.rtf | 35 + sw/qa/extras/rtfexport/data/fdo60722.rtf | 13 + sw/qa/extras/rtfexport/data/fdo61193.rtf | 1 + sw/qa/extras/rtfexport/data/fdo61507.rtf | 12 + sw/qa/extras/rtfexport/data/fdo61909.rtf | 28 + sw/qa/extras/rtfexport/data/fdo62044-paste.rtf | 7 + sw/qa/extras/rtfexport/data/fdo62044.rtf | 7 + sw/qa/extras/rtfexport/data/fdo62288.rtf | 23 + sw/qa/extras/rtfexport/data/fdo62805.rtf | 21 + sw/qa/extras/rtfexport/data/fdo62977.rtf | 24 + sw/qa/extras/rtfexport/data/fdo63023.rtf | 10 + sw/qa/extras/rtfexport/data/fdo63428.rtf | 8 + sw/qa/extras/rtfexport/data/fdo64637.rtf | 13 + sw/qa/extras/rtfexport/data/fdo64671.rtf | 3 + sw/qa/extras/rtfexport/data/fdo65090.rtf | 6 + sw/qa/extras/rtfexport/data/fdo66040.rtf | 85 + sw/qa/extras/rtfexport/data/fdo66682.rtf | 25 + sw/qa/extras/rtfexport/data/fdo66743.rtf | 5 + sw/qa/extras/rtfexport/data/fdo67498.rtf | 5 + sw/qa/extras/rtfexport/data/fdo68076.rtf | 18 + sw/qa/extras/rtfexport/data/fdo68779.rtf | 25 + sw/qa/extras/rtfexport/data/fdo68787.rtf | 9 + sw/qa/extras/rtfexport/data/fdo69289.rtf | 6 + sw/qa/extras/rtfexport/data/fdo69384-paste.rtf | 17 + sw/qa/extras/rtfexport/data/fdo70221.rtf | Bin 0 -> 3714 bytes sw/qa/extras/rtfexport/data/fdo70578.rtf | 11 + sw/qa/extras/rtfexport/data/fdo72031.rtf | 1 + sw/qa/extras/rtfexport/data/fdo73241.rtf | 8 + sw/qa/extras/rtfexport/data/fdo74229.rtf | 33 + sw/qa/extras/rtfexport/data/fdo74709.rtf | 32 + sw/qa/extras/rtfexport/data/fdo75735.rtf | 8 + sw/qa/extras/rtfexport/data/fdo76628.rtf | 10 + sw/qa/extras/rtfexport/data/fdo76633.rtf | 32 + sw/qa/extras/rtfexport/data/fdo77267.rtf | 12 + sw/qa/extras/rtfexport/data/fdo77600.rtf | 25 + sw/qa/extras/rtfexport/data/fdo77979.odt | Bin 0 -> 9009 bytes sw/qa/extras/rtfexport/data/fdo77996.rtf | 36 + sw/qa/extras/rtfexport/data/fdo78502.rtf | 12 + sw/qa/extras/rtfexport/data/fdo78758.rtf | 9 + sw/qa/extras/rtfexport/data/fdo79384.rtf | 9 + sw/qa/extras/rtfexport/data/fdo79959.rtf | 4 + sw/qa/extras/rtfexport/data/fdo80167.rtf | 6 + sw/qa/extras/rtfexport/data/fdo80905.rtf | 12 + sw/qa/extras/rtfexport/data/fdo81892.rtf | 26 + sw/qa/extras/rtfexport/data/fdo82006.rtf | 5 + sw/qa/extras/rtfexport/data/fdo82076.rtf | 13 + sw/qa/extras/rtfexport/data/fdo82078.rtf | 13 + sw/qa/extras/rtfexport/data/fdo82106.rtf | 4 + sw/qa/extras/rtfexport/data/fdo82858.docx | Bin 0 -> 10672 bytes sw/qa/extras/rtfexport/data/fdo82859.rtf | 25 + sw/qa/extras/rtfexport/data/fdo82860.odt | Bin 0 -> 9222 bytes sw/qa/extras/rtfexport/data/fdo83204.rtf | 9 + sw/qa/extras/rtfexport/data/fdo83464.rtf | 24 + sw/qa/extras/rtfexport/data/fdo84679.rtf | 12 + sw/qa/extras/rtfexport/data/fdo85889-mac.rtf | 3 + sw/qa/extras/rtfexport/data/fdo85889-pc.rtf | 3 + sw/qa/extras/rtfexport/data/fdo85889-pca.rtf | 3 + sw/qa/extras/rtfexport/data/fdo86750.rtf | 4 + sw/qa/extras/rtfexport/data/fdo86761.rtf | 42 + sw/qa/extras/rtfexport/data/fdo89496.rtf | 18 + sw/qa/extras/rtfexport/data/fdo94835.rtf | 66 + sw/qa/extras/rtfexport/data/font-override.rtf | 28 + sw/qa/extras/rtfexport/data/footer-para.rtf | 5 + .../extras/rtfexport/data/graphic-object-fliph.rtf | 41 + sw/qa/extras/rtfexport/data/gutter-left.rtf | 4 + sw/qa/extras/rtfexport/data/gutter-top.rtf | 4 + sw/qa/extras/rtfexport/data/hello.rtf | 1 + sw/qa/extras/rtfexport/data/hexcrlf.rtf | 10 + sw/qa/extras/rtfexport/data/hidden-linebreaks.rtf | 27 + sw/qa/extras/rtfexport/data/hyperlink-target.rtf | 11 + sw/qa/extras/rtfexport/data/hyperlink.rtf | 9 + sw/qa/extras/rtfexport/data/hyperlink_empty.rtf | 8 + sw/qa/extras/rtfexport/data/hyphauto.rtf | 6 + sw/qa/extras/rtfexport/data/hyphpar.rtf | 5 + sw/qa/extras/rtfexport/data/i120928.rtf | 48 + .../rtfexport/data/invalidParagraphStyle.rtf | 14 + sw/qa/extras/rtfexport/data/landscape.rtf | 13 + sw/qa/extras/rtfexport/data/leftmargin-default.rtf | 5 + sw/qa/extras/rtfexport/data/levelfollow.rtf | 38 + sw/qa/extras/rtfexport/data/leveljc-center.rtf | 22 + sw/qa/extras/rtfexport/data/linenumbering.rtf | 8 + sw/qa/extras/rtfexport/data/margmirror.rtf | 9 + sw/qa/extras/rtfexport/data/math-accents.rtf | 189 + sw/qa/extras/rtfexport/data/math-d.rtf | 170 + sw/qa/extras/rtfexport/data/math-eqarray.rtf | 96 + sw/qa/extras/rtfexport/data/math-escaping.rtf | 12 + sw/qa/extras/rtfexport/data/math-lim.rtf | 48 + sw/qa/extras/rtfexport/data/math-limupp.rtf | 77 + sw/qa/extras/rtfexport/data/math-matrix.rtf | 66 + sw/qa/extras/rtfexport/data/math-mbox.rtf | 23 + sw/qa/extras/rtfexport/data/math-mso2007.rtf | 1218 ++++++ sw/qa/extras/rtfexport/data/math-nary.rtf | 87 + sw/qa/extras/rtfexport/data/math-placeholders.rtf | 26 + sw/qa/extras/rtfexport/data/math-rad.rtf | 48 + sw/qa/extras/rtfexport/data/math-runs.rtf | 12 + sw/qa/extras/rtfexport/data/math-sepchr.rtf | 39 + sw/qa/extras/rtfexport/data/math-strikeh.rtf | 26 + sw/qa/extras/rtfexport/data/math-subscripts.rtf | 224 ++ .../extras/rtfexport/data/math-vertical-stacks.rtf | 131 + sw/qa/extras/rtfexport/data/mathtype.rtf | 142 + sw/qa/extras/rtfexport/data/mnor.rtf | 86 + .../data/mw00_table_of_contents_templates.doc | Bin 0 -> 24064 bytes sw/qa/extras/rtfexport/data/n192129.rtf | 3 + sw/qa/extras/rtfexport/data/n750757.rtf | 45 + sw/qa/extras/rtfexport/data/n751020.rtf | 8 + sw/qa/extras/rtfexport/data/n757651.rtf | 18 + sw/qa/extras/rtfexport/data/n818997.rtf | 77 + sw/qa/extras/rtfexport/data/n818997B.rtf | 77 + sw/qa/extras/rtfexport/data/n820504.rtf | 37 + sw/qa/extras/rtfexport/data/n825305.rtf | 76 + sw/qa/extras/rtfexport/data/num-override-start.rtf | 29 + sw/qa/extras/rtfexport/data/numbering-font.rtf | 20 + sw/qa/extras/rtfexport/data/page-background.rtf | 30 + sw/qa/extras/rtfexport/data/page-border.rtf | 4 + .../data/page-break-emptyparas-spltpgpar.rtf | 13 + .../rtfexport/data/page-break-emptyparas.rtf | 12 + .../rtfexport/data/para-adjust-distribute.rtf | 4 + sw/qa/extras/rtfexport/data/para-border.rtf | 27 + sw/qa/extras/rtfexport/data/para-bottom-margin.rtf | 14 + sw/qa/extras/rtfexport/data/para-shadow.rtf | 21 + .../rtfexport/data/para-style-bottom-margin-2.rtf | 12 + sw/qa/extras/rtfexport/data/pgndec.rtf | 24 + sw/qa/extras/rtfexport/data/pgnlcltr.rtf | 23 + sw/qa/extras/rtfexport/data/pgnlcrm.rtf | 23 + sw/qa/extras/rtfexport/data/pgnucrm.rtf | 23 + .../extras/rtfexport/data/picture-wrap-polygon.rtf | 47 + sw/qa/extras/rtfexport/data/placeholder.odt | Bin 0 -> 8752 bytes sw/qa/extras/rtfexport/data/record-changes.rtf | 3 + sw/qa/extras/rtfexport/data/redline-insdel.rtf | 11 + sw/qa/extras/rtfexport/data/redline.rtf | 18 + sw/qa/extras/rtfexport/data/relsize.rtf | 42 + sw/qa/extras/rtfexport/data/rhbz1065629.rtf | 101 + sw/qa/extras/rtfexport/data/rtl-gutter.rtf | 4 + sw/qa/extras/rtfexport/data/sautoupd.rtf | 7 + sw/qa/extras/rtfexport/data/shptxt-pard.rtf | 19 + sw/qa/extras/rtfexport/data/shpz-dhgt.rtf | 43 + .../extras/rtfexport/data/tab-stop-fill-chars.rtf | 14 + sw/qa/extras/rtfexport/data/table-rtl.rtf | 5 + sw/qa/extras/rtfexport/data/tabs.rtf | 4 + sw/qa/extras/rtfexport/data/tbrl-frame.odt | Bin 0 -> 8666 bytes sw/qa/extras/rtfexport/data/tbrl-page.rtf | 3 + sw/qa/extras/rtfexport/data/tdf100507.rtf | 22 + .../rtfexport/data/tdf100961_fixedDateTime.rtf | 38 + sw/qa/extras/rtfexport/data/tdf103925.rtf | 1 + sw/qa/extras/rtfexport/data/tdf103956.rtf | 8 + sw/qa/extras/rtfexport/data/tdf104035.rtf | 14 + sw/qa/extras/rtfexport/data/tdf104079.rtf | 48 + sw/qa/extras/rtfexport/data/tdf104081.rtf | 4 + sw/qa/extras/rtfexport/data/tdf104085.rtf | Bin 0 -> 348 bytes sw/qa/extras/rtfexport/data/tdf104228.rtf | 37 + sw/qa/extras/rtfexport/data/tdf104287.rtf | 38 + sw/qa/extras/rtfexport/data/tdf104317.rtf | 39 + sw/qa/extras/rtfexport/data/tdf104390.rtf | 6 + sw/qa/extras/rtfexport/data/tdf104744.rtf | 24 + sw/qa/extras/rtfexport/data/tdf104936.rtf | 20 + sw/qa/extras/rtfexport/data/tdf104937.rtf | 42 + sw/qa/extras/rtfexport/data/tdf105729.rtf | 9 + sw/qa/extras/rtfexport/data/tdf105852.rtf | 50 + sw/qa/extras/rtfexport/data/tdf106694.rtf | 10 + sw/qa/extras/rtfexport/data/tdf106950.rtf | 8 + sw/qa/extras/rtfexport/data/tdf106953.rtf | 23 + sw/qa/extras/rtfexport/data/tdf107116.rtf | 10 + sw/qa/extras/rtfexport/data/tdf107413.rtf | 155 + sw/qa/extras/rtfexport/data/tdf107480.rtf | 17 + sw/qa/extras/rtfexport/data/tdf107620.docx | Bin 0 -> 12654 bytes sw/qa/extras/rtfexport/data/tdf108123.rtf | 48 + sw/qa/extras/rtfexport/data/tdf108416.rtf | 18 + .../rtfexport/data/tdf108505_fieldCharFormat.rtf | 34 + .../rtfexport/data/tdf108505_fieldCharFormat2.rtf | 37 + sw/qa/extras/rtfexport/data/tdf108949_footnote.rtf | 15 + .../data/tdf108949_footnoteCharFormat.odt | Bin 0 -> 14038 bytes sw/qa/extras/rtfexport/data/tdf108955.rtf | 11 + sw/qa/extras/rtfexport/data/tdf109790.rtf | 16 + sw/qa/extras/rtfexport/data/tdf111851.rtf | 17 + .../rtfexport/data/tdf112208_hangingIndent.rtf | 89 + sw/qa/extras/rtfexport/data/tdf112211.rtf | 31 + sw/qa/extras/rtfexport/data/tdf112507.rtf | 38 + sw/qa/extras/rtfexport/data/tdf112520.docx | Bin 0 -> 13279 bytes sw/qa/extras/rtfexport/data/tdf113202.rtf | 42 + sw/qa/extras/rtfexport/data/tdf113408.rtf | 24 + sw/qa/extras/rtfexport/data/tdf113550.rtf | 17 + sw/qa/extras/rtfexport/data/tdf114303.rtf | 11 + sw/qa/extras/rtfexport/data/tdf114309.rtf | 40 + sw/qa/extras/rtfexport/data/tdf114333.rtf | 5 + sw/qa/extras/rtfexport/data/tdf115180.docx | Bin 0 -> 10151 bytes sw/qa/extras/rtfexport/data/tdf116358.rtf | 116 + sw/qa/extras/rtfexport/data/tdf116371.odt | Bin 0 -> 13384 bytes .../rtfexport/data/tdf116436_tableBackground.odt | Bin 0 -> 10745 bytes sw/qa/extras/rtfexport/data/tdf116841.rtf | 16 + sw/qa/extras/rtfexport/data/tdf117268.rtf | 35 + sw/qa/extras/rtfexport/data/tdf117505.odt | Bin 0 -> 19263 bytes sw/qa/extras/rtfexport/data/tdf118047.rtf | 14 + sw/qa/extras/rtfexport/data/tdf121623.rtf | 165 + sw/qa/extras/rtfexport/data/tdf122455.rtf | 21 + .../rtfexport/data/tdf122589_firstSection.odt | Bin 0 -> 17950 bytes sw/qa/extras/rtfexport/data/tdf123393.rtf | 14 + sw/qa/extras/rtfexport/data/tdf123703.rtf | 31 + .../extras/rtfexport/data/tdf123703_compatible.rtf | 37 + .../extras/rtfexport/data/tdf123703_stshfdbch.rtf | 31 + sw/qa/extras/rtfexport/data/tdf125719_case_1.rtf | 108 + sw/qa/extras/rtfexport/data/tdf125719_case_2.rtf | 139 + sw/qa/extras/rtfexport/data/tdf126309.rtf | 8 + sw/qa/extras/rtfexport/data/tdf127806.rtf | 86 + sw/qa/extras/rtfexport/data/tdf128320.odt | Bin 0 -> 31978 bytes .../data/tdf128428_compatible_monospaced.rtf | 38 + .../extras/rtfexport/data/tdf128428_dntblnsbdb.rtf | 31 + .../extras/rtfexport/data/tdf128428_monospaced.rtf | 33 + sw/qa/extras/rtfexport/data/tdf129513.rtf | 4 + .../rtfexport/data/tdf129522_removeShadowStyle.odt | Bin 0 -> 14253 bytes sw/qa/extras/rtfexport/data/tdf129578_lostBI.rtf | 31 + .../rtfexport/data/tdf129631_lostBorders.rtf | 27 + .../rtfexport/data/tdf129631_lostBorders3.rtf | 27 + sw/qa/extras/rtfexport/data/tdf130817.rtf | 82 + sw/qa/extras/rtfexport/data/tdf131234.rtf | 12 + sw/qa/extras/rtfexport/data/tdf133437.rtf | 571 +++ .../rtfexport/data/tdf136587_noStyleName.rtf | 13 + sw/qa/extras/rtfexport/data/tdf137085.rtf | 10 + .../rtfexport/data/tdf137683_charHighlightNone.rtf | 18 + sw/qa/extras/rtfexport/data/tdf137894.odt | Bin 0 -> 11723 bytes sw/qa/extras/rtfexport/data/tdf138210.rtf | Bin 0 -> 1281 bytes sw/qa/extras/rtfexport/data/tdf138779.docx | Bin 0 -> 16556 bytes sw/qa/extras/rtfexport/data/tdf139948.rtf | 8 + sw/qa/extras/rtfexport/data/tdf141964_numId0.rtf | 42 + sw/qa/extras/rtfexport/data/tdf144437.odt | Bin 0 -> 8514 bytes sw/qa/extras/rtfexport/data/tdf146489.rtf | 56 + sw/qa/extras/rtfexport/data/tdf148515.rtf | 14 + sw/qa/extras/rtfexport/data/tdf148578.rtf | 12 + sw/qa/extras/rtfexport/data/tdf150267.rtf | 209 + sw/qa/extras/rtfexport/data/tdf151370.rtf | 3 + sw/qa/extras/rtfexport/data/tdf152784_1.rtf | 20 + sw/qa/extras/rtfexport/data/tdf153178.rtf | 7 + sw/qa/extras/rtfexport/data/tdf153195.rtf | 319 ++ .../data/tdf153613_anchoredAfterPgBreak.rtf | 268 ++ .../data/tdf153613_anchoredAfterPgBreak2.rtf | 269 ++ .../data/tdf153613_anchoredAfterPgBreak4.rtf | 268 ++ .../data/tdf153613_anchoredAfterPgBreak5.rtf | 365 ++ .../data/tdf153613_inlineAfterPgBreak.rtf | 265 ++ .../data/tdf153613_inlineAfterPgBreak2.rtf | 265 ++ sw/qa/extras/rtfexport/data/tdf153681.odt | Bin 0 -> 8646 bytes .../rtfexport/data/tdf154129_transparentFrame.rtf | 3 + sw/qa/extras/rtfexport/data/tdf156030.rtf | 11 + .../extras/rtfexport/data/tdf158586_lostFrame.rtf | 17 + .../extras/rtfexport/data/tdf158586_pageBreak0.rtf | 15 + .../rtfexport/data/tdf158586_pageBreak0B.rtf | 15 + .../extras/rtfexport/data/tdf158586_pageBreak1.rtf | 15 + sw/qa/extras/rtfexport/data/tdf158762.rtf | 335 ++ sw/qa/extras/rtfexport/data/tdf158826_extraCR.rtf | 23 + sw/qa/extras/rtfexport/data/tdf158830.rtf | 237 ++ sw/qa/extras/rtfexport/data/tdf158978.rtf | 350 ++ sw/qa/extras/rtfexport/data/tdf158982.rtf | 281 ++ sw/qa/extras/rtfexport/data/tdf44986.rtf | 35 + sw/qa/extras/rtfexport/data/tdf49073.rtf | 112 + sw/qa/extras/rtfexport/data/tdf50821.rtf | 10 + sw/qa/extras/rtfexport/data/tdf54584.rtf | 4 + sw/qa/extras/rtfexport/data/tdf61901.rtf | 7 + sw/qa/extras/rtfexport/data/tdf65642.rtf | 23 + sw/qa/extras/rtfexport/data/tdf66543.rtf | 8 + sw/qa/extras/rtfexport/data/tdf74795.rtf | 13 + sw/qa/extras/rtfexport/data/tdf75614.rtf | 18 + sw/qa/extras/rtfexport/data/tdf77349.rtf | 3 + sw/qa/extras/rtfexport/data/tdf80708.rtf | 15 + sw/qa/extras/rtfexport/data/tdf82073.rtf | 9 + sw/qa/extras/rtfexport/data/tdf84832.docx | Bin 0 -> 11875 bytes sw/qa/extras/rtfexport/data/tdf86182.rtf | 4 + sw/qa/extras/rtfexport/data/tdf86814.rtf | 8 + sw/qa/extras/rtfexport/data/tdf87034.rtf | 13 + sw/qa/extras/rtfexport/data/tdf88583.odt | Bin 0 -> 8471 bytes sw/qa/extras/rtfexport/data/tdf88811.rtf | 26 + sw/qa/extras/rtfexport/data/tdf90260-nopar.rtf | 2 + sw/qa/extras/rtfexport/data/tdf90421.fodt | 8 + sw/qa/extras/rtfexport/data/tdf90697.rtf | 73 + sw/qa/extras/rtfexport/data/tdf91074.rtf | 7 + sw/qa/extras/rtfexport/data/tdf92061.rtf | 5 + sw/qa/extras/rtfexport/data/tdf92481.rtf | 6 + sw/qa/extras/rtfexport/data/tdf92521.odt | Bin 0 -> 8891 bytes sw/qa/extras/rtfexport/data/tdf94043.rtf | 17 + sw/qa/extras/rtfexport/data/tdf94377.rtf | 15 + sw/qa/extras/rtfexport/data/tdf94435.rtf | 7 + sw/qa/extras/rtfexport/data/tdf94456.rtf | 23 + sw/qa/extras/rtfexport/data/tdf95706.rtf | 36 + sw/qa/extras/rtfexport/data/tdf95706_2.rtf | 17 + sw/qa/extras/rtfexport/data/tdf95707.rtf | 178 + sw/qa/extras/rtfexport/data/tdf96175.rtf | 6 + sw/qa/extras/rtfexport/data/tdf96275.rtf | 18 + sw/qa/extras/rtfexport/data/tdf96308-deftab.rtf | 8 + sw/qa/extras/rtfexport/data/tdf97035.rtf | 140 + sw/qa/extras/rtfexport/data/tdf98806.rtf | 11 + sw/qa/extras/rtfexport/data/textframe-borders.rtf | 49 + sw/qa/extras/rtfexport/data/textframe-gradient.rtf | 161 + sw/qa/extras/rtfexport/data/textframe-table.rtf | 41 + sw/qa/extras/rtfexport/data/textframes.odt | Bin 0 -> 8853 bytes sw/qa/extras/rtfexport/data/ulw.rtf | 1 + sw/qa/extras/rtfexport/data/watermark.rtf | 660 ++++ sw/qa/extras/rtfexport/data/zoom.rtf | 1 + sw/qa/extras/rtfexport/rtfexport.cxx | 829 ++++ sw/qa/extras/rtfexport/rtfexport2.cxx | 961 +++++ sw/qa/extras/rtfexport/rtfexport3.cxx | 712 ++++ sw/qa/extras/rtfexport/rtfexport4.cxx | 838 ++++ sw/qa/extras/rtfexport/rtfexport5.cxx | 784 ++++ sw/qa/extras/rtfexport/rtfexport6.cxx | 756 ++++ sw/qa/extras/rtfexport/rtfexport7.cxx | 785 ++++ sw/qa/extras/rtfexport/rtfexport8.cxx | 148 + sw/qa/extras/rtfimport/data/background.rtf | 39 + sw/qa/extras/rtfimport/data/behind-doc.rtf | 19 + sw/qa/extras/rtfimport/data/chtoutline.rtf | 207 + sw/qa/extras/rtfimport/data/classification-no.rtf | 1 + sw/qa/extras/rtfimport/data/classification-yes.rtf | 11 + sw/qa/extras/rtfimport/data/column-break.rtf | 1 + .../rtfimport/data/cont-section-pagebreak.rtf | 16 + .../extras/rtfimport/data/cp950listleveltext1.rtf | 196 + .../extras/rtfimport/data/cp950listleveltext2.rtf | 177 + .../extras/rtfimport/data/cp950listleveltext3.rtf | 177 + sw/qa/extras/rtfimport/data/default-values.rtf | 18 + sw/qa/extras/rtfimport/data/fdo44984.rtf | 30 + sw/qa/extras/rtfimport/data/fdo45182.rtf | 11 + sw/qa/extras/rtfimport/data/fdo45183.rtf | 34 + sw/qa/extras/rtfimport/data/fdo45190.rtf | 10 + sw/qa/extras/rtfimport/data/fdo46662.rtf | 46 + sw/qa/extras/rtfimport/data/fdo47036.rtf | 73 + sw/qa/extras/rtfimport/data/fdo47440.rtf | 27 + sw/qa/extras/rtfimport/data/fdo48442.rtf | 10 + sw/qa/extras/rtfimport/data/fdo49692.rtf | 17 + sw/qa/extras/rtfimport/data/fdo49892.rtf | 238 ++ sw/qa/extras/rtfimport/data/fdo49893-3.rtf | 15 + sw/qa/extras/rtfimport/data/fdo49893.rtf | 14 + sw/qa/extras/rtfimport/data/fdo52052.rtf | 23 + sw/qa/extras/rtfimport/data/fdo52066.rtf | 21 + sw/qa/extras/rtfimport/data/fdo53556.rtf | 49 + sw/qa/extras/rtfimport/data/fdo55525.rtf | 12 + sw/qa/extras/rtfimport/data/fdo57708.rtf | 8 + sw/qa/extras/rtfimport/data/fdo59953.rtf | 16 + sw/qa/extras/rtfimport/data/fdo66565.rtf | 35 + sw/qa/extras/rtfimport/data/fdo67365.rtf | 35 + sw/qa/extras/rtfimport/data/fdo68291-paste.rtf | 17 + sw/qa/extras/rtfimport/data/fdo68291.odt | Bin 0 -> 8237 bytes sw/qa/extras/rtfimport/data/fdo74599.rtf | 8 + sw/qa/extras/rtfimport/data/fdo74823.rtf | 32 + sw/qa/extras/rtfimport/data/fdo79319.rtf | 60 + sw/qa/extras/rtfimport/data/fdo80742.rtf | 6 + sw/qa/extras/rtfimport/data/fdo81033.rtf | 12 + sw/qa/extras/rtfimport/data/fdo81944.rtf | 15 + sw/qa/extras/rtfimport/data/fdo82071.rtf | 46 + sw/qa/extras/rtfimport/data/fdo82114.rtf | 14 + sw/qa/extras/rtfimport/data/fdo82512.rtf | 10 + sw/qa/extras/rtfimport/data/fdo84685.rtf | 7 + sw/qa/extras/rtfimport/data/fdo85179.rtf | 37 + sw/qa/extras/rtfimport/data/fdo85812.rtf | 39 + sw/qa/extras/rtfimport/data/flip.rtf | 96 + sw/qa/extras/rtfimport/data/groupshape-notext.rtf | 71 + .../extras/rtfimport/data/groupshape-rotation.rtf | 75 + sw/qa/extras/rtfimport/data/groupshape.rtf | 76 + sw/qa/extras/rtfimport/data/hello.rtf | 1 + .../rtfimport/data/hidden-para-separator.rtf | 67 + sw/qa/extras/rtfimport/data/ink.rtf | 157 + sw/qa/extras/rtfimport/data/libreoffice.png | Bin 0 -> 767 bytes sw/qa/extras/rtfimport/data/lndscpsxn.rtf | 17 + sw/qa/extras/rtfimport/data/n695479.rtf | 14 + sw/qa/extras/rtfimport/data/n823655.rtf | 48 + sw/qa/extras/rtfimport/data/n823675.rtf | 27 + sw/qa/extras/rtfimport/data/ole-inline.rtf | 188 + .../rtfimport/data/para-style-bottom-margin.rtf | 14 + .../data/paste-first-para-direct-format.rtf | 21 + sw/qa/extras/rtfimport/data/posh-leftright.rtf | 45 + sw/qa/extras/rtfimport/data/posh-posv.rtf | 24 + sw/qa/extras/rtfimport/data/sbkeven.rtf | 10 + sw/qa/extras/rtfimport/data/sbkodd.rtf | 10 + sw/qa/extras/rtfimport/data/section-pagebreak.rtf | 15 + sw/qa/extras/rtfimport/data/tdf104016.rtf | 30 + sw/qa/extras/rtfimport/data/tdf105511.rtf | 4 + sw/qa/extras/rtfimport/data/tdf108055.rtf | 232 ++ sw/qa/extras/rtfimport/data/tdf108943.rtf | 24 + sw/qa/extras/rtfimport/data/tdf108947.rtf | 113 + sw/qa/extras/rtfimport/data/tdf108951.rtf | 38 + sw/qa/extras/rtfimport/data/tdf112211-2.rtf | 43 + sw/qa/extras/rtfimport/data/tdf115153.rtf | 9 + sw/qa/extras/rtfimport/data/tdf115155.rtf | 30 + sw/qa/extras/rtfimport/data/tdf115242.rtf | 40 + sw/qa/extras/rtfimport/data/tdf115715.rtf | 38 + sw/qa/extras/rtfimport/data/tdf116265.rtf | 28 + sw/qa/extras/rtfimport/data/tdf116269.rtf | 22 + sw/qa/extras/rtfimport/data/tdf117246.rtf | 11 + sw/qa/extras/rtfimport/data/tdf117403.rtf | 15 + sw/qa/extras/rtfimport/data/tdf119599.rtf | 9 + sw/qa/extras/rtfimport/data/tdf122430.rtf | 31 + sw/qa/extras/rtfimport/data/tdf126173.rtf | 85 + sw/qa/extras/rtfimport/data/tdf128611.rtf | 29 + sw/qa/extras/rtfimport/data/tdf158044.rtf | 20 + sw/qa/extras/rtfimport/data/tdf59454.rtf | 8 + sw/qa/extras/rtfimport/data/tdf59699.rtf | 10 + sw/qa/extras/rtfimport/data/tdf78506.rtf | 24 + sw/qa/extras/rtfimport/data/tdf81943.rtf | 48 + sw/qa/extras/rtfimport/data/tdf84684.rtf | 399 ++ sw/qa/extras/rtfimport/data/tdf90046.rtf | 8 + sw/qa/extras/rtfimport/data/tdf90097.rtf | 162 + sw/qa/extras/rtfimport/data/tdf90260-par.rtf | 2 + sw/qa/extras/rtfimport/data/tdf90315.rtf | 4 + sw/qa/extras/rtfimport/data/tdf91684.rtf | 460 +++ sw/qa/extras/rtfimport/data/tdf96308-tabpos.rtf | 12 + sw/qa/extras/rtfimport/data/tdf96326.rtf | 27 + sw/qa/extras/rtfimport/data/tdf99498.rtf | 3 + .../rtfimport/data/unbalanced-columns-compat.rtf | 7 + sw/qa/extras/rtfimport/data/unbalanced-columns.rtf | 5 + sw/qa/extras/rtfimport/data/watermark.rtf | 407 ++ sw/qa/extras/rtfimport/data/wrap-distance.rtf | 69 + sw/qa/extras/rtfimport/rtfimport.cxx | 1824 +++++++++ sw/qa/extras/tiledrendering/data/2-pages.odt | Bin 0 -> 8596 bytes .../extras/tiledrendering/data/cond-coll-copy.odt | Bin 0 -> 7351 bytes .../data/double-underline_and_strike-out.fodt | 70 + .../tiledrendering/data/drop_down_form_field.odt | Bin 0 -> 8596 bytes .../tiledrendering/data/drop_down_form_field2.odt | Bin 0 -> 8596 bytes .../data/drop_down_form_field_noitem.odt | Bin 0 -> 8467 bytes .../data/drop_down_form_field_noselection.odt | Bin 0 -> 8512 bytes sw/qa/extras/tiledrendering/data/dummy.fodt | 8 + sw/qa/extras/tiledrendering/data/estonian.odt | Bin 0 -> 11615 bytes sw/qa/extras/tiledrendering/data/fieldmark.docx | Bin 0 -> 13174 bytes sw/qa/extras/tiledrendering/data/frame.odt | Bin 0 -> 8370 bytes .../tiledrendering/data/hiddenLoremIpsum.docx | Bin 0 -> 6807 bytes sw/qa/extras/tiledrendering/data/hyperlink.odt | Bin 0 -> 9154 bytes sw/qa/extras/tiledrendering/data/image-comment.odt | Bin 0 -> 9765 bytes sw/qa/extras/tiledrendering/data/multiline.odt | Bin 0 -> 10456 bytes .../tiledrendering/data/pagedown-invalidation.odt | Bin 0 -> 8528 bytes .../tiledrendering/data/pilcrow-redlining.fodt | 62 + .../data/redline-notification-during-save.odt | Bin 0 -> 6786 bytes .../data/removenode_redline_callback.fodt | 306 ++ .../tiledrendering/data/savedauthorfield.odt | Bin 0 -> 9388 bytes sw/qa/extras/tiledrendering/data/search.odt | Bin 0 -> 11324 bytes .../tiledrendering/data/semi-transparent.odt | Bin 0 -> 8891 bytes .../tiledrendering/data/shape-with-text.fodt | 17 + sw/qa/extras/tiledrendering/data/shape.fodt | 33 + .../data/splitnode_redline_callback.fodt | 294 ++ .../tiledrendering/data/table-paint-invalidate.odt | Bin 0 -> 9067 bytes .../tiledrendering/data/tdf114799_highlight.docx | Bin 0 -> 29040 bytes .../extras/tiledrendering/data/tdf114799_shd.docx | Bin 0 -> 29049 bytes sw/qa/extras/tiledrendering/data/tdf115088.odt | Bin 0 -> 8108 bytes sw/qa/extras/tiledrendering/data/tdf117448.fodt | 30 + .../data/tdf43244_SpacesOnMargin.odt | Bin 0 -> 9791 bytes .../data/testTableCommentRemoveCallback.odt | Bin 0 -> 11077 bytes sw/qa/extras/tiledrendering/tiledrendering.cxx | 4048 +++++++++++++++++++ sw/qa/extras/txtencexport/data/bullets.odt | Bin 0 -> 10827 bytes sw/qa/extras/txtencexport/txtencexport.cxx | 99 + sw/qa/extras/txtexport/data/UTF16LEBOMCRLF.txt | Bin 0 -> 18 bytes sw/qa/extras/txtexport/data/UTF16LECRLF.txt | Bin 0 -> 16 bytes sw/qa/extras/txtexport/data/UTF8BOMCRLF.txt | 2 + sw/qa/extras/txtexport/data/UTF8CRLF.txt | 2 + sw/qa/extras/txtexport/data/bullets.odt | Bin 0 -> 10379 bytes sw/qa/extras/txtexport/txtexport.cxx | 144 + sw/qa/extras/txtimport/data/GB18030.txt | 1 + sw/qa/extras/txtimport/data/UTF16BEWITHBOM.txt | Bin 0 -> 1290 bytes sw/qa/extras/txtimport/data/UTF16BEWITHOUTBOM.txt | Bin 0 -> 1288 bytes sw/qa/extras/txtimport/data/UTF16LEWITHBOM.txt | Bin 0 -> 1290 bytes sw/qa/extras/txtimport/data/UTF16LEWITHOUTBOM.txt | Bin 0 -> 1288 bytes sw/qa/extras/txtimport/data/UTF8WITHBOM.txt | 2 + sw/qa/extras/txtimport/data/UTF8WITHOUTBOM.txt | 2 + sw/qa/extras/txtimport/data/bullets.odt | Bin 0 -> 10379 bytes sw/qa/extras/txtimport/txtimport.cxx | 236 ++ sw/qa/extras/uiwriter/data/152575.fodt | 447 +++ sw/qa/extras/uiwriter/data/AsCharTxBxTest.docx | Bin 0 -> 19888 bytes sw/qa/extras/uiwriter/data/AtPageTextBoxCrash.odt | Bin 0 -> 9880 bytes sw/qa/extras/uiwriter/data/DUMMY.odm | Bin 0 -> 8336 bytes sw/qa/extras/uiwriter/data/DUMMY1.odt | Bin 0 -> 8473 bytes sw/qa/extras/uiwriter/data/HiddenSection.odt | Bin 0 -> 8378 bytes .../uiwriter/data/MsWordCompTrailingBlanks.docx | Bin 0 -> 14629 bytes .../data/MsWordCompTrailingBlanksFalse.odt | Bin 0 -> 8629 bytes .../uiwriter/data/MsWordCompTrailingBlanksTrue.odt | Bin 0 -> 8628 bytes sw/qa/extras/uiwriter/data/TC-table-DnD-move.docx | Bin 0 -> 12977 bytes .../uiwriter/data/TC-table-converttotable.docx | Bin 0 -> 14913 bytes sw/qa/extras/uiwriter/data/TC-table-del-add.docx | Bin 0 -> 13681 bytes sw/qa/extras/uiwriter/data/TC-table-rowadd.docx | Bin 0 -> 13050 bytes sw/qa/extras/uiwriter/data/autotext-dotm.dotm | Bin 0 -> 19456 bytes sw/qa/extras/uiwriter/data/autotext-empty.dotx | Bin 0 -> 11390 bytes sw/qa/extras/uiwriter/data/autotext-gallery.dotx | Bin 0 -> 18550 bytes sw/qa/extras/uiwriter/data/autotext-multiple.dotx | Bin 0 -> 18470 bytes sw/qa/extras/uiwriter/data/collapsed_bookmark.odt | Bin 0 -> 8199 bytes sw/qa/extras/uiwriter/data/commented-word.odt | Bin 0 -> 9953 bytes sw/qa/extras/uiwriter/data/cp1000071.odt | Bin 0 -> 9268 bytes sw/qa/extras/uiwriter/data/cp1000115.fodt | 208 + .../uiwriter/data/cross_reference_demo_bmk.odt | Bin 0 -> 8443 bytes .../uiwriter/data/cursor_position_after_undo.odt | Bin 0 -> 21223 bytes sw/qa/extras/uiwriter/data/datasource.ods | Bin 0 -> 9596 bytes sw/qa/extras/uiwriter/data/demo91.fodt | 156 + sw/qa/extras/uiwriter/data/draw-anchor-undo.odt | Bin 0 -> 9823 bytes sw/qa/extras/uiwriter/data/fdo112025-insert.docx | Bin 0 -> 4090 bytes sw/qa/extras/uiwriter/data/fdo112025.odt | Bin 0 -> 8836 bytes sw/qa/extras/uiwriter/data/fdo114306.odt | Bin 0 -> 17107 bytes sw/qa/extras/uiwriter/data/fdo114306_2.odt | Bin 0 -> 38424 bytes sw/qa/extras/uiwriter/data/fdo69893.odt | Bin 0 -> 7178 bytes sw/qa/extras/uiwriter/data/fdo70807.odt | Bin 0 -> 22693 bytes sw/qa/extras/uiwriter/data/fdo72942-insert.docx | Bin 0 -> 11830 bytes sw/qa/extras/uiwriter/data/fdo72942.docx | Bin 0 -> 4980 bytes sw/qa/extras/uiwriter/data/fdo75110.odt | Bin 0 -> 13169 bytes sw/qa/extras/uiwriter/data/fdo75898.odt | Bin 0 -> 9446 bytes sw/qa/extras/uiwriter/data/fdo82191.odt | Bin 0 -> 10888 bytes sw/qa/extras/uiwriter/data/fdo85554.odt | Bin 0 -> 10091 bytes sw/qa/extras/uiwriter/data/fdo87448.odt | Bin 0 -> 9989 bytes .../uiwriter/data/floating-table-position.docx | Bin 0 -> 13236 bytes .../uiwriter/data/forum-mso-en-13192-min.docx | Bin 0 -> 31920 bytes .../uiwriter/data/hash#path/calc-data-source.ods | Bin 0 -> 16055 bytes .../data/hash#path/embedded-data-source.odt | Bin 0 -> 9554 bytes sw/qa/extras/uiwriter/data/hello-world.pdf | Bin 0 -> 6961 bytes sw/qa/extras/uiwriter/data/i95698.odt | Bin 0 -> 10770 bytes .../extras/uiwriter/data/image-comment-at-char.odt | Bin 0 -> 9985 bytes sw/qa/extras/uiwriter/data/image-comment.odt | Bin 0 -> 9847 bytes sw/qa/extras/uiwriter/data/image.odt | Bin 0 -> 9569 bytes .../uiwriter/data/lines-in-section-in-table.odt | Bin 0 -> 9396 bytes sw/qa/extras/uiwriter/data/lorem.fodt | 14 + sw/qa/extras/uiwriter/data/merge-change1.odt | Bin 0 -> 12057 bytes sw/qa/extras/uiwriter/data/merge-change2.odt | Bin 0 -> 12300 bytes sw/qa/extras/uiwriter/data/num-parent-style.docx | Bin 0 -> 14002 bytes sw/qa/extras/uiwriter/data/ofz18563.docx | Bin 0 -> 7102 bytes sw/qa/extras/uiwriter/data/ole-save-while-edit.odt | Bin 0 -> 14547 bytes sw/qa/extras/uiwriter/data/ole2.png | Bin 0 -> 766 bytes .../uiwriter/data/pageBreakWithPageStyle.fodt | 17 + .../uiwriter/data/paragraph-of-text-range.odt | Bin 0 -> 8878 bytes .../extras/uiwriter/data/redline-autocorrect.fodt | 24 + .../extras/uiwriter/data/redline-autocorrect2.fodt | 24 + .../extras/uiwriter/data/redline-autocorrect3.fodt | 24 + sw/qa/extras/uiwriter/data/redline-para-join.docx | Bin 0 -> 13090 bytes sw/qa/extras/uiwriter/data/redlineFrame.fodt | 81 + .../data/redlineFrame_at_char_start_inside.fodt | 73 + .../data/redlineFrame_at_char_start_outside.fodt | 73 + .../data/redline_fly_at_para_one_paragraph.odt | Bin 0 -> 9251 bytes ...line_fly_duplication_at_para_2nd_paragraph.fodt | 222 ++ ...redline_fly_duplication_at_para_end_inside.fodt | 228 ++ ...line_fly_duplication_at_para_start_outside.fodt | 229 ++ sw/qa/extras/uiwriter/data/rhbz1810732.docx | Bin 0 -> 12107 bytes sw/qa/extras/uiwriter/data/rhbz739252-3.odt | Bin 0 -> 20869 bytes sw/qa/extras/uiwriter/data/select-column.fodt | 42 + sw/qa/extras/uiwriter/data/select-row.fodt | 33 + sw/qa/extras/uiwriter/data/shape-page-move.odt | Bin 0 -> 10137 bytes .../uiwriter/data/shape-textbox-autosize.odt | Bin 0 -> 12356 bytes .../uiwriter/data/shape-textbox-vertadjust.odt | Bin 0 -> 12049 bytes sw/qa/extras/uiwriter/data/shape-textbox.odt | Bin 0 -> 10689 bytes sw/qa/extras/uiwriter/data/simplefooter.docx | Bin 0 -> 18174 bytes .../extras/uiwriter/data/small_floating_table.odt | Bin 0 -> 8977 bytes .../data/split-section-in-nested-table.fodt | 154 + .../extras/uiwriter/data/table-at-end-of-cell.fodt | 219 ++ sw/qa/extras/uiwriter/data/table-in-sect.odt | Bin 0 -> 11744 bytes sw/qa/extras/uiwriter/data/tdf100018-1.odt | Bin 0 -> 18795 bytes sw/qa/extras/uiwriter/data/tdf100691.fodt | 230 ++ sw/qa/extras/uiwriter/data/tdf101534.fodt | 28 + .../data/tdf103978_backgroundTextShape.docx | Bin 0 -> 26058 bytes sw/qa/extras/uiwriter/data/tdf104032.odt | Bin 0 -> 8967 bytes sw/qa/extras/uiwriter/data/tdf104315.odt | Bin 0 -> 13217 bytes sw/qa/extras/uiwriter/data/tdf104425.odt | Bin 0 -> 9459 bytes sw/qa/extras/uiwriter/data/tdf104440.odt | Bin 0 -> 8807 bytes sw/qa/extras/uiwriter/data/tdf104492.docx | Bin 0 -> 61554 bytes sw/qa/extras/uiwriter/data/tdf104649.docx | Bin 0 -> 75971 bytes sw/qa/extras/uiwriter/data/tdf104814.docx | Bin 0 -> 12830 bytes sw/qa/extras/uiwriter/data/tdf105330.odt | Bin 0 -> 8970 bytes sw/qa/extras/uiwriter/data/tdf105413.fodt | 38 + sw/qa/extras/uiwriter/data/tdf105417.odt | Bin 0 -> 9238 bytes sw/qa/extras/uiwriter/data/tdf105625.fodt | 9 + .../data/tdf106701_tabOverMarginAutotab.doc | Bin 0 -> 21504 bytes sw/qa/extras/uiwriter/data/tdf106736-grid.odt | Bin 0 -> 11498 bytes sw/qa/extras/uiwriter/data/tdf106843.docx | Bin 0 -> 13936 bytes sw/qa/extras/uiwriter/data/tdf107025.odt | Bin 0 -> 8337 bytes sw/qa/extras/uiwriter/data/tdf107362.odt | Bin 0 -> 10905 bytes sw/qa/extras/uiwriter/data/tdf107893.odt | Bin 0 -> 9133 bytes sw/qa/extras/uiwriter/data/tdf107975.odt | Bin 0 -> 10312 bytes sw/qa/extras/uiwriter/data/tdf108124.odt | Bin 0 -> 21575 bytes sw/qa/extras/uiwriter/data/tdf108524.odt | Bin 0 -> 9053 bytes sw/qa/extras/uiwriter/data/tdf108687_tabstop.odt | Bin 0 -> 12847 bytes sw/qa/extras/uiwriter/data/tdf112109.fodt | 170 + sw/qa/extras/uiwriter/data/tdf112160.fodt | 125 + sw/qa/extras/uiwriter/data/tdf112342.docx | Bin 0 -> 19601 bytes sw/qa/extras/uiwriter/data/tdf112448.odt | Bin 0 -> 10574 bytes sw/qa/extras/uiwriter/data/tdf112741.fodt | 405 ++ sw/qa/extras/uiwriter/data/tdf112860.fodt | 1394 +++++++ sw/qa/extras/uiwriter/data/tdf113153.fodt | 677 ++++ sw/qa/extras/uiwriter/data/tdf113287.fodt | 291 ++ sw/qa/extras/uiwriter/data/tdf113445.fodt | 348 ++ sw/qa/extras/uiwriter/data/tdf113481-IVS.odt | Bin 0 -> 9571 bytes sw/qa/extras/uiwriter/data/tdf113520.fodt | 292 ++ sw/qa/extras/uiwriter/data/tdf113686.fodt | 278 ++ sw/qa/extras/uiwriter/data/tdf113790.docx | Bin 0 -> 5155 bytes .../uiwriter/data/tdf113877_blank_bold_off.odt | Bin 0 -> 8742 bytes .../uiwriter/data/tdf113877_blank_bold_on.odt | Bin 0 -> 9349 bytes .../uiwriter/data/tdf113877_blank_ownStandard.odt | Bin 0 -> 8886 bytes .../data/tdf113877_insert_numbered_list.odt | Bin 0 -> 7617 bytes .../data/tdf113877_insert_numbered_list_abcd.odt | Bin 0 -> 8518 bytes sw/qa/extras/uiwriter/data/tdf114536.odt | Bin 0 -> 13623 bytes sw/qa/extras/uiwriter/data/tdf114773.odt | Bin 0 -> 22545 bytes sw/qa/extras/uiwriter/data/tdf114973.fodt | 144 + sw/qa/extras/uiwriter/data/tdf115065.odt | Bin 0 -> 9972 bytes sw/qa/extras/uiwriter/data/tdf115815.odt | Bin 0 -> 9809 bytes .../uiwriter/data/tdf116403-considerborders.odt | Bin 0 -> 9284 bytes sw/qa/extras/uiwriter/data/tdf116789.fodt | 27 + sw/qa/extras/uiwriter/data/tdf117225.odt | Bin 0 -> 11015 bytes sw/qa/extras/uiwriter/data/tdf117923.docx | Bin 0 -> 21227 bytes sw/qa/extras/uiwriter/data/tdf118311.fodt | 19 + sw/qa/extras/uiwriter/data/tdf118699.docx | Bin 0 -> 21417 bytes sw/qa/extras/uiwriter/data/tdf119019.docx | Bin 0 -> 13665 bytes sw/qa/extras/uiwriter/data/tdf120336.docx | Bin 0 -> 21892 bytes sw/qa/extras/uiwriter/data/tdf120338.docx | Bin 0 -> 14898 bytes sw/qa/extras/uiwriter/data/tdf121546.odt | Bin 0 -> 10044 bytes sw/qa/extras/uiwriter/data/tdf122942.odt | Bin 0 -> 9864 bytes sw/qa/extras/uiwriter/data/tdf123102.odt | Bin 0 -> 13674 bytes sw/qa/extras/uiwriter/data/tdf123285.odt | Bin 0 -> 11762 bytes sw/qa/extras/uiwriter/data/tdf123786.fodt | 14 + sw/qa/extras/uiwriter/data/tdf124397.docx | Bin 0 -> 29518 bytes sw/qa/extras/uiwriter/data/tdf124722.rtf | 873 +++++ sw/qa/extras/uiwriter/data/tdf124904.fodt | 40 + .../extras/uiwriter/data/tdf125151_protected.fodt | 11 + .../extras/uiwriter/data/tdf125151_protectedB.fodt | 14 + sw/qa/extras/uiwriter/data/tdf125154.odt | Bin 0 -> 10210 bytes sw/qa/extras/uiwriter/data/tdf125261.odt | Bin 0 -> 8900 bytes sw/qa/extras/uiwriter/data/tdf125310.fodt | 23 + sw/qa/extras/uiwriter/data/tdf125310b.fodt | 24 + sw/qa/extras/uiwriter/data/tdf125881.docx | Bin 0 -> 34448 bytes sw/qa/extras/uiwriter/data/tdf125916.docx | Bin 0 -> 40570 bytes sw/qa/extras/uiwriter/data/tdf126206.docx | Bin 0 -> 12509 bytes sw/qa/extras/uiwriter/data/tdf126340.odt | Bin 0 -> 9910 bytes sw/qa/extras/uiwriter/data/tdf126504.odt | Bin 0 -> 9266 bytes sw/qa/extras/uiwriter/data/tdf126626.docx | Bin 0 -> 16513 bytes .../data/tdf126784_distributeSelectedColumns.odt | Bin 0 -> 21302 bytes sw/qa/extras/uiwriter/data/tdf127652.odt | Bin 0 -> 26963 bytes sw/qa/extras/uiwriter/data/tdf128335.odt | Bin 0 -> 10391 bytes sw/qa/extras/uiwriter/data/tdf128375.docx | Bin 0 -> 6296 bytes sw/qa/extras/uiwriter/data/tdf128603.odt | Bin 0 -> 10391 bytes sw/qa/extras/uiwriter/data/tdf128739.docx | Bin 0 -> 4375 bytes sw/qa/extras/uiwriter/data/tdf128782.odt | Bin 0 -> 8817 bytes sw/qa/extras/uiwriter/data/tdf128860.fodt | 14 + sw/qa/extras/uiwriter/data/tdf129270.odt | Bin 0 -> 9301 bytes sw/qa/extras/uiwriter/data/tdf129382.docx | Bin 0 -> 112383 bytes sw/qa/extras/uiwriter/data/tdf129655-vtextbox.odt | Bin 0 -> 9958 bytes sw/qa/extras/uiwriter/data/tdf129805.docx | Bin 0 -> 20783 bytes sw/qa/extras/uiwriter/data/tdf130088.docx | Bin 0 -> 16961 bytes sw/qa/extras/uiwriter/data/tdf130094.fodt | 177 + sw/qa/extras/uiwriter/data/tdf130680.odt | Bin 0 -> 97412 bytes sw/qa/extras/uiwriter/data/tdf130685.odt | Bin 0 -> 24714 bytes sw/qa/extras/uiwriter/data/tdf130746.odt | Bin 0 -> 9378 bytes sw/qa/extras/uiwriter/data/tdf130805.odt | Bin 0 -> 9392 bytes sw/qa/extras/uiwriter/data/tdf131684.docx | Bin 0 -> 6506 bytes sw/qa/extras/uiwriter/data/tdf131963.docx | Bin 0 -> 34251 bytes sw/qa/extras/uiwriter/data/tdf132160.odt | Bin 0 -> 9501 bytes sw/qa/extras/uiwriter/data/tdf132187.odt | Bin 0 -> 10580 bytes sw/qa/extras/uiwriter/data/tdf132236.odt | Bin 0 -> 10140 bytes sw/qa/extras/uiwriter/data/tdf132321.odt | Bin 0 -> 9045 bytes sw/qa/extras/uiwriter/data/tdf132420.odt | Bin 0 -> 11766 bytes sw/qa/extras/uiwriter/data/tdf132596.docx | Bin 0 -> 11062 bytes sw/qa/extras/uiwriter/data/tdf132597.odt | Bin 0 -> 132875 bytes .../data/tdf132637_protectTrackChanges.doc | Bin 0 -> 26624 bytes sw/qa/extras/uiwriter/data/tdf132725.odt | Bin 0 -> 73108 bytes sw/qa/extras/uiwriter/data/tdf132744.odt | Bin 0 -> 13424 bytes sw/qa/extras/uiwriter/data/tdf132911.odt | Bin 0 -> 10980 bytes sw/qa/extras/uiwriter/data/tdf132944.odt | Bin 0 -> 9682 bytes sw/qa/extras/uiwriter/data/tdf133477.fodt | 21 + sw/qa/extras/uiwriter/data/tdf133490.odt | Bin 0 -> 9606 bytes sw/qa/extras/uiwriter/data/tdf133524.fodt | 14 + sw/qa/extras/uiwriter/data/tdf133524_ro.fodt | 14 + sw/qa/extras/uiwriter/data/tdf133589.fodt | 19 + sw/qa/extras/uiwriter/data/tdf133967.odt | Bin 0 -> 16689 bytes sw/qa/extras/uiwriter/data/tdf133982.docx | Bin 0 -> 11705 bytes sw/qa/extras/uiwriter/data/tdf133990.odt | Bin 0 -> 17859 bytes sw/qa/extras/uiwriter/data/tdf134021.docx | Bin 0 -> 23096 bytes sw/qa/extras/uiwriter/data/tdf134227.docx | Bin 0 -> 19455 bytes sw/qa/extras/uiwriter/data/tdf134250.fodt | 86 + sw/qa/extras/uiwriter/data/tdf134252.fodt | 95 + sw/qa/extras/uiwriter/data/tdf134253.odt | Bin 0 -> 46144 bytes sw/qa/extras/uiwriter/data/tdf134404.odt | Bin 0 -> 9928 bytes sw/qa/extras/uiwriter/data/tdf134436.fodt | 83 + sw/qa/extras/uiwriter/data/tdf134626.odt | Bin 0 -> 9136 bytes sw/qa/extras/uiwriter/data/tdf134931.odt | Bin 0 -> 9962 bytes sw/qa/extras/uiwriter/data/tdf134965.odt | Bin 0 -> 45482 bytes sw/qa/extras/uiwriter/data/tdf135056.odt | Bin 0 -> 19293 bytes sw/qa/extras/uiwriter/data/tdf135061.odt | Bin 0 -> 10767 bytes sw/qa/extras/uiwriter/data/tdf135412.docx | Bin 0 -> 22923 bytes sw/qa/extras/uiwriter/data/tdf135581.odt | Bin 0 -> 62181 bytes sw/qa/extras/uiwriter/data/tdf135623.docx | Bin 0 -> 25768 bytes sw/qa/extras/uiwriter/data/tdf135661.odt | Bin 0 -> 10800 bytes sw/qa/extras/uiwriter/data/tdf135662.odt | Bin 0 -> 13627 bytes sw/qa/extras/uiwriter/data/tdf135733.odt | Bin 0 -> 11211 bytes sw/qa/extras/uiwriter/data/tdf136385.odt | Bin 0 -> 8759 bytes sw/qa/extras/uiwriter/data/tdf136452.fodt | 80 + sw/qa/extras/uiwriter/data/tdf136453.fodt | 66 + sw/qa/extras/uiwriter/data/tdf136715.odt | Bin 0 -> 11499 bytes sw/qa/extras/uiwriter/data/tdf136778.docx | Bin 0 -> 11761 bytes sw/qa/extras/uiwriter/data/tdf137964.odt | Bin 0 -> 9332 bytes sw/qa/extras/uiwriter/data/tdf138130.docx | Bin 0 -> 8977 bytes sw/qa/extras/uiwriter/data/tdf138482.docx | Bin 0 -> 18955 bytes sw/qa/extras/uiwriter/data/tdf139127.fodt | 45 + sw/qa/extras/uiwriter/data/tdf139638.odt | Bin 0 -> 14273 bytes sw/qa/extras/uiwriter/data/tdf139737.fodt | 306 ++ sw/qa/extras/uiwriter/data/tdf139843.odt | Bin 0 -> 38984 bytes sw/qa/extras/uiwriter/data/tdf140828.docx | Bin 0 -> 5393 bytes sw/qa/extras/uiwriter/data/tdf140975.docx | Bin 0 -> 5124 bytes sw/qa/extras/uiwriter/data/tdf141175.odt | Bin 0 -> 9574 bytes sw/qa/extras/uiwriter/data/tdf142130.fodt | 37 + sw/qa/extras/uiwriter/data/tdf142157.odt | Bin 0 -> 10242 bytes sw/qa/extras/uiwriter/data/tdf142196.fodt | 30 + sw/qa/extras/uiwriter/data/tdf142700.fodt | 40 + sw/qa/extras/uiwriter/data/tdf142715.odt | Bin 0 -> 11275 bytes sw/qa/extras/uiwriter/data/tdf143176.fodt | 20 + sw/qa/extras/uiwriter/data/tdf143244.odt | Bin 0 -> 9831 bytes sw/qa/extras/uiwriter/data/tdf143574.odt | Bin 0 -> 10275 bytes .../uiwriter/data/tdf143760_ContourToWrapOff.docx | Bin 0 -> 19612 bytes sw/qa/extras/uiwriter/data/tdf143904.odt | Bin 0 -> 9763 bytes sw/qa/extras/uiwriter/data/tdf144058.fodt | 134 + sw/qa/extras/uiwriter/data/tdf144317.odt | Bin 0 -> 15696 bytes sw/qa/extras/uiwriter/data/tdf144748.fodt | 82 + sw/qa/extras/uiwriter/data/tdf144840.odt | Bin 0 -> 9334 bytes sw/qa/extras/uiwriter/data/tdf145091.docx | Bin 0 -> 4753 bytes sw/qa/extras/uiwriter/data/tdf145207.odt | Bin 0 -> 14033 bytes sw/qa/extras/uiwriter/data/tdf145311.fodt | 39 + sw/qa/extras/uiwriter/data/tdf145321.odt | Bin 0 -> 28467 bytes sw/qa/extras/uiwriter/data/tdf145621.odt | Bin 0 -> 9238 bytes sw/qa/extras/uiwriter/data/tdf145731.odt | Bin 0 -> 11459 bytes sw/qa/extras/uiwriter/data/tdf146248.docx | Bin 0 -> 11387 bytes sw/qa/extras/uiwriter/data/tdf146449.odt | Bin 0 -> 21250 bytes sw/qa/extras/uiwriter/data/tdf147006.rtf | 24 + sw/qa/extras/uiwriter/data/tdf147126.docx | Bin 0 -> 39793 bytes sw/qa/extras/uiwriter/data/tdf147180.fodt | 48 + sw/qa/extras/uiwriter/data/tdf147199.docx | Bin 0 -> 23874 bytes sw/qa/extras/uiwriter/data/tdf147507.fodt | 77 + sw/qa/extras/uiwriter/data/tdf147723.docx | Bin 0 -> 22072 bytes sw/qa/extras/uiwriter/data/tdf147938.fodt | 160 + sw/qa/extras/uiwriter/data/tdf148799.docx | Bin 0 -> 21690 bytes sw/qa/extras/uiwriter/data/tdf148849.fodt | 53 + sw/qa/extras/uiwriter/data/tdf148868.odt | Bin 0 -> 11112 bytes sw/qa/extras/uiwriter/data/tdf149089.odt | Bin 0 -> 90383 bytes sw/qa/extras/uiwriter/data/tdf149498.docx | Bin 0 -> 13409 bytes sw/qa/extras/uiwriter/data/tdf149507.docx | Bin 0 -> 12024 bytes sw/qa/extras/uiwriter/data/tdf149550.docx | Bin 0 -> 29727 bytes sw/qa/extras/uiwriter/data/tdf150824.fodt | 48 + sw/qa/extras/uiwriter/data/tdf151462.odt | Bin 0 -> 18264 bytes .../uiwriter/data/tdf151548_tabNavigation.docm | Bin 0 -> 13417 bytes .../uiwriter/data/tdf151548_tabNavigation2.docx | Bin 0 -> 8426 bytes sw/qa/extras/uiwriter/data/tdf151605.odt | Bin 0 -> 10250 bytes sw/qa/extras/uiwriter/data/tdf151801.fodt | 260 ++ sw/qa/extras/uiwriter/data/tdf151974.odt | Bin 0 -> 10556 bytes sw/qa/extras/uiwriter/data/tdf151993.docx | Bin 0 -> 11913 bytes sw/qa/extras/uiwriter/data/tdf153819.fodt | 174 + sw/qa/extras/uiwriter/data/tdf155028.odt | Bin 0 -> 14075 bytes sw/qa/extras/uiwriter/data/tdf155685.docx | Bin 0 -> 31219 bytes sw/qa/extras/uiwriter/data/tdf156560.docx | Bin 0 -> 34481 bytes sw/qa/extras/uiwriter/data/tdf157131.docx | Bin 0 -> 60272 bytes sw/qa/extras/uiwriter/data/tdf157132.odt | Bin 0 -> 12449 bytes .../data/tdf157662_redlineNestedInsertDelete.odt | Bin 0 -> 11787 bytes .../extras/uiwriter/data/tdf157663_redlineMove.odt | Bin 0 -> 18978 bytes .../tdf158459_tracked_changes_across_nodes.fodt | 45 + sw/qa/extras/uiwriter/data/tdf158703.fodt | 14 + .../extras/uiwriter/data/tdf158785_hyperlink.fodt | 10 + sw/qa/extras/uiwriter/data/tdf159026.docx | Bin 0 -> 16907 bytes sw/qa/extras/uiwriter/data/tdf34957.odt | Bin 0 -> 19449 bytes .../uiwriter/data/tdf35021_tabOverMarginDemo.doc | Bin 0 -> 11264 bytes sw/qa/extras/uiwriter/data/tdf38394.fodt | 52 + sw/qa/extras/uiwriter/data/tdf39721.fodt | 42 + sw/qa/extras/uiwriter/data/tdf39828.fodt | 57 + sw/qa/extras/uiwriter/data/tdf40142.odt | Bin 0 -> 9910 bytes sw/qa/extras/uiwriter/data/tdf45525.odt | Bin 0 -> 11985 bytes .../uiwriter/data/tdf47471_paraStyleBackground.odt | Bin 0 -> 13816 bytes sw/qa/extras/uiwriter/data/tdf50447.fodt | 26 + sw/qa/extras/uiwriter/data/tdf52391.fodt | 54 + sw/qa/extras/uiwriter/data/tdf54819.fodt | 9 + sw/qa/extras/uiwriter/data/tdf54819b.odt | Bin 0 -> 17538 bytes sw/qa/extras/uiwriter/data/tdf58604.odt | Bin 0 -> 9780 bytes sw/qa/extras/uiwriter/data/tdf61154.fodt | 132 + .../extras/uiwriter/data/tdf62032_apply_style.odt | Bin 0 -> 10951 bytes .../uiwriter/data/tdf64242_optimizeTable.odt | Bin 0 -> 12365 bytes sw/qa/extras/uiwriter/data/tdf65535.fodt | 14 + sw/qa/extras/uiwriter/data/tdf66405.docx | Bin 0 -> 13857 bytes sw/qa/extras/uiwriter/data/tdf76636.doc | Bin 0 -> 13824 bytes sw/qa/extras/uiwriter/data/tdf76817.docx | Bin 0 -> 18584 bytes sw/qa/extras/uiwriter/data/tdf76817.fodt | 77 + sw/qa/extras/uiwriter/data/tdf77014.odt | Bin 0 -> 8161 bytes sw/qa/extras/uiwriter/data/tdf78727.docx | Bin 0 -> 15004 bytes sw/qa/extras/uiwriter/data/tdf83260-1.odt | Bin 0 -> 9422 bytes sw/qa/extras/uiwriter/data/tdf83798.odt | Bin 0 -> 9423 bytes sw/qa/extras/uiwriter/data/tdf84695-tab.odt | Bin 0 -> 9833 bytes sw/qa/extras/uiwriter/data/tdf84695.odt | Bin 0 -> 9769 bytes sw/qa/extras/uiwriter/data/tdf86639.rtf | 3 + sw/qa/extras/uiwriter/data/tdf87922.odt | Bin 0 -> 8866 bytes sw/qa/extras/uiwriter/data/tdf88453-table.odt | Bin 0 -> 27182 bytes sw/qa/extras/uiwriter/data/tdf88453.odt | Bin 0 -> 21235 bytes sw/qa/extras/uiwriter/data/tdf89720.odt | Bin 0 -> 11283 bytes sw/qa/extras/uiwriter/data/tdf89954.odt | Bin 0 -> 10022 bytes sw/qa/extras/uiwriter/data/tdf90003.odt | Bin 0 -> 8515 bytes sw/qa/extras/uiwriter/data/tdf90069.docx | Bin 0 -> 4737 bytes sw/qa/extras/uiwriter/data/tdf90362.fodt | 12 + sw/qa/extras/uiwriter/data/tdf90883.odt | Bin 0 -> 8759 bytes .../uiwriter/data/tdf91292_paraBackground.docx | Bin 0 -> 4262 bytes sw/qa/extras/uiwriter/data/tdf91801.fodt | 21 + sw/qa/extras/uiwriter/data/tdf92648.docx | Bin 0 -> 70406 bytes sw/qa/extras/uiwriter/data/tdf95699.odt | Bin 0 -> 8925 bytes sw/qa/extras/uiwriter/data/tdf96943.odt | Bin 0 -> 8797 bytes sw/qa/extras/uiwriter/data/tdf97601.odt | Bin 0 -> 14942 bytes sw/qa/extras/uiwriter/data/tdf98987.docx | Bin 0 -> 19509 bytes sw/qa/extras/uiwriter/data/tdf99004.docx | Bin 0 -> 18435 bytes sw/qa/extras/uiwriter/data/tdf99689.odt | Bin 0 -> 15771 bytes sw/qa/extras/uiwriter/data/tdf99689_figures.odt | Bin 0 -> 466344 bytes sw/qa/extras/uiwriter/data/tdf99689_tables.odt | Bin 0 -> 11267 bytes sw/qa/extras/uiwriter/data/testFontEmbedding.odt | Bin 0 -> 8830 bytes .../uiwriter/data/testInconsistentBookmark.ott | Bin 0 -> 10488 bytes sw/qa/extras/uiwriter/data/testTdf106663.odt | Bin 0 -> 14223 bytes .../uiwriter/data/test_anchor_as_character.odt | Bin 0 -> 10284 bytes .../data/textfield-getanchor-gettext-in-footer.odt | Bin 0 -> 8966 bytes sw/qa/extras/uiwriter/data/threadedException.fodt | 530 +++ sw/qa/extras/uiwriter/data/try2.fodt | 66 + sw/qa/extras/uiwriter/data/txbx_crash.odt | Bin 0 -> 9369 bytes sw/qa/extras/uiwriter/data/udindex3.odt | Bin 0 -> 11068 bytes .../uiwriter/data/unfloatable_floating_table.odt | Bin 0 -> 9331 bytes sw/qa/extras/uiwriter/data/unicodeAltX.odt | Bin 0 -> 19978 bytes sw/qa/extras/uiwriter/data/uno-cycle.odt | Bin 0 -> 9118 bytes .../variable-field-table-row-split-header.fodt | 270 ++ sw/qa/extras/uiwriter/data/watermark-position.odt | Bin 0 -> 8769 bytes sw/qa/extras/uiwriter/data/watermark.docx | Bin 0 -> 18768 bytes sw/qa/extras/uiwriter/uiwriter.cxx | 2032 ++++++++++ sw/qa/extras/uiwriter/uiwriter2.cxx | 3291 ++++++++++++++++ sw/qa/extras/uiwriter/uiwriter3.cxx | 2484 ++++++++++++ sw/qa/extras/uiwriter/uiwriter4.cxx | 2582 ++++++++++++ sw/qa/extras/uiwriter/uiwriter5.cxx | 4134 ++++++++++++++++++++ sw/qa/extras/uiwriter/uiwriter6.cxx | 3037 ++++++++++++++ sw/qa/extras/uiwriter/uiwriter7.cxx | 2801 +++++++++++++ sw/qa/extras/uiwriter/uiwriter8.cxx | 2922 ++++++++++++++ sw/qa/extras/uiwriter/uiwriter9.cxx | 74 + sw/qa/extras/unowriter/data/bookmarkintable.fodt | 82 + .../unowriter/data/image-comment-at-char.odt | Bin 0 -> 10244 bytes .../unowriter/data/renderable-page-position.odt | Bin 0 -> 8465 bytes .../unowriter/data/selection-in-table-enum.odt | Bin 0 -> 8941 bytes .../extras/unowriter/data/table-line-spacing.docx | Bin 0 -> 11383 bytes sw/qa/extras/unowriter/data/tdf134250.fodt | 86 + sw/qa/extras/unowriter/data/tdf134252.fodt | 95 + .../data/tdf134252_onlytable_protected.fodt | 87 + sw/qa/extras/unowriter/data/test.jpg | Bin 0 -> 1136 bytes .../unowriter/data/view-cursor-page-style.fodt | 23 + sw/qa/extras/unowriter/data/xautotextgroup.odt | Bin 0 -> 11151 bytes sw/qa/extras/unowriter/unowriter.cxx | 1206 ++++++ sw/qa/extras/ww8export/data/all_gaps_word.doc | Bin 0 -> 32256 bytes .../ww8export/data/arabic-zero-numbering.doc | Bin 0 -> 10752 bytes sw/qa/extras/ww8export/data/bnc636128.doc | Bin 0 -> 26112 bytes sw/qa/extras/ww8export/data/bnc787942.doc | Bin 0 -> 24064 bytes sw/qa/extras/ww8export/data/bnc821208.doc | Bin 0 -> 30208 bytes sw/qa/extras/ww8export/data/bnc863018b.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8export/data/bordercolours.doc | Bin 0 -> 29696 bytes sw/qa/extras/ww8export/data/bordercolours.odt | Bin 0 -> 24601 bytes sw/qa/extras/ww8export/data/btlr-cell.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8export/data/btlr-frame.odt | Bin 0 -> 8564 bytes sw/qa/extras/ww8export/data/cell-bg-color.odt | Bin 0 -> 10180 bytes sw/qa/extras/ww8export/data/charborder.odt | Bin 0 -> 8053 bytes sw/qa/extras/ww8export/data/checkbox_control.odt | Bin 0 -> 9601 bytes sw/qa/extras/ww8export/data/cjklist30.doc | Bin 0 -> 27648 bytes sw/qa/extras/ww8export/data/cjklist31.doc | Bin 0 -> 27648 bytes sw/qa/extras/ww8export/data/cjklist34.doc | Bin 0 -> 27648 bytes sw/qa/extras/ww8export/data/cjklist35.doc | Bin 0 -> 23552 bytes sw/qa/extras/ww8export/data/clearing-break.doc | Bin 0 -> 25600 bytes sw/qa/extras/ww8export/data/comment-export.odt | Bin 0 -> 9709 bytes sw/qa/extras/ww8export/data/commented-table.doc | Bin 0 -> 27136 bytes sw/qa/extras/ww8export/data/comments-nested.doc | Bin 0 -> 23552 bytes .../extras/ww8export/data/continuous-sections.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8export/data/cp1000044.doc | Bin 0 -> 26112 bytes sw/qa/extras/ww8export/data/fdo36868.doc | Bin 0 -> 23552 bytes sw/qa/extras/ww8export/data/fdo42144.odt | Bin 0 -> 9425 bytes sw/qa/extras/ww8export/data/fdo45724.odt | Bin 0 -> 13499 bytes sw/qa/extras/ww8export/data/fdo46020.odt | Bin 0 -> 12611 bytes sw/qa/extras/ww8export/data/fdo53985.doc | Bin 0 -> 39936 bytes sw/qa/extras/ww8export/data/fdo56513.doc | Bin 0 -> 23040 bytes sw/qa/extras/ww8export/data/fdo59530.doc | Bin 0 -> 10240 bytes sw/qa/extras/ww8export/data/fdo66304-1.odt | Bin 0 -> 54780 bytes sw/qa/extras/ww8export/data/fdo68963.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/fdo68967.doc | Bin 0 -> 99328 bytes sw/qa/extras/ww8export/data/fdo77454.doc | Bin 0 -> 11776 bytes sw/qa/extras/ww8export/data/fdo77844.doc | Bin 0 -> 28672 bytes sw/qa/extras/ww8export/data/fdo80333.doc | Bin 0 -> 24064 bytes sw/qa/extras/ww8export/data/fdo81102.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/gutter-left.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/gutter-top.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/i120158.doc | Bin 0 -> 23040 bytes .../ww8export/data/image-comment-at-char.doc | Bin 0 -> 24064 bytes .../ww8export/data/inlinePageBreakFirstLine.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8export/data/list-nolevel.doc | Bin 0 -> 23040 bytes sw/qa/extras/ww8export/data/mailmerge.doc | Bin 0 -> 23040 bytes .../ww8export/data/msobrightnesscontrast.doc | Bin 0 -> 27648 bytes sw/qa/extras/ww8export/data/n325936.doc | Bin 0 -> 24576 bytes sw/qa/extras/ww8export/data/n652364.doc | Bin 0 -> 22016 bytes sw/qa/extras/ww8export/data/n750255.doc | Bin 0 -> 22016 bytes sw/qa/extras/ww8export/data/n757118.doc | Bin 0 -> 35840 bytes sw/qa/extras/ww8export/data/n757905.doc | Bin 0 -> 28160 bytes sw/qa/extras/ww8export/data/n757910.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/n760294.doc | Bin 0 -> 26112 bytes sw/qa/extras/ww8export/data/n816603.doc | Bin 0 -> 67072 bytes sw/qa/extras/ww8export/data/n823651.doc | Bin 0 -> 30720 bytes sw/qa/extras/ww8export/data/new-page-styles.doc | Bin 0 -> 38912 bytes .../ww8export/data/nonInlinePageBreakFirstLine.doc | Bin 0 -> 26624 bytes .../ww8export/data/object_cross_reference.odt | Bin 0 -> 41876 bytes sw/qa/extras/ww8export/data/ooo92948-1.doc | Bin 0 -> 43008 bytes sw/qa/extras/ww8export/data/page-border.doc | Bin 0 -> 22016 bytes sw/qa/extras/ww8export/data/redline-export-1.odt | Bin 0 -> 12833 bytes sw/qa/extras/ww8export/data/redline-export-2.odt | Bin 0 -> 10363 bytes sw/qa/extras/ww8export/data/redline-export-3.odt | Bin 0 -> 10403 bytes sw/qa/extras/ww8export/data/rtl-gutter.doc | Bin 0 -> 22528 bytes .../extras/ww8export/data/shapes-line-ellipse.doc | Bin 0 -> 40448 bytes .../ww8export/data/table_cross_reference.odt | Bin 0 -> 10251 bytes .../data/table_cross_reference_custom_format.odt | Bin 0 -> 12087 bytes .../ww8export/data/tdf100961_fixedDateTime.doc | Bin 0 -> 19968 bytes .../ww8export/data/tdf101826_xattrTextBoxFill.doc | Bin 0 -> 55296 bytes sw/qa/extras/ww8export/data/tdf102334.doc | Bin 0 -> 28672 bytes .../data/tdf104239_chapterNumberTortureTest.doc | Bin 0 -> 24064 bytes .../ww8export/data/tdf104239_chapterNumbering.doc | Bin 0 -> 10240 bytes .../data/tdf104239_chapterNumberingLevels.doc | Bin 0 -> 30720 bytes .../extras/ww8export/data/tdf104239_numbering.doc | Bin 0 -> 52224 bytes .../data/tdf104239_sharedOutlineNumId.doc | Bin 0 -> 33280 bytes sw/qa/extras/ww8export/data/tdf104334.doc | Bin 0 -> 25600 bytes .../ww8export/data/tdf104596_wrapInHeaderTable.doc | Bin 0 -> 29184 bytes .../ww8export/data/tdf104704_mangledFooter.odt | Bin 0 -> 14722 bytes sw/qa/extras/ww8export/data/tdf104805.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/tdf105570.doc | Bin 0 -> 29696 bytes .../data/tdf106062_nonHangingFootnote.odt | Bin 0 -> 14255 bytes .../ww8export/data/tdf106174_rtlParaAlign.docx | Bin 0 -> 5266 bytes sw/qa/extras/ww8export/data/tdf106291.doc | Bin 0 -> 24064 bytes .../ww8export/data/tdf106541_cancelOutline.doc | Bin 0 -> 26624 bytes .../data/tdf106541_inheritChapterNumbering.doc | Bin 0 -> 33280 bytes .../data/tdf106541_inheritChapterNumberingB.doc | Bin 0 -> 47104 bytes .../data/tdf106541_inheritOutlineNumbering.doc | Bin 0 -> 40448 bytes sw/qa/extras/ww8export/data/tdf107773.doc | Bin 0 -> 29184 bytes sw/qa/extras/ww8export/data/tdf108072.doc | Bin 0 -> 28672 bytes sw/qa/extras/ww8export/data/tdf108448_endNote.odt | Bin 0 -> 10911 bytes .../ww8export/data/tdf108518_CRnumformatting.doc | Bin 0 -> 63488 bytes sw/qa/extras/ww8export/data/tdf111480.doc | Bin 0 -> 27648 bytes .../data/tdf112074_RTLtableJustification.doc | Bin 0 -> 24576 bytes sw/qa/extras/ww8export/data/tdf112118.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8export/data/tdf112346.doc | Bin 0 -> 27648 bytes sw/qa/extras/ww8export/data/tdf112517_maxSprms.doc | Bin 0 -> 49152 bytes sw/qa/extras/ww8export/data/tdf112535.doc | Bin 0 -> 19968 bytes .../ww8export/data/tdf112618_textbox_no_bg.doc | Bin 0 -> 27136 bytes sw/qa/extras/ww8export/data/tdf114308.doc | Bin 0 -> 27136 bytes .../ww8export/data/tdf115896_layoutInCell.doc | Bin 0 -> 31232 bytes sw/qa/extras/ww8export/data/tdf116194.doc | Bin 0 -> 12288 bytes .../ww8export/data/tdf116436_tableBackground.odt | Bin 0 -> 10745 bytes .../ww8export/data/tdf116570_exportFootnote.odt | Bin 0 -> 16416 bytes .../data/tdf117217_largeTableBackgrounds.odt | Bin 0 -> 10988 bytes sw/qa/extras/ww8export/data/tdf117503.docx | Bin 0 -> 23567 bytes sw/qa/extras/ww8export/data/tdf117885.doc | Bin 0 -> 50688 bytes .../ww8export/data/tdf117994_CRnumformatting.doc | Bin 0 -> 24064 bytes sw/qa/extras/ww8export/data/tdf118133.docx | Bin 0 -> 23359 bytes .../ww8export/data/tdf118375_240degClockwise.doc | Bin 0 -> 19456 bytes sw/qa/extras/ww8export/data/tdf118412.doc | Bin 0 -> 51200 bytes sw/qa/extras/ww8export/data/tdf118564.doc | Bin 0 -> 28160 bytes .../ww8export/data/tdf119232_startEvenPage.doc | Bin 0 -> 30720 bytes sw/qa/extras/ww8export/data/tdf120003.doc | Bin 0 -> 10752 bytes .../data/tdf120225_textControlCrossRef.doc | Bin 0 -> 27136 bytes sw/qa/extras/ww8export/data/tdf120394.doc | Bin 0 -> 30208 bytes .../data/tdf120412_proportionalEscapement.odt | Bin 0 -> 11092 bytes sw/qa/extras/ww8export/data/tdf120711.doc | Bin 0 -> 25600 bytes .../extras/ww8export/data/tdf121110_absJustify.doc | Bin 0 -> 19456 bytes .../ww8export/data/tdf121111_fillStyleNone.docx | Bin 0 -> 53968 bytes sw/qa/extras/ww8export/data/tdf122425_2.doc | Bin 0 -> 41472 bytes sw/qa/extras/ww8export/data/tdf122429_header.doc | Bin 0 -> 122368 bytes sw/qa/extras/ww8export/data/tdf122460_header.odt | Bin 0 -> 9753 bytes .../ww8export/data/tdf123433_fillStyleStop.doc | Bin 0 -> 33792 bytes sw/qa/extras/ww8export/data/tdf124937.doc | Bin 0 -> 33280 bytes .../ww8export/data/tdf126708_containsemf.odt | Bin 0 -> 13315 bytes .../ww8export/data/tdf127166_prstDash_Word97.doc | Bin 0 -> 26624 bytes .../ww8export/data/tdf127316_autoEscapement.odt | Bin 0 -> 11475 bytes .../ww8export/data/tdf127316_autoEscapement2.odt | Bin 0 -> 14195 bytes .../ww8export/data/tdf127862_pageFillStyle.odt | Bin 0 -> 38808 bytes sw/qa/extras/ww8export/data/tdf128501.doc | Bin 0 -> 16587 bytes sw/qa/extras/ww8export/data/tdf128605.doc | Bin 0 -> 22016 bytes .../ww8export/data/tdf128608_fillStyleNoneB.odt | Bin 0 -> 11105 bytes .../data/tdf128608_tableParaBackColor.doc | Bin 0 -> 113152 bytes .../data/tdf128700_relativeTableWidth.doc | Bin 0 -> 67072 bytes sw/qa/extras/ww8export/data/tdf129247.docx | Bin 0 -> 18550 bytes .../ww8export/data/tdf129522_removeShadowStyle.odt | Bin 0 -> 14253 bytes sw/qa/extras/ww8export/data/tdf130262.doc | Bin 0 -> 36864 bytes .../data/tdf132094_transparentPageImage.doc | Bin 0 -> 78336 bytes sw/qa/extras/ww8export/data/tdf132726.odt | Bin 0 -> 41738 bytes .../ww8export/data/tdf133453_realFontSize.doc | Bin 0 -> 10752 bytes .../ww8export/data/tdf133504_wrapNotBeside.doc | Bin 0 -> 22016 bytes sw/qa/extras/ww8export/data/tdf134264.docx | Bin 0 -> 15412 bytes sw/qa/extras/ww8export/data/tdf134570.doc | Bin 0 -> 39936 bytes sw/qa/extras/ww8export/data/tdf134948.odt | Bin 0 -> 10457 bytes .../extras/ww8export/data/tdf135672_tableGrows.doc | Bin 0 -> 10240 bytes sw/qa/extras/ww8export/data/tdf136620.odt | Bin 0 -> 8915 bytes sw/qa/extras/ww8export/data/tdf136814.odt | Bin 0 -> 8249 bytes .../ww8export/data/tdf138302_restartNumbering.odt | Bin 0 -> 14081 bytes .../ww8export/data/tdf138345_paraCharHighlight.doc | Bin 0 -> 10240 bytes .../extras/ww8export/data/tdf139495_tinyHeader.doc | Bin 0 -> 22016 bytes .../ww8export/data/tdf141649_conditionalText.doc | Bin 0 -> 23040 bytes sw/qa/extras/ww8export/data/tdf142760.doc | Bin 0 -> 36864 bytes sw/qa/extras/ww8export/data/tdf142840.odt | Bin 0 -> 10707 bytes .../ww8export/data/tdf147861_customField.doc | Bin 0 -> 19968 bytes .../ww8export/data/tdf148380_createField.doc | Bin 0 -> 10240 bytes .../extras/ww8export/data/tdf148380_fldLocked.doc | Bin 0 -> 20480 bytes .../ww8export/data/tdf150197_anlv2ListFormat.doc | Bin 0 -> 11264 bytes .../ww8export/data/tdf151548_formFieldMacros.doc | Bin 0 -> 43520 bytes .../data/tdf155465_paraAdjustDistribute.doc | Bin 0 -> 9728 bytes .../ww8export/data/tdf36117_verticalAdjustment.doc | Bin 0 -> 27648 bytes .../ww8export/data/tdf36711_inlineFrames.doc | Bin 0 -> 37376 bytes .../data/tdf37153_considerWrapOnObjPos.doc | Bin 0 -> 15872 bytes .../ww8export/data/tdf37778_readonlySection.doc | Bin 0 -> 29696 bytes .../data/tdf38778_properties_in_run_for_field.doc | Bin 0 -> 25600 bytes .../ww8export/data/tdf41542_borderlessPadding.odt | Bin 0 -> 15669 bytes .../ww8export/data/tdf41542_imagePadding.odt | Bin 0 -> 17926 bytes sw/qa/extras/ww8export/data/tdf46441-2.odt | Bin 0 -> 14672 bytes .../data/tdf49102_mergedCellNumbering.doc | Bin 0 -> 17408 bytes .../ww8export/data/tdf55427_footnote2endnote.odt | Bin 0 -> 13291 bytes .../ww8export/data/tdf55528_relativeTableWidth.doc | Bin 0 -> 24576 bytes .../ww8export/data/tdf56321_flipImage_both.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/tdf59896.doc | Bin 0 -> 12288 bytes .../ww8export/data/tdf60378_mergedBorders.doc | Bin 0 -> 45056 bytes sw/qa/extras/ww8export/data/tdf70838.odt | Bin 0 -> 9257 bytes .../ww8export/data/tdf70838b_verticalRotation.odt | Bin 0 -> 11231 bytes .../extras/ww8export/data/tdf73056_cellMargins.doc | Bin 0 -> 25088 bytes sw/qa/extras/ww8export/data/tdf74328.doc | Bin 0 -> 44032 bytes .../ww8export/data/tdf75539_relativeWidth.doc | Bin 0 -> 50176 bytes .../data/tdf75748_inheritChapterNumberingC.doc | Bin 0 -> 25088 bytes .../ww8export/data/tdf76349_textboxMargins.doc | Bin 0 -> 23552 bytes sw/qa/extras/ww8export/data/tdf77964.doc | Bin 0 -> 248320 bytes .../ww8export/data/tdf79186_noLayoutInCell.odt | Bin 0 -> 21127 bytes .../ww8export/data/tdf79435_legacyInputFields.docx | Bin 0 -> 12593 bytes .../extras/ww8export/data/tdf79553_lineNumbers.doc | Bin 0 -> 77312 bytes sw/qa/extras/ww8export/data/tdf79639.doc | Bin 0 -> 27648 bytes .../extras/ww8export/data/tdf80635_marginLeft.doc | Bin 0 -> 47104 bytes .../ww8export/data/tdf80635_marginRightRTL.doc | Bin 0 -> 25088 bytes sw/qa/extras/ww8export/data/tdf80635_pageLeft.doc | Bin 0 -> 36352 bytes .../ww8export/data/tdf80635_pageRightRTL.doc | Bin 0 -> 25088 bytes .../ww8export/data/tdf81705_outlineLevel.doc | Bin 0 -> 29696 bytes .../tdf89377_tableWithBreakBeforeParaStyle.doc | Bin 0 -> 27136 bytes sw/qa/extras/ww8export/data/tdf90408.doc | Bin 0 -> 22016 bytes sw/qa/extras/ww8export/data/tdf90408B.doc | Bin 0 -> 37888 bytes sw/qa/extras/ww8export/data/tdf91083.odt | Bin 0 -> 19865 bytes .../extras/ww8export/data/tdf91083_tableKeep2.odt | Bin 0 -> 15980 bytes .../extras/ww8export/data/tdf91083_tableKeep3.odt | Bin 0 -> 13658 bytes sw/qa/extras/ww8export/data/tdf91687.doc | Bin 0 -> 23552 bytes sw/qa/extras/ww8export/data/tdf92281.doc | Bin 0 -> 26112 bytes .../ww8export/data/tdf94009_zeroPgMargin.odt | Bin 0 -> 11939 bytes .../data/tdf94326_notOutlineNumbering.doc | Bin 0 -> 40960 bytes sw/qa/extras/ww8export/data/tdf94386.odt | Bin 0 -> 8163 bytes sw/qa/extras/ww8export/data/tdf95321.doc | Bin 0 -> 27648 bytes sw/qa/extras/ww8export/data/tdf95576.doc | Bin 0 -> 23040 bytes sw/qa/extras/ww8export/data/tdf96277.doc | Bin 0 -> 48128 bytes .../extras/ww8export/data/tdf98620_rtlJustify.doc | Bin 0 -> 9216 bytes sw/qa/extras/ww8export/data/tdf99100.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/tdf99120.doc | Bin 0 -> 23040 bytes .../extras/ww8export/data/tdf99197_defaultLTR.doc | Bin 0 -> 19968 bytes sw/qa/extras/ww8export/data/tdf99474.odt | Bin 0 -> 9375 bytes ...tTdf107931_KERN_DocEnabled_disabledDefStyle.doc | Bin 0 -> 10240 bytes .../data/testTdf107931_KERN_enabledDefStyle.doc | Bin 0 -> 22528 bytes sw/qa/extras/ww8export/data/transparent-text.doc | Bin 0 -> 33792 bytes sw/qa/extras/ww8export/data/tscp.doc | Bin 0 -> 10240 bytes sw/qa/extras/ww8export/data/zoom.doc | Bin 0 -> 9216 bytes sw/qa/extras/ww8export/data/zoomtype.doc | Bin 0 -> 9216 bytes sw/qa/extras/ww8export/ww8export.cxx | 1567 ++++++++ sw/qa/extras/ww8export/ww8export2.cxx | 1163 ++++++ sw/qa/extras/ww8export/ww8export3.cxx | 1124 ++++++ sw/qa/extras/ww8export/ww8export4.cxx | 263 ++ sw/qa/extras/ww8import/data/bnc875715.doc | Bin 0 -> 41472 bytes .../extras/ww8import/data/changes-in-footnote.doc | Bin 0 -> 13312 bytes .../data/floating-table-section-columns.doc | Bin 0 -> 27648 bytes .../ww8import/data/image-lazy-read-0size.doc | Bin 0 -> 28160 bytes sw/qa/extras/ww8import/data/image-lazy-read.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8import/data/n816593.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8import/data/tdf106799.doc | Bin 0 -> 11264 bytes sw/qa/extras/ww8import/data/tdf110987 | Bin 0 -> 9216 bytes sw/qa/extras/ww8import/data/tdf120761_zOrder.dot | Bin 0 -> 53760 bytes sw/qa/extras/ww8import/data/tdf121734.doc | Bin 0 -> 26624 bytes sw/qa/extras/ww8import/data/tdf122425_1.doc | Bin 0 -> 32256 bytes sw/qa/extras/ww8import/data/tdf124601.doc | Bin 0 -> 63488 bytes sw/qa/extras/ww8import/data/tdf125281.doc | Bin 0 -> 82432 bytes sw/qa/extras/ww8import/ww8import.cxx | 282 ++ 3450 files changed, 150606 insertions(+) create mode 100644 sw/qa/extras/README create mode 100644 sw/qa/extras/accessibility/accessible_relation_set.cxx create mode 100644 sw/qa/extras/accessibility/basics.cxx create mode 100644 sw/qa/extras/accessibility/dialogs.cxx create mode 100644 sw/qa/extras/accessibility/tdf155705.cxx create mode 100644 sw/qa/extras/accessibility/testdocuments/tdf155705.fodt create mode 100644 sw/qa/extras/accessibility/testdocuments/unicode.fodf create mode 100644 sw/qa/extras/accessibility/unicode.cxx create mode 100644 sw/qa/extras/data/odt/test.odt create mode 100644 sw/qa/extras/docbookexport/data/simple.docx create mode 100644 sw/qa/extras/docbookexport/data/tdf91095.docx create mode 100644 sw/qa/extras/docbookexport/docbookexport.cxx create mode 100644 sw/qa/extras/fodfexport/data/SvgImageTest.fodt create mode 100644 sw/qa/extras/fodfexport/data/tdf113696-writerimage.odt create mode 100644 sw/qa/extras/fodfexport/data/tdf113696.odt create mode 100644 sw/qa/extras/fodfexport/fodfexport.cxx create mode 100644 sw/qa/extras/globalfilter/data/BulletAsImage.odt create mode 100644 sw/qa/extras/globalfilter/data/SvgImageTest.odt create mode 100644 sw/qa/extras/globalfilter/data/char_background.odt create mode 100644 sw/qa/extras/globalfilter/data/char_background_editing.docx create mode 100644 sw/qa/extras/globalfilter/data/char_highlight.docx create mode 100644 sw/qa/extras/globalfilter/data/checkbox_form_field.odt create mode 100644 sw/qa/extras/globalfilter/data/date_form_field.odt create mode 100644 sw/qa/extras/globalfilter/data/date_form_field_char_formatting.odt create mode 100644 sw/qa/extras/globalfilter/data/document_with_linked_graphic.odt create mode 100644 sw/qa/extras/globalfilter/data/document_with_two_images.odt create mode 100644 sw/qa/extras/globalfilter/data/dropdown_form_field.odt create mode 100644 sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.docx create mode 100644 sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.fodt create mode 100644 sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.rtf create mode 100644 sw/qa/extras/globalfilter/data/graphic_shape.odt create mode 100644 sw/qa/extras/globalfilter/data/images_with_special_IDs.odt create mode 100644 sw/qa/extras/globalfilter/data/linked_graphic.jpg create mode 100644 sw/qa/extras/globalfilter/data/multiple_identical_graphics.odt create mode 100644 sw/qa/extras/globalfilter/data/skipimages.doc create mode 100644 sw/qa/extras/globalfilter/data/skipimages.docx create mode 100644 sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt create mode 100644 sw/qa/extras/globalfilter/data/tdf143311-1.docx create mode 100644 sw/qa/extras/globalfilter/data/text13e.odt create mode 100644 sw/qa/extras/globalfilter/data/text_form_field.odt create mode 100644 sw/qa/extras/globalfilter/globalfilter.cxx create mode 100644 sw/qa/extras/htmlexport/data/HTMLImage.odt create mode 100644 sw/qa/extras/htmlexport/data/NestingInA1.fodt create mode 100644 sw/qa/extras/htmlexport/data/TableWithIndent.fodt create mode 100644 sw/qa/extras/htmlexport/data/charborder.odt create mode 100644 sw/qa/extras/htmlexport/data/checkbox-radiobutton.doc create mode 100644 sw/qa/extras/htmlexport/data/clearing-break.html create mode 100644 sw/qa/extras/htmlexport/data/embedded_formula.fodt create mode 100644 sw/qa/extras/htmlexport/data/extb.html create mode 100644 sw/qa/extras/htmlexport/data/fdo62336.docx create mode 100644 sw/qa/extras/htmlexport/data/fdo81276.html create mode 100644 sw/qa/extras/htmlexport/data/fdo86857.html create mode 100644 sw/qa/extras/htmlexport/data/field-shade-reqif.odt create mode 100644 sw/qa/extras/htmlexport/data/field-shade.odt create mode 100644 sw/qa/extras/htmlexport/data/frameWithText.fodt create mode 100644 sw/qa/extras/htmlexport/data/hello.html create mode 100644 sw/qa/extras/htmlexport/data/image_anchored_to_paragraph_no_wrap.fodt create mode 100644 sw/qa/extras/htmlexport/data/list.html create mode 100644 sw/qa/extras/htmlexport/data/listItemSubheader.fodt create mode 100644 sw/qa/extras/htmlexport/data/listsWithNumFormat.fodt create mode 100644 sw/qa/extras/htmlexport/data/no-ole2-pres-data.odt create mode 100644 sw/qa/extras/htmlexport/data/ole1-pres-data-wmf.odt create mode 100644 sw/qa/extras/htmlexport/data/ole2.odt create mode 100644 sw/qa/extras/htmlexport/data/ole2.ole create mode 100644 sw/qa/extras/htmlexport/data/ole2.png create mode 100644 sw/qa/extras/htmlexport/data/paint-ole-bitmap-format.odt create mode 100644 sw/qa/extras/htmlexport/data/paint-ole.ole create mode 100644 sw/qa/extras/htmlexport/data/paint-ole.png create mode 100644 sw/qa/extras/htmlexport/data/paint-ole.xhtml create mode 100644 sw/qa/extras/htmlexport/data/pdf-ole.odt create mode 100644 sw/qa/extras/htmlexport/data/reqif-aschar-objsize.odt create mode 100644 sw/qa/extras/htmlexport/data/reqif-chinese.odt create mode 100644 sw/qa/extras/htmlexport/data/reqif-jpg-img.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-list.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-no-lang.odt create mode 100644 sw/qa/extras/htmlexport/data/reqif-objdata-presentationdatasize.odt create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-data.ole create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-data.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-img.jpg create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-img.png create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-img.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-nodata.odt create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-odg.ole create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-odg.png create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole-odg.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-ole2.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-p.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-png-img.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-table.xhtml create mode 100644 sw/qa/extras/htmlexport/data/reqif-table2.odt create mode 100644 sw/qa/extras/htmlexport/data/reqif-transparent-tif-img.odt create mode 100644 sw/qa/extras/htmlexport/data/skipimage-embedded-document.docx create mode 100644 sw/qa/extras/htmlexport/data/skipimage-embedded.doc create mode 100644 sw/qa/extras/htmlexport/data/sub_li_and_ctd.fodt create mode 100644 sw/qa/extras/htmlexport/data/tableRight.fodt create mode 100644 sw/qa/extras/htmlexport/data/table_cell_padding.fodt create mode 100644 sw/qa/extras/htmlexport/data/table_with_wide_horizontal_border.fodt create mode 100644 sw/qa/extras/htmlexport/data/tdf126879.odt create mode 100644 sw/qa/extras/htmlexport/data/tdf132739.odt create mode 100644 sw/qa/extras/htmlexport/data/tdf155871.fodt create mode 100644 sw/qa/extras/htmlexport/data/tdf66822.odt create mode 100644 sw/qa/extras/htmlexport/data/tdf76291.odt create mode 100644 sw/qa/extras/htmlexport/data/tdf83890.odt create mode 100644 sw/qa/extras/htmlexport/data/tdf90905.odt create mode 100644 sw/qa/extras/htmlexport/data/test_no_space_preserve.fodt create mode 100644 sw/qa/extras/htmlexport/data/textAndImage.docx create mode 100644 sw/qa/extras/htmlexport/data/transparent-image.odt create mode 100644 sw/qa/extras/htmlexport/data/transparent.png create mode 100644 sw/qa/extras/htmlexport/data/twoListsWithSameStyle.fodt create mode 100644 sw/qa/extras/htmlexport/data/xhtml-css.odt create mode 100644 sw/qa/extras/htmlexport/htmlexport.cxx create mode 100644 sw/qa/extras/htmlexport/xhtmlexport.cxx create mode 100644 sw/qa/extras/htmlimport/data/PageAndParagraphFilled.html create mode 100644 sw/qa/extras/htmlimport/data/allowed-rtf-ole-mime-types.xhtml create mode 100644 sw/qa/extras/htmlimport/data/data.ole create mode 100644 sw/qa/extras/htmlimport/data/emojis16BE.html create mode 100644 sw/qa/extras/htmlimport/data/green-highlight.html create mode 100644 sw/qa/extras/htmlimport/data/hidden-textframe.html create mode 100644 sw/qa/extras/htmlimport/data/image-lazy-read.html create mode 100644 sw/qa/extras/htmlimport/data/image-size.html create mode 100644 sw/qa/extras/htmlimport/data/image-width-auto.html create mode 100644 sw/qa/extras/htmlimport/data/inlined_image.html create mode 100644 sw/qa/extras/htmlimport/data/libreoffice.jpg create mode 100644 sw/qa/extras/htmlimport/data/list-style.html create mode 100644 sw/qa/extras/htmlimport/data/meta-ISO8601-dates.html create mode 100644 sw/qa/extras/htmlimport/data/meta-changedby.html create mode 100644 sw/qa/extras/htmlimport/data/ole-data.xhtml create mode 100644 sw/qa/extras/htmlimport/data/ole-data2.xhtml create mode 100644 sw/qa/extras/htmlimport/data/ole-img-svg.xhtml create mode 100644 sw/qa/extras/htmlimport/data/ole-img.xhtml create mode 100644 sw/qa/extras/htmlimport/data/ole2.gif create mode 100644 sw/qa/extras/htmlimport/data/ole2.ole create mode 100644 sw/qa/extras/htmlimport/data/ole2.png create mode 100644 sw/qa/extras/htmlimport/data/ole2.svg create mode 100644 sw/qa/extras/htmlimport/data/outline-level.html create mode 100644 sw/qa/extras/htmlimport/data/picture.html create mode 100644 sw/qa/extras/htmlimport/data/reqif-br.xhtml create mode 100644 sw/qa/extras/htmlimport/data/reqif-page-style.xhtml create mode 100644 sw/qa/extras/htmlimport/data/reqif-table.xhtml create mode 100644 sw/qa/extras/htmlimport/data/table_border_1px.html create mode 100644 sw/qa/extras/htmlimport/data/tdf118579.html create mode 100644 sw/qa/extras/htmlimport/data/tdf122789.html create mode 100644 sw/qa/extras/htmlimport/data/tdf142781.html create mode 100644 sw/qa/extras/htmlimport/data/tdf153341.html create mode 100644 sw/qa/extras/htmlimport/data/tdf154273.html create mode 100644 sw/qa/extras/htmlimport/data/tdf155011.html create mode 100644 sw/qa/extras/htmlimport/data/tdf80194_subscript.html create mode 100644 sw/qa/extras/htmlimport/htmlimport.cxx create mode 100644 sw/qa/extras/indexing/IndexingExportTest.cxx create mode 100644 sw/qa/extras/indexing/SearchResultLocatorTest.cxx create mode 100644 sw/qa/extras/indexing/data/IndexingExport_Fontwork.odt create mode 100644 sw/qa/extras/indexing/data/IndexingExport_Header_Footer.odt create mode 100644 sw/qa/extras/indexing/data/IndexingExport_Images.odt create mode 100644 sw/qa/extras/indexing/data/IndexingExport_OLE.odt create mode 100644 sw/qa/extras/indexing/data/IndexingExport_Sections.odt create mode 100644 sw/qa/extras/indexing/data/IndexingExport_Shapes.odt create mode 100644 sw/qa/extras/indexing/data/IndexingExport_Tables.odt create mode 100644 sw/qa/extras/indexing/data/IndexingExport_VariousParagraphs.odt create mode 100644 sw/qa/extras/layout/README create mode 100644 sw/qa/extras/layout/data/Hyphenated-link.fodt create mode 100644 sw/qa/extras/layout/data/Hyphenated-link.rtf create mode 100644 sw/qa/extras/layout/data/LIBREOFFICE-N4LA0OHZ.rtf create mode 100644 sw/qa/extras/layout/data/LIBREOFFICE-UXTSOREL.rtf create mode 100644 sw/qa/extras/layout/data/Tdf121509.odt create mode 100644 sw/qa/extras/layout/data/TextBoxFrame.odt create mode 100644 sw/qa/extras/layout/data/abi11870-2.odt create mode 100644 sw/qa/extras/layout/data/btlr-cell.odt create mode 100644 sw/qa/extras/layout/data/changed_table_rows.fodt create mode 100644 sw/qa/extras/layout/data/endOfLineComments.odt create mode 100644 sw/qa/extras/layout/data/fdo43573-2-min.docx create mode 100644 sw/qa/extras/layout/data/fdo56797-2-min.odt create mode 100644 sw/qa/extras/layout/data/fld-in-tbl.docx create mode 100644 sw/qa/extras/layout/data/footer-fly-table.fodt create mode 100644 sw/qa/extras/layout/data/forcepoint-swfootnoteframe-1.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint100.html create mode 100644 sw/qa/extras/layout/data/forcepoint102.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint103.html create mode 100644 sw/qa/extras/layout/data/forcepoint72-1.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint75-1.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint76-1.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint89.html create mode 100644 sw/qa/extras/layout/data/forcepoint90.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint91.html create mode 100644 sw/qa/extras/layout/data/forcepoint92.doc create mode 100644 sw/qa/extras/layout/data/forcepoint93-1.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint93-2.rtf create mode 100644 sw/qa/extras/layout/data/forcepoint94.html create mode 100644 sw/qa/extras/layout/data/forcepoint98.html create mode 100644 sw/qa/extras/layout/data/forcepoint99.html create mode 100644 sw/qa/extras/layout/data/hidden-para-separator.docx create mode 100644 sw/qa/extras/layout/data/horizontal_multilevel.odt create mode 100644 sw/qa/extras/layout/data/image-comment.odt create mode 100644 sw/qa/extras/layout/data/in_056132_mod.odt create mode 100644 sw/qa/extras/layout/data/keep-with-next-fly.fodt create mode 100644 sw/qa/extras/layout/data/legend-itemorder-min.docx create mode 100644 sw/qa/extras/layout/data/linked_frames_section_bug.odt create mode 100644 sw/qa/extras/layout/data/long_legendentry.docx create mode 100644 sw/qa/extras/layout/data/no-line-break-at-slash.fodt create mode 100644 sw/qa/extras/layout/data/ofz64109-1.fodt create mode 100644 sw/qa/extras/layout/data/outside_long_data_label.docx create mode 100644 sw/qa/extras/layout/data/piechart_leaderline.odt create mode 100644 sw/qa/extras/layout/data/redline_charatr.fodt create mode 100644 sw/qa/extras/layout/data/redline_footnote_pagination.fodt create mode 100644 sw/qa/extras/layout/data/redline_footnotes.odt create mode 100644 sw/qa/extras/layout/data/redline_sections.fodt create mode 100644 sw/qa/extras/layout/data/redline_table.fodt create mode 100644 sw/qa/extras/layout/data/s4_min2.fodt create mode 100644 sw/qa/extras/layout/data/space+break.fodt create mode 100644 sw/qa/extras/layout/data/stable-at-page-anchored-fly-position.odt create mode 100644 sw/qa/extras/layout/data/tab-over-margin.odt create mode 100644 sw/qa/extras/layout/data/tabellen_test_windows_1.odt create mode 100644 sw/qa/extras/layout/data/table-extrusion1.odt create mode 100644 sw/qa/extras/layout/data/table-extrusion2.odt create mode 100644 sw/qa/extras/layout/data/table_cell_overlap.fodt create mode 100644 sw/qa/extras/layout/data/table_in_text_change.fodt create mode 100644 sw/qa/extras/layout/data/tdf104797.docx create mode 100644 sw/qa/extras/layout/data/tdf105481.odt create mode 100644 sw/qa/extras/layout/data/tdf106153.docx create mode 100644 sw/qa/extras/layout/data/tdf106234.fodt create mode 100644 sw/qa/extras/layout/data/tdf106390.odt create mode 100644 sw/qa/extras/layout/data/tdf108021.odt create mode 100644 sw/qa/extras/layout/data/tdf109077.docx create mode 100644 sw/qa/extras/layout/data/tdf109137.docx create mode 100644 sw/qa/extras/layout/data/tdf112290.docx create mode 100644 sw/qa/extras/layout/data/tdf113014.fodt create mode 100644 sw/qa/extras/layout/data/tdf114163.odt create mode 100644 sw/qa/extras/layout/data/tdf115094.docx create mode 100644 sw/qa/extras/layout/data/tdf115523.fodt create mode 100644 sw/qa/extras/layout/data/tdf115524.fodt create mode 100644 sw/qa/extras/layout/data/tdf115630.docx create mode 100644 sw/qa/extras/layout/data/tdf116256.docx create mode 100644 sw/qa/extras/layout/data/tdf116486.docx create mode 100644 sw/qa/extras/layout/data/tdf116501.odt create mode 100644 sw/qa/extras/layout/data/tdf116830.odt create mode 100644 sw/qa/extras/layout/data/tdf116848.odt create mode 100644 sw/qa/extras/layout/data/tdf116925.docx create mode 100644 sw/qa/extras/layout/data/tdf117028.docx create mode 100644 sw/qa/extras/layout/data/tdf117187.odt create mode 100644 sw/qa/extras/layout/data/tdf117188.docx create mode 100644 sw/qa/extras/layout/data/tdf117245.odt create mode 100644 sw/qa/extras/layout/data/tdf117923.doc create mode 100644 sw/qa/extras/layout/data/tdf117923.docx create mode 100644 sw/qa/extras/layout/data/tdf117982.docx create mode 100644 sw/qa/extras/layout/data/tdf118058.fodt create mode 100644 sw/qa/extras/layout/data/tdf118672.odt create mode 100644 sw/qa/extras/layout/data/tdf119875.odt create mode 100644 sw/qa/extras/layout/data/tdf120287.fodt create mode 100644 sw/qa/extras/layout/data/tdf120287b.fodt create mode 100644 sw/qa/extras/layout/data/tdf120287c.fodt create mode 100644 sw/qa/extras/layout/data/tdf121658.odt create mode 100644 sw/qa/extras/layout/data/tdf122014.docx create mode 100644 sw/qa/extras/layout/data/tdf122225.docx create mode 100644 sw/qa/extras/layout/data/tdf122607.odt create mode 100644 sw/qa/extras/layout/data/tdf122607_leerzeile.odt create mode 100644 sw/qa/extras/layout/data/tdf122800.odt create mode 100644 sw/qa/extras/layout/data/tdf122878.docx create mode 100644 sw/qa/extras/layout/data/tdf123163-1.docx create mode 100644 sw/qa/extras/layout/data/tdf123268.odt create mode 100644 sw/qa/extras/layout/data/tdf123651.docx create mode 100644 sw/qa/extras/layout/data/tdf123898.odt create mode 100644 sw/qa/extras/layout/data/tdf124261.docx create mode 100644 sw/qa/extras/layout/data/tdf124423.docx create mode 100644 sw/qa/extras/layout/data/tdf124423.odt create mode 100644 sw/qa/extras/layout/data/tdf124600.docx create mode 100644 sw/qa/extras/layout/data/tdf124601.doc create mode 100644 sw/qa/extras/layout/data/tdf124601b.doc create mode 100644 sw/qa/extras/layout/data/tdf124796.odt create mode 100644 sw/qa/extras/layout/data/tdf125300.docx create mode 100644 sw/qa/extras/layout/data/tdf125334.odt create mode 100644 sw/qa/extras/layout/data/tdf125335.odt create mode 100644 sw/qa/extras/layout/data/tdf125893.docx create mode 100644 sw/qa/extras/layout/data/tdf126244.docx create mode 100644 sw/qa/extras/layout/data/tdf127118.docx create mode 100644 sw/qa/extras/layout/data/tdf127235.odt create mode 100644 sw/qa/extras/layout/data/tdf127304.odt create mode 100644 sw/qa/extras/layout/data/tdf128198-1.docx create mode 100644 sw/qa/extras/layout/data/tdf128399.docx create mode 100644 sw/qa/extras/layout/data/tdf128611.fodt create mode 100644 sw/qa/extras/layout/data/tdf128959.docx create mode 100644 sw/qa/extras/layout/data/tdf128966-2-min.odt create mode 100644 sw/qa/extras/layout/data/tdf128996.docx create mode 100644 sw/qa/extras/layout/data/tdf129054.docx create mode 100644 sw/qa/extras/layout/data/tdf129095.docx create mode 100644 sw/qa/extras/layout/data/tdf129357.fodt create mode 100644 sw/qa/extras/layout/data/tdf130031.docx create mode 100644 sw/qa/extras/layout/data/tdf130088.docx create mode 100644 sw/qa/extras/layout/data/tdf130218.fodt create mode 100644 sw/qa/extras/layout/data/tdf130242.odt create mode 100644 sw/qa/extras/layout/data/tdf130380.docx create mode 100644 sw/qa/extras/layout/data/tdf130969.docx create mode 100644 sw/qa/extras/layout/data/tdf131707_flyWrap.doc create mode 100644 sw/qa/extras/layout/data/tdf132956.docx create mode 100644 sw/qa/extras/layout/data/tdf133005.odt create mode 100644 sw/qa/extras/layout/data/tdf134146.docx create mode 100644 sw/qa/extras/layout/data/tdf134235.docx create mode 100644 sw/qa/extras/layout/data/tdf134277.docx create mode 100644 sw/qa/extras/layout/data/tdf134298.ott create mode 100644 sw/qa/extras/layout/data/tdf134463.docx create mode 100644 sw/qa/extras/layout/data/tdf134472.odt create mode 100644 sw/qa/extras/layout/data/tdf134548.odt create mode 100644 sw/qa/extras/layout/data/tdf134659.docx create mode 100644 sw/qa/extras/layout/data/tdf134676.docx create mode 100644 sw/qa/extras/layout/data/tdf134685.docx create mode 100644 sw/qa/extras/layout/data/tdf134866.docx create mode 100644 sw/qa/extras/layout/data/tdf135035.docx create mode 100644 sw/qa/extras/layout/data/tdf135035.odt create mode 100644 sw/qa/extras/layout/data/tdf135991.odt create mode 100644 sw/qa/extras/layout/data/tdf136061.docx create mode 100644 sw/qa/extras/layout/data/tdf136588.docx create mode 100644 sw/qa/extras/layout/data/tdf136613.docx create mode 100644 sw/qa/extras/layout/data/tdf136816.odt create mode 100644 sw/qa/extras/layout/data/tdf137025.docx create mode 100644 sw/qa/extras/layout/data/tdf137116.docx create mode 100644 sw/qa/extras/layout/data/tdf137154.docx create mode 100644 sw/qa/extras/layout/data/tdf137185.odt create mode 100644 sw/qa/extras/layout/data/tdf137523-1-min.fodt create mode 100644 sw/qa/extras/layout/data/tdf137819.fodt create mode 100644 sw/qa/extras/layout/data/tdf138018.docx create mode 100644 sw/qa/extras/layout/data/tdf138039.odt create mode 100644 sw/qa/extras/layout/data/tdf138465min.docx create mode 100644 sw/qa/extras/layout/data/tdf138592-a-acute.fodt create mode 100644 sw/qa/extras/layout/data/tdf138773.docx create mode 100644 sw/qa/extras/layout/data/tdf138782.docx create mode 100644 sw/qa/extras/layout/data/tdf138951.odt create mode 100644 sw/qa/extras/layout/data/tdf139336_ColumnsWithFootnoteDoNotOccupyEntirePage.docx create mode 100644 sw/qa/extras/layout/data/tdf141079.odt create mode 100644 sw/qa/extras/layout/data/tdf141220.docx create mode 100644 sw/qa/extras/layout/data/tdf142694-1.odt create mode 100644 sw/qa/extras/layout/data/tdf143239-1-min.odt create mode 100644 sw/qa/extras/layout/data/tdf144057.fodt create mode 100644 sw/qa/extras/layout/data/tdf145719.odt create mode 100644 sw/qa/extras/layout/data/tdf145826.odt create mode 100644 sw/qa/extras/layout/data/tdf146272.odt create mode 100644 sw/qa/extras/layout/data/tdf146704_EndnoteInSection.odt create mode 100644 sw/qa/extras/layout/data/tdf147485-forcepoint.docx create mode 100644 sw/qa/extras/layout/data/tdf148897.odt create mode 100644 sw/qa/extras/layout/data/tdf149248.odt create mode 100644 sw/qa/extras/layout/data/tdf149324.odt create mode 100644 sw/qa/extras/layout/data/tdf149420.odt create mode 100644 sw/qa/extras/layout/data/tdf149709.fodt create mode 100644 sw/qa/extras/layout/data/tdf149710.fodt create mode 100644 sw/qa/extras/layout/data/tdf149711.docx create mode 100644 sw/qa/extras/layout/data/tdf150200.docx create mode 100644 sw/qa/extras/layout/data/tdf150200.odt create mode 100644 sw/qa/extras/layout/data/tdf150438.docx create mode 100644 sw/qa/extras/layout/data/tdf150438.odt create mode 100644 sw/qa/extras/layout/data/tdf150606-1-min.odt create mode 100644 sw/qa/extras/layout/data/tdf150642.odt create mode 100644 sw/qa/extras/layout/data/tdf150717.odt create mode 100644 sw/qa/extras/layout/data/tdf150790.fodt create mode 100644 sw/qa/extras/layout/data/tdf151954.docx create mode 100644 sw/qa/extras/layout/data/tdf152031-stair.odt create mode 100644 sw/qa/extras/layout/data/tdf152085-section-tblr.odt create mode 100644 sw/qa/extras/layout/data/tdf152106.odt create mode 100644 sw/qa/extras/layout/data/tdf152307.odt create mode 100644 sw/qa/extras/layout/data/tdf152413.fodt create mode 100644 sw/qa/extras/layout/data/tdf152983-1-min.docx create mode 100644 sw/qa/extras/layout/data/tdf153136.docx create mode 100644 sw/qa/extras/layout/data/tdf155177-1-min.odt create mode 100644 sw/qa/extras/layout/data/tdf155611_table_and_nested_section.fodt create mode 100644 sw/qa/extras/layout/data/tdf156725.fodt create mode 100644 sw/qa/extras/layout/data/tdf159050-wrap-adjust.fodt create mode 100644 sw/qa/extras/layout/data/tdf159085.fodt create mode 100644 sw/qa/extras/layout/data/tdf40260.odt create mode 100644 sw/qa/extras/layout/data/tdf42748.fodt create mode 100644 sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_New.odt create mode 100644 sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_Old.odt create mode 100644 sw/qa/extras/layout/data/tdf54819.fodt create mode 100644 sw/qa/extras/layout/data/tdf64222.docx create mode 100644 sw/qa/extras/layout/data/tdf69647_images.odt create mode 100644 sw/qa/extras/layout/data/tdf69647_text.docx create mode 100644 sw/qa/extras/layout/data/tdf69648.docx create mode 100644 sw/qa/extras/layout/data/tdf72727.odt create mode 100644 sw/qa/extras/layout/data/tdf75659.docx create mode 100644 sw/qa/extras/layout/data/tdf85610.fodt create mode 100644 sw/qa/extras/layout/data/tdf88496.docx create mode 100644 sw/qa/extras/layout/data/testAreaChartNumberFormat.docx create mode 100644 sw/qa/extras/layout/data/testTruncatedAxisLabel.odt create mode 100644 sw/qa/extras/layout/data/three_sections.fodt create mode 100644 sw/qa/extras/layout/data/tox-update-wrong-pages.odt create mode 100644 sw/qa/extras/layout/data/user-field-type-language.fodt create mode 100644 sw/qa/extras/layout/data/wideBoxInFootnote.fodt create mode 100644 sw/qa/extras/layout/data/writer-image-no-capture.docx create mode 100644 sw/qa/extras/layout/data/xaxis-labelbreak.docx create mode 100644 sw/qa/extras/layout/layout.cxx create mode 100644 sw/qa/extras/layout/layout2.cxx create mode 100644 sw/qa/extras/layout/layout3.cxx create mode 100644 sw/qa/extras/mailmerge/data/10-testing-addresses-writer-merged.odt create mode 100644 sw/qa/extras/mailmerge/data/10-testing-addresses-writer.odt create mode 100644 sw/qa/extras/mailmerge/data/10-testing-addresses.ods create mode 100644 sw/qa/extras/mailmerge/data/4_v01.ods create mode 100644 sw/qa/extras/mailmerge/data/5-with-blanks.ods create mode 100644 sw/qa/extras/mailmerge/data/bookmarkcondition.fodt create mode 100644 sw/qa/extras/mailmerge/data/bookmarkcondition.ods create mode 100644 sw/qa/extras/mailmerge/data/db_pagecounttest.ods create mode 100644 sw/qa/extras/mailmerge/data/empty.odt create mode 100644 sw/qa/extras/mailmerge/data/grabbagtest.docx create mode 100644 sw/qa/extras/mailmerge/data/linked-labels.odt create mode 100644 sw/qa/extras/mailmerge/data/linked-with-condition.odt create mode 100644 sw/qa/extras/mailmerge/data/missing-default-line-color.ott create mode 100644 sw/qa/extras/mailmerge/data/multiple-page-anchored-draws.odt create mode 100644 sw/qa/extras/mailmerge/data/one-empty-address.ods create mode 100644 sw/qa/extras/mailmerge/data/onecell.xlsx create mode 100644 sw/qa/extras/mailmerge/data/pagecounttest.ott create mode 100644 sw/qa/extras/mailmerge/data/section_ps.odt create mode 100644 sw/qa/extras/mailmerge/data/sections_first_last.odt create mode 100644 sw/qa/extras/mailmerge/data/simple-mail-merge-2pages.odt create mode 100644 sw/qa/extras/mailmerge/data/simple-mail-merge.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf118113.ods create mode 100644 sw/qa/extras/mailmerge/data/tdf118113.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf118845.fodt create mode 100644 sw/qa/extras/mailmerge/data/tdf125522.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf128148.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf35798-legacy.fodt create mode 100644 sw/qa/extras/mailmerge/data/tdf35798-legacy.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf35798-new.fodt create mode 100644 sw/qa/extras/mailmerge/data/tdf35798-new.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf62364.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf78611.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf81750.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf89214.odt create mode 100644 sw/qa/extras/mailmerge/data/tdf92623.odt create mode 100644 sw/qa/extras/mailmerge/data/writer-mail-merge.odt create mode 100644 sw/qa/extras/mailmerge/data/writer-merged-mail-merge.odt create mode 100644 sw/qa/extras/mailmerge/mailmerge.cxx create mode 100644 sw/qa/extras/mailmerge/mailmerge2.cxx create mode 100644 sw/qa/extras/odfexport/data/2_MathType3.docx create mode 100644 sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt create mode 100644 sw/qa/extras/odfexport/data/Custom-Style-TOC.docx create mode 100644 sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt create mode 100644 sw/qa/extras/odfexport/data/IsLegal.fodt create mode 100644 sw/qa/extras/odfexport/data/MadeByLO7.odt create mode 100644 sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt create mode 100644 sw/qa/extras/odfexport/data/WordTest_edit.odt create mode 100644 sw/qa/extras/odfexport/data/allow-overlap.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/border_types.odt create mode 100644 sw/qa/extras/odfexport/data/btlr-cell.odt create mode 100644 sw/qa/extras/odfexport/data/btlr-frame.odt create mode 100644 sw/qa/extras/odfexport/data/chapter-number-new-line.odt create mode 100644 sw/qa/extras/odfexport/data/charborder.odt create mode 100644 sw/qa/extras/odfexport/data/embedded-font-props.odt create mode 100644 sw/qa/extras/odfexport/data/embedded-pdf.odt create mode 100644 sw/qa/extras/odfexport/data/fdo38244.odt create mode 100644 sw/qa/extras/odfexport/data/fdo43807.odt create mode 100644 sw/qa/extras/odfexport/data/fdo58949.docx create mode 100644 sw/qa/extras/odfexport/data/fdo60769.odt create mode 100644 sw/qa/extras/odfexport/data/fdo79358.odt create mode 100644 sw/qa/extras/odfexport/data/fdo86963.odt create mode 100644 sw/qa/extras/odfexport/data/fillbitmap3.odt create mode 100644 sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt create mode 100644 sw/qa/extras/odfexport/data/framebackgrounds.odt create mode 100644 sw/qa/extras/odfexport/data/gerrit13858.odt create mode 100644 sw/qa/extras/odfexport/data/gutter-left.odt create mode 100644 sw/qa/extras/odfexport/data/image-mimetype.odt create mode 100644 sw/qa/extras/odfexport/data/listformat.docx create mode 100644 sw/qa/extras/odfexport/data/listformat.odt create mode 100644 sw/qa/extras/odfexport/data/nestedTableInFooter.odt create mode 100644 sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt create mode 100644 sw/qa/extras/odfexport/data/oooxml_embedded.sxw create mode 100644 sw/qa/extras/odfexport/data/page-content-bottom.odt create mode 100644 sw/qa/extras/odfexport/data/page-content-top.odt create mode 100644 sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt create mode 100644 sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt create mode 100644 sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt create mode 100644 sw/qa/extras/odfexport/data/protection-key.fodt create mode 100644 sw/qa/extras/odfexport/data/qrcode-properties.odt create mode 100644 sw/qa/extras/odfexport/data/redlineTextFrame.odt create mode 100644 sw/qa/extras/odfexport/data/referencelanguage.odt create mode 100644 sw/qa/extras/odfexport/data/relh-page-tdf80282.odt create mode 100644 sw/qa/extras/odfexport/data/relh-page.odt create mode 100644 sw/qa/extras/odfexport/data/relw-page.odt create mode 100644 sw/qa/extras/odfexport/data/resolved-comment.odt create mode 100644 sw/qa/extras/odfexport/data/rovas-numbering.odt create mode 100644 sw/qa/extras/odfexport/data/ruby-position.odt create mode 100644 sw/qa/extras/odfexport/data/section-columns-separator.fodt create mode 100644 sw/qa/extras/odfexport/data/sender-initials.fodt create mode 100644 sw/qa/extras/odfexport/data/sha1_correct.odt create mode 100644 sw/qa/extras/odfexport/data/sha1_wrong.odt create mode 100644 sw/qa/extras/odfexport/data/shape-relsize.odt create mode 100644 sw/qa/extras/odfexport/data/shape-with-hyperlink.odt create mode 100644 sw/qa/extras/odfexport/data/shapes-hyperlink.odt create mode 100644 sw/qa/extras/odfexport/data/signatureline-properties.fodt create mode 100644 sw/qa/extras/odfexport/data/spellout-numberingtypes.odt create mode 100644 sw/qa/extras/odfexport/data/style-link.fodt create mode 100644 sw/qa/extras/odfexport/data/sw_hatch.odt create mode 100644 sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt create mode 100644 sw/qa/extras/odfexport/data/table_number_format_3.docx create mode 100644 sw/qa/extras/odfexport/data/table_styles_1.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_2.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_3.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_4.odt create mode 100644 sw/qa/extras/odfexport/data/table_styles_5.odt create mode 100644 sw/qa/extras/odfexport/data/tdf100492.odt create mode 100644 sw/qa/extras/odfexport/data/tdf101710.odt create mode 100644 sw/qa/extras/odfexport/data/tdf101856.odt create mode 100644 sw/qa/extras/odfexport/data/tdf101856_overlapped.odt create mode 100644 sw/qa/extras/odfexport/data/tdf103091.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf103567.odt create mode 100644 sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt create mode 100644 sw/qa/extras/odfexport/data/tdf107292.odt create mode 100644 sw/qa/extras/odfexport/data/tdf107696.odt create mode 100644 sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt create mode 100644 sw/qa/extras/odfexport/data/tdf114287.odt create mode 100644 sw/qa/extras/odfexport/data/tdf115815.odt create mode 100644 sw/qa/extras/odfexport/data/tdf118502.odt create mode 100644 sw/qa/extras/odfexport/data/tdf118637.odt create mode 100644 sw/qa/extras/odfexport/data/tdf121658.odt create mode 100644 sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt create mode 100644 sw/qa/extras/odfexport/data/tdf128504.docx create mode 100644 sw/qa/extras/odfexport/data/tdf129520.docx create mode 100644 sw/qa/extras/odfexport/data/tdf129568-ui.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf129568.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf130314.docx create mode 100644 sw/qa/extras/odfexport/data/tdf130950.odt create mode 100644 sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt create mode 100644 sw/qa/extras/odfexport/data/tdf131621.ott create mode 100644 sw/qa/extras/odfexport/data/tdf131812.odt create mode 100644 sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt create mode 100644 sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt create mode 100644 sw/qa/extras/odfexport/data/tdf134987.docx create mode 100644 sw/qa/extras/odfexport/data/tdf135144.docx create mode 100644 sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt create mode 100644 sw/qa/extras/odfexport/data/tdf136645.odt create mode 100644 sw/qa/extras/odfexport/data/tdf137199.docx create mode 100644 sw/qa/extras/odfexport/data/tdf139126.odt create mode 100644 sw/qa/extras/odfexport/data/tdf140437.odt create mode 100644 sw/qa/extras/odfexport/data/tdf142483.odt create mode 100644 sw/qa/extras/odfexport/data/tdf143605.odt create mode 100644 sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt create mode 100644 sw/qa/extras/odfexport/data/tdf144319.odt create mode 100644 sw/qa/extras/odfexport/data/tdf145226.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf145361.odt create mode 100644 sw/qa/extras/odfexport/data/tdf145871.odt create mode 100644 sw/qa/extras/odfexport/data/tdf146264.odt create mode 100644 sw/qa/extras/odfexport/data/tdf149248.odt create mode 100644 sw/qa/extras/odfexport/data/tdf149324.odt create mode 100644 sw/qa/extras/odfexport/data/tdf149420.odt create mode 100644 sw/qa/extras/odfexport/data/tdf150149.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf150394.odt create mode 100644 sw/qa/extras/odfexport/data/tdf151100.docx create mode 100644 sw/qa/extras/odfexport/data/tdf152710.odt create mode 100644 sw/qa/extras/odfexport/data/tdf156905.odt create mode 100644 sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc create mode 100644 sw/qa/extras/odfexport/data/tdf57317_autoListName.odt create mode 100644 sw/qa/extras/odfexport/data/tdf66305.odt create mode 100644 sw/qa/extras/odfexport/data/tdf77961.odt create mode 100644 sw/qa/extras/odfexport/data/tdf92379.fodt create mode 100644 sw/qa/extras/odfexport/data/tdf95806.docx create mode 100644 sw/qa/extras/odfexport/data/tdf99631.docx create mode 100644 sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt create mode 100644 sw/qa/extras/odfexport/data/textbox-rounded-corners.odt create mode 100644 sw/qa/extras/odfexport/data/textframe-gradient.odt create mode 100644 sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt create mode 100644 sw/qa/extras/odfexport/data/textframe-vertadjust.odt create mode 100644 sw/qa/extras/odfexport/data/user-field-decl-fly.odt create mode 100644 sw/qa/extras/odfexport/data/user-field-decl.odt create mode 100644 sw/qa/extras/odfexport/data/userdefattr-tablecell.odt create mode 100644 sw/qa/extras/odfexport/data/whitespace.odt create mode 100644 sw/qa/extras/odfexport/odfexport.cxx create mode 100644 sw/qa/extras/odfexport/odfexport2.cxx create mode 100644 sw/qa/extras/odfimport/data/BibliographyEntryField.odt create mode 100644 sw/qa/extras/odfimport/data/PageAnchorZIndexFirstPage.fodt create mode 100644 sw/qa/extras/odfimport/data/PageAnchorZIndexSecondPage.fodt create mode 100644 sw/qa/extras/odfimport/data/PageBackground.odt create mode 100644 sw/qa/extras/odfimport/data/Word2010AsCharShape.odt create mode 100644 sw/qa/extras/odfimport/data/ZoneMacroTest.odt create mode 100644 sw/qa/extras/odfimport/data/annotation-formatting.odt create mode 100644 sw/qa/extras/odfimport/data/bnc800714.fodt create mode 100644 sw/qa/extras/odfimport/data/borders_ooo33.odt create mode 100644 sw/qa/extras/odfimport/data/dateFormFormats.odt create mode 100644 sw/qa/extras/odfimport/data/empty-svg-family-name.odt create mode 100644 sw/qa/extras/odfimport/data/emptyParagraphLoosesFontHeight.fodt create mode 100644 sw/qa/extras/odfimport/data/fdo37606.odt create mode 100644 sw/qa/extras/odfimport/data/fdo47267-3.odt create mode 100644 sw/qa/extras/odfimport/data/fdo53210.odt create mode 100644 sw/qa/extras/odfimport/data/fdo55814.odt create mode 100644 sw/qa/extras/odfimport/data/fdo56272.odt create mode 100644 sw/qa/extras/odfimport/data/fdo60842.odt create mode 100644 sw/qa/extras/odfimport/data/fdo68839.odt create mode 100644 sw/qa/extras/odfimport/data/fdo69862.odt create mode 100644 sw/qa/extras/odfimport/data/fdo69979.odt create mode 100644 sw/qa/extras/odfimport/data/fdo75872_aoo40.odt create mode 100644 sw/qa/extras/odfimport/data/fdo75872_ooo33.odt create mode 100644 sw/qa/extras/odfimport/data/fdo79269.odt create mode 100644 sw/qa/extras/odfimport/data/fdo79269_header.odt create mode 100644 sw/qa/extras/odfimport/data/fdo81223.odt create mode 100644 sw/qa/extras/odfimport/data/fdo82165.odt create mode 100644 sw/qa/extras/odfimport/data/fdo90130-1.odt create mode 100644 sw/qa/extras/odfimport/data/fdo90130-2.odt create mode 100644 sw/qa/extras/odfimport/data/feature_image_jpg.odt create mode 100644 sw/qa/extras/odfimport/data/feature_table.odt create mode 100644 sw/qa/extras/odfimport/data/feature_table_merged-cells.odt create mode 100644 sw/qa/extras/odfimport/data/feature_table_merged-cells_all.odt create mode 100644 sw/qa/extras/odfimport/data/feature_table_text.odt create mode 100644 sw/qa/extras/odfimport/data/feature_text.odt create mode 100644 sw/qa/extras/odfimport/data/feature_text_background-color.odt create mode 100644 sw/qa/extras/odfimport/data/feature_text_bold.odt create mode 100644 sw/qa/extras/odfimport/data/feature_text_italic.odt create mode 100644 sw/qa/extras/odfimport/data/forcepoint101.fodt create mode 100644 sw/qa/extras/odfimport/data/forcepoint108.fodt create mode 100644 sw/qa/extras/odfimport/data/hello.odt create mode 100644 sw/qa/extras/odfimport/data/i61225.sxw create mode 100644 sw/qa/extras/odfimport/data/incorrectsum.odt create mode 100644 sw/qa/extras/odfimport/data/ooo32780-1.odt create mode 100644 sw/qa/extras/odfimport/data/ooo77837-1.odt create mode 100644 sw/qa/extras/odfimport/data/paste-first-para-direct-format.odt create mode 100644 sw/qa/extras/odfimport/data/space.odt create mode 100644 sw/qa/extras/odfimport/data/spellmenu-redline.odt create mode 100644 sw/qa/extras/odfimport/data/tdf100033_1.odt create mode 100644 sw/qa/extras/odfimport/data/tdf100033_2.odt create mode 100644 sw/qa/extras/odfimport/data/tdf101729.odt create mode 100644 sw/qa/extras/odfimport/data/tdf103025.odt create mode 100644 sw/qa/extras/odfimport/data/tdf107392.odt create mode 100644 sw/qa/extras/odfimport/data/tdf107776.fodt create mode 100644 sw/qa/extras/odfimport/data/tdf108482.odt create mode 100644 sw/qa/extras/odfimport/data/tdf109080_loext_ns.odt create mode 100644 sw/qa/extras/odfimport/data/tdf109080_style_ns.odt create mode 100644 sw/qa/extras/odfimport/data/tdf109228.odt create mode 100644 sw/qa/extras/odfimport/data/tdf113289.odt create mode 100644 sw/qa/extras/odfimport/data/tdf115079.odt create mode 100644 sw/qa/extras/odfimport/data/tdf116195.odt create mode 100644 sw/qa/extras/odfimport/data/tdf120677.fodt create mode 100644 sw/qa/extras/odfimport/data/tdf123829.odt create mode 100644 sw/qa/extras/odfimport/data/tdf123968.odt create mode 100644 sw/qa/extras/odfimport/data/tdf128737.odt create mode 100644 sw/qa/extras/odfimport/data/tdf133459.odt create mode 100644 sw/qa/extras/odfimport/data/tdf134971a.odt create mode 100644 sw/qa/extras/odfimport/data/tdf134971b.odt create mode 100644 sw/qa/extras/odfimport/data/tdf138879.odt create mode 100644 sw/qa/extras/odfimport/data/tdf146257.odt create mode 100644 sw/qa/extras/odfimport/data/tdf146597.odt create mode 100644 sw/qa/extras/odfimport/data/tdf149978.fodt create mode 100644 sw/qa/extras/odfimport/data/tdf151375.ott create mode 100644 sw/qa/extras/odfimport/data/tdf152015.odt create mode 100644 sw/qa/extras/odfimport/data/tdf41542_borderlessPadding.odt create mode 100644 sw/qa/extras/odfimport/data/tdf74524.odt create mode 100644 sw/qa/extras/odfimport/data/tdf75221.odt create mode 100644 sw/qa/extras/odfimport/data/tdf76322_columnBreakInHeader.docx create mode 100644 sw/qa/extras/odfimport/data/tdf76349_1columnBreak.odt create mode 100644 sw/qa/extras/odfimport/data/tdf89802.fodt create mode 100644 sw/qa/extras/odfimport/data/tdf92586.odt create mode 100644 sw/qa/extras/odfimport/data/tdf94882.odt create mode 100644 sw/qa/extras/odfimport/data/tdf96113.odt create mode 100644 sw/qa/extras/odfimport/data/timeFormFormats.odt create mode 100644 sw/qa/extras/odfimport/data/vmerge-cell-border.odt create mode 100644 sw/qa/extras/odfimport/odffeatures.cxx create mode 100644 sw/qa/extras/odfimport/odfimport.cxx create mode 100644 sw/qa/extras/ooxmlexport/data/090716_Studentische_Arbeit_VWS.docx create mode 100644 sw/qa/extras/ooxmlexport/data/1-table-1-page.docx create mode 100644 sw/qa/extras/ooxmlexport/data/128197_compat14.docx create mode 100644 sw/qa/extras/ooxmlexport/data/128197_compat15.docx create mode 100644 sw/qa/extras/ooxmlexport/data/151384Hyperlink.odt create mode 100644 sw/qa/extras/ooxmlexport/data/1_page.docx create mode 100644 sw/qa/extras/ooxmlexport/data/2-id.docx create mode 100644 sw/qa/extras/ooxmlexport/data/2120112713.docx create mode 100644 sw/qa/extras/ooxmlexport/data/2120112713_OpenBrace.docx create mode 100644 sw/qa/extras/ooxmlexport/data/2129393649.docx create mode 100644 sw/qa/extras/ooxmlexport/data/2_table_doc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/2col-header.docx create mode 100644 sw/qa/extras/ooxmlexport/data/99_Fields.docx create mode 100644 sw/qa/extras/ooxmlexport/data/AnchorId.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Chart_BorderLine_Style.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Chart_Plot_BorderLine_Style.docx create mode 100644 sw/qa/extras/ooxmlexport/data/ColorOverwritten.docx create mode 100644 sw/qa/extras/ooxmlexport/data/CommentDone.docx create mode 100644 sw/qa/extras/ooxmlexport/data/CommentReply.docx create mode 100644 sw/qa/extras/ooxmlexport/data/EmbeddedExcelChart.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Encrypted_LO_Standard_abc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Encrypted_MSO2007_abc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Encrypted_MSO2010_abc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Encrypted_MSO2013_abc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/EquationAsScientificNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/EquationWithAboveAndBelowCaption.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO73034.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO73546.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO74105.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO74106.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO74215.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO74774.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO74775.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO75133.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO76248.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO76312.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO77715.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO78292.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FDO78590.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FigureAsLabelPicture.docx create mode 100644 sw/qa/extras/ooxmlexport/data/FileWithInvalidImageLink.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Hau_min_list2.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/ImageCrop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/IndexFieldFlagF.docx create mode 100644 sw/qa/extras/ooxmlexport/data/LineStyle_DashType.docx create mode 100644 sw/qa/extras/ooxmlexport/data/LineStyle_DashType_VML.docx create mode 100644 sw/qa/extras/ooxmlexport/data/LinkedTextBoxes.docx create mode 100644 sw/qa/extras/ooxmlexport/data/NoFillAttrInImagedata.docx create mode 100644 sw/qa/extras/ooxmlexport/data/NumberedList.docx create mode 100644 sw/qa/extras/ooxmlexport/data/PreserveWfieldTOC.docx create mode 100644 sw/qa/extras/ooxmlexport/data/PreserveXfieldTOC.docx create mode 100644 sw/qa/extras/ooxmlexport/data/SdtContent.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Shape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/ShapeOverlappingWithSdt.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Simple-TOC.odt create mode 100644 sw/qa/extras/ooxmlexport/data/SvgImageTest.odt create mode 100644 sw/qa/extras/ooxmlexport/data/TC-table-DnD-move.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TC-table-Separate-Move.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TC-table-rowDND-front.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TC-table-rowDND.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TCTagMisMatch.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TOC_field_b.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TOC_field_f.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Table-of-Figures.odt create mode 100644 sw/qa/extras/ooxmlexport/data/TableWithAboveCaptions.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Table_cell_auto_width_fdo69656.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Tdf147485.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt create mode 100644 sw/qa/extras/ooxmlexport/data/TestVMLData.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Test_CharUnderlineThemeColor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Test_ThemeBorderColor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/Test_ThemeTextParaBackgroundColor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextEffects_Glow_Shadow_Reflection.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextEffects_Groupshapes.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextEffects_InStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextEffects_Props3d_Ligatures_NumForm_NumSpacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextEffects_StylisticSets_CntxtAlts.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextEffects_TextFill.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextEffects_TextOutline.docx create mode 100644 sw/qa/extras/ooxmlexport/data/TextFrameRotation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/UnknownStyleInRedline.docx create mode 100644 sw/qa/extras/ooxmlexport/data/Unsupportedtextfields.docx create mode 100644 sw/qa/extras/ooxmlexport/data/WPGbodyPr.docx create mode 100644 sw/qa/extras/ooxmlexport/data/a4andborders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/abi11739.docx create mode 100644 sw/qa/extras/ooxmlexport/data/absolute-link.docx create mode 100644 sw/qa/extras/ooxmlexport/data/activex_checkbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/activex_control_align.odt create mode 100644 sw/qa/extras/ooxmlexport/data/activex_control_at_run_end.odt create mode 100644 sw/qa/extras/ooxmlexport/data/activex_option_button_group.docx create mode 100644 sw/qa/extras/ooxmlexport/data/activex_textbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/afterlines.docx create mode 100644 sw/qa/extras/ooxmlexport/data/all_gaps_word.docx create mode 100644 sw/qa/extras/ooxmlexport/data/alphabeticalIndex_AutoColumn.docx create mode 100644 sw/qa/extras/ooxmlexport/data/alphabeticalIndex_MultipleColumns.docx create mode 100644 sw/qa/extras/ooxmlexport/data/anchor-position.docx create mode 100644 sw/qa/extras/ooxmlexport/data/annotation-formatting.docx create mode 100644 sw/qa/extras/ooxmlexport/data/arabic-zero-numbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/arabic-zero4-numbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/arabic-zero5-numbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/artistic_effects.docx create mode 100644 sw/qa/extras/ooxmlexport/data/author-property.docx create mode 100644 sw/qa/extras/ooxmlexport/data/autofit.docx create mode 100644 sw/qa/extras/ooxmlexport/data/bad.docm create mode 100644 sw/qa/extras/ooxmlexport/data/behinddoc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/bezier.odt create mode 100644 sw/qa/extras/ooxmlexport/data/bnc581614.doc create mode 100644 sw/qa/extras/ooxmlexport/data/bnc637947.odt create mode 100644 sw/qa/extras/ooxmlexport/data/bnc780044_spacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/bnc834035.odt create mode 100644 sw/qa/extras/ooxmlexport/data/bnc837302.docx create mode 100644 sw/qa/extras/ooxmlexport/data/bnc865381.docx create mode 100644 sw/qa/extras/ooxmlexport/data/bnc884615.docx create mode 100644 sw/qa/extras/ooxmlexport/data/bnc891663.docx create mode 100644 sw/qa/extras/ooxmlexport/data/btlr-frame.odt create mode 100644 sw/qa/extras/ooxmlexport/data/btlr-textbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/calendar1.docx create mode 100644 sw/qa/extras/ooxmlexport/data/calendar2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/calendar3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/calendar4.docx create mode 100644 sw/qa/extras/ooxmlexport/data/calendar5.docx create mode 100644 sw/qa/extras/ooxmlexport/data/caption.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cell-btlr.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cell-grid-span.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cell-sdt-redline.docx create mode 100644 sw/qa/extras/ooxmlexport/data/charborder.odt create mode 100644 sw/qa/extras/ooxmlexport/data/chart-dupe.docx create mode 100644 sw/qa/extras/ooxmlexport/data/chart-in-footer.docx create mode 100644 sw/qa/extras/ooxmlexport/data/chart-prop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/chart-size.docx create mode 100644 sw/qa/extras/ooxmlexport/data/chart.docx create mode 100644 sw/qa/extras/ooxmlexport/data/checkbox-control.docx create mode 100644 sw/qa/extras/ooxmlexport/data/chtoutline.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cjklist30.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cjklist31.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cjklist34.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cjklist35.docx create mode 100644 sw/qa/extras/ooxmlexport/data/cjklist44.docx create mode 100644 sw/qa/extras/ooxmlexport/data/clearing-break.docx create mode 100644 sw/qa/extras/ooxmlexport/data/columnbreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/combobox-control.docx create mode 100644 sw/qa/extras/ooxmlexport/data/comment_initials.odt create mode 100644 sw/qa/extras/ooxmlexport/data/comments-nested.odt create mode 100644 sw/qa/extras/ooxmlexport/data/conditional-text.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/conditionalstyles-tbllook.docx create mode 100644 sw/qa/extras/ooxmlexport/data/content-control-grab-bag.docx create mode 100644 sw/qa/extras/ooxmlexport/data/content-control-shape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/controlshape.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/cp1000015.odt create mode 100644 sw/qa/extras/ooxmlexport/data/crop-pixel.docx create mode 100644 sw/qa/extras/ooxmlexport/data/crop-roundtrip.docx create mode 100644 sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt create mode 100644 sw/qa/extras/ooxmlexport/data/custom-properties.docx create mode 100644 sw/qa/extras/ooxmlexport/data/custom-styles-TOC-comma.docx create mode 100644 sw/qa/extras/ooxmlexport/data/custom-styles-TOC-semicolon.docx create mode 100644 sw/qa/extras/ooxmlexport/data/customxml.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dashed_line_custdash_1000th_of_percent.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dashed_line_custdash_percentage.docx create mode 100644 sw/qa/extras/ooxmlexport/data/date-control.docx create mode 100644 sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx create mode 100644 sw/qa/extras/ooxmlexport/data/date_field_in_shape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx create mode 100644 sw/qa/extras/ooxmlexport/data/default-sect-break-cols.docx create mode 100644 sw/qa/extras/ooxmlexport/data/defaultStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dkvert.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-charheight-default.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-customgeometry-cubicbezier.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-gradientfill-theme.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-groupshape-capitalization.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-groupshape-childposition.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-groupshape-paraspacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-groupshape-relsize.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-groupshape-runfonts.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-groupshape-sdt.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-rectangle-relsize.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-shape-fillbitmapcrop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-shape-fillpattern.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-shape-relsize.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-shape-title.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-textframe-vertadjust.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-textshape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-textshapeB.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dml-zorder.odt create mode 100644 sw/qa/extras/ooxmlexport/data/docxopenhyperlinkbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dont-add-new-styles.docx create mode 100644 sw/qa/extras/ooxmlexport/data/drawinglayer-pic-pos.docx create mode 100644 sw/qa/extras/ooxmlexport/data/drawingml-flipv.docx create mode 100644 sw/qa/extras/ooxmlexport/data/dropdown-in-cell.docx create mode 100644 sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt create mode 100644 sw/qa/extras/ooxmlexport/data/effect-extent-inline.docx create mode 100644 sw/qa/extras/ooxmlexport/data/effect-extent-line-width.docx create mode 100644 sw/qa/extras/ooxmlexport/data/effect-extent.docx create mode 100644 sw/qa/extras/ooxmlexport/data/effectextent-margin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/em.docx create mode 100644 sw/qa/extras/ooxmlexport/data/embedded-xlsx.docx create mode 100644 sw/qa/extras/ooxmlexport/data/embedded_chart.odt create mode 100644 sw/qa/extras/ooxmlexport/data/embedded_images.odt create mode 100644 sw/qa/extras/ooxmlexport/data/empty-annotation-mark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/empty-date-control.odt create mode 100644 sw/qa/extras/ooxmlexport/data/empty.odt create mode 100644 sw/qa/extras/ooxmlexport/data/endingSectionProps.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fail_bracePair.odt create mode 100644 sw/qa/extras/ooxmlexport/data/fdo106029.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo38244.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo38414.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo43093.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo43093b.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo44689_start_page_0.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo44689_start_page_7.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo46361.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo47669.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo48557.odt create mode 100644 sw/qa/extras/ooxmlexport/data/fdo51034.odt create mode 100644 sw/qa/extras/ooxmlexport/data/fdo51550.odt create mode 100644 sw/qa/extras/ooxmlexport/data/fdo52208.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo53985.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo55187.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo55381.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo56679.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo58577.odt create mode 100644 sw/qa/extras/ooxmlexport/data/fdo59273.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo59638.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo60922.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo60957-2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo60990.odt create mode 100644 sw/qa/extras/ooxmlexport/data/fdo61343.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo63053.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo63685.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo64350.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo64826.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo65090.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo65265.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo65295.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo65400.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo65632.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo65718.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo65833.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo66474.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo66543.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo66688.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo66773.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo66781.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo66929.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo67013.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo67737.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo68418.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo68607.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo68787.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo69548.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo69616.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo69636.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo69644.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo69649.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo70457.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo70812.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo70838.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo70942.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo71302.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo71646.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo71785.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo71834.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo72560.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo72560b.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo72560c.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo72560d.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo72560e.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73215.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73227.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73247.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73389.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73541.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73550.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73556.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73596_AlphaSeparator.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo73596_RunInStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74110.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74153.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74357.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74401.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74566.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74605.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74745.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo74792.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo75431.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76016.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76098.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76101.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76163.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76249.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76316.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76586.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76587.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76589.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76591.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76597.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76741.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76803.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76934.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo76979.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77117.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77129.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77476.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77716.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77718.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77719.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77725.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77727.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77759.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77812.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77887.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo77890.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78284.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78300.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78384.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78420.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78432.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78469.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78474.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78599.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78651.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78654.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78658.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78659.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78663.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78882.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78883.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78886.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78887.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78904.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78907.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78910.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78939.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo78957.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79008.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79062.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79256.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79535.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79540.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79591.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79668.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79738.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79817.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79822.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79915.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79968.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79969_xlsb.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo79969_xlsm.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80097.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80410.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80522.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80523_pptm.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80523_sldm.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80555.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80800.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80800b_tableStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80895.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80897.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80898.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80902.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo80997.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo81031.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo81341.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo81381.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo81486.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo81492.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo81945.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo81946.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo82123.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo82492.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo83044.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo83048.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo83057.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo83428.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fdo85542.docx create mode 100644 sw/qa/extras/ooxmlexport/data/field-rotated.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/file_crash.docx create mode 100644 sw/qa/extras/ooxmlexport/data/fixed-date-field.docx create mode 100644 sw/qa/extras/ooxmlexport/data/flip_and_rotate.odt create mode 100644 sw/qa/extras/ooxmlexport/data/floating-table-position.docx create mode 100644 sw/qa/extras/ooxmlexport/data/floating-tables-anchor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/floatingtbl_with_formula.docx create mode 100644 sw/qa/extras/ooxmlexport/data/floattable-nested-cell-start.odt create mode 100644 sw/qa/extras/ooxmlexport/data/floattable-nested.odt create mode 100644 sw/qa/extras/ooxmlexport/data/fly_fieldmark.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/font-name-is-empty.docx create mode 100644 sw/qa/extras/ooxmlexport/data/footer-body-distance.docx create mode 100644 sw/qa/extras/ooxmlexport/data/footer-contain-hyperlink.docx create mode 100644 sw/qa/extras/ooxmlexport/data/footer-margin-lost.docx create mode 100644 sw/qa/extras/ooxmlexport/data/footnote.docx create mode 100644 sw/qa/extras/ooxmlexport/data/footnotesep.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/frame-wrap-auto.docx create mode 100644 sw/qa/extras/ooxmlexport/data/frame.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/frame_size_export.docx create mode 100644 sw/qa/extras/ooxmlexport/data/glossaryWithEmail.docx create mode 100644 sw/qa/extras/ooxmlexport/data/grabbag.docx create mode 100644 sw/qa/extras/ooxmlexport/data/gradient-fill-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/graphic-object-fliph.docx create mode 100644 sw/qa/extras/ooxmlexport/data/gridbefore.docx create mode 100644 sw/qa/extras/ooxmlexport/data/grouped_link.docx create mode 100644 sw/qa/extras/ooxmlexport/data/groupshape-picture.docx create mode 100644 sw/qa/extras/ooxmlexport/data/groupshape-rotation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/groupshape-smarttag.docx create mode 100644 sw/qa/extras/ooxmlexport/data/groupshape-textbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/groupshape-theme-font.docx create mode 100644 sw/qa/extras/ooxmlexport/data/groupshape-trackedchanges.docx create mode 100644 sw/qa/extras/ooxmlexport/data/gutter-left.docx create mode 100644 sw/qa/extras/ooxmlexport/data/gutter-top.docx create mode 100644 sw/qa/extras/ooxmlexport/data/header-border.docx create mode 100644 sw/qa/extras/ooxmlexport/data/hello.docm create mode 100644 sw/qa/extras/ooxmlexport/data/hello.docx create mode 100644 sw/qa/extras/ooxmlexport/data/hidemark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/hyperlink-field.odt create mode 100644 sw/qa/extras/ooxmlexport/data/hyperlink.docx create mode 100644 sw/qa/extras/ooxmlexport/data/hyperlinkshape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/hyphenation.odt create mode 100644 sw/qa/extras/ooxmlexport/data/i120928.docx create mode 100644 sw/qa/extras/ooxmlexport/data/i124106.docx create mode 100644 sw/qa/extras/ooxmlexport/data/image-comment-at-char.docx create mode 100644 sw/qa/extras/ooxmlexport/data/image-noborder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/image_data.docx create mode 100644 sw/qa/extras/ooxmlexport/data/image_through_shape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/imgshadow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/indentation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/indents.docx create mode 100644 sw/qa/extras/ooxmlexport/data/inheritFirstHeader.docx create mode 100644 sw/qa/extras/ooxmlexport/data/inline-groupshape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/inline-sdt-header.docx create mode 100644 sw/qa/extras/ooxmlexport/data/internal_hyperlink_frame.odt create mode 100644 sw/qa/extras/ooxmlexport/data/internal_hyperlink_ole.odt create mode 100644 sw/qa/extras/ooxmlexport/data/internal_hyperlink_region.odt create mode 100644 sw/qa/extras/ooxmlexport/data/internal_hyperlink_table.odt create mode 100644 sw/qa/extras/ooxmlexport/data/invalid_date_form_field.docx create mode 100644 sw/qa/extras/ooxmlexport/data/kde216114-1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/kde302504-1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/kern.docx create mode 100644 sw/qa/extras/ooxmlexport/data/large-twips.docx create mode 100644 sw/qa/extras/ooxmlexport/data/lastEmptyLineWithDirectFormatting.docx create mode 100644 sw/qa/extras/ooxmlexport/data/layout-flow-alt-alone.docx create mode 100644 sw/qa/extras/ooxmlexport/data/libreoffice.png create mode 100644 sw/qa/extras/ooxmlexport/data/listWithLgl.docx create mode 100644 sw/qa/extras/ooxmlexport/data/list_notcounted_indent.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/longBookmarkName.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/lorem_hyperlink.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/lvlPicBulletId.docx create mode 100644 sw/qa/extras/ooxmlexport/data/mailmerge.docx create mode 100644 sw/qa/extras/ooxmlexport/data/margins_from_style.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-accents.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-d.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-escape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-escaping.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-lim.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-literal.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-matrix.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-mso2k7.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-nary.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-overbrace_underbrace.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-overstrike.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-placeholders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-rad.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-subscripts.docx create mode 100644 sw/qa/extras/ooxmlexport/data/math-vertical_stacks.docx create mode 100644 sw/qa/extras/ooxmlexport/data/mathtype.docx create mode 100644 sw/qa/extras/ooxmlexport/data/mce-nested.docx create mode 100644 sw/qa/extras/ooxmlexport/data/mce-wpg.docx create mode 100644 sw/qa/extras/ooxmlexport/data/mce.docx create mode 100644 sw/qa/extras/ooxmlexport/data/missing-path.docx create mode 100644 sw/qa/extras/ooxmlexport/data/missing_newline.odt create mode 100644 sw/qa/extras/ooxmlexport/data/mso-spt180.docx create mode 100644 sw/qa/extras/ooxmlexport/data/msobrightnesscontrast.docx create mode 100644 sw/qa/extras/ooxmlexport/data/multi-column-line-separator-SAVED.docx create mode 100644 sw/qa/extras/ooxmlexport/data/multi-column-separator-with-line.docx create mode 100644 sw/qa/extras/ooxmlexport/data/multi-page-toc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/multi_space_url.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/n592908-frame.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n592908-picture.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n652364.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n693238.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n705956-1.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n705956-2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n747461.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n750255.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n751054.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n751117.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n764005.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n766481.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n766487.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n775906.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n777337.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n778828.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n778836.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n779630.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n779642.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n779834.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n779941.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n780563.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n780843.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n780843b.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n780853.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n782345.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n783638.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n785767.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n789482.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n792778.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n793262.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n793998.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n816593.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n820509.docx create mode 100644 sw/qa/extras/ooxmlexport/data/n822175.odt create mode 100644 sw/qa/extras/ooxmlexport/data/n830205.docx create mode 100644 sw/qa/extras/ooxmlexport/data/negative-cell-margin-twips.docx create mode 100644 sw/qa/extras/ooxmlexport/data/nested-text-frames.odt create mode 100644 sw/qa/extras/ooxmlexport/data/nestedAlternateContent.docx create mode 100644 sw/qa/extras/ooxmlexport/data/no-numlevel-but-indented.odt create mode 100644 sw/qa/extras/ooxmlexport/data/noDefault.docx create mode 100644 sw/qa/extras/ooxmlexport/data/non_ascii_link.docx create mode 100644 sw/qa/extras/ooxmlexport/data/nonbmpchar.docx create mode 100644 sw/qa/extras/ooxmlexport/data/num-override-lvltext.docx create mode 100644 sw/qa/extras/ooxmlexport/data/num-override-start.docx create mode 100644 sw/qa/extras/ooxmlexport/data/num-parent-style.docx create mode 100644 sw/qa/extras/ooxmlexport/data/number-portion-format.odt create mode 100644 sw/qa/extras/ooxmlexport/data/numbering-font.docx create mode 100644 sw/qa/extras/ooxmlexport/data/numbering1.docx create mode 100644 sw/qa/extras/ooxmlexport/data/numlist-zhcn.odt create mode 100644 sw/qa/extras/ooxmlexport/data/numlist-zhtw.odt create mode 100644 sw/qa/extras/ooxmlexport/data/object_cross_reference.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo106020-1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo30436-1-minimized.sxw create mode 100644 sw/qa/extras/ooxmlexport/data/ooo34469-1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo39250-1-min.rtf create mode 100644 sw/qa/extras/ooxmlexport/data/ooo39845-7.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo47778-3.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo47778-4.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo67471-2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo72950-1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooo96040-2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/ooxml-triangle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/open-as-read-only.docx create mode 100644 sw/qa/extras/ooxmlexport/data/outline-number-types.odt create mode 100644 sw/qa/extras/ooxmlexport/data/page-background.docx create mode 100644 sw/qa/extras/ooxmlexport/data/page-border-shadow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/page-borders-export-case-2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/page-break-before.docx create mode 100644 sw/qa/extras/ooxmlexport/data/page-content-bottom.docx create mode 100644 sw/qa/extras/ooxmlexport/data/page-graphic-background.odt create mode 100644 sw/qa/extras/ooxmlexport/data/pageBreak_after.odt create mode 100644 sw/qa/extras/ooxmlexport/data/pagerelsize.docx create mode 100644 sw/qa/extras/ooxmlexport/data/para-adjust-distribute.docx create mode 100644 sw/qa/extras/ooxmlexport/data/para-auto-spacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/para-shading.docx create mode 100644 sw/qa/extras/ooxmlexport/data/para-shadow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/para-style-char-position.docx create mode 100644 sw/qa/extras/ooxmlexport/data/para-style-num-level.docx create mode 100644 sw/qa/extras/ooxmlexport/data/paragraph-mark-nonempty.odt create mode 100644 sw/qa/extras/ooxmlexport/data/paragraph-mark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/paragraph-mark2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/paragraph-sdt.docx create mode 100644 sw/qa/extras/ooxmlexport/data/paragraphWithComments.docx create mode 100644 sw/qa/extras/ooxmlexport/data/parasplit-on-section-border.odt create mode 100644 sw/qa/extras/ooxmlexport/data/picture-artistic-effects-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/picture-effects-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/picture-with-schemecolor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx create mode 100644 sw/qa/extras/ooxmlexport/data/pictureWatermark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/picture_colormode_black_white.odt create mode 100644 sw/qa/extras/ooxmlexport/data/picture_colormode_grayscale.docx create mode 100644 sw/qa/extras/ooxmlexport/data/picture_colormode_watermark.odt create mode 100644 sw/qa/extras/ooxmlexport/data/plausable-border.docx create mode 100644 sw/qa/extras/ooxmlexport/data/position-and-rotation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/preserve_Z_field_TOC.docx create mode 100644 sw/qa/extras/ooxmlexport/data/preset-shape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/protectedform.docx create mode 100644 sw/qa/extras/ooxmlexport/data/quicktables.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rel-size-round.docx create mode 100644 sw/qa/extras/ooxmlexport/data/relative-link.docx create mode 100644 sw/qa/extras/ooxmlexport/data/relorientation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rhbz1180114.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rhbz988516.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rot180-flipv.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rot270-flipv.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rot90-fliph.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rotated_shape.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/rprchange_closed.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rtl-gutter.docx create mode 100644 sw/qa/extras/ooxmlexport/data/rubyhyperlink.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/sample.dotx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-2-para.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-2-run.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-alias.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-before-field.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-date-duplicate.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-duplicated-id.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-header.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-ignored-footer.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt-run-picture.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sdt_after_section_break.docx create mode 100644 sw/qa/extras/ooxmlexport/data/section_break_after_table.docx create mode 100644 sw/qa/extras/ooxmlexport/data/section_break_numbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/sectionprot.odt create mode 100644 sw/qa/extras/ooxmlexport/data/sectionprot2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/shape-3d-effect-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/shape-atpage-in-table.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/shape-in-floattable.docx create mode 100644 sw/qa/extras/ooxmlexport/data/shape-theme-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/signature-line-all-props-set.docx create mode 100644 sw/qa/extras/ooxmlexport/data/simple-sdts.docx create mode 100644 sw/qa/extras/ooxmlexport/data/smartart.docx create mode 100644 sw/qa/extras/ooxmlexport/data/strict-smartart.docx create mode 100644 sw/qa/extras/ooxmlexport/data/strict.docx create mode 100644 sw/qa/extras/ooxmlexport/data/style-inheritance.docx create mode 100644 sw/qa/extras/ooxmlexport/data/symbol_chicago_list.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-alignment.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-auto-nested.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-black_fill.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-borders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-btlr-center.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-cell-margin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-floating-margins.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-floating.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-ltr.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-pagebreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-position-14.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-position-15.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-row-data-displayed-twice.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-rtl.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-start-2-sdt.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-style-border-export.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-style-border.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-style-cell-back-color.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-style-conf-nested.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-style-parprop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-style-rPr-sz.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table-theme-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/table.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tableCurrupt.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tablePreferredWidth.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table_atleast.docx create mode 100644 sw/qa/extras/ooxmlexport/data/table_cross_reference.odt create mode 100644 sw/qa/extras/ooxmlexport/data/table_cross_reference_custom_format.odt create mode 100644 sw/qa/extras/ooxmlexport/data/table_lineRule.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tableborder-finedash.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tblppr-shape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tblr-height.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tbrl-frame-vml.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tbrl-textbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf100075.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf100581.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf100751_arrowBothFlip.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf101122_noFillForCustomShape.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf101589_dontSplitTable.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf102466.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103001.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103090.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103389.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103544.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103573.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103651.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakB.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakC.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakD.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakE.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103976.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf103982.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104061_tableSectionColumns.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104115.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104150.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104162.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104354-2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104354.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104354_firstParaInSection.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104394_lostTextbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104418.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104420_lostParagraph.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104539.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104565_ArrowPosition.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104707_urlComment.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104713_undefinedStyles.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104797.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf104823.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105035_framePrB.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105035_framePrC.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105095.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105215.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105444.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105485.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105490_negativeMargins.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105688.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf105875_VmlShapeRotationWithFlip.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106001-2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106001.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106062_nonHangingFootnote.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106132.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106174_rtlParaAlign.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106492.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106541_noinheritChapterNumbering.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106690-cell.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106690.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106724.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106843.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106953.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106970.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf106974_int32Crop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107020.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107033.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107035.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107104.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107111.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107119.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107359-char-pitch.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107618.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107626.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107684.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107837.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107889.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf107969.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108269.docm create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108350_noFontdefaults.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108493.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108496.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108505.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108682.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108944_footnoteSeparator2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108973_backgroundTextbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf108973_foregroundTextbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf109063.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf109184.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf109306.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf111964.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112103_tablebgnofill.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112118.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112169.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112287.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112287B.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112312_AutoFitForLegacyShapes.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112352_nextPageColumns.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf112446_frameStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf113183.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf113258.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf113258_noBeforeAutospacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf113399.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf113547.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf113608_runAwayNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf114308.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf114537_conditional-text2.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf114703.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf114734_commentFormating.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf114882.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf115030.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf115094v3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf115212.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf115557.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf115719.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf115719b.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf115861.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116084.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116194.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116371.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116394.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116410.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116436_rowFill.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116801.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116883.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116976.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf116985.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf117137.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf117297_tableStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf117504_numberingIndent.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf117805.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf117988.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118169.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118242.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118361_RTLfootnoteSeparator.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118521_marginsLR.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118535.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118682.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118691.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118701.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118702.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118812_tableStyles-comprehensive.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119037.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119054.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119143.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119188_list_margin_in_cell.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119201.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119760_positionCellBorder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119760_tableInTablePosition.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119800.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119809.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf119952_negativeMargins.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120224_textControlCrossRef.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120315.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120338.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120344_FontTypes.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120394.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120412_400PercentSubscript.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120511_eatenSection.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyProtection.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyUnProtected.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121045.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121176.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF2.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121441.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121456.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121456_tabsOffset.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121597.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121658.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121659_loseColumnBrNextToShape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121661.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121663.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121665_back2backColumnBreaks.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121666_lostPage.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121669_equalColumns.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121670_columnsInSectionsOnly.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121784.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf121867.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf122186_input_list.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf122201_editUnprotectedText.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf122342.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf122563.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf122594.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf122648.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123054.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123104.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123116_oversizedRowSplit.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123243.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123262_textFootnoteSeparators.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginHasHeader.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginNoHeader.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123346_ArrowMarker.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123351_UnderlineGroupSapeText.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123354.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123355.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123356.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123381.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123382.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123386.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123388.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123389.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123390.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123401.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123435.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123460.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123610_handle_upright.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123621.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123622.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123627.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123628.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak4.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123642.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123705.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123757.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123873.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf123912_protectedForm.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124367.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124384.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124399_SingleCellTableBorders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124472.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124491.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124594.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124600b.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124604.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124637_sectionMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124678_no_leading_paragraph.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124678_with_leading_paragraph.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124795-5.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf124986.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125038_conditionalText3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125268.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125298_crossreflink_nonascii_charlimit.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125324.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125338.docm create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125518.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125546.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125657.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125778_lostPageBreakTOX.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125894.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf125936_numberingSuperscript.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126206.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126245.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126287.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126590.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126723.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126768.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126792.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent0.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf126994_lostPageBreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127085.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127116.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127316_autoEscapement.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127339.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127362.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127579.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127605.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127622_framePr.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127741.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127814.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127864.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf127925.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128156.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128207.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128245.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128290.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128304.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128646.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128752.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128820.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128889.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf128913.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129242_InsideBorders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129353.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129442_RightBorder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129450_BottomBorder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129452_BottomBorders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129452_excessBorder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129522_removeShadowStyle.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129525.rtf create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129575-directAfter.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129575-directBefore.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129575-docDefault.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129575-styleAfter.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129888dml.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf129888vml.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf130088.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf130120.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf130494.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf130610_bold_in_2_styles.ott create mode 100644 sw/qa/extras/ooxmlexport/data/tdf130690.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf130814.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf130907.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131203.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131258.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131260.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131420.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131537.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131539.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131540.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131561_necessaryBorder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131594.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131722.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131775_SpacingGroupShapeText.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131776_StrikeoutGroupShapeText.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131801.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf131922_LanguageInGroupShape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132149_pgBreakB.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132185.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132271.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132305.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132475_printField.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132483.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132491_UnderlineColorGroupedShapes.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132514.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132752.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132754.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132766.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132802.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132807.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf132976_testRelativeAnchorWidthFromLeftMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133000_numStyleFormatting.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133030.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133035.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133045_TestShapeAlignmentRelativeFromTopMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133052.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133065.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginHasFooter.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginNoFooter.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133163.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133334_followPgStyle.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133363.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133370_columnBreak.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133455.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133457.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133473.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133605.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133605_2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133643.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133647.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133670_testRelativeAnchorWidthFromRightMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133701.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133702.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133771.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133861_RelativeAnchorWidthFromInsideOutsideMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf133924.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134063.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134114_allowOverlap.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134260.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134569_nestedTable.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134606.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134609_gridAfter.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134618.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134619_numberingProps.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134648.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134649_pageBreak.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134784.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf134951_duplicates.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135047_ImageSpaceSettings.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135164_cancelledNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135187.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135329_lostImage.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c12v3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14v2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c15.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap_c12.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135653.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135655.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135660.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135665.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135667.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135774_numberingCRProps.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135774_numberingShading.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135786.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135906.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135923-min.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135943_shapeWithText_LayoutInCell0_compat15.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135949_anchoredBeforeBreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf135973.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136059.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonCurve.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonLineShape.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136404.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136441_commentInFootnote.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136589_paraHadField.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136617.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136667.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136814.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136841.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136850.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136929_framesOfParagraph.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf136952_pgBreak3B.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137295.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137466.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137593.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137641_RelativeFromTopMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137642_Vertical_Alignment_toppage.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137655.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137678_testVmlLineShapeMirroredY.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137683_charHighlightTests.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137742.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137765_testVmlLineShapeRotated.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137850_compat14ZOrder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf137850_compat15ZOrder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138093.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138345_charStyleHighlight.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138345_numberingHighlight.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138374.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138612.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138739.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138771.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138780.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138892_noNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf138899.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf139128.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf139549.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf139580.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf139759_commentHighlightBackground.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf139948.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf140137.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf140182_extraPagebreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf140336_paraNoneShading.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf140597.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf140668.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141172.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141173_missingFrames.rtf create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141231_arabicHebrewNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141548.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141550.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141660.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumberTortureTest.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142361ShadowDirection.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142387.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142404_tabOverMarginC15.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142404_tabOverSpacingC15.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142404_tabSpacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142407.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142433_WrapPolygonCustomShape.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142464_ampm.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142486_FrameShadow.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142486_LeftMarginShadowLeft.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142693_hugePaperSizeImport.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf142700.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143175.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_glow_rotate.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_stroke_shadow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143384_tableInFoot_negativeMargins.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143399.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143432_Frame_WrapTextMode.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143583_emptyParaAtEndOfFootnote.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143692_outlineLevelTortureTest.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf143860_NonPrimitiveCustomShape.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf144362.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf144563.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf144668.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf145998_unnecessaryPageStyles.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146171.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146346.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146491.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146515.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146802.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146851_1.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146851_2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146955.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf146984_anchorInShape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf147115_defaultStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf147646_mergedCellNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf147724.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf147810.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf147861_customField.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf147892.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf147978_enhancedPath_commandABVW.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148026.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148052.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148111.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148132.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148360.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148361.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148380_createField.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148380_fldLocked.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148380_modifiedField.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148380_printField.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148380_usernameField.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148455_1.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148455_2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148494.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148671.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148720.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148834_lineNumbering.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148952.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf148956_directEndFormatting.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149089.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149198.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149200.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149313.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149388.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149388_fly.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149546.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149551_mongolianVert.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149649.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149708.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf149711.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf150166.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf150542.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf150824.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf150966_regularInset.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf151548_activeContentDemo.docm create mode 100644 sw/qa/extras/ooxmlexport/data/tdf151704_thinColumnHeight.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf151912.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf152200-field+textbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf152203.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf152425.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf152506.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153042_largeTab.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153042_noTab.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153104.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153128.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153255.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153526_commentInNumbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153592_columnBreaks.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak6.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_sdtAfterPgBreak.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153804.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153891.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak14.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak15.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154129_framePr1.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154478.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154481.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154703_framePr.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154703_framePr2.rtf create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154703_framePrTextDirection.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154703_framePrWrapSpacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf154751_dualStrikethrough.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf155690.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf155736_PageNumbers_footer.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf155903.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf155945.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf156372.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf157011_ins_del_empty_cols.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf157136_TwoContentControls.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf157572_defaultVAnchor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf157598.docx create mode 100755 sw/qa/extras/ooxmlexport/data/tdf158044.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf158436.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf36117_verticalAdjustment.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf37153_considerWrapOnObjPos.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf38778_properties_in_run_for_field.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf41466_testVmlShapeWithTextbox.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf41542_borderlessPadding.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf41542_imagePadding.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf44278.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf44832_section_new_header.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf44986.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf46938_clearTabStop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf46940_dontEquallyDistributeColumns.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf48569.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf49073.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf53856_conflictingStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf55427_footnote2endnote.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf57589_hashColor.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf59274.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf59699.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf64264.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf64372_continuousBreaks.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf64531.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf65955.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf65955_2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf66039.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf66398_permissions.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf66401.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf66496.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf67207.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf70234.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf73499.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf73547-dash.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf76022_textboxWrap.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf76683_negativeTwipsMeasure.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf77219_backgroundShape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf77219_foregroundShape.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf77236_MissingSolidFill.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf77417.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf77796.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf78352.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf78657_picture_hyperlink.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf78749.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf78902.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf79272_strictDxa.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf79329.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf80526_word_wrap.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf81100.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf81345.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf81507.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf81567.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf82065_Ind_start_strict.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf82173_endnoteStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf82173_footnoteStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf82175_noStyleInheritance.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf82177_insideCellBorders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf82177_outsideCellBorders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf82177_tblBorders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf8255.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf83227.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf83300.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf83309.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf84678.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf85161.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf86374.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf86926_A3.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf87348_linkedTextboxes.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf87460.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf87569_drawingml.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf87569_vml.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf87924.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf88496.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf88583.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf89165.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf89377_tableWithBreakBeforeParaStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf89702.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf89774.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf89791.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf89890.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf89991.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90153.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90611.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90681-1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90681-2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90697_complexBreaksHeaders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90789-2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90789.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90810short.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90906_colAuto.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf90906_colAutoB.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf91122.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf91260.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf91261.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf91417.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf91429.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf91594.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92045.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92124.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92157.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92335.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92454.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92470_footnoteRestart.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92472.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92521.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92524_autoColor.doc create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92526_ShapeLineWidth.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf93676-1.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf93919.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf94043.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf94374.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf94628.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf94801.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95031.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95033.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95189.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95213.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95367_inheritFollowStyle.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95374.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95376.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95377.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95495.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95775.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95777.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95848.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf95848_2.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf96750_landscapeFollow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf97090.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf97371.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf97517_testVmlLineShapeMirroredX.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf97618_testVmlShapeTextWordWrap.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf97648_relativeWidth.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf98000_changePageStyle.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf98620_environmentBiDi.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf98700_keepWithNext.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99074.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99090_pgbrkAfterTable.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99140.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99227.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript2.odt create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99602_subscript_charStyleSize.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99616_hidemarkb.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99631.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tdf99810-lost-arrow.odt create mode 100644 sw/qa/extras/ooxmlexport/data/test76108.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test76317.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test76317_2K10.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test76734_2K7.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test77219.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testCrashWhileSave.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testCustomShapePresetExport.odt create mode 100644 sw/qa/extras/ooxmlexport/data/testFootnote.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testGlossary.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testOuterShdw.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testPageref.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testParaListRightIndent.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testPgMargin.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTOCFlag_u.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTcBorders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTdf130167_spilloverHeader.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTextBoxZOrder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTitlePage.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedEmptyParagraph.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedParagraphMark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableCell.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableRow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesEmptyParagraphsInADeletion.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedParagraphMark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableCell.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableRow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testTrackChangesParagraphProperties.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testWPGZOrder.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testWPGtextboxes.docx create mode 100644 sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_GIF_ImageCrop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_PNG_ImageCrop.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_extra_image.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_indentation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_line_spacing.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_msword_hang.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_ole_object.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_sdt_datepicker.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_segfault_while_save.docx create mode 100644 sw/qa/extras/ooxmlexport/data/test_tdf120412.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textWatermark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/text_cardinal_list.docx create mode 100644 sw/qa/extras/ooxmlexport/data/text_number_list.docx create mode 100644 sw/qa/extras/ooxmlexport/data/text_ordinal_list.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textbox-right-edge.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textbox-rounded-corners.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textbox-table.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textbox-wpg-only.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textbox_picturefill.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textframe-borders.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textframe-gradient.docx create mode 100644 sw/qa/extras/ooxmlexport/data/textframes.odt create mode 100644 sw/qa/extras/ooxmlexport/data/textinput.odt create mode 100644 sw/qa/extras/ooxmlexport/data/theme-preservation.docx create mode 100644 sw/qa/extras/ooxmlexport/data/toc_doc.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tools-line-numbering.docx create mode 100644 sw/qa/extras/ooxmlexport/data/toxmarkhyperlink.fodt create mode 100644 sw/qa/extras/ooxmlexport/data/transparent-shadow.docx create mode 100644 sw/qa/extras/ooxmlexport/data/tscp.docx create mode 100644 sw/qa/extras/ooxmlexport/data/unbalanced-columns.docx create mode 100644 sw/qa/extras/ooxmlexport/data/unwanted-section-break.docx create mode 100644 sw/qa/extras/ooxmlexport/data/vml-text-vertical-adjust.docx create mode 100644 sw/qa/extras/ooxmlexport/data/watermark-font.docx create mode 100644 sw/qa/extras/ooxmlexport/data/watermark-shapetype.docx create mode 100644 sw/qa/extras/ooxmlexport/data/watermark.docx create mode 100644 sw/qa/extras/ooxmlexport/data/wpg-nested.docx create mode 100644 sw/qa/extras/ooxmlexport/data/wpg-only.docx create mode 100644 sw/qa/extras/ooxmlexport/data/wps-char-color.docx create mode 100644 sw/qa/extras/ooxmlexport/data/wps-only.docx create mode 100644 sw/qa/extras/ooxmlexport/data/wrap-tight-through.docx create mode 100644 sw/qa/extras/ooxmlexport/data/zoom.docx create mode 100644 sw/qa/extras/ooxmlexport/ooxml_ThemeExport.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlencryption.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport10.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport11.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport12.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport13.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport14.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport15.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport16.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport17.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport18.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport19.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport2.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport20.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport3.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport4.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport5.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport6.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport7.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport8.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport9.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlexport_template.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmllinks.cxx create mode 100644 sw/qa/extras/ooxmlexport/ooxmlw14export.cxx create mode 100644 sw/qa/extras/ooxmlimport/data/105975.docx create mode 100644 sw/qa/extras/ooxmlimport/data/WordArt.docx create mode 100644 sw/qa/extras/ooxmlimport/data/bnc773061.docx create mode 100644 sw/qa/extras/ooxmlimport/data/bnc779620.docx create mode 100644 sw/qa/extras/ooxmlimport/data/bnc821804.docx create mode 100644 sw/qa/extras/ooxmlimport/data/btlr-frame-vml.docx create mode 100644 sw/qa/extras/ooxmlimport/data/dml-groupshape-paraadjust.docx create mode 100644 sw/qa/extras/ooxmlimport/data/fdo43641.docx create mode 100644 sw/qa/extras/ooxmlimport/data/fdo75722-dml.docx create mode 100644 sw/qa/extras/ooxmlimport/data/fdo75722-vml.docx create mode 100644 sw/qa/extras/ooxmlimport/data/fdo76583.docx create mode 100644 sw/qa/extras/ooxmlimport/data/fdo87488.docx create mode 100644 sw/qa/extras/ooxmlimport/data/floating-table-section-columns.docx create mode 100644 sw/qa/extras/ooxmlimport/data/groupshape-child-rotation.docx create mode 100644 sw/qa/extras/ooxmlimport/data/groupshape-fontname.docx create mode 100644 sw/qa/extras/ooxmlimport/data/groupshape-line.docx create mode 100644 sw/qa/extras/ooxmlimport/data/groupshape-relsize.docx create mode 100644 sw/qa/extras/ooxmlimport/data/groupshape-sdt.docx create mode 100644 sw/qa/extras/ooxmlimport/data/image-hyperlink.docx create mode 100644 sw/qa/extras/ooxmlimport/data/image-lazy-read.docx create mode 100644 sw/qa/extras/ooxmlimport/data/ink.docx create mode 100644 sw/qa/extras/ooxmlimport/data/line-rotation.docx create mode 100644 sw/qa/extras/ooxmlimport/data/line-wps-only.docx create mode 100644 sw/qa/extras/ooxmlimport/data/math-malformed_xml.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n751017.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n751077.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n757890.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n758883.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n760764.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n764745-alignment.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n766477.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n773061.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n775899.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n777345.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n778140.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n779627.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n779627b.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n780645.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n782061.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n820504.docx create mode 100644 sw/qa/extras/ooxmlimport/data/n820788.docx create mode 100644 sw/qa/extras/ooxmlimport/data/numbering-circle.docx create mode 100644 sw/qa/extras/ooxmlimport/data/ole-anchor.docx create mode 100644 sw/qa/extras/ooxmlimport/data/strict-lockedcanvas.docx create mode 100644 sw/qa/extras/ooxmlimport/data/table_width.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf100072.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf100830.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf101626.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf101627.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf103664.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf103931.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf104167.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf105127.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf105143.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf105975.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf106606.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf107784.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf108350.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf108408.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf108545_embeddedDocxIcon.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf108714.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf108806.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf108849.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf109053.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf109316_dropCaps.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf109524.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf111550.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf112443.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf113182.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf113946.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf114212.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf114217.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf115094.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf115094v2.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf115719b.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf115883.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf117843.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf118693.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf119039_bad_embedded_compound.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf119200.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf120547.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf120548.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf120551.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf121203.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf121440.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf121664.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf121804.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf122224.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf122717.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf123386.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf123389.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf124398.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf124600.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf124670.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf124754.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf125038.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf125038b.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf125038c.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf126114.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf126426.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf127825.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf128076.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf129237.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf129659.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf129912.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf130214.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf130804.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf131841_HighlightColorGroupedShape.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf133448.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf133647.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf133647_unicode.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf134572.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf136952_pgBreak3.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf141969-font_in_table_with_style.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf143219_ContourWrap_rotate.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf143475_rotatedWord2007image.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf143475_rotatedWord2007imageInline.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf143476_lockedCanvas_image_line.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf143476_lockedCanvas_position.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf143476_lockedCanvas_twoShapes.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf152200-bad_fldChar_end.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf153791-shd_overrides_fontRef.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf154319-ToC_with_s_and_d.docx create mode 100755 sw/qa/extras/ooxmlimport/data/tdf154370.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf154695-ToC_no_numbers.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf156078_rightTabOutsideParaRightIndent.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf43017.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf48658_transparentOLEheader.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf60351.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf74367_MarginsZeroed.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf75573_lostTable.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf75573_page1frame.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf76446.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf82824.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf85232.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf85523.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf87533_bidi.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf95755.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf95970.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf96218.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf96674.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf97038.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf98882.docx create mode 100644 sw/qa/extras/ooxmlimport/data/tdf99135.docx create mode 100644 sw/qa/extras/ooxmlimport/data/testfdo90720.docx create mode 100644 sw/qa/extras/ooxmlimport/data/text-copy.docx create mode 100644 sw/qa/extras/ooxmlimport/data/textbox-wps-only.docx create mode 100644 sw/qa/extras/ooxmlimport/data/unbalanced-columns-compat.docx create mode 100644 sw/qa/extras/ooxmlimport/data/vml-adjustments.docx create mode 100644 sw/qa/extras/ooxmlimport/data/xml_space.docx create mode 100644 sw/qa/extras/ooxmlimport/ooxmlimport.cxx create mode 100644 sw/qa/extras/ooxmlimport/ooxmlimport2.cxx create mode 100644 sw/qa/extras/pdf/HybridPdfTest.cxx create mode 100644 sw/qa/extras/pdf/data/Hybrid_AdditionalStreamsAndPDFAttachedFile.pdf create mode 100644 sw/qa/extras/pdf/data/Hybrid_AdditionalStreamsOnly.pdf create mode 100644 sw/qa/extras/pdf/data/PDFOnly.pdf create mode 100644 sw/qa/extras/rtfexport/data/FORMDROPDOWN.rtf create mode 100644 sw/qa/extras/rtfexport/data/abi10039.odt create mode 100644 sw/qa/extras/rtfexport/data/abi10076.odt create mode 100644 sw/qa/extras/rtfexport/data/all_gaps_word.rtf create mode 100644 sw/qa/extras/rtfexport/data/anchor.fodt create mode 100644 sw/qa/extras/rtfexport/data/arabic-zero-numbering.rtf create mode 100644 sw/qa/extras/rtfexport/data/bin-skipping.rtf create mode 100644 sw/qa/extras/rtfexport/data/bookmark.rtf create mode 100644 sw/qa/extras/rtfexport/data/btlr-cell.rtf create mode 100644 sw/qa/extras/rtfexport/data/btlr-frame.odt create mode 100644 sw/qa/extras/rtfexport/data/char-color.rtf create mode 100644 sw/qa/extras/rtfexport/data/charborder.odt create mode 100644 sw/qa/extras/rtfexport/data/cjklist12.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist13.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist16.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist20.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist21.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist24.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist25.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist30.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist31.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist34.rtf create mode 100644 sw/qa/extras/rtfexport/data/cjklist38.rtf create mode 100644 sw/qa/extras/rtfexport/data/classification-confidential.rtf create mode 100644 sw/qa/extras/rtfexport/data/classification-no.rtf create mode 100644 sw/qa/extras/rtfexport/data/classification-yes.rtf create mode 100644 sw/qa/extras/rtfexport/data/clearing-break.rtf create mode 100644 sw/qa/extras/rtfexport/data/comments-nested.odt create mode 100644 sw/qa/extras/rtfexport/data/copypaste-footnote-paste.rtf create mode 100644 sw/qa/extras/rtfexport/data/copypaste-footnote.rtf create mode 100644 sw/qa/extras/rtfexport/data/copypaste-pagestyle-paste.rtf create mode 100644 sw/qa/extras/rtfexport/data/copypaste-pagestyle.rtf create mode 100644 sw/qa/extras/rtfexport/data/cp1000018.rtf create mode 100644 sw/qa/extras/rtfexport/data/cs-bold.rtf create mode 100644 sw/qa/extras/rtfexport/data/custom-doc-props.rtf create mode 100644 sw/qa/extras/rtfexport/data/do-dhgt-old.rtf create mode 100644 sw/qa/extras/rtfexport/data/do-dhgt.rtf create mode 100644 sw/qa/extras/rtfexport/data/dplinehollow.rtf create mode 100644 sw/qa/extras/rtfexport/data/dppolyline.rtf create mode 100644 sw/qa/extras/rtfexport/data/dprect-anchor.rtf create mode 100644 sw/qa/extras/rtfexport/data/dptxbx-relation.rtf create mode 100644 sw/qa/extras/rtfexport/data/em.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo30983.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo32613.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo36089.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo37716.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo38176.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo38244.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo38786.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo39001.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo39053.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo42109.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo42465.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo43965.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo44053.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo44174.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo44176.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo44211.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo44715.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo45187.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo45394.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo45543.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo45553.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo45563.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo46955.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo46966.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo47107.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo47326.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo47495.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo47764.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo47802.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48023.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48033.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48037.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48104.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48193.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48335.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo48356.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48440.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48446.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo48876.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo49271.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo49501.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo49655.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo49659.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo49683.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo49893-2.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo49934.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo50087.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo50539.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo50665.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo50831.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo51916.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo52286.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo52389.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo52475.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo52989.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo53113.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo53594.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo53604.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo54473.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo54612.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo54900.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo55493.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo55939.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo56512.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo57678.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo57886.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo58076-2.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo58076.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo58646.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo58646line.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo58933.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo59419.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo59638.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo60722.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo61193.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo61507.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo61909.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo62044-paste.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo62044.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo62288.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo62805.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo62977.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo63023.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo63428.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo64637.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo64671.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo65090.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo66040.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo66682.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo66743.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo67498.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo68076.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo68779.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo68787.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo69289.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo69384-paste.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo70221.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo70578.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo72031.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo73241.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo74229.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo74709.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo75735.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo76628.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo76633.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo77267.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo77600.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo77979.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo77996.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo78502.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo78758.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo79384.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo79959.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo80167.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo80905.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo81892.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo82006.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo82076.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo82078.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo82106.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo82858.docx create mode 100644 sw/qa/extras/rtfexport/data/fdo82859.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo82860.odt create mode 100644 sw/qa/extras/rtfexport/data/fdo83204.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo83464.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo84679.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo85889-mac.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo85889-pc.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo85889-pca.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo86750.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo86761.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo89496.rtf create mode 100644 sw/qa/extras/rtfexport/data/fdo94835.rtf create mode 100644 sw/qa/extras/rtfexport/data/font-override.rtf create mode 100644 sw/qa/extras/rtfexport/data/footer-para.rtf create mode 100644 sw/qa/extras/rtfexport/data/graphic-object-fliph.rtf create mode 100644 sw/qa/extras/rtfexport/data/gutter-left.rtf create mode 100644 sw/qa/extras/rtfexport/data/gutter-top.rtf create mode 100644 sw/qa/extras/rtfexport/data/hello.rtf create mode 100644 sw/qa/extras/rtfexport/data/hexcrlf.rtf create mode 100644 sw/qa/extras/rtfexport/data/hidden-linebreaks.rtf create mode 100644 sw/qa/extras/rtfexport/data/hyperlink-target.rtf create mode 100644 sw/qa/extras/rtfexport/data/hyperlink.rtf create mode 100644 sw/qa/extras/rtfexport/data/hyperlink_empty.rtf create mode 100644 sw/qa/extras/rtfexport/data/hyphauto.rtf create mode 100644 sw/qa/extras/rtfexport/data/hyphpar.rtf create mode 100644 sw/qa/extras/rtfexport/data/i120928.rtf create mode 100644 sw/qa/extras/rtfexport/data/invalidParagraphStyle.rtf create mode 100644 sw/qa/extras/rtfexport/data/landscape.rtf create mode 100644 sw/qa/extras/rtfexport/data/leftmargin-default.rtf create mode 100644 sw/qa/extras/rtfexport/data/levelfollow.rtf create mode 100644 sw/qa/extras/rtfexport/data/leveljc-center.rtf create mode 100644 sw/qa/extras/rtfexport/data/linenumbering.rtf create mode 100644 sw/qa/extras/rtfexport/data/margmirror.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-accents.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-d.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-eqarray.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-escaping.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-lim.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-limupp.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-matrix.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-mbox.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-mso2007.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-nary.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-placeholders.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-rad.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-runs.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-sepchr.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-strikeh.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-subscripts.rtf create mode 100644 sw/qa/extras/rtfexport/data/math-vertical-stacks.rtf create mode 100644 sw/qa/extras/rtfexport/data/mathtype.rtf create mode 100644 sw/qa/extras/rtfexport/data/mnor.rtf create mode 100644 sw/qa/extras/rtfexport/data/mw00_table_of_contents_templates.doc create mode 100644 sw/qa/extras/rtfexport/data/n192129.rtf create mode 100644 sw/qa/extras/rtfexport/data/n750757.rtf create mode 100644 sw/qa/extras/rtfexport/data/n751020.rtf create mode 100644 sw/qa/extras/rtfexport/data/n757651.rtf create mode 100644 sw/qa/extras/rtfexport/data/n818997.rtf create mode 100644 sw/qa/extras/rtfexport/data/n818997B.rtf create mode 100644 sw/qa/extras/rtfexport/data/n820504.rtf create mode 100644 sw/qa/extras/rtfexport/data/n825305.rtf create mode 100644 sw/qa/extras/rtfexport/data/num-override-start.rtf create mode 100644 sw/qa/extras/rtfexport/data/numbering-font.rtf create mode 100644 sw/qa/extras/rtfexport/data/page-background.rtf create mode 100644 sw/qa/extras/rtfexport/data/page-border.rtf create mode 100644 sw/qa/extras/rtfexport/data/page-break-emptyparas-spltpgpar.rtf create mode 100644 sw/qa/extras/rtfexport/data/page-break-emptyparas.rtf create mode 100644 sw/qa/extras/rtfexport/data/para-adjust-distribute.rtf create mode 100644 sw/qa/extras/rtfexport/data/para-border.rtf create mode 100644 sw/qa/extras/rtfexport/data/para-bottom-margin.rtf create mode 100644 sw/qa/extras/rtfexport/data/para-shadow.rtf create mode 100644 sw/qa/extras/rtfexport/data/para-style-bottom-margin-2.rtf create mode 100644 sw/qa/extras/rtfexport/data/pgndec.rtf create mode 100644 sw/qa/extras/rtfexport/data/pgnlcltr.rtf create mode 100644 sw/qa/extras/rtfexport/data/pgnlcrm.rtf create mode 100644 sw/qa/extras/rtfexport/data/pgnucrm.rtf create mode 100644 sw/qa/extras/rtfexport/data/picture-wrap-polygon.rtf create mode 100644 sw/qa/extras/rtfexport/data/placeholder.odt create mode 100644 sw/qa/extras/rtfexport/data/record-changes.rtf create mode 100644 sw/qa/extras/rtfexport/data/redline-insdel.rtf create mode 100644 sw/qa/extras/rtfexport/data/redline.rtf create mode 100644 sw/qa/extras/rtfexport/data/relsize.rtf create mode 100644 sw/qa/extras/rtfexport/data/rhbz1065629.rtf create mode 100644 sw/qa/extras/rtfexport/data/rtl-gutter.rtf create mode 100644 sw/qa/extras/rtfexport/data/sautoupd.rtf create mode 100644 sw/qa/extras/rtfexport/data/shptxt-pard.rtf create mode 100644 sw/qa/extras/rtfexport/data/shpz-dhgt.rtf create mode 100644 sw/qa/extras/rtfexport/data/tab-stop-fill-chars.rtf create mode 100644 sw/qa/extras/rtfexport/data/table-rtl.rtf create mode 100644 sw/qa/extras/rtfexport/data/tabs.rtf create mode 100644 sw/qa/extras/rtfexport/data/tbrl-frame.odt create mode 100644 sw/qa/extras/rtfexport/data/tbrl-page.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf100507.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf100961_fixedDateTime.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf103925.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf103956.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104035.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104079.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104081.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104085.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104228.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104287.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104317.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104390.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104744.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104936.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf104937.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf105729.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf105852.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf106694.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf106950.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf106953.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf107116.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf107413.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf107480.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf107620.docx create mode 100644 sw/qa/extras/rtfexport/data/tdf108123.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf108416.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf108505_fieldCharFormat.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf108505_fieldCharFormat2.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf108949_footnote.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf108949_footnoteCharFormat.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf108955.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf109790.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf111851.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf112208_hangingIndent.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf112211.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf112507.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf112520.docx create mode 100644 sw/qa/extras/rtfexport/data/tdf113202.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf113408.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf113550.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf114303.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf114309.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf114333.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf115180.docx create mode 100644 sw/qa/extras/rtfexport/data/tdf116358.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf116371.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf116436_tableBackground.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf116841.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf117268.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf117505.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf118047.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf121623.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf122455.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf122589_firstSection.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf123393.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf123703.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf123703_compatible.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf123703_stshfdbch.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf125719_case_1.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf125719_case_2.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf126309.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf127806.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf128320.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf128428_compatible_monospaced.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf128428_dntblnsbdb.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf128428_monospaced.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf129513.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf129522_removeShadowStyle.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf129578_lostBI.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf129631_lostBorders.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf129631_lostBorders3.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf130817.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf131234.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf133437.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf136587_noStyleName.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf137085.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf137683_charHighlightNone.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf137894.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf138210.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf138779.docx create mode 100644 sw/qa/extras/rtfexport/data/tdf139948.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf141964_numId0.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf144437.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf146489.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf148515.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf148578.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf150267.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf151370.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf152784_1.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153178.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153195.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153613_anchoredAfterPgBreak.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153613_anchoredAfterPgBreak2.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153613_anchoredAfterPgBreak4.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153613_anchoredAfterPgBreak5.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153613_inlineAfterPgBreak.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153613_inlineAfterPgBreak2.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf153681.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf154129_transparentFrame.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf156030.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf158586_lostFrame.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf158586_pageBreak0.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf158586_pageBreak0B.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf158586_pageBreak1.rtf create mode 100755 sw/qa/extras/rtfexport/data/tdf158762.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf158826_extraCR.rtf create mode 100755 sw/qa/extras/rtfexport/data/tdf158830.rtf create mode 100755 sw/qa/extras/rtfexport/data/tdf158978.rtf create mode 100755 sw/qa/extras/rtfexport/data/tdf158982.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf44986.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf49073.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf50821.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf54584.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf61901.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf65642.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf66543.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf74795.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf75614.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf77349.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf80708.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf82073.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf84832.docx create mode 100644 sw/qa/extras/rtfexport/data/tdf86182.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf86814.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf87034.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf88583.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf88811.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf90260-nopar.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf90421.fodt create mode 100644 sw/qa/extras/rtfexport/data/tdf90697.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf91074.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf92061.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf92481.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf92521.odt create mode 100644 sw/qa/extras/rtfexport/data/tdf94043.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf94377.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf94435.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf94456.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf95706.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf95706_2.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf95707.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf96175.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf96275.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf96308-deftab.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf97035.rtf create mode 100644 sw/qa/extras/rtfexport/data/tdf98806.rtf create mode 100644 sw/qa/extras/rtfexport/data/textframe-borders.rtf create mode 100644 sw/qa/extras/rtfexport/data/textframe-gradient.rtf create mode 100644 sw/qa/extras/rtfexport/data/textframe-table.rtf create mode 100644 sw/qa/extras/rtfexport/data/textframes.odt create mode 100644 sw/qa/extras/rtfexport/data/ulw.rtf create mode 100644 sw/qa/extras/rtfexport/data/watermark.rtf create mode 100644 sw/qa/extras/rtfexport/data/zoom.rtf create mode 100644 sw/qa/extras/rtfexport/rtfexport.cxx create mode 100644 sw/qa/extras/rtfexport/rtfexport2.cxx create mode 100644 sw/qa/extras/rtfexport/rtfexport3.cxx create mode 100644 sw/qa/extras/rtfexport/rtfexport4.cxx create mode 100644 sw/qa/extras/rtfexport/rtfexport5.cxx create mode 100644 sw/qa/extras/rtfexport/rtfexport6.cxx create mode 100644 sw/qa/extras/rtfexport/rtfexport7.cxx create mode 100644 sw/qa/extras/rtfexport/rtfexport8.cxx create mode 100644 sw/qa/extras/rtfimport/data/background.rtf create mode 100644 sw/qa/extras/rtfimport/data/behind-doc.rtf create mode 100644 sw/qa/extras/rtfimport/data/chtoutline.rtf create mode 100644 sw/qa/extras/rtfimport/data/classification-no.rtf create mode 100644 sw/qa/extras/rtfimport/data/classification-yes.rtf create mode 100644 sw/qa/extras/rtfimport/data/column-break.rtf create mode 100644 sw/qa/extras/rtfimport/data/cont-section-pagebreak.rtf create mode 100644 sw/qa/extras/rtfimport/data/cp950listleveltext1.rtf create mode 100644 sw/qa/extras/rtfimport/data/cp950listleveltext2.rtf create mode 100644 sw/qa/extras/rtfimport/data/cp950listleveltext3.rtf create mode 100644 sw/qa/extras/rtfimport/data/default-values.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo44984.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo45182.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo45183.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo45190.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo46662.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo47036.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo47440.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo48442.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo49692.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo49892.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo49893-3.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo49893.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo52052.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo52066.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo53556.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo55525.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo57708.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo59953.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo66565.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo67365.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo68291-paste.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo68291.odt create mode 100644 sw/qa/extras/rtfimport/data/fdo74599.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo74823.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo79319.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo80742.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo81033.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo81944.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo82071.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo82114.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo82512.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo84685.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo85179.rtf create mode 100644 sw/qa/extras/rtfimport/data/fdo85812.rtf create mode 100644 sw/qa/extras/rtfimport/data/flip.rtf create mode 100644 sw/qa/extras/rtfimport/data/groupshape-notext.rtf create mode 100644 sw/qa/extras/rtfimport/data/groupshape-rotation.rtf create mode 100644 sw/qa/extras/rtfimport/data/groupshape.rtf create mode 100644 sw/qa/extras/rtfimport/data/hello.rtf create mode 100644 sw/qa/extras/rtfimport/data/hidden-para-separator.rtf create mode 100644 sw/qa/extras/rtfimport/data/ink.rtf create mode 100644 sw/qa/extras/rtfimport/data/libreoffice.png create mode 100644 sw/qa/extras/rtfimport/data/lndscpsxn.rtf create mode 100644 sw/qa/extras/rtfimport/data/n695479.rtf create mode 100644 sw/qa/extras/rtfimport/data/n823655.rtf create mode 100644 sw/qa/extras/rtfimport/data/n823675.rtf create mode 100644 sw/qa/extras/rtfimport/data/ole-inline.rtf create mode 100644 sw/qa/extras/rtfimport/data/para-style-bottom-margin.rtf create mode 100644 sw/qa/extras/rtfimport/data/paste-first-para-direct-format.rtf create mode 100644 sw/qa/extras/rtfimport/data/posh-leftright.rtf create mode 100644 sw/qa/extras/rtfimport/data/posh-posv.rtf create mode 100644 sw/qa/extras/rtfimport/data/sbkeven.rtf create mode 100644 sw/qa/extras/rtfimport/data/sbkodd.rtf create mode 100644 sw/qa/extras/rtfimport/data/section-pagebreak.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf104016.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf105511.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf108055.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf108943.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf108947.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf108951.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf112211-2.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf115153.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf115155.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf115242.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf115715.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf116265.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf116269.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf117246.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf117403.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf119599.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf122430.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf126173.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf128611.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf158044.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf59454.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf59699.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf78506.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf81943.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf84684.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf90046.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf90097.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf90260-par.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf90315.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf91684.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf96308-tabpos.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf96326.rtf create mode 100644 sw/qa/extras/rtfimport/data/tdf99498.rtf create mode 100644 sw/qa/extras/rtfimport/data/unbalanced-columns-compat.rtf create mode 100644 sw/qa/extras/rtfimport/data/unbalanced-columns.rtf create mode 100644 sw/qa/extras/rtfimport/data/watermark.rtf create mode 100644 sw/qa/extras/rtfimport/data/wrap-distance.rtf create mode 100644 sw/qa/extras/rtfimport/rtfimport.cxx create mode 100644 sw/qa/extras/tiledrendering/data/2-pages.odt create mode 100644 sw/qa/extras/tiledrendering/data/cond-coll-copy.odt create mode 100644 sw/qa/extras/tiledrendering/data/double-underline_and_strike-out.fodt create mode 100644 sw/qa/extras/tiledrendering/data/drop_down_form_field.odt create mode 100644 sw/qa/extras/tiledrendering/data/drop_down_form_field2.odt create mode 100644 sw/qa/extras/tiledrendering/data/drop_down_form_field_noitem.odt create mode 100644 sw/qa/extras/tiledrendering/data/drop_down_form_field_noselection.odt create mode 100644 sw/qa/extras/tiledrendering/data/dummy.fodt create mode 100644 sw/qa/extras/tiledrendering/data/estonian.odt create mode 100644 sw/qa/extras/tiledrendering/data/fieldmark.docx create mode 100644 sw/qa/extras/tiledrendering/data/frame.odt create mode 100644 sw/qa/extras/tiledrendering/data/hiddenLoremIpsum.docx create mode 100644 sw/qa/extras/tiledrendering/data/hyperlink.odt create mode 100644 sw/qa/extras/tiledrendering/data/image-comment.odt create mode 100644 sw/qa/extras/tiledrendering/data/multiline.odt create mode 100644 sw/qa/extras/tiledrendering/data/pagedown-invalidation.odt create mode 100644 sw/qa/extras/tiledrendering/data/pilcrow-redlining.fodt create mode 100644 sw/qa/extras/tiledrendering/data/redline-notification-during-save.odt create mode 100644 sw/qa/extras/tiledrendering/data/removenode_redline_callback.fodt create mode 100644 sw/qa/extras/tiledrendering/data/savedauthorfield.odt create mode 100644 sw/qa/extras/tiledrendering/data/search.odt create mode 100644 sw/qa/extras/tiledrendering/data/semi-transparent.odt create mode 100644 sw/qa/extras/tiledrendering/data/shape-with-text.fodt create mode 100644 sw/qa/extras/tiledrendering/data/shape.fodt create mode 100644 sw/qa/extras/tiledrendering/data/splitnode_redline_callback.fodt create mode 100644 sw/qa/extras/tiledrendering/data/table-paint-invalidate.odt create mode 100644 sw/qa/extras/tiledrendering/data/tdf114799_highlight.docx create mode 100644 sw/qa/extras/tiledrendering/data/tdf114799_shd.docx create mode 100644 sw/qa/extras/tiledrendering/data/tdf115088.odt create mode 100644 sw/qa/extras/tiledrendering/data/tdf117448.fodt create mode 100644 sw/qa/extras/tiledrendering/data/tdf43244_SpacesOnMargin.odt create mode 100644 sw/qa/extras/tiledrendering/data/testTableCommentRemoveCallback.odt create mode 100644 sw/qa/extras/tiledrendering/tiledrendering.cxx create mode 100644 sw/qa/extras/txtencexport/data/bullets.odt create mode 100644 sw/qa/extras/txtencexport/txtencexport.cxx create mode 100644 sw/qa/extras/txtexport/data/UTF16LEBOMCRLF.txt create mode 100644 sw/qa/extras/txtexport/data/UTF16LECRLF.txt create mode 100644 sw/qa/extras/txtexport/data/UTF8BOMCRLF.txt create mode 100644 sw/qa/extras/txtexport/data/UTF8CRLF.txt create mode 100644 sw/qa/extras/txtexport/data/bullets.odt create mode 100644 sw/qa/extras/txtexport/txtexport.cxx create mode 100644 sw/qa/extras/txtimport/data/GB18030.txt create mode 100644 sw/qa/extras/txtimport/data/UTF16BEWITHBOM.txt create mode 100644 sw/qa/extras/txtimport/data/UTF16BEWITHOUTBOM.txt create mode 100644 sw/qa/extras/txtimport/data/UTF16LEWITHBOM.txt create mode 100644 sw/qa/extras/txtimport/data/UTF16LEWITHOUTBOM.txt create mode 100644 sw/qa/extras/txtimport/data/UTF8WITHBOM.txt create mode 100644 sw/qa/extras/txtimport/data/UTF8WITHOUTBOM.txt create mode 100644 sw/qa/extras/txtimport/data/bullets.odt create mode 100644 sw/qa/extras/txtimport/txtimport.cxx create mode 100644 sw/qa/extras/uiwriter/data/152575.fodt create mode 100644 sw/qa/extras/uiwriter/data/AsCharTxBxTest.docx create mode 100644 sw/qa/extras/uiwriter/data/AtPageTextBoxCrash.odt create mode 100644 sw/qa/extras/uiwriter/data/DUMMY.odm create mode 100644 sw/qa/extras/uiwriter/data/DUMMY1.odt create mode 100644 sw/qa/extras/uiwriter/data/HiddenSection.odt create mode 100644 sw/qa/extras/uiwriter/data/MsWordCompTrailingBlanks.docx create mode 100644 sw/qa/extras/uiwriter/data/MsWordCompTrailingBlanksFalse.odt create mode 100644 sw/qa/extras/uiwriter/data/MsWordCompTrailingBlanksTrue.odt create mode 100644 sw/qa/extras/uiwriter/data/TC-table-DnD-move.docx create mode 100644 sw/qa/extras/uiwriter/data/TC-table-converttotable.docx create mode 100644 sw/qa/extras/uiwriter/data/TC-table-del-add.docx create mode 100644 sw/qa/extras/uiwriter/data/TC-table-rowadd.docx create mode 100644 sw/qa/extras/uiwriter/data/autotext-dotm.dotm create mode 100644 sw/qa/extras/uiwriter/data/autotext-empty.dotx create mode 100644 sw/qa/extras/uiwriter/data/autotext-gallery.dotx create mode 100644 sw/qa/extras/uiwriter/data/autotext-multiple.dotx create mode 100644 sw/qa/extras/uiwriter/data/collapsed_bookmark.odt create mode 100644 sw/qa/extras/uiwriter/data/commented-word.odt create mode 100644 sw/qa/extras/uiwriter/data/cp1000071.odt create mode 100644 sw/qa/extras/uiwriter/data/cp1000115.fodt create mode 100644 sw/qa/extras/uiwriter/data/cross_reference_demo_bmk.odt create mode 100644 sw/qa/extras/uiwriter/data/cursor_position_after_undo.odt create mode 100644 sw/qa/extras/uiwriter/data/datasource.ods create mode 100644 sw/qa/extras/uiwriter/data/demo91.fodt create mode 100644 sw/qa/extras/uiwriter/data/draw-anchor-undo.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo112025-insert.docx create mode 100644 sw/qa/extras/uiwriter/data/fdo112025.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo114306.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo114306_2.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo69893.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo70807.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo72942-insert.docx create mode 100644 sw/qa/extras/uiwriter/data/fdo72942.docx create mode 100644 sw/qa/extras/uiwriter/data/fdo75110.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo75898.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo82191.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo85554.odt create mode 100644 sw/qa/extras/uiwriter/data/fdo87448.odt create mode 100644 sw/qa/extras/uiwriter/data/floating-table-position.docx create mode 100644 sw/qa/extras/uiwriter/data/forum-mso-en-13192-min.docx create mode 100644 sw/qa/extras/uiwriter/data/hash#path/calc-data-source.ods create mode 100644 sw/qa/extras/uiwriter/data/hash#path/embedded-data-source.odt create mode 100644 sw/qa/extras/uiwriter/data/hello-world.pdf create mode 100644 sw/qa/extras/uiwriter/data/i95698.odt create mode 100644 sw/qa/extras/uiwriter/data/image-comment-at-char.odt create mode 100644 sw/qa/extras/uiwriter/data/image-comment.odt create mode 100644 sw/qa/extras/uiwriter/data/image.odt create mode 100644 sw/qa/extras/uiwriter/data/lines-in-section-in-table.odt create mode 100644 sw/qa/extras/uiwriter/data/lorem.fodt create mode 100644 sw/qa/extras/uiwriter/data/merge-change1.odt create mode 100644 sw/qa/extras/uiwriter/data/merge-change2.odt create mode 100644 sw/qa/extras/uiwriter/data/num-parent-style.docx create mode 100644 sw/qa/extras/uiwriter/data/ofz18563.docx create mode 100644 sw/qa/extras/uiwriter/data/ole-save-while-edit.odt create mode 100644 sw/qa/extras/uiwriter/data/ole2.png create mode 100644 sw/qa/extras/uiwriter/data/pageBreakWithPageStyle.fodt create mode 100644 sw/qa/extras/uiwriter/data/paragraph-of-text-range.odt create mode 100644 sw/qa/extras/uiwriter/data/redline-autocorrect.fodt create mode 100644 sw/qa/extras/uiwriter/data/redline-autocorrect2.fodt create mode 100644 sw/qa/extras/uiwriter/data/redline-autocorrect3.fodt create mode 100644 sw/qa/extras/uiwriter/data/redline-para-join.docx create mode 100644 sw/qa/extras/uiwriter/data/redlineFrame.fodt create mode 100644 sw/qa/extras/uiwriter/data/redlineFrame_at_char_start_inside.fodt create mode 100644 sw/qa/extras/uiwriter/data/redlineFrame_at_char_start_outside.fodt create mode 100644 sw/qa/extras/uiwriter/data/redline_fly_at_para_one_paragraph.odt create mode 100644 sw/qa/extras/uiwriter/data/redline_fly_duplication_at_para_2nd_paragraph.fodt create mode 100644 sw/qa/extras/uiwriter/data/redline_fly_duplication_at_para_end_inside.fodt create mode 100644 sw/qa/extras/uiwriter/data/redline_fly_duplication_at_para_start_outside.fodt create mode 100644 sw/qa/extras/uiwriter/data/rhbz1810732.docx create mode 100644 sw/qa/extras/uiwriter/data/rhbz739252-3.odt create mode 100644 sw/qa/extras/uiwriter/data/select-column.fodt create mode 100644 sw/qa/extras/uiwriter/data/select-row.fodt create mode 100644 sw/qa/extras/uiwriter/data/shape-page-move.odt create mode 100644 sw/qa/extras/uiwriter/data/shape-textbox-autosize.odt create mode 100644 sw/qa/extras/uiwriter/data/shape-textbox-vertadjust.odt create mode 100644 sw/qa/extras/uiwriter/data/shape-textbox.odt create mode 100644 sw/qa/extras/uiwriter/data/simplefooter.docx create mode 100644 sw/qa/extras/uiwriter/data/small_floating_table.odt create mode 100644 sw/qa/extras/uiwriter/data/split-section-in-nested-table.fodt create mode 100644 sw/qa/extras/uiwriter/data/table-at-end-of-cell.fodt create mode 100644 sw/qa/extras/uiwriter/data/table-in-sect.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf100018-1.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf100691.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf101534.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf103978_backgroundTextShape.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf104032.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf104315.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf104425.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf104440.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf104492.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf104649.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf104814.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf105330.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf105413.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf105417.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf105625.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf106701_tabOverMarginAutotab.doc create mode 100644 sw/qa/extras/uiwriter/data/tdf106736-grid.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf106843.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf107025.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf107362.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf107893.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf107975.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf108124.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf108524.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf108687_tabstop.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf112109.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf112160.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf112342.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf112448.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf112741.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf112860.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf113153.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf113287.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf113445.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf113481-IVS.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf113520.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf113686.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf113790.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf113877_blank_bold_off.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf113877_blank_bold_on.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf113877_blank_ownStandard.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf113877_insert_numbered_list_abcd.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf114536.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf114773.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf114973.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf115065.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf115815.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf116403-considerborders.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf116789.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf117225.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf117923.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf118311.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf118699.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf119019.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf120336.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf120338.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf121546.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf122942.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf123102.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf123285.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf123786.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf124397.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf124722.rtf create mode 100644 sw/qa/extras/uiwriter/data/tdf124904.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf125151_protected.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf125151_protectedB.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf125154.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf125261.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf125310.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf125310b.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf125881.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf125916.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf126206.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf126340.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf126504.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf126626.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf126784_distributeSelectedColumns.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf127652.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf128335.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf128375.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf128603.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf128739.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf128782.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf128860.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf129270.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf129382.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf129655-vtextbox.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf129805.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf130088.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf130094.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf130680.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf130685.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf130746.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf130805.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf131684.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf131963.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf132160.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132187.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132236.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132321.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132420.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132596.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf132597.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132637_protectTrackChanges.doc create mode 100644 sw/qa/extras/uiwriter/data/tdf132725.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132744.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132911.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf132944.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf133477.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf133490.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf133524.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf133524_ro.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf133589.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf133967.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf133982.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf133990.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf134021.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf134227.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf134250.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf134252.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf134253.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf134404.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf134436.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf134626.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf134931.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf134965.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf135056.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf135061.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf135412.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf135581.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf135623.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf135661.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf135662.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf135733.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf136385.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf136452.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf136453.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf136715.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf136778.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf137964.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf138130.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf138482.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf139127.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf139638.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf139737.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf139843.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf140828.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf140975.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf141175.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf142130.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf142157.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf142196.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf142700.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf142715.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf143176.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf143244.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf143574.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf143760_ContourToWrapOff.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf143904.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf144058.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf144317.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf144748.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf144840.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf145091.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf145207.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf145311.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf145321.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf145621.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf145731.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf146248.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf146449.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf147006.rtf create mode 100644 sw/qa/extras/uiwriter/data/tdf147126.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf147180.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf147199.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf147507.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf147723.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf147938.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf148799.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf148849.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf148868.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf149089.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf149498.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf149507.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf149550.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf150824.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf151462.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf151548_tabNavigation.docm create mode 100644 sw/qa/extras/uiwriter/data/tdf151548_tabNavigation2.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf151605.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf151801.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf151974.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf151993.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf153819.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf155028.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf155685.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf156560.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf157131.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf157132.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf157662_redlineNestedInsertDelete.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf157663_redlineMove.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf158459_tracked_changes_across_nodes.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf158703.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf158785_hyperlink.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf159026.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf34957.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf35021_tabOverMarginDemo.doc create mode 100644 sw/qa/extras/uiwriter/data/tdf38394.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf39721.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf39828.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf40142.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf45525.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf47471_paraStyleBackground.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf50447.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf52391.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf54819.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf54819b.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf58604.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf61154.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf62032_apply_style.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf64242_optimizeTable.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf65535.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf66405.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf76636.doc create mode 100644 sw/qa/extras/uiwriter/data/tdf76817.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf76817.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf77014.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf78727.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf83260-1.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf83798.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf84695-tab.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf84695.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf86639.rtf create mode 100644 sw/qa/extras/uiwriter/data/tdf87922.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf88453-table.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf88453.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf89720.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf89954.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf90003.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf90069.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf90362.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf90883.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf91292_paraBackground.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf91801.fodt create mode 100644 sw/qa/extras/uiwriter/data/tdf92648.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf95699.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf96943.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf97601.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf98987.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf99004.docx create mode 100644 sw/qa/extras/uiwriter/data/tdf99689.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf99689_figures.odt create mode 100644 sw/qa/extras/uiwriter/data/tdf99689_tables.odt create mode 100644 sw/qa/extras/uiwriter/data/testFontEmbedding.odt create mode 100644 sw/qa/extras/uiwriter/data/testInconsistentBookmark.ott create mode 100644 sw/qa/extras/uiwriter/data/testTdf106663.odt create mode 100644 sw/qa/extras/uiwriter/data/test_anchor_as_character.odt create mode 100644 sw/qa/extras/uiwriter/data/textfield-getanchor-gettext-in-footer.odt create mode 100644 sw/qa/extras/uiwriter/data/threadedException.fodt create mode 100644 sw/qa/extras/uiwriter/data/try2.fodt create mode 100644 sw/qa/extras/uiwriter/data/txbx_crash.odt create mode 100644 sw/qa/extras/uiwriter/data/udindex3.odt create mode 100644 sw/qa/extras/uiwriter/data/unfloatable_floating_table.odt create mode 100644 sw/qa/extras/uiwriter/data/unicodeAltX.odt create mode 100644 sw/qa/extras/uiwriter/data/uno-cycle.odt create mode 100644 sw/qa/extras/uiwriter/data/variable-field-table-row-split-header.fodt create mode 100644 sw/qa/extras/uiwriter/data/watermark-position.odt create mode 100644 sw/qa/extras/uiwriter/data/watermark.docx create mode 100644 sw/qa/extras/uiwriter/uiwriter.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter2.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter3.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter4.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter5.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter6.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter7.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter8.cxx create mode 100644 sw/qa/extras/uiwriter/uiwriter9.cxx create mode 100644 sw/qa/extras/unowriter/data/bookmarkintable.fodt create mode 100644 sw/qa/extras/unowriter/data/image-comment-at-char.odt create mode 100644 sw/qa/extras/unowriter/data/renderable-page-position.odt create mode 100644 sw/qa/extras/unowriter/data/selection-in-table-enum.odt create mode 100644 sw/qa/extras/unowriter/data/table-line-spacing.docx create mode 100644 sw/qa/extras/unowriter/data/tdf134250.fodt create mode 100644 sw/qa/extras/unowriter/data/tdf134252.fodt create mode 100644 sw/qa/extras/unowriter/data/tdf134252_onlytable_protected.fodt create mode 100644 sw/qa/extras/unowriter/data/test.jpg create mode 100644 sw/qa/extras/unowriter/data/view-cursor-page-style.fodt create mode 100644 sw/qa/extras/unowriter/data/xautotextgroup.odt create mode 100644 sw/qa/extras/unowriter/unowriter.cxx create mode 100644 sw/qa/extras/ww8export/data/all_gaps_word.doc create mode 100644 sw/qa/extras/ww8export/data/arabic-zero-numbering.doc create mode 100644 sw/qa/extras/ww8export/data/bnc636128.doc create mode 100644 sw/qa/extras/ww8export/data/bnc787942.doc create mode 100644 sw/qa/extras/ww8export/data/bnc821208.doc create mode 100644 sw/qa/extras/ww8export/data/bnc863018b.doc create mode 100644 sw/qa/extras/ww8export/data/bordercolours.doc create mode 100644 sw/qa/extras/ww8export/data/bordercolours.odt create mode 100644 sw/qa/extras/ww8export/data/btlr-cell.doc create mode 100644 sw/qa/extras/ww8export/data/btlr-frame.odt create mode 100644 sw/qa/extras/ww8export/data/cell-bg-color.odt create mode 100644 sw/qa/extras/ww8export/data/charborder.odt create mode 100644 sw/qa/extras/ww8export/data/checkbox_control.odt create mode 100644 sw/qa/extras/ww8export/data/cjklist30.doc create mode 100644 sw/qa/extras/ww8export/data/cjklist31.doc create mode 100644 sw/qa/extras/ww8export/data/cjklist34.doc create mode 100644 sw/qa/extras/ww8export/data/cjklist35.doc create mode 100644 sw/qa/extras/ww8export/data/clearing-break.doc create mode 100644 sw/qa/extras/ww8export/data/comment-export.odt create mode 100644 sw/qa/extras/ww8export/data/commented-table.doc create mode 100644 sw/qa/extras/ww8export/data/comments-nested.doc create mode 100644 sw/qa/extras/ww8export/data/continuous-sections.doc create mode 100644 sw/qa/extras/ww8export/data/cp1000044.doc create mode 100644 sw/qa/extras/ww8export/data/fdo36868.doc create mode 100644 sw/qa/extras/ww8export/data/fdo42144.odt create mode 100644 sw/qa/extras/ww8export/data/fdo45724.odt create mode 100644 sw/qa/extras/ww8export/data/fdo46020.odt create mode 100644 sw/qa/extras/ww8export/data/fdo53985.doc create mode 100644 sw/qa/extras/ww8export/data/fdo56513.doc create mode 100644 sw/qa/extras/ww8export/data/fdo59530.doc create mode 100644 sw/qa/extras/ww8export/data/fdo66304-1.odt create mode 100644 sw/qa/extras/ww8export/data/fdo68963.doc create mode 100644 sw/qa/extras/ww8export/data/fdo68967.doc create mode 100644 sw/qa/extras/ww8export/data/fdo77454.doc create mode 100644 sw/qa/extras/ww8export/data/fdo77844.doc create mode 100644 sw/qa/extras/ww8export/data/fdo80333.doc create mode 100644 sw/qa/extras/ww8export/data/fdo81102.doc create mode 100644 sw/qa/extras/ww8export/data/gutter-left.doc create mode 100644 sw/qa/extras/ww8export/data/gutter-top.doc create mode 100644 sw/qa/extras/ww8export/data/i120158.doc create mode 100644 sw/qa/extras/ww8export/data/image-comment-at-char.doc create mode 100644 sw/qa/extras/ww8export/data/inlinePageBreakFirstLine.doc create mode 100644 sw/qa/extras/ww8export/data/list-nolevel.doc create mode 100644 sw/qa/extras/ww8export/data/mailmerge.doc create mode 100644 sw/qa/extras/ww8export/data/msobrightnesscontrast.doc create mode 100644 sw/qa/extras/ww8export/data/n325936.doc create mode 100644 sw/qa/extras/ww8export/data/n652364.doc create mode 100644 sw/qa/extras/ww8export/data/n750255.doc create mode 100644 sw/qa/extras/ww8export/data/n757118.doc create mode 100644 sw/qa/extras/ww8export/data/n757905.doc create mode 100644 sw/qa/extras/ww8export/data/n757910.doc create mode 100644 sw/qa/extras/ww8export/data/n760294.doc create mode 100644 sw/qa/extras/ww8export/data/n816603.doc create mode 100644 sw/qa/extras/ww8export/data/n823651.doc create mode 100644 sw/qa/extras/ww8export/data/new-page-styles.doc create mode 100644 sw/qa/extras/ww8export/data/nonInlinePageBreakFirstLine.doc create mode 100644 sw/qa/extras/ww8export/data/object_cross_reference.odt create mode 100644 sw/qa/extras/ww8export/data/ooo92948-1.doc create mode 100644 sw/qa/extras/ww8export/data/page-border.doc create mode 100644 sw/qa/extras/ww8export/data/redline-export-1.odt create mode 100644 sw/qa/extras/ww8export/data/redline-export-2.odt create mode 100644 sw/qa/extras/ww8export/data/redline-export-3.odt create mode 100644 sw/qa/extras/ww8export/data/rtl-gutter.doc create mode 100644 sw/qa/extras/ww8export/data/shapes-line-ellipse.doc create mode 100644 sw/qa/extras/ww8export/data/table_cross_reference.odt create mode 100644 sw/qa/extras/ww8export/data/table_cross_reference_custom_format.odt create mode 100644 sw/qa/extras/ww8export/data/tdf100961_fixedDateTime.doc create mode 100644 sw/qa/extras/ww8export/data/tdf101826_xattrTextBoxFill.doc create mode 100644 sw/qa/extras/ww8export/data/tdf102334.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104239_chapterNumbering.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104239_chapterNumberingLevels.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104239_numbering.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104239_sharedOutlineNumId.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104334.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104596_wrapInHeaderTable.doc create mode 100644 sw/qa/extras/ww8export/data/tdf104704_mangledFooter.odt create mode 100644 sw/qa/extras/ww8export/data/tdf104805.doc create mode 100644 sw/qa/extras/ww8export/data/tdf105570.doc create mode 100644 sw/qa/extras/ww8export/data/tdf106062_nonHangingFootnote.odt create mode 100644 sw/qa/extras/ww8export/data/tdf106174_rtlParaAlign.docx create mode 100644 sw/qa/extras/ww8export/data/tdf106291.doc create mode 100644 sw/qa/extras/ww8export/data/tdf106541_cancelOutline.doc create mode 100644 sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumbering.doc create mode 100644 sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumberingB.doc create mode 100644 sw/qa/extras/ww8export/data/tdf106541_inheritOutlineNumbering.doc create mode 100644 sw/qa/extras/ww8export/data/tdf107773.doc create mode 100644 sw/qa/extras/ww8export/data/tdf108072.doc create mode 100644 sw/qa/extras/ww8export/data/tdf108448_endNote.odt create mode 100644 sw/qa/extras/ww8export/data/tdf108518_CRnumformatting.doc create mode 100644 sw/qa/extras/ww8export/data/tdf111480.doc create mode 100644 sw/qa/extras/ww8export/data/tdf112074_RTLtableJustification.doc create mode 100644 sw/qa/extras/ww8export/data/tdf112118.doc create mode 100644 sw/qa/extras/ww8export/data/tdf112346.doc create mode 100644 sw/qa/extras/ww8export/data/tdf112517_maxSprms.doc create mode 100644 sw/qa/extras/ww8export/data/tdf112535.doc create mode 100644 sw/qa/extras/ww8export/data/tdf112618_textbox_no_bg.doc create mode 100644 sw/qa/extras/ww8export/data/tdf114308.doc create mode 100644 sw/qa/extras/ww8export/data/tdf115896_layoutInCell.doc create mode 100644 sw/qa/extras/ww8export/data/tdf116194.doc create mode 100644 sw/qa/extras/ww8export/data/tdf116436_tableBackground.odt create mode 100644 sw/qa/extras/ww8export/data/tdf116570_exportFootnote.odt create mode 100644 sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt create mode 100644 sw/qa/extras/ww8export/data/tdf117503.docx create mode 100644 sw/qa/extras/ww8export/data/tdf117885.doc create mode 100644 sw/qa/extras/ww8export/data/tdf117994_CRnumformatting.doc create mode 100644 sw/qa/extras/ww8export/data/tdf118133.docx create mode 100644 sw/qa/extras/ww8export/data/tdf118375_240degClockwise.doc create mode 100644 sw/qa/extras/ww8export/data/tdf118412.doc create mode 100644 sw/qa/extras/ww8export/data/tdf118564.doc create mode 100644 sw/qa/extras/ww8export/data/tdf119232_startEvenPage.doc create mode 100644 sw/qa/extras/ww8export/data/tdf120003.doc create mode 100644 sw/qa/extras/ww8export/data/tdf120225_textControlCrossRef.doc create mode 100644 sw/qa/extras/ww8export/data/tdf120394.doc create mode 100644 sw/qa/extras/ww8export/data/tdf120412_proportionalEscapement.odt create mode 100644 sw/qa/extras/ww8export/data/tdf120711.doc create mode 100644 sw/qa/extras/ww8export/data/tdf121110_absJustify.doc create mode 100644 sw/qa/extras/ww8export/data/tdf121111_fillStyleNone.docx create mode 100644 sw/qa/extras/ww8export/data/tdf122425_2.doc create mode 100644 sw/qa/extras/ww8export/data/tdf122429_header.doc create mode 100644 sw/qa/extras/ww8export/data/tdf122460_header.odt create mode 100644 sw/qa/extras/ww8export/data/tdf123433_fillStyleStop.doc create mode 100644 sw/qa/extras/ww8export/data/tdf124937.doc create mode 100644 sw/qa/extras/ww8export/data/tdf126708_containsemf.odt create mode 100644 sw/qa/extras/ww8export/data/tdf127166_prstDash_Word97.doc create mode 100644 sw/qa/extras/ww8export/data/tdf127316_autoEscapement.odt create mode 100644 sw/qa/extras/ww8export/data/tdf127316_autoEscapement2.odt create mode 100644 sw/qa/extras/ww8export/data/tdf127862_pageFillStyle.odt create mode 100644 sw/qa/extras/ww8export/data/tdf128501.doc create mode 100644 sw/qa/extras/ww8export/data/tdf128605.doc create mode 100644 sw/qa/extras/ww8export/data/tdf128608_fillStyleNoneB.odt create mode 100644 sw/qa/extras/ww8export/data/tdf128608_tableParaBackColor.doc create mode 100644 sw/qa/extras/ww8export/data/tdf128700_relativeTableWidth.doc create mode 100644 sw/qa/extras/ww8export/data/tdf129247.docx create mode 100644 sw/qa/extras/ww8export/data/tdf129522_removeShadowStyle.odt create mode 100644 sw/qa/extras/ww8export/data/tdf130262.doc create mode 100644 sw/qa/extras/ww8export/data/tdf132094_transparentPageImage.doc create mode 100644 sw/qa/extras/ww8export/data/tdf132726.odt create mode 100644 sw/qa/extras/ww8export/data/tdf133453_realFontSize.doc create mode 100644 sw/qa/extras/ww8export/data/tdf133504_wrapNotBeside.doc create mode 100644 sw/qa/extras/ww8export/data/tdf134264.docx create mode 100644 sw/qa/extras/ww8export/data/tdf134570.doc create mode 100644 sw/qa/extras/ww8export/data/tdf134948.odt create mode 100644 sw/qa/extras/ww8export/data/tdf135672_tableGrows.doc create mode 100644 sw/qa/extras/ww8export/data/tdf136620.odt create mode 100644 sw/qa/extras/ww8export/data/tdf136814.odt create mode 100644 sw/qa/extras/ww8export/data/tdf138302_restartNumbering.odt create mode 100644 sw/qa/extras/ww8export/data/tdf138345_paraCharHighlight.doc create mode 100644 sw/qa/extras/ww8export/data/tdf139495_tinyHeader.doc create mode 100644 sw/qa/extras/ww8export/data/tdf141649_conditionalText.doc create mode 100644 sw/qa/extras/ww8export/data/tdf142760.doc create mode 100644 sw/qa/extras/ww8export/data/tdf142840.odt create mode 100644 sw/qa/extras/ww8export/data/tdf147861_customField.doc create mode 100644 sw/qa/extras/ww8export/data/tdf148380_createField.doc create mode 100644 sw/qa/extras/ww8export/data/tdf148380_fldLocked.doc create mode 100644 sw/qa/extras/ww8export/data/tdf150197_anlv2ListFormat.doc create mode 100644 sw/qa/extras/ww8export/data/tdf151548_formFieldMacros.doc create mode 100644 sw/qa/extras/ww8export/data/tdf155465_paraAdjustDistribute.doc create mode 100644 sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.doc create mode 100644 sw/qa/extras/ww8export/data/tdf36711_inlineFrames.doc create mode 100644 sw/qa/extras/ww8export/data/tdf37153_considerWrapOnObjPos.doc create mode 100644 sw/qa/extras/ww8export/data/tdf37778_readonlySection.doc create mode 100644 sw/qa/extras/ww8export/data/tdf38778_properties_in_run_for_field.doc create mode 100644 sw/qa/extras/ww8export/data/tdf41542_borderlessPadding.odt create mode 100644 sw/qa/extras/ww8export/data/tdf41542_imagePadding.odt create mode 100644 sw/qa/extras/ww8export/data/tdf46441-2.odt create mode 100644 sw/qa/extras/ww8export/data/tdf49102_mergedCellNumbering.doc create mode 100644 sw/qa/extras/ww8export/data/tdf55427_footnote2endnote.odt create mode 100644 sw/qa/extras/ww8export/data/tdf55528_relativeTableWidth.doc create mode 100644 sw/qa/extras/ww8export/data/tdf56321_flipImage_both.doc create mode 100644 sw/qa/extras/ww8export/data/tdf59896.doc create mode 100644 sw/qa/extras/ww8export/data/tdf60378_mergedBorders.doc create mode 100644 sw/qa/extras/ww8export/data/tdf70838.odt create mode 100644 sw/qa/extras/ww8export/data/tdf70838b_verticalRotation.odt create mode 100644 sw/qa/extras/ww8export/data/tdf73056_cellMargins.doc create mode 100644 sw/qa/extras/ww8export/data/tdf74328.doc create mode 100644 sw/qa/extras/ww8export/data/tdf75539_relativeWidth.doc create mode 100644 sw/qa/extras/ww8export/data/tdf75748_inheritChapterNumberingC.doc create mode 100644 sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc create mode 100644 sw/qa/extras/ww8export/data/tdf77964.doc create mode 100644 sw/qa/extras/ww8export/data/tdf79186_noLayoutInCell.odt create mode 100644 sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx create mode 100644 sw/qa/extras/ww8export/data/tdf79553_lineNumbers.doc create mode 100644 sw/qa/extras/ww8export/data/tdf79639.doc create mode 100644 sw/qa/extras/ww8export/data/tdf80635_marginLeft.doc create mode 100644 sw/qa/extras/ww8export/data/tdf80635_marginRightRTL.doc create mode 100644 sw/qa/extras/ww8export/data/tdf80635_pageLeft.doc create mode 100644 sw/qa/extras/ww8export/data/tdf80635_pageRightRTL.doc create mode 100644 sw/qa/extras/ww8export/data/tdf81705_outlineLevel.doc create mode 100644 sw/qa/extras/ww8export/data/tdf89377_tableWithBreakBeforeParaStyle.doc create mode 100644 sw/qa/extras/ww8export/data/tdf90408.doc create mode 100644 sw/qa/extras/ww8export/data/tdf90408B.doc create mode 100644 sw/qa/extras/ww8export/data/tdf91083.odt create mode 100644 sw/qa/extras/ww8export/data/tdf91083_tableKeep2.odt create mode 100644 sw/qa/extras/ww8export/data/tdf91083_tableKeep3.odt create mode 100644 sw/qa/extras/ww8export/data/tdf91687.doc create mode 100644 sw/qa/extras/ww8export/data/tdf92281.doc create mode 100644 sw/qa/extras/ww8export/data/tdf94009_zeroPgMargin.odt create mode 100644 sw/qa/extras/ww8export/data/tdf94326_notOutlineNumbering.doc create mode 100644 sw/qa/extras/ww8export/data/tdf94386.odt create mode 100644 sw/qa/extras/ww8export/data/tdf95321.doc create mode 100644 sw/qa/extras/ww8export/data/tdf95576.doc create mode 100644 sw/qa/extras/ww8export/data/tdf96277.doc create mode 100644 sw/qa/extras/ww8export/data/tdf98620_rtlJustify.doc create mode 100644 sw/qa/extras/ww8export/data/tdf99100.doc create mode 100644 sw/qa/extras/ww8export/data/tdf99120.doc create mode 100644 sw/qa/extras/ww8export/data/tdf99197_defaultLTR.doc create mode 100644 sw/qa/extras/ww8export/data/tdf99474.odt create mode 100644 sw/qa/extras/ww8export/data/testTdf107931_KERN_DocEnabled_disabledDefStyle.doc create mode 100644 sw/qa/extras/ww8export/data/testTdf107931_KERN_enabledDefStyle.doc create mode 100644 sw/qa/extras/ww8export/data/transparent-text.doc create mode 100644 sw/qa/extras/ww8export/data/tscp.doc create mode 100644 sw/qa/extras/ww8export/data/zoom.doc create mode 100644 sw/qa/extras/ww8export/data/zoomtype.doc create mode 100644 sw/qa/extras/ww8export/ww8export.cxx create mode 100644 sw/qa/extras/ww8export/ww8export2.cxx create mode 100644 sw/qa/extras/ww8export/ww8export3.cxx create mode 100644 sw/qa/extras/ww8export/ww8export4.cxx create mode 100644 sw/qa/extras/ww8import/data/bnc875715.doc create mode 100644 sw/qa/extras/ww8import/data/changes-in-footnote.doc create mode 100644 sw/qa/extras/ww8import/data/floating-table-section-columns.doc create mode 100644 sw/qa/extras/ww8import/data/image-lazy-read-0size.doc create mode 100644 sw/qa/extras/ww8import/data/image-lazy-read.doc create mode 100644 sw/qa/extras/ww8import/data/n816593.doc create mode 100644 sw/qa/extras/ww8import/data/tdf106799.doc create mode 100644 sw/qa/extras/ww8import/data/tdf110987 create mode 100644 sw/qa/extras/ww8import/data/tdf120761_zOrder.dot create mode 100644 sw/qa/extras/ww8import/data/tdf121734.doc create mode 100644 sw/qa/extras/ww8import/data/tdf122425_1.doc create mode 100644 sw/qa/extras/ww8import/data/tdf124601.doc create mode 100644 sw/qa/extras/ww8import/data/tdf125281.doc create mode 100644 sw/qa/extras/ww8import/ww8import.cxx (limited to 'sw/qa/extras') diff --git a/sw/qa/extras/README b/sw/qa/extras/README new file mode 100644 index 0000000000..66bca01e63 --- /dev/null +++ b/sw/qa/extras/README @@ -0,0 +1,274 @@ += How to add a new Writer filter test + +The `sw/qa/extras/` subdirectory has multiple import and export filter unit +tests. This file documents how to add new testcases to this framework. + +== Import tests + +Import tests are the easier ones. First you need to use +`CPPUNIT_TEST_FIXTURE()` and `load()`, so the framework will load the +specified file to `mxComponent`, which represents the UNO model of the +document. + +The rest of the testcase is about implementing the test method asserting this +document model: use the UNO API to retrieve properties, then use +`CPPUNIT_ASSERT_EQUAL()` to test against an expected value. + +See below for more details on writing the UNO code see below. + +=== Direct XPath assertions on the layout dump + +In most cases you want to assert the document model, but sometimes asserting +the layout is easier. If you want to do so, the `parseDump()` method can be +used to parse the layout dump of the currently loaded document. If you want +to have a look at the XML document that can be asserted, start soffice with the +`SW_DEBUG=1` environment variable, load a document, press F12, and have a look +at the `layout.xml` file in the current directory. Once you find the needed +information in that file, you can write your XPath expression to turn that into +a testcase. + +(Similarly, Shift-F12 produces a `nodes.xml` for the document model dump, but +it's unlikely that you'll need that in a unit test.) + +== Export tests + +Export tests are similar. Given that test documents are easier to provide in +some format (instead of writing code to build the documents from scratch) in +most cases, we will do an import, then do an export (to invoke the code we want +to test) and then do an import again, so we can do the testing by asserting the +document model, just like we did for import tests. + +Yes, this means that you can only test the export code (using this framework) +if the importer is working correctly. (But that's not so bad, users usually +expect a feature to work in both the importer and the exporter.) + +The only difference is that in these tests the test method is called twice: +once after the initial import -- so you can see if the export fails due to an +import problem in fact -- and once after the export and import. + +=== Direct XPath assertions + +Another alternative is to assert the resulted export document directly. +Currently this is only implemented for DOCX, which is a zipped XML, so it's +possible to evaluate XPath checks. A check looks like this: + +xmlDocPtr pXmlDoc = parseExport("word/document.xml"); +assertXPath(pXmlDoc, , , ); + +It's important to check for the NULL pointer here, it's expected that it'll be +NULL when the test runs first (after the first import), as there is nothing +exported yet. For other XPath assert variants, see the `XmlTestTools` class. + +== Helper methods + +When two or more tests do the same (for example determine the number of +characters in the document), helper methods are introduced to avoid code +duplication. When you need something more complex, check if there is already a +helper method, they are also good examples. + +Helper methods which are used by more than one testsuite are in the +`SwModelTestBase` class. For example the `getLength()` method uses the trick +that you can simply enumerate over the document model, getting the paragraphs +of it; and inside those, you can enumerate over their runs. That alone is +enough if you want to test a paragraph or character property. + +== Using UNO for tests + +Figuring out the UNO API just by reading the idl files under `offapi/` is not +that productive. Xray can help in this case. Download it from: + +https://dev-www.libreoffice.org/extern/XrayTool52_en.sxw + +It's a document file, start Writer, Tools -> Options -> LibreOffice -> Security, +Macro Security, and there choose Low. Then open the document, and click `Install +Xray`. Now you can close the file. Open your testcase, which is imported +correctly (from a fixed bugs's point of view). Then open the basic editor +(Tools -> Macros -> LibreOffice Basic -> Organize Macros, Edit), and start to +write your testcase as `Sub Main`. You don't have to know much about basic, for +a typical testcase you need no `if`, `for`, or anything like that. + +NOTE: Once you restart Writer, xray will no longer be loaded automatically. For +subsequent starts, place the following line in `Main` before you do anything +else: + +---- +GlobalScope.BasicLibraries.LoadLibrary("XrayTool") +---- + +The above `mxComponent` is available as `ThisComponent` in basic, and if you +want to inspect a variable here, you can use the `xray` command to inspect +properties, methods, interfaces, etc. + +Let's take for example fdo#49501. The problem there was the page was not +landscape (and a few more, let's ignore that). + +You can start with: + +---- +xray ThisComponent +---- + +and navigate around (it is a good idea to click Configuration and enable +alphabetical sorting). The good thing is that once you write the code, you can +just start F5 without restarting LibreOffice to see the result, so you can +develop quickly. + +With some experimenting, you'll end up with something like this: + +---- +oStyle = ThisComponent.StyleFamilies.PageStyles.getByName("Default Style") +xray oStyle.IsLandscape +---- + +Now all left is to rewrite that in cpp, where it'll be much easier to debug +when later this test fails for some reason. In cpp, you typically need to be +more verbose, so the code will look like: + +---- +uno::Reference xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); +CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle, "IsLandscape")); +---- + +== CppUnit tips + +=== sal_Bool + +In case a UNO method returns sal_Bool, and the assert fails, CppUnit won't be +able to print a usable error message, as it will think that the value is a +printable character. Best to use `bool` for the expected value and cast the +actual value to `bool` as well before comparing. + +=== Running only a single test + +If you want to run only a single test to allow quick development iteration, +then use `CPPUNIT_TEST_NAME` to specify the name of the single test: + +---- +CPPUNIT_TEST_NAME="testTdf91074" make -sr CppunitTest_sw_rtfexport6 +---- + +== UNO, in more details, various tips: + +=== writing code based xray inspection: + +In general, if you want to access a property, in Basic it's enough to write 'object.property', +such as printing character count that 'xray ThisComponent' prints as 'CharacterCount': + +count = ThisComponent.CharacterCount +text = paragraph.String + +In C++, this can get more complicated, as you need to use the right interface for access. Xray +prints the internal name of the object (e.g. 'SwXTextDocument' for 'xray ThisComponent') +above the list of its properties. Inspect this class/interface in the code (that is, +under offapi/, udkapi/, or wherever it is implemented) and search for a function named +similarly to the property you want (getXYZ()). If there is none, it is most +probably a property that can be read using XPropertySet or using the getProperty helper: + +sal_Int32 val = getProperty< sal_Int32 >( textDocument, "CharacterCount" ); + +If there is a function to obtain the property, you need access it using the right interface. +If the class itself is not the right interface, then it is one of the classes it inherits +from, usually the block of functions that are implemented for this interface starts with +stating the name. For example see sw/inc/unoparagraph.hxx for class SwXParagraph, it has +function getString() in a block introduced with 'XTextRange', so XTextRange is the interface +it inherits from: + +// text of the paragraph +uno::Reference text(paragraph, uno::UNO_QUERY); +OUString value = text->getString(); + +Some properties may be more complicated to access, such as using XEnumerationAccess, XIndexAccess +or XNamedAccess to enumerate items, index them by number of name (clicking 'Dbg_SupportedInterfaces' +in xray gives a list of interfaces the object implements, and 'Count' shows the number of items). + +=== XEnumerationAccess (e.g. get the 2nd paragraph of the document): + +Basic: + +enum = ThisComponent.Text.createEnumeration +para = enum.NextElement +para = enum.NextElement +xray para + +C++: + +uno::Reference textDocument(mxComponent, uno::UNO_QUERY); +uno::Reference paraEnumAccess(textDocument->getText(), uno::UNO_QUERY); +// list of paragraphs +uno::Reference paraEnum = paraEnumAccess->createEnumeration(); +// go to 1st paragraph +(void) paraEnum->nextElement(); +// get the 2nd paragraph +uno::Reference paragraph(paraEnum->nextElement(), uno::UNO_QUERY); + +Note that for paragraphs it's easier to use getParagraph(), which gets the given +paragraph (counted from 1) and optionally checks the paragraph text. + +uno::Reference< text::XTextRange > paragraph = getParagraph( 2, "TEXT" ) + +=== XNamedAccess (e.g. get a bookmark named 'position1'): + +Basic: + +bookmark = ThisComponent.Bookmarks.getByName("position1") + +or even simpler + +bookmark = ThisComponent.Bookmarks.position1 + +C++: + +uno::Reference textDocument(mxComponent, uno::UNO_QUERY); +// XBookmarksSupplier interface will be needed to access the bookmarks +uno::Reference bookmarksSupplier(textDocument, uno::UNO_QUERY); +// get the bookmarks +uno::Reference bookmarks(bookmarksSupplier->getBookmarks(), uno::UNO_QUERY); +uno::Reference bookmark; +// get the bookmark by name +bookmarks->getByName("position1") >>= bookmark; + +=== XIndexAccess (e.g. get the first bookmark): + +Basic: + +bookmark = ThisComponent.Bookmarks.getByIndex(0) + +C++: + +uno::Reference textDocument(mxComponent, uno::UNO_QUERY); +// XBookmarksSupplier interface will be needed to access the bookmarks +uno::Reference bookmarksSupplier(textDocument, uno::UNO_QUERY); +// get the bookmarks +uno::Reference bookmarks(bookmarksSupplier->getBookmarks(), uno::UNO_QUERY); +uno::Reference bookmark; +// get the bookmark by index +bookmarks->getByIndex(0) >>= bookmark; + +=== Images + +Embedded images seem to be accessed like this: + +Basic: + +image = ThisComponent.DrawPage.getByIndex(0) +graphic = image.Graphic + +C++: + +uno::Reference image = getShape(1); +uno::Reference graphic = getProperty< uno::Reference< graphic::XGraphic > >( image, "Graphic" ); + + +=== Styles + +Styles provide information about many properties of (parts of) the document, for example +page width: + +Basic: + +ThisComponent.StyleFamilies.PageStyles.getByName("Default Style").Width + +C++: + +getStyles("PageStyles")->getByName("Standard") >>= defaultStyle; +sal_Int32 width = getProperty< sal_Int32 >( defaultStyle, "Width" ); diff --git a/sw/qa/extras/accessibility/accessible_relation_set.cxx b/sw/qa/extras/accessibility/accessible_relation_set.cxx new file mode 100644 index 0000000000..fcee6d965a --- /dev/null +++ b/sw/qa/extras/accessibility/accessible_relation_set.cxx @@ -0,0 +1,204 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/ + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +using namespace com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::accessibility; +using namespace css::lang; + +class AccessibleRelationSet : public UnoApiTest +{ +public: + AccessibleRelationSet() + : UnoApiTest("") + { + } + + void init(uno::Reference& para1, + uno::Reference& para2, + uno::Reference& para3); + void contents_flows_to_and_from(); + + CPPUNIT_TEST_SUITE(AccessibleRelationSet); + CPPUNIT_TEST(contents_flows_to_and_from); + CPPUNIT_TEST_SUITE_END(); +}; + +void AccessibleRelationSet::init(uno::Reference& para1, + uno::Reference& para2, + uno::Reference& para3) +{ + mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); + uno::Reference xTextDoc(mxComponent, uno::UNO_QUERY); + + css::uno::Reference oText(xTextDoc->getText(), uno::UNO_SET_THROW); + + css::uno::Reference oCursor = oText->createTextCursor(); + + for (int i = 0; i < 5; i++) + { + oText->insertString(oCursor, "Paragraph Number: " + OUString::number(i), false); + oText->insertControlCharacter(oCursor, text::ControlCharacter::PARAGRAPH_BREAK, false); + } + + css::uno::Reference aModel(xTextDoc, uno::UNO_QUERY_THROW); + css::uno::Reference xController(aModel->getCurrentController()); + + css::uno::Reference ctx; + uno::Reference xFrame(xController->getFrame(), uno::UNO_SET_THROW); + uno::Reference xWindow(xFrame->getComponentWindow(), uno::UNO_SET_THROW); + + css::uno::Reference xRoot(xWindow, uno::UNO_QUERY_THROW); + ctx = AccessibilityTools::getAccessibleObjectForRole(xRoot, AccessibleRole::DOCUMENT_TEXT); + CPPUNIT_ASSERT_MESSAGE("Couldn't get AccessibleRole.DOCUMENT_TEXT object", ctx.is()); + para1 = ctx->getAccessibleChild(0); + para2 = ctx->getAccessibleChild(1); + para3 = ctx->getAccessibleChild(2); +} + +void AccessibleRelationSet::contents_flows_to_and_from() +{ + //contents_flows_to + + css::uno::Reference para1; + css::uno::Reference para2; + css::uno::Reference para3; + + init(para1, para2, para3); + css::uno::Reference oObj(para1, uno::UNO_QUERY_THROW); + css::uno::Reference set + = oObj->getAccessibleRelationSet(); + + css::uno::Reference atarget; + + if (set.is()) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct count of relations", sal_Int32(1), + set->getRelationCount()); + sal_Int16 firstrelation = set->getRelation(0).RelationType; + css::uno::Reference adummy( + set->getRelation(0).TargetSet[0], uno::UNO_QUERY_THROW); + atarget = adummy; + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct relation type for paragraph 0", + AccessibilityTools::getRelationTypeName( + accessibility::AccessibleRelationType::CONTENT_FLOWS_TO), + AccessibilityTools::getRelationTypeName(firstrelation)); + + css::uno::Reference paraText2(para2, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct target paragraph", atarget->getText(), + paraText2->getText()); + } + + //contents_flows_from() + css::uno::Reference oObj2(para2, uno::UNO_QUERY_THROW); + css::uno::Reference set2 + = oObj2->getAccessibleRelationSet(); + + sal_Int16 relationtypes[2] = { accessibility::AccessibleRelationType::INVALID, + accessibility::AccessibleRelationType::INVALID }; + css::uno::Reference atargets[2]; + + if (set2.is()) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct count of relations", sal_Int32(2), + set2->getRelationCount()); + sal_Int16 tmprelation = set2->getRelation(0).RelationType; + if (tmprelation == accessibility::AccessibleRelationType::CONTENT_FLOWS_FROM) + { + css::uno::Reference adummy( + set2->getRelation(0).TargetSet[0], uno::UNO_QUERY_THROW); + atargets[0] = adummy; + relationtypes[0] = tmprelation; + } + else if (tmprelation == accessibility::AccessibleRelationType::CONTENT_FLOWS_TO) + { + css::uno::Reference adummy( + set2->getRelation(0).TargetSet[0], uno::UNO_QUERY_THROW); + atargets[1] = adummy; + relationtypes[1] = tmprelation; + } + else + { + CPPUNIT_FAIL("didn't gain correct relation type"); + } + tmprelation = set2->getRelation(1).RelationType; + if (tmprelation == accessibility::AccessibleRelationType::CONTENT_FLOWS_FROM) + { + css::uno::Reference adummy( + set2->getRelation(1).TargetSet[0], uno::UNO_QUERY_THROW); + atargets[0] = adummy; + relationtypes[0] = tmprelation; + } + else if (tmprelation == accessibility::AccessibleRelationType::CONTENT_FLOWS_TO) + { + css::uno::Reference adummy( + set2->getRelation(1).TargetSet[0], uno::UNO_QUERY_THROW); + atargets[1] = adummy; + relationtypes[1] = tmprelation; + } + else + { + CPPUNIT_FAIL("didn't gain correct relation type"); + } + } + + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct relation type for paragraph 1", + AccessibilityTools::getRelationTypeName( + accessibility::AccessibleRelationType::CONTENT_FLOWS_FROM), + AccessibilityTools::getRelationTypeName(relationtypes[0])); + + css::uno::Reference paraText1(para1, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct target paragraph", atargets[0]->getText(), + paraText1->getText()); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct relation type for paragraph 3", + AccessibilityTools::getRelationTypeName( + accessibility::AccessibleRelationType::CONTENT_FLOWS_TO), + AccessibilityTools::getRelationTypeName(relationtypes[1])); + + css::uno::Reference paraText3(para3, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("didn't gain correct target paragraph", atargets[1]->getText(), + paraText3->getText()); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(AccessibleRelationSet); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/accessibility/basics.cxx b/sw/qa/extras/accessibility/basics.cxx new file mode 100644 index 0000000000..6bdd992c22 --- /dev/null +++ b/sw/qa/extras/accessibility/basics.cxx @@ -0,0 +1,96 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include +#include + +using namespace css; + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestBasicStructure) +{ + loadFromSrc(u"/sw/qa/python/testdocuments/xtextcontent.odt"_ustr); + auto xContext = getDocumentAccessibleContext(); + CPPUNIT_ASSERT(xContext.is()); + + dumpA11YTree(xContext); + CPPUNIT_ASSERT_EQUAL( + rtl::OUString("String1" + "" + "" + "String2" + "" + "
" + "" + "Frame1" + "Frame2"), + collectText(xContext)); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestTypeSimple) +{ + load(u"private:factory/swriter"_ustr); + auto xContext = getDocumentAccessibleContext(); + CPPUNIT_ASSERT(xContext.is()); + + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'h', 0); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'e', 0); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'l', 0); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'l', 0); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'o', 0); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(rtl::OUString("hello"), collectText(xContext)); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestTypeMultiPara) +{ + load(u"private:factory/swriter"_ustr); + auto xContext = getDocumentAccessibleContext(); + CPPUNIT_ASSERT(xContext.is()); + + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'A', 0); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'B', 0); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::RETURN); + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 'C', 0); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL( + rtl::OUString("ABC"), + collectText(xContext)); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestMenuInsertPageNumber) +{ + load(u"private:factory/swriter"_ustr); + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Field", u"Page Number")); + CPPUNIT_ASSERT_EQUAL(rtl::OUString("1"), collectText()); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestMenuInsertPageBreak) +{ + load(u"private:factory/swriter"_ustr); + + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Field", u"Page Number")); + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Page Break")); + // we need to move focus to the paragraph after the page break to insert the page number there + documentPostKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, awt::Key::DOWN); + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Field", u"Page Number")); + + CPPUNIT_ASSERT_EQUAL(rtl::OUString("12"), + collectText()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sw/qa/extras/accessibility/dialogs.cxx b/sw/qa/extras/accessibility/dialogs.cxx new file mode 100644 index 0000000000..a14eed6bdb --- /dev/null +++ b/sw/qa/extras/accessibility/dialogs.cxx @@ -0,0 +1,199 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +#include + +#include +#include + +using namespace css; + +// FIXME: dialog API doesn't work on macos yet +#if !defined(MACOSX) + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestSpecialCharactersDialog) +{ + load(u"private:factory/swriter"_ustr); + + auto dialogWaiter = awaitDialog(u"Special Characters", [this](Dialog& dialog) { + dumpA11YTree(dialog.getAccessible()->getAccessibleContext()); + + CPPUNIT_ASSERT_EQUAL( + AccessibilityTools::getAccessibleObjectForName( + dialog.getAccessible(), accessibility::AccessibleRole::TEXT, u"Search:"), + getFocusedObject(dialog.getAccessible())); + + // search for (c) symbol + dialog.postExtTextEventAsync(u"copyright"_ustr); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT(dialog.tabTo(accessibility::AccessibleRole::TABLE_CELL, u"©")); + + /* there was a focus issue in this dialog: the table holding the characters always had the + * selected element as focused, even when tabbing outside. + * Fixed with https://gerrit.libreoffice.org/c/core/+/147660. + * Anyway, we still use the target element match API to also exercise it. */ + auto xChild = AccessibilityTools::getAccessibleObjectForName( + dialog.getAccessible(), accessibility::AccessibleRole::PUSH_BUTTON, u"Insert"); + CPPUNIT_ASSERT(xChild); + CPPUNIT_ASSERT(dialog.tabTo(xChild)); + dialog.postKeyEventAsync(0, awt::Key::RETURN); + + Scheduler::ProcessEventsToIdle(); + }); + + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Special Character...")); + CPPUNIT_ASSERT(dialogWaiter->waitEndDialog()); + + CPPUNIT_ASSERT_EQUAL(u"©"_ustr, collectText()); +} + +/* checks for the fix from https://gerrit.libreoffice.org/c/core/+/147660 */ +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestSpecialCharactersDialogFocus) +{ + load(u"private:factory/swriter"_ustr); + + auto dialogWaiter = awaitDialog(u"Special Characters", [](Dialog& dialog) { + CPPUNIT_ASSERT(dialog.tabTo(accessibility::AccessibleRole::TABLE_CELL, u" ")); + + /* as there is a bug that focusing the character table doesn't enable the Insert button + * (https://bugs.documentfoundation.org/show_bug.cgi?id=153806), we move to another cell + * so it works. */ + + // tdf#153918: Check that '!' char has correct accessible name and insert it + dialog.postKeyEventAsync(0, awt::Key::RIGHT); + Scheduler::ProcessEventsToIdle(); + CPPUNIT_ASSERT_EQUAL( + AccessibilityTools::getAccessibleObjectForName( + dialog.getAccessible(), accessibility::AccessibleRole::TABLE_CELL, u"!"), + getFocusedObject(dialog.getAccessible())); + + CPPUNIT_ASSERT(dialog.tabTo(accessibility::AccessibleRole::PUSH_BUTTON, u"Insert")); + dialog.postKeyEventAsync(0, awt::Key::RETURN); + + Scheduler::ProcessEventsToIdle(); + }); + + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Special Character...")); + CPPUNIT_ASSERT(dialogWaiter->waitEndDialog()); + + CPPUNIT_ASSERT_EQUAL(u"!"_ustr, collectText()); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestHyperlinkDialog) +{ + load(u"private:factory/swriter"_ustr); + + auto dialogWaiter = awaitDialog(u"Hyperlink", [this](Dialog& dialog) { + dumpA11YTree(dialog.getAccessible()->getAccessibleContext()); + + // Focus the URL box (should be default, but make sure we're on it) + CPPUNIT_ASSERT(dialog.tabTo(accessibility::AccessibleRole::COMBO_BOX, u"URL:")); + // Fill in an address + dialog.postExtTextEventAsync(u"https://libreoffice.org/"_ustr); + // Validate the whole dialog + dialog.postKeyEventAsync(0, awt::Key::RETURN); + Scheduler::ProcessEventsToIdle(); + }); + + // Activate the Insert->Hyperlink... menu item to open the Hyperlink dialog + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Hyperlink...")); + CPPUNIT_ASSERT(dialogWaiter->waitEndDialog()); + + CPPUNIT_ASSERT_EQUAL(rtl::OUString("https://libreoffice.org/"), + collectText()); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestBookmarkDialog) +{ + load(u"private:factory/swriter"_ustr); + + auto dialogWaiter = awaitDialog(u"Bookmark", [this](Dialog& dialog) { + dumpA11YTree(dialog.getAccessible()->getAccessibleContext()); + + CPPUNIT_ASSERT(dialog.tabTo(accessibility::AccessibleRole::TEXT, u"Name:")); + dialog.postKeyEventAsync(0, awt::Key::SELECT_ALL); + dialog.postKeyEventAsync(0, awt::Key::DELETE); + dialog.postExtTextEventAsync(u"Test Bookmark 1"_ustr); + // Validate the whole dialog + dialog.postKeyEventAsync(0, awt::Key::RETURN); + Scheduler::ProcessEventsToIdle(); + }); + + // Activate the Insert->Bookmark... menu item to open the Bookmark dialog + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Bookmark...")); + CPPUNIT_ASSERT(dialogWaiter->waitEndDialog()); + + CPPUNIT_ASSERT_EQUAL(rtl::OUString("#Test Bookmark 1 Bookmark "), + collectText()); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestSectionDialog) +{ + load(u"private:factory/swriter"_ustr); + + auto dialogWaiter = awaitDialog(u"Insert Section", [this](Dialog& dialog) { + dumpA11YTree(dialog.getAccessible()->getAccessibleContext()); + + // Validate the whole dialog + dialog.postKeyEventAsync(0, awt::Key::RETURN); + Scheduler::ProcessEventsToIdle(); + }); + + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Section...")); + CPPUNIT_ASSERT(dialogWaiter->waitEndDialog()); + + CPPUNIT_ASSERT_EQUAL(rtl::OUString(""), collectText()); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFontworkDialog) +{ + load(u"private:factory/swriter"_ustr); + + auto dialogWaiter = awaitDialog(u"Fontwork Gallery", [this](Dialog& dialog) { + dumpA11YTree(dialog.getAccessible()->getAccessibleContext()); + + // Validate the whole dialog + dialog.postKeyEventAsync(0, awt::Key::RETURN); + Scheduler::ProcessEventsToIdle(); + }); + + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Fontwork...")); + CPPUNIT_ASSERT(dialogWaiter->waitEndDialog()); + + CPPUNIT_ASSERT_EQUAL( + rtl::OUString("Simple"), + collectText()); +} + +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, BasicTestFrameDialog) +{ + load(u"private:factory/swriter"_ustr); + + auto dialogWaiter = awaitDialog(u"Frame", [](Dialog& dialog) { + // Validate the whole dialog + dialog.postKeyEventAsync(0, awt::Key::RETURN); + Scheduler::ProcessEventsToIdle(); + }); + + CPPUNIT_ASSERT(activateMenuItem(u"Insert", u"Frame", u"Frame...")); + CPPUNIT_ASSERT(dialogWaiter->waitEndDialog()); + + CPPUNIT_ASSERT_EQUAL( + rtl::OUString(""), + collectText()); +} + +#endif //defined(MACOSX) + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sw/qa/extras/accessibility/tdf155705.cxx b/sw/qa/extras/accessibility/tdf155705.cxx new file mode 100644 index 0000000000..c145c7b2c8 --- /dev/null +++ b/sw/qa/extras/accessibility/tdf155705.cxx @@ -0,0 +1,57 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +using namespace css; + +/* This test only works if spell checking is available for en_US */ +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, tdf155705) +{ + loadFromSrc(u"/sw/qa/extras/accessibility/testdocuments/tdf155705.fodt"_ustr); + + /* we need to give it a second to fully set up the XAccessibleTextMarkup, otherwise we get a + * dysfunctional one that asserts out on m_pTextFrame */ + Scheduler::ProcessEventsToIdle(); + + uno::Reference xLSM2 + = linguistic2::LinguServiceManager::create(m_xContext); + uno::Reference xSpell(xLSM2->getSpellChecker(), uno::UNO_QUERY); + if (!xSpell.is() || !xSpell->hasLanguage(static_cast(LANGUAGE_ENGLISH_US))) + return; + + auto xContext = getDocumentAccessibleContext(); + CPPUNIT_ASSERT(xContext.is()); + + auto xChildContext = getAllChildren(xContext).back(); + uno::Reference xMarkup(xChildContext, + uno::UNO_QUERY_THROW); + + // make sure the idle spellcheck pass runs + AccessibilityTools::Await( + [&xMarkup]() { return 0 < xMarkup->getTextMarkupCount(text::TextMarkupType::SPELLCHECK); }); + + CPPUNIT_ASSERT_GREATER(sal_Int32(0), + xMarkup->getTextMarkupCount(text::TextMarkupType::SPELLCHECK)); + auto aSegment = xMarkup->getTextMarkup(0, text::TextMarkupType::SPELLCHECK); + CPPUNIT_ASSERT_GREATEREQUAL(sal_Int32(0), aSegment.SegmentStart); + CPPUNIT_ASSERT_GREATER(aSegment.SegmentStart, aSegment.SegmentEnd); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sw/qa/extras/accessibility/testdocuments/tdf155705.fodt b/sw/qa/extras/accessibility/testdocuments/tdf155705.fodt new file mode 100644 index 0000000000..8a22551ca9 --- /dev/null +++ b/sw/qa/extras/accessibility/testdocuments/tdf155705.fodt @@ -0,0 +1,130 @@ + + + 2023-04-25T17:37:52.1595263912023-06-06T15:18:10.069098642P6DT23H42M3S23LibreOfficeDev/7.6.0.0.alpha1$Linux_X86_64 LibreOffice_project/b0d48d46ca30e7ea8f38af9a29080d76d01ad0ae + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + + + \ No newline at end of file diff --git a/sw/qa/extras/accessibility/testdocuments/unicode.fodf b/sw/qa/extras/accessibility/testdocuments/unicode.fodf new file mode 100644 index 0000000000..9bdccebf03 --- /dev/null +++ b/sw/qa/extras/accessibility/testdocuments/unicode.fodf @@ -0,0 +1,135 @@ + + + 2022-10-12T18:05:31.4089004852023-05-11T10:35:16.229411275PT9M45S3LibreOfficeDev/7.6.0.0.alpha0$Linux_X86_64 LibreOffice_project/44c4d9ba0d480c8e2f05c9400f310184efc7e40c + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 🂡🂮🂬🂫 + akcj + + + \ No newline at end of file diff --git a/sw/qa/extras/accessibility/unicode.cxx b/sw/qa/extras/accessibility/unicode.cxx new file mode 100644 index 0000000000..0130ee1dc4 --- /dev/null +++ b/sw/qa/extras/accessibility/unicode.cxx @@ -0,0 +1,102 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include + +using namespace css; +using namespace accessibility; + +// Checks fetching multi-unit characters +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestUnicodeSP) +{ + loadFromSrc(u"/sw/qa/extras/accessibility/testdocuments/unicode.fodf"_ustr); + + auto xContext = getDocumentAccessibleContext()->getAccessibleChild(0)->getAccessibleContext(); + + uno::Reference para(xContext, uno::UNO_QUERY_THROW); + auto segment = para->getTextAtIndex(0, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u"\U0001f0a1"_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), segment.SegmentEnd); + + segment = para->getTextBeforeIndex(2, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u"\U0001f0a1"_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), segment.SegmentEnd); + + segment = para->getTextBehindIndex(0, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u"\U0001f0ae"_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), segment.SegmentEnd); +} + +// Checks getTextBehindIndex() with multi-unit characters +CPPUNIT_TEST_FIXTURE(test::SwAccessibleTestBase, TestUnicodeSPBehindIndex) +{ + loadFromSrc(u"/sw/qa/extras/accessibility/testdocuments/unicode.fodf"_ustr); + + auto xContext = getDocumentAccessibleContext()->getAccessibleChild(0)->getAccessibleContext(); + + uno::Reference para(xContext, uno::UNO_QUERY_THROW); + auto nChCount = para->getCharacterCount(); + + // verify bounds are properly handled + CPPUNIT_ASSERT_THROW(para->getTextBehindIndex(-1, AccessibleTextType::CHARACTER), + lang::IndexOutOfBoundsException); + CPPUNIT_ASSERT_THROW(para->getTextBehindIndex(nChCount + 1, AccessibleTextType::CHARACTER), + lang::IndexOutOfBoundsException); + + auto segment = para->getTextBehindIndex(nChCount, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u""_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentEnd); + + segment = para->getTextBehindIndex(nChCount - 2, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u""_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentEnd); + + segment = para->getTextBehindIndex(nChCount - 4, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u"\U0001f0ab"_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8), segment.SegmentEnd); + + // verify bounds behave the same with single unit characters, just as a validation + xContext = getNextFlowingSibling(xContext); + CPPUNIT_ASSERT(xContext.is()); + para.set(xContext, uno::UNO_QUERY_THROW); + + nChCount = para->getCharacterCount(); + + CPPUNIT_ASSERT_THROW(para->getTextBehindIndex(-1, AccessibleTextType::CHARACTER), + lang::IndexOutOfBoundsException); + CPPUNIT_ASSERT_THROW(para->getTextBehindIndex(nChCount + 1, AccessibleTextType::CHARACTER), + lang::IndexOutOfBoundsException); + + segment = para->getTextBehindIndex(nChCount, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u""_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentEnd); + + segment = para->getTextBehindIndex(nChCount - 1, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u""_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), segment.SegmentEnd); + + segment = para->getTextBehindIndex(nChCount - 2, AccessibleTextType::CHARACTER); + CPPUNIT_ASSERT_EQUAL(u"j"_ustr, segment.SegmentText); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), segment.SegmentStart); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), segment.SegmentEnd); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/sw/qa/extras/data/odt/test.odt b/sw/qa/extras/data/odt/test.odt new file mode 100644 index 0000000000..b73c2e5708 Binary files /dev/null and b/sw/qa/extras/data/odt/test.odt differ diff --git a/sw/qa/extras/docbookexport/data/simple.docx b/sw/qa/extras/docbookexport/data/simple.docx new file mode 100644 index 0000000000..89081fd3cb Binary files /dev/null and b/sw/qa/extras/docbookexport/data/simple.docx differ diff --git a/sw/qa/extras/docbookexport/data/tdf91095.docx b/sw/qa/extras/docbookexport/data/tdf91095.docx new file mode 100644 index 0000000000..fbe23c80e6 Binary files /dev/null and b/sw/qa/extras/docbookexport/data/tdf91095.docx differ diff --git a/sw/qa/extras/docbookexport/docbookexport.cxx b/sw/qa/extras/docbookexport/docbookexport.cxx new file mode 100644 index 0000000000..10568528b1 --- /dev/null +++ b/sw/qa/extras/docbookexport/docbookexport.cxx @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +class DocbookExportTest : public SwModelTestBase +{ +public: + DocbookExportTest() : + SwModelTestBase("/sw/qa/extras/docbookexport/data/", "DocBook File") + {} +}; + +#define DECLARE_DOCBOOKEXPORT_TEST(TestName, filename) DECLARE_SW_EXPORT_TEST(TestName, filename, nullptr, DocbookExportTest) + +DECLARE_DOCBOOKEXPORT_TEST(testsimple, "simple.docx") +{ + xmlDocUniquePtr pDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPathContent(pDoc, "/article/para"_ostr, "aaaa"); +} + +/* the test actually should crash with this file */ +DECLARE_DOCBOOKEXPORT_TEST(testtdf91095, "tdf91095.docx") +{ + xmlDocUniquePtr pDoc = parseXml(maTempFile); + CPPUNIT_ASSERT(pDoc); +} + + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/fodfexport/data/SvgImageTest.fodt b/sw/qa/extras/fodfexport/data/SvgImageTest.fodt new file mode 100644 index 0000000000..4246a7cb5e --- /dev/null +++ b/sw/qa/extras/fodfexport/data/SvgImageTest.fodt @@ -0,0 +1,321 @@ + + + + 2023-12-01T21:40:25.0108966092023-12-02T14:20:24.763250978PT2M41S2LibreOffice/7.6.3.1$Linux_X86_64 LibreOffice_project/60$Build-1 + + + 0 + 0 + 58104 + 33657 + true + false + + + view2 + 20551 + 17866 + 0 + 0 + 58103 + 33655 + 0 + 1 + false + 100 + false + false + false + false + false + false + + + + + true + false + true + false + true + false + false + 0 + true + false + true + false + false + false + false + true + false + false + + false + false + true + false + false + true + true + false + false + false + false + false + false + true + false + false + 925541 + false + + true + false + false + 982611 + true + false + false + false + 1 + true + true + false + false + true + false + false + true + true + true + false + true + 0 + + false + true + true + true + + 0 + true + false + false + false + high-resolution + true + true + false + false + true + false + false + false + false + true + + true + false + true + false + + false + false + false + true + false + false + false + false + false + false + false + false + false + false + 0 + true + false + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSBDcmVhdGVkIHdp + dGggSW5rc2NhcGUgKGh0dHA6Ly93d3cuaW5rc2NhcGUub3JnLykgLS0+Cjxzdmcgd2lkdGg9 + IjEwbW0iIGhlaWdodD0iMTBtbSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTAgMTAi + IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8cmVjdCB4PSIxIiB5PSIx + IiB3aWR0aD0iOCIgaGVpZ2h0PSI4IiByeD0iMiIgcnk9IjIiIGZpbGw9IiMwZmM5NTQiIHN0 + cm9rZS13aWR0aD0iMi4xMTY3Ii8+Cjwvc3ZnPgo= + + + + iVBORw0KGgoAAAANSUhEUgAAACcAAAAnCAYAAACMo1E1AAABqklEQVRYhe2Yu0oDQRiFzxkV + xCLpUihaii9gtIyXeKmDzyBIfBltxEcIWtoYCWurWKutly5CVlALszkWEsGZzaqru4mwX3lm + lv9j57Y7lIRBxfRbIIpMLi7DX3XgxeZILmguQiyTHP/OMxG0BdxDqj++NBsqee3I2lELIn9W + WaW4A3L6F0LhSNeS2fbna/Ufy+XPN7Yo7QAc+nOxDxQIqPrFg71vy+XPKqsEj5IV66IA1Fpr + 9vDEbnEWBL3SMMWE39inikPomF16JWcuO3K5scJyInMsCmImN1pYsOOQrURLafg4mE7ZieyA + 0mQ6NnZdTNmZIydwLB2dr+sO9AmRycUlk4tLJheXTC4umVxcMrm4/C85Qs/9ECH1ZGfu9xx5 + m46OVRe4sTN3WKWe/5FJQuDYzhy5x5dmA9J1OkpddOk/N0/t1B3WkteWzDagICWxADLVsKuJ + 0NXqz9fqAqrJCyqAzFZrrtYIa+25lfjFgz11zDqEq4TELiGz0pqr7ffqEXmRA7zfAORGCwsw + nTKFCZAj8X30KuKOVN1/evB+dcvUb/7XCTFIDLTcG/DxnDT71BIPAAAAAElFTkSuQmCC + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/fodfexport/data/tdf113696-writerimage.odt b/sw/qa/extras/fodfexport/data/tdf113696-writerimage.odt new file mode 100644 index 0000000000..f8aee08360 Binary files /dev/null and b/sw/qa/extras/fodfexport/data/tdf113696-writerimage.odt differ diff --git a/sw/qa/extras/fodfexport/data/tdf113696.odt b/sw/qa/extras/fodfexport/data/tdf113696.odt new file mode 100644 index 0000000000..03e0612a3d Binary files /dev/null and b/sw/qa/extras/fodfexport/data/tdf113696.odt differ diff --git a/sw/qa/extras/fodfexport/fodfexport.cxx b/sw/qa/extras/fodfexport/fodfexport.cxx new file mode 100644 index 0000000000..2cf5bf42a7 --- /dev/null +++ b/sw/qa/extras/fodfexport/fodfexport.cxx @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/fodfexport/data/", "OpenDocument Text Flat XML") + { + } +}; + +DECLARE_FODFEXPORT_TEST(testTdf113696, "tdf113696.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test that an image which is written in svm format (image/x-vclgraphic) + // is accompanied by a png fallback graphic. + if (xmlDocUniquePtr pXmlDoc = parseExportedFile()) + { + assertXPath(pXmlDoc, "/office:document/office:body/office:text/text:p/draw:frame/" + "draw:image[@draw:mime-type='image/x-vclgraphic']"_ostr); + assertXPath(pXmlDoc, "/office:document/office:body/office:text/text:p/draw:frame/" + "draw:image[@draw:mime-type='image/png']"_ostr); + } +} + +DECLARE_FODFEXPORT_TEST(testTdf113696WriterImage, "tdf113696-writerimage.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Same as testTdf113696, but with a writer image instead of a draw image + // (they use different code paths). + if (xmlDocUniquePtr pXmlDoc = parseExportedFile()) + { + assertXPath(pXmlDoc, "/office:document/office:body/office:text/text:p/draw:frame/" + "draw:image[@draw:mime-type='image/x-vclgraphic']"_ostr); + assertXPath(pXmlDoc, "/office:document/office:body/office:text/text:p/draw:frame/" + "draw:image[@draw:mime-type='image/png']"_ostr); + } +} + +DECLARE_FODFEXPORT_TEST(testSvgImageRoundtrip, "SvgImageTest.fodt") +{ + // Related to tdf#123396 + + // We should have one image (shape) + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + // Get the shape and extract the Graphic + uno::Reference xShape = getShape(1); + uno::Reference XPropertySet(xShape, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(XPropertySet.is()); + uno::Reference xGraphic; + XPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT(xGraphic.is()); + Graphic aGraphic(xGraphic); + + // The graphic should be SVG - so should contain a VectorGraphicData + auto const& pVectorGraphicData = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT(pVectorGraphicData); + + // The VectorGraphicData type should be SVG + CPPUNIT_ASSERT_EQUAL(VectorGraphicDataType::Svg, pVectorGraphicData->getType()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/globalfilter/data/BulletAsImage.odt b/sw/qa/extras/globalfilter/data/BulletAsImage.odt new file mode 100644 index 0000000000..27622aac4e Binary files /dev/null and b/sw/qa/extras/globalfilter/data/BulletAsImage.odt differ diff --git a/sw/qa/extras/globalfilter/data/SvgImageTest.odt b/sw/qa/extras/globalfilter/data/SvgImageTest.odt new file mode 100644 index 0000000000..3b37fe7998 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/SvgImageTest.odt differ diff --git a/sw/qa/extras/globalfilter/data/char_background.odt b/sw/qa/extras/globalfilter/data/char_background.odt new file mode 100644 index 0000000000..d2dcea0695 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/char_background.odt differ diff --git a/sw/qa/extras/globalfilter/data/char_background_editing.docx b/sw/qa/extras/globalfilter/data/char_background_editing.docx new file mode 100644 index 0000000000..5e92fe8bbd Binary files /dev/null and b/sw/qa/extras/globalfilter/data/char_background_editing.docx differ diff --git a/sw/qa/extras/globalfilter/data/char_highlight.docx b/sw/qa/extras/globalfilter/data/char_highlight.docx new file mode 100644 index 0000000000..e601bac111 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/char_highlight.docx differ diff --git a/sw/qa/extras/globalfilter/data/checkbox_form_field.odt b/sw/qa/extras/globalfilter/data/checkbox_form_field.odt new file mode 100644 index 0000000000..14c931ed37 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/checkbox_form_field.odt differ diff --git a/sw/qa/extras/globalfilter/data/date_form_field.odt b/sw/qa/extras/globalfilter/data/date_form_field.odt new file mode 100644 index 0000000000..2b786a4146 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/date_form_field.odt differ diff --git a/sw/qa/extras/globalfilter/data/date_form_field_char_formatting.odt b/sw/qa/extras/globalfilter/data/date_form_field_char_formatting.odt new file mode 100644 index 0000000000..eb77026205 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/date_form_field_char_formatting.odt differ diff --git a/sw/qa/extras/globalfilter/data/document_with_linked_graphic.odt b/sw/qa/extras/globalfilter/data/document_with_linked_graphic.odt new file mode 100644 index 0000000000..e7aeda6e2e Binary files /dev/null and b/sw/qa/extras/globalfilter/data/document_with_linked_graphic.odt differ diff --git a/sw/qa/extras/globalfilter/data/document_with_two_images.odt b/sw/qa/extras/globalfilter/data/document_with_two_images.odt new file mode 100644 index 0000000000..54d3d666de Binary files /dev/null and b/sw/qa/extras/globalfilter/data/document_with_two_images.odt differ diff --git a/sw/qa/extras/globalfilter/data/dropdown_form_field.odt b/sw/qa/extras/globalfilter/data/dropdown_form_field.odt new file mode 100644 index 0000000000..caaa66acda Binary files /dev/null and b/sw/qa/extras/globalfilter/data/dropdown_form_field.odt differ diff --git a/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.docx b/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.docx new file mode 100644 index 0000000000..9fbec01e0a Binary files /dev/null and b/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.docx differ diff --git a/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.fodt b/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.fodt new file mode 100644 index 0000000000..86b17a15bb --- /dev/null +++ b/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.fodt @@ -0,0 +1,133 @@ + + + Michael StahlMichael Stahl22019-01-24T14:48:002019-01-24T14:48:00P0DLibreOfficeDev/7.5.0.0.alpha0$Linux_X86_64 LibreOffice_project/be346d6cdc87b18dc861279187915de42722e97015.0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + QUOTE "foo + QUOTE "foo + bar + baz" foo + bar + baz + bar + baz" foo + foo + bar + baz + bar + baz + + + + \ No newline at end of file diff --git a/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.rtf b/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.rtf new file mode 100644 index 0000000000..04c8384fd6 --- /dev/null +++ b/sw/qa/extras/globalfilter/data/fieldmark_QUOTE_nest.rtf @@ -0,0 +1,249 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch37\stshfloch37\stshfhich37\stshfbi0\deflang1031\deflangfe1031\themelang1031\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +{\f279\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\f280\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};} +{\f282\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\f283\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};} +{\f284\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\f285\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};} +{\f286\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\f287\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\f619\fbidi \froman\fcharset238\fprq2 Cambria Math CE;} +{\f620\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f622\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f623\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f626\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;} +{\f627\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f649\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f650\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f652\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;} +{\f653\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f654\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f655\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f656\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\f657\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};} +{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;}{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;} +{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);}{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);} +{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);} +{\fhiminor\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} +{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times New Roman};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times New Roman};} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times New Roman};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times New Roman};} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times New Roman};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times New Roman};} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times New Roman};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times New Roman};}}{\colortbl;\red0\green0\blue0; +\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128; +\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \loch\af37\hich\af37\dbch\af37 }{\*\defpap \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 } +\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1031\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp1031\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1031\langfe1031\loch\f37\hich\af37\dbch\af37\cgrid\langnp1031\langfenp1031 \snext11 \ssemihidden \sunhideused +Normal Table;}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid1061464\rsid1922412\rsid5796261\rsid12332008\rsid13762899\rsid16735927}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 +\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Michael Stahl}{\operator Michael Stahl}{\creatim\yr2019\mo1\dy24\hr15\min48}{\revtim\yr2019\mo1\dy24\hr15\min48}{\version2}{\edmins0}{\nofpages1}{\nofwords13}{\nofchars89}{\nofcharsws101}{\vern57447}} +{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1417\margr1417\margt1417\margb1134\gutter0\ltrsect +\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0 +\showxmlerrors1\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1417\dgvorigin1417\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot1061464\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1031\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1031\langfenp1033 {\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1061464 \hich\af37\dbch\af37\loch\f37 \hich\af37\dbch\af37\loch\f37 QUOTE "foo +\par }\pard \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13762899 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1061464 \hich\af37\dbch\af37\loch\f37 }{\field{\*\fldinst {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid13762899 \hich\af37\dbch\af37\loch\f37 \hich\af37\dbch\af37\loch\f37 QUOTE "foo +\par \hich\af37\dbch\af37\loch\f37 bar +\par \hich\af37\dbch\af37\loch\f37 baz"\hich\af37\dbch\af37\loch\f37 }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13762899 \hich\af37\dbch\af37\loch\f37 foo +\par \hich\af37\dbch\af37\loch\f37 bar +\par \hich\af37\dbch\af37\loch\f37 baz}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13762899 +\par }\pard \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1061464 \hich\af37\dbch\af37\loch\f37 bar +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang6153\langfe1033\langnp6153\insrsid1061464\charrsid13762899 \hich\af37\dbch\af37\loch\f37 baz"\hich\af37\dbch\af37\loch\f37 }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang6153\langfe1033\langnp6153\insrsid13762899\charrsid13762899 \hich\af37\dbch\af37\loch\f37 foo +\par }\pard \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13762899 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang6153\langfe1033\langnp6153\insrsid13762899\charrsid13762899 +\hich\af37\dbch\af37\loch\f37 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang6153\langfe1033\langnp6153\insrsid13762899\charrsid13762899 \hich\af37\dbch\af37\loch\f37 foo +\par \hich\af37\dbch\af37\loch\f37 bar +\par \hich\af37\dbch\af37\loch\f37 baz +\par }\pard \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang6153\langfe1033\langnp6153\insrsid13762899\charrsid13762899 \hich\af37\dbch\af37\loch\f37 bar + +\par \hich\af37\dbch\af37\loch\f37 baz}}}\pard\plain \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1031\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1031\langfenp1033 \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang6153\langfe1033\langnp6153\insrsid5796261\charrsid13762899 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang6153\langfe1033\langnp6153\insrsid16735927\charrsid1061464 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b030414000600080000002100aa5225dfc60600008b1a0000160000007468656d652f7468656d652f +7468656d65312e786d6cec595d8bdb46147d2ff43f08bd3bfe92fcb1c41b6cd9ceb6d94d42eca4e4716c8fadc98e344633de8d0981923c160aa569e943037deb +43691b48a02fe9afd936a54d217fa17746b63c638fbb9b2585a5640d8b343af7ce997bafce1d4997afdc8fa87384134e58dc708b970aae83e3211b9178d2706f +f7bbb99aeb7081e211a22cc60d778eb97b65f7c30f2ea31d11e2083b601ff31dd4704321a63bf93c1fc230e297d814c7706dcc920809384d26f951828ec16f44 +f3a542a1928f10895d274611b8bd311e932176fad2a5bbbb74dea1701a0b2e078634e949d7d8b050d8d1615122f89c0734718e106db830cf881df7f17de13a14 +7101171a6e41fdb9f9ddcb79b4b330a2628bad66d7557f0bbb85c1e8b0a4e64c26836c52cff3bd4a33f3af00546ce23ad54ea553c9fc29001a0e61a52917dda7 +dfaab7dafe02ab81d2438bef76b55d2e1a78cd7f798373d3973f03af40a97f6f03dfed06104503af4029dedfc07b5eb51478065e81527c65035f2d34db5ed5c0 +2b5048497cb8812ef89572b05c6d061933ba6785d77daf5b2d2d9caf50500d5975c929c62c16db6a2d42f758d2058004522448ec88f9148fd110aa3840940c12 +e2ec93490885374531e3305c2815ba8532fc973f4f1da988a01d8c346bc90b98f08d21c9c7e1c3844c45c3fd18bcba1ae4cdcb1fdfbc7cee9c3c7a71f2e89793 +c78f4f1efd9c3a32acf6503cd1ad5e7fffc5df4f3f75fe7afeddeb275fd9f15cc7fffed367bffdfaa51d082b5d85e0d5d7cffe78f1ecd5379ffff9c3130bbc99 +a0810eef930873e73a3e766eb10816a6426032c783e4ed2cfa2122ba45339e701423398bc57f478406fafa1c5164c1b5b019c13b09488c0d787576cf20dc0b93 +9920168fd7c2c8001e30465b2cb146e19a9c4b0b737f164fec9327331d770ba123dbdc018a8dfc766653d05662731984d8a07993a258a0098eb170e4357688b1 +6575770931e27a408609e36c2c9cbbc46921620d499f0c8c6a5a19ed9108f232b711847c1bb139b8e3b418b5adba8d8f4c24dc15885ac8f73135c27815cd048a +6c2efb28a27ac0f791086d247bf364a8e33a5c40a6279832a733c29cdb6c6e24b05e2de9d7405eec693fa0f3c84426821cda7cee23c674649b1d06218aa6366c +8fc4a18efd881f428922e7261336f80133ef10790e7940f1d674df21d848f7e96a701b9455a7b42a107965965872791533a37e7b733a4658490d08bfa1e71189 +4f15f73559f7ff5b5907217df5ed53cbaa2eaaa0371362bda3f6d6647c1b6e5dbc03968cc8c5d7ee369ac53731dc2e9b0decbd74bf976ef77f2fdddbeee7772f +d82b8d06f9965bc574abae36eed1d67dfb9850da13738af7b9daba73e84ca32e0c4a3bf5cc8ab3e7b8690887f24e86090cdc2441cac64998f88488b017a229ec +ef8bae7432e10bd713ee4c19876dbf1ab6fa96783a8b0ed8287d5c2d16e5a3692a1e1c89d578c1cfc6e15143a4e84a75f50896b9576c27ea51794940dabe0d09 +6d329344d942a2ba1c9441520fe610340b09b5b277c2a26e615193ee97a9da6001d4b2acc0d6c9810d57c3f53d30012378a242148f649ed2542fb3ab92f92e33 +bd2d984605c03e625901ab4cd725d7adcb93ab4b4bed0c99364868e566925091513d8c87688417d52947cf42e36d735d5fa5d4a02743a1e683d25ad1a8d6fe8d +c579730d76ebda40635d2968ec1c37dc4ad9879219a269c31dc3633f1c4653a81d2eb7bc884ee0ddd95024e90d7f1e6599265cb4110fd3802bd149d520220227 +0e2551c395cbcfd24063a5218a5bb104827061c9d541562e1a3948ba99643c1ee3a1d0d3ae8dc848a7a7a0f0a95658af2af3f383a5259b41ba7be1e8d819d059 +720b4189f9d5a20ce0887078fb534ca33922f03a3313b255fdad35a685eceaef13550da5e3884e43b4e828ba98a77025e5191d7596c5403b5bac1902aa8564d1 +080713d960f5a01add34eb1a2987ad5df7742319394d34573dd35015d935ed2a66ccb06c036bb13c5f93d7582d430c9aa677f854bad725b7bed4bab57d42d625 +20e059fc2c5df70c0d41a3b69acca026196fcab0d4ecc5a8d93b960b3c85da599a84a6fa95a5dbb5b8653dc23a1d0c9eabf383dd7ad5c2d078b9af549156df3d +f44f136c700fc4a30d2f81675470954af8f09020d810f5d49e24950db845ee8bc5ad0147ce2c210df741c16f7a41c90f72859adfc97965af90abf9cd72aee9fb +e562c72f16daadd243682c228c8a7efacda50bafa2e87cf1e5458d6f7c7d89966fdb2e0d599467eaeb4a5e11575f5f8aa5ed5f5f1c02a2f3a052ead6cbf55625 +572f37bb39afddaae5ea41a5956b57826abbdb0efc5abdfbd0758e14d86b9603afd2a9e52ac520c8799582a45fabe7aa5ea9d4f4aacd5ac76b3e5c6c6360e5a9 +7c2c6201e155bc76ff010000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f +7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be +9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980 +ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5b +babac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c0200001300000000000000000000000000000000005b436f6e74656e +745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f +2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000190200007468656d652f7468656d652f74 +68656d654d616e616765722e786d6c504b01022d0014000600080000002100aa5225dfc60600008b1a00001600000000000000000000000000d6020000746865 +6d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b0100002700000000000000000000000000d00900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000cb0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong; +\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Table;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 1; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 3; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 6; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 6; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Contemporary;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Elegant;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Professional; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 2; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Theme;\lsdsemihidden1 \lsdlocked0 Placeholder Text; +\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; +\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; +\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; +\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; +\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; +\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; +\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; +\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; +\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; +\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; +\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; +\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e500000000000000000000000010aa +78dbf3b3d4010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff02000000000000000000000000000000000000000000000010aa78dbf3b3d401 +10aa78dbf3b3d4010000000000000000000000004f00c600520049004f005800c7005400c700c40053003200d400c00033004b004100d800cc003000430041003d003d000000000000000000000000000000000032000101ffffffffffffffff03000000000000000000000000000000000000000000000010aa78dbf3b3 +d40110aa78dbf3b3d4010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000f100000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f757263657320786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d +22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222053656c65637465645374796c653d225c415041536978746845646974696f6e4f66666963654f6e6c696e652e78736c22205374796c654e616d +653d22415041222056657273696f6e3d2236222f3e0000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b33393438 +363433412d443337392d343439452d394344322d3037344130333842314130387d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/sw/qa/extras/globalfilter/data/graphic_shape.odt b/sw/qa/extras/globalfilter/data/graphic_shape.odt new file mode 100644 index 0000000000..425e8c2f32 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/graphic_shape.odt differ diff --git a/sw/qa/extras/globalfilter/data/images_with_special_IDs.odt b/sw/qa/extras/globalfilter/data/images_with_special_IDs.odt new file mode 100644 index 0000000000..d4c62f5d2b Binary files /dev/null and b/sw/qa/extras/globalfilter/data/images_with_special_IDs.odt differ diff --git a/sw/qa/extras/globalfilter/data/linked_graphic.jpg b/sw/qa/extras/globalfilter/data/linked_graphic.jpg new file mode 100644 index 0000000000..2218cdd72d Binary files /dev/null and b/sw/qa/extras/globalfilter/data/linked_graphic.jpg differ diff --git a/sw/qa/extras/globalfilter/data/multiple_identical_graphics.odt b/sw/qa/extras/globalfilter/data/multiple_identical_graphics.odt new file mode 100644 index 0000000000..20f40798ed Binary files /dev/null and b/sw/qa/extras/globalfilter/data/multiple_identical_graphics.odt differ diff --git a/sw/qa/extras/globalfilter/data/skipimages.doc b/sw/qa/extras/globalfilter/data/skipimages.doc new file mode 100644 index 0000000000..3c40599b08 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/skipimages.doc differ diff --git a/sw/qa/extras/globalfilter/data/skipimages.docx b/sw/qa/extras/globalfilter/data/skipimages.docx new file mode 100644 index 0000000000..cc6a4f4cea Binary files /dev/null and b/sw/qa/extras/globalfilter/data/skipimages.docx differ diff --git a/sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt b/sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt new file mode 100644 index 0000000000..6886ed8f71 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt differ diff --git a/sw/qa/extras/globalfilter/data/tdf143311-1.docx b/sw/qa/extras/globalfilter/data/tdf143311-1.docx new file mode 100644 index 0000000000..b6b2d08981 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/tdf143311-1.docx differ diff --git a/sw/qa/extras/globalfilter/data/text13e.odt b/sw/qa/extras/globalfilter/data/text13e.odt new file mode 100644 index 0000000000..bb16e0467e Binary files /dev/null and b/sw/qa/extras/globalfilter/data/text13e.odt differ diff --git a/sw/qa/extras/globalfilter/data/text_form_field.odt b/sw/qa/extras/globalfilter/data/text_form_field.odt new file mode 100644 index 0000000000..96af26f770 Binary files /dev/null and b/sw/qa/extras/globalfilter/data/text_form_field.odt differ diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx new file mode 100644 index 0000000000..9d7c28b83f --- /dev/null +++ b/sw/qa/extras/globalfilter/globalfilter.cxx @@ -0,0 +1,2267 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/globalfilter/data/") {} + + void testEmbeddedGraphicRoundtrip(); + void testLinkedGraphicRT(); + void testImageWithSpecialID(); + void testGraphicShape(); + void testMultipleIdenticalGraphics(); + void testCharHighlight(); + void testCharHighlightODF(); + void testCharHighlightBody(); + void testCharStyleHighlight(); + void testMSCharBackgroundEditing(); + void testCharBackgroundToHighlighting(); +#if !defined(_WIN32) + void testSkipImages(); +#endif + void testNestedFieldmark(); + void verifyText13(char const*); + void testODF13(); + void testRedlineFlags(); + void testBulletAsImage(); + void testTextFormField(); + void testCheckBoxFormField(); + void testDropDownFormField(); + void testDateFormField(); + void testDateFormFieldCharacterFormatting(); + void testSvgImageSupport(); + + CPPUNIT_TEST_SUITE(Test); + CPPUNIT_TEST(testEmbeddedGraphicRoundtrip); + CPPUNIT_TEST(testLinkedGraphicRT); + CPPUNIT_TEST(testImageWithSpecialID); + CPPUNIT_TEST(testGraphicShape); + CPPUNIT_TEST(testMultipleIdenticalGraphics); + CPPUNIT_TEST(testCharHighlight); + CPPUNIT_TEST(testCharHighlightODF); + CPPUNIT_TEST(testMSCharBackgroundEditing); + CPPUNIT_TEST(testCharBackgroundToHighlighting); +#if !defined(_WIN32) + CPPUNIT_TEST(testSkipImages); +#endif + CPPUNIT_TEST(testNestedFieldmark); + CPPUNIT_TEST(testODF13); + CPPUNIT_TEST(testRedlineFlags); + CPPUNIT_TEST(testBulletAsImage); + CPPUNIT_TEST(testTextFormField); + CPPUNIT_TEST(testCheckBoxFormField); + CPPUNIT_TEST(testDropDownFormField); + CPPUNIT_TEST(testDateFormField); + CPPUNIT_TEST(testDateFormFieldCharacterFormatting); + CPPUNIT_TEST(testSvgImageSupport); + CPPUNIT_TEST_SUITE_END(); +}; + +void Test::testEmbeddedGraphicRoundtrip() +{ + OUString aFilterNames[] = { + "writer8", + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + // Check whether the export code swaps in the image which was swapped out before by auto mechanism + + createSwDoc("document_with_two_images.odt"); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check whether graphic exported well after it was swapped out + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 2, getShapes()); + + // First image + uno::Reference xImage(getShape(1), uno::UNO_QUERY); + uno::Reference< beans::XPropertySet > XPropSet( xImage, uno::UNO_QUERY_THROW ); + + // Check graphic, size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), graphic::GraphicType::PIXEL, xGraphic->getType()); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(610), xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(381), xBitmap->getSize().Height); + } + + // Second Image + xImage.set(getShape(2), uno::UNO_QUERY); + XPropSet.set( xImage, uno::UNO_QUERY_THROW ); + + // Check graphic, size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), graphic::GraphicType::PIXEL, xGraphic->getType()); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(900), xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(600), xBitmap->getSize().Height); + } + } +} + +void Test::testLinkedGraphicRT() +{ + const OUString aFilterNames[] = { + "writer8", +// "Rich Text Format", Note: picture is there, but SwGrfNode is not found? + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("document_with_linked_graphic.odt"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pDoc); + SwNodes& aNodes = pDoc->GetNodes(); + + // Find the image + bool bImageFound = false; + Graphic aGraphic; + for (SwNodeOffset nIndex(0); nIndex < aNodes.Count(); ++nIndex) + { + if (aNodes[nIndex]->IsGrfNode()) + { + SwGrfNode* pGrfNode = aNodes[nIndex]->GetGrfNode(); + CPPUNIT_ASSERT(pGrfNode); + + const GraphicObject& rGraphicObj = pGrfNode->GetGrfObj(true); + aGraphic = rGraphicObj.GetGraphic(); + bImageFound = true; + } + } + + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), bImageFound); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), GraphicType::Bitmap, aGraphic.GetType()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_uLong(864900), aGraphic.GetSizeBytes()); + + // Check if linked graphic is registered in LinkManager + sfx2::LinkManager& rLinkManager = pTextDoc->GetDocShell()->GetDoc()->GetEditShell()->GetLinkManager(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), size_t(1), rLinkManager.GetLinks().size()); + const tools::SvRef & rLink = rLinkManager.GetLinks()[0]; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), rLink->GetLinkSourceName().indexOf("linked_graphic.jpg") >= 0); + } +} + +void Test::testImageWithSpecialID() +{ + // Check how LO handles when the imported graphic's ID is different from that one + // which is generated by LO. + + const OUString aFilterNames[] = { + "writer8", + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("images_with_special_IDs.odt"); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check whether graphic exported well + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 2, getShapes()); + + uno::Reference xImage = getShape(1); + uno::Reference< beans::XPropertySet > XPropSet( xImage, uno::UNO_QUERY_THROW ); + + // Check graphic, size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), graphic::GraphicType::PIXEL, xGraphic->getType()); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(610), xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(381), xBitmap->getSize().Height); + } + + // Second Image + xImage.set(getShape(2), uno::UNO_QUERY); + XPropSet.set( xImage, uno::UNO_QUERY_THROW ); + + // Check graphic, size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), graphic::GraphicType::PIXEL, xGraphic->getType()); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(900), xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(600), xBitmap->getSize().Height); + } + } +} + +/// Gives the first embedded or linked image in a document. +static uno::Reference lcl_getShape(const uno::Reference& xComponent, bool bEmbedded) +{ + uno::Reference xShape; + + uno::Reference xDrawPageSupplier(xComponent, uno::UNO_QUERY); + uno::Reference xDrawPage = xDrawPageSupplier->getDrawPage(); + for (sal_Int32 i = 0; i < xDrawPage->getCount(); ++i) + { + uno::Reference xShapeProperties(xDrawPage->getByIndex(i), uno::UNO_QUERY); + uno::Reference xGraphic; + xShapeProperties->getPropertyValue("Graphic") >>= xGraphic; + if (xGraphic.is()) + { + Graphic aGraphic(xGraphic); + + if (bEmbedded == aGraphic.getOriginURL().isEmpty()) + { + xShape.set(xShapeProperties, uno::UNO_QUERY); + return xShape; + } + } + } + + return xShape; +} + +void Test::testGraphicShape() +{ + // There are two kind of images in Writer: 1) Writer specific handled by SwGrfNode and + // 2) graphic shape handled by SdrGrafObj (e.g. after copy&paste from Impress). + + const OUString aFilterNames[] = { + "writer8", + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("graphic_shape.odt"); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check whether graphic exported well + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 2, getShapes()); + + uno::Reference xImage = lcl_getShape(mxComponent, true); + CPPUNIT_ASSERT_MESSAGE("Couldn't load the shape/image", xImage.is()); + uno::Reference< beans::XPropertySet > XPropSet( xImage, uno::UNO_QUERY ); + // First image is embedded + // Check size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(610), xBitmap->getSize().Width ); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(381), xBitmap->getSize().Height ); + } + + // MS filters make this kind of linked images broken !? + if (rFilterName != "writer8") + return; + + // Second image is a linked one + xImage = lcl_getShape(mxComponent, false); + XPropSet.set(xImage, uno::UNO_QUERY); + const OString sFailedImageLoad = OString::Concat("Couldn't load the shape/image for ") + rFilterName.toUtf8(); + CPPUNIT_ASSERT_MESSAGE(sFailedImageLoad.getStr(), xImage.is()); + + // Check size + { + uno::Reference xGraphic; + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + + Graphic aGraphic(xGraphic); + OUString sURL = aGraphic.getOriginURL(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), sURL.endsWith("linked_graphic.jpg")); + + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(620), xBitmap->getSize().Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(465), xBitmap->getSize().Height); + } + } +} + +namespace +{ + +std::vector> + lcl_getGraphics(const uno::Reference& xComponent) +{ + std::vector> aGraphics; + + uno::Reference xDrawPageSupplier(xComponent, uno::UNO_QUERY); + uno::Reference xDrawPage = xDrawPageSupplier->getDrawPage(); + for (sal_Int32 i = 0; i < xDrawPage->getCount(); ++i) + { + uno::Reference xShapeProperties(xDrawPage->getByIndex(i), uno::UNO_QUERY); + uno::Reference xGraphic; + xShapeProperties->getPropertyValue("Graphic") >>= xGraphic; + if (xGraphic.is()) + { + aGraphics.push_back(xGraphic); + } + } + + return aGraphics; +} + +} + +void Test::testMultipleIdenticalGraphics() +{ + // We have multiple identical graphics. When we save them we want + // them to be saved de-duplicated and the same should still be true + // after loading them again. This test check that the de-duplication + // works as expected. + + const OUString aFilterNames[] { + "writer8", + //"Rich Text Format", // doesn't work correctly for now + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("multiple_identical_graphics.odt"); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check whether graphic exported well + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + auto aGraphics = lcl_getGraphics(mxComponent); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), size_t(5), aGraphics.size()); + + // Get all GfxLink addresses, we expect all of them to be the same + // indicating we use the same graphic instance for all shapes + std::vector aGfxLinkAddresses; + for (auto const & rxGraphic : aGraphics) + { + GfxLink* pLink = Graphic(rxGraphic).GetSharedGfxLink().get(); + aGfxLinkAddresses.emplace_back(reinterpret_cast(pLink)); + } + + // Check all addresses are the same + bool bResult = std::equal(aGfxLinkAddresses.begin() + 1, aGfxLinkAddresses.end(), aGfxLinkAddresses.begin()); + const OString sGraphicNotTheSameFailedMessage = OString::Concat("Graphics not the same for filter: '") + + rFilterName.toUtf8() + OString::Concat("'"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sGraphicNotTheSameFailedMessage.getStr(), true, bResult); + } +} + +void Test::testCharHighlightBody() +{ + // MS Word has two kind of character backgrounds called character shading and highlighting + // MS filters handle these attributes separately, but ODF export merges them into one background attribute + + const OUString aFilterNames[] = { + "writer8", + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("char_highlight.docx"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + const uno::Reference< text::XTextRange > xPara = getParagraph(1); + // Both highlight and background + const Color nBackColor(0x4F81BD); + for( int nRun = 1; nRun <= 16; ++nRun ) + { + const uno::Reference xRun(getRun(xPara,nRun), uno::UNO_QUERY); + Color nHighlightColor; + switch( nRun ) + { + case 1: nHighlightColor = COL_BLACK; break; //black 0x000000 + case 2: nHighlightColor = COL_LIGHTBLUE; break; //light blue 0x0000ff + case 3: nHighlightColor = COL_LIGHTCYAN; break; //light cyan 0x00ffff + case 4: nHighlightColor = COL_LIGHTGREEN; break; //light green 0x00ff00 + case 5: nHighlightColor = COL_LIGHTMAGENTA; break; //light magenta 0xff00ff + case 6: nHighlightColor = COL_LIGHTRED; break; //light red 0xff0000 + case 7: nHighlightColor = COL_YELLOW; break; //yellow 0xffff00 + case 8: nHighlightColor = COL_WHITE; break; //white 0xffffff + case 9: nHighlightColor = COL_BLUE; break;//blue 0x000080 + case 10: nHighlightColor = COL_CYAN; break; //cyan 0x008080 + case 11: nHighlightColor = COL_GREEN; break; //green 0x008000 + case 12: nHighlightColor = COL_MAGENTA; break; //magenta 0x800080 + case 13: nHighlightColor = COL_RED; break; //red 0x800000 + case 14: nHighlightColor = COL_BROWN; break; //brown 0x808000 + case 15: nHighlightColor = COL_GRAY; break; //dark gray 0x808080 + case 16: nHighlightColor = COL_LIGHTGRAY; break; //light gray 0xC0C0C0 + } + + if (rFilterName == "writer8") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nHighlightColor, getProperty(xRun,"CharBackColor")); + } + else // MS filters + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nHighlightColor, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nBackColor, getProperty(xRun,"CharBackColor")); + } + } + + // Only highlight + { + const uno::Reference xRun(getRun(xPara,18), uno::UNO_QUERY); + if (rFilterName == "writer8") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_LIGHTRED, getProperty(xRun,"CharBackColor")); + } + else + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_LIGHTRED, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharBackColor")); + } + } + + // Only background + { + const uno::Reference xRun(getRun(xPara,19), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_LIGHTBLUE, getProperty(xRun,"CharBackColor")); + } + } +} + +void Test::testCharStyleHighlight() +{ + // MS Word has two kind of character backgrounds called character shading and highlighting. + // However, their character style can only accept shading. It ignores the highlighting value. + + const OUString aFilterNames[] = { + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("tdf138345_charstyle_highlight.odt"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + uno::Reference xCharStyle; + getStyles("CharacterStyles")->getByName("charBackground") >>= xCharStyle; + const Color nBackColor(0xFFDBB6); //orange-y + + // Always export character style's background colour as shading, never as highlighting. + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xCharStyle,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nBackColor, getProperty(xCharStyle,"CharBackColor")); + } +} + +void Test::testCharHighlight() +{ + SvtFilterOptions& rOpt = SvtFilterOptions::Get(); + rOpt.SetCharBackground2Shading(); + + testCharHighlightBody(); + testCharStyleHighlight(); + + rOpt.SetCharBackground2Highlighting(); + + testCharHighlightBody(); + testCharStyleHighlight(); +} + +void Test::testCharHighlightODF() +{ + createSwDoc("char_background_editing.docx"); + + // don't check import, testMSCharBackgroundEditing already does that + + uno::Reference xPara = getParagraph(1); + for (int i = 1; i <= 4; ++i) + { + uno::Reference xRun(getRun(xPara,i), uno::UNO_QUERY); + switch (i) + { + case 1: // non-transparent highlight + xRun->setPropertyValue("CharBackColor", uno::Any(static_cast(128))); + xRun->setPropertyValue("CharBackTransparent", uno::Any(true)); + xRun->setPropertyValue("CharHighlight", uno::Any(static_cast(64))); + break; + + case 2: // transparent backcolor + xRun->setPropertyValue("CharBackColor", uno::Any(static_cast(128))); + xRun->setPropertyValue("CharBackTransparent", uno::Any(true)); + xRun->setPropertyValue("CharHighlight", uno::Any(static_cast(COL_TRANSPARENT))); + break; + + case 3: // non-transparent backcolor + xRun->setPropertyValue("CharBackColor", uno::Any(static_cast(128))); + xRun->setPropertyValue("CharBackTransparent", uno::Any(false)); + xRun->setPropertyValue("CharHighlight", uno::Any(static_cast(COL_TRANSPARENT))); + break; + + case 4: // non-transparent highlight again + xRun->setPropertyValue("CharBackColor", uno::Any(static_cast(128))); + xRun->setPropertyValue("CharBackTransparent", uno::Any(false)); + xRun->setPropertyValue("CharHighlight", uno::Any(static_cast(64))); + break; + } + } + + saveAndReload("writer8"); + + xPara.set(getParagraph(1)); + for (int i = 1; i <= 4; ++i) + { + uno::Reference xRun(getRun(xPara,i), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(COL_TRANSPARENT), getProperty(xRun, "CharHighlight")); + switch (i) + { + case 1: // non-transparent highlight + CPPUNIT_ASSERT_EQUAL(Color(0x000040), getProperty(xRun, "CharBackColor")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xRun, "CharBackTransparent")); + break; + case 2: // transparent backcolor + CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xRun, "CharBackColor")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xRun, "CharBackTransparent")); + break; + case 3: // non-transparent backcolor + CPPUNIT_ASSERT_EQUAL(COL_BLUE, getProperty(xRun, "CharBackColor")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xRun, "CharBackTransparent")); + break; + case 4: // non-transparent highlight again + CPPUNIT_ASSERT_EQUAL(Color(0x000040), getProperty(xRun, "CharBackColor")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xRun, "CharBackTransparent")); + break; + } + } +} + +void Test::testMSCharBackgroundEditing() +{ + // Simulate the editing process of imported MSO character background attributes + // and check how export behaves. + + const OUString aFilterNames[] = { + "writer8", + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("char_background_editing.docx"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Check whether import was done on the right way + uno::Reference< text::XTextRange > xPara = getParagraph(1); + { + uno::Reference xRun(getRun(xPara,1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_LIGHTRED, getProperty(xRun,"CharBackColor")); + + xRun.set(getRun(xPara,2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_LIGHTBLUE, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharBackColor")); + + xRun.set(getRun(xPara,3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_LIGHTBLUE, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_LIGHTRED, getProperty(xRun,"CharBackColor")); + + xRun.set(getRun(xPara,4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharBackColor")); + } + + // Simulate editing + for( int i = 1; i <= 4; ++i ) + { + uno::Reference xRun(getRun(xPara,i), uno::UNO_QUERY); + // Change background + Color nBackColor; + switch( i ) + { + case 1: nBackColor = COL_BLACK; break; //black 0x000000 + case 2: nBackColor = COL_LIGHTCYAN; break; //cyan 0x00ffff + case 3: nBackColor = COL_LIGHTGREEN; break; //green 0x00ff00 + case 4: nBackColor = COL_LIGHTMAGENTA; break; //magenta 0xff00ff + } + xRun->setPropertyValue("CharBackColor", uno::Any(nBackColor)); + // Remove highlighting + xRun->setPropertyValue("CharHighlight", uno::Any(COL_TRANSPARENT)); + // Remove shading marker + uno::Sequence aGrabBag = getProperty >(xRun,"CharInteropGrabBag"); + for (beans::PropertyValue& rProp : asNonConstRange(aGrabBag)) + { + if (rProp.Name == "CharShadingMarker") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), true, rProp.Value.get()); + rProp.Value <<= false; + } + } + xRun->setPropertyValue("CharInteropGrabBag", uno::Any(aGrabBag)); + } + + SvtFilterOptions& rOpt = SvtFilterOptions::Get(); + rOpt.SetCharBackground2Highlighting(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check whether background was exported as highlighting + xPara.set(getParagraph(1)); + for( int i = 1; i <= 4; ++i ) + { + Color nBackColor; + switch( i ) + { + case 1: nBackColor = COL_BLACK; break; //black 0x000000 + case 2: nBackColor = COL_LIGHTCYAN; break; //light cyan 0x00ffff + case 3: nBackColor = COL_LIGHTGREEN; break; //light green 0x00ff00 + case 4: nBackColor = COL_LIGHTMAGENTA; break; //light magenta 0xff00ff + } + const uno::Reference xRun(getRun(xPara,i), uno::UNO_QUERY); + if (rFilterName == "writer8") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nBackColor, getProperty(xRun,"CharBackColor")); + } + else + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nBackColor, getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_TRANSPARENT, getProperty(xRun,"CharBackColor")); + } + } + } +} + +void Test::testCharBackgroundToHighlighting() +{ + // MSO highlighting has less kind of values so let's see how LO character background is converted + // to these values + + const OUString aFilterNames[] = { + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + createSwDoc("char_background.odt"); + + OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + + SvtFilterOptions& rOpt = SvtFilterOptions::Get(); + rOpt.SetCharBackground2Highlighting(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check highlight color + const uno::Reference< text::XTextRange > xPara = getParagraph(1); + for( int nRun = 1; nRun <= 19; ++nRun ) + { + const uno::Reference xRun(getRun(xPara,nRun), uno::UNO_QUERY); + Color nHighlightColor; + switch( nRun ) + { + case 1: nHighlightColor = COL_BLACK; break; //black 0x000000 + case 2: nHighlightColor = COL_YELLOW; break; //yellow 0xffff00 + case 3: nHighlightColor = COL_LIGHTMAGENTA; break; //light magenta 0xff00ff + case 4: nHighlightColor = COL_LIGHTCYAN; break; //light cyan 0x00ffff + case 5: nHighlightColor = COL_YELLOW; break; //yellow 0xffff00 + case 6: nHighlightColor = COL_LIGHTRED; break; //light red 0xff0000 + case 7: nHighlightColor = COL_LIGHTBLUE; break; //light blue 0x0000ff + case 8: nHighlightColor = COL_LIGHTGREEN; break; //light green 0x00ff00 + case 9: nHighlightColor = COL_GREEN; break; //dark green 0x008000 + case 10: nHighlightColor = COL_MAGENTA; break; //dark magenta 0x800080 + case 11: nHighlightColor = COL_BLUE; break; //dark blue 0x000080 + case 12: nHighlightColor = COL_BROWN; break; //brown 0x808000 + case 13: nHighlightColor = COL_GRAY; break; //dark gray 0x808080 + case 14: nHighlightColor = COL_BLACK; break; //black 0x000000 + case 15: nHighlightColor = COL_LIGHTRED; break; //light red 0xff0000 + case 16: nHighlightColor = COL_LIGHTGRAY; break; //light gray 0xC0C0C0 + case 17: nHighlightColor = COL_RED; break; //dark red 0x800000 + case 18: nHighlightColor = COL_GRAY; break; //dark gray 0x808080 + case 19: nHighlightColor = COL_YELLOW; break; //yellow 0xffff00 + } + const OString sMessage = sFailedMessage +". Index of run with unmatched color: " + OString::number(nRun); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sMessage.getStr(), nHighlightColor, getProperty(xRun,"CharHighlight")); + } + } +} + +#if !defined(_WIN32) +void Test::testSkipImages() +{ + // Check how LO skips image loading (but not texts of textboxes and custom shapes) + // during DOC and DOCX import, using the "SkipImages" FilterOptions. + + std::pair aFilterNames[] = { + { "skipimages.doc", "" }, + { "skipimages.doc", "SkipImages" }, + { "skipimages.docx", "" }, + { "skipimages.docx", "SkipImages" } + }; + + for (auto const & rFilterNamePair : aFilterNames) + { + bool bSkipImages = !rFilterNamePair.second.isEmpty(); + OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterNamePair.first.toUtf8(); + + setImportFilterOptions(rFilterNamePair.second); + createSwDoc(rFilterNamePair.first.toUtf8().getStr()); + sFailedMessage += " - " + rFilterNamePair.second.toUtf8(); + + // Check shapes (images, textboxes, custom shapes) + uno::Reference xShape; + uno::Reference xGraphic; + uno::Reference< beans::XPropertySet > XPropSet; + uno::Reference xBitmap; + + bool bHasTextboxText = false; + bool bHasCustomShapeText = false; + sal_Int32 nImageCount = 0; + + for (int i = 1; i<= getShapes(); i++) + { + xShape = getShape(i); + XPropSet.set( xShape, uno::UNO_QUERY_THROW ); + try + { + XPropSet->getPropertyValue("Graphic") >>= xGraphic; + xBitmap.set(xGraphic, uno::UNO_QUERY); + if (xBitmap.is()) + nImageCount++; + } + catch (beans::UnknownPropertyException &) + { /* ignore */ } + + uno::Reference xText(xShape, uno::UNO_QUERY); + if (xText.is()) + { + OUString shapeText = xText->getString(); + if (shapeText.startsWith("Lorem ipsum")) + bHasTextboxText = true; + else if (shapeText.startsWith("Nam pretium")) + bHasCustomShapeText = true; + } + } + + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), bHasTextboxText); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), bHasCustomShapeText); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast(bSkipImages ? 0 : 3), nImageCount ); + } +} +#endif + +static auto verifyNestedFieldmark(OUString const& rTestName, + uno::Reference const& xComponent) -> void +{ + SwDoc const*const pDoc(dynamic_cast(*xComponent).GetDocShell()->GetDoc()); + IDocumentMarkAccess const& rIDMA(*pDoc->getIDocumentMarkAccess()); + + // no spurious bookmarks have been created + CPPUNIT_ASSERT_EQUAL_MESSAGE(rTestName.toUtf8().getStr(), + sal_Int32(0), rIDMA.getBookmarksCount()); + + // check inner fieldmark + SwNodeIndex const node1(*pDoc->GetNodes().GetEndOfContent().StartOfSectionNode(), +2); + SwPosition const innerPos(*node1.GetNode().GetTextNode(), + node1.GetNode().GetTextNode()->GetText().indexOf(CH_TXT_ATR_FIELDSTART)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(rTestName.toUtf8().getStr(), + sal_Int32(1), innerPos.GetContentIndex()); + ::sw::mark::IFieldmark *const pInner(rIDMA.getFieldmarkAt(innerPos)); + CPPUNIT_ASSERT_MESSAGE(rTestName.toUtf8().getStr(), pInner); + OUString const innerString(SwPaM(pInner->GetMarkPos(), pInner->GetOtherMarkPos()).GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(rTestName.toUtf8().getStr(), OUString( + OUStringChar(CH_TXT_ATR_FIELDSTART) + u" QUOTE \"foo " + OUStringChar(CH_TXTATR_NEWLINE) + + u" bar " + OUStringChar(CH_TXTATR_NEWLINE) + + u"baz\" " + OUStringChar(CH_TXT_ATR_FIELDSEP) + u"foo " + OUStringChar(CH_TXTATR_NEWLINE) + + u" bar " + OUStringChar(CH_TXTATR_NEWLINE) + + u"baz" + OUStringChar(CH_TXT_ATR_FIELDEND)), innerString); + + // check outer fieldmark + SwNodeIndex const node2(node1, -1); + SwPosition const outerPos(*node2.GetNode().GetTextNode(), + node2.GetNode().GetTextNode()->GetText().indexOf(CH_TXT_ATR_FIELDSTART)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(rTestName.toUtf8().getStr(), + sal_Int32(0), outerPos.GetContentIndex()); + ::sw::mark::IFieldmark const*const pOuter(rIDMA.getFieldmarkAt(outerPos)); + CPPUNIT_ASSERT_MESSAGE(rTestName.toUtf8().getStr(), pOuter); + OUString const outerString(SwPaM(pOuter->GetMarkPos(), pOuter->GetOtherMarkPos()).GetText()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(rTestName.toUtf8().getStr(), OUString( + OUStringChar(CH_TXT_ATR_FIELDSTART) + u" QUOTE \"foo " + OUStringChar(CH_TXTATR_NEWLINE) + + u" " + OUStringChar(CH_TXT_ATR_FIELDSTART) + u" QUOTE \"foo " + OUStringChar(CH_TXTATR_NEWLINE) + + u" bar " + OUStringChar(CH_TXTATR_NEWLINE) + + u"baz\" " + OUStringChar(CH_TXT_ATR_FIELDSEP) + u"foo " + OUStringChar(CH_TXTATR_NEWLINE) + + u" bar " + OUStringChar(CH_TXTATR_NEWLINE) + + u"baz" + OUStringChar(CH_TXT_ATR_FIELDEND) + OUStringChar(CH_TXTATR_NEWLINE) + + u"bar " + OUStringChar(CH_TXTATR_NEWLINE) + + u"baz\" " + OUStringChar(CH_TXT_ATR_FIELDSEP) + u"foo " + OUStringChar(CH_TXTATR_NEWLINE) + + u" foo " + OUStringChar(CH_TXTATR_NEWLINE) + + u" bar " + OUStringChar(CH_TXTATR_NEWLINE) + + u"baz" + OUStringChar(CH_TXTATR_NEWLINE) + + u"bar " + OUStringChar(CH_TXTATR_NEWLINE) + + u"baz" + OUStringChar(CH_TXT_ATR_FIELDEND)), outerString); + + // must return innermost mark + CPPUNIT_ASSERT_EQUAL(pInner, rIDMA.getInnerFieldmarkFor(innerPos)); +} + +void Test::testNestedFieldmark() +{ + // experimental config setting + Resetter resetter( + [] () { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::ForceImportWWFieldsAsGenericFields::set(false, pBatch); + return pBatch->commit(); + }); + std::shared_ptr pBatch(comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::ForceImportWWFieldsAsGenericFields::set(true, pBatch); + pBatch->commit(); + + std::pair const aFilterNames[] = { + {"writer8", "fieldmark_QUOTE_nest.fodt"}, + {"Office Open XML Text", "fieldmark_QUOTE_nest.docx"}, + {"Rich Text Format", "fieldmark_QUOTE_nest.rtf"}, + }; + + for (auto const & rFilterName : aFilterNames) + { + createSwDoc(rFilterName.second.toUtf8().getStr()); + + verifyNestedFieldmark(rFilterName.first + ", load", mxComponent); + + // Export the document and import again + saveAndReload(rFilterName.first); + + verifyNestedFieldmark(rFilterName.first + " exported-reload", mxComponent); + } +} + +auto Test::verifyText13(char const*const pTestName) -> void +{ + // OFFICE-3789 style:header-first/style:footer-first + uno::Reference xPageStyle; + getStyles("PageStyles")->getByName("Standard") >>= xPageStyle; + uno::Reference xHF(getProperty>(xPageStyle, "HeaderTextFirst")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("Header first"), xHF->getString()); + uno::Reference xFF(getProperty>(xPageStyle, "FooterTextFirst")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("Footer first"), xFF->getString()); + // OFFICE-3767 text:contextual-spacing + uno::Reference xPara(getParagraph(1)); + CPPUNIT_ASSERT_MESSAGE(pTestName, getProperty(xPara, "ParaContextMargin")); + // OFFICE-3776 meta:creator-initials + uno::Reference xRun(getRun(xPara, 1)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("Annotation"), getProperty(xRun, "TextPortionType")); + uno::Reference xComment(getProperty>(xRun, "TextField")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("dj"), getProperty(xComment, "Initials")); + // OFFICE-3941 text:index-entry-link-start/text:index-entry-link-end + uno::Reference xDIS(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes(xDIS->getDocumentIndexes()); + uno::Reference xIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); + uno::Reference xLevels(getProperty>(xIndex, "LevelFormat")); + uno::Sequence format; + xLevels->getByIndex(1) >>= format; // 1-based? + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("TokenType"), format[0][0].Name); + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("TokenHyperlinkStart"), format[0][0].Value.get()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("TokenType"), format[4][0].Name); + CPPUNIT_ASSERT_EQUAL_MESSAGE(pTestName, OUString("TokenHyperlinkEnd"), format[4][0].Value.get()); +} + +// test ODF 1.3 new text document features +void Test::testODF13() +{ + // import + createSwDoc("text13e.odt"); + + // check model + verifyText13("import"); + + Resetter _([]() { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Save::ODF::DefaultVersion::set(3, pBatch); + return pBatch->commit(); + }); + + { + // export ODF 1.3 + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Save::ODF::DefaultVersion::set(10, pBatch); + pBatch->commit(); + + saveAndReload("writer8"); + + // check XML + xmlDocUniquePtr pContentXml = parseExport("content.xml"); + assertXPath(pContentXml, "/office:document-content/office:automatic-styles/style:style/style:paragraph-properties[@style:contextual-spacing='true']"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:p/office:annotation/meta:creator-initials"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:p/office:annotation/loext:sender-initials"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/text:index-entry-link-start"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/loext:index-entry-link-start"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/text:index-entry-link-end"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/loext:index-entry-link-end"_ostr, 0); + xmlDocUniquePtr pStylesXml = parseExport("styles.xml"); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/style:header-first"_ostr); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/loext:header-first"_ostr, 0); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/style:footer-first"_ostr); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/loext:footer-first"_ostr, 0); + + // check model + verifyText13("1.3 reload"); + } + { + // export ODF 1.2 extended + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Save::ODF::DefaultVersion::set(9, pBatch); + pBatch->commit(); + + // FIXME: it's not possible to use 'reload' here because the validation fails with + // Error: unexpected attribute "loext:contextual-spacing" + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("writer8"); + + uno::Reference const xStorable(mxComponent, uno::UNO_QUERY); + xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); + + // check XML + xmlDocUniquePtr pContentXml = parseExport("content.xml"); + assertXPath(pContentXml, "/office:document-content/office:automatic-styles/style:style/style:paragraph-properties[@loext:contextual-spacing='true']"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:p/office:annotation/loext:sender-initials"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:p/office:annotation/meta:creator-initials"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/loext:index-entry-link-start"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/text:index-entry-link-start"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/loext:index-entry-link-end"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/text:index-entry-link-end"_ostr, 0); + xmlDocUniquePtr pStylesXml = parseExport("styles.xml"); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/loext:header-first"_ostr); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/style:header-first"_ostr, 0); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/loext:footer-first"_ostr); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/style:footer-first"_ostr, 0); + + // reload + mxComponent->dispose(); + mxComponent = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument"); + + // check model + verifyText13("1.2 Extended reload"); + } + { + // export ODF 1.2 + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Save::ODF::DefaultVersion::set(4, pBatch); + pBatch->commit(); + + // don't reload - no point + save("writer8"); + + // check XML + xmlDocUniquePtr pContentXml = parseExport("content.xml"); + assertXPathNoAttribute(pContentXml, "/office:document-content/office:automatic-styles/style:style/style:paragraph-properties"_ostr, "contextual-spacing"_ostr); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:p/office:annotation/meta:creator-initials"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:p/office:annotation/loext:sender-initials"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/text:index-entry-link-start"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/loext:index-entry-link-start"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/text:index-entry-link-end"_ostr, 0); + assertXPath(pContentXml, "/office:document-content/office:body/office:text/text:illustration-index/text:illustration-index-source/text:illustration-index-entry-template/loext:index-entry-link-end"_ostr, 0); + xmlDocUniquePtr pStylesXml = parseExport("styles.xml"); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/style:header-first"_ostr, 0); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/loext:header-first"_ostr, 0); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/style:footer-first"_ostr, 0); + assertXPath(pStylesXml, "/office:document-styles/office:master-styles/style:master-page/loext:footer-first"_ostr, 0); + } +} + +void Test::testRedlineFlags() +{ + const OUString aFilterNames[] = { + "writer8", + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + + SwPaM pam(SwPosition(pDoc->GetNodes().GetEndOfContent(), SwNodeOffset(-1))); + pDoc->getIDocumentContentOperations().InsertString(pam, "foo bar baz"); + + IDocumentRedlineAccess & rIDRA(pDoc->getIDocumentRedlineAccess()); + // enable change tracking + rIDRA.SetRedlineFlags(rIDRA.GetRedlineFlags() + | RedlineFlags::On | RedlineFlags::ShowDelete); + + // need a delete redline to trigger mode switching + pam.Move(fnMoveForward, GoInDoc); + pam.SetMark(); + pam.Move(fnMoveBackward, GoInDoc); + pDoc->getIDocumentContentOperations().DeleteAndJoin(pam); + + // hide delete redlines + RedlineFlags const nRedlineFlags = + rIDRA.GetRedlineFlags() & ~RedlineFlags::ShowDelete; + rIDRA.SetRedlineFlags(nRedlineFlags); + + for (OUString const & rFilterName : aFilterNames) + { + // export the document + save(rFilterName); + + // tdf#97103 check that redline mode is properly restored + CPPUNIT_ASSERT_EQUAL_MESSAGE( + OString(OString::Concat("redline mode not restored in ") + rFilterName.toUtf8()).getStr(), + static_cast(nRedlineFlags), static_cast(rIDRA.GetRedlineFlags())); + } +} + +void Test::testBulletAsImage() +{ + OUString aFilterNames[] = { + "writer8", + "MS Word 97", + "Office Open XML Text", + "Rich Text Format", + }; + + for (OUString const & rFilterName : aFilterNames) + { + OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + createSwDoc("BulletAsImage.odt"); + + // Check if import was successful + { + uno::Reference xPara(getParagraph(1)); + uno::Reference xPropertySet(xPara, uno::UNO_QUERY); + uno::Reference xLevels; + xLevels.set(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProperties; + xLevels->getByIndex(0) >>= aProperties; + uno::Reference xBitmap; + awt::Size aSize; + sal_Int16 nNumberingType = -1; + + for (beans::PropertyValue const & rProperty : std::as_const(aProperties)) + { + if (rProperty.Name == "NumberingType") + { + nNumberingType = rProperty.Value.get(); + } + else if (rProperty.Name == "GraphicBitmap") + { + if (rProperty.Value.has>()) + { + xBitmap = rProperty.Value.get>(); + } + } + else if (rProperty.Name == "GraphicSize") + { + aSize = rProperty.Value.get(); + } + } + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), style::NumberingType::BITMAP, nNumberingType); + + // Graphic Bitmap + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + Graphic aGraphic(uno::Reference(xBitmap, uno::UNO_QUERY)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), GraphicType::Bitmap, aGraphic.GetType()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), aGraphic.GetSizeBytes() > o3tl::make_unsigned(0)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), tools::Long(16), aGraphic.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), tools::Long(16), aGraphic.GetSizePixel().Height()); + + // Graphic Size + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(400), aSize.Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(400), aSize.Height); + } + + // Export the document and import again for a check + saveAndReload(rFilterName); + + { + uno::Reference xPara(getParagraph(1)); + uno::Reference xPropertySet(xPara, uno::UNO_QUERY); + uno::Reference xLevels; + xLevels.set(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProperties; + xLevels->getByIndex(0) >>= aProperties; + uno::Reference xBitmap; + awt::Size aSize; + sal_Int16 nNumberingType = -1; + + for (beans::PropertyValue const & rProperty : std::as_const(aProperties)) + { + if (rProperty.Name == "NumberingType") + { + nNumberingType = rProperty.Value.get(); + } + else if (rProperty.Name == "GraphicBitmap") + { + if (rProperty.Value.has>()) + { + xBitmap = rProperty.Value.get>(); + } + } + else if (rProperty.Name == "GraphicSize") + { + aSize = rProperty.Value.get(); + } + } + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), style::NumberingType::BITMAP, nNumberingType); + + // Graphic Bitmap + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is()); + Graphic aGraphic(uno::Reference(xBitmap, uno::UNO_QUERY)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), GraphicType::Bitmap, aGraphic.GetType()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), aGraphic.GetSizeBytes() > o3tl::make_unsigned(0)); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), tools::Long(16), aGraphic.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), tools::Long(16), aGraphic.GetSizePixel().Height()); + + // Graphic Size + if (rFilterName == "write8") // ODT is correct + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(400), aSize.Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(400), aSize.Height); + } + // FIXME: MS Filters don't work correctly for graphic bullet size + else if (rFilterName == "Office Open XML Text" || rFilterName == "Rich Text Format") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(279), aSize.Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(279), aSize.Height); + } + else if (rFilterName == "MS Word 97") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(296), aSize.Width); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(296), aSize.Height); + } + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testListLabelPDFExport) +{ + createSwDoc(); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xText(xDoc->getText()); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xNumRule( + xFactory->createInstance("com.sun.star.text.NumberingRules"), + uno::UNO_QUERY_THROW); + OUString listFormat; + for (sal_Int32 i = 0; i < xNumRule->getCount(); ++i) + { + uno::Sequence format; + format.getArray(); + xNumRule->getByIndex(i) >>= format; + { + auto it(::std::find_if(format.begin(), format.end(), + [](auto const& r) { return r.Name == "NumberingType"; })); + // need something RTL + const_cast(it->Value) <<= style::NumberingType::CHARS_ARABIC; + } + { +#if 0 + // this doesn't work any more + auto it(::std::find_if(format.begin(), format.end(), + [](auto const& r) { return r.Name == "ParentNumbering"; })); + const_cast(it->Value) <<= sal_Int16(i + 1); +#endif + listFormat += "%" + OUString::number(i+1) + "%."; + auto it(::std::find_if(format.begin(), format.end(), + [](auto const& r) { return r.Name == "ListFormat"; })); + const_cast(it->Value) <<= listFormat; + } + xNumRule->replaceByIndex(i, uno::Any(format)); + } + uno::Reference(getParagraph(1), uno::UNO_QUERY_THROW)->setPropertyValue("NumberingRules", uno::Any(xNumRule)); + xText->insertControlCharacter(xText->getEnd(), text::ControlCharacter::PARAGRAPH_BREAK, false); + uno::Reference(getParagraph(2), uno::UNO_QUERY_THROW)->setPropertyValue("NumberingLevel", uno::Any(sal_Int16(1))); + xText->insertControlCharacter(xText->getEnd(), text::ControlCharacter::PARAGRAPH_BREAK, false); + uno::Reference(getParagraph(3), uno::UNO_QUERY_THROW)->setPropertyValue("NumberingLevel", uno::Any(sal_Int16(2))); + + // check PDF export of the list items (label in particular) + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export"); + // Enable PDF/UA + uno::Sequence aFilterData( + comphelper::InitPropertySequence({ { "PDFUACompliance", uno::Any(true) } })); + aMediaDescriptor["FilterData"] <<= aFilterData; + css::uno::Reference xStorable(mxComponent, css::uno::UNO_QUERY_THROW); + xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); + + // Parse the export result with pdfium. + std::unique_ptr pPdfDocument = parsePDFExport(); + + // Non-NULL pPdfDocument means pdfium is available. + if (pPdfDocument != nullptr) + { + // The document has one page. + CPPUNIT_ASSERT_EQUAL(1, pPdfDocument->getPageCount()); + std::unique_ptr pPdfPage = pPdfDocument->openPage(/*nIndex=*/0); + CPPUNIT_ASSERT(pPdfPage); + + std::unique_ptr pPdfTextPage = pPdfPage->getTextPage(); + CPPUNIT_ASSERT(pPdfTextPage); + + int nChars = pPdfTextPage->countChars(); + CPPUNIT_ASSERT_EQUAL(22, nChars); + + // Check that the label strings were exported correctly + std::vector aChars(nChars); + for (int i = 0; i < nChars; i++) + aChars[i] = pPdfTextPage->getUnicode(i); + OUString aText(aChars.data(), aChars.size()); + CPPUNIT_ASSERT_EQUAL(u"\u0623\r\n.\r\n\u0623.\u0623\r\n.\r\n\u0623.\u0623.\u0623\r\n."_ustr, aText); + } + + // Parse the document again to get its raw content + // TODO: get the content from PDFiumPage somehow + vcl::filter::PDFDocument aDocument; + SvFileStream aStream(maTempFile.GetURL(), StreamMode::READ); + CPPUNIT_ASSERT(aDocument.Read(aStream)); + + // The document has one page. + std::vector aPages = aDocument.GetPages(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), aPages.size()); + + vcl::filter::PDFObjectElement* pContents = aPages[0]->LookupObject("Contents"_ostr); + CPPUNIT_ASSERT(pContents); + vcl::filter::PDFStreamElement* pStream = pContents->GetStream(); + CPPUNIT_ASSERT(pStream); + SvMemoryStream& rObjectStream = pStream->GetMemory(); + // Uncompress it. + SvMemoryStream aUncompressed; + ZCodec aZCodec; + aZCodec.BeginCompression(); + rObjectStream.Seek(0); + aZCodec.Decompress(rObjectStream, aUncompressed); + CPPUNIT_ASSERT(aZCodec.EndCompression()); + + auto pStart = static_cast(aUncompressed.GetData()); + const char* const pEnd = pStart + aUncompressed.GetSize(); + + enum + { + Default, + Lbl, + LblFoundText + } state + = Default; + + auto nLine(0); + auto nLbl(0); + auto nLblTj(0); + auto nLblTJ(0); + std::vector mcids; + while (true) + { + ++nLine; + auto const pLine = ::std::find(pStart, pEnd, '\n'); + if (pLine == pEnd) + { + break; + } + std::string_view const line(pStart, pLine - pStart); + pStart = pLine + 1; + if (!line.empty() && line[0] != '%') + { + ::std::cerr << nLine << ": " << line << "\n"; + if (o3tl::starts_with(line, "/Lbl<>BDC")) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("unexpected nesting", Default, state); + mcids.push_back(o3tl::toInt32(line.substr(12))); + state = Lbl; + ++nLbl; + } + else if (state == Lbl) + { + auto const endj(line.find(">Tj")); + if (endj != ::std::string_view::npos) + { + state = LblFoundText; + ++nLblTj; + } + else + { + auto const endJ(line.find("]TJ")); + if (endJ != ::std::string_view::npos) + { + state = LblFoundText; + ++nLblTJ; + } + } + } + else if (state != Default && line == "EMC") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("missing text", LblFoundText, state); + state = Default; + } + } + } + CPPUNIT_ASSERT_EQUAL_MESSAGE("unclosed MCS", Default, state); + // ideally there should be 3 but apparently every text portion gets its own + // tag - this should not be a problem if these are grouped in the structure + // tree into 3 Lbl. + CPPUNIT_ASSERT_EQUAL(static_cast(6), nLbl); + // these are quite arbitrary? + CPPUNIT_ASSERT_EQUAL(static_cast(6), nLblTJ + nLblTj); + + auto nL(0); + for (const auto& rDocElement : aDocument.GetElements()) + { + auto pObject0 = dynamic_cast(rDocElement.get()); + if (!pObject0) + continue; + auto pType0 = dynamic_cast(pObject0->Lookup("Type"_ostr)); + if (!pType0 || pType0->GetValue() != "StructElem") + { + continue; + } + auto pS0 = dynamic_cast(pObject0->Lookup("S"_ostr)); + if (!pS0 || pS0->GetValue() != "Document") + { + continue; + } + auto pKids0 = dynamic_cast(pObject0->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids0); + + for (const auto& pKid0 : pKids0->GetElements()) + { + auto pRefKid0 = dynamic_cast(pKid0); + CPPUNIT_ASSERT(pRefKid0); + auto pObject1 = pRefKid0->LookupObject(); + CPPUNIT_ASSERT(pObject1); + auto pType1 = dynamic_cast(pObject1->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType1); + + if (pType1 && pType1->GetValue() == "StructElem") + { + auto pS1 = dynamic_cast(pObject1->Lookup("S"_ostr)); + if (pS1 && pS1->GetValue() == "L") + { + ++nL; + auto pKids1 = dynamic_cast(pObject1->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids1); + // this is purely structural so there should be 1 child + CPPUNIT_ASSERT_EQUAL(size_t(1), pKids1->GetElements().size()); + + auto pRefKid11 = dynamic_cast(pKids1->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid11); + auto pObject11 = pRefKid11->LookupObject(); + CPPUNIT_ASSERT(pObject11); + auto pType11 = dynamic_cast(pObject11->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType11); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType11->GetValue()); + auto pS11 = dynamic_cast(pObject11->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS11); + CPPUNIT_ASSERT_EQUAL("LI"_ostr, pS11->GetValue()); + // LI has 2 children: Lbl and LBody + auto pKids11 = dynamic_cast(pObject11->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids11); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids11->GetElements().size()); + + auto pRefKid111 = dynamic_cast(pKids11->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid111); + auto pObject111 = pRefKid111->LookupObject(); + CPPUNIT_ASSERT(pObject111); + auto pType111 = dynamic_cast(pObject111->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType111); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType111->GetValue()); + auto pS111 = dynamic_cast(pObject111->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS111); + CPPUNIT_ASSERT_EQUAL("Lbl"_ostr, pS111->GetValue()); + // Lbl has 2 children: the first 2 mcids (in order) + auto pKids111 = dynamic_cast(pObject111->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids111); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids111->GetElements().size()); + + auto pRefKid1111 = dynamic_cast(pKids111->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid1111); + CPPUNIT_ASSERT_EQUAL(mcids[0], int(pRefKid1111->GetValue())); + auto pRefKid1112 = dynamic_cast(pKids111->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid1112); + CPPUNIT_ASSERT_EQUAL(mcids[1], int(pRefKid1112->GetValue())); + + auto pRefKid112 = dynamic_cast(pKids11->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid112); + auto pObject112 = pRefKid112->LookupObject(); + CPPUNIT_ASSERT(pObject112); + auto pType112 = dynamic_cast(pObject112->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType112); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType112->GetValue()); + auto pS112 = dynamic_cast(pObject112->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS112); + CPPUNIT_ASSERT_EQUAL("LBody"_ostr, pS112->GetValue()); + // LBody has 2 children: paragraph and nested L (in order) + auto pKids112 = dynamic_cast(pObject112->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids112); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids112->GetElements().size()); + + auto pRefKid1121 = dynamic_cast(pKids112->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid1121); + auto pObject1121 = pRefKid1121->LookupObject(); + CPPUNIT_ASSERT(pObject1121); + auto pType1121 = dynamic_cast(pObject1121->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType1121); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType1121->GetValue()); + auto pS1121 = dynamic_cast(pObject1121->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS1121); + CPPUNIT_ASSERT_EQUAL("Standard"_ostr, pS1121->GetValue()); + + auto pRefKid1122 = dynamic_cast(pKids112->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid1122); + auto pObject1122 = pRefKid1122->LookupObject(); + CPPUNIT_ASSERT(pObject1122); + auto pType1122 = dynamic_cast(pObject1122->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType1122); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType1122->GetValue()); + auto pS1122 = dynamic_cast(pObject1122->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS1122); + CPPUNIT_ASSERT_EQUAL("L"_ostr, pS1122->GetValue()); + auto pKids1122 = dynamic_cast(pObject1122->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids1122); + // this is purely structural so there should be 1 child + CPPUNIT_ASSERT_EQUAL(size_t(1), pKids1122->GetElements().size()); + + auto pRefKid11221 = dynamic_cast(pKids1122->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid11221); + auto pObject11221 = pRefKid11221->LookupObject(); + CPPUNIT_ASSERT(pObject11221); + auto pType11221 = dynamic_cast(pObject11221->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType11221); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType11221->GetValue()); + auto pS11221 = dynamic_cast(pObject11221->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS11221); + CPPUNIT_ASSERT_EQUAL("LI"_ostr, pS11221->GetValue()); + // LI has 2 children: Lbl and LBody + auto pKids11221 = dynamic_cast(pObject11221->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids11221); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids11221->GetElements().size()); + + auto pRefKid112211 = dynamic_cast(pKids11221->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid112211); + auto pObject112211 = pRefKid112211->LookupObject(); + CPPUNIT_ASSERT(pObject112211); + auto pType112211 = dynamic_cast(pObject112211->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType112211); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType112211->GetValue()); + auto pS112211 = dynamic_cast(pObject112211->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS112211); + CPPUNIT_ASSERT_EQUAL("Lbl"_ostr, pS112211->GetValue()); + // Lbl has 2 children: the first 2 mcids (in order) + auto pKids112211 = dynamic_cast(pObject112211->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids112211); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids112211->GetElements().size()); + + auto pRefKid1122111 = dynamic_cast(pKids112211->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid1122111); + CPPUNIT_ASSERT_EQUAL(mcids[2], int(pRefKid1122111->GetValue())); + auto pRefKid1122112 = dynamic_cast(pKids112211->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid1122112); + CPPUNIT_ASSERT_EQUAL(mcids[3], int(pRefKid1122112->GetValue())); + + auto pRefKid112212 = dynamic_cast(pKids11221->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid112212); + auto pObject112212 = pRefKid112212->LookupObject(); + CPPUNIT_ASSERT(pObject112212); + auto pType112212 = dynamic_cast(pObject112212->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType112212); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType112212->GetValue()); + auto pS112212 = dynamic_cast(pObject112212->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS112212); + CPPUNIT_ASSERT_EQUAL("LBody"_ostr, pS112212->GetValue()); + // LBody has 2 children: paragraph and nested L (in order) + auto pKids112212 = dynamic_cast(pObject112212->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids112212); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids112212->GetElements().size()); + + auto pRefKid1122121 = dynamic_cast(pKids112212->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid1122121); + auto pObject1122121 = pRefKid1122121->LookupObject(); + CPPUNIT_ASSERT(pObject1122121); + auto pType1122121 = dynamic_cast(pObject1122121->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType1122121); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType1122121->GetValue()); + auto pS1122121 = dynamic_cast(pObject1122121->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS1122121); + CPPUNIT_ASSERT_EQUAL("Standard"_ostr, pS1122121->GetValue()); + + auto pRefKid1122122 = dynamic_cast(pKids112212->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid1122122); + auto pObject1122122 = pRefKid1122122->LookupObject(); + CPPUNIT_ASSERT(pObject1122122); + auto pType1122122 = dynamic_cast(pObject1122122->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType1122122); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType1122122->GetValue()); + auto pS1122122 = dynamic_cast(pObject1122122->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS1122122); + CPPUNIT_ASSERT_EQUAL("L"_ostr, pS1122122->GetValue()); + auto pKids1122122 = dynamic_cast(pObject1122122->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids1122122); + // this is purely structural so there should be 1 child + CPPUNIT_ASSERT_EQUAL(size_t(1), pKids1122122->GetElements().size()); + + auto pRefKid11221221 = dynamic_cast(pKids1122122->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid11221221); + auto pObject11221221 = pRefKid11221221->LookupObject(); + CPPUNIT_ASSERT(pObject11221221); + auto pType11221221 = dynamic_cast(pObject11221221->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType11221221); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType11221221->GetValue()); + auto pS11221221 = dynamic_cast(pObject11221221->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS11221221); + CPPUNIT_ASSERT_EQUAL("LI"_ostr, pS11221221->GetValue()); + // LI has 2 children: Lbl and LBody + auto pKids11221221 = dynamic_cast(pObject11221221->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids11221221); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids11221221->GetElements().size()); + + auto pRefKid112212211 = dynamic_cast(pKids11221221->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid112212211); + auto pObject112212211 = pRefKid112212211->LookupObject(); + CPPUNIT_ASSERT(pObject112212211); + auto pType112212211 = dynamic_cast(pObject112212211->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType112212211); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType112212211->GetValue()); + auto pS112212211 = dynamic_cast(pObject112212211->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS112212211); + CPPUNIT_ASSERT_EQUAL("Lbl"_ostr, pS112212211->GetValue()); + // Lbl has 2 children: the first 2 mcids (in order) + auto pKids112212211 = dynamic_cast(pObject112212211->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids112212211); + CPPUNIT_ASSERT_EQUAL(size_t(2), pKids112212211->GetElements().size()); + + auto pRefKid1122122111 = dynamic_cast(pKids112212211->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid1122122111); + CPPUNIT_ASSERT_EQUAL(mcids[4], int(pRefKid1122122111->GetValue())); + auto pRefKid1122122112 = dynamic_cast(pKids112212211->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid1122122112); + CPPUNIT_ASSERT_EQUAL(mcids[5], int(pRefKid1122122112->GetValue())); + + auto pRefKid112212212 = dynamic_cast(pKids11221221->GetElements()[1]); + CPPUNIT_ASSERT(pRefKid112212212); + auto pObject112212212 = pRefKid112212212->LookupObject(); + CPPUNIT_ASSERT(pObject112212212); + auto pType112212212 = dynamic_cast(pObject112212212->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType112212212); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType112212212->GetValue()); + auto pS112212212 = dynamic_cast(pObject112212212->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS112212212); + CPPUNIT_ASSERT_EQUAL("LBody"_ostr, pS112212212->GetValue()); + // inner LBody has 1 children: paragraph + auto pKids112212212 = dynamic_cast(pObject112212212->Lookup("K"_ostr)); + CPPUNIT_ASSERT(pKids112212212); + CPPUNIT_ASSERT_EQUAL(size_t(1), pKids112212212->GetElements().size()); + + auto pRefKid1122122121 = dynamic_cast(pKids112212212->GetElements()[0]); + CPPUNIT_ASSERT(pRefKid1122122121); + auto pObject1122122121 = pRefKid1122122121->LookupObject(); + CPPUNIT_ASSERT(pObject1122122121); + auto pType1122122121 = dynamic_cast(pObject1122122121->Lookup("Type"_ostr)); + CPPUNIT_ASSERT(pType1122122121); + CPPUNIT_ASSERT_EQUAL("StructElem"_ostr, pType1122122121->GetValue()); + auto pS1122122121 = dynamic_cast(pObject1122122121->Lookup("S"_ostr)); + CPPUNIT_ASSERT(pS1122122121); + CPPUNIT_ASSERT_EQUAL("Standard"_ostr, pS1122122121->GetValue()); + } + } + } + } + CPPUNIT_ASSERT_EQUAL(static_cast(1), nL); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf143311) +{ + createSwDoc("tdf143311-1.docx"); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(1), "Decorative")); + { + // add another one that's a SdrObject + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + xShapeProps->setPropertyValue("Decorative", uno::Any(true)); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPageSupplier->getDrawPage()); + xDrawPage->add(xShape); + } + // check DOCX filters + saveAndReload("Office Open XML Text"); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(1), "Decorative")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(2), "Decorative")); + { + // tdf#153925 not imported - check default and set it to test ODF filters + uno::Reference const xStyle(getStyles("FrameStyles")->getByName("Formula"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle, "Decorative")); + xStyle->setPropertyValue("Decorative", uno::Any(true)); + } + // check ODF filters + saveAndReload("writer8"); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(1), "Decorative")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(2), "Decorative")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getStyles("FrameStyles")->getByName("Formula"), "Decorative")); + + // check PDF export + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString("writer_pdf_Export"); + // Enable PDF/UA + uno::Sequence aFilterData( + comphelper::InitPropertySequence({ { "PDFUACompliance", uno::Any(true) } })); + aMediaDescriptor["FilterData"] <<= aFilterData; + css::uno::Reference xStorable(mxComponent, css::uno::UNO_QUERY_THROW); + xStorable->storeToURL(maTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); + + vcl::filter::PDFDocument aDocument; + SvFileStream aStream(maTempFile.GetURL(), StreamMode::READ); + CPPUNIT_ASSERT(aDocument.Read(aStream)); + + // The document has one page. + std::vector aPages = aDocument.GetPages(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), aPages.size()); + + vcl::filter::PDFObjectElement* pContents = aPages[0]->LookupObject("Contents"_ostr); + CPPUNIT_ASSERT(pContents); + vcl::filter::PDFStreamElement* pStream = pContents->GetStream(); + CPPUNIT_ASSERT(pStream); + SvMemoryStream& rObjectStream = pStream->GetMemory(); + // Uncompress it. + SvMemoryStream aUncompressed; + ZCodec aZCodec; + aZCodec.BeginCompression(); + rObjectStream.Seek(0); + aZCodec.Decompress(rObjectStream, aUncompressed); + CPPUNIT_ASSERT(aZCodec.EndCompression()); + + auto pStart = static_cast(aUncompressed.GetData()); + const char* const pEnd = pStart + aUncompressed.GetSize(); + + enum + { + Default, + Artifact, + Tagged + } state + = Default; + + auto nLine(0); + auto nTagged(0); + auto nArtifacts(0); + while (true) + { + ++nLine; + auto const pLine = ::std::find(pStart, pEnd, '\n'); + if (pLine == pEnd) + { + break; + } + std::string_view const line(pStart, pLine - pStart); + pStart = pLine + 1; + if (!line.empty() && line[0] != '%') + { + ::std::cerr << nLine << ": " << line << "\n"; + if (line == "/Artifact BMC") + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("unexpected nesting", Default, state); + state = Artifact; + ++nArtifacts; + } + else if (o3tl::starts_with(line, "/Standard<>BDC")) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE("unexpected nesting", Default, state); + state = Tagged; + ++nTagged; + } + else if (line == "EMC") + { + CPPUNIT_ASSERT_MESSAGE("unexpected end", state != Default); + state = Default; + } + else if (nLine > 1) // first line is expected "0.1 w" + { + CPPUNIT_ASSERT_MESSAGE("unexpected content outside MCS", state != Default); + } + } + } + CPPUNIT_ASSERT_EQUAL_MESSAGE("unclosed MCS", Default, state); + CPPUNIT_ASSERT_EQUAL(static_cast(25), nTagged); // text in body + // 1 decorative image + 1 decorative shape + 1 pre-existing rectangle border or something + CPPUNIT_ASSERT(nArtifacts >= 3); +} + +void Test::testTextFormField() +{ + const OUString aFilterNames[] = { + "writer8", + "MS Word 97", + "Office Open XML Text", + }; + + for (const OUString& rFilterName : aFilterNames) + { + createSwDoc("text_form_field.odt"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check the document after round trip + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + + // We have two text form fields + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(2), pMarkAccess->getAllMarksCount()); + + // Check whether all fieldmarks are text form fields + for(auto aIter = pMarkAccess->getAllMarksBegin(); aIter != pMarkAccess->getAllMarksEnd(); ++aIter) + { + ::sw::mark::IFieldmark* pFieldmark = dynamic_cast<::sw::mark::IFieldmark*>(*aIter); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pFieldmark); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), ODF_FORMTEXT, pFieldmark->GetFieldname()); + } + + // In the first paragraph we have an empty text form field with the placeholder spaces + const uno::Reference< text::XTextRange > xPara = getParagraph(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("TextFieldStart"), getProperty(getRun(xPara, 1), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("TextFieldSeparator"), getProperty(getRun(xPara, 2), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("Text"), getProperty(getRun(xPara, 3), "TextPortionType")); + sal_Unicode vEnSpaces[5] = {8194, 8194, 8194, 8194, 8194}; + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString(vEnSpaces, 5), getRun(xPara, 3)->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("TextFieldEnd"), getProperty(getRun(xPara, 4), "TextPortionType")); + + // In the second paragraph we have a set text + const uno::Reference< text::XTextRange > xPara2 = getParagraph(2); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("TextFieldStart"), getProperty(getRun(xPara2, 1), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("TextFieldSeparator"), getProperty(getRun(xPara2, 2), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("Text"), getProperty(getRun(xPara2, 3), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("xxxxx"), getRun(xPara2, 3)->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("TextFieldEnd"), getProperty(getRun(xPara2, 4), "TextPortionType")); + } +} + +void Test::testCheckBoxFormField() +{ + const OUString aFilterNames[] = { + "writer8", + "MS Word 97", + "Office Open XML Text", + }; + + for (const OUString& rFilterName : aFilterNames) + { + createSwDoc("checkbox_form_field.odt"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check the document after round trip + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + + // We have two check box form fields + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(2), pMarkAccess->getAllMarksCount()); + + int nIndex = 0; + for(auto aIter = pMarkAccess->getAllMarksBegin(); aIter != pMarkAccess->getAllMarksEnd(); ++aIter) + { + ::sw::mark::IFieldmark* pFieldmark = dynamic_cast<::sw::mark::IFieldmark*>(*aIter); + + if(rFilterName == "Office Open XML Text") // OOXML import also generates bookmarks + { + if(!pFieldmark) + continue; + } + + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pFieldmark); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), ODF_FORMCHECKBOX, pFieldmark->GetFieldname()); + ::sw::mark::ICheckboxFieldmark* pCheckBox = dynamic_cast< ::sw::mark::ICheckboxFieldmark* >(pFieldmark); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pCheckBox); + + // The first one is unchecked, the other one is checked + if(nIndex == 0) + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), !pCheckBox->IsChecked()); + else + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pCheckBox->IsChecked()); + ++nIndex; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), int(2), nIndex); + } +} + +void Test::testDropDownFormField() +{ + const OUString aFilterNames[] = { + "writer8", + "MS Word 97", + "Office Open XML Text", + }; + + for (const OUString& rFilterName : aFilterNames) + { + createSwDoc("dropdown_form_field.odt"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check the document after round trip + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(2), pMarkAccess->getAllMarksCount()); + + int nIndex = 0; + for(auto aIter = pMarkAccess->getAllMarksBegin(); aIter != pMarkAccess->getAllMarksEnd(); ++aIter) + { + ::sw::mark::IFieldmark* pFieldmark = dynamic_cast<::sw::mark::IFieldmark*>(*aIter); + + if(!pFieldmark) + continue; + + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pFieldmark); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), ODF_FORMDROPDOWN, pFieldmark->GetFieldname()); + + // Check drop down field's parameters. + const sw::mark::IFieldmark::parameter_map_t* const pParameters = pFieldmark->GetParameters(); + css::uno::Sequence vListEntries; + sal_Int32 nSelection = -1; + auto pListEntries = pParameters->find(ODF_FORMDROPDOWN_LISTENTRY); + if (pListEntries != pParameters->end()) + { + pListEntries->second >>= vListEntries; + + if(vListEntries.hasElements()) + { + auto pResult = pParameters->find(ODF_FORMDROPDOWN_RESULT); + if (pResult != pParameters->end()) + { + pResult->second >>= nSelection; + } + } + } + + // The first one is empty + if(nIndex == 0) + { + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), !vListEntries.hasElements()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(-1), nSelection); + } + else // The second one has list and also a selected item + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(4), vListEntries.getLength()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(1), nSelection); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("1000"), vListEntries[0]); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("2000"), vListEntries[1]); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("3000"), vListEntries[2]); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("4000"), vListEntries[3]); + } + ++nIndex; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), int(2), nIndex); + } +} + +void Test::testDateFormField() +{ + const OUString aFilterNames[] = { + "writer8", + "Office Open XML Text", + }; + + for (const OUString& rFilterName : aFilterNames) + { + createSwDoc("date_form_field.odt"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check the document after round trip + if (rFilterName == "writer8") + { + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(5), pMarkAccess->getAllMarksCount()); + + int nIndex = 0; + for(auto aIter = pMarkAccess->getAllMarksBegin(); aIter != pMarkAccess->getAllMarksEnd(); ++aIter) + { + ::sw::mark::IDateFieldmark* pFieldmark = dynamic_cast<::sw::mark::IDateFieldmark*>(*aIter); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pFieldmark); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), ODF_FORMDATE, pFieldmark->GetFieldname()); + + // Check date form field's parameters. + const sw::mark::IFieldmark::parameter_map_t* const pParameters = pFieldmark->GetParameters(); + OUString sDateFormat; + auto pResult = pParameters->find(ODF_FORMDATE_DATEFORMAT); + if (pResult != pParameters->end()) + { + pResult->second >>= sDateFormat; + } + + OUString sLang; + pResult = pParameters->find(ODF_FORMDATE_DATEFORMAT_LANGUAGE); + if (pResult != pParameters->end()) + { + pResult->second >>= sLang; + } + + OUString sCurrentDate = pFieldmark->GetContent(); + + // The first one has the default field content + if(nIndex == 0) + { + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang); + sal_Unicode vEnSpaces[ODF_FORMFIELD_DEFAULT_LENGTH] = {8194, 8194, 8194, 8194, 8194}; + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString(vEnSpaces, 5), sCurrentDate); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), SwNodeOffset(9), pFieldmark->GetMarkStart().GetNodeIndex()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(5), pFieldmark->GetMarkStart().GetContentIndex()); + } + else if (nIndex == 1) // The second has the default format + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("06/12/19"), sCurrentDate); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), SwNodeOffset(9), pFieldmark->GetMarkStart().GetNodeIndex()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(20), pFieldmark->GetMarkStart().GetContentIndex()); + } + else if (nIndex == 2) // The third one has special format + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("[NatNum12 MMMM=abbreviation]YYYY\". \"MMMM D."), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("hu-HU"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("2019. febr. 12."), sCurrentDate); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), SwNodeOffset(9), pFieldmark->GetMarkStart().GetNodeIndex()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(40), pFieldmark->GetMarkStart().GetContentIndex()); + + } + else if (nIndex == 3) // The fourth one has placeholder text + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("D, MMM YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("bm-ML"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("[select date]"), sCurrentDate); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), SwNodeOffset(9), pFieldmark->GetMarkStart().GetNodeIndex()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(62), pFieldmark->GetMarkStart().GetContentIndex()); + + } + else // The last one is really empty + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString(""), sCurrentDate); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), SwNodeOffset(9), pFieldmark->GetMarkStart().GetNodeIndex()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(82), pFieldmark->GetMarkStart().GetContentIndex()); + + } + ++nIndex; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), int(5), nIndex); + } + else + { + // Import from DOCX, so the fieldmark is now a content control. + uno::Reference xEnumAccess(getParagraph(1), uno::UNO_QUERY); + uno::Reference xTextPortions = xEnumAccess->createEnumeration(); + + int nIndex = 0; + while (xTextPortions->hasMoreElements()) + { + uno::Reference xTextPortion(xTextPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + if (aPortionType != "ContentControl") + { + continue; + } + + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + + bool bDate{}; + xContentControlProps->getPropertyValue("Date") >>= bDate; + CPPUNIT_ASSERT(bDate); + + // Check date form field's parameters. + OUString sDateFormat; + xContentControlProps->getPropertyValue("DateFormat") >>= sDateFormat; + + OUString sLang; + xContentControlProps->getPropertyValue("DateLanguage") >>= sLang; + + uno::Reference xContentControlEnumAccess(xContentControl, + uno::UNO_QUERY); + uno::Reference xContentControlEnum + = xContentControlEnumAccess->createEnumeration(); + uno::Reference xContentControlTextPortion(xContentControlEnum->nextElement(), uno::UNO_QUERY); + OUString sCurrentDate = xContentControlTextPortion->getString(); + + // The first one has the default field content + if(nIndex == 0) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang); + sal_Unicode vEnSpaces[ODF_FORMFIELD_DEFAULT_LENGTH] = {8194, 8194, 8194, 8194, 8194}; + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString(vEnSpaces, 5), sCurrentDate); + } + else if (nIndex == 1) // The second has the default format + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("06/12/19"), sCurrentDate); + } + else if (nIndex == 2) // The third one has special format + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("[NatNum12 MMMM=abbreviation]YYYY\". \"MMMM D."), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("hu-HU"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("2019. febr. 12."), sCurrentDate); + } + else if (nIndex == 3) // The fourth one has placeholder text + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("D, MMM YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("bm-ML"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("[select date]"), sCurrentDate); + } + else // The last one is really empty + { + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("MM/DD/YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString("en-US"), sLang); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), OUString(""), sCurrentDate); + } + ++nIndex; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), int(5), nIndex); + } + } +} + +void Test::testDateFormFieldCharacterFormatting() +{ + const OUString aFilterNames[] = { + "writer8", + "Office Open XML Text", + }; + + for (const OUString& rFilterName : aFilterNames) + { + createSwDoc("date_form_field_char_formatting.odt"); + + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check the document after round trip + if (rFilterName == "writer8") + { + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + + // Check that we have the field at the right place + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(1), pMarkAccess->getAllMarksCount()); + ::sw::mark::IDateFieldmark* pFieldmark = dynamic_cast<::sw::mark::IDateFieldmark*>(*pMarkAccess->getAllMarksBegin()); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pFieldmark); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), ODF_FORMDATE, pFieldmark->GetFieldname()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(0), pFieldmark->GetMarkStart().GetContentIndex()); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(11), pFieldmark->GetMarkEnd().GetContentIndex()); + + // We have one date field, first half of the field has bold character weight and second part has red character color + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), awt::FontWeight::BOLD, getProperty(getRun(getParagraph(1), 3), "CharWeight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_AUTO, getProperty(getRun(getParagraph(1), 3), "CharColor")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), awt::FontWeight::NORMAL, getProperty(getRun(getParagraph(1), 4), "CharWeight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), Color(0xff0000), getProperty(getRun(getParagraph(1), 4), "CharColor")); + } + else + { + uno::Reference xTextPortion(getRun(getParagraph(1), 1), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + bool bDate{}; + xContentControlProps->getPropertyValue("Date") >>= bDate; + CPPUNIT_ASSERT(bDate); + + uno::Reference xContentControlEnumAccess(xContentControl, + uno::UNO_QUERY); + uno::Reference xContentControlEnum + = xContentControlEnumAccess->createEnumeration(); + xTextPortion.set(xContentControlEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), awt::FontWeight::BOLD, getProperty(xTextPortion, "CharWeight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), COL_AUTO, getProperty(xTextPortion, "CharColor")); + xTextPortion.set(xContentControlEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), awt::FontWeight::NORMAL, getProperty(xTextPortion, "CharWeight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), Color(0xff0000), getProperty(xTextPortion, "CharColor")); + } + } +} + +void Test::testSvgImageSupport() +{ + OUString aFilterNames[] = { + "writer8", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + // Use case to import a document containing a SVG image, export in target format, import and check if the + // SVG image is present and as expected in the document + + // Import ODT file + createSwDoc("SvgImageTest.odt"); + + // Export the document in target format and import again + saveAndReload(rFilterName); + + // Prepare fail message (writing which import/export filter was used) + const OString sFailedMessage = "Failed on filter: "_ostr + rFilterName.toUtf8(); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 1, getShapes()); + + // Get the image + uno::Reference xImage(getShape(1), uno::UNO_QUERY); + uno::Reference xPropertySet(xImage, uno::UNO_QUERY_THROW); + + // Convert to a XGraphic + uno::Reference xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + + // Access the Graphic + Graphic aGraphic(xGraphic); + + // Check if it contian a VectorGraphicData struct + auto pVectorGraphic = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pVectorGraphic); + + // Which should be of type SVG, which means we have a SVG file + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), VectorGraphicDataType::Svg, pVectorGraphic->getType()); + } +} + +CPPUNIT_TEST_SUITE_REGISTRATION(Test); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/htmlexport/data/HTMLImage.odt b/sw/qa/extras/htmlexport/data/HTMLImage.odt new file mode 100644 index 0000000000..c938c3fd97 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/HTMLImage.odt differ diff --git a/sw/qa/extras/htmlexport/data/NestingInA1.fodt b/sw/qa/extras/htmlexport/data/NestingInA1.fodt new file mode 100644 index 0000000000..439ef0a57d --- /dev/null +++ b/sw/qa/extras/htmlexport/data/NestingInA1.fodt @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + Inner.A1 + + + Inner.B1 + + + + + Inner.A2 + + + Inner.B2 + + + + Outer.A1 + + + Outer.B1 + + + + + Outer.A2 + + + Outer.B2 + + + + Following text + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/TableWithIndent.fodt b/sw/qa/extras/htmlexport/data/TableWithIndent.fodt new file mode 100644 index 0000000000..5daaa75e8e --- /dev/null +++ b/sw/qa/extras/htmlexport/data/TableWithIndent.fodt @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/charborder.odt b/sw/qa/extras/htmlexport/data/charborder.odt new file mode 100644 index 0000000000..e9667b2da4 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/charborder.odt differ diff --git a/sw/qa/extras/htmlexport/data/checkbox-radiobutton.doc b/sw/qa/extras/htmlexport/data/checkbox-radiobutton.doc new file mode 100644 index 0000000000..17162a4101 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/checkbox-radiobutton.doc differ diff --git a/sw/qa/extras/htmlexport/data/clearing-break.html b/sw/qa/extras/htmlexport/data/clearing-break.html new file mode 100644 index 0000000000..9586cb3af8 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/clearing-break.html @@ -0,0 +1,8 @@ + + + +

+ +foo
bar

+ + diff --git a/sw/qa/extras/htmlexport/data/embedded_formula.fodt b/sw/qa/extras/htmlexport/data/embedded_formula.fodt new file mode 100644 index 0000000000..46e5391223 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/embedded_formula.fodt @@ -0,0 +1,30 @@ + + + + + + Formula: + + + + + + e + + i + π + + + + + 1 + = + 0 + + { func e ^ { i %pi } + 1 } = 0 + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/extb.html b/sw/qa/extras/htmlexport/data/extb.html new file mode 100644 index 0000000000..be73feadf8 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/extb.html @@ -0,0 +1,10 @@ + + + + + + +

𤭢

+

𤭢

+ + diff --git a/sw/qa/extras/htmlexport/data/fdo62336.docx b/sw/qa/extras/htmlexport/data/fdo62336.docx new file mode 100644 index 0000000000..f14a0e0019 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/fdo62336.docx differ diff --git a/sw/qa/extras/htmlexport/data/fdo81276.html b/sw/qa/extras/htmlexport/data/fdo81276.html new file mode 100644 index 0000000000..653f6b1821 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/fdo81276.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/sw/qa/extras/htmlexport/data/fdo86857.html b/sw/qa/extras/htmlexport/data/fdo86857.html new file mode 100644 index 0000000000..dc1fd88866 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/fdo86857.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + +
+


+ +

+
+


+ +

+ + diff --git a/sw/qa/extras/htmlexport/data/field-shade-reqif.odt b/sw/qa/extras/htmlexport/data/field-shade-reqif.odt new file mode 100644 index 0000000000..be7ec90f5a Binary files /dev/null and b/sw/qa/extras/htmlexport/data/field-shade-reqif.odt differ diff --git a/sw/qa/extras/htmlexport/data/field-shade.odt b/sw/qa/extras/htmlexport/data/field-shade.odt new file mode 100644 index 0000000000..2533be68c4 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/field-shade.odt differ diff --git a/sw/qa/extras/htmlexport/data/frameWithText.fodt b/sw/qa/extras/htmlexport/data/frameWithText.fodt new file mode 100644 index 0000000000..97ee5b1059 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/frameWithText.fodt @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + A frame with text below + + + Some text in frame & <foo> + + + A text after the frame + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/hello.html b/sw/qa/extras/htmlexport/data/hello.html new file mode 100644 index 0000000000..bc4180d17b --- /dev/null +++ b/sw/qa/extras/htmlexport/data/hello.html @@ -0,0 +1,8 @@ + + + + Title of document + + hello world + diff --git a/sw/qa/extras/htmlexport/data/image_anchored_to_paragraph_no_wrap.fodt b/sw/qa/extras/htmlexport/data/image_anchored_to_paragraph_no_wrap.fodt new file mode 100644 index 0000000000..f108072430 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/image_anchored_to_paragraph_no_wrap.fodt @@ -0,0 +1,20 @@ + + + + + + + + + + + + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0 + cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIw + IDIwIiBzdHJva2U9ImJsYWNrIj4KPHBhdGggZD0iTTEsMUwxOSwxOSIvPgo8L3N2Zz4= + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/list.html b/sw/qa/extras/htmlexport/data/list.html new file mode 100644 index 0000000000..867521155a --- /dev/null +++ b/sw/qa/extras/htmlexport/data/list.html @@ -0,0 +1,4 @@ +
    +
  • foo
  • +
  • bar
  • +
diff --git a/sw/qa/extras/htmlexport/data/listItemSubheader.fodt b/sw/qa/extras/htmlexport/data/listItemSubheader.fodt new file mode 100644 index 0000000000..4c68ce8876 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/listItemSubheader.fodt @@ -0,0 +1,31 @@ + + + + + + + + + list 1 item 1 + + + list 1 item 1 sub-header + + + + + + text + + + + + list 2 sub-header + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/listsWithNumFormat.fodt b/sw/qa/extras/htmlexport/data/listsWithNumFormat.fodt new file mode 100644 index 0000000000..c9a8225662 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/listsWithNumFormat.fodt @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + List A + + + First + + + Second + + + Third + + + + List a + + + First + + + Second + + + Third + + + + List I + + + First + + + Second + + + Third + + + + List i + + + First + + + Second + + + Third + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/no-ole2-pres-data.odt b/sw/qa/extras/htmlexport/data/no-ole2-pres-data.odt new file mode 100644 index 0000000000..cd65a17557 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/no-ole2-pres-data.odt differ diff --git a/sw/qa/extras/htmlexport/data/ole1-pres-data-wmf.odt b/sw/qa/extras/htmlexport/data/ole1-pres-data-wmf.odt new file mode 100644 index 0000000000..9bcca729bc Binary files /dev/null and b/sw/qa/extras/htmlexport/data/ole1-pres-data-wmf.odt differ diff --git a/sw/qa/extras/htmlexport/data/ole2.odt b/sw/qa/extras/htmlexport/data/ole2.odt new file mode 100644 index 0000000000..a10cfbb5b5 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/ole2.odt differ diff --git a/sw/qa/extras/htmlexport/data/ole2.ole b/sw/qa/extras/htmlexport/data/ole2.ole new file mode 100644 index 0000000000..96407e88fa --- /dev/null +++ b/sw/qa/extras/htmlexport/data/ole2.ole @@ -0,0 +1,1014 @@ +{\object\objemb{\*\objclass PowerPoint.Show.12}\objw10020\objh5638{\*\objdata +01050000 +02000000 +13000000 +506f776572506f696e742e53686f772e313200 +00000000 +00000000 +00940000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000 +0000000000010000000100000000000000001000000200000001000000feffffff000000000000 +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffdffffff47000000feffffff48000000050000000600000007000000080000000900 +00000a0000000b0000000c0000000d0000000e0000000f00000010000000110000001200000013 +0000001400000015000000160000001700000018000000190000001a0000001b0000001c000000 +1d0000001e0000001f000000200000002100000022000000230000002400000025000000260000 +002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f0000003000 +00003100000032000000330000003400000035000000360000003700000038000000390000003a +0000003b0000003c0000003d0000003e0000003f00000040000000410000004200000043000000 +440000004500000046000000fefffffffefffffffeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000016000500 +ffffffffffffffff02000000f4554fcf878f474d80bb5808164bb3f80000000000000000000000 +0080609bf8f8bcd30103000000000300000000000001004f006c00650000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000a000201ffffffffffffffffffffffff00000000000000000000000000000000 +00000000000000000000000000000000000000000000000014000000000000005000610063006b +006100670065000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000100002010100000004000000ffffffff0000000000 +000000000000000000000000000000000000000000000000000000000000000400000056840000 +00000000010043006f006d0070004f0062006a0000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000012000200ffffffffffff +ffffffffffff000000000000000000000000000000000000000000000000000000000000000000 +000000010000007c00000000000000feffffff02000000feffffff040000000500000006000000 +0700000008000000090000000a000000fefffffffeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff01000002000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000100feff030a0000fffffffff4554fcf878f474d80bb5808164bb3f8220000004d +6963726f736f667420506f776572506f696e742d5072e473656e746174696f6e000f0000004d53 +50726573656e746174696f6e0013000000506f776572506f696e742e53686f772e313200f439b2 +7100000000000000000000000000000000ffffffff030000000400000001000000ffffffff0200 +0000000000000a450000d8260000ba010000010009000003dd0000000600120000000000040000 +0003010800050000000b0200000000050000000c02cf08a80f030000001e0007000000fc020000 +ffffff000000040000002d01000008000000fa02050000000000ffffff00040000002d0101000e +00000024030500ffffffffffffcf08a80fcf08a80fffffffffffff08000000fa02000000000000 +00000000040000002d01020007000000fc020000ffffff000000040000002d01030004000000f0 +01000007000000fc0200004472c4000000040000002d0100000400000006010100040000002d01 +0100120000002403070065026a03e4086a03e408af025a0a2504e4089b05e408e0046502e00404 +0000002d0102000400000006010100040000002d0103000800504b030414000600080000002100 +dfcc18f5ad010000460c0000130008025b436f6e74656e745f54797065735d2e786d6c20a20402 +28a000020000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000cc975b4fc23014c7df4dfc0e4b5f0d2ba0221a060f5e9ebc90881fa06e07 +a8766dd316846fefd90582849b02b12f4bcecef9ffcfaf6bb776adce2415c1188ce54a46a41656 +4900325609978388bcf51e2a4d1258c764c2849210912958d2699f9eb47a530d3640b5b411193a +a76f28b5f110526643a54162a6af4cca1c866640358b3fd90068bd5a6dd0584907d2555ce641da +ad3be8b39170c1fd046f17241f1a0624b82d0ab35e11e169669027e84a8d016197344c6bc163e6 +304fc7325922ab9454212af31a3be4da9e61c19a0e59667d8352f7828fd3f004822e33ee99a558 +45b576541bb0a8cb6bc3cd4e2b5055bfcf6348543c4a51122e9aa5e24718a68ccbd920d6c15881 +379f987538f58b41edd0640bde3b319534c7e1d8469069ba46697b8cf9c98db7118c397c1d8560 +6ebc8dc0e13b0cc575ff49c86db67664ef025edd54c0c147bd60bdd3ea7b64533572e51a2c82e3 +acc4c2fbaf4c750f99ce3d64baf090e9d243a686874c571e32353d64baf690a956f511eabfbee4 +28cf775e3cf71af83dc3ec909aa92b1a8dc038be793f9b7744ebbd070dd9f9378164456f9aff05 +b4bf010000ffff0300504b03041400060008000000210068f874a103010000e20200000b000802 +5f72656c732f2e72656c7320a2040228a000020000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000ac92db4a03311086ef05df21cc7d37 +db2a22d26c6f44e89dc8fa006332bb1bdd1c48a6d2bebda1e061612d82bdcccc3f1fdf24596ff6 +6e14ef94b20d5ec1b2aa4190d7c158df2b786e1f16b72032a33738064f0a0e9461d35c5eac9f68 +442e4379b0318b42f159c1c01cefa4cc7a2087b90a917ce9742139e4724cbd8ca8dfb027b9aaeb +1b997e32a09930c5d628485b7305a23d44fa1f5b3a6234c8287548b488a94c27b66517d162ea89 +1598a01f4b391f135521839c175a9d5788879d7bf168c71995af5ef51aa9ff4d68f977a1d07556 +d37dd03b479ee7bca6896fa71859c644b9148fe95337747d4e21da337943e6f4a3618c9f4672f2 +339b0f000000ffff0300504b030414000600080000002100635c23b4c000000037010000200000 +007070742f736c696465732f5f72656c732f736c696465312e786d6c2e72656c738ccfbd6ac330 +1007f03dd07710b757b23b84102c65290543a7903ec0219d6d515b123ab9c46f1f8d3174c8785f +bf3fd75deecb2cfe28b38f41432b1b10146c743e8c1a7e6e5fef27105c30389c63200d1b315ccc +dba1bbd28ca51ef1e4138baa04d6309592ce4ab19d6841963151a89321e6054b2df3a812da5f1c +497d34cd51e56703ccce14bdd3907bd782b86d895eb1e330784b9fd1ae0b85f24f84e2d93bfac6 +2daea5b298472a1aa47ceeef965a592340994eedde350f000000ffff0300504b03041400060008 +00000021001b2e35070c010000d00300001f0008017070742f5f72656c732f70726573656e7461 +74696f6e2e786d6c2e72656c7320a2040128a00001000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000ac93414ec3301045f748dcc19a3d7152a042a84e3708a90b2404e100269924168e6d79 +4c21b7c76aa12455157591e5fff6fc799ab157ebef4eb32d7a52d608c89214189ad256ca3402de +8ac7ab3b6014a4a9a4b60605f448b0ce2f2f562fa8658845d42a472ca61812d086e0ee39a7b2c5 +4e52621d9a78525bdfc910a56fb893e5876c902fd274c9fd3003f25126db5402fca6ba0656f40e +cfc9b675ad4a7cb0e56787269c68c19d477af636366385f40d0601072b8969c04f432ce68420ad +2afc07d8c95f379b82c86687789214d01fa1eccdd18d49ace59c5841be6b7c0dbdc6c18a06e614 +c8edac20b176b0a49ddc9b93c3b8999361abf0ebe8b51eac3f083efa87f90f000000ffff030050 +4b030414000600080000002100bcd1a735de0200002c0e0000140000007070742f70726573656e +746174696f6e2e786d6cec97cd6fda3014c0ef93f63f44be4e34385f0444a86034d3a44e42a5bb +ece62606a23a71641b0a9df6bfefd97120a59ad4c38e3961fb7dfae7a7f0def4f65832e740852c +7895207c33440ead329e17d536413f1fd3418c1ca9489513c62b9aa01395e876f6f9d3b49ed482 +4a5a29a2c0d40137959c9004ed94aa27ae2bb31d2d89bce135ad40b6e1a2240ab662ebe682bc80 +fb92b9de7018b925292a64edc547ecf966536474c9b37d09e11b2782329387dc15b56cbdd51ff1 +d6bdc5db94241500e617e76582c2211e8670440e74bd7f9254a5bc521280a11990902cff41a4a2 +e27b7e2fd5d58953e409f270300a623f0a00a798e8139060e4cea6ee3fccdfae1b2761d4b1f62e +d65dddf5ab931d21310f8fe12ef09cd92941511cc67ae36aa58a2b2aad5a2b305a631c0467ad9c +6ec89ea9477a546b7562743625fa6cb51276f5b0120e23ba4c723a58de996cba2aecc0700d3a25 +11f7098210846da1c4187240e7913cad5fdb887029c58c0a25f7d5423c6bae8e7ed0ca6e41b483 +505035ab7d95a986fb390b099e70acfd3c53a1ab182e6ee492b3224f0bc6cc46d700fdca847320 +104d1d1bfc575a26aaa34e355c3f837aff525603a6b42699507225a0a41164f24a90c90b8e078d +c33df3b068bc0b9a201ce9847b3e068ae5e35ff8b4107a3e1a8ae5135cf8607f84a31e504bc502 +0a3b80622f36d9f78034150b28ba00f2bc3832ff023d204dc5021a75008d02bfff469fa95840f1 +0590a6d37fa4cf542ca0710750148efa8ff4998ae95cdfb798f504d6b6978595b31745827edfa5 +f374e1f9fe6018f9e920f016e120863fbdc17899fa698817733c9cffd18d380e7507fc6d5fe414 +9cb453000edfcd016591092ef946dd64bcb403855bf3172a6a5e9899027bcd14d078dd6a97a607 +8727e1a28081017c72f18a9c9a4bddde47c07d0f13c312861b0ddf1a66ccd48214dba733f37930 +f7e741d3bdb72a6665a25c07f46c083f0efe5f08b3eea032cf01c0dbdff6a83b1ccdfe020000ff +ff0300504b030414000600080000002100303a84e5ea0200006c060000150000007070742f736c +696465732f736c696465312e786d6c8c545b6f9b30147e9fb4ff8078a75c020450691548a8266d +6bd4763fc033262019dbb2dd3451b5ff3edb98a45d23ad3c707c39dfb97ce71c5fdf1e46ecec11 +170325a51b5e05ae8308a4ed4076a5fbeba9f132d711129016604a50e91e91706f6fbe7eb96685 +c0ada3d04414a0747b2959e1fb02f66804e28a3244d45d47f908a4daf29ddf72f0a2ac8ed88f82 +20f5473010d7e2f967f0b4eb0688d6143e8f88c8c90847184815b9e80726666bec33d618474299 +31e87721dda8cce0236eb514ec8923a457647fc7d923db7273fd73bfe5ced02abe5c878051d1e2 +faf6c2aa992dd99b85ff0f7c372f4171e8f8a8a5cacd3994ae22ffa8ffbe3e4307e9c0e9109e4f +617f7f4117f69b0bdafeecc07fe354673505f7319d784e67dba101176a037b8723d84be12c5c1b +d47721e7f09ef950baaf4d1355c9a689bd46adbc38a862afdac4b9d7448b6c132d9b3a5aa47f34 +3a4c0bc891a1fcdba975c2f443b9c601722a6827af201d6ddde7f651950a63db3c3ae4d764d934 +6114575e1ed7991757e9dacb56abdc5b6749be08f3661584eb3f960d15f32c4d16be4ddeb270b1 +7067d62e962cccd2348c22538c28c8832059be2f5f1ae649122da7b244d1324d97ef8b030ac685 +bc437474f4a274f9b0ebe58a73fa6228077b15eb0498154d6853404aca23465a119307d4295294 +d3c8200d9fa8c6dcd9035cba0042d5f1e174d583164dc749a03e1bd1096176c6a0d6ee068c4fb6 +ad81cbb6273356dfd0d07508ca1338f83ff884309e293983c781507ec9003e7b9ef42782266258 +210f156d8f1af75b49d5eb5ce29a62332c80c09eaaf7074a3ed50d0bf9a88166c3cc4f2100de91 +374a88b45bc0c183bac140bf942df2d61b1b0333de67a7a65256ccafc9dc7f6665a7a8aaf234aa +b3caabc2b8f1e275bef4564d9a784db288e3baca56f562a3a78885f1c72952879f9b22465f1067 +74300f6818d841322486e922cbb3659447260f13db2c4fd3621f4688f90fc0eef7662294338978 +6d8e981ed149f5aca27357b8bf000000ffff0300504b030414000600080000002100d5d192f1bc +000000370100002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c696465 +4c61796f7574362e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c1 +45f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609d +ef35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d8 +0c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23 +fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ec +ddf6030000ffff0300504b030414000600080000002100d5d192f1bc000000370100002c000000 +7070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574372e786d6c +2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2 +e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416 +c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284 +b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2 +f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b +030414000600080000002100d5d192f1bc000000370100002c0000007070742f736c6964654c61 +796f7574732f5f72656c732f736c6964654c61796f7574392e786d6c2e72656c738ccfbd0ac230 +1007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5c +b37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c +68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaa +daa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85 +c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b0304140006000800000021 +00d5d192f1bc000000370100002d0000007070742f736c6964654c61796f7574732f5f72656c73 +2f736c6964654c61796f757431302e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad +8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc86 +5a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c +6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a +48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654 +cb1201aa6dd4ecddf6030000ffff0300504b030414000600080000002100d5d192f1bc00000037 +0100002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f +7574382e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018e +e4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcae +c7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb +10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae +73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf60300 +00ffff0300504b030414000600080000002100d5d192f1bc000000370100002d0000007070742f +736c6964654c61796f7574732f5f72656c732f736c6964654c61796f757431312e786d6c2e7265 +6c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9b +d18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049 +c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a9 +5711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784 +e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b030414 +000600080000002100d5d192f1bc000000370100002c0000007070742f736c6964654c61796f75 +74732f5f72656c732f736c6964654c61796f7574312e786d6c2e72656c738ccfbd0ac2301007f0 +5df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4d +a378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c +8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f4 +6d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453 +d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b030414000600080000002100d5d1 +92f1bc000000370100002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c +6964654c61796f7574322e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad83883475 +11c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c8 +9b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e +3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83 +b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa +6dd4ecddf6030000ffff0300504b030414000600080000002100d5d192f1bc000000370100002c +0000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574332e +786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db +24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d51604 +67f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c99749 +17d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec1 +3c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff03 +00504b030414000600080000002100d5d192f1bc000000370100002c0000007070742f736c6964 +654c61796f7574732f5f72656c732f736c6964654c61796f7574342e786d6c2e72656c738ccfbd +0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37d +fdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed +72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b +52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23 +674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b0304140006000800 +0000210069a25f2115010000c70700002c0000007070742f736c6964654d6173746572732f5f72 +656c732f736c6964654d6173746572312e786d6c2e72656c73c4d54d6ac3301005e07da17730b3 +8f253b899394c8d98442a0ab921e4058e31f6a4b46524a7dfb8a96420c616821a08dc092f5e6e3 +6db43f7c0e7df281d675460bc8520e09eacaa84e3702dececf8b2d24ce4bad646f340a98d0c1a1 +7c7cd8bf622f7db8e4da6e744948d14e40ebfdf8c498ab5a1ca44bcd883a9cd4c60ed2874fdbb0 +5156efb24196735e307b9d01e52c33392901f6a4c2fcf334e25fb24d5d77151e4d751950fb1b23 +98eb3b852f7232171f62a56dd00b48d3ebfdd94fdb348c00765bb68c295b52b24d4cd9869265f9 +3d693edcc519ea7be767cd28c75d19ff6d28271b8a29233b2b62ca0ab2b3b8a591adad63d2d664 +6b3c6a6b9cb2ad62d256946c1753b6fb95b1d9f35b7e010000ffff0300504b0304140006000800 +00002100e40b4c2ac604000089100000220000007070742f736c6964654c61796f7574732f736c +6964654c61796f757431312e786d6ccc58cd6edc3610be17e83b08bad32b891425195907fa6351 +347fa8dd1c7aa325ae5788fe4a71d7eb0401f2267d8e16bde54df2241d52929dd88eb32ee2c297 +2545cd0c67e6fb6648ed93a7bba6b6b6420e55d72e6df7c0b12dd1165d59b5674bfbb7138642db +1a146f4b5e77ad58da1762b09f1efdf8c393fe70a8cb67fca2db280b6cb4c3215fda6ba5fac3c5 +6228d6a2e1c341d78b16dead3ad970058ff26c514a7e0eb69b7ae1390e5d34bc6aed495feea3df +ad565521b2aed834a255a311296aaec0ff615df5c36caddfc75a2fc500668cf6972ea98b1ea285 +c4a8934ad5226ecb939d6d1979b98537ae7d0429288eebd26a79030baf41b47ac36b212dd010b5 +b5694beb44ec94111cfa1329849eb5db9f647fdcbf9246ffc5f695b4aa52db9becd88be9c52466 +1edbad992caea99fcd537eb85bc9468f901f6bb7b401c60bfdbbd06be084558c8bc5d56ab17e79 +8b6cb1ce6f915ecc1b2c3edb5447353a77331c6f0ee7465a74e28c4bcf06353bb791d5d27ec798 +97f8392388c10c11272128c949849887c3dc0b58ea61fa5e6bbbf4b090c280f6733993cfa53700 +6faa427643b7520745d74ccc99090858bb64c25a3bfc2e49a893e718a3d48942447c3f80dd4307 +2549c26246589e90e8fd940bf0791e4d148b29f42907332643ffac2bde0c56db01661ae211c24b +8911573df6eb89704a93cdb63a59012d47fe4d5aa3a8995ca5ff56ecc3c0239133a28aa9ef7afe +9734f0a8179af71a5e3f74dd1087d7411e4df7876a9774e585d63e8511c0d51e2d6dc135aea3d9 +7a50c7eaa216e6a1d73fc62909c235d75da41428cb475975644800e02821c742b4ca8d2cd6d62f +7555bc11ad752ab83c1520d46a7fc634ebb88de9c59543c6c7bb39886fe32024a1876ef176cd6b +70c1f21e291be38826cc0b33045b1244282528a629450e8bfc284fc23cc0dec3b351637e8d8ce0 +deee4af91ea4c4a1770727830013fc909cec351db7f5659fbb8ba3cc1073dbc99a9f01254b3118 +de8cac1deea6e8f5ed4ca6eedeeef7736dccca4f452bf6b0e87ddb62262b750f8bf8db165f5790 +dbfd2d923d92fcf19f767587c9fbd53a996b3de36ad30c9f97387ea4259e666114504c118b0894 +789445fac04911893d97b931ce823c7cf8122fa1a487b71009af5773718f47fe57abdbdc48ae17 +e157ca6e05f723136d84532fa5094638600c8e5716a128f04284d32866414cf28092f7f3b5abe4 +4aa8aa11ac3adb48f172a3ef503789640d8d4a6bc1dbcba256472e3d70f001a43abca214f86070 +6fcb575cf25f6fd2f1bf10ce9f09c7361fff7c2baa5ab49f938e3c52d279d4f1fc380a80740945 +2488139464b18fa2344e1d9f26b193e38727dd4ac991757f6c38b4153913ef1bc7ca7d88f77dd1 +a6976877351c86eda66984fc0270ff91021ea42427d4c5507211f4962c0851eca439f29d308949 +18f971fc3f7419f8547cb1696ec5dc1c67dfb9d9647916d09cf928a53882d6ca729478598a9893 +7b21a3ccf7dde8b2d90c75550a4074ef1ef3e9c35f2fe4c1a70f7f7f87166386f9d370cebb994d +ec4992887a690865ea12e89b19946ecca88f988f094993304e71aed9d3bbe4267b60713ff6f4dd +b9907d57992f6ad79908b4e5fa02e37b0e76b0e79a337d617c9bc74b961cebf861ace573debfdc +1a9a8cd7a5d42cf59a9aa3e895888e7dfe0be1e85f000000ffff0300504b030414000600080000 +002100ee0bf3bf90040000a70f0000220000007070742f736c6964654c61796f7574732f736c69 +64654c61796f757431302e786d6ccc57db6edc36107d2fd07f10f44eeb46dd8cac03dd5814756c +a376f3d0375ae27a85e8568abbde7560207fd2ef68d1b7fc49bea4434af2dab1e3ac031bf08b78 +d1703833e7cc907cf3765d57da8af1be6c9b996eed99bac69abc2dcae662a6ff714650a06bbda0 +4d41abb661337dc37afdedc1cf3fbde9f6fbaa38a49b762934d0d1f4fb74a62f84e8f60da3cf17 +aca6fd5edbb106fecd5b5e5301437e61149c5e82eeba326cd3f48c9a968d3eaee7bbac6fe7f332 +67699b2f6bd6884109671515607fbf28bb7ed2d6eda2ade3ac07356af55d93c4a6036f2130e26c +ad6b4a8eaf60c6d20fc0f5fcb42ab486d63071560a5669cba6905114e5075a31ae9db1b550827d +77c61993bd66f50bef4ebb13aed61fad4eb8561652dfa84737c61fa3981a362bd531be5a7e3175 +e9fe7ace6bd9425cb4f54c07f836f26bc8393042cb87c97c3b9b2f8e1f90cd17d903d2c6b48171 +6b53e9d560dc7d77ecc99d212c325aca8ec35e4c162d7939d33f1262c76e463022d043d88c318a +331c22623b4166fb24b11def5aaeb6bcfd9c3385d0afc5c434cbbb876e5de6bceddbb9d8cbdb7a +a4c9c43600d6c223b0d2ca8fb66f054eeac7c8719308e130b550ec3a094adcccc38e935a76985e +8f01009ba75679618cfe8e8e4f40f4dd619b7fe8b5a605a024ae036e37120398b2ed1623bb4429 +2a36ca0d3f55671be59105621db7c5466e720ead9aa4fb552f4ec5a6626ad0c98f328303101595 +c95b30946603b8e240c10161128c0ffcd78a25cf17da6f55997f608d76ce283f6720d448570787 +a53d4ab5b135c198c0ff36059c8902efefe64307497ab5a01598a0d9af941709f6dc08c71e0a92 +087627568a02270e8126416aa659e4e1d07c795e489475ade52594a6a10649f3d6dbc54f218b2a +4b339d5109c74087fbd4e9246b56d54d35788c4a44f167d5f28a5e00730ad62b780772f58f33e9 +ebed94438f6ff7e7a554a665e7ac613b68b4bfaf31e5a5788246e7fb1adf9710dbdd35e21d82fc +f9bf66fe88caa7a5249e5232a56259f7b733d179a59988bdd8c4212128b47c13e12c345140c004 +171333b49dcc37c3f0e533b180ccebafc0135acda71c1c0ec667a9d873b845286f4327b1132f76 +90e383cbd825210a7d3b404e1246c48f70e67bf87aba9414543051d68c94174bce8e97f2a6719f +485a5f8ba462b4b9496a7160797ba6b307a10eb694021b14ee4d714239fdfd3e1d7f8470ee4438 +b2fcfcf7152b2bd6dc261d7ea5a48b82308a039220df8b2c84831443f9771d04fbc6b11d618f44 +d6cb936e2ef8c0babf9614ca0a9f88f723d5ff1bc47b5eb4bd1bb4db0aceac6659d78cdf01dc7d +a580a72ea45ae8c6c8f28300cefbcc44a1094327c9029bc4a1ac412f0f383ca48e96f58398abe3 +ec998b4d9aa5be971117259e13c2e5976428b6d3041133b303e211d7b5c29b62d35765c100d19d +6bcc974fff1cf1bd2f9ffe7d8612a39ae90135c55df546f6c471e8d94910a3d8c25037d3d04711 +f15c445c07e3240ea2c4c9247b3a0bdf670f4ceec69eaebd64bc6b4bf5deb4cc91402b2a2f07be +6b390176436f046a60c9d65a09fda9f41fda8abfa3ddf14ad164b82e256aaa93d41c44b722d2f7 +e9817df03f000000ffff0300504b0304140006000800000021005a9d3795690500006715000021 +0000007070742f736c6964654c61796f7574732f736c6964654c61796f7574332e786d6ccc58dd +6edb3614be1fb077103460778c259212a9ac4ea13f6ec3b2b458ba0750243a16aabf51b4eba428 +d037d9736cd85ddfa44f3292926ca749336f6b82dc98147578f89df37da40efdecf9a6aeac3517 +7dd93673db3d726c8b37795b94cde5dcfef51503d4b67a99354556b50d9fdb57bcb79f9f7cfdd5 +b3eeb8af8ad3ecaa5d494bf968fae36c6e2fa5ec8e67b33e5ff23aeb8fda8e37eadda2157526d5 +a3b89c15227ba37cd7d50c3a8e3fabb3b2b1c7f9e290f9ed6251e63c69f355cd1b393811bccaa4 +c2df2fcbae9fbc758778eb04ef951b33fb262479d5a9687b9effc0b3c2b68ca158ab21d73e51b1 +e7e755613559ad06c20bb540534ad9836fbfd984df7df8eb42a5335f8a72218d6ddfbd129ceb5e +b3fe5e74e7dd4b615c9cad5f0aab2cb4cbd1953d1b5f8c66e6b1599bceec93e99753373bde2c44 +ad5b951b6b33b7158557fa77a6c7f8465af93098ef46f3e58b3b6cf3657a87f56c5a60b6b7a88e +6a00773b1c3885f3aa94bcb274c20c8ed35e4e8856a29cdb6f19839197320c98ea01ec44184429 +0e008388a690b01822ff9d9eedfac7b9e086a51f8b496dae7f8be1bacc45dbb70b7994b7f52895 +49718a5c178fe46a946f03274843c808086948010e68080296ba2075621c45288e100edf8d0950 +98a7d644311be31d039f88e8bbd3367fdd5b4dab88d2bc0ebc6d2d063275db2d4785c952567cb4 +1b5e9ace2ecb77524c914bbd813b97380141f426dbaee3b99eef8c3442ea4182c8a7640ebebb63 +b989dae24a4fbf50ad22316bf265ab76e3c5e0b4eae5b9bcaab8e9af2b778454f0c52fcab8bf9e +db6aa5492a5b03dddf9bd8e91f334fa84955a68f978283241dd69027462c8a44c9c5b043ad6225 +f2a5f55355e6af79635df04c5c7065d468d7031dc3329d89668ac20476bf40d156a02a5f9d3a3b +ae9759a5d6b5e013952a8b13163a29017e922025558f8288520248801d88433f42943dbc54b53a +3420adafffa358ecd100fbe83ec5ba9ee3b8f460c57e4ea6569d8953739a954da1ce79dd35b356 +67ea636666eda918626778ddb75559b0b2aacc83268cc795b0d659a5f6eb6638cf64d9c8618478 +3bf56f8d87a79d9fd9b4d2cd4d62ba7087147b04ea1c1c04572ffb587035c6112edac10d5cac73 +76105c973e225c8d71848b77705d445c23b183f06acbc7c2ab418e78bd3dbc14529db5a7875783 +1cf1fa3bbc1052f325787a7835c8112fd9c34b303a78bb3d2a5e0d72c44b777835d8c3f7db63e2 +d52047bcc11e5edf234f73bf69907797281abd32d8d6c4f7952cccd429eb5654d9a5aa500ade5b +baa2188a98fe4b562c78aa58924caeea7ebf66414fb466a129f63c184090f8240618c708049051 +405ce27a8cc42c26f1c3d72c85b48dba54b21653ed32c8e5b3c58bb974dd5b619807a39685ba05 +0e970914c358d5610011c600f658000202294071103212e294f8f8dd74ab2c32c9655973565eae +047fb1d2d7c4db22b3fa5ac615cf9aad16e589eb1f39e848a59aee24a53018de9be2652632bd9d +3e91ea7f119c37098ead3efc7ecdcb8a37fba2c34f55743e4969e0b8c0f1824415ca410828a38a +15e4e3044192423f7878d12da41854f7db2a132a5d93f0fea16afe37c2fbb26cfb5bb6d599c99b +6655d75cdc20dc7ba284c328f270927a2056ab011cba0e0854110d62c7f5a0e3d3d071d0c313de +57c5d9aabe9373f800874d9226c44f990ada478152394b4104931830278594f9ccf3dc607bd8f4 +ea2bc815a3079f311fdfff71268e3ebefff30b1c31a699fefd9af26e7aa37aa228f0614c2310b9 +589d9b494040c87c0f300fa94f4644c318a55a3d9d8b6fab470d1ea69eae7dc345d796e60f43d7 +190564ea079fb808a99be744f320921d58cdfcb90e5fb595f839eb5eac8d4a868f7c6c863aadcc +c17467a2439ffe203df91b0000ffff0300504b0304140006000800000021008f55c3fd73040000 +6b0f0000210000007070742f736c6964654c61796f7574732f736c6964654c61796f7574322e78 +6d6ccc97cb6ee3361486f705fa0e82f6b42ea46ec63803dd580c9a26419376d11d23d1b13aba95 +a21c3b8300f3267d8e16ddcd9bcc9394a4a4783249334ee100d998147578780effefd0d49bb79b +aad4d6947545532f746b66ea1aadb3262feaab85fecb0506beae759cd439299b9a2ef42dedf4b7 +47df7ff7a69d77657e4cb64dcf35e1a3eee664a1af386fe786d1652b5a916ed6b4b416ef960dab +08178feccac819b916beabd2b04dd3352a52d4fa389fed33bf592e8b8c264dd657b4e68313464b +c245fcddaa68bbc95bbb8fb796d14eb851b3ef87c4b7adc8b6b9fc5dd794115b8b474b3f127967 +e765aed5a412031705a7a5d6d7b9f6ae5e9192abf75d7bc12895bd7afd036bcfdb33a6a69daccf +9856e4d2cd385d37c617a3997aacd7aa637c35fd6aea92f966c92ad98abdd0360b5d48b695bf86 +1ca31bae65c360b61bcd56a78fd866abf4116b635ac0f8625199d510dcc374ec299d6137e426a9 +388e3b3e45d4b362a17fc0d88e9c142380450f203342204a5100b00dfdd4f6706c43f756ceb6dc +79c6a852e55d3ed165b90f14ad8a8c355db3e4b3aca9463426c28498161ac594517e883c2f347d +b11cb42c0ba008a520401001c7b2133f08a06de1e476dc0011f3d4aa2c8c31df31f14988ae3d6e +b2f79d56374228a9eba0db9dc520a66cdbd548142f784947bbe1a5eaec7679a4806fa226dfca45 +2e45ab06c9bcecf839df96543db4f24785c184102591059b5390a483b8fc48c921b689533630af +e53dcb56da8f6591bda7b5764909bba4c2a896a90e09cb78946b6317823189ffdf08c00981a10c +ba5614e48dec51a6d9af940798fac8775d045ccb0b01421602611407c00c4de85808c7d88a5e92 +8722dfec4c0e80422b29589777d5fd141a58f1b06e5849ae040939edb40b91db004bf734195f2f +a752787ab9dfaea5332dbda435ddc3a3fd6d8f092bf8333cc26f7bfcb5a0ec191ed11e9bfce99f +7af984cbe795189a4a2c21bcafee55187ca51516c756e8413b06a68b20405e68c91337023849d3 +c8f73c1198f3f2276ecec50de6466442caa50c4c56ddf0477790b25b8acb80ca3680b11dbb1104 +d0c31820070720f06c1fc03808b117a2d473d1ed74b1c809a7bca8282eae7a464f7b7973780892 +d6553c2e29a9ef8a9a1f59eecc8433b1d5fe0e291183d2bdcecf08233f3fc4f1ff00e74cc0e1fe +d39f37b42869fd2574e89542e7d911b41cc19b87a138d671e08330767d90402f753d1cd85e18be +3c744bce06eafee8893856d804de01cffbc3aaeddea9dd9405adebbeaa28bb27b8f34a054fa3c4 +09fdd403293463807cc7017e8421b0a1679a711a24317ad1fff14170f13174d2578f6aaefece0e +7cd82469e2b9297640ecc200a000a720b293186033b57dec62c7b182bbc3a62b8b9c0a45f73e63 +3e7ffceb84cd3e7ffcfb00478c6aa60fa269df556fa4278a02d78efd0844e2d20550127820c4ae +03b003118a233f8c612ae9692df4901e31b81f3d6d734d59db14ea9bd1324780d6445e0ea0e740 +cbf6dd60146aa06417ad94fe5ce62fda92fd44dad3b5c264b82ec56aa895680ea63b1399fbf491 +7cf42f000000ffff0300504b0304140006000800000021007555dfd22405000070120000210000 +007070742f736c6964654c61796f7574732f736c6964654c61796f7574312e786d6ccc585d6edc +36107e2fd03b087aa75724254a32b20ef45b14759ca0760e204b5caf10fd95a236768200b949cf +d1bef62639498794e4ddb59dd48ee3c22f4b8a1a7e9c99efd368b42f5e5ed695b1e1a22fdb6669 +e203cb347893b745d95c2ccdb76729f24ca39759536455dbf0a579c57bf3e5d1cf3fbde80efbaa +38ceaeda411a80d1f487d9d25c4bd91d2e167dbee675d61fb41d6fe0deaa157526e1525c2c0a91 +bd07ecba5a10cb628b3a2b1b73da2feeb3bf5dadca9cc76d3ed4bc912388e05526c1ff7e5d76fd +8cd6dd07ad13bc0718bd7bdf2579d541b4b29415370d6d2636b080cd23883c3fad0aa3c96a5838 +2b2507c8aae4fa4edf9d09ced5acd9fc22bad3ee8dd01b4e366f8451160a60da682ea61b9399be +6c367ab2b8b1fd629e6687972b51ab11f2605c2e4da0eb4afd2ed41abf94463e2ee6dbd57cfdfa +0edb7c9ddc61bd980f58ec1caaa21a9dbb1d0e99c3d17930547ab41fc7bd9c3d1a44b9343fa629 +099d24b5510a33645ba18dc2c4f6514aa89710378d08659fd46ecc0e73c13523bf16b3b230bbc5 +665de6a2eddb953cc8db7a92c5ac2e2012db1391cacb8f0e0b284eb185ec2081d3632f4681eb07 +08278e1746961fa781ff694a00f83c8f3a8ac514ef14f84c44df1db7f9bbde685a204af13af276 +6d3192a9c66e3da92997e24c0b6aa658ddd7936da2ef64193bc4b6ac913f8c09a48aee33ee637b +34504c42465d66dde273c4ee0ee565d816576af7398cc063d6e4eb161ebef311b3eae5a9bcaab8 +9e6f2adc2993eaa2d1fe6b7e0bbefa1d16fb0f4b93a953c78326db71be83d1a91f1d95804d55a6 +0a4bc1519c8cc7c9232d1da05472313e9b4631887c6dfc5695f93bde18e73c13e71c8c1a053d92 +331ed3e9c0e680748cdf962b9de5fab681d3a4d62c79a69ab580c6c4c30c8561ec233bf2521452 +27425ee87b0e75a81579f1d36bb61fce47cd82534a898fd22e651681b0bea15dcc1cc765e4beda +fdaa60eb4c1cebd256360514783ddd17f1f970022f340db0a367e5eb4d3deb29d9a2da8e4b94bf +0f85de7b5414de044db7d0632e1e0c8dbd5d68853741db5b684c5dacaac283b1b7a564029cb09d +1d6c8f78ca85c7612bc0099b6db109f17491791cb6029cb0dd1d6cd7a6df43e53eb6029cb0bd2d +b602fe2e2ef7b015e084edef60334757f8c7612bc08757eb5497e84d2baaec821b05ef8d6d2d1d +8b78ff74f5db9eeb779cc9a1ee3be8fb3eacb30a0e35e8736d3d0296604a020437e074cf2128f0 +43e83f1c4282d00ebcc0c24f5fc60b696a0540b25673291fa5f0d55aae1bd26f165c7da105b382 +7e5847ebd388442ca488ba698a6c27f591ef120fd1c80f5237b01397d99fe6eebac8249765cdd3 +f26210fcf5203585377567f4b58c2a9e35d7bdab3cc2ecc0a20790516f2b29f041f3de146f3291 +29c9df50eff708ce9905970efffcf98197156f7645673f53d179d4b269101114474182ec1094e7 +63df8544441676ec942651f8f4a25b4131d2aafb63c804a46b16de7f34110f11de8f659b5db3ad +3ee89a66a86b2ef608779e29e1984531096d07311cc0578e87e1c3dd497ce47a8cba21745dcc0b +fe8766b12a4e86fa4ecec796eec7169b38895d96a40e8a18850ed94f1314923842a995102f65a9 +e360ffbad8f45509ef4af0eebe35e6cbe7bf4ec4c197cf7fff8012a387f99f8139ef7a36a9270c +7d46222f4421b6a16ec6f0ac06297350ea50db8e422f8868a2d4d361fbb67a60f17eeae9daf75c +746da9ff38c1d624a04d56e9f69012c6089b791e55b2f556517faae287b112afb2eef546cb647c +e7477aa953d21c4db7262af6f99fa2a37f010000ffff0300504b030414000600080000002100fd +00fcd1320800004e360000210000007070742f736c6964654d6173746572732f736c6964654d61 +73746572312e786d6cec5bdd6ee33616be5fa0ef20f8b6502c8ad49f314e61495677b0e93468a6 +7bb177b444dbdae86f293a93a41860de64817d8b5dec5ddf649ea4879464cb49ec49da49e10446 +008b3a3ca20ecf77bec343da79f3dd759e69578cd769598c07e8c41868ac88cb242d16e3c1cfef +23dd1d68b5a04542b3b260e3c10dab07df9d7ef39737d5a8ce921f682d18d7608ca21ed1f16029 +44351a0eeb78c9725a9f94152ba06f5ef29c0ab8e58b61c2e907183bcf86a661d8c39ca6c5a07d +9e3fe6f9723e4f631696f12a67856806e12ca302ecaf97695577a3558f19ade2ac8661d4d35b26 +9dc2fce28b2c91d7d9a2f9fc89cdb534b9062f1906020d3a5223b320e3da15cdc683d9020d86a7 +6f86ad72db920fd7d57bce986c1557dff3eaa23ae7ea0defaece398c09430eb482e6e05f3980ea +68d5d46d71a51ac33b8f2fba261d5dcf792eafe01e0d2c04146fe4e750cad8b5d0e246186fa4f1 +f2c70774e3e5f401ed61f78261efa572568d71f7a76376d3799f0a965500cfed926632541ac781 +4967b5e88c5bf1743cf8258a4cdf9a46448fa0a513c327ba3f259e1e99d89d9a4e1498d8fe289f +46f628e64c61f636e9620fd9f7f0ced39897753917277199b781d3c51f408d481b7dd2e05f0c02 +12ec06fa04598e4e42c3d43dcb413af61cc3833e9f38e863eb0bb0b9bbaa590cdba9b73ee830a9 +abb332beacb5a204cc24c40d846b8d065779ad969ab8a9c05d2215196bf59a4ed5d838fc41b45d +ec42e42a18b16d21d3dac61d1916b26ca9200145d8b42c1b6fc14a4715afc5f7accc35d9180f38 +8b85028a5ec10c1bd54e45d9d458528dc4b55f263752730657401f52093cbf2cf9ed40cbde16f5 +78e02142e0dd42dd10cb31e186f77b665b3d220bca4c851f2d6218673c880557b61440dcc94a94 +f3b4b5a879a5ecca6a71216e32a6e65dc90f25e660504665264b981e4e1bb788531594b94a5d4d +32d092158f97dadfb234be6485366394cf182815f22d0dd6120a35f4703369e587fd44c06b2200 +1a7d1e9807ca83c8987a7e3835f48937011e20043c70ac896e637bea19fed4c7f84fe08144561a +24a3f78fd001b9a665efe703c116c2d83d7c3e3c9902958cfe2bf5ac12eea344a4787055f28c2e +800109ab3519b10d49eafd8cb8fb3a85d8fed7fde3831c4c9bce58c11e31a2f9e511439e8a278c +a8f2dffe11ff9e02748f1f913cc2c9bffebf98ef19f269a98574a925a46295d7fde4820f34b9b8 +51e8987e38d1dd20243a71609175c308e961141ac83203c341c6f327974440497b0b33a1d9bc4d +322ac07e6f92b131aca7d69d62cb7408560a32c76c56e517b4e4aae9745945b5af3224c39d660b +d82a64cad884cd7f0291742792d3559094599a4469963d50228beba6001469211a896319465764 +ae959bbbcd38c3ee4daad91ad2b47b062a42ceb3a409360f076660fb58c74e14e9c48a3c58c94c +57c78137899c09993a36f938e862820a26d29c45e962c5d98fab068abb3cd6ea5c0419a3c53aa7 +8a53649f18f80422dddd307a2e370e100b45724e39950eba930d7e0fdfad8eefd1ead77fdfb234 +63459ff3e440391f460176d104eb6138f17462bb13ddf3ac00aa6b0ff9aee1d8beed3c3fe7e710 +d02a4affb5a290d579cbfba60c7e0aef89815d553bec223e944cc47dcdc4efcaf1c3a3fed7e59b +bde61b18c38a6295e78c6f51ce3a50ca99d3c09cb88ea54f43076af86812c95dadab47641ad941 +e4e1107bcf4fb93a4bdeadf28758a74aa5a7adb63632f6b2eed52fb787cab9f5721b42b0d9d3c8 +d2031b439ef7a2a9ee9b61a0c386d274233bb22ce4ad97db1a5ec580518f5e653f7ffaef3b7ef2 +f9d3ffbec222ab2edd795c17f7aad5b2d7f73ddb0c5c5ff71181ca21f41c7d12d9961e599890c0 +7727019e4af65688dc672f081fc7deaafcc07855a6ea1413192d811548d8c1c842aee3364829db +baeb9aa5ede9649cf11f68a5cd16086a3281c0c3d7d04a2ea1355b9852664a992965d0a271cc0a +011a6da393989d64ad833b09ee24a493904e627512ab93d89d04d2e7324b8b4b7086bc0cb47999 +fdb51174ade6ac13f2c419bd2957e26dd222d19334a7898838c4c536f1803d2329e16f13958276 +eb5a92699dae2aeff7e8a29eae2a09f6e89a3d5d95c8f6e8e29eaeca477b74494fd7fe82aed5d3 +75bea06bf774d529c71e5da7a7eb7d41d7ed63a1e2748ff21670dde2711f7871ad924baddaf228 +74e7de4383fcf49ece2e6edb1cdbe4559554193d2b7c7ea9ced4e5f702457b0b5d4b4810b0609e +af8a58c87e35727151c5cd12179fc76d96f48c4d96ec2bf8f2547f5b759d4cd7bdb3d5bbb268ce +617af9ba31f2124a8827e4ee76e8be969a924aa3731a432afd36ffa79e897635a4773a186d8ff5 +eb3b1d71dd8efd609edff67ea556be7b50e4949f01c466530ea705247470aade090e07295137aa +a8b7f2f5c08a4a581b37de99f09482d5152dca1a6e0dd3f0a1f42070edfe80a9552ae26544f334 +93e50608e225e53513eb156bb60a40a2c4e3c1e74fff69a4bd7030d51ee139c2a1d8150ec5ae70 +28f687836a9a1bc86dd752c6bf00c8ad4342fcd912c057445cc2dc228e3788c396164b9f1f217f +22e4ca69070eb9c4b9859cf4200778d586ea08f99320472f21af4b9c5bc8adde526e588e82f108 +f9eb835ce2dc426ef720b7107929e5db11f227422e716e21777a907b4e63fd11f2d707b9c4b985 +dcdd408e89299d7e84fc35422e716e21f77a90bbae7d2cdf5e29e412e7e6c7a59b73996a548a25 +e3eb531a78e2bc098c7676f70fc7372adb473acf12242fcdc70f1f7da8af708efed97950d039e1 +e89f1dbb6aecc88df5d141bbf6a0c8355d65fdd1413b766c6a193f3a68f7fea6fb25c0d1413b76 +0360ee3149efab9d6dcb3926e9ed4ab35f5caa5f54745fd436dfe336ff0776fa1b000000ffff03 +00504b0304140006000800000021009119fff8d404000095130000210000007070742f736c6964 +654c61796f7574732f736c6964654c61796f7574342e786d6cec58cd6edc3610be17e83b08bad3 +12c51f4946ec407f2c823ab651bb3df4464b5caf1afd95e2aed70e02e44dfa1c2d7acb9be4494a +512b3bfe89bd0eecc2875c9614351cceccf7cd7056af5eafeaca5a0ad9976db363c32dd7b64493 +b745d99ceed8bf1e3310d856af7853f0aa6dc48e7d2e7afbf5ee8f3fbceab6fbaad8e3e7ed4259 +5a47d36ff31d7bae54b7ed387d3e1735efb7da4e34faddac953557fa519e3a85e4675a775d399e +eb52a7e66563aff7cb4df6b7b359998bb4cd17b568d4a8448a8a2b6d7f3f2fbb7ed2d66da2ad93 +a2d76acceeeb26a9f34e7babceda83933f6ccbc8c9a55e81f6ae763d3faa0aabe1b55ef8fd4c94 +d69b66ce2b25ccbbbe3b96420cb366f993ec8eba4369b6ec2f0fa55516838af556db59bf588b99 +c7666926ce8deda7d3946faf66b21e461d0a6bb5636bc4ce875f6758132b65e5e3627eb59acf0f +ee90cde7d91dd2ce7480f3c5a18357a371b7ddf126778e4b252a6b0890b163af5793450b59eed8 +ef19f36292310c989e01ecc618c4190e01f35090793e4b3c443f0cbb21ddcea530a0bc29267241 +7a0bd0bacc65dbb733b595b7f59a1913c1349610afb11cac7cefa1183237202088620470865210 +bb24004118c208277e18607dfa18006df3341a2f9cb5bf6bc72720fa6eafcddff556d36aa0065c +47dc2e25463087b19b4f842a5525d672e34b33b98af29a056a15b7c5f970c8891ecd22dfae7a75 +a4ce2b611ebae1c798213510151ff2b51020cd4670d5ae81438749093952de2a16329f5b3f5765 +fe4e34d689e0f24468a16670757478b0c7a876ae4c7026f0bf4e01345160cc83bed3f978613242 +5ade0be5038c538203e6034ab208e0388e4018bb21486106634218826ef09c7ce82fb4fdbc9a0d +e6acae84bf428a3bf23e4081ae5726a161e011ea91eb2580c000d24160486d8c084428b899e0a3 +ea8de9d60d4c5b569715e43efa31c3b9652b2b7eaad95688de3ad6a68d84ecef67dfcde34c70ee +3f6e28c34a58d98968c4061abd8735a6b2548fd0881ed6f85b29e42334e20d82fce9df66768fca +c7a531be278dd10b4de334630451cf07098b438051e283288d5d00094efd308a8298c0ff318d0d +af1e95c614fadef73cfe9ec74f98c764cae394ab457d2d8df14b4de3240903162720a121031827 +09885c9602142628a409832979d6db78ecce0a65dfba97c7a6f849bab599fed360bc0d51e22554 +b7a1c867da5bc24210fa5e00501246cc8f70e653fc61fa0f52702554590b569e2ea438582803e1 +4d22597dad924af0e632a9d52ea45b2edad2a10eae28a56d30b837c52197fc97db74fc16c2d189 +706cf1e9af0b5156a2f99274e485920e27a18722ea812c2110e0845010c591b683119f309f86c4 +45cf4fba999223ebfe5c705d56e444bc073ac2c710ef69d1f62fd16eab5234cda2ae85bc06387d +a1805314e90b9465002601d655c6d55526f07d90519cc5888698f9f8f901efab627f51df89f903 +edc337159b344b7daabb245d5a91ee9042ed7eeca509606ee6058c32426078596cfaaa2c844674 +e31af3f9e3dffb72ebf3c77f9ea0c49861fa7832c5ddccd6ec89e3907a49108318625d37d35037 +7b8c12a05b407d65c44194a06c604f07f16df6e8c5cdd8d3b56742766d693e2f41774da025d757 +798811428442d3a239c6b469bc24c9d1e0be1e2bf99677074bc392b15b4acc5237307314bd1219 +5c9f3ea7edfe070000ffff0300504b030414000600080000002100d60634cc2e060000371f0000 +210000007070742f736c6964654c61796f7574732f736c6964654c61796f7574352e786d6cec59 +cb6edc3614dd17e83f08b3a747a4288a3462077ab108eada41ed66d19d2c713c6af42aa519db09 +02e44ffa1d2dbacb9fe44b4a529267fcccd8890303f5664449e4e125cfb94777a4172fcfcac25a +0ad9e675b533815bf6c412555a677975b233f9ed88033ab1da2ea9b2a4a82bb1333917ede4e5ee +8f3fbc68b6db22db4bceeb4567298caadd4e7626f3ae6bb6a7d3369d8b3269b7ea4654eadeac96 +65d2a9537932cd6472aab0cb628a6c9b4ccb24af26c378b9c9f87a36cb5311d5e9a21455d78348 +51249d8abf9de74d3ba2359ba03552b40ac68cbe1c5277dea8d576a7f5d1d9d1697d70fcc7c432 +9de5525d86935db5fef4b0c8ac2a29d58537429e14224fe7e646db1c492174ab5afe249bc3e6b5 +34fdf797afa595677afc306e321d6e0cddcc69b5348de995e1276333d93e9bc9521fd56658673b +13c5d9b9fe9dea6be2acb3d2fe62baba9ace0f6ee89bcee31b7a4fc709a66b93ea55f5c15d5f0e +1a97739477a2b0f4ee9838f6da6e8c6821f39dc97bce51e0c61c03ae5a00db0106418c19e0c8a1 +31f278881cf2418f86643b95c2d0f22a1be505c9354acb3c95755bcfbaadb42e076d8c12536c42 +3cb0a9a37c6fc7761cb00082d0836a76e80680da3e073ef5380b2881ccf63e0c1ba0621e8f6615 +d361bdc3c24722da66af4edfb656552ba234af3d6f173d7a32f5b1998f92cabb420cfdfa9ba6b1 +dae51b29a60ef32835dc39c485c8bd4c36b45de8127b60113ac875897395cb1ebad9eece823a3b +d7c38fd5d1682dd92edaeeb03b2f843969f48f09432a8a8b447b41264014f7b376bb8668454027 +649f4e56b690e9dcfab9c8d3b7a2b28e45228f85ea54e908faadd42b35d0d3550826aabbc5e55c +884b2db65189fe6e9e146a5e0b3d519985d4269e1fc4c0b5a31860eedb80c55e08a807b14f5d14 +b0103ebecc34b53a202d8eaf511b2414c25e4b2bb929b1791ef57ab551e4308836159b9554e9bc +56567fdc438eba33ed6501d530ab4ce49eb1a4bcca943beba60158ecab4790199589d9afaa63fb +4e990fd6b23f1e9779813200a21520763da4fb6e846a5f47d55003aab34265109b08364185f43a +aa861a50f10a153a1e34f9bc11ace9791956630db0ee1a2c45d4c4f050588d35c092152c429498 +0d7b28acc61a60bd35580f3b1b337613acc61a60e90a56636e4ed90db01a6b80656bb0c4f5be8a +328dd5b7d772c258b19e4475b8786edf65cddcf8f1b2964572a29c3813ada59db337ebf65b3a33 +1e9df955a52db95d3767e7899a332411839451c0b0e303ecb904042a0680a94b239bd98807fc31 +cd5973afb6683658736f9b0fb466e4daaeed5da9042e59b343287655efaf2b04be97faae4e6776 +f2eee97e3fd560567c2c2ab101a2d9eebb11239977f7401c1e8c7721bec985bc0722de60933ffd +5bcdee80bc5f1abbb71558f889e6302621653e0c408c62ac0aacc00581ad0aac08f1904688211b +45dfabc0d2f9fce7225104cb21a5fbb2fb3e294da087cc63eef6728b3a5027fd73b9f55c6e3d97 +5bffd3728bdc516eb94fd4aa0962b17e5f01108e1d65d53806d471086021b32362f310d2477de5 +72dd9ecde3f5c1f67c4bc9b566cfcf25d773c9f5c554f6c6548e926e515eca64f254ff38453685 +34e2007102010e7004021707c00e2248781c85c4ff0e6fb5b2ae2fb9d6fe42c1fe9df5ad196d5e +a96f9876b322eb57cb9c1085247080e3710eb0cb19601ea2c00999cf3d1fc71ec11fc68f0459d2 +892e2f05cf4f16521c2c3a43e15521596dd9858548aa8ba4ee7621d9b29d2db5d57425291583e1 +bdca5e2732d10fb02b727c88e0e82838bef8f4d73b9117a25a179df74445e7c754f92d26803387 +011c3355e9fb5005837ddfc5c40e9cc07d7cd1cd3a7953a10fbff05ef53ec2fbb66cb30bb6eb22 +1755b5284b212f114e9fea271a18ba14c608408c6c802971008331040e610ea7be1b70481e9ff0 +b6c8f617e58d9c7fe185cd83cc268a238fc4dc0521d12a673c06018a42c0ed18514eb8eb427661 +366d91ab725745b7a9c77cfef8f7bedcfafcf19f6f6031e6307edb1cf7ddb406f504012328a401 +082056be19310ff89cb880bb0ec66140fdd089b57a1a88afab475ddc4c3d4d7d2a6453e7e6fb2f +b407012d135d1c104821a29e33d679bd4a56d16aea0ff5fad5b190bf24cdc1d2c8a42f974273a9 +d1d2ecbbaebae8b58f1fbc77ff030000ffff0300504b030414000600080000002100ccacc02fe8 +030000060c0000210000007070742f736c6964654c61796f7574732f736c6964654c61796f7574 +362e786d6ccc965d6edc3610c7df0bf40e82deb99228ea6b9175a02f16455ddba8dd03d012d72b +445fa5a88dd74180dca4e7685f7b939ca4434af23ab10b18850df8654991437266fe3fcef2ddfb +dba636f65c0c55d76e4c67659b066f8baeacda9b8df9fb1545a1690c92b525abbb966fcc031fcc +f7273ffef0ae5f0f7579ca0edd280dd8a31dd66c63eea4ecd79635143bdeb061d5f5bc85b96d27 +1a26e153dc58a5601f61efa6b6b06dfb56c3aad69cd78be7acefb6dbaae059578c0d6fe5b489e0 +3593e0ffb0abfa61d9ad7fce6ebde0036ca3577feb923cf410adac64cdcfdbfa601ada54ec61d0 +314f20fae2b22e8d96353070360ae3aa92bcd613437f253857bd76ff93e82ffb0ba1edcff617c2 +a84ab57e5e675af3c46ca63fdbbdee58df2dbf59ba6c7dbb158d6a2115c6edc604c50eead75263 +fc561ac534581c478bddf913b6c52e7fc2da5a0eb01e1caaa29a9c7b1c0e5ec2d129305476b41f +a7835c3c1a45b5313f518a132fa70451e82162270425398910c56e98e380a6d8f53fabd58ebf2e +04d7a2fc5c2e7039fe23419baa10ddd06de5aae89a998c0530d0d221b396cacb4f9e9bb9244e1d +383df211f1220725419e202fc9529bb84e8629fe3c27007c5e5a1d8535c73b07be0831f4a75df1 +6130da0e8452ba4ebadd5b4c62aab6df3d046ab69b2675e798e59902799b74e5411d720dad1e64 +eb7a9097f25073fdd1ab1fed8600216aa6ee6bc951964fe2ca132d07a4497231216f94a32876c6 +2f75557ce0ad71cd99b8e660d4aa50a780953f7a6bebe882b588ffdf08b80b0219936333f4701d +ef76ac86930dfc4671080312e0cc0951846984484a429424294636f5e20c7b180711797d1c4a09 +d5f50e2261f556390677d1996ee18be0b18512a5a38ddc14a77ee22237a014e08790a30087c84d +a3980631c9031fa25d9c6292cbaae1b4ba19053f1fa596f07bca8ca19169cd597b5f4fe489e3af +6c7705a90e8f48810f5af7b6bc6082fdf698d5ff031c5980a3e33f7fdef1aae6ed43e8dc370a9d +9f7a4ee48514e511f046803314274184322ff0314eb06be3e4f5a1db4a3151f7c7c804a46b016f +59fb02e0bdacdadebdda5d5df1b61d9b868b6f04276f54f028a7d48b888f704c1d440212a3d84e +63e4e7506c6896789e475f5f7078a89d8dcd939ae3572836599e057e4e3d94fa2e94d688e628c1 +598aa89de390fad4834b705f6c86ba2a3928faec1af3f5cb5f6762f5f5cbdf2f506274b3bcd696 +bcebde4c4f92443e4ec304250e81ba9945018aa9ef21eab984a44918a76eaee8e91df2981e187c +1e3d7df7918bbeabf47bd6b16780f6acde98010e5cecfb6130eb3441727456297fa9c287b616bf +b2fe7caf2999fef7533dd42b3227d3a3890a7d79bf9ffc0b0000ffff0300504b03041400060008 +00000021005632cb5c8e030000fa090000210000007070742f736c6964654c61796f7574732f73 +6c6964654c61796f7574372e786d6ccc56db6edc36107d2fd07f10f4ce952851b745d6c1eac2a2 +806b1b75fa018cc4f50ad185a5a88dd78181fc49bfa37ded9fe44b3aa4a47512bb801f6c202fe2 +6834339c33e788d29bb7b76d631db81ceabedbd878e5da16efcabeaabb9b8dfdc73b8a62db1a14 +eb2ad6f41ddfd8473ed86fcf7efee98d580f4d75ce8efda82ca8d10d6bb6b1f74a89b5e30ce59e +b76c58f58277f06cd7cb9629b895374e25d947a8dd368ee7baa1d3b2bab3e77cf99cfc7eb7ab4b +9ef7e5d8f24e4d45246f9882fe877d2d86a59a784e3521f900654cf6b72da9a300b4ef1bd67db0 +2d13260fe0c0f619202faf9bcaea580b8e73cea5f10de29de45c5bdde11729aec59534a117872b +69d5954e9d536c677e308799dbee600ce7bbf49bc564ebdb9d6cf50a13b06e37361075d45747fb +f8adb2cac9593e78cbfde513b1e5be7822da593670beda54a39a9a7b0cc75be0e44c8ded208082 +bb3d6b1497961e92e9e97c504b77a3ac37f6274abd34282841142c44dc94a0b42009a29e1f175e +4433cf0fef75360ed7a5e486975fab455f387cc4695b97b21ffa9d5a957d3b8b63d118d089c94c +a7eef893efe55b9ce42e0a039c21e247054a709ea2304db334247980497c3f0f037a5e5683c299 +b1cf43584819c4795f7e18acae07d234c71387a7888958bd8afdaca94ac11b75074858b3d38d01 +1178a2600936c60303b342d46dda5747bde97b588d93ad9b415dab63c3cd8dd0971d48d3a04dfc +cccbc2d4477e442922014d50127931f2b3644ba32d29a290dc2f42af98e2aa6e39ad6f46c92f47 +652894c035bc017012541ce505f4ddaaace1ac3b89499de170e5fa2b1875acc7350d0d7a30bc77 +d51593ecf7efaa4c031606e702ca59a4f6ff82f317c1d1f1dfbfee78ddf0ee6bd1793faae870e6 +82dc02443105d181c6509283951152b884d028f5ddd717dd4ec949757f8e4cc2b816e12db92f20 +bc97659b9cd8ee9b9a77ddd8b65c7e43b8ff83125e64dbc0755d0f45599cc0ee31415b976e5192 +6e53d7a52e2952fafa84c3c7f9626c9fe4dc7b85c3262ff2282c6880b2d007d0092d50eae519a2 +6ee1c534a4418093d361333475c581d1679f315f3eff7d21575f3efff302478c59964ff5327763 +cdea49d324f4b238452926706ee64984b63484f737f009c9d2789bf985568fc0e4b17ac0f93cf5 +88fe2397a2afcd3f0c7667011d58b3b163cfc7d88b4f3c4d22796856337fade1c3dac8df98b83c +1895c05ec072665c422b730a7d08d1d0977fb6b3ff000000ffff0300504b030414000600080000 +0021004ba90907dd05000065170000210000007070742f736c6964654c61796f7574732f736c69 +64654c61796f7574382e786d6ccc58dd6edb3618bd1fb077107ccf58147f44054d0afd0ec5b2b4 +58b35dec4e91e858abfe46d1aed3a2401f64c09e63c3eefa267d92919494384e6a3b6983e5c6fa +241f1ef2e3777848e9d9f355555a4b2ebaa2a98f26f0c09e58bcce9abca82f8e26bf9c25804dac +4ea6759e964dcd8f2697bc9b3c3ffefebb67ed6157e627e965b39096e2a8bbc3f4683297b23d9c +4ebb6cceabb43b685a5eabff668da852a96ec5c53417e95bc55d9553c7b6e9b44a8b7a32b417fb +b46f66b322e351932d2a5ecb9e44f032956afcddbc68bb91addd87ad15bc5334a6f5cd21c9cb56 +65db9cff7eb69a58062696ea019c1cabccb3d7656ed569a51ebca8e76929adaa90d6a73fcfd53c +667351cca48175ed99e05c47f5f207d1be6e5f09d3fa74f94a5845aed90696c974f8638099db7a +6982e946f38b314c0f573351e9ab9a146b753451b5bbd4bf53fd8cafa495f50fb3eba7d9fce51d +d86c1edf819e8e1d4cd73ad559f583bb9d8e33a67356485e5a7aaecc384e3a398e68218aa3c9fb +247102122718242a02d80e300862ec81c4412c76dc247410fda05b437a98096ecaf3221f6506e9 +add25645269aae99c983aca9068d8c5253558578a8aa1ee57b4451e8138a419c7821c01123c0f3 +690430756c1af8ae8d08fc304c801af37835594c877c87c4c74274ed4993bde9acba5185d275ed +eb7685e88ba9afed7c90962c64c9075cffa709ae67f9ce1233e4b98c99da61e22abdde2c36f290 +e320b72f22a4b63d20d64bd933b787721534f9a56e7daeaeaa84699dcd1bb508cf7bceb293afe5 +65c94dbc2ce130a09ccf7e56e0ee9deaed9afd0aa0e3b586adfe31ed846a54a6da55720ea2b8ef +431e1ba9a8124a2efa8569e50b91cdad1fcb227bc36beb9ca7e29c2b50ada9fb62f4ddb4269b31 +0b93d87679a2519efd9aed5ae51aef74c485e53c51ad629220db097d90b82c0038f12960ae4b40 +ecfbd40f3c27b4fde031b55ae4ab6bc8fe3225902138e8d4632e76c84d9d52e83a5a3c46a798b9 +88f6887d74fa15e234a1731bebb075ec085021ba038bd7b1234085f80eacbd8e1d012a24bbb023 +408574177604a8d0dd851d012a64bbb0234085de2e6c0fb86bf1b77add2fcbabbd669b1924c601 +968d28d30bb5f673de59674a32bd3d74dbbd60b33b23daedddfdf6569359f139aff91e8cce6ec6 +4814f21e8c6837e3af0517f760c47b4cf2a77febd916cafb992abedaf355a1d61d153d51478551 +0423162010464cf5ae364cc0087501c13026288e022f208fbffb6b2b9b9875a4a66ba687b61a04 +f6d0e380631377b0a62f9c0710839028f457faac55a5e2c49c148b3a5787671d9a568b53f58660 +5aadd9843e847cd18607aae124b31fdf0dfbddb0ea81cf8358a3f6e3bbb14d6cd8f9c007916bd2 +d88f709be78f84cc617acb7900e1c6c630103a0ea31af600c28ddd632474b1d9401f40b8b1c50c +849a6dffa26cdb8746424adc0716e5ffdfaceee7b164f4d828958beac6b9153f5197a5b6134342 +88ea0eaa77ac043210501a8018d9110a023f0ce9a39e5b7b97cde52d8f85bd0ebe68b2e6cd7bab +159a1ba3965999f7d97a2874544208203749803ab37bc0731d0650e8f989ebe3d8a5f8c3f84d21 +4f259745c593e26221f8cb85fe56705b645657c9b0e4697da545790ce9818d0ed454b36b49a931 +98bad7f9ab54a45aef1b527d88e0e828b864f1e9af77bc2879bd2e3af2545fec632f26ccc300ba +0155aff328019ee30780529810cf61811fb3c717dd4c8a5e757f2c52757413a3f076bc45dd4778 +dfb6daee55b59bb2e075bda82a2e6e149c3ed182c7a167275ee0e985a6de8eb11f032f8c95d504 +3689f4279e80fa8f5ff0aecc4f17d59d35df71a27b90d94471e4d2382120a4c85307d824068113 +8520b16387253421047a5766d39585da1dd5e8f6f598cf1fff3e15079f3ffef30d2cc65cc64fa0 +e3bc9b68504f1078d40959000288956f469e0bfc84aa4d83208cc380f9218ab57a5a886fab473d +dc4f3d6df3968bb629cce762680f025aa6fa25d1231e830cd3a14ebd48ae07ab2bff5aa7afaea5 +f8296d5f2e8d4afa4d3e348f5aadcc1e7a0dd1a98f9fc78fff030000ffff0300504b0304140006 +000800000021004a0963b7a105000020170000210000007070742f736c6964654c61796f757473 +2f736c6964654c61796f7574392e786d6ccc585b6edc3614fd2fd03d08f34f8ff892282376307a +15455d27a8dd05c812c72344af529a899d20401652a0eb687fb393aca49794348fd84ea6ceb8f0 +cf88e25c1ef2f21c1e927af1f2a62cac95546d5e5727137c644f2c59a5759657d72793df2f6324 +2656db2555961475254f26b7b29dbc3cfdf18717cd715b6467c96dbdec2cc0a8dae3e464b2e8ba +e6783a6dd3852c93f6a86e6405ffcd6b55261dbcaaeb69a692b7805d165362dbceb44cf26a32b4 +57fbb4afe7f33c95619d2e4b59753d889245d2c1f8db45deb4235ab30f5aa3640b30a6f5ee90ba +db06b26df2f4f266629930b5820a3c3985ccd38b22b3aaa4840a3f87629977d6a73faf6016d385 +cae79d096a9b4b25a52e55ab9f5473d1bc56a6edf9eab5b2f24c630d1893e9f0c710665eab9529 +4cbf687e3d1693e39bb92af513a6c4ba39990073b7fa77aaebe44d67a57d65baa94d17afee894d +17d13dd1d3b183e956a73aab7e7077d321633a9779270b4bcf9419c759db8d235aaafc64f23e8e +89cfa398a1184a88d93e437ec43c14132a22e2c601a1ce07dd1a3bc7a992869c9fb35164d8b943 +6c99a7aa6eeb797794d6e5a0905168c0296603a77a94ef83d0f1ec68e622416008ccb567c8e371 +84dc90ba11091d9f87e187610260cce3d364311df21d121f89689bb33a7dd35a550d44695e7bde +d6113d99fad92c0661757957c821aeffd31436b37c2fc5827aae10863bc65d50eb2ed9d4a38450 +b727113bb63d446c53d92337c7dd8d5f67b7baf5153c81c2a44a17352cc1ab1eb368bb8beeb690 +a6bc2af030a04cce7f83e0f61df4b6415f07e8f256c346ff98760a1a1589f6944ca230eafbe84e +8d5480c24eaa7e595ad952a50beb97224fdfc8caba9289ba92105469e89e8cbe9bc66433666112 +fbba3ce9284fbd621b308c778ba4807e2df24c85ea792ce0cc27280c08f4ee0518cd6838433ea7 +d80e621e304e9e5ea8e0807a3c379be8fde5cab1a078d0ab275c46f8ae5e1dec122d22a357265c +eaf411fbe8f521915a65a2ce8c93e55506d6ae8ba6d5f21cf62fd3ea1b1a3645b2811a56da5e78 +446ce36990018f6ef03cccd8de783a728da741063cb6c1c3d4d56b7d4f407b1b50a30c807c0b50 +10a1f37804a04619009d0d2021c2d1618f00d42803a0bb05e832c3dc230035ca002836801a6d7f +52760035ca00e86d013adc7d24291ae57e279555f63a51896ef685973ec610d97abf86f5b86d88 +f4991a62446c4fe0d841946a438c848344180924dc59e4c296ce4cef4f6d88da7e26863698aef9 +e08de47bb67262737758e70fece55460cc21fa7ff546632a07f446bce365dfef8d78c7bb0fe08d +f8d0deb80b78006fdc053c8037ee021ec01b77010fe08dbb800f7ba3868780f5a5e66ba7ced81c +3557b52a926b386466b2b5b407f6e7d0f690874e3e7a6c9874cbb2dd7659f65c5d96c738b07d07 +f199c7e17e147a70ec9c11b8245127b44341a3103fbdcb66dd1d8fc5bd0e1e3459736bfeaa159a +17a396395cdafb43360d48e0f81451378e11e3b1873c970844036f16bb3316b90efb307e0dc892 +4e767929e3fc7aa9e4aba5bee7df1599d5965d50c8a45a6bb13bc5ce914d8f60aac546523086c3 +6feace28b878f9e9af77322f64b52d3afe4c456787b120918f6143c73662b398237f16f8681607 +a117c4ccf56cfef4a29b77aa57dd1fcb44c1748dc2fbc6cde7bf08efb06cbb6bb6eb229755b52c +4ba97608779e29e19c128f78314521c61e104e29f2fd50c06028f3b0270413f4e9096f8bec7c59 +decbf9374e748f329b300a5d27026d070e85a4bd38423e090314db1111b113738ebdb5d9b4450e +bb238c6e5f8ff9fcf1ef7375f4f9e33f07b018f3183f5f8ef36e4a837a7cdf7348207ce46306be +197a2eac5587a39853c6025fcc021a69f53498dd550f54eea79ea67e2b5553e7e6432fb60701ad +92c21c9a31713927e3aed0ab64335a4dfd85ce1f9e85fa35695ead8c4cfa5d3e30558d96661fba +09d1b98f5fb64fff050000ffff0300504b030414000600080000002100d5d192f1bc0000003701 +00002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f75 +74352e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4 +da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7 +d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10 +c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73 +860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000 +ffff0300504b03041400060008000000210068b9a05cc3060000c9200000140000007070742f74 +68656d652f7468656d65312e786d6cec59cd8b1b3714bf17fa3f0c7377fc35e38f25de608fed6c +92dd64899d941ce5b13ca3b566642479774d0894e4d44ba190965e0abdf5504a030d34f4d23f66 +21a14dff884a1adb33b235dd7c6c42a0eb055bd2fcded34fef3d3dbdd55cbd761a61eb18528648 +dcb2cb574ab605639f8c511cb4ec7bc37ea1615b8c83780c308961cb5e40665fdbfdfcb3ab6087 +87308296908fd90e68d921e7b39d6291f96218b02b640663f16c426804b8e8d2a038a6e044e88d +70b1522ad58a1140b16dc520126aef4c26c887f6ee4a6d0f8baf983339e0633a904ae136763c2d +cb1fb6601ea6d631c02d5bcc3026274378ca6d0b03c6c583965d521fbbb87bb5b816c23c473623 +d7579fa5dc52603cad28391a8cd6828ee33ab5f65abf0260be8debd57bb55e6dad4f0180ef8b95 +265c749df58ae72cb11950d234e8eed6bbd5b286cfe8af6ee1dbaefcd3f00a94349d2d7cbfefa5 +36cc8092a6bb85773bcd4e57d7af4049b3b685af97da5da7aee11528c4289e6ea14b6eadeaad56 +bb864c08de33c29baed3af5796f01455cc4457221ff3bc588bc011a17d0150ce051cc5165fcce0 +04f802e7018c461459fb280845e0cd404c98182e554afd52557ccb3f47b59447c10e0419e964c8 +675b43928fc57c8a66bc65df145aed0ce4e58b17678f9f9f3dfefdecc993b3c7bf2ee7de96db03 +7190957bfdd337fffcf0a5f5f76f3fbe7efaad19cfb2f857bf7cf5ea8f3fff4b3dd7687df7ecd5 +f3672fbffffaaf9f9f1ae06d0a4659f810459059b7e18975974462818609e088be9dc43004282b +d18e03066220650ce81e0f35f4ed05c0c080eb40dd8ef7a9481726e0f5f991467810d2394706e0 +ad30d2800784e00ea1c635dd927365ad308f03f3e4749ec5dd05e0d834b7b7e1e5de7c26e21e99 +547a21d4681e62e17210c018724b3e2353080d620f10d2ec7a807c4a189970eb01b23a00194d32 +44232d9a52a13d1409bf2c4c0485bf35db1cdcb73a049bd477e1b18e147b0360934a8835335e07 +730e22236310e12c721ff0d04472b0a0be6670c685a7038889d51b43c64c3277e842a37b4ba419 +b3db0ff022d29194a3a909b90f08c922bb64ea85209a1939a338cc626fb0a90851601d126e2441 +f41d22fbc20f20ce75f77d0435779fbfb7ef8934640e10f9644e4d5b02127d3f2ef0044093f236 +8db414dba6c8181d9d79a085f63e84189c803184d6bd1b263c9969364f49df0c4556d98326dbdc +047aacca7e0c19b4547163702c625ac80e604072f81c2c3612cf02c411a0799a6f4ff590e989a3 +2e32c62bf6a75a2a45546e5a33893b2cd2d697abf530045a58c93e33c7eb826afe7b933d26648e +de4106beb58c48ec6f6c9b21c0da0469c00c81a8324ce9568868ee4f45e476526273a3dc44dfb4 +a91b8a1b454f84e2732ba08ddac7fd38b5cf07ab7a2ebedec94b299b554e1e6eb3b6f1081da34f +bfb4e982797c08c5697259d95c5636ffc7ca266f3f5fd63397f5cc653df3d1ea99b484511741ab +eb1ea525cabdfb99208c077c81e13e53c50f137b7fdc1783aaa384d6574db3503497d369b88002 +d5b628e15f201e0e423013d394d50c015baa0e9835234c944f6ad8a85b955ff3e8808c93d17279 +75bb2904004fc745f9b51a17c51a4f466bf5f41a6fad5ef50275ddba222065df864466329d44d5 +40a2be1a3c87845ad985b0681a5834a4fa5c16ea67e915713859405e89bb4ec248849b08e9b1f4 +5322bff2ee857b3acf98fab22b86e53525d78bf1b44622136e3a894c1886e2f0d81cbe605f3753 +976af4a429b669d41b1fc2d732896ce4061ceb3deb44ecb9aa2bd4f860d6b227e21f27d18c6642 +1f93990ae0206ed93e5f1afa5d32cb8c32de052c4c60ea51b2fe0871482d8c2211eb5937e038e5 +56aed4e51a3f5172cdd2a76739f59375329c4ca0cf7346d2ae789628313e7d4fb0ec90b9203d08 +c727d608cfe95d200ce5d6cbd28063c4f8da9a634433c19d5a71235d2db7a2f6d625dda200cf42 +b03c51b2c93c81abf69a4e661d8ae9e6aaf4fe7231a3403ae9bd4fddf385369266ce01224f4d73 +fef870877c86559af7355649eadecc75cd55aecb3b25deff40c8504b27d3a849c6066a7967c705 +160499e9d6a19977465cf469b019b5f28058d595aab7f57a9b8c8e44e47745b53ac79c251764a7 +a2fcf6562f26934ca04657d9e5945b738a5af6c392db76bc8aeb154a0db75770aa4ea9d070dbd5 +42db75abe59e5b2e753b9547c2283c8cca6e32775ffcb38f17cbf7f66a7cebdd7db42ab5aff824 +2a1255071795b07a775fae18dedd5b43f9dcb690b0ccc35aa5dfac363bb542b3daee179c6ea751 +687ab54ea15bf3eadd7ed7731bcdfe23db3a5660a75df59c5aaf51a8953dafe0d44a927ea359a8 +3b954adba9b71b3da7fd68696bb1f2d5efcabc8ad7eebf000000ffff0300504b03040a00000000 +000000210015e9f115040900000409000017000000646f6350726f70732f7468756d626e61696c +2e6a706567ffd8ffe000104a46494600010101006000600000ffdb004300030202030202030303 +0304030304050805050404050a070706080c0a0c0c0b0a0b0b0d0e12100d0e110e0b0b10161011 +13141515150c0f171816141812141514ffdb00430103040405040509050509140d0b0d14141414 +141414141414141414141414141414141414141414141414141414141414141414141414141414 +14141414141414ffc00011080090010003012200021101031101ffc4001f000001050101010101 +0100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000 +017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282 +090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465 +666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aa +b2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2 +f3f4f5f6f7f8f9faffc4001f010003010101010101010101000000000000010203040506070809 +0a0bffc400b5110002010204040304070504040001027700010203110405213106124151076171 +1322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a353637 +38393a434445464748494a535455565758595a636465666768696a737475767778797a82838485 +868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8 +c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c030100021103 +11003f00fd53a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a2 +8a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800 +a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a28 +00a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a +2800a28a2800a28a2800a28a2800a2b83f03fc61d17c6be2af11f86637fb26bba2ddcb04969230 +ccd1ab6d12a7a8e991d54fb104f795ad4a73a52e59ab322338cd5e2ee145145645851451400514 +514005145140051451400514514005145140051451400d7758d19dd82aa8c96638007ad53fedcd +37fe8216bff7f97fc6b13e2b7fc92ff187fd81af3ff443d7e52d7d2e5393acd23393a9cbcb6e97 +fd51e4e3b1ff0053715cb7bf99faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00d042d7feff +002ff8d7e45515ef7faa6bfe7fff00e4bff04f33fb6dff00cfbfc7fe01faebfdb9a6ff00d042d7 +feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455147faa6bfe7fff00e4bff043fb6dff00cf +bfc7fe01faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455147faa +6bfe7fff00e4bff043fb6dff00cfbfc7fe01faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00 +d042d7feff002ff8d7e455147faa6bfe7fff00e4bff043fb6dff00cfbfc7fe01faebfdb9a6ff00 +d042d7feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455147faa6bfe7fff00e4bff043fb6d +ff00cfbfc7fe01faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455 +147faa6bfe7fff00e4bff043fb6dff00cfbfc7fe01e95f15bc497de1cf8fde28d6745be7b4bdb6 +d627960bab76e41de7f0208e08e84120f15f6bfecf3fb4369df19b46fb2dd79763e29b4406eac8 +1c2cabd3cd8b3d54f71d549c1e304fe6f568787fc41a8f85b59b4d5b49bb92c751b490490dc447 +0cadfd41e841e08241af7f1f93d3c6e1a34ef69c5593f4efe5f91e661b1f3c3d573fb2dea8fd73 +a2bc77f679fda1b4ef8cda37d96ebcbb1f14da20375640e1655e9e6c59eaa7b8eaa4e0f1827d8a +bf25c461ea616a3a5555a48fb7a75215a0a70774c28a28ae7350a28a2800a28a2800a28a2800a2 +8a2800a28a2800a28a280396f8adff0024bfc61ff606bcff00d10f5f94b5fab5f1514b7c30f178 +0324e8f78001ff005c1ebf2afec73ffcf093fef835fa370ab4a955bf747ca6757e787a321a2a6f +b1cfff003c24ff00be0d1f639ffe7849ff007c1afbbe65dcf9bb321a2a6fb1cfff003c24ff00be +0d1f639ffe7849ff007c1a399770b321a2a6fb1cff00f3c24ffbe0d1f639ff00e7849ff7c1a399 +770b321a2a6fb1cfff003c24ff00be0d1f639ffe7849ff007c1a399770b321a2a6fb1cff00f3c2 +4ffbe0d1f639ff00e7849ff7c1a399770b321a2a6fb1cfff003c24ff00be0d1f639ffe7849ff00 +7c1a399770b321a29594ab1041047506b57c2be15d57c6dafd9e8ba2d9c97da8dd3ec8e18ff524 +f40a07249e00144a518c5ca4ec9028b93b2dcd0f86b6be25bcf1c6911f8405c7fc245e7036ad6c +70cac3a927a05c677678c673c57ea7e86ba8268d62bab3dbcbaa08505d3daa9588cb81b8a03ced +ce719af38f809f0134bf82ba0607977de21ba41f6dd436fe3e5c79e4203f8b1193d80f55afc8f3 +ccca9e61592a51f763d7abff0081d8fb9cbb092c2d37cef57d3b0514515f347ac1451450014514 +500145145001451450014514500145145001451450014514500145145001451450014514500145 +14500145145007e67fc50f0aeabe36fda23c55a2e8b6725f6a375ac5c2470c7fef9c927a050392 +4f000afb6fe027c04d2fe0ae8181e5df7886e907db750dbf8f971e79080fe2c464f603a3f067c2 +bd13c13e20f106bb6b0f9daceb77725cdcde4a06f0acdb8449fdd51c7d4f27b01d957d26639c4f +154a186a5a42295fcda5f97fc39e4e17031a339559eb26dfc828a28af9b3d60a28a2800a28a280 +0a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 +800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28 +a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a +28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a280 +0a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 +800a28a2800a28a2803fffd9504b030414000600080000002100a364236b8d0100003203000011 +0000007070742f7072657350726f70732e786d6cacd2516fdb201000e0f749fb0f16ef0430368e +ad38951d1c69d21ea6aafd01c8c6099a310848dba9ea7f1f73d22add34a99af6742074c777709b +9b273d250fd27965e61a901506899c7b33a8f95083fbbb3d5c83c407310f6232b3acc10fe9c1cd +f6f3a78dadac935ece418498facd25b1d0ec2b51836308b642c8f747a9855f192be778361aa745 +885b774083138ff1023da1146386b45033b8e4bb8fe49b7154bde4a63fe908381771725a24fea8 +ac7fad663f52edba8f77a46d6c523e85af3e5c56c9c9a91a3c7705db7565d64086e90e66244b61 +5b762d649cd00263829bb478f9954db26a50be176ef8a2c54176830a5c04f18a23d91f3cad7a67 +bc19c3aa37fad227b2e6513a6bd4d22ac197f77a10530d3040db0d5a70ef8d9c9206b3b48145b9 +6e6046d312362de7b06d9b75ce588a7382df8c7214a7292c466ed57fe4d1b460c5df887b9e77fb +a6e11077bb0e6639ed60b9a60466ac4d69dbc540b33331affaa370e1ce89fe7b9c9b5b39b6c2cb +e10d9aff0b34bd86926be4392edf8e7e1ff3ed4f000000ffff0300504b03041400060008000000 +2100d8fd8d8fac000000b6000000130000007070742f7461626c655374796c65732e786d6c0ccc +490e82301840e1bd897768fe7d2d43512414c2202b77ea012a9421e94068a312e3dd65f9f2922f +cd3f4aa29758ec643403ffe00112ba35dda407068f7b836340d671dd7169b460b00a0b79b6dfa5 +3c714f7973ab1457ebd0a6689b7006a3737342886d47a1b83d9859e8edf56651dc6db90ca45bf8 +7bd3952481e71d89e29306d4899ec137aa8220a2b4c0a7cbe5886948035c7a34c67154d6d5b9a9 +fd2a2c7e40b23f000000ffff0300504b0304140006000800000021006720e9636d010000c60200 +00110000007070742f7669657750726f70732e786d6c8c52c96ec23010bd57ea3f58be978434a4 +3422e152950b874ad0de2dc7492c39b6e5314bf8fa4e365ac485db2c6fdebc5956eb73a3c85138 +904667743e0b29119a9b42ea2aa3dffbcf972525e0992e98325a64b41540d7f9f3d3caa647294e +5f8e2081869465b4f6dea64100bc160d8399b14263ae34ae611e5d5705856327246e5410856112 +344c6a3ad6bb47ea4d594a2e3e0c3f3442fb81c409c53c8a875a5a98d8ec236cd609409abefa46 +528ec3e90ea87efa113b1fb1de38516c45e9095c70558b240a69f03fb737b64fbdc749d2a7827b +1e50b2107f2edfa962f0086866f766e3649151bc02d4e6b4392018b0572f898fc023733bce9498 +e2d039f98aa5702678c345440952ccc35e0246dbfb6870adb2a971b2929a9c331a23a6cd68148f +90b16107aa3a255bf0579b60192e0ff76cdc85126b5066341fc69e207df075194f2dff483af2eb +e4839cdbbd54b8869d651cbf857094f686d7c14fe4ed640e8cc30be6bf000000ffff0300504b03 +04140006000800000021007749ef2667010000b202000011000801646f6350726f70732f636f72 +652e786d6c20a2040128a000010000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000008c92d14e +c2301486ef4d7c87a5d76edd980a59b692a8e18248422246e35dd31e46e3d62e6d61f03ebe892f +6637d800e5c2cbe6ffce97d3bf4dc7dbb2f036a08d5032435110220f24535cc83c43af8b893f42 +9eb154725a280919da814163727d95b22a614ac35cab0ab415603c67922661558656d65609c686 +ada0a426708474e152e9925a77d439ae28fba439e04118dee3122ce5d452dc08fdaa37a28392b3 +5e59ad75d10a38c3504009d21a1c05113eb21674692e0eb4c909590abbabe022da853dbd35a207 +ebba0eeab845ddfe117e9f3dbfb457f5856cba628048ca5962852d80cc550d7aae84b4fe5c7f7f +19b732b5aeed14f74803330dd42a4da66b99df78d37521e81ee982a6f1821a3b738fb314c01f76 +bfd8bf7933a261239ac7258396e88fe9a1a9bd1fb8e76e98ecfbe892b7f8f1693141641046233f +8cfde87e110e93284eee861fcd6a67f347617958e0ffc6db241a9d183b0169373eff65e4070000 +ffff0300504b030414000600080000002100e329ddaa0f0200000705000010000801646f635072 +6f70732f6170702e786d6c20a2040128a000010000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000a454c16edb300cbd0fd83f18be274eba2d180245459720c8a1590dc44dcf8a45dbc414c990 +b8b4ddf7ec4ff66393e5da4dd6a040579f1ec9e727fa9132bb7cd8abe800d6a1d1b3783c1cc511 +e8dc48d4e52cbecd9683af71e448682994d1308b1fc1c597fce307965a53832504177909ed6671 +45544f93c4e515ec851bfab2f695c2d8bd201fda32314581392c4cfe730f9a928bd16892c00381 +962007752f18b78ad303fdafa83479d39fdb668fb5d7e32c332454867be023963c07ecce58e99a +5c0bd8555d2bcc057937f81a736b9c2928ba094744a9b9079b1ad4c49263a2f7029c3f3b44cbd0 +1aff660169874ab2e44c95a5c28ad28aba0a871f456ca35082e363963c21f6dd10045a0bd80aa5 +04fd54f5e99398add77385752874906d72a160ee0de185500ebc749f602b10cdb05381d6330f34 +3d404ec6460e7ff9714fe268271c3436cee283b02834c52dad0d0256b523cbb760ef9b5112449b +bcb25890b07eb62ce919011ebf788cf133ff14081ebc4a6cb516e0b07c8bf8f80de24ba3d08f0c +09d4fb4f084130d5e353bb332405eea6f00b4067dcff72ec7ee8a1f5be6de7caeb9fb4d7a3b950 +b8b3f85a2dbac6b2a2b38c76dbcf969e6fc020b57f7ef76bfdc2a4ee73fff9c06bd43fdc6d9d99 +8520e896f134c93695b020fd7dee97b54fb09577c2aa863faf842e41769c9785e62a6fdbff1a1f +4f8623ff845bdbe59a7bd9fd70f85f000000ffff0300504b01022d0014000600080000002100df +cc18f5ad010000460c00001300000000000000000000000000000000005b436f6e74656e745f54 +797065735d2e786d6c504b01022d001400060008000000210068f874a103010000e20200000b00 +000000000000000000000000e60300005f72656c732f2e72656c73504b01022d00140006000800 +00002100635c23b4c00000003701000020000000000000000000000000001a0700007070742f73 +6c696465732f5f72656c732f736c696465312e786d6c2e72656c73504b01022d00140006000800 +000021001b2e35070c010000d00300001f00000000000000000000000000180800007070742f5f +72656c732f70726573656e746174696f6e2e786d6c2e72656c73504b01022d0014000600080000 +002100bcd1a735de0200002c0e00001400000000000000000000000000690a00007070742f7072 +6573656e746174696f6e2e786d6c504b01022d0014000600080000002100303a84e5ea0200006c +0600001500000000000000000000000000790d00007070742f736c696465732f736c696465312e +786d6c504b01022d0014000600080000002100d5d192f1bc000000370100002c00000000000000 +000000000000961000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c +61796f7574362e786d6c2e72656c73504b01022d0014000600080000002100d5d192f1bc000000 +370100002c000000000000000000000000009c1100007070742f736c6964654c61796f7574732f +5f72656c732f736c6964654c61796f7574372e786d6c2e72656c73504b01022d00140006000800 +00002100d5d192f1bc000000370100002c00000000000000000000000000a21200007070742f73 +6c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574392e786d6c2e72656c73 +504b01022d0014000600080000002100d5d192f1bc000000370100002d00000000000000000000 +000000a81300007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f +757431302e786d6c2e72656c73504b01022d0014000600080000002100d5d192f1bc0000003701 +00002c00000000000000000000000000af1400007070742f736c6964654c61796f7574732f5f72 +656c732f736c6964654c61796f7574382e786d6c2e72656c73504b01022d001400060008000000 +2100d5d192f1bc000000370100002d00000000000000000000000000b51500007070742f736c69 +64654c61796f7574732f5f72656c732f736c6964654c61796f757431312e786d6c2e72656c7350 +4b01022d0014000600080000002100d5d192f1bc000000370100002c0000000000000000000000 +0000bc1600007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f75 +74312e786d6c2e72656c73504b01022d0014000600080000002100d5d192f1bc00000037010000 +2c00000000000000000000000000c21700007070742f736c6964654c61796f7574732f5f72656c +732f736c6964654c61796f7574322e786d6c2e72656c73504b01022d0014000600080000002100 +d5d192f1bc000000370100002c00000000000000000000000000c81800007070742f736c696465 +4c61796f7574732f5f72656c732f736c6964654c61796f7574332e786d6c2e72656c73504b0102 +2d0014000600080000002100d5d192f1bc000000370100002c00000000000000000000000000ce +1900007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574342e +786d6c2e72656c73504b01022d001400060008000000210069a25f2115010000c70700002c0000 +0000000000000000000000d41a00007070742f736c6964654d6173746572732f5f72656c732f73 +6c6964654d6173746572312e786d6c2e72656c73504b01022d0014000600080000002100e40b4c +2ac6040000891000002200000000000000000000000000331c00007070742f736c6964654c6179 +6f7574732f736c6964654c61796f757431312e786d6c504b01022d0014000600080000002100ee +0bf3bf90040000a70f00002200000000000000000000000000392100007070742f736c6964654c +61796f7574732f736c6964654c61796f757431302e786d6c504b01022d00140006000800000021 +005a9d379569050000671500002100000000000000000000000000092600007070742f736c6964 +654c61796f7574732f736c6964654c61796f7574332e786d6c504b01022d001400060008000000 +21008f55c3fd730400006b0f00002100000000000000000000000000b12b00007070742f736c69 +64654c61796f7574732f736c6964654c61796f7574322e786d6c504b01022d0014000600080000 +0021007555dfd224050000701200002100000000000000000000000000633000007070742f736c +6964654c61796f7574732f736c6964654c61796f7574312e786d6c504b01022d00140006000800 +00002100fd00fcd1320800004e3600002100000000000000000000000000c63500007070742f73 +6c6964654d6173746572732f736c6964654d6173746572312e786d6c504b01022d001400060008 +00000021009119fff8d4040000951300002100000000000000000000000000373e00007070742f +736c6964654c61796f7574732f736c6964654c61796f7574342e786d6c504b01022d0014000600 +080000002100d60634cc2e060000371f000021000000000000000000000000004a430000707074 +2f736c6964654c61796f7574732f736c6964654c61796f7574352e786d6c504b01022d00140006 +00080000002100ccacc02fe8030000060c00002100000000000000000000000000b74900007070 +742f736c6964654c61796f7574732f736c6964654c61796f7574362e786d6c504b01022d001400 +06000800000021005632cb5c8e030000fa0900002100000000000000000000000000de4d000070 +70742f736c6964654c61796f7574732f736c6964654c61796f7574372e786d6c504b01022d0014 +0006000800000021004ba90907dd050000651700002100000000000000000000000000ab510000 +7070742f736c6964654c61796f7574732f736c6964654c61796f7574382e786d6c504b01022d00 +140006000800000021004a0963b7a1050000201700002100000000000000000000000000c75700 +007070742f736c6964654c61796f7574732f736c6964654c61796f7574392e786d6c504b01022d +0014000600080000002100d5d192f1bc000000370100002c00000000000000000000000000a75d +00007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574352e78 +6d6c2e72656c73504b01022d001400060008000000210068b9a05cc3060000c920000014000000 +00000000000000000000ad5e00007070742f7468656d652f7468656d65312e786d6c504b01022d +000a00000000000000210015e9f11504090000040900001700000000000000000000000000a265 +0000646f6350726f70732f7468756d626e61696c2e6a706567504b01022d001400060008000000 +2100a364236b8d010000320300001100000000000000000000000000db6e00007070742f707265 +7350726f70732e786d6c504b01022d0014000600080000002100d8fd8d8fac000000b600000013 +00000000000000000000000000977000007070742f7461626c655374796c65732e786d6c504b01 +022d00140006000800000021006720e9636d010000c60200001100000000000000000000000000 +747100007070742f7669657750726f70732e786d6c504b01022d00140006000800000021007749 +ef2667010000b2020000110000000000000000000000000010730000646f6350726f70732f636f +72652e786d6c504b01022d0014000600080000002100e329ddaa0f020000070500001000000000 +000000000000000000ae750000646f6350726f70732f6170702e786d6c504b0506000000002500 +25004d0b0000f37800000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000002004f006c00650050007200650073003000300030000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000001800020103 +00000005000000ffffffff00000000000000000000000000000000000000000000000000000000 +000000000000000003000000fc010000000000005200690063006800450064006900740046006c +006100670073000000000000000000000000000000000000000000000000000000000000000000 +0000000000001c000200ffffffffffffffffffffffff0000000000000000000000000000000000 +000000000000000000000000000000000000000b0000000c000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000ffffffffffffff +ffffffffff00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000fa020000040000002f528f00040000002d010400070000 +00fc020100000000000000040000002d010500120000002403070065026a03e4086a03e408af02 +5a0a2504e4089b05e408e0046502e004040000002d010200040000002d01030004000000f00104 +00040000002701ffff040000002c010000070000001604cf08a80f00000000030000001e000400 +00002c010000040000002701ffff0300000000000000000000000000000000000000000000004e +414e49000000000000000001000008000000000100000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000 +01050000 +05000000 +0d000000 +4d45544146494c455049435400 +0a450000 +28d9ffff +c2010000 +08000a45d8260000 +010009000003dd00000006001200000000000400000003010800050000000b0200000000050000 +000c02cf08a80f030000001e0007000000fc020000ffffff000000040000002d01000008000000 +fa02050000000000ffffff00040000002d0101000e00000024030500ffffffffffffcf08a80fcf +08a80fffffffffffff08000000fa0200000000000000000000040000002d01020007000000fc02 +0000ffffff000000040000002d01030004000000f001000007000000fc0200004472c400000004 +0000002d0100000400000006010100040000002d010100120000002403070065026a03e4086a03 +e408af025a0a2504e4089b05e408e0046502e004040000002d0102000400000006010100040000 +002d01030008000000fa020000040000002f528f00040000002d01040007000000fc0201000000 +00000000040000002d010500120000002403070065026a03e4086a03e408af025a0a2504e4089b +05e408e0046502e004040000002d010200040000002d01030004000000f0010400040000002701 +ffff040000002c010000070000001604cf08a80f00000000030000001e00040000002c01000004 +0000002701ffff030000000000 +}{\result{\pict\wmetafile8\picw10020\pich5638\picwgoal10020\pichgoal5638 +010009000003dd00000006001200000000000400000003010800050000000b0200000000050000 +000c02cf08a80f030000001e0007000000fc020000ffffff000000040000002d01000008000000 +fa02050000000000ffffff00040000002d0101000e00000024030500ffffffffffffcf08a80fcf +08a80fffffffffffff08000000fa0200000000000000000000040000002d01020007000000fc02 +0000ffffff000000040000002d01030004000000f001000007000000fc0200004472c400000004 +0000002d0100000400000006010100040000002d010100120000002403070065026a03e4086a03 +e408af025a0a2504e4089b05e408e0046502e004040000002d0102000400000006010100040000 +002d01030008000000fa020000040000002f528f00040000002d01040007000000fc0201000000 +00000000040000002d010500120000002403070065026a03e4086a03e408af025a0a2504e4089b +05e408e0046502e004040000002d010200040000002d01030004000000f0010400040000002701 +ffff040000002c010000070000001604cf08a80f00000000030000001e00040000002c01000004 +0000002701ffff030000000000 +}}} \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/ole2.png b/sw/qa/extras/htmlexport/data/ole2.png new file mode 100644 index 0000000000..fdad35484e Binary files /dev/null and b/sw/qa/extras/htmlexport/data/ole2.png differ diff --git a/sw/qa/extras/htmlexport/data/paint-ole-bitmap-format.odt b/sw/qa/extras/htmlexport/data/paint-ole-bitmap-format.odt new file mode 100644 index 0000000000..d83b894597 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/paint-ole-bitmap-format.odt differ diff --git a/sw/qa/extras/htmlexport/data/paint-ole.ole b/sw/qa/extras/htmlexport/data/paint-ole.ole new file mode 100644 index 0000000000..e8e78490ed --- /dev/null +++ b/sw/qa/extras/htmlexport/data/paint-ole.ole @@ -0,0 +1,199 @@ +{\object\objemb{\*\objclass PBrush}\objw13852\objh7822{\*\objdata +01050000020000000700000050427275736800000000000000000000440000 +424de64300000000000036000000280000004c0000004c0000000100180000000000b043000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9894f6241ced241ced +7d79f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4039ef241ced241ced241cedf8f8feffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1bffa322aee241ced241ced625cf2f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6a2f7241ced241ced241ced625cf2f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff918df6241ced241ced241ced625cf2f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffff918df6241ced241ced241ced625cf2f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918df6241ced241ced241ced625cf2 +f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918df6241ced241ced241ced625cf2f8f8feffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918df6241ced241ced241ced706af4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff918df6241ced241ced241ced7d79f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff3931ef241ced241ced241ced625cf2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9894f6241ced241ced7d79f5ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffc1bffa322aee241ced241ced241cedbab8f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2b23ee241ced241ced2b23eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1bffa4039ef241ced241ced4d47f1ffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe241ced241ced241cedadaaf8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeafd241ced241ced241cedffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff8f8fe7772f4241ced241ced241ced2b23eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3931ef241ced241cedbab8f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8480f5241ced +241ced241ced241ced9894f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8480f5241ced241ced4d47f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9894f6241ced241ced241ced4039efa6a2f7ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffeaeafd241ced241ced241cedadaaf8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe2b23ee241ced241ced2b23eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3931ef +241ced241ced241ced625cf2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8480f5241ced241ced2b23eeadaaf8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbab8f9322aee241ced241ced241cedbab8f9ffffffffffffffffff +ffffffffffffffffffffffffffffffffffff2b23ee241ced241ced9894f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1f1fe706af4241ced241ced4d47f1ffffffffffffffffffffffffffffffffffffffffffffffffbab8f9241ced241ced +241cedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeafd2b23ee241ced241cedcfcdfbffffffffffffffffffffffffffffffffffff7d79f5241ced241ced241ced2b23eeffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7d79f5241ced241ced8b87f6ffffffffffffffffffffffffffffffd6d4fb241ced241ced241ced2b23ee9894f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffc8c6fa241ced241ced4039effffffffffffffffffffffffff8f8fe5b55f2241ced241ced5b55f2eaeafdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3931ef241ced241ced +bab8f9fffffffffffff8f8fe625cf2241ced241ced241cedd6d4fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8480f5241ced241ced4d47f1f8f8fef8f8fe625cf2241ced241ced241ced918df6 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeafd2b23ee241ced241ced625cf2746ff3241ced241ced241ced918df6ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6a2f7241ced241ced241ced241ced241ced241ced918df6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffff918df6241ced241ced241ced241cec6963f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff8f8fe413af0241ced241ced241cedbab7f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe625cf2241ced241cee241ced241ced544ef1f8f8fe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe625cf2241ced241ced241cec281fee241ced241ced625cf2f8f8feffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbab8f94d47f1241ced241ced241ced918df69f9bf7241ced241ced241ced625cf2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff8f8fe6963f3241ced241ced241ced241ced918df6ffffffffffff918df6241ced241ced241ced9894f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe625cf2241ced +241ced241ced2b23ee9894f6ffffffffffffffffffffffff8b87f6241ced241ced2b23eedddbfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7772f4241ced241ced241ced7d79f5eaeafdffffffffffffffffffffffffffffff +f8f8fe4d47f1241ced241ced544ef1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6d4fb241ced241ced241ced918df6ffffffffffffffffffffffffffffffffffffffffffffffffd6d4fb2b23ee241ced241ced9894f6ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeafd544ef1241ced241ced6963f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9894f6241ced241ced2b23eedddbfcffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffadaaf8322aee241ced241ced241cedd6d4fbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff544ef1241ced241ced544ef1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe6963f3241ced241ced241ced241ced +9894f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e3fd2b23ee241ced241cedbab8f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe625cf2241ced241ced241ced4640f0cfcdfbffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffff8480f5241ced241ced4d47f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe625cf2241ced241ced241ced8480f5f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeafd2b23ee +241ced241ced9894f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffd6d4fb8480f54039ef241ced241ced241ced918df6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9894f6241ced241ced2b23eedddbfcffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe6963f3 +241ced241ced241ced241ced241ced918df6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff544ef1241ced241ced544ef1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe625cf2241ced241ced241ced241ced3931ef9f9bf7ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4e3fd2b23ee241ced241cedbab8f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe625cf2241ced241ced241ced7772f4c8c6faffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8480f5241ced241ced4d47f1f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8c6fa544ef1241ced241ced241ced918df6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffeaeafd2b23ee241ced241ced706af4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffc8c6fa5b55f2241ced241ced241ced241ced918df6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa6a2f7241ced241ced2b23ee +f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeaeafd625cf2241ced241ced241ced241ced2b23ee +9894f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadaaf85b55f2adaaf8ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffadaaf8322aee241ced241ced241ced2b23ee8480f5eaeafdffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8fe6963f3241ced241ced241ced241ced8480f5eaeafdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff8480f5241ced241ced241ced4640f0cfcdfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +4039ef241ced241ced8480f5f8f8feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1bffa5b55f2a6a2f7ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000 +000000000000000000000000000000000000000001050000050000000d0000004d45544146494c45504943540049060000b7f9ffff2c1b00000800490649060000 +010009000003920d00000000690d000000000400000003010800050000000b0200000000050000000c024d004d00030000001e0004000000070104000400000007010400690d0000410b2000cc004c004c00000000004c004c0000000000280000004c0000004c0000000100080000000000000000000000000000000000 +000000000000000000000000ffffff00c1bffa005b55f200a6a2f7004039ef00241ced008480f500f8f8fe004640f000cfcdfb006963f300eaeafd00adaaf800322aee002b23ee00625cf2009894f600c8c6fa00918df600544ef100706af4007772f4004d47f1003931ef009f9bf700e4e3fd00bab8f900d6d4fb00dddb +fc007d79f5008b87f600241cec00281fee00241cee00413af000bab7f900746ff300f1f1fe0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011106061e0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010506060608 +0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101020e0606100801010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010406060610080101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101130606061008010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010113060606100801010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +011306060610080101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101130606061008010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +01010101010101010101010101010101010101010101010101010101011306060615010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101130606061e010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011806060610010101010101010101010101010101010101011106061e0101010101010101010101010101010101010101010101010101010101010101010101010101010101 +01010101010101020e0606061b0101010101010101010101010101010101010f06060f0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010102050606170101010101010101010101010101010101080606060d010101010101010101010101010101 +01010101010101010101010101010101010101010101010101010101010101010101010c06060601010101010101010101010101010108160606060f010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011806061b01010101010101010101 +010101010706060606110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010107060617010101010101010101010101011106060605040101010101010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010c0606060d0101010101010101010101080f06060f01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011806060610010101010101010101010706060f0d0101010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010101011b0e0606061b0101010101010101010f0606110101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010126150606170101010101 +0101011b0606060101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010c0f06060a0101010101011e0606060f01010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +0101010101010101010101010101010101011e06061f01010101011c0606060f1101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101120606050101010108030606030c010101010101010101010101010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011806061b010108100606061c010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010706061708 +08100606061301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010c0f0606102506060613010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +01010101010101010101010101010101010101010101040606060606061301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010113060606200b010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010823060606240101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010810 +062206061408010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010810060620210606100801010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101011b17060606131906060610010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101080b06060606130101130606061101010101010101010101010101010101 +01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010108100606060f11010101011f06060f1d010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101160606061e +0c0101010101081706061401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011c0606061301010101010101011c0f0606110101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010c1406060b010101010101010101011106060f1d010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010d0e0606061c0101010101010101010101140606140101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101080b06060606110101010101010101010101011a0f06061b0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010810060606090a0101 +010101010101010101010101070606170101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101081006060607080101010101010101010101010101010c0f060611010101010101010101010101010101010101010101010101010101010101010101 +01010101010101010101010101011c0705060606130101010101010101010101010101010101011106060f1d0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101080b060606060613010101010101010101010101010101010101010114060614010101010101 +0101010101010101010101010101010101010101010101010101010101010101010101010108100606060618190101010101010101010101010101010101010101011a0f06061b01010101010101010101010101010101010101010101010101010101010101010101010101010101010810060606161201010101010101 +0101010101010101010101010101010101070606170801010101010101010101010101010101010101010101010101010101010101010101010101010112140606061301010101010101010101010101010101010101010101010101010c0f06061501010101010101010101010101010101010101010101010101010101 +01010101010101010112030606060613010101010101010101010101010101010101010101010101010101010406060f08010101010101010101010101010101010101010101010101010101010101010101010c10060606060f110101010101010101010101010101010101010101010101010101010101010d030d0101 +01010101010101010101010101010101010101010101010101010101010101010d0e0606060f070c010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101080b06060606070c010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010107060606090a01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101050606070801010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010203040101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 +01010101040000002701ffff030000000000 +}{\result{\pict{\*\picprop}\wmetafile8\picw13852\pich7822\picwgoal13852\pichgoal7822 +}}} diff --git a/sw/qa/extras/htmlexport/data/paint-ole.png b/sw/qa/extras/htmlexport/data/paint-ole.png new file mode 100644 index 0000000000..8388f7382f Binary files /dev/null and b/sw/qa/extras/htmlexport/data/paint-ole.png differ diff --git a/sw/qa/extras/htmlexport/data/paint-ole.xhtml b/sw/qa/extras/htmlexport/data/paint-ole.xhtml new file mode 100644 index 0000000000..efe3326ad9 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/paint-ole.xhtml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sw/qa/extras/htmlexport/data/pdf-ole.odt b/sw/qa/extras/htmlexport/data/pdf-ole.odt new file mode 100644 index 0000000000..184449a4f8 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/pdf-ole.odt differ diff --git a/sw/qa/extras/htmlexport/data/reqif-aschar-objsize.odt b/sw/qa/extras/htmlexport/data/reqif-aschar-objsize.odt new file mode 100644 index 0000000000..6028b54a41 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-aschar-objsize.odt differ diff --git a/sw/qa/extras/htmlexport/data/reqif-chinese.odt b/sw/qa/extras/htmlexport/data/reqif-chinese.odt new file mode 100644 index 0000000000..b99c57caee Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-chinese.odt differ diff --git a/sw/qa/extras/htmlexport/data/reqif-jpg-img.xhtml b/sw/qa/extras/htmlexport/data/reqif-jpg-img.xhtml new file mode 100644 index 0000000000..da7276192a --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-jpg-img.xhtml @@ -0,0 +1,4 @@ + + OLE Object + + diff --git a/sw/qa/extras/htmlexport/data/reqif-list.xhtml b/sw/qa/extras/htmlexport/data/reqif-list.xhtml new file mode 100644 index 0000000000..5433ee10a6 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-list.xhtml @@ -0,0 +1,11 @@ +Heading + + + First + + Second + + Third + + + diff --git a/sw/qa/extras/htmlexport/data/reqif-no-lang.odt b/sw/qa/extras/htmlexport/data/reqif-no-lang.odt new file mode 100644 index 0000000000..c831921a42 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-no-lang.odt differ diff --git a/sw/qa/extras/htmlexport/data/reqif-objdata-presentationdatasize.odt b/sw/qa/extras/htmlexport/data/reqif-objdata-presentationdatasize.odt new file mode 100644 index 0000000000..231a7c572a Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-objdata-presentationdatasize.odt differ diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-data.ole b/sw/qa/extras/htmlexport/data/reqif-ole-data.ole new file mode 100644 index 0000000000..d3dc23d793 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-ole-data.ole @@ -0,0 +1 @@ +{\pict} diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-data.xhtml b/sw/qa/extras/htmlexport/data/reqif-ole-data.xhtml new file mode 100644 index 0000000000..5f9c894000 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-ole-data.xhtml @@ -0,0 +1,3 @@ + + + diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-img.jpg b/sw/qa/extras/htmlexport/data/reqif-ole-img.jpg new file mode 100644 index 0000000000..ca9183e9d3 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-ole-img.jpg differ diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-img.png b/sw/qa/extras/htmlexport/data/reqif-ole-img.png new file mode 100644 index 0000000000..fdad35484e Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-ole-img.png differ diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-img.xhtml b/sw/qa/extras/htmlexport/data/reqif-ole-img.xhtml new file mode 100644 index 0000000000..df3f4a048e --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-ole-img.xhtml @@ -0,0 +1,6 @@ + + + OLE Object + + + diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-nodata.odt b/sw/qa/extras/htmlexport/data/reqif-ole-nodata.odt new file mode 100644 index 0000000000..a4d3243a8b Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-ole-nodata.odt differ diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-odg.ole b/sw/qa/extras/htmlexport/data/reqif-ole-odg.ole new file mode 100644 index 0000000000..de674fe3c6 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-ole-odg.ole @@ -0,0 +1,146 @@ +{\object\objemb{\*\objclass }{\*\objdata +000000000200000000000000000000000000000000240000d0cf11e0a1b11ae1000000000000000000000000000000003b000300feff09000600000000000000 +00000000010000000f00000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffdfffffffffffffffefffffffeffffff05000000060000000700000008000000090000000a000000 +0b0000000c0000000d0000000e000000feffffff10000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff52006f006f007400200045006e007400720079000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000feffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000feffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000feffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000feffffff000000000000000001000000fefffffffefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffff0100feff030a0000ffffffff71b78b44e2cfc447bcdf1fbf378e202c1b0000004c696272654f6666 +6963652e44726177446f63756d656e742e310010000000456d626564646564204f626a6563740000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000001000002000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000143700000000000010270000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000504b0304140000080000a26dbe4c9f032ec42b0000002b000000080000006d696d65747970656170 +706c69636174696f6e2f766e642e6f617369732e6f70656e646f63756d656e742e6772617068696373504b0304140008080800a26dbe4c000000000000000000 +0000000c00000073657474696e67732e786d6cb5585b6fda30147edfaf405127b50f107ad13a22a02a6d59abb18d15e89e0fc9815875ecc8764af9f73b49a0a2 +102a1af013c2f6f9ce77ee769a57af11afbca0d24c8a96735aab3b1514be0c9898b69cd1b05bfdee5cb5bf34e564c27cf402e927110a53d5680c1dd1151217da +cbb75b4ea284274133ed0988507bc6f7648c6229e6ad9ef63265f9ca2b67e2b9e584c6c49eebce66b3daecbc26d5d43d6d341a6eb6bb3c1a2bd404052623bc9b +c2559955b5be141336dd15253fbd2a2fa57c239d0ae48665c4cfeaf50b37ffbf3cad23c677d5959eadfa328a89f398bff3150816ed0a939eddb03a67f531f7c6 +1bf745b05652e4cc692ff3619906ede6c239f94f95198cd21ca92c96538e2d87547a2f0c676fd9e314c9bd9779623a75c0b54218cad8596e9a794c9b4c18a75d +6fba9b209f02eee1c4d841fec7021316419f5ed41b8dbde1ef914dc342ea54365be00b16d378ec1ec17c2151595e7d2694d771cce7238dea160cac911e4bc911 +84d3362ac1727ee93013413c04f2cde8b1b786af8d22964efbe878ac400463d098287ee2ea1014ba31703203bf9e778e8e13224855179e2c48b8da9000a8a0a6 +e5b81cb31b5202be417543054dad282da421d15ae7184a553eeb6e2497caaaf57e3962b7a043abbc8292bc70020937446d608a3bcbe9d965c960dc45630cba52 +18bd2dcf27c075c944ffa12060d4e3ad3a755a8edb3d18df6eb4c372c41ef44f54e25a3310fd44f826c9da9785e83ce83e99693a523e9341d61574c07f3e7c2f +7dafa3ab2893ad29a169b0de090fe8a62e337d985a5470cf820045aa636badefeda214fd372dd8b362c838daf5d39059e1df6302ef4460b5e594a52621784408 +a4e0730b96ff42d089c29160ebb5b9b8485c96c3cd922da101a6ba52d1eba168325e9485563055108783248a6c35e02cdbfe26c0995977fb3eb7fa0c16d58308 +307d67d1fcedc15c261bbe5f641c97b32a5df5244f5233f7525950f90b2deece187d88299e4a460334c9fa65e7605e4755084f55f7eda2c304a8f92e9407f082 +4ff973f38fb8e152dbe81b039f8aff969ebd11f1325215defff680a60a427560e0511cd0ac4ca338c428e61fcccded1367ebf3cfdd78d2bbdb3efab4ff03504b +07089f6ee54e2b03000036120000504b0304140008080800a26dbe4c0000000000000000000000000b000000636f6e74656e742e786d6cbd58518fa336107eef +af409cd437e290dcdd6ee826275555a54abba753774faaeecd6b0cb8c518d92624fdf53736e09864c9a25eb52f41d8df371e7f339ec1b9fb74e065b0a7523151 +6dc378b10c035a1191b22adf865f9f7e8f6ec34fbb9fee4496314293549086d34a4744541a9e01b02b9574b3dbb0915522b0622aa930a72ad1241135ad0656e2 +a313bb5637a2f4b19c4db7609fade941cf251bec888b9fe7af6cc13e3b95b89d4b365810d5a767622ef9a0ca2813a03aafb166675e1c4a56fdb30d0badeb04a1 +b66d17ed7a21648ee2cd6683ecac7398385cddc8d2a252826849cd620ac58b180d584e359eeb9fc1fa2e550d7fa672b63458e38ba8d6922a80c0764d62ce33e4 +7346f9b5cf6767d73e9f90991458cece330b1ea7ca3a9d9f2aebd4e772ac8b89f8dea20798b43f0ff7a7bc927cee5a063b928a4856cfde6687f6f94208e7aa21 +7487ddbabb5a2edfa3eedd43b757e1ad649a4a0f4eaec2092e89535cf09744035c8c0011d1bd497977888c106a82b042ddb403ab74d2f45f0ff78fa4a01c9fc0 +ec7570c42aa5717552467156ce8e0260279216576c762a18ecc5d19126192615ff8024ad85d42e40d9fc2600abac9c4685e6e5740933b303349769fa2214dc59 +232867504ca23da3edbb70d49dae27e6e62c316da97f8d62417e2fb84a8897c8605c3981543d352e99bbde9a89a64abb387402d2434d253353b8b4b46464c18f +5629fe83c9be1f7b16464d8ad172a85c6e4b2f9a1122e20a12190eaca8138f3dee79921fe699338754a4d9b9c5b38245945aeb97f2e1e94f64e622d3f2a1a9f5 +2b799f3aab70377cd774754c213790c1f74d946142a3949252edeebafee48683eeddf8bd0def19343b2b6ff0882ba812d04406281ccde336fc19d742fd7286eb +06c36064dae0a39c562004943a2938ae46889a6902cd608f25b3d987e6bb0626b359be19e05b38f75968715d3187786bad60c9f87f8ca33a2a4df90f39d71096 +e257f2eb8479139f1e692e68f0f58f498706c09b78f3840b61baee852f6ee247574753c5a11fc78d16a68392c8da7155c3fe8e7c4debd82dd67bd9df0fa21ae7 +de562fa9b9bca0e612d70523c3708da5b9a2d997a823996f8b14cb341cecf694a886c24aa5665405c6017b3f023a8e0a21d9bfc254e208972c8782f977a334cb +8ee119706fe8e404e30cfa33ed5146912897a28d0acaf202ea74864b05b3994838abdc28dc3bdedf10eec65b969a4fde78f1f1c306868df69e1ed3e27cb9d006 +c4c076b36eeb6ec4df3cac6b76346c8250d3732ed7459391ee279e457a742f7d487777560b13d84e95ce57f31ef73af9b1b2b9614739dc8aa8b419d1cffd4633 +dc943aec4d120889e0912a704d2f0dd94c71c11ae5c39761a6c447734f8387687477767aed578bd86a6fc74e715a6f6e864168e36b1f7434a49b9b5b78dfddd9 +8b768d7a476955988fdb144e9c80bba23c5a82f94afb55809965b00c56f1c765ff3b787dacc1554909246fee52ca99aaedade82130e4fb9e3e32139c9ecbe05b +f0d986f342b761cca87c0ab00b1d1a05164dfc0fb2fb0e504b0708a84c77df6004000048110000504b0304140008080800a26dbe4c0000000000000000000000 +000a0000007374796c65732e786d6ced5c5f73db36127fbf4fa151e7ee8da6484bb6a58bddb9de4d6f3ad3a49dfc79e853072241090d497040d0b2f325eef1be +df7d92dbc51f1294489ab65527519bccd8117601ecfe76b1582ca0bcfaf62e4b27b754948ce7d7d3e06c369dd03ce231cb37d7d30fefbff7aea6dfdefce5154f +1216d155cca32aa3b9f44a799fd272029df372a589d7d34ae42b4e4a56ae7292d17225a3152f686e3bad5cee959a4ab7a8c1c67657cc6e6f49efe4d8cec8dbea +4bd6e36756cc6eef5890ddd8cec80b98badd133eb6f35d997a09f7229e1544b23d29ee52967fbc9e6ea52c56bebfdbedce76e7675c6cfc60b95cfa8a5a0b1cd5 +7c452552c515473e4d294e56fac159e05bde8c4a32563ee47545caab6c4dc56868882407562d042d8105d445bf1c3790dba7e55fb79bd1de75bbe98139da1231 +dacf1473db55cee3f1ae721ebb7d3322b73df6bdf25f0351fd78fd63e357221b3b17f2b6a08a042b46aba9b9ddfe9cf35a54eca017bb12379ccde6befeec70ef +06d97782492a1cf668903d22695423ceb32ed0802ff081c3a3b7e8f2b5de194b476b0dbc3d4e4272361a7ae43d705581e0f76ab8f0052db8903520c9f8a00bb3 +8475c8d8ca2ced0f1948b5ac1b11c79dac20ceb90fe10316af77cbe8ee9b696b37187684e59e23a8d0fa5017c5e4c6dec10ec1cc479e7af9826b341b85d8d45b +59c2ab3cd676d000d2bb820a862492aa6eabd608aeb552fe8421cdfee78cd0da14184d6da4a855ea1c86732f2b3d96c302e1c5cae9dd8a5a65792ebbccf7fead +8f340f774488f9661e271108a73776d74f38ecf80989a817d3282d6f5ee9685d374ff46714f27afa2383d0af949fbc23392c3008a9961516cefdf5f46fa4e0e5 +dff7f874e374d21a1af9bd0dcd416b58f88267246f71144c46101a6f8960ca37fcf1a2c190c928d990f125847bc3251f46ace67869ac60cae088762cef4b49b3 +670957452c260ff857c3f32232bda31b4e271f7ee815c832bc8834efc9163ca043969af0dcd9fdbee060daf509e1e6150661d84548cc206e4dd4272de2f72c4d +69fc6b38fbf5bbb482b8ae48312b8b94dc7b2ecbc4a19ba30224b59488ba0d922dd890530e29e73797e132891243827db0269c2f16e1c5b2d50783675e3209b8 +04b3d95f9d4edd14926f70f6f3d9cc34acb98831d1050e7f94aaff1694e643baba0c2394bd5c47178b0e6583f0f2220c3fb3b26f693ca46a437e58d124b9882f +e20e45a3651804f4332bfa0b4d53be1bd2b5c53146dd982e961deaaee79757b3f9efae6e46c4472a5c65ff2104ca8ff104b3bdeff81d7498cc26e16c723ed3ed +90b6bc0ea02df5026cdc86b34f4d988a6942aad4140e6c68313109c02db62c9a5a5ef3d92b20b1a142325aaaf14b29f847daace7f9c58258281280f92004247c +b583a13c5ee85364ce3dfcdc08551041d464ada91409f3228f54929705c1da068b29d7ac242db675002daa3c9295dafed4d8103d5956609aaae968636f2d2881 +133ac8cf22d98aab2c8f2926eb585251ac389b2abd24242d698d08a4be801c2f4a0cbcfdb2d7ec28fc814a5549bd1dccc8779e9adcc02545455b42f5254b00a7 +a297ec13d0c37921555b0a0e55910d3461e0828608d25f29c0ae1fde1d8cebc14985e4adddb261c0812d831ede806866b0b44f5b4b315359c23fdf1c4e8807b5 +94de75ee7c6ac29aa173ca9aba65fb93d6a41fde4c1bbbb41cdd1ac4f57a0d2fac5d38238878faf8b560d63e2e061887a72c9ebaeb63c762ac17cca26cfae0b2 +d1ebdcd381c4763c0bb1eb213da278d6b0aed962c068d3df5d05b08eceb8686b0dfa97b1a2a04b135847de960bf689e311085622db80d57fab4ac9927be57b05 +89b174e9c15a4151827081c238843597122b035db494265229b04f106cb37528da005b12abea058be366c7568d1ea4402595de5d1b8d36f1be936875bf9ae15f +f00255b14c59d98e9c7b3ee4b2a5f496a69ad95b57b0f9c88926623b6c0453fd51933c2c545d4ffff7dfffd40ee70ce2f89cea93b1dc4bc91a28b5ad2f4001bf +2fecd880617dfb1d58f0dd7db6e6e9744c486ac79bf9426d4ffe90a68fc0217c060e6a4bf0d634e1825a104e0fa1f3a32114683f3f3984e64744e8ea24115a1c +0da1f06c7e92085d1c0da1f393c4e7f278f89c689cbe3a1a42f3138dd3cb2322749a713a981d0da2c5d715a81db239b1f97d07afc1aa01cc0da79d0d2aac4f11 +e608611aed09a2ddaa4f29edb6fa80629a5559604b757f5dc68156851c538503cdfa20a6aa768bdc391719499b51a42079a9ef8c739ed351483b53f14aa288f5 +c9ce2129d1e556f06ab3f54cd1cb9de29049de177b3c3d150955f9df7797dfef6269cfb5822b53fbd06d56b336aef68078a071056613badae3626287db195bdb +f1ccfaa312cecf1e1ca773551feaacdad83a48c7e5cd81f686f56998d9de7d570596de00d853e6d148ba44b53a0db50d8183ce0043bbe8d3be293a50a7e67bfc +9d51d3b717849aa31f869aa507889ade0f450f8b72359a155ba27df66051099a329a74f827bfed72cf2e0613139af8e0d4c11ea87ff1f56f34923b26b71040b0 +ecd35708b3855622ea7767de41f9e33175e399fad32a41290d478bfe93121debfe283efece39fec4b1f03748d534224e5687f6cd801e6682634c723ec1de13e8 +8aff763b1d178f56ed501bf6c938a02f7c055232997e563087b76593ab60e979b44a5b4ae2cfed22a3522153859d873d29ce59188c495d9c0b87d11865949495 +7809880e2bf09d91c62da5d7d7698f29c2d33ceeecd7537b77cc652bcc90ca553993267918097b103e06767dddf9844b8d7181baf7ae20517ffa753a48269de7 +36dd69e4715fdbec833a7713489bf1c139277e2cd4cdfb89ae3da6f580e2b12bc1d8f2c9a1c2de99bbf6b26d5ea70e432eb967e9d3b6a879053260d216c7176a +532de39f46759fc30c98f46d7fe0fc420c8a12fe69cebd473f03166db37ca1463542fec1edfa932e633d3375a9f3b0d955d0f3fe62e0f8f987495d2cd8c3c98b +e57a62fa525bf4f94f6906cc695e958e593df601ea891b742077a92dfac4ece5654c6adece8e31a97d667be226edcd5c6a833e29777919739a17c263cc691f13 +9fb839873297daa24fcd5d5ec6a8e61df418a3da27d35fb151fdbdef54988ff83c19bf4218799660adb2a11e989457b2e5033fbf9e4d3b78066a774177e16eaf +59df78069d379eb655cd670c1b06678ba5db6eaf37c3cbb3a5ba3d36320a06d070c19a2f02e3b71f05616e45cad1a4dffd5fc745b0efcbe62bd91e0e50e3e236 +1eb8ec9a441f3702bfdd678ca89fce8fa84efbbd2633848c94521501ef9b6fcd8052d884d7d4cd67f751bed6ba7eb57f406fe41dc3a3af64ca7ed6083c55f074 +80c3545d3100282e7f5f0f0d8a5116316e59e95ffaed74135d1a1f6d3cd8f90e85e718d7f94ad21e967ef77f5e70f37f504b0708d111d268a1090000fc400000 +504b0304140008080800a26dbe4c000000000000000000000000150000004d4554412d494e462f6d616e69666573742e786d6cad92416ec3201045f73985c5de +d0765521e3ec7a82f600080f0e121e108c23fbf6c5561cbbaa223552778c66f8fffd81e63c0dbeba42ca2ea062affc85558026740e7bc5be3e3fea77766e4fcd +a0d159c824b74355ee61be978a8d0965d0d965897a802cc9c81001bb60c60190e4cf79b93addab03c01bbb49fb00d3a69b7ab909d93062a7a94cdf8c608a90dc +d2d25e066b9d017950589dda53b547b0ce435dc6d3bc03d8d1fb3a6aba28261e72ed4b80cee99ae6088ae918bd332b90b862c7d71df06374de271d2fce64269e +e1c840545e21f312e68137957c62693f256c02d282f5dfba99660f7fc56dc4af2fd57e03504b070800db977cf10000008d020000504b01021400140000080000 +a26dbe4c9f032ec42b0000002b0000000800000000000000000000000000000000006d696d6574797065504b01021400140008080800a26dbe4c9f6ee54e2b03 +0000361200000c000000000000000000000000005100000073657474696e67732e786d6c504b01021400140008080800a26dbe4ca84c77df6004000048110000 +0b00000000000000000000000000b6030000636f6e74656e742e786d6c504b01021400140008080800a26dbe4cd111d268a1090000fc4000000a000000000000 +000000000000004f0800007374796c65732e786d6c504b01021400140008080800a26dbe4c00db977cf10000008d020000150000000000000000000000000028 +1200004d4554412d494e462f6d616e69666573742e786d6c504b05060000000005000500240100005c1300000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000052006f006f007400200045006e007400720079000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000016000500ffffffffffffffff0100000071b78b44e2cfc447bcdf1fbf378e202c0000000000000000 +000000000000000000000000030000000001000000000000010043006f006d0070004f0062006a00000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000120002000200000003000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000530000000000000001004f006c0065000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000a000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000020000001400000000000000700072006f0070006500720074006900650073005f00730074007200650061006d00000000000000 +0000000000000000000000000000000000000000000000002400020004000000ffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000300000010000000000000007000610063006b006100670065005f00730074007200650061006d00000000000000000000000000 +0000000000000000000000000000000000000000000000001e000200ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000004000000961400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000feffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000feffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +000000000000000000000000feffffff0000000000000000}} \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-odg.png b/sw/qa/extras/htmlexport/data/reqif-ole-odg.png new file mode 100644 index 0000000000..66b76c74a1 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-ole-odg.png differ diff --git a/sw/qa/extras/htmlexport/data/reqif-ole-odg.xhtml b/sw/qa/extras/htmlexport/data/reqif-ole-odg.xhtml new file mode 100644 index 0000000000..9e7be3ae88 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-ole-odg.xhtml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/sw/qa/extras/htmlexport/data/reqif-ole2.xhtml b/sw/qa/extras/htmlexport/data/reqif-ole2.xhtml new file mode 100644 index 0000000000..716ecd1bda --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-ole2.xhtml @@ -0,0 +1,5 @@ + + + OLE Object + + diff --git a/sw/qa/extras/htmlexport/data/reqif-p.xhtml b/sw/qa/extras/htmlexport/data/reqif-p.xhtml new file mode 100644 index 0000000000..304857d9a9 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-p.xhtml @@ -0,0 +1,8 @@ +aaabbb +in table +http://libreoffice.org +u +s +s +s + diff --git a/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml b/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml new file mode 100644 index 0000000000..637a7c2ac4 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-png-img.xhtml @@ -0,0 +1,4 @@ + + OLE Object + + diff --git a/sw/qa/extras/htmlexport/data/reqif-table.xhtml b/sw/qa/extras/htmlexport/data/reqif-table.xhtml new file mode 100644 index 0000000000..1bf1f0d937 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/reqif-table.xhtml @@ -0,0 +1,9 @@ + + + + + + + +
A1
A2
+
diff --git a/sw/qa/extras/htmlexport/data/reqif-table2.odt b/sw/qa/extras/htmlexport/data/reqif-table2.odt new file mode 100644 index 0000000000..772dde0dd6 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-table2.odt differ diff --git a/sw/qa/extras/htmlexport/data/reqif-transparent-tif-img.odt b/sw/qa/extras/htmlexport/data/reqif-transparent-tif-img.odt new file mode 100644 index 0000000000..278cf9ebc8 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/reqif-transparent-tif-img.odt differ diff --git a/sw/qa/extras/htmlexport/data/skipimage-embedded-document.docx b/sw/qa/extras/htmlexport/data/skipimage-embedded-document.docx new file mode 100644 index 0000000000..f48935ad44 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/skipimage-embedded-document.docx differ diff --git a/sw/qa/extras/htmlexport/data/skipimage-embedded.doc b/sw/qa/extras/htmlexport/data/skipimage-embedded.doc new file mode 100644 index 0000000000..b4b57ec5f5 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/skipimage-embedded.doc differ diff --git a/sw/qa/extras/htmlexport/data/sub_li_and_ctd.fodt b/sw/qa/extras/htmlexport/data/sub_li_and_ctd.fodt new file mode 100644 index 0000000000..b4a3977926 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/sub_li_and_ctd.fodt @@ -0,0 +1,33 @@ + + + + + + + + l1 + l1_ctd1 + + + l2 + + + l2 + + + l1_ctd2 + + + + + l3 + + + + + l1_ctd3 + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/tableRight.fodt b/sw/qa/extras/htmlexport/data/tableRight.fodt new file mode 100644 index 0000000000..374364750f --- /dev/null +++ b/sw/qa/extras/htmlexport/data/tableRight.fodt @@ -0,0 +1,22 @@ + + + + + + + + + + + This is a right aligned table: + + + + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/table_cell_padding.fodt b/sw/qa/extras/htmlexport/data/table_cell_padding.fodt new file mode 100644 index 0000000000..059a37b9da --- /dev/null +++ b/sw/qa/extras/htmlexport/data/table_cell_padding.fodt @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + A + + + B + + + + + C + + + D + + + + + + + diff --git a/sw/qa/extras/htmlexport/data/table_with_wide_horizontal_border.fodt b/sw/qa/extras/htmlexport/data/table_with_wide_horizontal_border.fodt new file mode 100644 index 0000000000..a3c53a0707 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/table_with_wide_horizontal_border.fodt @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + A1 + + + + + A2 + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/tdf126879.odt b/sw/qa/extras/htmlexport/data/tdf126879.odt new file mode 100644 index 0000000000..8002e93da7 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/tdf126879.odt differ diff --git a/sw/qa/extras/htmlexport/data/tdf132739.odt b/sw/qa/extras/htmlexport/data/tdf132739.odt new file mode 100644 index 0000000000..6156aca93b Binary files /dev/null and b/sw/qa/extras/htmlexport/data/tdf132739.odt differ diff --git a/sw/qa/extras/htmlexport/data/tdf155871.fodt b/sw/qa/extras/htmlexport/data/tdf155871.fodt new file mode 100644 index 0000000000..97e29fbe69 --- /dev/null +++ b/sw/qa/extras/htmlexport/data/tdf155871.fodt @@ -0,0 +1,21 @@ + + + + + + + + foo + + + bar + + + + + baz + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/tdf66822.odt b/sw/qa/extras/htmlexport/data/tdf66822.odt new file mode 100644 index 0000000000..88cc750cba Binary files /dev/null and b/sw/qa/extras/htmlexport/data/tdf66822.odt differ diff --git a/sw/qa/extras/htmlexport/data/tdf76291.odt b/sw/qa/extras/htmlexport/data/tdf76291.odt new file mode 100644 index 0000000000..68588c8763 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/tdf76291.odt differ diff --git a/sw/qa/extras/htmlexport/data/tdf83890.odt b/sw/qa/extras/htmlexport/data/tdf83890.odt new file mode 100644 index 0000000000..fcfab68f93 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/tdf83890.odt differ diff --git a/sw/qa/extras/htmlexport/data/tdf90905.odt b/sw/qa/extras/htmlexport/data/tdf90905.odt new file mode 100644 index 0000000000..19a51bdf8f Binary files /dev/null and b/sw/qa/extras/htmlexport/data/tdf90905.odt differ diff --git a/sw/qa/extras/htmlexport/data/test_no_space_preserve.fodt b/sw/qa/extras/htmlexport/data/test_no_space_preserve.fodt new file mode 100644 index 0000000000..e0d9a3506e --- /dev/null +++ b/sw/qa/extras/htmlexport/data/test_no_space_preserve.fodt @@ -0,0 +1,25 @@ + + + + + + No special spaces + Leading space + Trailing space + Double space + Leading/trailing breaks + Leading break + space + Trailing space + break + Middlebreak + Middle space + break + Middle break + space + Trailing space and SVG + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0 + cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIw + IDIwIiBzdHJva2U9ImJsYWNrIj4KPHBhdGggZD0iTTEsMUwxOSwxOSIvPgo8L3N2Zz4= + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/textAndImage.docx b/sw/qa/extras/htmlexport/data/textAndImage.docx new file mode 100644 index 0000000000..adad462793 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/textAndImage.docx differ diff --git a/sw/qa/extras/htmlexport/data/transparent-image.odt b/sw/qa/extras/htmlexport/data/transparent-image.odt new file mode 100644 index 0000000000..0c5fb8de07 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/transparent-image.odt differ diff --git a/sw/qa/extras/htmlexport/data/transparent.png b/sw/qa/extras/htmlexport/data/transparent.png new file mode 100644 index 0000000000..936980b0a1 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/transparent.png differ diff --git a/sw/qa/extras/htmlexport/data/twoListsWithSameStyle.fodt b/sw/qa/extras/htmlexport/data/twoListsWithSameStyle.fodt new file mode 100644 index 0000000000..a5dc0f014d --- /dev/null +++ b/sw/qa/extras/htmlexport/data/twoListsWithSameStyle.fodt @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlexport/data/xhtml-css.odt b/sw/qa/extras/htmlexport/data/xhtml-css.odt new file mode 100644 index 0000000000..a094202e97 Binary files /dev/null and b/sw/qa/extras/htmlexport/data/xhtml-css.odt differ diff --git a/sw/qa/extras/htmlexport/htmlexport.cxx b/sw/qa/extras/htmlexport/htmlexport.cxx new file mode 100644 index 0000000000..1bd883be11 --- /dev/null +++ b/sw/qa/extras/htmlexport/htmlexport.cxx @@ -0,0 +1,3037 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +/// Test RTF parser that just extracts a single OLE2 object from a file. +class TestReqIfRtfReader : public SvRTFParser +{ +public: + TestReqIfRtfReader(SvStream& rStream); + void NextToken(int nToken) override; + bool WriteObjectData(SvStream& rOLE); + tools::Long GetObjw() const { return m_nObjw; } + tools::Long GetObjh() const { return m_nObjh; } + int getWmetafile() const { return m_nWmetafile; } + +private: + bool m_bInObjData = false; + OStringBuffer m_aHex; + tools::Long m_nObjw = 0; + tools::Long m_nObjh = 0; + int m_nWmetafile = 0; +}; + +TestReqIfRtfReader::TestReqIfRtfReader(SvStream& rStream) + : SvRTFParser(rStream) +{ +} + +void TestReqIfRtfReader::NextToken(int nToken) +{ + switch (nToken) + { + case '}': + m_bInObjData = false; + break; + case RTF_TEXTTOKEN: + if (m_bInObjData) + m_aHex.append(OUStringToOString(aToken, RTL_TEXTENCODING_ASCII_US)); + break; + case RTF_OBJDATA: + m_bInObjData = true; + break; + case RTF_OBJW: + m_nObjw = nTokenValue; + break; + case RTF_OBJH: + m_nObjh = nTokenValue; + break; + case RTF_WMETAFILE: + m_nWmetafile = nTokenValue; + break; + } +} + +bool TestReqIfRtfReader::WriteObjectData(SvStream& rOLE) +{ + OString aObjdata = m_aHex.makeStringAndClear(); + + SvMemoryStream aStream; + int b = 0; + int count = 2; + + // Feed the destination text to a stream. + for (int i = 0; i < aObjdata.getLength(); ++i) + { + char ch = aObjdata[i]; + if (ch != 0x0d && ch != 0x0a) + { + b = b << 4; + sal_Int8 parsed = msfilter::rtfutil::AsHex(ch); + if (parsed == -1) + return false; + b += parsed; + count--; + if (!count) + { + aStream.WriteChar(b); + count = 2; + b = 0; + } + } + } + + aStream.Seek(0); + rOLE.WriteStream(aStream); + return true; +} + +/// Parser for [MS-OLEDS] 2.2.5 EmbeddedObject, aka OLE1. +struct OLE1Reader +{ + sal_uInt32 m_nNativeDataSize; + std::vector m_aNativeData; + sal_uInt32 m_nPresentationDataSize; + + OLE1Reader(SvStream& rStream); +}; + +OLE1Reader::OLE1Reader(SvStream& rStream) +{ + // Skip ObjectHeader, see [MS-OLEDS] 2.2.4. + rStream.Seek(0); + CPPUNIT_ASSERT(rStream.remainingSize()); + sal_uInt32 nData; + rStream.ReadUInt32(nData); // OLEVersion + rStream.ReadUInt32(nData); // FormatID + rStream.ReadUInt32(nData); // ClassName + rStream.SeekRel(nData); + rStream.ReadUInt32(nData); // TopicName + rStream.SeekRel(nData); + rStream.ReadUInt32(nData); // ItemName + rStream.SeekRel(nData); + + rStream.ReadUInt32(m_nNativeDataSize); + m_aNativeData.resize(m_nNativeDataSize); + rStream.ReadBytes(m_aNativeData.data(), m_aNativeData.size()); + + rStream.ReadUInt32(nData); // OLEVersion for presentation data + CPPUNIT_ASSERT(rStream.good()); + rStream.ReadUInt32(nData); // FormatID + rStream.ReadUInt32(nData); // ClassName + rStream.SeekRel(nData); + rStream.ReadUInt32(nData); // Width + rStream.ReadUInt32(nData); // Height + rStream.ReadUInt32(nData); // PresentationDataSize + m_nPresentationDataSize = nData; +} +} + +/// Covers sw/source/filter/html/wrthtml.cxx and related fixes. +class HtmlExportTest : public SwModelTestBase, public HtmlTestTools +{ +public: + HtmlExportTest() + : SwModelTestBase("/sw/qa/extras/htmlexport/data/", "HTML (StarWriter)") + { + } + + /// Wraps an RTF fragment into a complete RTF file, so an RTF parser can handle it. + static void wrapRtfFragment(const OUString& rURL, SvMemoryStream& rStream) + { + SvFileStream aRtfStream(rURL, StreamMode::READ); + rStream.WriteOString("{\\rtf1"); + rStream.WriteStream(aRtfStream); + rStream.WriteOString("}"); + rStream.Seek(0); + } +}; + +/// HTML export of the sw doc model tests. +class SwHtmlDomExportTest : public SwModelTestBase, public HtmlTestTools +{ +public: + SwHtmlDomExportTest() + : SwModelTestBase("/sw/qa/extras/htmlexport/data/") + { + } + + OUString GetObjectPath(const OUString& ext); + /// Get the .ole path, assuming maTempFile is an XHTML export result. + OUString GetOlePath() { return GetObjectPath(u".ole"_ustr); } + OUString GetPngPath() { return GetObjectPath(u".png"_ustr); } + /// Parse the ole1 data out of an RTF fragment URL. + void ParseOle1FromRtfUrl(const OUString& rRtfUrl, SvMemoryStream& rOle1); + /// Export using the C++ HTML export filter, with xhtmlns=reqif-xhtml. + void ExportToReqif(); + /// Import using the C++ HTML import filter, with xhtmlns=reqif-xhtml. + void ImportFromReqif(const OUString& rUrl); + /// Export using the C++ HTML export filter + void ExportToHTML(); +}; + +OUString SwHtmlDomExportTest::GetObjectPath(const OUString& ext) +{ + assert(ext.startsWith(".")); + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + OUString aOlePath + = getXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p/reqif-xhtml:object"_ostr, + "data"_ostr); + CPPUNIT_ASSERT(aOlePath.endsWith(ext)); + INetURLObject aUrl(maTempFile.GetURL()); + aUrl.setBase(aOlePath.subView(0, aOlePath.getLength() - ext.getLength())); + aUrl.setExtension(ext.subView(1)); + return aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE); +} + +void SwHtmlDomExportTest::ParseOle1FromRtfUrl(const OUString& rRtfUrl, SvMemoryStream& rOle1) +{ + SvMemoryStream aRtf; + HtmlExportTest::wrapRtfFragment(rRtfUrl, aRtf); + tools::SvRef xReader(new TestReqIfRtfReader(aRtf)); + CPPUNIT_ASSERT(xReader->CallParser() != SvParserState::Error); + CPPUNIT_ASSERT(xReader->WriteObjectData(rOle1)); + CPPUNIT_ASSERT(rOle1.Tell()); +} + +void SwHtmlDomExportTest::ExportToReqif() +{ + setFilterOptions("xhtmlns=reqif-xhtml"); + save("HTML (StarWriter)"); +} + +void SwHtmlDomExportTest::ExportToHTML() +{ + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); +} + +void SwHtmlDomExportTest::ImportFromReqif(const OUString& rUrl) +{ + uno::Sequence aLoadProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + }; + mxComponent = loadFromDesktop(rUrl, "com.sun.star.text.TextDocument", aLoadProperties); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testFdo81276) +{ + auto verify = [this]() { + uno::Reference xPageStyles(getStyles("PageStyles")); + uno::Reference xStyle(xPageStyles->getByName("HTML"), uno::UNO_QUERY); + // some rounding going on here? + CPPUNIT_ASSERT(abs(sal_Int32(29700) - getProperty(xStyle, "Width")) < 10); + CPPUNIT_ASSERT(abs(sal_Int32(21006) - getProperty(xStyle, "Height")) < 10); + CPPUNIT_ASSERT(abs(sal_Int32(500) - getProperty(xStyle, "LeftMargin")) < 10); + CPPUNIT_ASSERT(abs(sal_Int32(500) - getProperty(xStyle, "RightMargin")) < 10); + CPPUNIT_ASSERT(abs(sal_Int32(2000) - getProperty(xStyle, "TopMargin")) < 10); + CPPUNIT_ASSERT(abs(sal_Int32(500) - getProperty(xStyle, "BottomMargin")) < 10); + }; + setImportFilterName(mpFilter); + createSwDoc("fdo81276.html"); + verify(); + saveAndReload(mpFilter); + verify(); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testFdo62336) +{ + // The problem was essentially a crash during table export as docx/rtf/html + // If calc-layout is enabled, the crash does not occur, that's why loadFromFile/save is used + loadFromFile(u"fdo62336.docx"); + save("HTML (StarWriter)"); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testFdo86857) +{ + auto verify = [this]() { + // problem was that background color on page style was not exported + uno::Reference xPageStyles(getStyles("PageStyles")); + uno::Reference xStyle(xPageStyles->getByName("HTML"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTRED, getProperty(xStyle, "BackColor")); + // check that table background color works, which still uses RES_BACKGROUND + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x66ffff), getProperty(xCell, "BackColor")); + }; + + setImportFilterName(mpFilter); + createSwDoc("fdo86857.html"); + verify(); + saveAndReload(mpFilter); + verify(); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testCharacterBorder) +{ + // FIXME if padding-top gets exported as inches, not cms, we get rounding errors. + SwGlobals::ensure(); // make sure that SW_MOD() is not 0 + SwMasterUsrPref* pPref = const_cast(SW_MOD()->GetUsrPref(false)); + FieldUnit eUnit = pPref->GetMetric(); + pPref->SetMetric(FieldUnit::CM); + comphelper::ScopeGuard g([pPref, eUnit]() { pPref->SetMetric(eUnit); }); + + auto verify = [this]() { + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + uno::Reference xRun(getRun(getParagraph(1), 1), uno::UNO_QUERY); + // Different Border + { + CPPUNIT_ASSERT_BORDER_EQUAL(table::BorderLine2(0x6666FF, 12, 12, 12, 3, 37), + getProperty(xRun, "CharTopBorder")); + CPPUNIT_ASSERT_BORDER_EQUAL(table::BorderLine2(0xFF9900, 0, 99, 0, 2, 99), + getProperty(xRun, "CharLeftBorder")); + CPPUNIT_ASSERT_BORDER_EQUAL(table::BorderLine2(0xFF0000, 0, 169, 0, 1, 169), + getProperty(xRun, "CharBottomBorder")); + CPPUNIT_ASSERT_BORDER_EQUAL(table::BorderLine2(0x0000FF, 0, 169, 0, 0, 169), + getProperty(xRun, "CharRightBorder")); + } + + // Different Padding + { + CPPUNIT_ASSERT_EQUAL(sal_Int32(450), + getProperty(xRun, "CharTopBorderDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(550), + getProperty(xRun, "CharLeftBorderDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(150), + getProperty(xRun, "CharBottomBorderDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(250), + getProperty(xRun, "CharRightBorderDistance")); + } + + // No shadow + }; + createSwDoc("charborder.odt"); + verify(); + saveAndReload(mpFilter); + verify(); +} + +#define DECLARE_HTMLEXPORT_TEST(TestName, filename) \ + DECLARE_SW_EXPORT_TEST(TestName, filename, nullptr, HtmlExportTest) + +DECLARE_HTMLEXPORT_TEST(testExportOfImages, "textAndImage.docx") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body"_ostr, 1); + assertXPath(pDoc, "/html/body/p/img"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testExportOfImagesWithSkipImagesEnabled) +{ + createSwDoc("textAndImage.docx"); + setFilterOptions("SkipImages"); + save(mpFilter); + + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body"_ostr, 1); + assertXPath(pDoc, "/html/body/p/img"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testSkipImagesEmbedded) +{ + createSwDoc("skipimage-embedded.doc"); + setFilterOptions("SkipImages"); + save(mpFilter); + + // Embedded spreadsheet was exported as image, so content was lost. Make + // sure it's exported as HTML instead. + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // This was 0. + assertXPath(pDoc, "//table"_ostr, 1); + // This was 2, the HTML header was in the document two times. + assertXPath(pDoc, "//meta[@name='generator']"_ostr, 1); + // This was 0, was directly under

, which caused errors in the parser. + assertXPath(pDoc, "//span/table"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testSkipImagesEmbeddedDocument) +{ + createSwDoc("skipimage-embedded-document.docx"); + setFilterOptions("SkipImages"); + save(mpFilter); + + // Similar to testSkipImagesEmbedded, but with an embedded Writer object, + // not a Calc one, and this time OOXML, not WW8. + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // This was 2, the HTML header was in the document two times. + assertXPath(pDoc, "//meta[@name='generator']"_ostr, 1); + // Text of embedded document was missing. + assertXPathContent(pDoc, "/html/body/p/span/p/span"_ostr, "Inner."); +} + +DECLARE_HTMLEXPORT_TEST(testExportImageProperties, "HTMLImage.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body"_ostr, 1); + + assertXPath(pDoc, "/html/body/p/map/area"_ostr, "shape"_ostr, "poly"); + assertXPath(pDoc, "/html/body/p/map/area"_ostr, "href"_ostr, "http://www.microsoft.com/"); + assertXPath(pDoc, "/html/body/p/map/area"_ostr, "target"_ostr, "_self"); + assertXPath(pDoc, "/html/body/p/map/area"_ostr, "alt"_ostr, "microsoft"); + + assertXPath(pDoc, "/html/body/p/a"_ostr, 1); + assertXPath(pDoc, "/html/body/p/a"_ostr, "href"_ostr, "http://www.google.com/"); + + assertXPath(pDoc, "/html/body/p/a/font"_ostr, 1); + assertXPath(pDoc, "/html/body/p/a/font"_ostr, "color"_ostr, "#ff0000"); + + assertXPath(pDoc, "/html/body/p/a/font/img"_ostr, 1); + assertXPath(pDoc, "/html/body/p/a/font/img"_ostr, "name"_ostr, "Text"); + assertXPath(pDoc, "/html/body/p/a/font/img"_ostr, "alt"_ostr, "Four colors"); + assertXPath(pDoc, "/html/body/p/a/font/img"_ostr, "align"_ostr, "middle"); + + // Probably the DPI in OSX is different and Twip -> Pixel conversion produces + // different results - so disable OSX for now. + // + // It would make sense to switch to use CSS and use "real world" units instead + // i.e. (style="margin: 0cm 1.5cm; width: 1cm; height: 1cm") + +#if 0 // disabled as it depends that the system DPI is set to 96 + assertXPath(pDoc, "/html/body/p/a/font/img", "hspace", "38"); + assertXPath(pDoc, "/html/body/p/a/font/img", "vspace", "19"); + assertXPath(pDoc, "/html/body/p/a/font/img", "width", "222"); + assertXPath(pDoc, "/html/body/p/a/font/img", "height", "222"); + assertXPath(pDoc, "/html/body/p/a/font/img", "border", "3"); +#endif + + assertXPath(pDoc, "/html/body/p/a/font/img"_ostr, "usemap"_ostr, "#map1"); +} + +DECLARE_HTMLEXPORT_TEST(testExportCheckboxRadioButtonState, "checkbox-radiobutton.doc") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body"_ostr, 1); + assertXPath(pDoc, "/html/body/p[1]/input"_ostr, "type"_ostr, "checkbox"); + assertXPath(pDoc, "/html/body/p[1]/input"_ostr, "checked"_ostr, "checked"); + assertXPath(pDoc, "/html/body/p[2]/input"_ostr, "type"_ostr, "checkbox"); + assertXPathNoAttribute(pDoc, "/html/body/p[2]/input"_ostr, "checked"_ostr); + assertXPath(pDoc, "/html/body/form/p[1]/input"_ostr, "type"_ostr, "checkbox"); + assertXPath(pDoc, "/html/body/form/p[1]/input"_ostr, "checked"_ostr, "checked"); + assertXPath(pDoc, "/html/body/form/p[2]/input"_ostr, "type"_ostr, "checkbox"); + assertXPathNoAttribute(pDoc, "/html/body/form/p[2]/input"_ostr, "checked"_ostr); + assertXPath(pDoc, "/html/body/form/p[3]/input"_ostr, "type"_ostr, "radio"); + assertXPath(pDoc, "/html/body/form/p[3]/input"_ostr, "checked"_ostr, "checked"); + assertXPath(pDoc, "/html/body/form/p[4]/input"_ostr, "type"_ostr, "radio"); + assertXPathNoAttribute(pDoc, "/html/body/form/p[4]/input"_ostr, "checked"_ostr); +} + +DECLARE_HTMLEXPORT_TEST(testExportUrlEncoding, "tdf76291.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // Test URI encoded hyperlink with Chinese characters + assertXPath(pDoc, "/html/body/p/a"_ostr, "href"_ostr, + "http://www.youtube.com/results?search_query=%E7%B2%B5%E8%AA%9Emv&sm=12"); +} + +DECLARE_HTMLEXPORT_TEST(testExportInternalUrl, "tdf90905.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // Internal url should be valid + assertXPath(pDoc, "/html/body/p[1]/a"_ostr, "href"_ostr, "#0.0.1.Text|outline"); + assertXPath(pDoc, "/html/body/p[2]/a"_ostr, "href"_ostr, "#bookmark"); +} + +DECLARE_HTMLEXPORT_TEST(testExportImageBulletList, "tdf66822.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // Encoded base64 SVG bullet should match and render on browser + assertXPath(pDoc, "/html/body/ul"_ostr, 1); + assertXPath( + pDoc, "/html/body/ul"_ostr, "style"_ostr, + "list-style-image: url(data:image/svg+xml;base64," + "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3" + "RyYXRvciAxMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDUxNDQ4KSAg" + "LS0+DQo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm" + "9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiIFsNCgk8IUVOVElUWSBuc19zdmcgImh0dHA6Ly93d3cu" + "dzMub3JnLzIwMDAvc3ZnIj4NCgk8IUVOVElUWSBuc194bGluayAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay" + "I+DQpdPg0KPHN2ZyAgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9IiZuc19zdmc7IiB4bWxuczp4bGlu" + "az0iJm5zX3hsaW5rOyIgd2lkdGg9IjE0LjAwOCIgaGVpZ2h0PSIxNC4wMSINCgkgdmlld0JveD0iMCAwIDE0LjAwOC" + "AxNC4wMSIgb3ZlcmZsb3c9InZpc2libGUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDE0LjAwOCAxNC4wMSIg" + "eG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8cmFkaWFsR3JhZGllbnQgaWQ9IlhNTElEXzRfIiBjeD0iNy4wMD" + "Q0IiBjeT0iNy4wMDQ5IiByPSI3LjAwNDQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4NCgkJPHN0b3Ag" + "IG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzM1REIzNSIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT" + "0ic3RvcC1jb2xvcjojMDBBMDAwIi8+DQoJPC9yYWRpYWxHcmFkaWVudD4NCgk8Y2lyY2xlIGZpbGw9InVybCgjWE1M" + "SURfNF8pIiBjeD0iNy4wMDQiIGN5PSI3LjAwNSIgcj0iNy4wMDQiLz4NCgk8ZGVmcz4NCgkJPGZpbHRlciBpZD0iQW" + "RvYmVfT3BhY2l0eU1hc2tGaWx0ZXIiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMy40ODEiIHk9IjAu" + "NjkzIiB3aWR0aD0iNi45ODgiIGhlaWdodD0iMy44OTMiPg0KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeC" + "IgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4NCgkJPC9maWx0ZXI+" + "DQoJPC9kZWZzPg0KCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjMuNDgxIiB5PSIwLjY5MyIgd2" + "lkdGg9IjYuOTg4IiBoZWlnaHQ9IjMuODkzIiBpZD0iWE1MSURfNV8iPg0KCQk8ZyBmaWx0ZXI9InVybCgjQWRvYmVf" + "T3BhY2l0eU1hc2tGaWx0ZXIpIj4NCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iWE1MSURfNl8iIGdyYWRpZW50VW5pdH" + "M9InVzZXJTcGFjZU9uVXNlIiB4MT0iNy4xMjIxIiB5MT0iMC4xMDMiIHgyPSI3LjEyMjEiIHkyPSI1LjIzNDQiPg0K" + "CQkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRkZGRkYiLz4NCgkJCQk8c3RvcCAgb2Zmc2" + "V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwIi8+DQoJCQk8L2xpbmVhckdyYWRpZW50Pg0KCQkJPHJlY3Qg" + "eD0iMy4xOTkiIHk9IjAuMzM5IiBvcGFjaXR5PSIwLjciIGZpbGw9InVybCgjWE1MSURfNl8pIiB3aWR0aD0iNy44ND" + "YiIGhlaWdodD0iNC42MDEiLz4NCgkJPC9nPg0KCTwvbWFzaz4NCgk8ZWxsaXBzZSBtYXNrPSJ1cmwoI1hNTElEXzVf" + "KSIgZmlsbD0iI0ZGRkZGRiIgY3g9IjYuOTc1IiBjeT0iMi42NCIgcng9IjMuNDk0IiByeT0iMS45NDYiLz4NCjwvZz" + "4NCjwvc3ZnPg0K);"); +} + +DECLARE_HTMLEXPORT_TEST(testTdf83890, "tdf83890.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body/ol[2]/ol"_ostr, "start"_ostr, "2"); +} + +DECLARE_HTMLEXPORT_TEST(testExtbChars, "extb.html") +{ + OUString aExpected(u"\U00024b62"_ustr); + // Assert that UTF8 encoded non-BMP Unicode character is correct + uno::Reference xTextRange1 = getRun(getParagraph(1), 1); + CPPUNIT_ASSERT_EQUAL(aExpected, xTextRange1->getString()); + + // Assert that non-BMP Unicode in character entity format is correct + uno::Reference xTextRange2 = getRun(getParagraph(2), 1); + CPPUNIT_ASSERT_EQUAL(aExpected, xTextRange2->getString()); +} + +DECLARE_HTMLEXPORT_TEST(testNormalImageExport, "textAndImage.docx") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body"_ostr, 1); + + // the HTML export normally does not embed the images + OUString imgSrc = getXPath(pDoc, "/html/body/p/img"_ostr, "src"_ostr); + CPPUNIT_ASSERT(imgSrc.endsWith(".png")); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testEmbedImagesEnabled) +{ + createSwDoc("textAndImage.docx"); + setFilterOptions("EmbedImages"); + save(mpFilter); + + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body"_ostr, 1); + + // the HTML export normally does not embed the images, but here the test + // name triggers setting of the "EmbedImages" filter option, meaning the + // image will not be a separate PNG, but an embedded base64 encoded + // version of that + OUString imgSrc = getXPath(pDoc, "/html/body/p/img"_ostr, "src"_ostr); + CPPUNIT_ASSERT(imgSrc.startsWith("data:image/png;base64,")); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testXHTML) +{ + createSwWebDoc("hello.html"); + setFilterOptions("XHTML"); + save(mpFilter); + + OString aExpected("TellEnd(); + + OString aExpected = "aaa\nbbb" + "" SAL_NEWLINE_STRING + // This was 'Seek(0); + OString aActual(read_uInt8s_ToOString(*pStream, aExpected.getLength())); + // This was a HTML header, like '" instead of CSS. + CPPUNIT_ASSERT(aStream.indexOf(", namespace prefix was missing. + CPPUNIT_ASSERT(aStream.indexOf("") != -1); + + // This was "" instead of CSS. + CPPUNIT_ASSERT(aStream.indexOf("" instead of CSS + namespace prefix was missing. + CPPUNIT_ASSERT(aStream.indexOf("': non-unique bookmark name in reqif fragment. + CPPUNIT_ASSERT_EQUAL(static_cast(-1), aStream.indexOf(" xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getEmbeddedObjects(), + uno::UNO_QUERY); + uno::Reference xObject(xObjects->getByIndex(0), + uno::UNO_QUERY); + // This failed, OLE object had no replacement image. + // And then it also failed when the export lost the replacement image. + uno::Reference xGraphic = xObject->getReplacementGraphic(); + // This failed when query and fragment of file:// URLs were not ignored. + CPPUNIT_ASSERT(xGraphic.is()); + + uno::Reference xShape(xObject, uno::UNO_QUERY); + OutputDevice* pDevice = Application::GetDefaultDevice(); + Size aPixel(64, 64); + // Expected to be 1693. + Size aLogic(pDevice->PixelToLogic(aPixel, MapMode(MapUnit::Map100thMM))); + awt::Size aSize = xShape->getSize(); + // This was only 1247, size was not set explicitly. + CPPUNIT_ASSERT_EQUAL(static_cast(aLogic.getWidth()), aSize.Width); + + // Check mime/media types. + CPPUNIT_ASSERT_EQUAL(OUString("image/png"), getProperty(xGraphic, "MimeType")); + + uno::Reference xObjectProps(xObject, uno::UNO_QUERY); + uno::Reference xStreamProvider( + xObjectProps->getPropertyValue("EmbeddedObject"), uno::UNO_QUERY); + uno::Reference xStream(xStreamProvider->getStream(), uno::UNO_QUERY); + // This was empty when either import or export handling was missing. + CPPUNIT_ASSERT_EQUAL(static_cast(37888), xStream->getLength()); + + // Check alternate text (it was empty, for export the 'alt' attribute was used). + CPPUNIT_ASSERT_EQUAL(OUString("OLE Object"), + getProperty(xObject, "Title").trim()); + + if (!isExported()) + return; + + // "type" attribute was missing for the inner element. + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + CPPUNIT_ASSERT(aStream.indexOf("type=\"image/png\"") != -1); + }; + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-ole-img.xhtml"); + verify(); + setFilterOptions("xhtmlns=reqif-xhtml"); + saveAndReload("HTML (StarWriter)"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIfPngImg) +{ + auto verify = [this](bool bExported) { + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShape.is()); + + if (!bExported) + { + // Imported PNG image is not an object. + CPPUNIT_ASSERT_EQUAL(OUString("Image1"), xShape->getName()); + return; + } + + // All images are exported as objects in ReqIF mode. + CPPUNIT_ASSERT_EQUAL(OUString("Object1"), xShape->getName()); + + // This was , not , which is not valid in the reqif-xhtml + // subset. + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + CPPUNIT_ASSERT(aStream.indexOf(" xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("ExportImagesAsOLE", true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + mxComponent->dispose(); + ImportFromReqif(maTempFile.GetURL()); + verify(/*bExported=*/true); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testReqIfJpgImg) +{ + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-jpg-img.xhtml"); + setFilterOptions("xhtmlns=reqif-xhtml"); + save(mpFilter); + + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + // This was image/jpeg, JPG was not converted to PNG in ReqIF mode. + CPPUNIT_ASSERT(aStream.indexOf("type=\"image/png\"") != -1); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testReqIfTable) +{ + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-table.xhtml"); + setFilterOptions("xhtmlns=reqif-xhtml"); + save(mpFilter); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + //
was missing, so the XHTML fragment wasn't a valid + // xhtml.BlkStruct.class type anymore. + assertXPath( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr/reqif-xhtml:th"_ostr, + 1); + // Make sure that the cell background is not written using CSS. + assertXPathNoAttribute( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr/reqif-xhtml:th"_ostr, + "style"_ostr); + // The attribute was present, which is not valid in reqif-xhtml. + assertXPathNoAttribute( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr/reqif-xhtml:th"_ostr, + "bgcolor"_ostr); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testReqIfTable2) +{ + createSwDoc("reqif-table2.odt"); + setFilterOptions("xhtmlns=reqif-xhtml"); + save(mpFilter); + + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + // This failed, was written. + CPPUNIT_ASSERT(aStream.indexOf("") != -1); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIfTableHeight) +{ + // Given a document with a table in it, with an explicit row height: + createSwDoc(); + uno::Sequence aTableProperties = { + comphelper::makePropertyValue("Rows", static_cast(1)), + comphelper::makePropertyValue("Columns", static_cast(1)), + }; + dispatchCommand(mxComponent, ".uno:InsertTable", aTableProperties); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xRow(xTable->getRows()->getByIndex(0), uno::UNO_QUERY); + xRow->setPropertyValue("Height", uno::Any(static_cast(1000))); + + // When exporting to reqif-xhtml: + ExportToReqif(); + + // Then make sure that the explicit cell height is omitted from the output: + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed, explicit height was + // written, which is not valid reqif-xhtml. + assertXPathNoAttribute(pDoc, "//reqif-xhtml:td"_ostr, "height"_ostr); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testXHTMLUseCSS) +{ + createSwDoc("xhtml-css.odt"); + setFilterOptions("XHTML"); + save(mpFilter); + + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + // This failed, was written. + CPPUNIT_ASSERT(aStream.indexOf(" was written. + CPPUNIT_ASSERT(aStream.indexOf("TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + // This failed,
    was written. + CPPUNIT_ASSERT(aStream.indexOf("") != -1); + + // This failed, the 'style' attribute was written, even if the input did + // not had one. + CPPUNIT_ASSERT_EQUAL(static_cast(-1), aStream.indexOf(" style=\"")); + + // This failed
  • was only opened, not closed. + CPPUNIT_ASSERT(aStream.indexOf("") != -1); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testReqIfOle2) +{ + auto verify = [this]() { + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getEmbeddedObjects(), + uno::UNO_QUERY); + uno::Reference xObject(xObjects->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xEmbeddedObject( + xObject->getExtendedControlOverEmbeddedObject(), uno::UNO_QUERY); + // This failed, the "RTF fragment" native data was loaded as-is, we had no + // filter to handle it, so nothing happened on double-click. + CPPUNIT_ASSERT(xEmbeddedObject.is()); + uno::Reference xStream(xEmbeddedObject->getStream(), uno::UNO_QUERY); + // This was 38375, msfilter::rtfutil::ExtractOLE2FromObjdata() wrote + // everything after the OLE1 header into the OLE2 stream, while the + // Presentation field after the OLE2 data doesn't belong there. + CPPUNIT_ASSERT_EQUAL(static_cast(37888), xStream->getLength()); + // Finally the export also failed as it tried to open the stream from the + // document storage, but the embedded object already opened it, so an + // exception of type com.sun.star.io.IOException was thrown. + + if (isExported()) + { + // Check that the replacement graphic is exported at RTF level. + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + // Get the path of the RTF data. + OUString aOlePath = getXPath( + pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p/reqif-xhtml:object"_ostr, + "data"_ostr); + OUString aOleSuffix(".ole"); + CPPUNIT_ASSERT(aOlePath.endsWith(aOleSuffix)); + INetURLObject aUrl(maTempFile.GetURL()); + aUrl.setBase(aOlePath.subView(0, aOlePath.getLength() - aOleSuffix.getLength())); + aUrl.setExtension(u"ole"); + OUString aOleUrl = aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE); + + // Search for \result in the RTF data. + SvFileStream aOleStream(aOleUrl, StreamMode::READ); + CPPUNIT_ASSERT(aOleStream.IsOpen()); + OString aOleString(read_uInt8s_ToOString(aOleStream, aOleStream.TellEnd())); + // Without the accompanying fix in place, this test would have failed, + // replacement graphic was missing at RTF level. + CPPUNIT_ASSERT(aOleString.indexOf(OOO_STRING_SVTOOLS_RTF_RESULT) != -1); + } + }; + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-ole2.xhtml"); + verify(); + setFilterOptions("xhtmlns=reqif-xhtml"); + saveAndReload(mpFilter); + verify(); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testReqIfOle2Odg) +{ + auto verify = [this]() { + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getEmbeddedObjects(), + uno::UNO_QUERY); + uno::Reference xTextEmbeddedObject( + xObjects->getByIndex(0), uno::UNO_QUERY); + uno::Reference xObject(xTextEmbeddedObject->getEmbeddedObject(), + uno::UNO_QUERY); + // This failed, both import and export failed to handle OLE2 that contains + // just ODF. + CPPUNIT_ASSERT(xObject.is()); + CPPUNIT_ASSERT(xObject->supportsService("com.sun.star.drawing.DrawingDocument")); + }; + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-ole-odg.xhtml"); + verify(); + setFilterOptions("xhtmlns=reqif-xhtml"); + saveAndReload(mpFilter); + verify(); +} + +DECLARE_HTMLEXPORT_TEST(testList, "list.html") +{ + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + // This failed, it was
  • , i.e. list item was closed before content + // started. + CPPUNIT_ASSERT(aStream.indexOf("
  • ") != -1); +} + +DECLARE_HTMLEXPORT_TEST(testTransparentImage, "transparent-image.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + OUString aSource = getXPath(pDoc, "/html/body/p/img"_ostr, "src"_ostr); + OUString aMessage = "src attribute is: " + aSource; + // This was a jpeg, transparency was lost. + CPPUNIT_ASSERT_MESSAGE(aMessage.toUtf8().getStr(), aSource.endsWith(".gif")); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTransparentImageReqIf) +{ + createSwDoc("transparent-image.odt"); + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("ExportImagesAsOLE", true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + OUString aSource = getXPath( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p/reqif-xhtml:object/reqif-xhtml:object"_ostr, + "data"_ostr); + OUString aMessage = "src attribute is: " + aSource; + // This was GIF, when the intention was to force PNG. + CPPUNIT_ASSERT_MESSAGE(aMessage.toUtf8().getStr(), aSource.endsWith(".png")); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testOleNodataReqIf) +{ + createSwDoc("reqif-ole-nodata.odt"); + setFilterOptions("xhtmlns=reqif-xhtml"); + save(mpFilter); + + // This failed, io::IOException was thrown during the filter() call. + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Make sure the native element has the required data attribute. + OUString aSource = getXPath( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p/reqif-xhtml:object/reqif-xhtml:object"_ostr, + "data"_ostr); + CPPUNIT_ASSERT(!aSource.isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testNoLangReqIf) +{ + createSwDoc("reqif-no-lang.odt"); + setFilterOptions("xhtmlns=reqif-xhtml"); + save(mpFilter); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Make sure that xml:lang is not written in ReqIF mode. + assertXPathNoAttribute(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:h1"_ostr, + "lang"_ostr); +} + +DECLARE_HTMLEXPORT_TEST(testFieldShade, "field-shade.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // Without the accompanying fix in place, this test would have failed with 'Expected: 1; Actual: + // 0', i.e. shading for the field was lost. + assertXPath(pDoc, "/html/body/p[1]/span"_ostr, "style"_ostr, "background: #c0c0c0"); + + // Check that field shading is written only in case there is no user-defined span background. + assertXPath(pDoc, "/html/body/p[2]/span"_ostr, "style"_ostr, "background: #ff0000"); + // Without the accompanying fix in place, this test would have failed with 'Expected: 0; Actual: + // 1', i.e there was an inner span hiding the wanted background color. + assertXPath(pDoc, "/html/body/p[2]/span/span"_ostr, 0); +} + +DECLARE_HTMLEXPORT_TEST(testTdf132739, "tdf132739.odt") +{ + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // Without the fix in place, this test would have failed with + // - Expected: background: #5983b0; border: 1px solid #333333; padding: 0.04in + // - Actual : background: #5983b0 + assertXPath(pDoc, "/html/body/table/tr[1]/td"_ostr, "style"_ostr, + "background: #5983b0; border: 1px solid #333333; padding: 0.04in"); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testFieldShadeReqIf) +{ + createSwDoc("field-shade-reqif.odt"); + setFilterOptions("xhtmlns=reqif-xhtml"); + save(mpFilter); + + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 2 + // i.e. the ReqIF subset of xhtml had a background color and a page number field, resulting in + // an invalid ReqIF-XHTML. + assertXPath(pDoc, "/html/body/div/p[1]/span"_ostr, 0); + assertXPath(pDoc, "/html/body/div/p[1]/sdfield"_ostr, 0); +} + +DECLARE_HTMLEXPORT_TEST(testTdf126879, "tdf126879.odt") +{ + constexpr OString aExpected(""_ostr); + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + const OString aActual(read_uInt8s_ToOString(*pStream, aExpected.getLength())); + // Without the fix in place, this test would have failed with + // - Expected: + // - Actual : + CPPUNIT_ASSERT_EQUAL(aExpected, aActual); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testBlockQuoteReqIf) +{ + // Build a document model that uses the Quotations paragraph style. + createSwDoc(); + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + xParagraph->setPropertyValue("ParaStyleName", uno::Any(OUString("Quotations"))); + + // Export it. + setFilterOptions("xhtmlns=reqif-xhtml"); + save("HTML (StarWriter)"); + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. had character (direct) children, which is invalid xhtml. + assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:blockquote/reqif-xhtml:p"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testRTFOLEMimeType) +{ + // Import a document with an embedded object. + OUString aType("test/rtf"); + ImportFromReqif(createFileURL(u"reqif-ole-data.xhtml")); + + // Export it. + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("RTFOLEMimeType", aType), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: test/rtf + // - Actual : text/rtf + // i.e. the MIME type was always text/rtf, not taking the store parameter into account. + assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p/reqif-xhtml:object"_ostr, + "type"_ostr, aType); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testChinese) +{ + // Load a document with Chinese text in it. + createSwDoc("reqif-chinese.odt"); + + // Export it. + ExportToReqif(); + // Without the accompanying fix in place, this would have failed as the output was not + // well-formed. + WrapReqifFromTempFile(); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifComment) +{ + // Create a document with a comment in it. + createSwDoc(); + uno::Sequence aPropertyValues = comphelper::InitPropertySequence({ + { "Text", uno::Any(OUString("some text")) }, + { "Author", uno::Any(OUString("me")) }, + }); + dispatchCommand(mxComponent, ".uno:InsertAnnotation", aPropertyValues); + + // Export it. + ExportToReqif(); + // Without the accompanying fix in place, this would have failed as the output was not + // well-formed. + WrapReqifFromTempFile(); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifFontNameSize) +{ + // Create a document with a custom font name and size in it. + createSwDoc(); + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + xParagraph->setPropertyValue("CharFontName", uno::Any(OUString("Liberation Serif"))); + float fCharHeight = 14.0; + xParagraph->setPropertyValue("CharHeight", uno::Any(fCharHeight)); + sal_Int32 nCharColor = 0xff0000; + xParagraph->setPropertyValue("CharColor", uno::Any(nCharColor)); + uno::Reference xTextRange(xParagraph, uno::UNO_QUERY); + xTextRange->setString("x"); + + // Export it. + ExportToReqif(); + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 3 + // i.e. font name and size was written, even if that's not relevant for ReqIF. + assertXPath(pDoc, "//reqif-xhtml:span"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifParagraphAlignment) +{ + // Create a document with an explicitly aligned paragraph. + createSwDoc(); + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + xParagraph->setPropertyValue("ParaAdjust", + uno::Any(static_cast(style::ParagraphAdjust_RIGHT))); + + // Export it. + ExportToReqif(); + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: + // - Actual : right + // i.e. the markup was used, which is invalid. + assertXPathNoAttribute(pDoc, "//reqif-xhtml:p"_ostr, "align"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifOle1PDF) +{ + // Save to reqif-xhtml. + createSwDoc("pdf-ole.odt"); + + ExportToReqif(); + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aOle1; + ParseOle1FromRtfUrl(aRtfUrl, aOle1); + + // Check the content of the ole1 data. + OLE1Reader aOle1Reader(aOle1); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 39405 + // - Actual : 43008 + // i.e. we did not work with the Ole10Native stream, rather created an OLE1 wrapper around the + // OLE1-in-OLE2 data, resulting in additional size. + CPPUNIT_ASSERT_EQUAL(static_cast(0x99ed), aOle1Reader.m_nNativeDataSize); + + // Now import this back and check the ODT result. + mxComponent->dispose(); + mxComponent.clear(); + ImportFromReqif(maTempFile.GetURL()); + save("writer8"); + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + uno::Reference xInputStream(xNameAccess->getByName("Object 2"), + uno::UNO_QUERY); + std::unique_ptr pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true)); + tools::SvRef pStorage = new SotStorage(*pStream); + tools::SvRef pOleNative = pStorage->OpenSotStream("\1Ole10Native"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 39409 + // - Actual : 0 + // i.e. we didn't handle the case when the ole1 payload was not an ole2 container. Note how the + // expected value is the same as nData above + 4 bytes, since this data is length-prefixed. + CPPUNIT_ASSERT_EQUAL(static_cast(39409), pOleNative->GetSize()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifOle1Paint) +{ + // Load the bug document, which has OLE1 data in it, which is not a wrapper around OLE2 data. + ImportFromReqif(createFileURL(u"paint-ole.xhtml")); + + // Save it as ODT to inspect the result of the OLE1 -> OLE2 conversion. + save("writer8"); + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + uno::Reference xInputStream(xNameAccess->getByName("Object 2"), + uno::UNO_QUERY); + std::unique_ptr pStream(utl::UcbStreamHelper::CreateStream(xInputStream, true)); + tools::SvRef pStorage = new SotStorage(*pStream); + // Check the clsid of the root stream of the OLE2 storage. + SvGlobalName aActual = pStorage->GetClassName(); + SvGlobalName aExpected(0x0003000A, 0, 0, 0xc0, 0, 0, 0, 0, 0, 0, 0x46); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0003000A-0000-0000-c000-000000000046 + // - Actual : 0003000C-0000-0000-c000-000000000046 + // i.e. the "Package" clsid was used on the OLE2 storage unconditionally, even for an mspaint + // case, which has its own clsid. + CPPUNIT_ASSERT_EQUAL(aExpected.GetHexName(), aActual.GetHexName()); + + ExportToReqif(); + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aOle1; + ParseOle1FromRtfUrl(aRtfUrl, aOle1); + + // Check the content of the ole1 data. + // Skip ObjectHeader, see [MS-OLEDS] 2.2.4. + aOle1.Seek(0); + sal_uInt32 nData; + aOle1.ReadUInt32(nData); // OLEVersion + aOle1.ReadUInt32(nData); // FormatID + aOle1.ReadUInt32(nData); // ClassName + CPPUNIT_ASSERT(nData); + OString aClassName = read_uInt8s_ToOString(aOle1, nData - 1); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: PBrush + // - Actual : Package + // i.e. a hardcoded class name was written. + CPPUNIT_ASSERT_EQUAL("PBrush"_ostr, aClassName); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifOle1PaintBitmapFormat) +{ + // Given a document with a 8bpp bitmap: + createSwDoc("paint-ole-bitmap-format.odt"); + + // When exporting to reqif-xhtml with ExportImagesAsOLE enabled: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("ExportImagesAsOLE", true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure the resulting bitmap is 24bpp: + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aOle1; + ParseOle1FromRtfUrl(aRtfUrl, aOle1); + OLE1Reader aOle1Reader(aOle1); + Bitmap aBitmap; + SvMemoryStream aMemory; + aMemory.WriteBytes(aOle1Reader.m_aNativeData.data(), aOle1Reader.m_aNativeData.size()); + aMemory.Seek(0); + CPPUNIT_ASSERT(ReadDIB(aBitmap, aMemory, true)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 24 + // - Actual : 8 + // i.e. it was not a pixel format ms paint could handle in OLE mode. + CPPUNIT_ASSERT_EQUAL(vcl::PixelFormat::N24_BPP, aBitmap.getPixelFormat()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testMultiParaListItem) +{ + // Create a document with 3 list items: A, B&C and D. + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("A"); + SwDoc* pDoc = pWrtShell->GetDoc(); + { + // Enable numbering. + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + } + pWrtShell->SplitNode(); + pWrtShell->Insert("B"); + pWrtShell->SplitNode(); + pWrtShell->Insert("C"); + { + // C is in the same list item as B. + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetCountedInList(false); + } + pWrtShell->SplitNode(); + pWrtShell->Insert("D"); + + ExportToReqif(); + + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPathContent(pXmlDoc, "//reqif-xhtml:ol/reqif-xhtml:li[1]/reqif-xhtml:p"_ostr, "A"); + assertXPathContent(pXmlDoc, "//reqif-xhtml:ol/reqif-xhtml:li[2]/reqif-xhtml:p[1]"_ostr, "B"); + // Without the accompanying fix in place, this test would have failed with: + // XPath '//reqif-xhtml:ol/reqif-xhtml:li[2]/reqif-xhtml:p[2]' not found + // i.e. was written before "C", not after "C", so "C" was not in the 2nd list item. + assertXPathContent(pXmlDoc, "//reqif-xhtml:ol/reqif-xhtml:li[2]/reqif-xhtml:p[2]"_ostr, "C"); + assertXPathContent(pXmlDoc, "//reqif-xhtml:ol/reqif-xhtml:li[3]/reqif-xhtml:p"_ostr, "D"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testUnderlineNone) +{ + // Create a document with a single paragraph: its underlying is set to an explicit 'none' value. + createSwDoc(); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + xText->insertString(xText->getEnd(), "x", /*bAbsorb=*/false); + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + xParagraph->setPropertyValue("CharUnderline", uno::Any(sal_Int16(awt::FontUnderline::NONE))); + + // Export to reqif-xhtml. + ExportToReqif(); + + // Make sure that the paragraph has no explicit style, because "text-decoration: none" is + // filtered out. + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPathNoAttribute(pXmlDoc, "//reqif-xhtml:div/reqif-xhtml:p"_ostr, "style"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifOle1PresDataNoOle2) +{ + // Save to reqif-xhtml. + createSwDoc("no-ole2-pres-data.odt"); + ExportToReqif(); + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aOle1; + ParseOle1FromRtfUrl(aRtfUrl, aOle1); + + // Check the content of the ole1 data. + // Without the accompanying fix in place, this test would have failed as there was no + // presentation data after the native data in the OLE1 container. The result was not editable in + // Word. + OLE1Reader aOle1Reader(aOle1); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifOle1PresDataWmfOnly) +{ + // Save to reqif-xhtml. + createSwDoc("ole1-pres-data-wmf.odt"); + ExportToReqif(); + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aOle1; + ParseOle1FromRtfUrl(aRtfUrl, aOle1); + + OLE1Reader aOle1Reader(aOle1); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 135660 + // - Actual : 272376 + // i.e. we wrote some additional EMF data into the WMF output, which broke Word. + CPPUNIT_ASSERT_EQUAL(static_cast(135660), aOle1Reader.m_nPresentationDataSize); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifAscharObjsize) +{ + // Given a document with an as-char anchored embedded object: + createSwDoc("reqif-aschar-objsize.odt"); + + // When exporting to reqif-xhtml: + ExportToReqif(); + + // Then make sure that the RTF snippet has the correct aspect ratio: + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aRtf; + HtmlExportTest::wrapRtfFragment(aRtfUrl, aRtf); + tools::SvRef xReader(new TestReqIfRtfReader(aRtf)); + CPPUNIT_ASSERT(xReader->CallParser() != SvParserState::Error); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 7344 + // - Actual : 2836 + // i.e. the aspect ratio was 1:1, while the PNG aspect ratio was correctly not 1:1. + CPPUNIT_ASSERT_EQUAL(static_cast(7344), xReader->GetObjw()); + CPPUNIT_ASSERT_EQUAL(static_cast(4116), xReader->GetObjh()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifObjdataPresentationDataSize) +{ + // Given a document with an OLE2 embedded object, containing a preview: + createSwDoc("reqif-objdata-presentationdatasize.odt"); + + // When exporting to ReqIF: + ExportToReqif(); + + // Then make sure that the PresentationDataSize in the RTF's objdata blob is correct: + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aOle1; + ParseOle1FromRtfUrl(aRtfUrl, aOle1); + OLE1Reader aOle1Reader(aOle1); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 565994 + // - Actual : 330240 (Linux) + // - Actual : 566034 (Windows, when Word is installed) + // because PresentationData was taken from the OLE2 stream but its size was taken from RTF. + CPPUNIT_ASSERT_EQUAL(static_cast(565994), aOle1Reader.m_nPresentationDataSize); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testListHeading) +{ + // Given a document with a list heading: + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("list header"); + SwDoc* pDoc = pWrtShell->GetDoc(); + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + + // When exporting to ReqIF: + ExportToReqif(); + + // Then make sure the output is valid xhtml: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + + // Without the accompanying fix in place, this test would have failed: + // - expected:
    1. ...

    + // - actual :

      ...

    + // because a but no
  • is not well-formed and
      with a non-li children is invalid. + OUString aContent + = getXPathContent(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol/" + "reqif-xhtml:li[@style='display: block']/reqif-xhtml:p"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("list header"), aContent.trim()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testPartiallyNumberedList) +{ + // Given a document with a list, first para is numbered, second is not: + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("list header"); + SwDoc* pDoc = pWrtShell->GetDoc(); + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + } + pWrtShell->Insert2("numbered"); + pWrtShell->SplitNode(); + pWrtShell->Insert2("not numbered"); + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + } + + // When exporting to ReqIF: + ExportToReqif(); + + // Then make sure the output is well-formed xhtml: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed: + // - expected:
    1. ...

      ...

    2. + // - actual :
    3. ...

      ...

      + // because a
    4. without a matching
    5. is not well-formed, and the was omitted because + // the second para was not numbered. + assertXPath( + pXmlDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol/reqif-xhtml:li/reqif-xhtml:p"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testPartiallyNumberedListHTML) +{ + // Given a document with a list, first para is numbered, second is not: + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("list header"); + SwDoc* pDoc = pWrtShell->GetDoc(); + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->nNode.GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + } + pWrtShell->Insert2("numbered"); + pWrtShell->SplitNode(); + pWrtShell->Insert2("not numbered"); + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->nNode.GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + } + + // When exporting to HTML: + ExportToHTML(); + + SvMemoryStream aStream; + WrapFromTempFile(aStream); + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aStream); + CPPUNIT_ASSERT(pXmlDoc); // if we have missing closing marks - parse error + + // Without the accompanying fix in place, this test would have failed: + // - expected:
    6. ...

      ...

    7. + // - actual :
    8. ...

      ...

      + // because a
    9. without a matching
    10. is not well-formed, and the was omitted because + // the second para was not numbered. + + assertXPath(pXmlDoc, "/html/body/ol/li/p"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testListHeaderAndItem) +{ + // Given a document with a list, first para is not numbered, but the second is: + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("not numbered"); + SwDoc* pDoc = pWrtShell->GetDoc(); + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + } + pWrtShell->SplitNode(); + pWrtShell->Insert2("numbered"); + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + } + + // When exporting to ReqIF: + ExportToReqif(); + + // Then make sure the output is well-formed xhtml: + // Without the accompanying fix in place, this would have failed: + // Entity: line 3: parser error : Opening and ending tag mismatch: ol line 3 and li + // not numbered + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Make sure that in case the list has a header and an item, then both are wrapped in an
    11. + // element. + assertXPath( + pXmlDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol/reqif-xhtml:li/reqif-xhtml:p"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testBlockQuoteNoMargin) +{ + // Given a document with some text, para style set to Quotations, no bottom margin: + createSwDoc(); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + xText->insertString(xText->getEnd(), "string", /*bAbsorb=*/false); + uno::Reference xQuotations( + getStyles("ParagraphStyles")->getByName("Quotations"), uno::UNO_QUERY); + xQuotations->setPropertyValue("ParaBottomMargin", uno::Any(static_cast(0))); + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + xParagraph->setPropertyValue("ParaStyleName", uno::Any(OUString("Quotations"))); + + // When exporting to XHTML: + ExportToReqif(); + + // Then make sure the output is valid xhtml: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed: + // - expected:

      ...

      + // - actual :
      ...
      + // i.e.
      is can't have character children, but it had. + assertXPathContent( + pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:blockquote/reqif-xhtml:p"_ostr, + "string"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifImageToOle) +{ + // Given a document with an image: + createSwDoc(); + uno::Sequence aArgs = { + comphelper::makePropertyValue("FileName", createFileURL(u"ole2.png")), + }; + dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs); + + // When exporting to XHTML: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("ExportImagesAsOLE", true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure we export that PNG as WMF in ReqIF mode: + OUString aRtfUrl = GetOlePath(); + SvMemoryStream aRtf; + HtmlExportTest::wrapRtfFragment(aRtfUrl, aRtf); + tools::SvRef xReader(new TestReqIfRtfReader(aRtf)); + CPPUNIT_ASSERT(xReader->CallParser() != SvParserState::Error); + // Without the accompanying fix in place, this test would have failed: + // - Expected: 8 + // - Actual : 0 + // i.e. the image was exported as PNG, not as WMF (with a version). + CPPUNIT_ASSERT_EQUAL(8, xReader->getWmetafile()); + + // Make sure that the native data byte array is not empty. + SvMemoryStream aOle1; + CPPUNIT_ASSERT(xReader->WriteObjectData(aOle1)); + // Without the accompanying fix in place, this test would have failed, as aOle1 was empty. + OLE1Reader aOle1Reader(aOle1); + CPPUNIT_ASSERT(aOle1Reader.m_nNativeDataSize); + + // Make sure that the presentation data byte array is not empty. + // Without the accompanying fix in place, this test would have failed, as aOle1 only contained + // the native data. + CPPUNIT_ASSERT(aOle1Reader.m_nPresentationDataSize); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedPNGDirectly) +{ + // Given a document with an image: + createSwDoc(); + uno::Sequence aArgs = { + comphelper::makePropertyValue("FileName", createFileURL(u"ole2.png")), + }; + dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs); + + // When exporting to XHTML: + ExportToReqif(); + + // Then make sure the PNG is embedded directly, without an RTF wrapper: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: image/png + // - Actual : text/rtf + // i.e. even PNG was wrapped in an RTF. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "type"_ostr, "image/png"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedJPGDirectly) +{ + // Given a document with an image: + createSwDoc(); + uno::Sequence aArgs = { + comphelper::makePropertyValue("FileName", createFileURL(u"reqif-ole-img.jpg")), + }; + dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs); + + // When exporting to XHTML: + ExportToReqif(); + + // Then make sure the JPG is embedded directly, without an RTF wrapper: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "type"_ostr, "image/jpeg"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: image/jpeg + // - Actual : image/png + // i.e. first the original JPG data was lost, then the inner PNG fallback was missing. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object/reqif-xhtml:object"_ostr, "type"_ostr, + "image/png"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedPNGShapeDirectly) +{ + // Given a document with an image shape: + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(10000, 10000)); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + xShapeProps->setPropertyValue("GraphicURL", uno::Any(createFileURL(u"ole2.png"))); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // When exporting to XHTML: + ExportToReqif(); + + // Then make sure the PNG is embedded directly, without an RTF wrapper: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - no attribute 'type' exist + // i.e. the PNG was exported as GIF, without an explicit type. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "type"_ostr, "image/png"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedJPGShapeDirectly) +{ + // Given a document with an image: + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(10000, 10000)); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + xShapeProps->setPropertyValue("GraphicURL", uno::Any(createFileURL(u"reqif-ole-img.jpg"))); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // When exporting to XHTML: + ExportToReqif(); + + // Then make sure the JPG is embedded directly, without an RTF wrapper: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: image/jpeg + // - Actual : image/png + // i.e. first the original JPG data was lost, then the inner PNG fallback was missing. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "type"_ostr, "image/jpeg"); + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object/reqif-xhtml:object"_ostr, "type"_ostr, + "image/png"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedPNGShapeAsOLE) +{ + // Given a document with an image shape: + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.GraphicObjectShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(10000, 10000)); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + xShapeProps->setPropertyValue("GraphicURL", uno::Any(createFileURL(u"ole2.png"))); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // When exporting to XHTML: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("ExportImagesAsOLE", true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure the PNG is embedded with an RTF wrapper: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: text/rtf + // - Actual : image/png + // i.e. the OLE wrapper around the PNG was missing. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "type"_ostr, "text/rtf"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedShapeAsPNG) +{ + // Given a document with a shape: + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(10000, 10000)); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // When exporting to XHTML: + ExportToReqif(); + + // Then make sure the shape is embedded as a PNG: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: image/png + // - Actual : image/x-vclgraphic + // i.e. the result was invalid ReqIF. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "type"_ostr, "image/png"); + + // Then check the pixel size of the shape: + Size aPixelSize(Application::GetDefaultDevice()->LogicToPixel(Size(10000, 10000), + MapMode(MapUnit::Map100thMM))); + // Without the accompanying fix in place, this test would have failed with: + // - no attribute 'width' exist + // i.e. shapes had no width. + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "width"_ostr, + OUString::number(aPixelSize.getWidth())); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testShapeAsImageHtml) +{ + // Given a document with a shape: + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(5080, 2540)); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // When exporting to plain HTML: + saveAndReload("HTML (StarWriter)"); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: + // - Actual : /> + // i.e. the output was not well-formed. + CPPUNIT_ASSERT_EQUAL(OUString(" "), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testJson) +{ + // Given a document with a shape: + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(2540, 2540)); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // When exporting to HTML, and specifying options as JSON: + setFilterOptions("{\"XhtmlNs\":{\"type\":\"string\", \"value\":\"reqif-xhtml\"}," + "\"ShapeDPI\":{\"type\":\"long\",\"value\":\"192\"}}"); + save("HTML (StarWriter)"); + + // Then make sure those options are not ignored: + // Without the accompanying fix in place, this test would have failed, as GetPngPath() expects + // XML output, but xhtmlns=reqif-xhtml was ignored. + OUString aPngUrl = GetPngPath(); + SvFileStream aFileStream(aPngUrl, StreamMode::READ); + GraphicDescriptor aDescriptor(aFileStream, nullptr); + aDescriptor.Detect(/*bExtendedInfo=*/true); + // Make sure that the increased DPI is taken into account: + tools::Long nExpected = 192; + CPPUNIT_ASSERT_EQUAL(nExpected, aDescriptor.GetSizePixel().getWidth()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifEmbedShapeAsPNGCustomDPI) +{ + // Given a document with a shape: + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(5080, 2540)); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + sal_Int32 nDPI = 600; + + // When exporting to XHTML: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("ShapeDPI", nDPI), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure the shape is embedded as a PNG: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "type"_ostr, "image/png"); + + // Then check the pixel size of the shape: + Size aPixelSize(Application::GetDefaultDevice()->LogicToPixel(Size(5080, 2540), + MapMode(MapUnit::Map100thMM))); + tools::Long nPNGWidth = 1200; + OUString aPngUrl = GetPngPath(); + SvFileStream aFileStream(aPngUrl, StreamMode::READ); + GraphicDescriptor aDescriptor(aFileStream, nullptr); + aDescriptor.Detect(/*bExtendedInfo=*/true); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1200 + // - Actual : 1000 + // i.e. first setting a double DPI didn't result in larger pixel width of the PNG, then it was + // limited to 1000 pixels (because the pixel limit was 500k). + CPPUNIT_ASSERT_EQUAL(nPNGWidth, aDescriptor.GetSizePixel().getWidth()); + + // Then make sure the shape's logic size (in CSS pixels) don't change: + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object"_ostr, "width"_ostr, + OUString::number(aPixelSize.getWidth())); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqifOleBmpTransparent) +{ + // Given a document with a transparent image: + createSwDoc(); + uno::Sequence aArgs = { + comphelper::makePropertyValue("FileName", createFileURL(u"transparent.png")), + }; + dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs); + + // When exporting to reqif with ExportImagesAsOLE=true: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("ExportImagesAsOLE", true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure the transparent pixel turns into white: + SvMemoryStream aOle1; + ParseOle1FromRtfUrl(GetOlePath(), aOle1); + OLE1Reader aOle1Reader(aOle1); + SvMemoryStream aBitmapStream(aOle1Reader.m_aNativeData.data(), aOle1Reader.m_aNativeData.size(), + StreamMode::READ); + Bitmap aBitmap; + ReadDIB(aBitmap, aBitmapStream, /*bFileHeader=*/true); + Size aBitmapSize = aBitmap.GetSizePixel(); + BitmapEx aBitmapEx(aBitmap); + Color nActualColor + = aBitmapEx.GetPixelColor(aBitmapSize.getWidth() - 1, aBitmapSize.getHeight() - 1); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Color: R:255 G:255 B:255 A:0 + // - Actual : Color: R:0 G:0 B:0 A:0 + // i.e. the bitmap without an alpha channel was black, not white. + CPPUNIT_ASSERT_EQUAL(COL_WHITE, nActualColor); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testListsHeading) +{ + // Given a document with lh, lh, li, li, lh and lh nodes: + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("list 1, header 1"); + pWrtShell->SplitNode(); + pWrtShell->Insert("list 1, header 2"); + pWrtShell->SplitNode(); + pWrtShell->Insert("list 2, item 1"); + pWrtShell->SplitNode(); + pWrtShell->Insert("list 2, item 2"); + pWrtShell->SplitNode(); + pWrtShell->Insert("list 3, header 1"); + pWrtShell->SplitNode(); + pWrtShell->Insert("list 3, header 2"); + SwDoc* pDoc = pWrtShell->GetDoc(); + pWrtShell->Up(false, 5); + { + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + } + pWrtShell->Down(false, 1); + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + } + } + pWrtShell->Down(false, 1); + { + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + } + pWrtShell->Down(false, 1); + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + } + } + pWrtShell->Down(false, 1); + { + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + } + pWrtShell->Down(false, 1); + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetCountedInList(false); + } + } + + // When exporting to ReqIF: + ExportToReqif(); + + // Then make sure the output is valid xhtml: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + + OUString aContent + = getXPathContent(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol/" + "reqif-xhtml:li[@style='display: block']/reqif-xhtml:p"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("list 1, header 1"), aContent.trim()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testOleEmfPreviewToHtml) +{ + // Given a document containing an embedded object, with EMF preview: + createSwDoc("ole2.odt"); + + // When exporting to HTML: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure the tag has matching file extension and data: + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + OUString aPath = getXPath(pDoc, "/html/body/p/img"_ostr, "src"_ostr); + // Without the accompanying fix in place, this test would have failed, as aPath was + // ole_html_3978e5f373402b43.JPG, with EMF data. + CPPUNIT_ASSERT(aPath.endsWith("gif")); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testNestedBullets) +{ + // Given a documented with nested lists: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("first"); + sal_uInt16 nPos = pDoc->MakeNumRule(pDoc->GetUniqueNumRuleName()); + SwNumRule* pNumRule = pDoc->GetNumRuleTable()[nPos]; + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetAttrListLevel(0); + } + pWrtShell->SplitNode(); + pWrtShell->Insert("second"); + { + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + SwTextNode& rTextNode = *rNode.GetTextNode(); + rTextNode.SetAttr(SwNumRuleItem(pNumRule->GetName())); + rTextNode.SetAttrListLevel(1); + } + + // When exporting to xhtml: + ExportToReqif(); + + // Then make sure that there is a
    12. between the outer and the inner
        : + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - XPath '//reqif-xhtml:ol/reqif-xhtml:li/reqif-xhtml:ol/reqif-xhtml:li/reqif-xhtml:p' not found + // i.e. the
      1. inside the outer
          was missing. + assertXPathContent( + pXmlDoc, "//reqif-xhtml:ol/reqif-xhtml:li/reqif-xhtml:ol/reqif-xhtml:li/reqif-xhtml:p"_ostr, + "second"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTrailingLineBreak) +{ + // Given a document with a trailing line-break: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("test\n"); + + // When exporting to reqif-xhtml: + ExportToReqif(); + + // Then make sure that we still have a single line-break: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 2 + // - XPath '//reqif-xhtml:br' number of nodes is incorrect + assertXPath(pXmlDoc, "//reqif-xhtml:br"_ostr, 1); + + // Then test the import side: + + // Given an empty document: + mxComponent->dispose(); + + // When importing a
          from reqif-xhtml: + ImportFromReqif(maTempFile.GetURL()); + + // Then make sure that line-break is not lost: + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + pDoc = pTextDoc->GetDocShell()->GetDoc(); + pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + OUString aActual = pWrtShell->GetCursor()->GetPointNode().GetTextNode()->GetText(); + // Without the accompanying fix in place, this test would have failed, as the trailing + // line-break was lost. + CPPUNIT_ASSERT_EQUAL(OUString("test\n"), aActual); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testLeadingTab) +{ + // Given a document with leading tabs: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("\t first"); + pWrtShell->SplitNode(); + pWrtShell->Insert("\t\t second"); + pWrtShell->SplitNode(); + pWrtShell->Insert("thi \t rd"); + + // When exporting to HTML, using LeadingTabWidth=2: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("LeadingTabWidth", static_cast(2)), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure that leading tabs are replaced with 2 nbsps: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: first + // - Actual : first + // i.e. the leading tab was not replaced by 2 nbsps. + assertXPathContent(pXmlDoc, "//reqif-xhtml:p[1]"_ostr, u"\xa0\xa0 first"_ustr); + // Test a leading tab that is not at the start of the paragraph: + assertXPathContent(pXmlDoc, "//reqif-xhtml:p[2]"_ostr, u"\xa0\xa0\xa0\xa0 second"_ustr); + // Test a tab which is not leading: + assertXPathContent(pXmlDoc, "//reqif-xhtml:p[3]"_ostr, u"thi \t rd"_ustr); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testLeadingTabHTML) +{ + // Given a document with leading tabs: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("\t test"); + + // When exporting to plain HTML, using LeadingTabWidth=2: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("LeadingTabWidth", static_cast(2)), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure that leading tabs are replaced with 2 nbsps: + htmlDocUniquePtr pHtmlDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pHtmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: test + // - Actual : test + // i.e. the leading tab was not replaced by 2 nbsps. + assertXPathContent(pHtmlDoc, "/html/body/p"_ostr, SAL_NEWLINE_STRING u"\xa0\xa0 test"_ustr); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testClearingBreak) +{ + auto verify = [this]() { + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + uno::Reference xPortions = xParagraph->createEnumeration(); + uno::Reference xPortion; + OUString aPortionType; + while (true) + { + // Ignore leading comments. + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + xPortion->getPropertyValue("TextPortionType") >>= aPortionType; + if (aPortionType != "Annotation") + { + break; + } + } + // Skip "foo". + // Without the accompanying fix in place, this test would have failed with: + // An uncaught exception of type com.sun.star.container.NoSuchElementException + // i.e. the first para was just comments + text portion, the clearing break was lost. + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + xPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("LineBreak"), aPortionType); + uno::Reference xLineBreak; + xPortion->getPropertyValue("LineBreak") >>= xLineBreak; + sal_Int16 eClear{}; + uno::Reference xLineBreakProps(xLineBreak, uno::UNO_QUERY); + xLineBreakProps->getPropertyValue("Clear") >>= eClear; + CPPUNIT_ASSERT_EQUAL(static_cast(SwLineBreakClear::ALL), eClear); + }; + + // Given a document with an at-para anchored image + a clearing break: + // When loading that file: + createSwWebDoc("clearing-break.html"); + // Then make sure that the clear property of the break is not ignored: + verify(); + saveAndReload("HTML (StarWriter)"); + // Make sure that the clear property of the break is not ignored during export: + verify(); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTableBackground) +{ + // Given a document with two tables: first stable has a background, second table has a + // background in its first row: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwInsertTableOptions aInsertTableOptions(SwInsertTableFlags::DefaultBorder, + /*nRowsToRepeat=*/0); + pWrtShell->InsertTable(aInsertTableOptions, /*nRows=*/1, /*nCols=*/1); + pWrtShell->MoveTable(GotoPrevTable, fnTableStart); + SvxBrushItem aBrush(Color(0xff0000), RES_BACKGROUND); + pWrtShell->SetTabBackground(aBrush); + pWrtShell->Down(/*bSelect=*/false); + pWrtShell->SplitNode(); + pWrtShell->InsertTable(aInsertTableOptions, /*nRows=*/2, /*nCols=*/1); + pWrtShell->MoveTable(GotoPrevTable, fnTableStart); + aBrush.SetColor(0x00ff00); + pWrtShell->SetRowBackground(aBrush); + pWrtShell->Down(/*bSelect=*/false); + // Second row has an explicit transparent background. + aBrush.SetColor(COL_TRANSPARENT); + pWrtShell->SetRowBackground(aBrush); + + // When exporting to reqif-xhtml: + ExportToReqif(); + + // Then make sure that CSS markup is used, not HTML one: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - XPath '//reqif-xhtml:table[1]' no attribute 'style' exist + // i.e. HTML markup was used for the table background color. + assertXPath(pXmlDoc, "//reqif-xhtml:table[1]"_ostr, "style"_ostr, "background: #ff0000"); + assertXPathNoAttribute(pXmlDoc, "//reqif-xhtml:table[1]"_ostr, "bgcolor"_ostr); + assertXPath(pXmlDoc, "//reqif-xhtml:table[2]/reqif-xhtml:tr[1]"_ostr, "style"_ostr, + "background: #00ff00"); + assertXPathNoAttribute(pXmlDoc, "//reqif-xhtml:table[2]/reqif-xhtml:tr[1]"_ostr, + "bgcolor"_ostr); + // Second row has no explicit style, the default is not written. + assertXPathNoAttribute(pXmlDoc, "//reqif-xhtml:table[2]/reqif-xhtml:tr[2]"_ostr, "style"_ostr); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testImageKeepRatio) +{ + // Given a document with an image: width is relative, height is "keep ratio": + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xTextGraphic( + xFactory->createInstance("com.sun.star.text.TextGraphicObject"), uno::UNO_QUERY); + xTextGraphic->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AS_CHARACTER)); + xTextGraphic->setPropertyValue("RelativeWidth", uno::Any(static_cast(42))); + xTextGraphic->setPropertyValue("IsSyncHeightToWidth", uno::Any(true)); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + uno::Reference xCursor(xBodyText->createTextCursor()); + uno::Reference xTextContent(xTextGraphic, uno::UNO_QUERY); + xBodyText->insertTextContent(xCursor, xTextContent, false); + + // When exporting to HTML: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Then make sure that the width is not a fixed size, that would break on resizing the browser + // window: + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: auto + // - Actual : 2 + // i.e. a static (CSS pixel) height was written. + assertXPath(pDoc, "/html/body/p/img"_ostr, "height"_ostr, "auto"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testSectionDir) +{ + // Given a document with a section: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("test"); + pWrtShell->SelAll(); + SwSectionData aSectionData(SectionType::Content, "mysect"); + pWrtShell->InsertSection(aSectionData); + + // When exporting to (reqif-)xhtml: + ExportToReqif(); + + // Then make sure CSS is used to export the text direction of the section: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + // Without the accompanying fix in place, this test would have failed with: + // - XPath '//reqif-xhtml:div[@id='mysect']' no attribute 'style' exist + // i.e. the dir="ltr" HTML attribute was used instead. + assertXPath(pXmlDoc, "//reqif-xhtml:div[@id='mysect']"_ostr, "style"_ostr, "dir: ltr"); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testTdf114769) +{ + // Create document from scratch since relative urls to filesystem can be replaced + // by absolute during save/load + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("Hyperlink1"); + pWrtShell->SplitNode(); + pWrtShell->Insert("Hyperlink2"); + pWrtShell->SplitNode(); + pWrtShell->Insert("Hyperlink3"); + pWrtShell->SplitNode(); + pWrtShell->Insert("Hyperlink4"); + pWrtShell->SplitNode(); + pWrtShell->Insert("Hyperlink5"); + pWrtShell->SplitNode(); + + // Normal external URL + uno::Reference xRun(getRun(getParagraph(1), 1), uno::UNO_QUERY); + xRun->setPropertyValue("HyperLinkURL", uno::Any(OUString("http://libreoffice.org/"))); + + // Bookmark reference + xRun.set(getRun(getParagraph(2), 1), uno::UNO_QUERY); + xRun->setPropertyValue("HyperLinkURL", uno::Any(OUString("#some_bookmark"))); + + // Filesystem absolute link + xRun.set(getRun(getParagraph(3), 1), uno::UNO_QUERY); + xRun->setPropertyValue("HyperLinkURL", uno::Any(OUString("C:\\test.txt"))); + + // Filesystem relative link + xRun.set(getRun(getParagraph(4), 1), uno::UNO_QUERY); + xRun->setPropertyValue("HyperLinkURL", uno::Any(OUString("..\\..\\test.odt"))); + + // Filesystem relative link + xRun.set(getRun(getParagraph(5), 1), uno::UNO_QUERY); + xRun->setPropertyValue("HyperLinkURL", uno::Any(OUString(".\\another.odt"))); + + // Export + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aStoreProperties + = { comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")) }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + htmlDocUniquePtr pHtmlDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pHtmlDoc); + + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice.org/"), + getXPath(pHtmlDoc, "/html/body/p[1]/a"_ostr, "href"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("#some_bookmark"), + getXPath(pHtmlDoc, "/html/body/p[2]/a"_ostr, "href"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("C:\\test.txt"), + getXPath(pHtmlDoc, "/html/body/p[3]/a"_ostr, "href"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("..\\..\\test.odt"), + getXPath(pHtmlDoc, "/html/body/p[4]/a"_ostr, "href"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString(".\\another.odt"), + getXPath(pHtmlDoc, "/html/body/p[5]/a"_ostr, "href"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(HtmlExportTest, testTdf153923) +{ + createSwDoc("TableWithIndent.fodt"); + save("HTML (StarWriter)"); + + // Parse it as XML (strict!) + xmlDocUniquePtr pDoc = parseXml(maTempFile); + // Without the fix in place, this would fail + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body//dl"_ostr, 3); + // The 'dd' tag was not closed + assertXPath(pDoc, "/html/body//dd"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTdf153923_ReqIF) +{ + createSwDoc("TableWithIndent.fodt"); + ExportToReqif(); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + assertXPath(pDoc, "//reqif-xhtml:table"_ostr); + // There should be no 'dd' or 'dl' tags, used as a hack for table indentation + assertXPath(pDoc, "//reqif-xhtml:dl"_ostr, 0); + assertXPath(pDoc, "//reqif-xhtml:dd"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIfTransparentTifImg) +{ + // reqIf export must keep the TIF encoding of the image + createSwDoc("reqif-transparent-tif-img.odt"); + ExportToReqif(); + + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object[1]"_ostr, "type"_ostr, "image/tiff"); + OUString imageName + = getXPath(pXmlDoc, "//reqif-xhtml:p/reqif-xhtml:object[1]"_ostr, "data"_ostr); + // Without the accompanying fix in place, this test would have failed, + // ending with .gif, because XOutFlags::UseGifIfSensible flag combined + // with the transparent image would result in GIF export + CPPUNIT_ASSERT(imageName.endsWith(".tif")); + + INetURLObject aURL(maTempFile.GetURL()); + aURL.setName(imageName); + GraphicDescriptor aDescriptor(aURL); + aDescriptor.Detect(); + CPPUNIT_ASSERT_EQUAL(GraphicFileFormat::TIF, aDescriptor.GetFileFormat()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTdf155387) +{ + createSwDoc("sub_li_and_ctd.fodt"); + ExportToReqif(); + + // Without the fix in place, this would fail + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Single top-level list + assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul"_ostr); + // Single top-level item + assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul/reqif-xhtml:li"_ostr); + // 4 top-level paragraphs in the item + assertXPath( + pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul/reqif-xhtml:li/reqif-xhtml:p"_ostr, + 4); + // 2 sublists in the item + assertXPath( + pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul/reqif-xhtml:li/reqif-xhtml:ul"_ostr, + 2); + // 2 items in the first sublist + assertXPath(pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul/reqif-xhtml:li/reqif-xhtml:ul[1]/" + "reqif-xhtml:li"_ostr, + 2); + // Check the last (most nested) subitem's text + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul/reqif-xhtml:li/reqif-xhtml:ul[2]/" + "reqif-xhtml:li/reqif-xhtml:ul/reqif-xhtml:li/reqif-xhtml:p"_ostr, + "l3"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTdf155496) +{ + createSwDoc("listItemSubheader.fodt"); + ExportToReqif(); + + // Without the fix in place, this would fail + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Two top-level lists + assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul"_ostr, 2); + // Single top-level item + assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul[1]/reqif-xhtml:li"_ostr); + // One top-level paragraph in the item + assertXPath( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul[1]/reqif-xhtml:li/reqif-xhtml:p"_ostr); + // One sublist in the item + assertXPath( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul[1]/reqif-xhtml:li/reqif-xhtml:ul"_ostr); + // One item in the sublist + assertXPath(pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul[1]/reqif-xhtml:li/reqif-xhtml:ul/" + "reqif-xhtml:li"_ostr); + // Check its text + OUString aContent = getXPathContent( + pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ul[1]/reqif-xhtml:li/reqif-xhtml:ul/" + "reqif-xhtml:li/reqif-xhtml:p"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("list 1 item 1\n\t\tsub-header"), aContent.trim()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_RightAlignedTable) +{ + createSwDoc("tableRight.fodt"); + ExportToReqif(); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // No 'align' attribute must be present in 'div' + assertXPathNoAttribute(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:div"_ostr, + "align"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_ListsWithNumFormat) +{ + createSwDoc("listsWithNumFormat.fodt"); + ExportToReqif(); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // No 'type' attribute must be present in 'ol' + assertXPathNoAttribute(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol[1]"_ostr, + "type"_ostr); + assertXPathNoAttribute(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol[2]"_ostr, + "type"_ostr); + assertXPathNoAttribute(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol[3]"_ostr, + "type"_ostr); + assertXPathNoAttribute(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:ol[4]"_ostr, + "type"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTdf155871) +{ + createSwDoc("tdf155871.fodt"); + ExportToReqif(); + + // Without the fix in place, this would fail + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_ListsNoStartAttribute) +{ + createSwDoc("twoListsWithSameStyle.fodt"); + ExportToReqif(); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // No 'start' attribute must be present in 'ol' + assertXPath(pDoc, "//reqif-xhtml:ol[@start]"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_FrameTextAsObjectAltText) +{ + createSwDoc("frameWithText.fodt"); + ExportToReqif(); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // Without the fix, this would fail with + // - Expected: Some text in frame & + // - Actual : Frame1 + // i.e., frame name was used as the object element content, not frame text + assertXPathContent(pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[2]/reqif-xhtml:object"_ostr, + "Some text in frame & "); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testSingleOleExport) +{ + // Given a document containing an embedded OLE object: + createSwDoc("ole2.odt"); + + // Create a selection for that object: + auto xDrawPageSupplier(mxComponent.queryThrow()); + auto xDrawPage(xDrawPageSupplier->getDrawPage()); + auto xModel(mxComponent.queryThrow()); + auto xController(xModel->getCurrentController().queryThrow()); + xController->select(xDrawPage->getByIndex(0)); + + // Store only the selection + auto xStorable(mxComponent.queryThrow()); + css::uno::Sequence aStoreProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("RTFOLEMimeType", OUString("text/rtf")), + comphelper::makePropertyValue("SelectionOnly", true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + + // The root element must be reqif-xhtml:object + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:object"_ostr, "type"_ostr, "text/rtf"); + // It has no children + assertXPathChildren(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:object"_ostr, 0); + // And the content is empty + assertXPathContent(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:object"_ostr, ""); + + OUString aRtfData = getXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:object"_ostr, "data"_ostr); + INetURLObject aUrl(maTempFile.GetURL()); + aUrl.setName(aRtfData); + SvMemoryStream aRtf; + HtmlExportTest::wrapRtfFragment(aUrl.GetMainURL(INetURLObject::DecodeMechanism::NONE), aRtf); + tools::SvRef xReader(new TestReqIfRtfReader(aRtf)); + // The RTF OLE exports correctly + CPPUNIT_ASSERT(xReader->CallParser() != SvParserState::Error); + CPPUNIT_ASSERT_EQUAL(tools::Long(9358), xReader->GetObjw()); + CPPUNIT_ASSERT_EQUAL(tools::Long(450), xReader->GetObjh()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_Tdf156602) +{ + createSwDoc("NestingInA1.fodt"); + ExportToReqif(); + + xmlDocUniquePtr pDoc = WrapReqifFromTempFile(); + + // The outer table must be kept in the document where the outer table is the first element, + // and its A1 starts with a nested table + + // Only two sub-elements must be inside the div: an outer table and a trailing paragraph + assertXPathChildren(pDoc, "/reqif-xhtml:html/reqif-xhtml:div"_ostr, 2); + // The outer table must have exactly two rows + assertXPath(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr"_ostr, 2); + // First outer table cell must have two sub-elements: an inner table and a trailing paragraph + assertXPathChildren( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]"_ostr, + 2); + // The inner table must have exactly two rows + assertXPath( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]/" + "reqif-xhtml:table/reqif-xhtml:tr"_ostr, + 2); + // Check all the elements' content + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]/" + "reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]/reqif-xhtml:p"_ostr, + "Inner.A1"); + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]/" + "reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[2]/reqif-xhtml:p"_ostr, + "Inner.B1"); + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]/" + "reqif-xhtml:table/reqif-xhtml:tr[2]/reqif-xhtml:td[1]/reqif-xhtml:p"_ostr, + "Inner.A2"); + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]/" + "reqif-xhtml:table/reqif-xhtml:tr[2]/reqif-xhtml:td[2]/reqif-xhtml:p"_ostr, + "Inner.B2"); + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[1]/" + "reqif-xhtml:p"_ostr, + "Outer.A1"); + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[1]/reqif-xhtml:td[2]/" + "reqif-xhtml:p"_ostr, + "Outer.B1"); + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[2]/reqif-xhtml:td[1]/" + "reqif-xhtml:p"_ostr, + "Outer.A2"); + assertXPathContent( + pDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr[2]/reqif-xhtml:td[2]/" + "reqif-xhtml:p"_ostr, + "Outer.B2"); + assertXPathContent(pDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p"_ostr, + "Following text"); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTdf156647_CellPaddingRoundtrip) +{ + // Given a document with a table with cell padding: + createSwDoc("table_cell_padding.fodt"); + { + auto xTable = getParagraphOrTable(1); + auto aTableBorder = getProperty(xTable, "TableBorder2"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1270), aTableBorder.Distance); + CPPUNIT_ASSERT(aTableBorder.IsDistanceValid); + } + // When exporting to reqif-xhtml: + ExportToReqif(); + // Make sure that we export it: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "//reqif-xhtml:table"_ostr, "cellpadding"_ostr, "48"); // px + // Now import it + mxComponent->dispose(); + ImportFromReqif(maTempFile.GetURL()); + // Then make sure that padding is not lost: + { + auto xTable = getParagraphOrTable(1); + auto aTableBorder = getProperty(xTable, "TableBorder2"); + // Without the accompanying fix in place, this test would have failed: + // - Expected: 1270 + // - Actual : 97 + // as the padding was lost, and the default 55 twip padding was used. + CPPUNIT_ASSERT_EQUAL(sal_Int16(1270), aTableBorder.Distance); + CPPUNIT_ASSERT(aTableBorder.IsDistanceValid); + } +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testTdf157643_WideHBorder) +{ + // Given a document with a table with a wide border between its two rows: + createSwDoc("table_with_wide_horizontal_border.fodt"); + // When exporting to reqif-xhtml: + ExportToReqif(); + // Make sure that there's no extra tr's: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:table/reqif-xhtml:tr"_ostr, + 2); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testHTML_PreserveSpaces) +{ + // Given a document with leading, trailing, and repeating intermediate spaces: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + constexpr OUString paraText = u"\t test \t more text \t"_ustr; + pWrtShell->Insert(paraText); + + // When exporting to plain HTML, using PreserveSpaces: + saveWithParams({ + comphelper::makePropertyValue("FilterName", u"HTML (StarWriter)"_ustr), + comphelper::makePropertyValue("PreserveSpaces", true), + }); + + // Then make sure that "white-space: pre-wrap" is written into the paragraph's style: + htmlDocUniquePtr pHtmlDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pHtmlDoc); + const OUString style = getXPath(pHtmlDoc, "/html/body/p"_ostr, "style"_ostr); + CPPUNIT_ASSERT(style.indexOf("white-space: pre-wrap") >= 0); + // Also check that the paragraph text is correct, without modifications in whitespace + assertXPathContent(pHtmlDoc, "/html/body/p"_ostr, paraText); + + // Test import + + setImportFilterName("HTML (StarWriter)"); + load(maTempFile.GetURL()); + CPPUNIT_ASSERT_EQUAL(paraText, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_PreserveSpaces) +{ + // Given a document with leading, trailing, and repeating intermediate spaces: + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + constexpr OUString paraText = u"\t test \t more text \t"_ustr; + pWrtShell->Insert(paraText); + + // When exporting to ReqIF, using PreserveSpaces: + saveWithParams({ + comphelper::makePropertyValue("FilterName", u"HTML (StarWriter)"_ustr), + comphelper::makePropertyValue("FilterOptions", u"xhtmlns=reqif-xhtml"_ustr), + comphelper::makePropertyValue("PreserveSpaces", true), + }); + + // Then make sure that xml:space="preserve" attribute exists in the paragraph element: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p"_ostr, "space"_ostr, + u"preserve"_ustr); + // Also check that the paragraph text is correct, without modifications in whitespace + assertXPathContent(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p"_ostr, paraText); + + // Test import + + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + load(maTempFile.GetURL()); + CPPUNIT_ASSERT_EQUAL(paraText, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testHTML_NoPreserveSpaces) +{ + // Test cases where "PreserveSpaces" should not introduce respective markup + + const auto assertXPath_NoWhiteSpaceInStyle + = [this](const xmlDocUniquePtr& pDoc, const OString& rXPath) { + xmlXPathObjectPtr pXmlObj = getXPathNode(pDoc, rXPath); + xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval; + CPPUNIT_ASSERT_EQUAL_MESSAGE(rXPath.getStr(), 1, xmlXPathNodeSetGetLength(pXmlNodes)); + xmlNodePtr pXmlNode = pXmlNodes->nodeTab[0]; + if (xmlChar* prop = xmlGetProp(pXmlNode, BAD_CAST("style"))) + { + OUString style = OUString::fromUtf8(reinterpret_cast(prop)); + CPPUNIT_ASSERT_MESSAGE(rXPath.getStr(), style.indexOf("white-space:") < 0); + } + xmlXPathFreeObject(pXmlObj); + }; + const auto assertXPath_HasWhiteSpaceInStyle + = [this](const xmlDocUniquePtr& pDoc, const OString& rXPath) { + const OUString style = getXPath(pDoc, rXPath, "style"_ostr); + CPPUNIT_ASSERT_MESSAGE(rXPath.getStr(), style.indexOf("white-space: pre-wrap") >= 0); + }; + + createSwDoc("test_no_space_preserve.fodt"); + + // Export to plain HTML, using PreserveSpaces: + saveWithParams({ + comphelper::makePropertyValue("FilterName", u"HTML (StarWriter)"_ustr), + comphelper::makePropertyValue("PreserveSpaces", true), + }); + + htmlDocUniquePtr pHtmlDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pHtmlDoc); + + // No whitespace preservation, where no leading / trailing / double whitespace + assertXPath_NoWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[1]"_ostr); + // Whitespace preserved for a leading space + assertXPath_HasWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[2]"_ostr); + // Whitespace preserved for a trailing space + assertXPath_HasWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[3]"_ostr); + // Whitespace preserved for a double space + assertXPath_HasWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[4]"_ostr); + // No whitespace preservation for leading / trailing breaks + assertXPath_NoWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[5]"_ostr); + // Whitespace preserved for a leading break + space + assertXPath_HasWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[6]"_ostr); + // Whitespace preserved for a trailing space + break + assertXPath_HasWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[7]"_ostr); + // No whitespace preservation for a middle break + assertXPath_NoWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[8]"_ostr); + // Whitespace preserved for a middle space + break + assertXPath_HasWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[9]"_ostr); + // Whitespace preserved for a middle break + space + assertXPath_HasWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[10]"_ostr); + // No whitespace preservation for a trailing space and SVG + assertXPath_NoWhiteSpaceInStyle(pHtmlDoc, "/html/body/p[11]"_ostr); + + // Test import + + setImportFilterName("HTML (StarWriter)"); + load(maTempFile.GetURL()); + + CPPUNIT_ASSERT_EQUAL(u"No special spaces"_ustr, getParagraph(1)->getString()); + CPPUNIT_ASSERT_EQUAL(u" Leading space"_ustr, getParagraph(2)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Trailing space "_ustr, getParagraph(3)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Double space"_ustr, getParagraph(4)->getString()); + // Trailing break is removed in SwHTMLParser::AppendTextNode, and replaced with para spacing + CPPUNIT_ASSERT_EQUAL(u"\nLeading/trailing breaks"_ustr, getParagraph(5)->getString()); + CPPUNIT_ASSERT_EQUAL(u"\n Leading break + space"_ustr, getParagraph(6)->getString()); + // Trailing break is removed in SwHTMLParser::AppendTextNode, and replaced with para spacing + CPPUNIT_ASSERT_EQUAL(u"Trailing space + break "_ustr, getParagraph(7)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Middle\nbreak"_ustr, getParagraph(8)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Middle space \n+ break"_ustr, getParagraph(9)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Middle break\n + space"_ustr, getParagraph(10)->getString()); + // The SVG is replaced by a space in SwXParagraph::getString() + CPPUNIT_ASSERT_EQUAL(u"Trailing space and SVG "_ustr, getParagraph(11)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_NoPreserveSpaces) +{ + // Test cases where "PreserveSpaces" should not introduce respective markup + + createSwDoc("test_no_space_preserve.fodt"); + + // Export to ReqIF, using PreserveSpaces: + saveWithParams({ + comphelper::makePropertyValue("FilterName", u"HTML (StarWriter)"_ustr), + comphelper::makePropertyValue("FilterOptions", u"xhtmlns=reqif-xhtml"_ustr), + comphelper::makePropertyValue("PreserveSpaces", true), + }); + + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + + // No whitespace preservation, where no leading / trailing / double whitespace + assertXPathNoAttribute(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[1]"_ostr, + "space"_ostr); + // Whitespace preserved for a leading space + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[2]"_ostr, "space"_ostr, + u"preserve"_ustr); + // Whitespace preserved for a trailing space + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[3]"_ostr, "space"_ostr, + u"preserve"_ustr); + // Whitespace preserved for a double space + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[4]"_ostr, "space"_ostr, + u"preserve"_ustr); + // No whitespace preservation for leading / trailing breaks + assertXPathNoAttribute(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[5]"_ostr, + "space"_ostr); + // Whitespace preserved for a leading break + space + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[6]"_ostr, "space"_ostr, + u"preserve"_ustr); + // No whitespace preservation for a trailing space + break + assertXPathNoAttribute(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[7]"_ostr, + "space"_ostr); + // No whitespace preservation for a middle break + assertXPathNoAttribute(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[8]"_ostr, + "space"_ostr); + // No whitespace preservation for a middle space + break + assertXPathNoAttribute(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[9]"_ostr, + "space"_ostr); + // Whitespace preserved for a middle break + space + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[10]"_ostr, "space"_ostr, + u"preserve"_ustr); + // No whitespace preservation for a trailing space and SVG + assertXPathNoAttribute(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[11]"_ostr, + "space"_ostr); + + // Test import + + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + load(maTempFile.GetURL()); + + CPPUNIT_ASSERT_EQUAL(u"No special spaces"_ustr, getParagraph(1)->getString()); + CPPUNIT_ASSERT_EQUAL(u" Leading space"_ustr, getParagraph(2)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Trailing space "_ustr, getParagraph(3)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Double space"_ustr, getParagraph(4)->getString()); + CPPUNIT_ASSERT_EQUAL(u"\nLeading/trailing breaks\n"_ustr, getParagraph(5)->getString()); + CPPUNIT_ASSERT_EQUAL(u"\n Leading break + space"_ustr, getParagraph(6)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Trailing space + break \n"_ustr, getParagraph(7)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Middle\nbreak"_ustr, getParagraph(8)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Middle space \n+ break"_ustr, getParagraph(9)->getString()); + CPPUNIT_ASSERT_EQUAL(u"Middle break\n + space"_ustr, getParagraph(10)->getString()); + // The SVG is replaced by a space in SwXParagraph::getString() + CPPUNIT_ASSERT_EQUAL(u"Trailing space and SVG "_ustr, getParagraph(11)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_ExportFormulasAsPDF) +{ + // Given a document with a formula: + createSwDoc("embedded_formula.fodt"); + + // When exporting to reqif with ExportFormulasAsPDF=true: + uno::Reference xStorable(mxComponent, uno::UNO_QUERY_THROW); + uno::Sequence aStoreProperties = { + comphelper::makePropertyValue(u"FilterName"_ustr, u"HTML (StarWriter)"_ustr), + comphelper::makePropertyValue(u"FilterOptions"_ustr, u"xhtmlns=reqif-xhtml"_ustr), + comphelper::makePropertyValue(u"ExportFormulasAsPDF"_ustr, true), + }; + xStorable->storeToURL(maTempFile.GetURL(), aStoreProperties); + + // Make sure that the formula is exported as PDF: + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p[2]/reqif-xhtml:object"_ostr, + "type"_ostr, u"application/pdf"_ustr); + + css::uno::Sequence descr{ + comphelper::makePropertyValue(u"URL"_ustr, GetObjectPath(u".pdf"_ustr)), + }; + + uno::Reference xFactory( + comphelper::getProcessComponentContext()->getServiceManager(), uno::UNO_QUERY_THROW); + uno::Reference xTypeDetection( + xFactory->createInstance(u"com.sun.star.document.TypeDetection"_ustr), + uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT_EQUAL(u"pdf_Portable_Document_Format"_ustr, + xTypeDetection->queryTypeByDescriptor(descr, true)); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlDomExportTest, testReqIF_NoBrClearForImageWrap) +{ + // Given a document with a paragraph-anchored image with "none" wrap: + createSwDoc("image_anchored_to_paragraph_no_wrap.fodt"); + // When exporting to reqif: + ExportToReqif(); + // Make sure that there's no 'br' elements in the 'object' (used to represent the wrapping + // in HTML export, using 'clear' attribute): + xmlDocUniquePtr pXmlDoc = WrapReqifFromTempFile(); + assertXPath(pXmlDoc, "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p/reqif-xhtml:object"_ostr); + assertXPath( + pXmlDoc, + "/reqif-xhtml:html/reqif-xhtml:div/reqif-xhtml:p/reqif-xhtml:object/reqif-xhtml:br"_ostr, + 0); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/htmlexport/xhtmlexport.cxx b/sw/qa/extras/htmlexport/xhtmlexport.cxx new file mode 100644 index 0000000000..86026dbd70 --- /dev/null +++ b/sw/qa/extras/htmlexport/xhtmlexport.cxx @@ -0,0 +1,187 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +#include + +class XHtmlExportTest : public SwModelTestBase, public HtmlTestTools +{ +public: + XHtmlExportTest() + : SwModelTestBase("/sw/qa/extras/odfexport/data/", "XHTML Writer File") + { + } +}; + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testImageEmbedding) +{ + createSwDoc("image-mimetype.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + htmlDocUniquePtr pDoc = parseHtml(maTempFile); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/html/body"_ostr, 1); + assertXPath(pDoc, "/html/body/div[1]/div[1]/img"_ostr, 1); + OUString aValue = getXPath(pDoc, "/html/body/div[1]/div[1]/img"_ostr, "src"_ostr); + CPPUNIT_ASSERT(aValue.startsWith("data:image/svg+xml;base64")); +} + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testTdf131812) +{ + createSwDoc("tdf131812.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + CPPUNIT_ASSERT( + aStream.indexOf(".paragraph-P1{ font-size:12pt; font-family:\'Liberation Serif\'; " + "writing-mode:horizontal-tb; direction:rtl; text-align:right ! important;}") + != -1); +} + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testTdf146264) +{ + createSwDoc("tdf146264.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + sal_Int32 nFirstHello = aStream.indexOf("Hello"); + CPPUNIT_ASSERT(nFirstHello > 0); + if (nFirstHello > 0) + { + sal_Int32 nSecondHello = aStream.indexOf("Hello", nFirstHello + 1); + constexpr sal_Int32 nMinusOne = -1; + CPPUNIT_ASSERT_EQUAL(nMinusOne, nSecondHello); + } +} + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testTdf118637) +{ + createSwDoc("tdf118637.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + CPPUNIT_ASSERT(aStream.indexOf("The formula  ") != -1); + CPPUNIT_ASSERT(aStream.indexOf("should be inline.") != -1); +} + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testTdf145361) +{ + createSwDoc("tdf145361.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + // Without the fix in place, this test would have failed with + // - SfxBaseModel::impl_store failed: 0xc10(Error Area:Io Class:Write Code:16) + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + CPPUNIT_ASSERT( + aStream.indexOf("List entry has
          a line break") != -1); +} + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testTdf142483) +{ + createSwDoc("tdf142483.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + CPPUNIT_ASSERT( + aStream.indexOf("padding:0.0382in; border-left-width:thin; border-left-style:solid; " + "border-left-color:#000000; border-right-style:none; " + "border-top-width:thin; border-top-style:solid; border-top-color:#000000; " + "border-bottom-width:thin; border-bottom-style:solid; " + "border-bottom-color:#000000;") + != -1); + CPPUNIT_ASSERT( + aStream.indexOf("padding:0.0382in; border-left-width:thin; border-left-style:solid; " + "border-left-color:#000000; border-right-style:none; " + "border-top-style:none; border-bottom-width:thin; " + "border-bottom-style:solid; border-bottom-color:#000000;") + != -1); + CPPUNIT_ASSERT( + aStream.indexOf("border-top-width:thin; border-top-style:solid; border-top-color:#000000; " + "border-left-width:thin; border-left-style:solid; " + "border-left-color:#000000; border-bottom-width:thin; " + "border-bottom-style:solid; border-bottom-color:#000000; " + "border-right-width:thin; border-right-style:solid; " + "border-right-color:#000000; padding:0.0382in;") + != -1); + CPPUNIT_ASSERT( + aStream.indexOf("padding:0.0382in; border-left-width:thin; border-left-style:solid; " + "border-left-color:#000000; border-right-width:thin; " + "border-right-style:solid; border-right-color:#000000; " + "border-top-style:none; border-bottom-width:thin; " + "border-bottom-style:solid; border-bottom-color:#000000;") + != -1); +} + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testTdf107696) +{ + createSwDoc("tdf107696.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + //tdf#111492 + CPPUNIT_ASSERT(aStream.indexOf("span.heading_numbering { margin-right: 0.8rem; }* { margin:0;}") + != -1); + CPPUNIT_ASSERT( + aStream.indexOf("

          Level 2 without number

          ") + != -1); + CPPUNIT_ASSERT( + aStream.indexOf( + "

          3.1Level 2, number 3.1

          ") + != -1); + CPPUNIT_ASSERT( + aStream.indexOf( + "

          3.2Level 2, number 3.2

          ") + != -1); +} + +CPPUNIT_TEST_FIXTURE(XHtmlExportTest, testTdf66305) +{ + createSwDoc("tdf66305.odt"); + setFilterOptions("UTF8"); + save(mpFilter); + SvStream* pStream = maTempFile.GetStream(StreamMode::READ); + CPPUNIT_ASSERT(pStream); + sal_uInt64 nLength = pStream->TellEnd(); + OString aStream(read_uInt8s_ToOString(*pStream, nLength)); + CPPUNIT_ASSERT( + aStream.indexOf("

          Introduction

           

          ") + != -1); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/htmlimport/data/PageAndParagraphFilled.html b/sw/qa/extras/htmlimport/data/PageAndParagraphFilled.html new file mode 100644 index 0000000000..fbe1ff1e18 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/PageAndParagraphFilled.html @@ -0,0 +1,45 @@ + + + + + + + + + + + +

          +Er hörte leise Schritte hinter sich. Das bedeutete nichts Gutes. +Wer würde ihm schon folgen, spät in der Nacht und dazu noch +in dieser engen Gasse mitten im übel beleumundeten Hafenviertel? +Gerade jetzt, wo er das Ding seines Lebens gedreht hatte und mit der +Beute verschwinden wollte! Hatte einer seiner zahllosen Kollegen +dieselbe Idee gehabt, ihn beobachtet und abgewartet, um ihn nun um +die Früchte seiner Arbeit zu erleichtern? Oder gehörten die +Schritte hinter ihm zu einem der unzähligen Gesetzeshüter +dieser Stadt, und die stählerne Acht um seine Handgelenke würde +gleich zuschnappen? Er konnte die Aufforderung stehen zu bleiben +schon hören. Gehetzt sah er sich um. Plötzlich erblickte er +den schmalen Durchgang. Blitzartig drehte er sich nach rechts und +verschwand zwischen den beiden Gebäuden. Beinahe wäre er +dabei über den umgestürzten Mülleimer gefallen, der +mitten im Weg lag. Er versuchte, sich in der Dunkelheit seinen Weg zu +ertasten und erstarrte: Anscheinend gab es keinen anderen Ausweg aus +diesem kleinen Hof als den Durchgang, durch den er gekommen war. Die +Schritte wurden lauter und lauter, er sah eine dunkle Gestalt um die +Ecke biegen. Fieberhaft irrten seine Augen durch die nächtliche +Dunkelheit und suchten einen Ausweg. War jetzt wirklich alles vorbei, +waren alle Mühe und alle Vorbereitungen umsonst? Er presste sich +ganz eng an die Wand hinter ihm und hoffte, der Verfolger würde +ihn übersehen, als plötzlich neben ihm mit kaum +wahrnehmbarem Quietschen eine Tür im nächtlichen Wind hin +und her schwang. Könnte dieses der flehentlich herbeigesehnte +Ausweg aus seinem Dilemma sein? Langsam bewegte er sich auf die +offene Tür zu, immer dicht an die Mauer gepresst. Würde +diese Tür seine Rettung werden?

          + + \ No newline at end of file diff --git a/sw/qa/extras/htmlimport/data/allowed-rtf-ole-mime-types.xhtml b/sw/qa/extras/htmlimport/data/allowed-rtf-ole-mime-types.xhtml new file mode 100644 index 0000000000..9b01ad72a5 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/allowed-rtf-ole-mime-types.xhtml @@ -0,0 +1,5 @@ + + + OLE Object + + diff --git a/sw/qa/extras/htmlimport/data/data.ole b/sw/qa/extras/htmlimport/data/data.ole new file mode 100644 index 0000000000..d3dc23d793 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/data.ole @@ -0,0 +1 @@ +{\pict} diff --git a/sw/qa/extras/htmlimport/data/emojis16BE.html b/sw/qa/extras/htmlimport/data/emojis16BE.html new file mode 100644 index 0000000000..023aee1cb2 Binary files /dev/null and b/sw/qa/extras/htmlimport/data/emojis16BE.html differ diff --git a/sw/qa/extras/htmlimport/data/green-highlight.html b/sw/qa/extras/htmlimport/data/green-highlight.html new file mode 100644 index 0000000000..b8986e78ff --- /dev/null +++ b/sw/qa/extras/htmlimport/data/green-highlight.html @@ -0,0 +1 @@ +

          Highlight green (transparency: 0.5)

          diff --git a/sw/qa/extras/htmlimport/data/hidden-textframe.html b/sw/qa/extras/htmlimport/data/hidden-textframe.html new file mode 100644 index 0000000000..5e97042799 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/hidden-textframe.html @@ -0,0 +1,8 @@ + + + +

          test

          +
          +
          + + diff --git a/sw/qa/extras/htmlimport/data/image-lazy-read.html b/sw/qa/extras/htmlimport/data/image-lazy-read.html new file mode 100644 index 0000000000..afc19a7a62 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/image-lazy-read.html @@ -0,0 +1,11 @@ + +

          +aaa +

          +

          +bbb +

          +

          + +

          + diff --git a/sw/qa/extras/htmlimport/data/image-size.html b/sw/qa/extras/htmlimport/data/image-size.html new file mode 100644 index 0000000000..a26c606100 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/image-size.html @@ -0,0 +1,25 @@ + + + + + + + +

          +
          + +

          +

          +
          + +

          +

          + +
          + +

          + + diff --git a/sw/qa/extras/htmlimport/data/image-width-auto.html b/sw/qa/extras/htmlimport/data/image-width-auto.html new file mode 100644 index 0000000000..878be07cee --- /dev/null +++ b/sw/qa/extras/htmlimport/data/image-width-auto.html @@ -0,0 +1,40 @@ + + +

          + diff --git a/sw/qa/extras/htmlimport/data/inlined_image.html b/sw/qa/extras/htmlimport/data/inlined_image.html new file mode 100644 index 0000000000..7ce2a29da3 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/inlined_image.html @@ -0,0 +1,21 @@ + + + + + + + + + + + +

          Simple document with a picture.

          +

          +


          +
          + +

          + + \ No newline at end of file diff --git a/sw/qa/extras/htmlimport/data/libreoffice.jpg b/sw/qa/extras/htmlimport/data/libreoffice.jpg new file mode 100644 index 0000000000..14af080b14 Binary files /dev/null and b/sw/qa/extras/htmlimport/data/libreoffice.jpg differ diff --git a/sw/qa/extras/htmlimport/data/list-style.html b/sw/qa/extras/htmlimport/data/list-style.html new file mode 100644 index 0000000000..8c5468aa15 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/list-style.html @@ -0,0 +1,58 @@ + + + +
          +

          + This document contains a number of lists... +

            +
          • list-style-type
          • +
          • default
          • +
          +
            +
          • list-style-type
          • +
          • circle
          • +
          +
            +
          • list-style-type
          • +
          • square
          • +
          +
            +
          • list-style-type
          • +
          • disc
          • +
          +
            +
          1. list-style-type
          2. +
          3. default
          4. +
          +
            +
          1. list-style-type
          2. +
          3. decimal
          4. +
          +
            +
          1. list-style-type
          2. +
          3. lower-alpha
          4. +
          +
            +
          1. list-style-type
          2. +
          3. lower-latin
          4. +
          +
            +
          1. list-style-type
          2. +
          3. lower-roman
          4. +
          +
            +
          1. list-style-type
          2. +
          3. upper-alpha
          4. +
          +
            +
          1. list-style-type
          2. +
          3. upper-latin
          4. +
          +
            +
          1. list-style-type
          2. +
          3. upper-roman
          4. +
          +

          +
          + + diff --git a/sw/qa/extras/htmlimport/data/meta-ISO8601-dates.html b/sw/qa/extras/htmlimport/data/meta-ISO8601-dates.html new file mode 100644 index 0000000000..86390d77ea --- /dev/null +++ b/sw/qa/extras/htmlimport/data/meta-ISO8601-dates.html @@ -0,0 +1,20 @@ + + + + + + + + + + + +

          +Test +

          + + diff --git a/sw/qa/extras/htmlimport/data/meta-changedby.html b/sw/qa/extras/htmlimport/data/meta-changedby.html new file mode 100644 index 0000000000..b228b31073 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/meta-changedby.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + +

          +Test +

          + + diff --git a/sw/qa/extras/htmlimport/data/ole-data.xhtml b/sw/qa/extras/htmlimport/data/ole-data.xhtml new file mode 100644 index 0000000000..e8f1910ad4 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/ole-data.xhtml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/sw/qa/extras/htmlimport/data/ole-data2.xhtml b/sw/qa/extras/htmlimport/data/ole-data2.xhtml new file mode 100644 index 0000000000..0eb180e6ca --- /dev/null +++ b/sw/qa/extras/htmlimport/data/ole-data2.xhtml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/sw/qa/extras/htmlimport/data/ole-img-svg.xhtml b/sw/qa/extras/htmlimport/data/ole-img-svg.xhtml new file mode 100644 index 0000000000..2e063937ff --- /dev/null +++ b/sw/qa/extras/htmlimport/data/ole-img-svg.xhtml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/sw/qa/extras/htmlimport/data/ole-img.xhtml b/sw/qa/extras/htmlimport/data/ole-img.xhtml new file mode 100644 index 0000000000..798787290c --- /dev/null +++ b/sw/qa/extras/htmlimport/data/ole-img.xhtml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/sw/qa/extras/htmlimport/data/ole2.gif b/sw/qa/extras/htmlimport/data/ole2.gif new file mode 100644 index 0000000000..19e9785e52 Binary files /dev/null and b/sw/qa/extras/htmlimport/data/ole2.gif differ diff --git a/sw/qa/extras/htmlimport/data/ole2.ole b/sw/qa/extras/htmlimport/data/ole2.ole new file mode 100644 index 0000000000..96407e88fa --- /dev/null +++ b/sw/qa/extras/htmlimport/data/ole2.ole @@ -0,0 +1,1014 @@ +{\object\objemb{\*\objclass PowerPoint.Show.12}\objw10020\objh5638{\*\objdata +01050000 +02000000 +13000000 +506f776572506f696e742e53686f772e313200 +00000000 +00000000 +00940000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000 +0000000000010000000100000000000000001000000200000001000000feffffff000000000000 +0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffdffffff47000000feffffff48000000050000000600000007000000080000000900 +00000a0000000b0000000c0000000d0000000e0000000f00000010000000110000001200000013 +0000001400000015000000160000001700000018000000190000001a0000001b0000001c000000 +1d0000001e0000001f000000200000002100000022000000230000002400000025000000260000 +002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f0000003000 +00003100000032000000330000003400000035000000360000003700000038000000390000003a +0000003b0000003c0000003d0000003e0000003f00000040000000410000004200000043000000 +440000004500000046000000fefffffffefffffffeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000016000500 +ffffffffffffffff02000000f4554fcf878f474d80bb5808164bb3f80000000000000000000000 +0080609bf8f8bcd30103000000000300000000000001004f006c00650000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000a000201ffffffffffffffffffffffff00000000000000000000000000000000 +00000000000000000000000000000000000000000000000014000000000000005000610063006b +006100670065000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000100002010100000004000000ffffffff0000000000 +000000000000000000000000000000000000000000000000000000000000000400000056840000 +00000000010043006f006d0070004f0062006a0000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000012000200ffffffffffff +ffffffffffff000000000000000000000000000000000000000000000000000000000000000000 +000000010000007c00000000000000feffffff02000000feffffff040000000500000006000000 +0700000008000000090000000a000000fefffffffeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffff01000002000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000100feff030a0000fffffffff4554fcf878f474d80bb5808164bb3f8220000004d +6963726f736f667420506f776572506f696e742d5072e473656e746174696f6e000f0000004d53 +50726573656e746174696f6e0013000000506f776572506f696e742e53686f772e313200f439b2 +7100000000000000000000000000000000ffffffff030000000400000001000000ffffffff0200 +0000000000000a450000d8260000ba010000010009000003dd0000000600120000000000040000 +0003010800050000000b0200000000050000000c02cf08a80f030000001e0007000000fc020000 +ffffff000000040000002d01000008000000fa02050000000000ffffff00040000002d0101000e +00000024030500ffffffffffffcf08a80fcf08a80fffffffffffff08000000fa02000000000000 +00000000040000002d01020007000000fc020000ffffff000000040000002d01030004000000f0 +01000007000000fc0200004472c4000000040000002d0100000400000006010100040000002d01 +0100120000002403070065026a03e4086a03e408af025a0a2504e4089b05e408e0046502e00404 +0000002d0102000400000006010100040000002d0103000800504b030414000600080000002100 +dfcc18f5ad010000460c0000130008025b436f6e74656e745f54797065735d2e786d6c20a20402 +28a000020000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000cc975b4fc23014c7df4dfc0e4b5f0d2ba0221a060f5e9ebc90881fa06e07 +a8766dd316846fefd90582849b02b12f4bcecef9ffcfaf6bb776adce2415c1188ce54a46a41656 +4900325609978388bcf51e2a4d1258c764c2849210912958d2699f9eb47a530d3640b5b411193a +a76f28b5f110526643a54162a6af4cca1c866640358b3fd90068bd5a6dd0584907d2555ce641da +ad3be8b39170c1fd046f17241f1a0624b82d0ab35e11e169669027e84a8d016197344c6bc163e6 +304fc7325922ab9454212af31a3be4da9e61c19a0e59667d8352f7828fd3f004822e33ee99a558 +45b576541bb0a8cb6bc3cd4e2b5055bfcf6348543c4a51122e9aa5e24718a68ccbd920d6c15881 +379f987538f58b41edd0640bde3b319534c7e1d8469069ba46697b8cf9c98db7118c397c1d8560 +6ebc8dc0e13b0cc575ff49c86db67664ef025edd54c0c147bd60bdd3ea7b64533572e51a2c82e3 +acc4c2fbaf4c750f99ce3d64baf090e9d243a686874c571e32353d64baf690a956f511eabfbee4 +28cf775e3cf71af83dc3ec909aa92b1a8dc038be793f9b7744ebbd070dd9f9378164456f9aff05 +b4bf010000ffff0300504b03041400060008000000210068f874a103010000e20200000b000802 +5f72656c732f2e72656c7320a2040228a000020000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000ac92db4a03311086ef05df21cc7d37 +db2a22d26c6f44e89dc8fa006332bb1bdd1c48a6d2bebda1e061612d82bdcccc3f1fdf24596ff6 +6e14ef94b20d5ec1b2aa4190d7c158df2b786e1f16b72032a33738064f0a0e9461d35c5eac9f68 +442e4379b0318b42f159c1c01cefa4cc7a2087b90a917ce9742139e4724cbd8ca8dfb027b9aaeb +1b997e32a09930c5d628485b7305a23d44fa1f5b3a6234c8287548b488a94c27b66517d162ea89 +1598a01f4b391f135521839c175a9d5788879d7bf168c71995af5ef51aa9ff4d68f977a1d07556 +d37dd03b479ee7bca6896fa71859c644b9148fe95337747d4e21da337943e6f4a3618c9f4672f2 +339b0f000000ffff0300504b030414000600080000002100635c23b4c000000037010000200000 +007070742f736c696465732f5f72656c732f736c696465312e786d6c2e72656c738ccfbd6ac330 +1007f03dd07710b757b23b84102c65290543a7903ec0219d6d515b123ab9c46f1f8d3174c8785f +bf3fd75deecb2cfe28b38f41432b1b10146c743e8c1a7e6e5fef27105c30389c63200d1b315ccc +dba1bbd28ca51ef1e4138baa04d6309592ce4ab19d6841963151a89321e6054b2df3a812da5f1c +497d34cd51e56703ccce14bdd3907bd782b86d895eb1e330784b9fd1ae0b85f24f84e2d93bfac6 +2daea5b298472a1aa47ceeef965a592340994eedde350f000000ffff0300504b03041400060008 +00000021001b2e35070c010000d00300001f0008017070742f5f72656c732f70726573656e7461 +74696f6e2e786d6c2e72656c7320a2040128a00001000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000ac93414ec3301045f748dcc19a3d7152a042a84e3708a90b2404e100269924168e6d79 +4c21b7c76aa12455157591e5fff6fc799ab157ebef4eb32d7a52d608c89214189ad256ca3402de +8ac7ab3b6014a4a9a4b60605f448b0ce2f2f562fa8658845d42a472ca61812d086e0ee39a7b2c5 +4e52621d9a78525bdfc910a56fb893e5876c902fd274c9fd3003f25126db5402fca6ba0656f40e +cfc9b675ad4a7cb0e56787269c68c19d477af636366385f40d0601072b8969c04f432ce68420ad +2afc07d8c95f379b82c86687789214d01fa1eccdd18d49ace59c5841be6b7c0dbdc6c18a06e614 +c8edac20b176b0a49ddc9b93c3b8999361abf0ebe8b51eac3f083efa87f90f000000ffff030050 +4b030414000600080000002100bcd1a735de0200002c0e0000140000007070742f70726573656e +746174696f6e2e786d6cec97cd6fda3014c0ef93f63f44be4e34385f0444a86034d3a44e42a5bb +ece62606a23a71641b0a9df6bfefd97120a59ad4c38e3961fb7dfae7a7f0def4f65832e740852c +7895207c33440ead329e17d536413f1fd3418c1ca9489513c62b9aa01395e876f6f9d3b49ed482 +4a5a29a2c0d40137959c9004ed94aa27ae2bb31d2d89bce135ad40b6e1a2240ab662ebe682bc80 +fb92b9de7018b925292a64edc547ecf966536474c9b37d09e11b2782329387dc15b56cbdd51ff1 +d6bdc5db94241500e617e76582c2211e8670440e74bd7f9254a5bc521280a11990902cff41a4a2 +e27b7e2fd5d58953e409f270300a623f0a00a798e8139060e4cea6ee3fccdfae1b2761d4b1f62e +d65dddf5ab931d21310f8fe12ef09cd92941511cc67ae36aa58a2b2aad5a2b305a631c0467ad9c +6ec89ea9477a546b7562743625fa6cb51276f5b0120e23ba4c723a58de996cba2aecc0700d3a25 +11f7098210846da1c4187240e7913cad5fdb887029c58c0a25f7d5423c6bae8e7ed0ca6e41b483 +505035ab7d95a986fb390b099e70acfd3c53a1ab182e6ee492b3224f0bc6cc46d700fdca847320 +104d1d1bfc575a26aaa34e355c3f837aff525603a6b42699507225a0a41164f24a90c90b8e078d +c33df3b068bc0b9a201ce9847b3e068ae5e35ff8b4107a3e1a8ae5135cf8607f84a31e504bc502 +0a3b80622f36d9f78034150b28ba00f2bc3832ff023d204dc5021a75008d02bfff469fa95840f1 +0590a6d37fa4cf542ca0710750148efa8ff4998ae95cdfb798f504d6b6978595b31745827edfa5 +f374e1f9fe6018f9e920f016e120863fbdc17899fa698817733c9cffd18d380e7507fc6d5fe414 +9cb453000edfcd016591092ef946dd64bcb403855bf3172a6a5e9899027bcd14d078dd6a97a607 +8727e1a28081017c72f18a9c9a4bddde47c07d0f13c312861b0ddf1a66ccd48214dba733f37930 +f7e741d3bdb72a6665a25c07f46c083f0efe5f08b3eea032cf01c0dbdff6a83b1ccdfe020000ff +ff0300504b030414000600080000002100303a84e5ea0200006c060000150000007070742f736c +696465732f736c696465312e786d6c8c545b6f9b30147e9fb4ff8078a75c020450691548a8266d +6bd4763fc033262019dbb2dd3451b5ff3edb98a45d23ad3c707c39dfb97ce71c5fdf1e46ecec11 +170325a51b5e05ae8308a4ed4076a5fbeba9f132d711129016604a50e91e91706f6fbe7eb96685 +c0ada3d04414a0747b2959e1fb02f66804e28a3244d45d47f908a4daf29ddf72f0a2ac8ed88f82 +20f5473010d7e2f967f0b4eb0688d6143e8f88c8c90847184815b9e80726666bec33d618474299 +31e87721dda8cce0236eb514ec8923a457647fc7d923db7273fd73bfe5ced02abe5c878051d1e2 +faf6c2aa992dd99b85ff0f7c372f4171e8f8a8a5cacd3994ae22ffa8ffbe3e4307e9c0e9109e4f +617f7f4117f69b0bdafeecc07fe354673505f7319d784e67dba101176a037b8723d84be12c5c1b +d47721e7f09ef950baaf4d1355c9a689bd46adbc38a862afdac4b9d7448b6c132d9b3a5aa47f34 +3a4c0bc891a1fcdba975c2f443b9c601722a6827af201d6ddde7f651950a63db3c3ae4d764d934 +6114575e1ed7991757e9dacb56abdc5b6749be08f3661584eb3f960d15f32c4d16be4ddeb270b1 +7067d62e962cccd2348c22538c28c8832059be2f5f1ae649122da7b244d1324d97ef8b030ac685 +bc437474f4a274f9b0ebe58a73fa6228077b15eb0498154d6853404aca23465a119307d4295294 +d3c8200d9fa8c6dcd9035cba0042d5f1e174d583164dc749a03e1bd1096176c6a0d6ee068c4fb6 +ad81cbb6273356dfd0d07508ca1338f83ff884309e293983c781507ec9003e7b9ef42782266258 +210f156d8f1af75b49d5eb5ce29a62332c80c09eaaf7074a3ed50d0bf9a88166c3cc4f2100de91 +374a88b45bc0c183bac140bf942df2d61b1b0333de67a7a65256ccafc9dc7f6665a7a8aaf234aa +b3caabc2b8f1e275bef4564d9a784db288e3baca56f562a3a78885f1c72952879f9b22465f1067 +74300f6818d841322486e922cbb3659447260f13db2c4fd3621f4688f90fc0eef7662294338978 +6d8e981ed149f5aca27357b8bf000000ffff0300504b030414000600080000002100d5d192f1bc +000000370100002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c696465 +4c61796f7574362e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c1 +45f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609d +ef35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d8 +0c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23 +fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ec +ddf6030000ffff0300504b030414000600080000002100d5d192f1bc000000370100002c000000 +7070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574372e786d6c +2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2 +e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416 +c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284 +b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2 +f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b +030414000600080000002100d5d192f1bc000000370100002c0000007070742f736c6964654c61 +796f7574732f5f72656c732f736c6964654c61796f7574392e786d6c2e72656c738ccfbd0ac230 +1007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5c +b37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c +68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaa +daa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85 +c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b0304140006000800000021 +00d5d192f1bc000000370100002d0000007070742f736c6964654c61796f7574732f5f72656c73 +2f736c6964654c61796f757431302e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad +8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc86 +5a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c +6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a +48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654 +cb1201aa6dd4ecddf6030000ffff0300504b030414000600080000002100d5d192f1bc00000037 +0100002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f +7574382e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018e +e4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcae +c7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb +10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae +73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf60300 +00ffff0300504b030414000600080000002100d5d192f1bc000000370100002d0000007070742f +736c6964654c61796f7574732f5f72656c732f736c6964654c61796f757431312e786d6c2e7265 +6c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9b +d18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049 +c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a9 +5711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784 +e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b030414 +000600080000002100d5d192f1bc000000370100002c0000007070742f736c6964654c61796f75 +74732f5f72656c732f736c6964654c61796f7574312e786d6c2e72656c738ccfbd0ac2301007f0 +5df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4d +a378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c +8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f4 +6d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453 +d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b030414000600080000002100d5d1 +92f1bc000000370100002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c +6964654c61796f7574322e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad83883475 +11c1c145f4018ee4da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c8 +9b609def35dcaec7d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e +3ba5d80c3421cb10c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83 +b8be23fd6387ae73860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa +6dd4ecddf6030000ffff0300504b030414000600080000002100d5d192f1bc000000370100002c +0000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574332e +786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db +24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d51604 +67f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c99749 +17d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec1 +3c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff03 +00504b030414000600080000002100d5d192f1bc000000370100002c0000007070742f736c6964 +654c61796f7574732f5f72656c732f736c6964654c61796f7574342e786d6c2e72656c738ccfbd +0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4da06db24e4a2e8db9bd18283e37d +fdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7d5160467f416c7e049c39b18f6ed +72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10c9974917d284b994a95711cd1d7b +52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73860ec13c26f2f94784e2d1593a23 +674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000ffff0300504b0304140006000800 +0000210069a25f2115010000c70700002c0000007070742f736c6964654d6173746572732f5f72 +656c732f736c6964654d6173746572312e786d6c2e72656c73c4d54d6ac3301005e07da17730b3 +8f253b899394c8d98442a0ab921e4058e31f6a4b46524a7dfb8a96420c616821a08dc092f5e6e3 +6db43f7c0e7df281d675460bc8520e09eacaa84e3702dececf8b2d24ce4bad646f340a98d0c1a1 +7c7cd8bf622f7db8e4da6e744948d14e40ebfdf8c498ab5a1ca44bcd883a9cd4c60ed2874fdbb0 +5156efb24196735e307b9d01e52c33392901f6a4c2fcf334e25fb24d5d77151e4d751950fb1b23 +98eb3b852f7232171f62a56dd00b48d3ebfdd94fdb348c00765bb68c295b52b24d4cd9869265f9 +3d693edcc519ea7be767cd28c75d19ff6d28271b8a29233b2b62ca0ab2b3b8a591adad63d2d664 +6b3c6a6b9cb2ad62d256946c1753b6fb95b1d9f35b7e010000ffff0300504b0304140006000800 +00002100e40b4c2ac604000089100000220000007070742f736c6964654c61796f7574732f736c +6964654c61796f757431312e786d6ccc58cd6edc3610be17e83b08bad32b891425195907fa6351 +347fa8dd1c7aa325ae5788fe4a71d7eb0401f2267d8e16bde54df2241d52929dd88eb32ee2c297 +2545cd0c67e6fb6648ed93a7bba6b6b6420e55d72e6df7c0b12dd1165d59b5674bfbb7138642db +1a146f4b5e77ad58da1762b09f1efdf8c393fe70a8cb67fca2db280b6cb4c3215fda6ba5fac3c5 +6228d6a2e1c341d78b16dead3ad970058ff26c514a7e0eb69b7ae1390e5d34bc6aed495feea3df +ad565521b2aed834a255a311296aaec0ff615df5c36caddfc75a2fc500668cf6972ea98b1ea285 +c4a8934ad5226ecb939d6d1979b98537ae7d0429288eebd26a79030baf41b47ac36b212dd010b5 +b5694beb44ec94111cfa1329849eb5db9f647fdcbf9246ffc5f695b4aa52db9becd88be9c52466 +1edbad992caea99fcd537eb85bc9468f901f6bb7b401c60bfdbbd06be084558c8bc5d56ab17e79 +8b6cb1ce6f915ecc1b2c3edb5447353a77331c6f0ee7465a74e28c4bcf06353bb791d5d27ec798 +97f8392388c10c11272128c949849887c3dc0b58ea61fa5e6bbbf4b090c280f6733993cfa53700 +6faa427643b7520745d74ccc99090858bb64c25a3bfc2e49a893e718a3d48942447c3f80dd4307 +2549c26246589e90e8fd940bf0791e4d148b29f42907332643ffac2bde0c56db01661ae211c24b +8911573df6eb89704a93cdb63a59012d47fe4d5aa3a8995ca5ff56ecc3c0239133a28aa9ef7afe +9734f0a8179af71a5e3f74dd1087d7411e4df7876a9774e585d63e8511c0d51e2d6dc135aea3d9 +7a50c7eaa216e6a1d73fc62909c235d75da41428cb475975644800e02821c742b4ca8d2cd6d62f +7555bc11ad752ab83c1520d46a7fc634ebb88de9c59543c6c7bb39886fe32024a1876ef176cd6b +70c1f21e291be38826cc0b33045b1244282528a629450e8bfc284fc23cc0dec3b351637e8d8ce0 +deee4af91ea4c4a1770727830013fc909cec351db7f5659fbb8ba3cc1073dbc99a9f01254b3118 +de8cac1deea6e8f5ed4ca6eedeeef7736dccca4f452bf6b0e87ddb62262b750f8bf8db165f5790 +dbfd2d923d92fcf19f767587c9fbd53a996b3de36ad30c9f97387ea4259e666114504c118b0894 +789445fac04911893d97b931ce823c7cf8122fa1a487b71009af5773718f47fe57abdbdc48ae17 +e157ca6e05f723136d84532fa5094638600c8e5716a128f04284d32866414cf28092f7f3b5abe4 +4aa8aa11ac3adb48f172a3ef503789640d8d4a6bc1dbcba256472e3d70f001a43abca214f86070 +6fcb575cf25f6fd2f1bf10ce9f09c7361fff7c2baa5ab49f938e3c52d279d4f1fc380a80740945 +2488139464b18fa2344e1d9f26b193e38727dd4ac991757f6c38b4153913ef1bc7ca7d88f77dd1 +a6976877351c86eda66984fc0270ff91021ea42427d4c5507211f4962c0851eca439f29d308949 +18f971fc3f7419f8547cb1696ec5dc1c67dfb9d9647916d09cf928a53882d6ca729478598a9893 +7b21a3ccf7dde8b2d90c75550a4074ef1ef3e9c35f2fe4c1a70f7f7f87166386f9d370cebb994d +ec4992887a690865ea12e89b19946ecca88f988f094993304e71aed9d3bbe4267b60713ff6f4dd +b9907d57992f6ad79908b4e5fa02e37b0e76b0e79a337d617c9bc74b961cebf861ace573debfdc +1a9a8cd7a5d42cf59a9aa3e895888e7dfe0be1e85f000000ffff0300504b030414000600080000 +002100ee0bf3bf90040000a70f0000220000007070742f736c6964654c61796f7574732f736c69 +64654c61796f757431302e786d6ccc57db6edc36107d2fd07f10f44eeb46dd8cac03dd5814756c +a376f3d0375ae27a85e8568abbde7560207fd2ef68d1b7fc49bea4434af2dab1e3ac031bf08b78 +d1703833e7cc907cf3765d57da8af1be6c9b996eed99bac69abc2dcae662a6ff714650a06bbda0 +4d41abb661337dc37afdedc1cf3fbde9f6fbaa38a49b762934d0d1f4fb74a62f84e8f60da3cf17 +aca6fd5edbb106fecd5b5e5301437e61149c5e82eeba326cd3f48c9a968d3eaee7bbac6fe7f332 +67699b2f6bd6884109671515607fbf28bb7ed2d6eda2ade3ac07356af55d93c4a6036f2130e26c +ad6b4a8eaf60c6d20fc0f5fcb42ab486d63071560a5669cba6905114e5075a31ae9db1b550827d +77c61993bd66f50bef4ebb13aed61fad4eb8561652dfa84737c61fa3981a362bd531be5a7e3175 +e9fe7ace6bd9425cb4f54c07f836f26bc8393042cb87c97c3b9b2f8e1f90cd17d903d2c6b48171 +6b53e9d560dc7d77ecc99d212c325aca8ec35e4c162d7939d33f1262c76e463022d043d88c318a +331c22623b4166fb24b11def5aaeb6bcfd9c3385d0afc5c434cbbb876e5de6bceddbb9d8cbdb7a +a4c9c43600d6c223b0d2ca8fb66f054eeac7c8719308e130b550ec3a094adcccc38e935a76985e +8f01009ba75679618cfe8e8e4f40f4dd619b7fe8b5a605a024ae036e37120398b2ed1623bb4429 +2a36ca0d3f55671be59105621db7c5466e720ead9aa4fb552f4ec5a6626ad0c98f328303101595 +c95b30946603b8e240c10161128c0ffcd78a25cf17da6f55997f608d76ce283f6720d448570787 +a53d4ab5b135c198c0ff36059c8902efefe64307497ab5a01598a0d9af941709f6dc08c71e0a92 +087627568a02270e8126416aa659e4e1d07c795e489475ade52594a6a10649f3d6dbc54f218b2a +4b339d5109c74087fbd4e9246b56d54d35788c4a44f167d5f28a5e00730ad62b780772f58f33e9 +ebed94438f6ff7e7a554a665e7ac613b68b4bfaf31e5a5788246e7fb1adf9710dbdd35e21d82fc +f9bf66fe88caa7a5249e5232a56259f7b733d179a59988bdd8c4212128b47c13e12c345140c004 +171333b49dcc37c3f0e533b180ccebafc0135acda71c1c0ec667a9d873b845286f4327b1132f76 +90e383cbd825210a7d3b404e1246c48f70e67bf87aba9414543051d68c94174bce8e97f2a6719f +485a5f8ba462b4b9496a7160797ba6b307a10eb694021b14ee4d714239fdfd3e1d7f8470ee4438 +b2fcfcf7152b2bd6dc261d7ea5a48b82308a039220df8b2c84831443f9771d04fbc6b11d618f44 +d6cb936e2ef8c0babf9614ca0a9f88f723d5ff1bc47b5eb4bd1bb4db0aceac6659d78cdf01dc7d +a580a72ea45ae8c6c8f28300cefbcc44a1094327c9029bc4a1ac412f0f383ca48e96f58398abe3 +ec998b4d9aa5be971117259e13c2e5976428b6d3041133b303e211d7b5c29b62d35765c100d19d +6bcc974fff1cf1bd2f9ffe7d8612a39ae90135c55df546f6c471e8d94910a3d8c25037d3d04711 +f15c445c07e3240ea2c4c9247b3a0bdf670f4ceec69eaebd64bc6b4bf5deb4cc91402b2a2f07be +6b390176436f046a60c9d65a09fda9f41fda8abfa3ddf14ad164b82e256aaa93d41c44b722d2f7 +e9817df03f000000ffff0300504b0304140006000800000021005a9d3795690500006715000021 +0000007070742f736c6964654c61796f7574732f736c6964654c61796f7574332e786d6ccc58dd +6edb3614be1fb077103460778c259212a9ac4ea13f6ec3b2b458ba0750243a16aabf51b4eba428 +d037d9736cd85ddfa44f3292926ca749336f6b82dc98147578f89df37da40efdecf9a6aeac3517 +7dd93673db3d726c8b37795b94cde5dcfef51503d4b67a99354556b50d9fdb57bcb79f9f7cfdd5 +b3eeb8af8ad3ecaa5d494bf968fae36c6e2fa5ec8e67b33e5ff23aeb8fda8e37eadda2157526d5 +a3b89c15227ba37cd7d50c3a8e3fabb3b2b1c7f9e290f9ed6251e63c69f355cd1b393811bccaa4 +c2df2fcbae9fbc758778eb04ef951b33fb262479d5a9687b9effc0b3c2b68ca158ab21d73e51b1 +e7e755613559ad06c20bb540534ad9836fbfd984df7df8eb42a5335f8a72218d6ddfbd129ceb5e +b3fe5e74e7dd4b615c9cad5f0aab2cb4cbd1953d1b5f8c66e6b1599bceec93e99753373bde2c44 +ad5b951b6b33b7158557fa77a6c7f8465af93098ef46f3e58b3b6cf3657a87f56c5a60b6b7a88e +6a00773b1c3885f3aa94bcb274c20c8ed35e4e8856a29cdb6f19839197320c98ea01ec44184429 +0e008388a690b01822ff9d9eedfac7b9e086a51f8b496dae7f8be1bacc45dbb70b7994b7f52895 +49718a5c178fe46a946f03274843c808086948010e68080296ba2075621c45288e100edf8d0950 +98a7d644311be31d039f88e8bbd3367fdd5b4dab88d2bc0ebc6d2d063275db2d4785c952567cb4 +1b5e9ace2ecb77524c914bbd813b97380141f426dbaee3b99eef8c3442ea4182c8a7640ebebb63 +b989dae24a4fbf50ad22316bf265ab76e3c5e0b4eae5b9bcaab8e9af2b778454f0c52fcab8bf9e +db6aa5492a5b03dddf9bd8e91f334fa84955a68f978283241dd69027462c8a44c9c5b043ad6225 +f2a5f55355e6af79635df04c5c7065d468d7031dc3329d89668ac20476bf40d156a02a5f9d3a3b +ae9759a5d6b5e013952a8b13163a29017e922025558f8288520248801d88433f42943dbc54b53a +3420adafffa358ecd100fbe83ec5ba9ee3b8f460c57e4ea6569d8953739a954da1ce79dd35b356 +67ea636666eda918626778ddb75559b0b2aacc83268cc795b0d659a5f6eb6638cf64d9c8618478 +3bf56f8d87a79d9fd9b4d2cd4d62ba7087147b04ea1c1c04572ffb587035c6112edac10d5cac73 +76105c973e225c8d71848b77705d445c23b183f06acbc7c2ab418e78bd3dbc14529db5a7875783 +1cf1fa3bbc1052f325787a7835c8112fd9c34b303a78bb3d2a5e0d72c44b777835d8c3f7db63e2 +d52047bcc11e5edf234f73bf69907797281abd32d8d6c4f7952cccd429eb5654d9a5aa500ade5b +baa2188a98fe4b562c78aa58924caeea7ebf66414fb466a129f63c184090f8240618c708049051 +405ce27a8cc42c26f1c3d72c85b48dba54b21653ed32c8e5b3c58bb974dd5b619807a39685ba05 +0e970914c358d5610011c600f658000202294071103212e294f8f8dd74ab2c32c9655973565eae +047fb1d2d7c4db22b3fa5ac615cf9aad16e589eb1f39e848a59aee24a53018de9be2652632bd9d +3e91ea7f119c37098ead3efc7ecdcb8a37fba2c34f55743e4969e0b8c0f1824415ca410828a38a +15e4e3044192423f7878d12da41854f7db2a132a5d93f0fea16afe37c2fbb26cfb5bb6d599c99b +6655d75cdc20dc7ba284c328f270927a2056ab011cba0e0854110d62c7f5a0e3d3d071d0c313de +57c5d9aabe9373f800874d9226c44f990ada478152394b4104931830278594f9ccf3dc607bd8f4 +ea2bc815a3079f311fdfff71268e3ebefff30b1c31a699fefd9af26e7aa37aa228f0614c2310b9 +589d9b494040c87c0f300fa94f4644c318a55a3d9d8b6fab470d1ea69eae7dc345d796e60f43d7 +190564ea079fb808a99be744f320921d58cdfcb90e5fb595f839eb5eac8d4a868f7c6c863aadcc +c17467a2439ffe203df91b0000ffff0300504b0304140006000800000021008f55c3fd73040000 +6b0f0000210000007070742f736c6964654c61796f7574732f736c6964654c61796f7574322e78 +6d6ccc97cb6ee3361486f705fa0e82f6b42ea46ec63803dd580c9a26419376d11d23d1b13aba95 +a21c3b8300f3267d8e16ddcd9bcc9394a4a4783249334ee100d998147578780effefd0d49bb79b +aad4d6947545532f746b66ea1aadb3262feaab85fecb0506beae759cd439299b9a2ef42dedf4b7 +47df7ff7a69d77657e4cb64dcf35e1a3eee664a1af386fe786d1652b5a916ed6b4b416ef960dab +08178feccac819b916beabd2b04dd3352a52d4fa389fed33bf592e8b8c264dd657b4e68313464b +c245fcddaa68bbc95bbb8fb796d14eb851b3ef87c4b7adc8b6b9fc5dd794115b8b474b3f127967 +e765aed5a412031705a7a5d6d7b9f6ae5e9192abf75d7bc12895bd7afd036bcfdb33a6a69daccf +9856e4d2cd385d37c617a3997aacd7aa637c35fd6aea92f966c92ad98abdd0360b5d48b695bf86 +1ca31bae65c360b61bcd56a78fd866abf4116b635ac0f8625199d510dcc374ec299d6137e426a9 +388e3b3e45d4b362a17fc0d88e9c142380450f203342204a5100b00dfdd4f6706c43f756ceb6dc +79c6a852e55d3ed165b90f14ad8a8c355db3e4b3aca9463426c28498161ac594517e883c2f347d +b11cb42c0ba008a520401001c7b2133f08a06de1e476dc0011f3d4aa2c8c31df31f14988ae3d6e +b2f79d56374228a9eba0db9dc520a66cdbd548142f784947bbe1a5eaec7679a4806fa226dfca45 +2e45ab06c9bcecf839df96543db4f24785c184102591059b5390a483b8fc48c921b689533630af +e53dcb56da8f6591bda7b5764909bba4c2a896a90e09cb78946b6317823189ffdf08c00981a10c +ba5614e48dec51a6d9af940798fac8775d045ccb0b01421602611407c00c4de85808c7d88a5e92 +8722dfec4c0e80422b29589777d5fd141a58f1b06e5849ae040939edb40b91db004bf734195f2f +a752787ab9dfaea5332dbda435ddc3a3fd6d8f092bf8333cc26f7bfcb5a0ec191ed11e9bfce99f +7af984cbe795189a4a2c21bcafee55187ca51516c756e8413b06a68b20405e68c91337023849d3 +c8f73c1198f3f2276ecec50de6466442caa50c4c56ddf0477790b25b8acb80ca3680b11dbb1104 +d0c31820070720f06c1fc03808b117a2d473d1ed74b1c809a7bca8282eae7a464f7b7973780892 +d6553c2e29a9ef8a9a1f59eecc8433b1d5fe0e291183d2bdcecf08233f3fc4f1ff00e74cc0e1fe +d39f37b42869fd2574e89542e7d911b41cc19b87a138d671e08330767d90402f753d1cd85e18be +3c744bce06eafee8893856d804de01cffbc3aaeddea9dd9405adebbeaa28bb27b8f34a054fa3c4 +09fdd403293463807cc7017e8421b0a1679a711a24317ad1fff14170f13174d2578f6aaefece0e +7cd82469e2b9297640ecc200a000a720b293186033b57dec62c7b182bbc3a62b8b9c0a45f73e63 +3e7ffceb84cd3e7ffcfb00478c6aa60fa269df556fa4278a02d78efd0844e2d20550127820c4ae +03b003118a233f8c612ae9692df4901e31b81f3d6d734d59db14ea9bd1324780d6445e0ea0e740 +cbf6dd60146aa06417ad94fe5ce62fda92fd44dad3b5c264b82ec56aa895680ea63b1399fbf491 +7cf42f000000ffff0300504b0304140006000800000021007555dfd22405000070120000210000 +007070742f736c6964654c61796f7574732f736c6964654c61796f7574312e786d6ccc585d6edc +36107e2fd03b087aa75724254a32b20ef45b14759ca0760e204b5caf10fd95a236768200b949cf +d1bef62639498794e4ddb59dd48ee3c22f4b8a1a7e9c99efd368b42f5e5ed695b1e1a22fdb6669 +e203cb347893b745d95c2ccdb76729f24ca39759536455dbf0a579c57bf3e5d1cf3fbde80efbaa +38ceaeda411a80d1f487d9d25c4bd91d2e167dbee675d61fb41d6fe0deaa157526e1525c2c0a91 +bd07ecba5a10cb628b3a2b1b73da2feeb3bf5dadca9cc76d3ed4bc912388e05526c1ff7e5d76fd +8cd6dd07ad13bc0718bd7bdf2579d541b4b29415370d6d2636b080cd23883c3fad0aa3c96a5838 +2b2507c8aae4fa4edf9d09ced5acd9fc22bad3ee8dd01b4e366f8451160a60da682ea61b9399be +6c367ab2b8b1fd629e6687972b51ab11f2605c2e4da0eb4afd2ed41abf94463e2ee6dbd57cfdfa +0edb7c9ddc61bd980f58ec1caaa21a9dbb1d0e99c3d17930547ab41fc7bd9c3d1a44b9343fa629 +099d24b5510a33645ba18dc2c4f6514aa89710378d08659fd46ecc0e73c13523bf16b3b230bbc5 +665de6a2eddb953cc8db7a92c5ac2e2012db1391cacb8f0e0b284eb185ec2081d3632f4681eb07 +08278e1746961fa781ff694a00f83c8f3a8ac514ef14f84c44df1db7f9bbde685a204af13af276 +6d3192a9c66e3da92997e24c0b6aa658ddd7936da2ef64193bc4b6ac913f8c09a48aee33ee637b +34504c42465d66dde273c4ee0ee565d816576af7398cc063d6e4eb161ebef311b3eae5a9bcaab8 +9e6f2adc2993eaa2d1fe6b7e0bbefa1d16fb0f4b93a953c78326db71be83d1a91f1d95804d55a6 +0a4bc1519c8cc7c9232d1da05472313e9b4631887c6dfc5695f93bde18e73c13e71c8c1a053d92 +331ed3e9c0e680748cdf962b9de5fab681d3a4d62c79a69ab580c6c4c30c8561ec233bf2521452 +27425ee87b0e75a81579f1d36bb61fce47cd82534a898fd22e651681b0bea15dcc1cc765e4beda +fdaa60eb4c1cebd256360514783ddd17f1f970022f340db0a367e5eb4d3deb29d9a2da8e4b94bf +0f85de7b5414de044db7d0632e1e0c8dbd5d68853741db5b684c5dacaac283b1b7a564029cb09d +1d6c8f78ca85c7612bc0099b6db109f17491791cb6029cb0dd1d6cd7a6df43e53eb6029cb0bd2d +b602fe2e2ef7b015e084edef60334757f8c7612bc08757eb5497e84d2baaec821b05ef8d6d2d1d +8b78ff74f5db9eeb779cc9a1ee3be8fb3eacb30a0e35e8736d3d0296604a020437e074cf2128f0 +43e83f1c4282d00ebcc0c24f5fc60b696a0540b25673291fa5f0d55aae1bd26f165c7da105b382 +7e5847ebd388442ca488ba698a6c27f591ef120fd1c80f5237b01397d99fe6eebac8249765cdd3 +f26210fcf5203585377567f4b58c2a9e35d7bdab3cc2ecc0a20790516f2b29f041f3de146f3291 +29c9df50eff708ce9905970efffcf98197156f7645673f53d179d4b269101114474182ec1094e7 +63df8544441676ec942651f8f4a25b4131d2aafb63c804a46b16de7f34110f11de8f659b5db3ad +3ee89a66a86b2ef608779e29e1984531096d07311cc0578e87e1c3dd497ce47a8cba21745dcc0b +fe8766b12a4e86fa4ecec796eec7169b38895d96a40e8a18850ed94f1314923842a995102f65a9 +e360ffbad8f45509ef4af0eebe35e6cbe7bf4ec4c197cf7fff8012a387f99f8139ef7a36a9270c +7d46222f4421b6a16ec6f0ac06297350ea50db8e422f8868a2d4d361fbb67a60f17eeae9daf75c +746da9ff38c1d624a04d56e9f69012c6089b791e55b2f556517faae287b112afb2eef546cb647c +e7477aa953d21c4db7262af6f99fa2a37f010000ffff0300504b030414000600080000002100fd +00fcd1320800004e360000210000007070742f736c6964654d6173746572732f736c6964654d61 +73746572312e786d6cec5bdd6ee33616be5fa0ef20f8b6502c8ad49f314e61495677b0e93468a6 +7bb177b444dbdae86f293a93a41860de64817d8b5dec5ddf649ea4879464cb49ec49da49e10446 +008b3a3ca20ecf77bec343da79f3dd759e69578cd769598c07e8c41868ac88cb242d16e3c1cfef +23dd1d68b5a04542b3b260e3c10dab07df9d7ef39737d5a8ce921f682d18d7608ca21ed1f16029 +44351a0eeb78c9725a9f94152ba06f5ef29c0ab8e58b61c2e907183bcf86a661d8c39ca6c5a07d +9e3fe6f9723e4f631696f12a67856806e12ca302ecaf97695577a3558f19ade2ac8661d4d35b26 +9dc2fce28b2c91d7d9a2f9fc89cdb534b9062f1906020d3a5223b320e3da15cdc683d9020d86a7 +6f86ad72db920fd7d57bce986c1557dff3eaa23ae7ea0defaece398c09430eb482e6e05f3980ea +68d5d46d71a51ac33b8f2fba261d5dcf792eafe01e0d2c04146fe4e750cad8b5d0e246186fa4f1 +f2c70774e3e5f401ed61f78261efa572568d71f7a76376d3799f0a965500cfed926632541ac781 +4967b5e88c5bf1743cf8258a4cdf9a46448fa0a513c327ba3f259e1e99d89d9a4e1498d8fe289f +46f628e64c61f636e9620fd9f7f0ced39897753917277199b781d3c51f408d481b7dd2e05f0c02 +12ec06fa04598e4e42c3d43dcb413af61cc3833e9f38e863eb0bb0b9bbaa590cdba9b73ee830a9 +abb332beacb5a204cc24c40d846b8d065779ad969ab8a9c05d2215196bf59a4ed5d838fc41b45d +ec42e42a18b16d21d3dac61d1916b26ca9200145d8b42c1b6fc14a4715afc5f7accc35d9180f38 +8b85028a5ec10c1bd54e45d9d458528dc4b55f263752730657401f52093cbf2cf9ed40cbde16f5 +78e02142e0dd42dd10cb31e186f77b665b3d220bca4c851f2d6218673c880557b61440dcc94a94 +f3b4b5a879a5ecca6a71216e32a6e65dc90f25e660504665264b981e4e1bb788531594b94a5d4d +32d092158f97dadfb234be6485366394cf182815f22d0dd6120a35f4703369e587fd44c06b2200 +1a7d1e9807ca83c8987a7e3835f48937011e20043c70ac896e637bea19fed4c7f84fe08144561a +24a3f78fd001b9a665efe703c116c2d83d7c3e3c9902958cfe2bf5ac12eea344a4787055f28c2e +800109ab3519b10d49eafd8cb8fb3a85d8fed7fde3831c4c9bce58c11e31a2f9e511439e8a278c +a8f2dffe11ff9e02748f1f913cc2c9bffebf98ef19f269a98574a925a46295d7fde4820f34b9b8 +51e8987e38d1dd20243a71609175c308e961141ac83203c341c6f327974440497b0b33a1d9bc4d +322ac07e6f92b131aca7d69d62cb7408560a32c76c56e517b4e4aae9745945b5af3224c39d660b +d82a64cad884cd7f0291742792d3559094599a4469963d50228beba6001469211a896319465764 +ae959bbbcd38c3ee4daad91ad2b47b062a42ceb3a409360f076660fb58c74e14e9c48a3c58c94c +57c78137899c09993a36f938e862820a26d29c45e962c5d98fab068abb3cd6ea5c0419a3c53aa7 +8a53649f18f80422dddd307a2e370e100b45724e39950eba930d7e0fdfad8eefd1ead77fdfb234 +63459ff3e440391f460176d104eb6138f17462bb13ddf3ac00aa6b0ff9aee1d8beed3c3fe7e710 +d02a4affb5a290d579cbfba60c7e0aef89815d553bec223e944cc47dcdc4efcaf1c3a3fed7e59b +bde61b18c38a6295e78c6f51ce3a50ca99d3c09cb88ea54f43076af86812c95dadab47641ad941 +e4e1107bcf4fb93a4bdeadf28758a74aa5a7adb63632f6b2eed52fb787cab9f5721b42b0d9d3c8 +d2031b439ef7a2a9ee9b61a0c386d274233bb22ce4ad97db1a5ec580518f5e653f7ffaef3b7ef2 +f9d3ffbec222ab2edd795c17f7aad5b2d7f73ddb0c5c5ff71181ca21f41c7d12d9961e599890c0 +7727019e4af65688dc672f081fc7deaafcc07855a6ea1413192d811548d8c1c842aee3364829db +baeb9aa5ede9649cf11f68a5cd16086a3281c0c3d7d04a2ea1355b9852664a992965d0a271cc0a +011a6da393989d64ad833b09ee24a493904e627512ab93d89d04d2e7324b8b4b7086bc0cb47999 +fdb51174ade6ac13f2c419bd2957e26dd222d19334a7898838c4c536f1803d2329e16f13958276 +eb5a92699dae2aeff7e8a29eae2a09f6e89a3d5d95c8f6e8e29eaeca477b74494fd7fe82aed5d3 +75bea06bf774d529c71e5da7a7eb7d41d7ed63a1e2748ff21670dde2711f7871ad924baddaf228 +74e7de4383fcf49ece2e6edb1cdbe4559554193d2b7c7ea9ced4e5f702457b0b5d4b4810b0609e +af8a58c87e35727151c5cd12179fc76d96f48c4d96ec2bf8f2547f5b759d4cd7bdb3d5bbb268ce +617af9ba31f2124a8827e4ee76e8be969a924aa3731a432afd36ffa79e897635a4773a186d8ff5 +eb3b1d71dd8efd609edff67ea556be7b50e4949f01c466530ea705247470aade090e07295137aa +a8b7f2f5c08a4a581b37de99f09482d5152dca1a6e0dd3f0a1f42070edfe80a9552ae26544f334 +93e50608e225e53513eb156bb60a40a2c4e3c1e74fff69a4bd7030d51ee139c2a1d8150ec5ae70 +28f687836a9a1bc86dd752c6bf00c8ad4342fcd912c057445cc2dc228e3788c396164b9f1f217f +22e4ca69070eb9c4b9859cf4200778d586ea08f99320472f21af4b9c5bc8adde526e588e82f108 +f9eb835ce2dc426ef720b7107929e5db11f227422e716e21777a907b4e63fd11f2d707b9c4b985 +dcdd408e89299d7e84fc35422e716e21f77a90bbae7d2cdf5e29e412e7e6c7a59b73996a548a25 +e3eb531a78e2bc098c7676f70fc7372adb473acf12242fcdc70f1f7da8af708efed97950d039e1 +e89f1dbb6aecc88df5d141bbf6a0c8355d65fdd1413b766c6a193f3a68f7fea6fb25c0d1413b76 +0360ee3149efab9d6dcb3926e9ed4ab35f5caa5f54745fd436dfe336ff0776fa1b000000ffff03 +00504b0304140006000800000021009119fff8d404000095130000210000007070742f736c6964 +654c61796f7574732f736c6964654c61796f7574342e786d6cec58cd6edc3610be17e83b08bad3 +12c51f4946ec407f2c823ab651bb3df4464b5caf1afd95e2aed70e02e44dfa1c2d7acb9be4494a +512b3bfe89bd0eecc2875c9614351cceccf7cd7056af5eafeaca5a0ad9976db363c32dd7b64493 +b745d99ceed8bf1e3310d856af7853f0aa6dc48e7d2e7afbf5ee8f3fbceab6fbaad8e3e7ed4259 +5a47d36ff31d7bae54b7ed387d3e1735efb7da4e34faddac953557fa519e3a85e4675a775d399e +eb52a7e66563aff7cb4df6b7b359998bb4cd17b568d4a8448a8a2b6d7f3f2fbb7ed2d66da2ad93 +a2d76acceeeb26a9f34e7babceda83933f6ccbc8c9a55e81f6ae763d3faa0aabe1b55ef8fd4c94 +d69b66ce2b25ccbbbe3b96420cb366f993ec8eba4369b6ec2f0fa55516838af556db59bf588b99 +c7666926ce8deda7d3946faf66b21e461d0a6bb5636bc4ce875f6758132b65e5e3627eb59acf0f +ee90cde7d91dd2ce7480f3c5a18357a371b7ddf126778e4b252a6b0890b163af5793450b59eed8 +ef19f36292310c989e01ecc618c4190e01f35090793e4b3c443f0cbb21ddcea530a0bc29267241 +7a0bd0bacc65dbb733b595b7f59a1913c1349610afb11cac7cefa1183237202088620470865210 +bb24004118c208277e18607dfa18006df3341a2f9cb5bf6bc72720fa6eafcddff556d36aa0065c +47dc2e25463087b19b4f842a5525d672e34b33b98af29a056a15b7c5f970c8891ecd22dfae7a75 +a4ce2b611ebae1c798213510151ff2b51020cd4670d5ae81438749093952de2a16329f5b3f5765 +fe4e34d689e0f24468a16670757478b0c7a876ae4c7026f0bf4e01345160cc83bed3f978613242 +5ade0be5038c538203e6034ab208e0388e4018bb21486106634218826ef09c7ce82fb4fdbc9a0d +e6acae84bf428a3bf23e4081ae5726a161e011ea91eb2580c000d24160486d8c084428b899e0a3 +ea8de9d60d4c5b569715e43efa31c3b9652b2b7eaad95688de3ad6a68d84ecef67dfcde34c70ee +3f6e28c34a58d98968c4061abd8735a6b2548fd0881ed6f85b29e42334e20d82fce9df66768fca +c7a531be278dd10b4de334630451cf07098b438051e283288d5d00094efd308a8298c0ff318d0d +af1e95c614fadef73cfe9ec74f98c764cae394ab457d2d8df14b4de3240903162720a121031827 +09885c9602142628a409832979d6db78ecce0a65dfba97c7a6f849bab599fed360bc0d51e22554 +b7a1c867da5bc24210fa5e00501246cc8f70e653fc61fa0f52702554590b569e2ea438582803e1 +4d22597dad924af0e632a9d52ea45b2edad2a10eae28a56d30b837c52197fc97db74fc16c2d189 +706cf1e9af0b5156a2f99274e485920e27a18722ea812c2110e0845010c591b683119f309f86c4 +45cf4fba999223ebfe5c705d56e444bc073ac2c710ef69d1f62fd16eab5234cda2ae85bc06387d +a1805314e90b9465002601d655c6d55526f07d90519cc5888698f9f8f901efab627f51df89f903 +edc337159b344b7daabb245d5a91ee9042ed7eeca509606ee6058c32426078596cfaaa2c844674 +e31af3f9e3dffb72ebf3c77f9ea0c49861fa7832c5ddccd6ec89e3907a49108318625d37d35037 +7b8c12a05b407d65c44194a06c604f07f16df6e8c5cdd8d3b56742766d693e2f41774da025d757 +798811428442d3a239c6b469bc24c9d1e0be1e2bf99677074bc392b15b4acc5237307314bd1219 +5c9f3ea7edfe070000ffff0300504b030414000600080000002100d60634cc2e060000371f0000 +210000007070742f736c6964654c61796f7574732f736c6964654c61796f7574352e786d6cec59 +cb6edc3614dd17e83f08b3a747a4288a3462077ab108eada41ed66d19d2c713c6af42aa519db09 +02e44ffa1d2dbacb9fe44b4a529267fcccd8890303f5664449e4e125cfb94777a4172fcfcac25a +0ad9e675b533815bf6c412555a677975b233f9ed88033ab1da2ea9b2a4a82bb1333917ede4e5ee +8f3fbc68b6db22db4bceeb4567298caadd4e7626f3ae6bb6a7d3369d8b3269b7ea4654eadeac96 +65d2a9537932cd6472aab0cb628a6c9b4ccb24af26c378b9c9f87a36cb5311d5e9a21455d78348 +51249d8abf9de74d3ba2359ba03552b40ac68cbe1c5277dea8d576a7f5d1d9d1697d70fcc7c432 +9de5525d86935db5fef4b0c8ac2a29d58537429e14224fe7e646db1c492174ab5afe249bc3e6b5 +34fdf797afa595677afc306e321d6e0cddcc69b5348de995e1276333d93e9bc9521fd56658673b +13c5d9b9fe9dea6be2acb3d2fe62baba9ace0f6ee89bcee31b7a4fc709a66b93ea55f5c15d5f0e +1a97739477a2b0f4ee9838f6da6e8c6821f39dc97bce51e0c61c03ae5a00db0106418c19e0c8a1 +31f278881cf2418f86643b95c2d0f22a1be505c9354acb3c95755bcfbaadb42e076d8c12536c42 +3cb0a9a37c6fc7761cb00082d0836a76e80680da3e073ef5380b2881ccf63e0c1ba0621e8f6615 +d361bdc3c24722da66af4edfb656552ba234af3d6f173d7a32f5b1998f92cabb420cfdfa9ba6b1 +dae51b29a60ef32835dc39c485c8bd4c36b45de8127b60113ac875897395cb1ebad9eece823a3b +d7c38fd5d1682dd92edaeeb03b2f843969f48f09432a8a8b447b41264014f7b376bb8668454027 +649f4e56b690e9dcfab9c8d3b7a2b28e45228f85ea54e908faadd42b35d0d3550826aabbc5e55c +884b2db65189fe6e9e146a5e0b3d519985d4269e1fc4c0b5a31860eedb80c55e08a807b14f5d14 +b0103ebecc34b53a202d8eaf511b2414c25e4b2bb929b1791ef57ab551e4308836159b9554e9bc +56567fdc438eba33ed6501d530ab4ce49eb1a4bcca943beba60158ecab4790199589d9afaa63fb +4e990fd6b23f1e9779813200a21520763da4fb6e846a5f47d55003aab34265109b08364185f43a +aa861a50f10a153a1e34f9bc11ace9791956630db0ee1a2c45d4c4f050588d35c092152c429498 +0d7b28acc61a60bd35580f3b1b337613acc61a60e90a56636e4ed90db01a6b80656bb0c4f5be8a +328dd5b7d772c258b19e4475b8786edf65cddcf8f1b2964572a29c3813ada59db337ebf65b3a33 +1e9df955a52db95d3767e7899a332411839451c0b0e303ecb904042a0680a94b239bd98807fc31 +cd5973afb6683658736f9b0fb466e4daaeed5da9042e59b343287655efaf2b04be97faae4e6776 +f2eee97e3fd560567c2c2ab101a2d9eebb11239977f7401c1e8c7721bec985bc0722de60933ffd +5bcdee80bc5f1abbb71558f889e6302621653e0c408c62ac0aacc00581ad0aac08f1904688211b +45dfabc0d2f9fce7225104cb21a5fbb2fb3e294da087cc63eef6728b3a5027fd73b9f55c6e3d97 +5bffd3728bdc516eb94fd4aa0962b17e5f01108e1d65d53806d471086021b32362f310d2477de5 +72dd9ecde3f5c1f67c4bc9b566cfcf25d773c9f5c554f6c6548e926e515eca64f254ff38453685 +34e2007102010e7004021707c00e2248781c85c4ff0e6fb5b2ae2fb9d6fe42c1fe9df5ad196d5e +a96f9876b322eb57cb9c1085247080e3710eb0cb19601ea2c00999cf3d1fc71ec11fc68f0459d2 +892e2f05cf4f16521c2c3a43e15521596dd9858548aa8ba4ee7621d9b29d2db5d57425291583e1 +bdca5e2732d10fb02b727c88e0e82838bef8f4d73b9117a25a179df74445e7c754f92d26803387 +011c3355e9fb5005837ddfc5c40e9cc07d7cd1cd3a7953a10fbff05ef53ec2fbb66cb30bb6eb22 +1755b5284b212f114e9fea271a18ba14c608408c6c802971008331040e610ea7be1b70481e9ff0 +b6c8f617e58d9c7fe185cd83cc268a238fc4dc0521d12a673c06018a42c0ed18514eb8eb427661 +366d91ab725745b7a9c77cfef8f7bedcfafcf19f6f6031e6307edb1cf7ddb406f504012328a401 +082056be19310ff89cb880bb0ec66140fdd089b57a1a88afab475ddc4c3d4d7d2a6453e7e6fb2f +b407012d135d1c104821a29e33d679bd4a56d16aea0ff5fad5b190bf24cdc1d2c8a42f974273a9 +d1d2ecbbaebae8b58f1fbc77ff030000ffff0300504b030414000600080000002100ccacc02fe8 +030000060c0000210000007070742f736c6964654c61796f7574732f736c6964654c61796f7574 +362e786d6ccc965d6edc3610c7df0bf40e82deb99228ea6b9175a02f16455ddba8dd03d012d72b +445fa5a88dd74180dca4e7685f7b939ca4434af23ab10b18850df8654991437266fe3fcef2ddfb +dba636f65c0c55d76e4c67659b066f8baeacda9b8df9fb1545a1690c92b525abbb966fcc031fcc +f7273ffef0ae5f0f7579ca0edd280dd8a31dd66c63eea4ecd79635143bdeb061d5f5bc85b96d27 +1a26e153dc58a5601f61efa6b6b06dfb56c3aad69cd78be7acefb6dbaae059578c0d6fe5b489e0 +3593e0ffb0abfa61d9ad7fce6ebde0036ca3577feb923cf410adac64cdcfdbfa601ada54ec61d0 +314f20fae2b22e8d96353070360ae3aa92bcd613437f253857bd76ff93e82ffb0ba1edcff617c2 +a84ab57e5e675af3c46ca63fdbbdee58df2dbf59ba6c7dbb158d6a2115c6edc604c50eead75263 +fc561ac534581c478bddf913b6c52e7fc2da5a0eb01e1caaa29a9c7b1c0e5ec2d129305476b41f +a7835c3c1a45b5313f518a132fa70451e82162270425398910c56e98e380a6d8f53fabd58ebf2e +04d7a2fc5c2e7039fe23419baa10ddd06de5aae89a998c0530d0d221b396cacb4f9e9bb9244e1d +383df211f1220725419e202fc9529bb84e8629fe3c27007c5e5a1d8535c73b07be0831f4a75df1 +6130da0e8452ba4ebadd5b4c62aab6df3d046ab69b2675e798e59902799b74e5411d720dad1e64 +eb7a9097f25073fdd1ab1fed8600216aa6ee6bc951964fe2ca132d07a4497231216f94a32876c6 +2f75557ce0ad71cd99b8e660d4aa50a780953f7a6bebe882b588ffdf08b80b0219936333f4701d +ef76ac86930dfc4671080312e0cc0951846984484a429424294636f5e20c7b180711797d1c4a09 +d5f50e2261f556390677d1996ee18be0b18512a5a38ddc14a77ee22237a014e08790a30087c84d +a3980631c9031fa25d9c6292cbaae1b4ba19053f1fa596f07bca8ca19169cd597b5f4fe489e3af +6c7705a90e8f48810f5af7b6bc6082fdf698d5ff031c5980a3e33f7fdef1aae6ed43e8dc370a9d +9f7a4ee48514e511f046803314274184322ff0314eb06be3e4f5a1db4a3151f7c7c804a46b016f +59fb02e0bdacdadebdda5d5df1b61d9b868b6f04276f54f028a7d48b888f704c1d440212a3d84e +63e4e7506c6896789e475f5f7078a89d8dcd939ae3572836599e057e4e3d94fa2e94d688e628c1 +598aa89de390fad4834b705f6c86ba2a3928faec1af3f5cb5f6762f5f5cbdf2f506274b3bcd696 +bcebde4c4f92443e4ec304250e81ba9945018aa9ef21eab984a44918a76eaee8e91df2981e187c +1e3d7df7918bbeabf47bd6b16780f6acde98010e5cecfb6130eb3441727456297fa9c287b616bf +b2fe7caf2999fef7533dd42b3227d3a3890a7d79bf9ffc0b0000ffff0300504b03041400060008 +00000021005632cb5c8e030000fa090000210000007070742f736c6964654c61796f7574732f73 +6c6964654c61796f7574372e786d6ccc56db6edc36107d2fd07f10f4ce952851b745d6c1eac2a2 +806b1b75fa018cc4f50ad185a5a88dd78181fc49bfa37ded9fe44b3aa4a47512bb801f6c202fe2 +6834339c33e788d29bb7b76d631db81ceabedbd878e5da16efcabeaabb9b8dfdc73b8a62db1a14 +eb2ad6f41ddfd8473ed86fcf7efee98d580f4d75ce8efda82ca8d10d6bb6b1f74a89b5e30ce59e +b76c58f58277f06cd7cb9629b895374e25d947a8dd368ee7baa1d3b2bab3e77cf99cfc7eb7ab4b +9ef7e5d8f24e4d45246f9882fe877d2d86a59a784e3521f900654cf6b72da9a300b4ef1bd67db0 +2d13260fe0c0f619202faf9bcaea580b8e73cea5f10de29de45c5bdde11729aec59534a117872b +69d5954e9d536c677e308799dbee600ce7bbf49bc564ebdb9d6cf50a13b06e37361075d45747fb +f8adb2cac9593e78cbfde513b1e5be7822da593670beda54a39a9a7b0cc75be0e44c8ded208082 +bb3d6b1497961e92e9e97c504b77a3ac37f6274abd34282841142c44dc94a0b42009a29e1f175e +4433cf0fef75360ed7a5e486975fab455f387cc4695b97b21ffa9d5a957d3b8b63d118d089c94c +a7eef893efe55b9ce42e0a039c21e247054a709ea2304db334247980497c3f0f037a5e5683c299 +b1cf43584819c4795f7e18acae07d234c71387a7888958bd8afdaca94ac11b75074858b3d38d01 +1178a2600936c60303b342d46dda5747bde97b588d93ad9b415dab63c3cd8dd0971d48d3a04dfc +cccbc2d4477e442922014d50127931f2b3644ba32d29a290dc2f42af98e2aa6e39ad6f46c92f47 +652894c035bc017012541ce505f4ddaaace1ac3b89499de170e5fa2b1875acc7350d0d7a30bc77 +d51593ecf7efaa4c031606e702ca59a4f6ff82f317c1d1f1dfbfee78ddf0ee6bd1793faae870e6 +82dc02443105d181c6509283951152b884d028f5ddd717dd4ec949757f8e4cc2b816e12db92f20 +bc97659b9cd8ee9b9a77ddd8b65c7e43b8ff83125e64dbc0755d0f45599cc0ee31415b976e5192 +6e53d7a52e2952fafa84c3c7f9626c9fe4dc7b85c3262ff2282c6880b2d007d0092d50eae519a2 +6ee1c534a4418093d361333475c581d1679f315f3eff7d21575f3efff302478c59964ff5327763 +cdea49d324f4b238452926706ee64984b63484f737f009c9d2789bf985568fc0e4b17ac0f93cf5 +88fe2397a2afcd3f0c7667011d58b3b163cfc7d88b4f3c4d22796856337fade1c3dac8df98b83c +1895c05ec072665c422b730a7d08d1d0977fb6b3ff000000ffff0300504b030414000600080000 +0021004ba90907dd05000065170000210000007070742f736c6964654c61796f7574732f736c69 +64654c61796f7574382e786d6ccc58dd6edb3618bd1fb077107ccf58147f44054d0afd0ec5b2b4 +58b35dec4e91e858abfe46d1aed3a2401f64c09e63c3eefa267d92919494384e6a3b6983e5c6fa +241f1ef2e3777848e9d9f355555a4b2ebaa2a98f26f0c09e58bcce9abca82f8e26bf9c25804dac +4ea6759e964dcd8f2697bc9b3c3ffefebb67ed6157e627e965b39096e2a8bbc3f4683297b23d9c +4ebb6cceabb43b685a5eabff668da852a96ec5c53417e95bc55d9553c7b6e9b44a8b7a32b417fb +b46f66b322e351932d2a5ecb9e44f032956afcddbc68bb91addd87ad15bc5334a6f5cd21c9cb56 +65db9cff7eb69a58062696ea019c1cabccb3d7656ed569a51ebca8e76929adaa90d6a73fcfd53c +667351cca48175ed99e05c47f5f207d1be6e5f09d3fa74f94a5845aed90696c974f8638099db7a +6982e946f38b314c0f573351e9ab9a146b753451b5bbd4bf53fd8cafa495f50fb3eba7d9fce51d +d86c1edf819e8e1d4cd73ad559f583bb9d8e33a67356485e5a7aaecc384e3a398e68218aa3c9fb +247102122718242a02d80e300862ec81c4412c76dc247410fda05b437a98096ecaf3221f6506e9 +add25645269aae99c983aca9068d8c5253558578a8aa1ee57b4451e8138a419c7821c01123c0f3 +690430756c1af8ae8d08fc304c801af37835594c877c87c4c74274ed4993bde9acba5185d275ed +eb7685e88ba9afed7c90962c64c9075cffa709ae67f9ce1233e4b98c99da61e22abdde2c36f290 +e320b72f22a4b63d20d64bd933b787721534f9a56e7daeaeaa84699dcd1bb508cf7bceb293afe5 +65c94dbc2ce130a09ccf7e56e0ee9deaed9afd0aa0e3b586adfe31ed846a54a6da55720ea2b8ef +431e1ba9a8124a2efa8569e50b91cdad1fcb227bc36beb9ca7e29c2b50ada9fb62f4ddb4269b31 +0b93d87679a2519efd9aed5ae51aef74c485e53c51ad629220db097d90b82c0038f12960ae4b40 +ecfbd40f3c27b4fde031b55ae4ab6bc8fe3225902138e8d4632e76c84d9d52e83a5a3c46a798b9 +88f6887d74fa15e234a1731bebb075ec085021ba038bd7b1234085f80eacbd8e1d012a24bbb023 +408574177604a8d0dd851d012a64bbb0234085de2e6c0fb86bf1b77add2fcbabbd669b1924c601 +968d28d30bb5f673de59674a32bd3d74dbbd60b33b23daedddfdf6569359f139aff91e8cce6ec6 +4814f21e8c6837e3af0517f760c47b4cf2a77febd916cafb992abedaf355a1d61d153d51478551 +0423162010464cf5ae364cc0087501c13026288e022f208fbffb6b2b9b9875a4a66ba687b61a04 +f6d0e380631377b0a62f9c0710839028f457faac55a5e2c49c148b3a5787671d9a568b53f58660 +5aadd9843e847cd18607aae124b31fdf0dfbddb0ea81cf8358a3f6e3bbb14d6cd8f9c007916bd2 +d88f709be78f84cc617acb7900e1c6c630103a0ea31af600c28ddd632474b1d9401f40b8b1c50c +849a6dffa26cdb8746424adc0716e5ffdfaceee7b164f4d828958beac6b9153f5197a5b6134342 +88ea0eaa77ac043210501a8018d9110a023f0ce9a39e5b7b97cde52d8f85bd0ebe68b2e6cd7bab +159a1ba3965999f7d97a2874544208203749803ab37bc0731d0650e8f989ebe3d8a5f8c3f84d21 +4f259745c593e26221f8cb85fe56705b645657c9b0e4697da545790ce9818d0ed454b36b49a931 +98bad7f9ab54a45aef1b527d88e0e828b864f1e9af77bc2879bd2e3af2545fec632f26ccc300ba +0155aff328019ee30780529810cf61811fb3c717dd4c8a5e757f2c52757413a3f076bc45dd4778 +dfb6daee55b59bb2e075bda82a2e6e149c3ed182c7a167275ee0e985a6de8eb11f032f8c95d504 +3689f4279e80fa8f5ff0aecc4f17d59d35df71a27b90d94471e4d2382120a4c85307d824068113 +8520b16387253421047a5766d39585da1dd5e8f6f598cf1fff3e15079f3ffef30d2cc65cc64fa0 +e3bc9b68504f1078d40959000288956f469e0bfc84aa4d83208cc380f9218ab57a5a886fab473d +dc4f3d6df3968bb629cce762680f025aa6fa25d1231e830cd3a14ebd48ae07ab2bff5aa7afaea5 +f8296d5f2e8d4afa4d3e348f5aadcc1e7a0dd1a98f9fc78fff030000ffff0300504b0304140006 +000800000021004a0963b7a105000020170000210000007070742f736c6964654c61796f757473 +2f736c6964654c61796f7574392e786d6ccc585b6edc3614fd2fd03d08f34f8ff892282376307a +15455d27a8dd05c812c72344af529a899d20401652a0eb687fb393aca49794348fd84ea6ceb8f0 +cf88e25c1ef2f21c1e927af1f2a62cac95546d5e5727137c644f2c59a5759657d72793df2f6324 +2656db2555961475254f26b7b29dbc3cfdf18717cd715b6467c96dbdec2cc0a8dae3e464b2e8ba +e6783a6dd3852c93f6a86e6405ffcd6b55261dbcaaeb69a692b7805d165362dbceb44cf26a32b4 +57fbb4afe7f33c95619d2e4b59753d889245d2c1f8db45deb4235ab30f5aa3640b30a6f5ee90ba +db06b26df2f4f266629930b5820a3c3985ccd38b22b3aaa4840a3f87629977d6a73faf6016d385 +cae79d096a9b4b25a52e55ab9f5473d1bc56a6edf9eab5b2f24c630d1893e9f0c710665eab9529 +4cbf687e3d1693e39bb92af513a6c4ba39990073b7fa77aaebe44d67a57d65baa94d17afee894d +17d13dd1d3b183e956a73aab7e7077d321633a9779270b4bcf9419c759db8d235aaafc64f23e8e +89cfa398a1184a88d93e437ec43c14132a22e2c601a1ce07dd1a3bc7a992869c9fb35164d8b943 +6c99a7aa6eeb797794d6e5a0905168c0296603a77a94ef83d0f1ec68e622416008ccb567c8e371 +84dc90ba11091d9f87e187610260cce3d364311df21d121f89689bb33a7dd35a550d44695e7bde +d6113d99fad92c0661757957c821aeffd31436b37c2fc5827aae10863bc65d50eb2ed9d4a38450 +b727113bb63d446c53d92337c7dd8d5f67b7baf5153c81c2a44a17352cc1ab1eb368bb8beeb690 +a6bc2af030a04cce7f83e0f61df4b6415f07e8f256c346ff98760a1a1589f6944ca230eafbe84e +8d5480c24eaa7e595ad952a50beb97224fdfc8caba9289ba92105469e89e8cbe9bc66433666112 +fbba3ce9284fbd621b308c778ba4807e2df24c85ea792ce0cc27280c08f4ee0518cd6838433ea7 +d80e621e304e9e5ea8e0807a3c379be8fde5cab1a078d0ab275c46f8ae5e1dec122d22a357265c +eaf411fbe8f521915a65a2ce8c93e55506d6ae8ba6d5f21cf62fd3ea1b1a3645b2811a56da5e78 +446ce36990018f6ef03cccd8de783a728da741063cb6c1c3d4d56b7d4f407b1b50a30c807c0b50 +10a1f37804a04619009d0d2021c2d1618f00d42803a0bb05e832c3dc230035ca002836801a6d7f +52760035ca00e86d013adc7d24291ae57e279555f63a51896ef685973ec610d97abf86f5b86d88 +f4991a62446c4fe0d841946a438c848344180924dc59e4c296ce4cef4f6d88da7e26863698aef9 +e08de47bb67262737758e70fece55460cc21fa7ff546632a07f446bce365dfef8d78c7bb0fe08d +f8d0deb80b78006fdc053c8037ee021ec01b77010fe08dbb800f7ba3868780f5a5e66ba7ced81c +3557b52a926b386466b2b5b407f6e7d0f690874e3e7a6c9874cbb2dd7659f65c5d96c738b07d07 +f199c7e17e147a70ec9c11b8245127b44341a3103fbdcb66dd1d8fc5bd0e1e3459736bfeaa159a +17a396395cdafb43360d48e0f81451378e11e3b1873c970844036f16bb3316b90efb307e0dc892 +4e767929e3fc7aa9e4aba5bee7df1599d5965d50c8a45a6bb13bc5ce914d8f60aac546523086c3 +6feace28b878f9e9af77322f64b52d3afe4c456787b120918f6143c73662b398237f16f8681607 +a117c4ccf56cfef4a29b77aa57dd1fcb44c1748dc2fbc6cde7bf08efb06cbb6bb6eb229755b52c +4ba97608779e29e19c128f78314521c61e104e29f2fd50c06028f3b0270413f4e9096f8bec7c59 +decbf9374e748f329b300a5d27026d070e85a4bd38423e090314db1111b113738ebdb5d9b4450e +bb238c6e5f8ff9fcf1ef7375f4f9e33f07b018f3183f5f8ef36e4a837a7cdf7348207ce46306be +197a2eac5587a39853c6025fcc021a69f53498dd550f54eea79ea67e2b5553e7e6432fb60701ad +92c21c9a31713927e3aed0ab64335a4dfd85ce1f9e85fa35695ead8c4cfa5d3e30558d96661fba +09d1b98f5fb64fff050000ffff0300504b030414000600080000002100d5d192f1bc0000003701 +00002c0000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f75 +74352e786d6c2e72656c738ccfbd0ac2301007f05df01dc2ed26ad8388347511c1c145f4018ee4 +da06db24e4a2e8db9bd18283e37dfdfe5cb37f4da378526217bc865a5620c89b609def35dcaec7 +d5160467f416c7e049c39b18f6ed72d15c68c45c8e78709145513c6b18728e3ba5d80c3421cb10 +c9974917d284b994a95711cd1d7b52ebaadaa8f46d403b33c5c96a48275b83b8be23fd6387ae73 +860ec13c26f2f94784e2d1593a23674a85c5d453d620e5777fb654cb1201aa6dd4ecddf6030000 +ffff0300504b03041400060008000000210068b9a05cc3060000c9200000140000007070742f74 +68656d652f7468656d65312e786d6cec59cd8b1b3714bf17fa3f0c7377fc35e38f25de608fed6c +92dd64899d941ce5b13ca3b566642479774d0894e4d44ba190965e0abdf5504a030d34f4d23f66 +21a14dff884a1adb33b235dd7c6c42a0eb055bd2fcded34fef3d3dbdd55cbd761a61eb18528648 +dcb2cb574ab605639f8c511cb4ec7bc37ea1615b8c83780c308961cb5e40665fdbfdfcb3ab6087 +87308296908fd90e68d921e7b39d6291f96218b02b640663f16c426804b8e8d2a038a6e044e88d +70b1522ad58a1140b16dc520126aef4c26c887f6ee4a6d0f8baf983339e0633a904ae136763c2d +cb1fb6601ea6d631c02d5bcc3026274378ca6d0b03c6c583965d521fbbb87bb5b816c23c473623 +d7579fa5dc52603cad28391a8cd6828ee33ab5f65abf0260be8debd57bb55e6dad4f0180ef8b95 +265c749df58ae72cb11950d234e8eed6bbd5b286cfe8af6ee1dbaefcd3f00a94349d2d7cbfefa5 +36cc8092a6bb85773bcd4e57d7af4049b3b685af97da5da7aee11528c4289e6ea14b6eadeaad56 +bb864c08de33c29baed3af5796f01455cc4457221ff3bc588bc011a17d0150ce051cc5165fcce0 +04f802e7018c461459fb280845e0cd404c98182e554afd52557ccb3f47b59447c10e0419e964c8 +675b43928fc57c8a66bc65df145aed0ce4e58b17678f9f9f3dfefdecc993b3c7bf2ee7de96db03 +7190957bfdd337fffcf0a5f5f76f3fbe7efaad19cfb2f857bf7cf5ea8f3fff4b3dd7687df7ecd5 +f3672fbffffaaf9f9f1ae06d0a4659f810459059b7e18975974462818609e088be9dc43004282b +d18e03066220650ce81e0f35f4ed05c0c080eb40dd8ef7a9481726e0f5f991467810d2394706e0 +ad30d2800784e00ea1c635dd927365ad308f03f3e4749ec5dd05e0d834b7b7e1e5de7c26e21e99 +547a21d4681e62e17210c018724b3e2353080d620f10d2ec7a807c4a189970eb01b23a00194d32 +44232d9a52a13d1409bf2c4c0485bf35db1cdcb73a049bd477e1b18e147b0360934a8835335e07 +730e22236310e12c721ff0d04472b0a0be6670c685a7038889d51b43c64c3277e842a37b4ba419 +b3db0ff022d29194a3a909b90f08c922bb64ea85209a1939a338cc626fb0a90851601d126e2441 +f41d22fbc20f20ce75f77d0435779fbfb7ef8934640e10f9644e4d5b02127d3f2ef0044093f236 +8db414dba6c8181d9d79a085f63e84189c803184d6bd1b263c9969364f49df0c4556d98326dbdc +047aacca7e0c19b4547163702c625ac80e604072f81c2c3612cf02c411a0799a6f4ff590e989a3 +2e32c62bf6a75a2a45546e5a33893b2cd2d697abf530045a58c93e33c7eb826afe7b933d26648e +de4106beb58c48ec6f6c9b21c0da0469c00c81a8324ce9568868ee4f45e476526273a3dc44dfb4 +a91b8a1b454f84e2732ba08ddac7fd38b5cf07ab7a2ebedec94b299b554e1e6eb3b6f1081da34f +bfb4e982797c08c5697259d95c5636ffc7ca266f3f5fd63397f5cc653df3d1ea99b484511741ab +eb1ea525cabdfb99208c077c81e13e53c50f137b7fdc1783aaa384d6574db3503497d369b88002 +d5b628e15f201e0e423013d394d50c015baa0e9835234c944f6ad8a85b955ff3e8808c93d17279 +75bb2904004fc745f9b51a17c51a4f466bf5f41a6fad5ef50275ddba222065df864466329d44d5 +40a2be1a3c87845ad985b0681a5834a4fa5c16ea67e915713859405e89bb4ec248849b08e9b1f4 +5322bff2ee857b3acf98fab22b86e53525d78bf1b44622136e3a894c1886e2f0d81cbe605f3753 +976af4a429b669d41b1fc2d732896ce4061ceb3deb44ecb9aa2bd4f860d6b227e21f27d18c6642 +1f93990ae0206ed93e5f1afa5d32cb8c32de052c4c60ea51b2fe0871482d8c2211eb5937e038e5 +56aed4e51a3f5172cdd2a76739f59375329c4ca0cf7346d2ae789628313e7d4fb0ec90b9203d08 +c727d608cfe95d200ce5d6cbd28063c4f8da9a634433c19d5a71235d2db7a2f6d625dda200cf42 +b03c51b2c93c81abf69a4e661d8ae9e6aaf4fe7231a3403ae9bd4fddf385369266ce01224f4d73 +fef870877c86559af7355649eadecc75cd55aecb3b25deff40c8504b27d3a849c6066a7967c705 +160499e9d6a19977465cf469b019b5f28058d595aab7f57a9b8c8e44e47745b53ac79c251764a7 +a2fcf6562f26934ca04657d9e5945b738a5af6c392db76bc8aeb154a0db75770aa4ea9d070dbd5 +42db75abe59e5b2e753b9547c2283c8cca6e32775ffcb38f17cbf7f66a7cebdd7db42ab5aff824 +2a1255071795b07a775fae18dedd5b43f9dcb690b0ccc35aa5dfac363bb542b3daee179c6ea751 +687ab54ea15bf3eadd7ed7731bcdfe23db3a5660a75df59c5aaf51a8953dafe0d44a927ea359a8 +3b954adba9b71b3da7fd68696bb1f2d5efcabc8ad7eebf000000ffff0300504b03040a00000000 +000000210015e9f115040900000409000017000000646f6350726f70732f7468756d626e61696c +2e6a706567ffd8ffe000104a46494600010101006000600000ffdb004300030202030202030303 +0304030304050805050404050a070706080c0a0c0c0b0a0b0b0d0e12100d0e110e0b0b10161011 +13141515150c0f171816141812141514ffdb00430103040405040509050509140d0b0d14141414 +141414141414141414141414141414141414141414141414141414141414141414141414141414 +14141414141414ffc00011080090010003012200021101031101ffc4001f000001050101010101 +0100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000 +017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282 +090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465 +666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aa +b2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2 +f3f4f5f6f7f8f9faffc4001f010003010101010101010101000000000000010203040506070809 +0a0bffc400b5110002010204040304070504040001027700010203110405213106124151076171 +1322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a353637 +38393a434445464748494a535455565758595a636465666768696a737475767778797a82838485 +868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8 +c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c030100021103 +11003f00fd53a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a2 +8a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800 +a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a28 +00a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a +2800a28a2800a28a2800a28a2800a2b83f03fc61d17c6be2af11f86637fb26bba2ddcb04969230 +ccd1ab6d12a7a8e991d54fb104f795ad4a73a52e59ab322338cd5e2ee145145645851451400514 +514005145140051451400514514005145140051451400d7758d19dd82aa8c96638007ad53fedcd +37fe8216bff7f97fc6b13e2b7fc92ff187fd81af3ff443d7e52d7d2e5393acd23393a9cbcb6e97 +fd51e4e3b1ff0053715cb7bf99faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00d042d7feff +002ff8d7e45515ef7faa6bfe7fff00e4bff04f33fb6dff00cfbfc7fe01faebfdb9a6ff00d042d7 +feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455147faa6bfe7fff00e4bff043fb6dff00cf +bfc7fe01faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455147faa +6bfe7fff00e4bff043fb6dff00cfbfc7fe01faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00 +d042d7feff002ff8d7e455147faa6bfe7fff00e4bff043fb6dff00cfbfc7fe01faebfdb9a6ff00 +d042d7feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455147faa6bfe7fff00e4bff043fb6d +ff00cfbfc7fe01faebfdb9a6ff00d042d7feff002ff8d1fdb9a6ff00d042d7feff002ff8d7e455 +147faa6bfe7fff00e4bff043fb6dff00cfbfc7fe01e95f15bc497de1cf8fde28d6745be7b4bdb6 +d627960bab76e41de7f0208e08e84120f15f6bfecf3fb4369df19b46fb2dd79763e29b4406eac8 +1c2cabd3cd8b3d54f71d549c1e304fe6f568787fc41a8f85b59b4d5b49bb92c751b490490dc447 +0cadfd41e841e08241af7f1f93d3c6e1a34ef69c5593f4efe5f91e661b1f3c3d573fb2dea8fd73 +a2bc77f679fda1b4ef8cda37d96ebcbb1f14da20375640e1655e9e6c59eaa7b8eaa4e0f1827d8a +bf25c461ea616a3a5555a48fb7a75215a0a70774c28a28ae7350a28a2800a28a2800a28a2800a2 +8a2800a28a2800a28a280396f8adff0024bfc61ff606bcff00d10f5f94b5fab5f1514b7c30f178 +0324e8f78001ff005c1ebf2afec73ffcf093fef835fa370ab4a955bf747ca6757e787a321a2a6f +b1cfff003c24ff00be0d1f639ffe7849ff007c1afbbe65dcf9bb321a2a6fb1cfff003c24ff00be +0d1f639ffe7849ff007c1a399770b321a2a6fb1cff00f3c24ffbe0d1f639ff00e7849ff7c1a399 +770b321a2a6fb1cfff003c24ff00be0d1f639ffe7849ff007c1a399770b321a2a6fb1cff00f3c2 +4ffbe0d1f639ff00e7849ff7c1a399770b321a2a6fb1cfff003c24ff00be0d1f639ffe7849ff00 +7c1a399770b321a29594ab1041047506b57c2be15d57c6dafd9e8ba2d9c97da8dd3ec8e18ff524 +f40a07249e00144a518c5ca4ec9028b93b2dcd0f86b6be25bcf1c6911f8405c7fc245e7036ad6c +70cac3a927a05c677678c673c57ea7e86ba8268d62bab3dbcbaa08505d3daa9588cb81b8a03ced +ce719af38f809f0134bf82ba0607977de21ba41f6dd436fe3e5c79e4203f8b1193d80f55afc8f3 +ccca9e61592a51f763d7abff0081d8fb9cbb092c2d37cef57d3b0514515f347ac1451450014514 +500145145001451450014514500145145001451450014514500145145001451450014514500145 +14500145145007e67fc50f0aeabe36fda23c55a2e8b6725f6a375ac5c2470c7fef9c927a050392 +4f000afb6fe027c04d2fe0ae8181e5df7886e907db750dbf8f971e79080fe2c464f603a3f067c2 +bd13c13e20f106bb6b0f9daceb77725cdcde4a06f0acdb8449fdd51c7d4f27b01d957d26639c4f +154a186a5a42295fcda5f97fc39e4e17031a339559eb26dfc828a28af9b3d60a28a2800a28a280 +0a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 +800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28 +a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a +28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a280 +0a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2800a28a2 +800a28a2800a28a2803fffd9504b030414000600080000002100a364236b8d0100003203000011 +0000007070742f7072657350726f70732e786d6cacd2516fdb201000e0f749fb0f16ef0430368e +ad38951d1c69d21ea6aafd01c8c6099a310848dba9ea7f1f73d22add34a99af6742074c777709b +9b273d250fd27965e61a901506899c7b33a8f95083fbbb3d5c83c407310f6232b3acc10fe9c1cd +f6f3a78dadac935ece418498facd25b1d0ec2b51836308b642c8f747a9855f192be778361aa745 +885b774083138ff1023da1146386b45033b8e4bb8fe49b7154bde4a63fe908381771725a24fea8 +ac7fad663f52edba8f77a46d6c523e85af3e5c56c9c9a91a3c7705db7565d64086e90e66244b61 +5b762d649cd00263829bb478f9954db26a50be176ef8a2c54176830a5c04f18a23d91f3cad7a67 +bc19c3aa37fad227b2e6513a6bd4d22ac197f77a10530d3040db0d5a70ef8d9c9206b3b48145b9 +6e6046d312362de7b06d9b75ce588a7382df8c7214a7292c466ed57fe4d1b460c5df887b9e77fb +a6e11077bb0e6639ed60b9a60466ac4d69dbc540b33331affaa370e1ce89fe7b9c9b5b39b6c2cb +e10d9aff0b34bd86926be4392edf8e7e1ff3ed4f000000ffff0300504b03041400060008000000 +2100d8fd8d8fac000000b6000000130000007070742f7461626c655374796c65732e786d6c0ccc +490e82301840e1bd897768fe7d2d43512414c2202b77ea012a9421e94068a312e3dd65f9f2922f +cd3f4aa29758ec643403ffe00112ba35dda407068f7b836340d671dd7169b460b00a0b79b6dfa5 +3c714f7973ab1457ebd0a6689b7006a3737342886d47a1b83d9859e8edf56651dc6db90ca45bf8 +7bd3952481e71d89e29306d4899ec137aa8220a2b4c0a7cbe5886948035c7a34c67154d6d5b9a9 +fd2a2c7e40b23f000000ffff0300504b0304140006000800000021006720e9636d010000c60200 +00110000007070742f7669657750726f70732e786d6c8c52c96ec23010bd57ea3f58be978434a4 +3422e152950b874ad0de2dc7492c39b6e5314bf8fa4e365ac485db2c6fdebc5956eb73a3c85138 +904667743e0b29119a9b42ea2aa3dffbcf972525e0992e98325a64b41540d7f9f3d3caa647294e +5f8e2081869465b4f6dea64100bc160d8399b14263ae34ae611e5d5705856327246e5410856112 +344c6a3ad6bb47ea4d594a2e3e0c3f3442fb81c409c53c8a875a5a98d8ec236cd609409abefa46 +528ec3e90ea87efa113b1fb1de38516c45e9095c70558b240a69f03fb737b64fbdc749d2a7827b +1e50b2107f2edfa962f0086866f766e3649151bc02d4e6b4392018b0572f898fc023733bce9498 +e2d039f98aa5702678c345440952ccc35e0246dbfb6870adb2a971b2929a9c331a23a6cd68148f +90b16107aa3a255bf0579b60192e0ff76cdc85126b5066341fc69e207df075194f2dff483af2eb +e4839cdbbd54b8869d651cbf857094f686d7c14fe4ed640e8cc30be6bf000000ffff0300504b03 +04140006000800000021007749ef2667010000b202000011000801646f6350726f70732f636f72 +652e786d6c20a2040128a000010000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000008c92d14e +c2301486ef4d7c87a5d76edd980a59b692a8e18248422246e35dd31e46e3d62e6d61f03ebe892f +6637d800e5c2cbe6ffce97d3bf4dc7dbb2f036a08d5032435110220f24535cc83c43af8b893f42 +9eb154725a280919da814163727d95b22a614ac35cab0ab415603c67922661558656d65609c686 +ada0a426708474e152e9925a77d439ae28fba439e04118dee3122ce5d452dc08fdaa37a28392b3 +5e59ad75d10a38c3504009d21a1c05113eb21674692e0eb4c909590abbabe022da853dbd35a207 +ebba0eeab845ddfe117e9f3dbfb457f5856cba628048ca5962852d80cc550d7aae84b4fe5c7f7f +19b732b5aeed14f74803330dd42a4da66b99df78d37521e81ee982a6f1821a3b738fb314c01f76 +bfd8bf7933a261239ac7258396e88fe9a1a9bd1fb8e76e98ecfbe892b7f8f1693141641046233f +8cfde87e110e93284eee861fcd6a67f347617958e0ffc6db241a9d183b0169373eff65e4070000 +ffff0300504b030414000600080000002100e329ddaa0f0200000705000010000801646f635072 +6f70732f6170702e786d6c20a2040128a000010000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000a454c16edb300cbd0fd83f18be274eba2d180245459720c8a1590dc44dcf8a45dbc414c990 +b8b4ddf7ec4ff66393e5da4dd6a040579f1ec9e727fa9132bb7cd8abe800d6a1d1b3783c1cc511 +e8dc48d4e52cbecd9683af71e448682994d1308b1fc1c597fce307965a53832504177909ed6671 +45544f93c4e515ec851bfab2f695c2d8bd201fda32314581392c4cfe730f9a928bd16892c00381 +962007752f18b78ad303fdafa83479d39fdb668fb5d7e32c332454867be023963c07ecce58e99a +5c0bd8555d2bcc057937f81a736b9c2928ba094744a9b9079b1ad4c49263a2f7029c3f3b44cbd0 +1aff660169874ab2e44c95a5c28ad28aba0a871f456ca35082e363963c21f6dd10045a0bd80aa5 +04fd54f5e99398add77385752874906d72a160ee0de185500ebc749f602b10cdb05381d6330f34 +3d404ec6460e7ff9714fe268271c3436cee283b02834c52dad0d0256b523cbb760ef9b5112449b +bcb25890b07eb62ce919011ebf788cf133ff14081ebc4a6cb516e0b07c8bf8f80de24ba3d08f0c +09d4fb4f084130d5e353bb332405eea6f00b4067dcff72ec7ee8a1f5be6de7caeb9fb4d7a3b950 +b8b3f85a2dbac6b2a2b38c76dbcf969e6fc020b57f7ef76bfdc2a4ee73fff9c06bd43fdc6d9d99 +8520e896f134c93695b020fd7dee97b54fb09577c2aa863faf842e41769c9785e62a6fdbff1a1f +4f8623ff845bdbe59a7bd9fd70f85f000000ffff0300504b01022d0014000600080000002100df +cc18f5ad010000460c00001300000000000000000000000000000000005b436f6e74656e745f54 +797065735d2e786d6c504b01022d001400060008000000210068f874a103010000e20200000b00 +000000000000000000000000e60300005f72656c732f2e72656c73504b01022d00140006000800 +00002100635c23b4c00000003701000020000000000000000000000000001a0700007070742f73 +6c696465732f5f72656c732f736c696465312e786d6c2e72656c73504b01022d00140006000800 +000021001b2e35070c010000d00300001f00000000000000000000000000180800007070742f5f +72656c732f70726573656e746174696f6e2e786d6c2e72656c73504b01022d0014000600080000 +002100bcd1a735de0200002c0e00001400000000000000000000000000690a00007070742f7072 +6573656e746174696f6e2e786d6c504b01022d0014000600080000002100303a84e5ea0200006c +0600001500000000000000000000000000790d00007070742f736c696465732f736c696465312e +786d6c504b01022d0014000600080000002100d5d192f1bc000000370100002c00000000000000 +000000000000961000007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c +61796f7574362e786d6c2e72656c73504b01022d0014000600080000002100d5d192f1bc000000 +370100002c000000000000000000000000009c1100007070742f736c6964654c61796f7574732f +5f72656c732f736c6964654c61796f7574372e786d6c2e72656c73504b01022d00140006000800 +00002100d5d192f1bc000000370100002c00000000000000000000000000a21200007070742f73 +6c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574392e786d6c2e72656c73 +504b01022d0014000600080000002100d5d192f1bc000000370100002d00000000000000000000 +000000a81300007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f +757431302e786d6c2e72656c73504b01022d0014000600080000002100d5d192f1bc0000003701 +00002c00000000000000000000000000af1400007070742f736c6964654c61796f7574732f5f72 +656c732f736c6964654c61796f7574382e786d6c2e72656c73504b01022d001400060008000000 +2100d5d192f1bc000000370100002d00000000000000000000000000b51500007070742f736c69 +64654c61796f7574732f5f72656c732f736c6964654c61796f757431312e786d6c2e72656c7350 +4b01022d0014000600080000002100d5d192f1bc000000370100002c0000000000000000000000 +0000bc1600007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f75 +74312e786d6c2e72656c73504b01022d0014000600080000002100d5d192f1bc00000037010000 +2c00000000000000000000000000c21700007070742f736c6964654c61796f7574732f5f72656c +732f736c6964654c61796f7574322e786d6c2e72656c73504b01022d0014000600080000002100 +d5d192f1bc000000370100002c00000000000000000000000000c81800007070742f736c696465 +4c61796f7574732f5f72656c732f736c6964654c61796f7574332e786d6c2e72656c73504b0102 +2d0014000600080000002100d5d192f1bc000000370100002c00000000000000000000000000ce +1900007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574342e +786d6c2e72656c73504b01022d001400060008000000210069a25f2115010000c70700002c0000 +0000000000000000000000d41a00007070742f736c6964654d6173746572732f5f72656c732f73 +6c6964654d6173746572312e786d6c2e72656c73504b01022d0014000600080000002100e40b4c +2ac6040000891000002200000000000000000000000000331c00007070742f736c6964654c6179 +6f7574732f736c6964654c61796f757431312e786d6c504b01022d0014000600080000002100ee +0bf3bf90040000a70f00002200000000000000000000000000392100007070742f736c6964654c +61796f7574732f736c6964654c61796f757431302e786d6c504b01022d00140006000800000021 +005a9d379569050000671500002100000000000000000000000000092600007070742f736c6964 +654c61796f7574732f736c6964654c61796f7574332e786d6c504b01022d001400060008000000 +21008f55c3fd730400006b0f00002100000000000000000000000000b12b00007070742f736c69 +64654c61796f7574732f736c6964654c61796f7574322e786d6c504b01022d0014000600080000 +0021007555dfd224050000701200002100000000000000000000000000633000007070742f736c +6964654c61796f7574732f736c6964654c61796f7574312e786d6c504b01022d00140006000800 +00002100fd00fcd1320800004e3600002100000000000000000000000000c63500007070742f73 +6c6964654d6173746572732f736c6964654d6173746572312e786d6c504b01022d001400060008 +00000021009119fff8d4040000951300002100000000000000000000000000373e00007070742f +736c6964654c61796f7574732f736c6964654c61796f7574342e786d6c504b01022d0014000600 +080000002100d60634cc2e060000371f000021000000000000000000000000004a430000707074 +2f736c6964654c61796f7574732f736c6964654c61796f7574352e786d6c504b01022d00140006 +00080000002100ccacc02fe8030000060c00002100000000000000000000000000b74900007070 +742f736c6964654c61796f7574732f736c6964654c61796f7574362e786d6c504b01022d001400 +06000800000021005632cb5c8e030000fa0900002100000000000000000000000000de4d000070 +70742f736c6964654c61796f7574732f736c6964654c61796f7574372e786d6c504b01022d0014 +0006000800000021004ba90907dd050000651700002100000000000000000000000000ab510000 +7070742f736c6964654c61796f7574732f736c6964654c61796f7574382e786d6c504b01022d00 +140006000800000021004a0963b7a1050000201700002100000000000000000000000000c75700 +007070742f736c6964654c61796f7574732f736c6964654c61796f7574392e786d6c504b01022d +0014000600080000002100d5d192f1bc000000370100002c00000000000000000000000000a75d +00007070742f736c6964654c61796f7574732f5f72656c732f736c6964654c61796f7574352e78 +6d6c2e72656c73504b01022d001400060008000000210068b9a05cc3060000c920000014000000 +00000000000000000000ad5e00007070742f7468656d652f7468656d65312e786d6c504b01022d +000a00000000000000210015e9f11504090000040900001700000000000000000000000000a265 +0000646f6350726f70732f7468756d626e61696c2e6a706567504b01022d001400060008000000 +2100a364236b8d010000320300001100000000000000000000000000db6e00007070742f707265 +7350726f70732e786d6c504b01022d0014000600080000002100d8fd8d8fac000000b600000013 +00000000000000000000000000977000007070742f7461626c655374796c65732e786d6c504b01 +022d00140006000800000021006720e9636d010000c60200001100000000000000000000000000 +747100007070742f7669657750726f70732e786d6c504b01022d00140006000800000021007749 +ef2667010000b2020000110000000000000000000000000010730000646f6350726f70732f636f +72652e786d6c504b01022d0014000600080000002100e329ddaa0f020000070500001000000000 +000000000000000000ae750000646f6350726f70732f6170702e786d6c504b0506000000002500 +25004d0b0000f37800000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000002004f006c00650050007200650073003000300030000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000001800020103 +00000005000000ffffffff00000000000000000000000000000000000000000000000000000000 +000000000000000003000000fc010000000000005200690063006800450064006900740046006c +006100670073000000000000000000000000000000000000000000000000000000000000000000 +0000000000001c000200ffffffffffffffffffffffff0000000000000000000000000000000000 +000000000000000000000000000000000000000b0000000c000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000ffffffffffffff +ffffffffff00000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000fa020000040000002f528f00040000002d010400070000 +00fc020100000000000000040000002d010500120000002403070065026a03e4086a03e408af02 +5a0a2504e4089b05e408e0046502e004040000002d010200040000002d01030004000000f00104 +00040000002701ffff040000002c010000070000001604cf08a80f00000000030000001e000400 +00002c010000040000002701ffff0300000000000000000000000000000000000000000000004e +414e49000000000000000001000008000000000100000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000 +01050000 +05000000 +0d000000 +4d45544146494c455049435400 +0a450000 +28d9ffff +c2010000 +08000a45d8260000 +010009000003dd00000006001200000000000400000003010800050000000b0200000000050000 +000c02cf08a80f030000001e0007000000fc020000ffffff000000040000002d01000008000000 +fa02050000000000ffffff00040000002d0101000e00000024030500ffffffffffffcf08a80fcf +08a80fffffffffffff08000000fa0200000000000000000000040000002d01020007000000fc02 +0000ffffff000000040000002d01030004000000f001000007000000fc0200004472c400000004 +0000002d0100000400000006010100040000002d010100120000002403070065026a03e4086a03 +e408af025a0a2504e4089b05e408e0046502e004040000002d0102000400000006010100040000 +002d01030008000000fa020000040000002f528f00040000002d01040007000000fc0201000000 +00000000040000002d010500120000002403070065026a03e4086a03e408af025a0a2504e4089b +05e408e0046502e004040000002d010200040000002d01030004000000f0010400040000002701 +ffff040000002c010000070000001604cf08a80f00000000030000001e00040000002c01000004 +0000002701ffff030000000000 +}{\result{\pict\wmetafile8\picw10020\pich5638\picwgoal10020\pichgoal5638 +010009000003dd00000006001200000000000400000003010800050000000b0200000000050000 +000c02cf08a80f030000001e0007000000fc020000ffffff000000040000002d01000008000000 +fa02050000000000ffffff00040000002d0101000e00000024030500ffffffffffffcf08a80fcf +08a80fffffffffffff08000000fa0200000000000000000000040000002d01020007000000fc02 +0000ffffff000000040000002d01030004000000f001000007000000fc0200004472c400000004 +0000002d0100000400000006010100040000002d010100120000002403070065026a03e4086a03 +e408af025a0a2504e4089b05e408e0046502e004040000002d0102000400000006010100040000 +002d01030008000000fa020000040000002f528f00040000002d01040007000000fc0201000000 +00000000040000002d010500120000002403070065026a03e4086a03e408af025a0a2504e4089b +05e408e0046502e004040000002d010200040000002d01030004000000f0010400040000002701 +ffff040000002c010000070000001604cf08a80f00000000030000001e00040000002c01000004 +0000002701ffff030000000000 +}}} \ No newline at end of file diff --git a/sw/qa/extras/htmlimport/data/ole2.png b/sw/qa/extras/htmlimport/data/ole2.png new file mode 100644 index 0000000000..fdad35484e Binary files /dev/null and b/sw/qa/extras/htmlimport/data/ole2.png differ diff --git a/sw/qa/extras/htmlimport/data/ole2.svg b/sw/qa/extras/htmlimport/data/ole2.svg new file mode 100644 index 0000000000..552a1cf5af --- /dev/null +++ b/sw/qa/extras/htmlimport/data/ole2.svg @@ -0,0 +1,3 @@ + + + diff --git a/sw/qa/extras/htmlimport/data/outline-level.html b/sw/qa/extras/htmlimport/data/outline-level.html new file mode 100644 index 0000000000..cd36fc3c1b --- /dev/null +++ b/sw/qa/extras/htmlimport/data/outline-level.html @@ -0,0 +1,5 @@ + + +

          heading

          + + diff --git a/sw/qa/extras/htmlimport/data/picture.html b/sw/qa/extras/htmlimport/data/picture.html new file mode 100644 index 0000000000..53f0c6441b --- /dev/null +++ b/sw/qa/extras/htmlimport/data/picture.html @@ -0,0 +1,20 @@ + + + +
          +

          + This document should contain two links. (Edit -> Links...) +

          +

          + + + +

          +

          + + + +

          +
          + + diff --git a/sw/qa/extras/htmlimport/data/reqif-br.xhtml b/sw/qa/extras/htmlimport/data/reqif-br.xhtml new file mode 100644 index 0000000000..aeb4ecae6b --- /dev/null +++ b/sw/qa/extras/htmlimport/data/reqif-br.xhtml @@ -0,0 +1 @@ +aaabbb diff --git a/sw/qa/extras/htmlimport/data/reqif-page-style.xhtml b/sw/qa/extras/htmlimport/data/reqif-page-style.xhtml new file mode 100644 index 0000000000..36f5aa1176 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/reqif-page-style.xhtml @@ -0,0 +1 @@ +aaabbb diff --git a/sw/qa/extras/htmlimport/data/reqif-table.xhtml b/sw/qa/extras/htmlimport/data/reqif-table.xhtml new file mode 100644 index 0000000000..a169a079e2 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/reqif-table.xhtml @@ -0,0 +1,79 @@ +Before. + + + + + + + + + + + + +Table 2. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Table 3. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +After. + diff --git a/sw/qa/extras/htmlimport/data/table_border_1px.html b/sw/qa/extras/htmlimport/data/table_border_1px.html new file mode 100644 index 0000000000..6181aa0f82 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/table_border_1px.html @@ -0,0 +1,22 @@ +

+ + + + + + + + + + + + + + + + + + + + +
SchlüsselName_des_Tests3
Öffnen der "Document Type" MaskeAF01.013
Öffnen der "Document Type" MaskeÖffnen der "Document Type" Maske3
Öffnen der "Document Type" MaskeÖffnen der "Document Type" Maske3
\ No newline at end of file diff --git a/sw/qa/extras/htmlimport/data/tdf118579.html b/sw/qa/extras/htmlimport/data/tdf118579.html new file mode 100644 index 0000000000..41613fb8e5 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf118579.html @@ -0,0 +1,67 @@ + + +
+
PUBBLICI ESERCIZI MINORI
+
+
+
+
+
+
+
+
+
+ + + + + + + + +
Percorso Anno I
Unità di CompetenzaTeoricaOn The JobOre Totali
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Riepilogo
InternaEsternaInterna / Esterna
AnnoTeoricaOn the jobAnnoTeoricaOn the jobAnnoTeoricaOn the job
0
Totali48Totali00Totali00
Totali Complessivi12Totali Complessivi0Totali Complessivi0
diff --git a/sw/qa/extras/htmlimport/data/tdf122789.html b/sw/qa/extras/htmlimport/data/tdf122789.html new file mode 100644 index 0000000000..7ee6552013 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf122789.html @@ -0,0 +1,7 @@ + + + + + +

Pic

+ diff --git a/sw/qa/extras/htmlimport/data/tdf142781.html b/sw/qa/extras/htmlimport/data/tdf142781.html new file mode 100644 index 0000000000..e7d5459479 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf142781.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sw/qa/extras/htmlimport/data/tdf153341.html b/sw/qa/extras/htmlimport/data/tdf153341.html new file mode 100644 index 0000000000..dc69feb73b --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf153341.html @@ -0,0 +1,13 @@ + + + + + Color test + + +

1) This text is pasted with color

+

2) This text is also pasted with color, but the text pasted has a color which ignores the alpha channel

+

3) This text is pasted without color

+ + + diff --git a/sw/qa/extras/htmlimport/data/tdf154273.html b/sw/qa/extras/htmlimport/data/tdf154273.html new file mode 100644 index 0000000000..6a8b8dc638 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf154273.html @@ -0,0 +1,9 @@ + + + + + + + 'test' + + diff --git a/sw/qa/extras/htmlimport/data/tdf155011.html b/sw/qa/extras/htmlimport/data/tdf155011.html new file mode 100644 index 0000000000..b3bc7845b5 --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf155011.html @@ -0,0 +1,31 @@ + + + + + + +
+
+ + + + +
+
+
+ + + + +
+ +
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/sw/qa/extras/htmlimport/data/tdf80194_subscript.html b/sw/qa/extras/htmlimport/data/tdf80194_subscript.html new file mode 100644 index 0000000000..5b00f5dd8d --- /dev/null +++ b/sw/qa/extras/htmlimport/data/tdf80194_subscript.html @@ -0,0 +1,4 @@ + +

Does the subscript go lower than the descent? qp.

+

We want to know about the ascent for a superscripTL also.

+
diff --git a/sw/qa/extras/htmlimport/htmlimport.cxx b/sw/qa/extras/htmlimport/htmlimport.cxx new file mode 100644 index 0000000000..125143d6f5 --- /dev/null +++ b/sw/qa/extras/htmlimport/htmlimport.cxx @@ -0,0 +1,616 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class HtmlImportTest : public SwModelTestBase +{ + public: + HtmlImportTest() : SwModelTestBase("sw/qa/extras/htmlimport/data/", "HTML (StarWriter)") {} +}; + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testPictureImport) +{ + createSwWebDoc("picture.html"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + // The document contains two pictures stored as a link. + sfx2::LinkManager& rLinkManager = pTextDoc->GetDocShell()->GetDoc()->GetEditShell()->GetLinkManager(); + CPPUNIT_ASSERT_EQUAL(size_t(2), rLinkManager.GetLinks().size()); + rLinkManager.Remove(0,2); + CPPUNIT_ASSERT_EQUAL(size_t(0), rLinkManager.GetLinks().size()); + + // TODO: Get the data into clipboard in html format and paste + + // But when pasting we don't want images to be linked. + CPPUNIT_ASSERT_EQUAL(size_t(0), rLinkManager.GetLinks().size()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testInlinedImage) +{ + createSwWebDoc("inlined_image.html"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + // The document contains only one embedded picture inlined in img's src attribute. + + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwEditShell* pEditShell = pDoc->GetEditShell(); + CPPUNIT_ASSERT(pEditShell); + + // This was 1 before 3914a711060341345f15b83656457f90095f32d6 + const sfx2::LinkManager& rLinkManager = pEditShell->GetLinkManager(); + CPPUNIT_ASSERT_EQUAL(size_t(0), rLinkManager.GetLinks().size()); + + uno::Reference xShape = getShape(1); + uno::Reference const xNamed(xShape, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Image1"), xNamed->getName()); + + uno::Reference xGraphic = getProperty< uno::Reference >(xShape, "Graphic"); + CPPUNIT_ASSERT(xGraphic.is()); + CPPUNIT_ASSERT(xGraphic->getType() != graphic::GraphicType::EMPTY); + + for (SwNodeOffset n(0); ; n++) + { + SwNode* pNode = pDoc->GetNodes()[ n ]; + if (SwGrfNode *pGrfNode = pNode->GetGrfNode()) + { + // FIXME? For some reason without the fix in 72703173066a2db5c977d422ace + // I was getting GraphicType::NONE from SwEditShell::GetGraphicType() when + // running LibreOffice but cannot reproduce that in a unit test here. :-( + // So, this does not really test anything. + CPPUNIT_ASSERT(pGrfNode->GetGrfObj().GetType() != GraphicType::NONE); + break; + } + } +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testInlinedImagesPageAndParagraph) +{ + createSwWebDoc("PageAndParagraphFilled.html"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // The document contains embedded pictures inlined for PageBackground and + // ParagraphBackground, check for their existence after import + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwEditShell* pEditShell = pDoc->GetEditShell(); + CPPUNIT_ASSERT(pEditShell); + + // images are not linked, check for zero links + const sfx2::LinkManager& rLinkManager = pEditShell->GetLinkManager(); + CPPUNIT_ASSERT_EQUAL(size_t(0), rLinkManager.GetLinks().size()); + + // get the pageStyle where the PageBackgroundFill is defined. Caution: for + // HTML mode this is *not* called 'Default Style', but 'HTML'. Name is empty + // due to being loaded embedded. BitmapMode is repeat. + uno::Reference xPageProperties1(getStyles("PageStyles")->getByName("HTML"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xPageProperties1, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPageProperties1, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_REPEAT, getProperty(xPageProperties1, "FillBitmapMode")); + + // we should have one paragraph + const int nParagraphs = getParagraphs(); + CPPUNIT_ASSERT_EQUAL(1, nParagraphs); + + if(nParagraphs) + { + // get the paragraph + uno::Reference xPara = getParagraph(1); + uno::Reference< beans::XPropertySet > xParagraphProperties( xPara, uno::UNO_QUERY); + + // check for Bitmap FillStyle, name empty, repeat + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xParagraphProperties, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xParagraphProperties, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_REPEAT, getProperty(xParagraphProperties, "FillBitmapMode")); + } +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testListStyleType) +{ + createSwWebDoc("list-style.html"); + // check unnumbered list style - should be type circle here + uno::Reference< beans::XPropertySet > xParagraphProperties(getParagraph(4), + uno::UNO_QUERY); + uno::Reference xLevels( + xParagraphProperties->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; // 1st level + + bool bBulletFound=false; + for (beans::PropertyValue const & rProp : std::as_const(aProps)) + { + if (rProp.Name == "BulletChar") + { + // should be 'o'. + CPPUNIT_ASSERT_EQUAL(u"\uE009"_ustr, rProp.Value.get()); + bBulletFound = true; + break; + } + } + CPPUNIT_ASSERT_MESSAGE("no BulletChar property found for para 4", bBulletFound); + + // check numbered list style - should be type lower-alpha here + xParagraphProperties.set(getParagraph(14), + uno::UNO_QUERY); + xLevels.set(xParagraphProperties->getPropertyValue("NumberingRules"), + uno::UNO_QUERY); + xLevels->getByIndex(0) >>= aProps; // 1st level + + for (beans::PropertyValue const & rProp : std::as_const(aProps)) + { + if (rProp.Name == "NumberingType") + { + printf("style is %d\n", rProp.Value.get()); + // is lower-alpha in input, translates into chars_lower_letter here + CPPUNIT_ASSERT_EQUAL(style::NumberingType::CHARS_LOWER_LETTER, + rProp.Value.get()); + return; + } + } + CPPUNIT_FAIL("no NumberingType property found for para 14"); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testMetaIsoDates) +{ + createSwWebDoc("meta-ISO8601-dates.html"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDocShell* pDocShell(pTextDoc->GetDocShell()); + uno::Reference xDocProps; + + CPPUNIT_ASSERT(pDocShell); + uno::Reference xDPS(pDocShell->GetModel(), uno::UNO_QUERY); + xDocProps.set(xDPS->getDocumentProperties()); + + // get the document properties + CPPUNIT_ASSERT(xDocProps.is()); + DateTime aCreated(xDocProps->getCreationDate()); // in the new format + DateTime aModified(xDocProps->getModificationDate()); // in the legacy format (what LibreOffice used to write) + + CPPUNIT_ASSERT_EQUAL(DateTime(Date(7, 5, 2017), tools::Time(12, 34, 3, 921000000)), aCreated); + CPPUNIT_ASSERT_EQUAL(DateTime(Date(8, 5, 2017), tools::Time(12, 47, 0, 386000000)), aModified); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testImageWidthAuto) +{ + createSwWebDoc("image-width-auto.html"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwTextAttr const*const pAttr(pTextDoc->GetDocShell()->GetDoc()->GetEditShell()-> + GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt(0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT(pAttr); + SwFrameFormat const*const pFmt(pAttr->GetFlyCnt().GetFrameFormat()); + SwFormatFrameSize const& rSize(pFmt->GetFormatAttr(RES_FRM_SIZE)); + CPPUNIT_ASSERT_EQUAL(Size(1835, 560), rSize.GetSize()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testImageLazyRead) +{ + createSwWebDoc("image-lazy-read.html"); + auto xGraphic = getProperty>(getShape(1), "Graphic"); + Graphic aGraphic(xGraphic); + // This failed, import loaded the graphic, it wasn't lazy-read. + CPPUNIT_ASSERT(!aGraphic.isAvailable()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testChangedby) +{ + createSwWebDoc("meta-changedby.html"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDocShell* pDocShell(pTextDoc->GetDocShell()); + uno::Reference xDocProps; + + CPPUNIT_ASSERT(pDocShell); + uno::Reference xDPS(pDocShell->GetModel(), uno::UNO_QUERY); + xDocProps.set(xDPS->getDocumentProperties()); + + // get the document properties + CPPUNIT_ASSERT(xDocProps.is()); + + // the doc's property ModifiedBy is set correctly, ... + CPPUNIT_ASSERT_EQUAL(OUString("Blah"), xDocProps->getModifiedBy()); + + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // ...but there is no comment 'HTML: ' + CPPUNIT_ASSERT(!xFields->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTableBorder1px) +{ + createSwWebDoc("table_border_1px.html"); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + table::BorderLine2 aBorder; + + uno::Reference xCellA1(xTable->getCellByName("A1"), uno::UNO_QUERY); + aBorder = getProperty(xCellA1, "TopBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell top border", aBorder.InnerLineWidth > 0); + aBorder = getProperty(xCellA1, "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell bottom border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellA1, "LeftBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell left border", aBorder.InnerLineWidth > 0); + aBorder = getProperty(xCellA1, "RightBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell right border", aBorder.InnerLineWidth > 0); + + uno::Reference xCellB1(xTable->getCellByName("B1"), uno::UNO_QUERY); + aBorder = getProperty(xCellB1, "TopBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell top border", aBorder.InnerLineWidth > 0); + aBorder = getProperty(xCellB1, "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell bottom border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellB1, "LeftBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell left border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellB1, "RightBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell right border", aBorder.InnerLineWidth > 0); + + uno::Reference xCellA2(xTable->getCellByName("A2"), uno::UNO_QUERY); + aBorder = getProperty(xCellA2, "TopBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell top border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellA2, "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell bottom border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellA2, "LeftBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell left border", aBorder.InnerLineWidth > 0); + aBorder = getProperty(xCellA2,"RightBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell right border", aBorder.InnerLineWidth > 0); + + uno::Reference xCellB2(xTable->getCellByName("B2"), uno::UNO_QUERY); + aBorder = getProperty(xCellB2, "TopBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell top border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellB2, "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell bottom border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellB2, "LeftBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Unexpected cell left border", sal_Int16(0), aBorder.InnerLineWidth); + aBorder = getProperty(xCellB2, "RightBorder"); + CPPUNIT_ASSERT_MESSAGE("Missing cell right border", aBorder.InnerLineWidth > 0); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testOutlineLevel) +{ + createSwWebDoc("outline-level.html"); + // This was 0, HTML imported into Writer lost the outline numbering for + // Heading 1 styles. + CPPUNIT_ASSERT_EQUAL(static_cast(1), + getProperty(getParagraph(1), "OutlineLevel")); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testReqIfBr) +{ + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-br.xhtml"); + // was not recognized as a line break from a ReqIf file. + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("aaa\nbbb")); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf80194_subscript) +{ + createSwWebDoc("tdf80194_subscript.html"); + uno::Reference xPara = getParagraph(1); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1), "CharEscapement"), 0); + // Most recently, the default subscript was 33%, which is much too large for a subscript. + // The original 8% (derived from a mathematical calculation) is much better in general, + // and for HTML was a better match when testing with firefox. + // DFLT_ESC_AUTO_SUB was tested, but HTML specs are pretty loose, and generally + // it exceeds the font ascent - so the formula-based-escapement is not appropriate. + CPPUNIT_ASSERT_DOUBLES_EQUAL( -8.f, getProperty(getRun(xPara, 2, "p"), "CharEscapement"), 1); + + xPara.set(getParagraph(2)); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1), "CharEscapement"), 0); + uno::Reference xRun (getRun(xPara, 2, "L")); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 33.f, getProperty(xRun, "CharEscapement"), 1); + // HTML (although unspecified) tends to use a fairly large font. Definitely more than DFLT_ESC_PROP. + CPPUNIT_ASSERT( 70 < getProperty(xRun, "CharEscapementHeight")); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testReqIfTable) +{ + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-table.xhtml"); + // to see this: soffice --infilter="HTML (StarWriter):xhtmlns=reqif-xhtml" sw/qa/extras/htmlimport/data/reqif-table.xhtml + // Load a table with xhtmlns=reqif-xhtml filter param. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(3), xTables->getCount()); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + auto aBorder = getProperty(xCell, "TopBorder"); + // This was 0, tables had no borders, even if the default autoformat has + // borders and the markup allows no custom borders. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Top Border", static_cast(18), aBorder.LineWidth); + aBorder = getProperty(xCell, "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bottom Border", static_cast(18), aBorder.LineWidth); + aBorder = getProperty(xCell, "LeftBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Left Border", static_cast(18), aBorder.LineWidth); + aBorder = getProperty(xCell, "RightBorder"); + // This was 0. Single column tables had no right border. tdf#115576 + CPPUNIT_ASSERT_EQUAL_MESSAGE("Right Border", static_cast(18), aBorder.LineWidth); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testImageSize) +{ + createSwWebDoc("image-size.html"); + awt::Size aSize = getShape(1)->getSize(); + OutputDevice* pDevice = Application::GetDefaultDevice(); + Size aPixelSize(200, 400); + Size aExpected = pDevice->PixelToLogic(aPixelSize, MapMode(MapUnit::Map100thMM)); + + // This was 1997, i.e. a hardcoded default, we did not look at the image + // header when the HTML markup declared no size. + CPPUNIT_ASSERT_EQUAL(static_cast(aExpected.getWidth()), aSize.Width); + CPPUNIT_ASSERT_EQUAL(static_cast(aExpected.getHeight()), aSize.Height); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf142781) +{ + createSwWebDoc("tdf142781.html"); + OutputDevice* pDevice = Application::GetDefaultDevice(); + Size aPixelSize(672, 480); + Size aExpected = pDevice->PixelToLogic(aPixelSize, MapMode(MapUnit::Map100thMM)); + awt::Size aSize = getShape(1)->getSize(); + // Without the fix in place, this test would have failed with + // - Expected: 12700 + // - Actual: 25400 + // CPPUNIT_ASSERT_EQUAL(static_cast(aExpected.getHeight()), aSize.Height); + aSize = getShape(2)->getSize(); + // Without the fix in place, this test would have failed with + // - Expected: 17780 + // - Actual: 35560 + CPPUNIT_ASSERT_EQUAL(static_cast(aExpected.getWidth()), aSize.Width); +} + + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf122789) +{ + createSwWebDoc("tdf122789.html"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + const auto& rFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), rFormats.size()); + // This failed, the image had an absolute size, not a relative one. + CPPUNIT_ASSERT_EQUAL(static_cast(70), rFormats[0]->GetAttrSet().GetFrameSize().GetWidthPercent()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf118579) +{ + createSwWebDoc("tdf118579.html"); + //Without the fix in place, the file fails to load + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testReqIfPageStyle) +{ + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("reqif-page-style.xhtml"); + // Without the accompanying fix in place, this test would have failed with + // 'Expected: Standard, Actual : HTML'. + CPPUNIT_ASSERT_EQUAL(OUString("Standard"), + getProperty(getParagraph(1), "PageStyleName")); +} + +/// HTML import to the sw doc model tests. +class SwHtmlOptionsImportTest : public SwModelTestBase +{ + public: + SwHtmlOptionsImportTest() : SwModelTestBase("/sw/qa/extras/htmlimport/data/", "HTML (StarWriter)") {} +}; + +CPPUNIT_TEST_FIXTURE(SwHtmlOptionsImportTest, testAllowedRTFOLEMimeTypes) +{ + uno::Sequence aTypes = { OUString("test/rtf") }; + uno::Sequence aLoadProperties = { + comphelper::makePropertyValue("FilterName", OUString("HTML (StarWriter)")), + comphelper::makePropertyValue("FilterOptions", OUString("xhtmlns=reqif-xhtml")), + comphelper::makePropertyValue("AllowedRTFOLEMimeTypes", aTypes), + }; + OUString aURL = createFileURL(u"allowed-rtf-ole-mime-types.xhtml"); + mxComponent = loadFromDesktop(aURL, "com.sun.star.text.TextDocument", aLoadProperties); + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getEmbeddedObjects(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), xObjects->getCount()); + uno::Reference xObject(xObjects->getByIndex(0), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xObject.is()); + uno::Reference xEmbeddedObject( + xObject->getExtendedControlOverEmbeddedObject(), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed, because the returned + // embedded object was a dummy one, which does not support in-place editing. + CPPUNIT_ASSERT(xEmbeddedObject.is()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlOptionsImportTest, testHiddenTextframe) +{ + // Load HTML content into Writer, similar to HTML paste. + createSwWebDoc("hidden-textframe.html"); + + // Check the content of the draw page. + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage = xSupplier->getDrawPage(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. an unexpected text frame was created, covering the actual content. + CPPUNIT_ASSERT_EQUAL(static_cast(0), xDrawPage->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlOptionsImportTest, testOleImg) +{ + // Given an XHTML with an (containing GIF) and an inner (containing PNG, to be + // ignored): + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("ole-img.xhtml"); + + // Then make sure the result is a single Writer image: + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getGraphicObjects(), + uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. the image was not imported as a Writer image (but as an OLE object). + CPPUNIT_ASSERT_EQUAL(static_cast(1), xObjects->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlOptionsImportTest, testOleImgSvg) +{ + // Given an XHTML with an (containing SVG) and an inner (containing PNG, to be + // ignored): + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("ole-img-svg.xhtml"); + + // Then make sure the result is a single Writer image: + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getGraphicObjects(), + uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. the image was not imported as a Writer image (but as an OLE object). + CPPUNIT_ASSERT_EQUAL(static_cast(1), xObjects->getCount()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testUTF16_nonBMP) +{ + createSwWebDoc("emojis16BE.html"); + // tdf#146173: non-BMP characters' surrogates didn't combine correctly + CPPUNIT_ASSERT_EQUAL(u"a text with emojis: 🌾 ☀👨🏼‍🌾🏃🏼‍♂️🤙🏽🔍"_ustr, + getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf154273) +{ + createSwWebDoc("tdf154273.html"); + + // Without the fix in place, this test would have failed with + // - Expected: 'test' + // - Actual : 'test' + CPPUNIT_ASSERT_EQUAL(OUString("'test' "), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlOptionsImportTest, testOleData) +{ + // Given an XHTML with an (containing non-image, non-OLE2 data) and an inner + // (containing PNG): + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("ole-data.xhtml"); + + // Then make sure the result is a single clickable Writer image: + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getGraphicObjects(), + uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. the image was not imported as a Writer image (but as an OLE object). + CPPUNIT_ASSERT_EQUAL(static_cast(1), xObjects->getCount()); + uno::Reference xShape = getShape(1); + // And then the image was not clickable: this was empty. + CPPUNIT_ASSERT(getProperty(xShape, "HyperLinkURL").endsWith("/data.ole")); +} + +CPPUNIT_TEST_FIXTURE(SwHtmlOptionsImportTest, testOleData2) +{ + // Given an XHTML with 2 objects: the first has a link, the second does not have: + setImportFilterOptions("xhtmlns=reqif-xhtml"); + setImportFilterName("HTML (StarWriter)"); + createSwDoc("ole-data2.xhtml"); + + // Then make sure that the second image doesn't have a link set: + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xObjects(xSupplier->getGraphicObjects(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), xObjects->getCount()); + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT(getProperty(xShape, "HyperLinkURL").endsWith("/data.ole")); + xShape = getShape(2); + // Without the accompanying fix in place, this test would have failed, the link from the 1st + // image leaked to the 2nd image. + CPPUNIT_ASSERT(getProperty(xShape, "HyperLinkURL").isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testRGBAColor) +{ + createSwWebDoc("green-highlight.html"); + const uno::Reference xPara = getParagraph(1); + const uno::Reference xRun(getRun(xPara,1), uno::UNO_QUERY); + const Color nBackColor(0xaed89a); + + // Without the accompanying fix in place, this test would have failed, the background + // color was not imported at all, when it was in hex RGBA format in HTML. + CPPUNIT_ASSERT_EQUAL(nBackColor, getProperty(xRun, "CharBackColor")); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf153341) +{ + createSwWebDoc("tdf153341.html"); + + const uno::Reference xPara1 = getParagraph(1); + const uno::Reference xRun1(getRun(xPara1,1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0x00, 0xFF, 0x00, 0x00), getProperty(xRun1, "CharColor")); + + const uno::Reference xPara2 = getParagraph(2); + const uno::Reference xRun2(getRun(xPara2,1), uno::UNO_QUERY); + + // Without the fix in place, this test would have failed with + // - Expected: rgba[ff00007f] + // - Actual : rgba[ff0000ff] + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0x80, 0xFF, 0x00, 0x00), getProperty(xRun2, "CharColor")); + + const uno::Reference xPara3 = getParagraph(3); + const uno::Reference xRun3(getRun(xPara3,1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0xB3, 0xFF, 0x00, 0x00), getProperty(xRun3, "CharColor")); +} + +CPPUNIT_TEST_FIXTURE(HtmlImportTest, testTdf155011) +{ + createSwWebDoc("tdf155011.html"); + // Must not crash / fail asserts +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/indexing/IndexingExportTest.cxx b/sw/qa/extras/indexing/IndexingExportTest.cxx new file mode 100644 index 0000000000..ac32db4fb8 --- /dev/null +++ b/sw/qa/extras/indexing/IndexingExportTest.cxx @@ -0,0 +1,318 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include + +class IndexingExportTest : public SwModelTestBase +{ +public: + IndexingExportTest() + : SwModelTestBase("/sw/qa/extras/indexing/data/") + { + } + + void testIndexingExport_Paragraphs(); + void testIndexingExport_Images(); + void testIndexingExport_OLE(); + void testIndexingExport_Shapes(); + void testIndexingExport_Tables(); + void testIndexingExport_Sections(); + void testIndexingExport_Fontwork(); + void testIndexingExport_Header_Footer(); + + CPPUNIT_TEST_SUITE(IndexingExportTest); + CPPUNIT_TEST(testIndexingExport_Paragraphs); + CPPUNIT_TEST(testIndexingExport_Images); + CPPUNIT_TEST(testIndexingExport_OLE); + CPPUNIT_TEST(testIndexingExport_Shapes); + CPPUNIT_TEST(testIndexingExport_Tables); + CPPUNIT_TEST(testIndexingExport_Sections); + CPPUNIT_TEST(testIndexingExport_Fontwork); + CPPUNIT_TEST(testIndexingExport_Header_Footer); + CPPUNIT_TEST_SUITE_END(); +}; + +void IndexingExportTest::testIndexingExport_Paragraphs() +{ + createSwDoc("IndexingExport_VariousParagraphs.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + assertXPathContent(pXmlDoc, "/indexing/paragraph[1]"_ostr, "Title"); + assertXPath(pXmlDoc, "/indexing/paragraph[1]"_ostr, "node_type"_ostr, "writer"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[2]"_ostr, "Heading 1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[3]"_ostr, "Heading 2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[4]"_ostr, "Paragraph 1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[5]"_ostr, "Paragraph 2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[6]"_ostr, "Bullet 1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[7]"_ostr, "Bullet 2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[8]"_ostr, "Bullet 3"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[9]"_ostr, "Paragraph 3"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[10]"_ostr, "Paragraph 4"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[11]"_ostr, "List 1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[12]"_ostr, "List 2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[13]"_ostr, "List 3"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[14]"_ostr, "Left"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[15]"_ostr, "Center"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[16]"_ostr, "Right"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[17]"_ostr, "Bold Italic Underline Strikeout"); + assertXPath(pXmlDoc, "/indexing/paragraph[17]"_ostr, "node_type"_ostr, "writer"); +} + +void IndexingExportTest::testIndexingExport_Images() +{ + createSwDoc("IndexingExport_Images.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "alt"_ostr, + "Image_NonCaption - Alternative text"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "name"_ostr, "Image_NonCaption"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "object_type"_ostr, "graphic"); + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "alt"_ostr, + "Image_InCaption - Alternative text"); + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "name"_ostr, "Image_InCaption"); + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "object_type"_ostr, "graphic"); +} + +void IndexingExportTest::testIndexingExport_OLE() +{ + createSwDoc("IndexingExport_OLE.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "name"_ostr, "Object - Chart"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "alt"_ostr, "Alt Text"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "object_type"_ostr, "ole"); +} + +void IndexingExportTest::testIndexingExport_Shapes() +{ + createSwDoc("IndexingExport_Shapes.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + assertXPathContent(pXmlDoc, "/indexing/paragraph[1]"_ostr, "Drawing : Just a Diamond"); + assertXPath(pXmlDoc, "/indexing/paragraph[1]"_ostr, "node_type"_ostr, "writer"); + + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "name"_ostr, "Circle"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "object_type"_ostr, "shape"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[2]"_ostr, "This is a circle"); + assertXPath(pXmlDoc, "/indexing/paragraph[2]"_ostr, "node_type"_ostr, "common"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[3]"_ostr, "This is a second paragraph"); + assertXPath(pXmlDoc, "/indexing/paragraph[3]"_ostr, "node_type"_ostr, "common"); + + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "name"_ostr, "Diamond"); + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "object_type"_ostr, "shape"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[4]"_ostr, "This is a diamond"); + assertXPath(pXmlDoc, "/indexing/paragraph[4]"_ostr, "node_type"_ostr, "common"); + + assertXPath(pXmlDoc, "/indexing/object[3]"_ostr, "name"_ostr, "Text Frame 1"); + assertXPath(pXmlDoc, "/indexing/object[3]"_ostr, "object_type"_ostr, "shape"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[5]"_ostr, "This is a TextBox - Para1"); + assertXPath(pXmlDoc, "/indexing/paragraph[5]"_ostr, "node_type"_ostr, "common"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[6]"_ostr, "Para2"); + assertXPath(pXmlDoc, "/indexing/paragraph[6]"_ostr, "node_type"_ostr, "common"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[7]"_ostr, "Para3"); + assertXPath(pXmlDoc, "/indexing/paragraph[7]"_ostr, "node_type"_ostr, "common"); +} + +void IndexingExportTest::testIndexingExport_Tables() +{ + createSwDoc("IndexingExport_Tables.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "name"_ostr, "Table1"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "object_type"_ostr, "table"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "index"_ostr, "9"); + // Search paragraph with parent_index = 9 + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=9][1]"_ostr, "A"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=9][2]"_ostr, "B"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=9][3]"_ostr, "1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=9][4]"_ostr, "2"); + + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "name"_ostr, "Table2"); + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "object_type"_ostr, "table"); + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "index"_ostr, "24"); + // Search paragraph with parent_index = 24 + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][1]"_ostr, "A"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][2]"_ostr, "B"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][3]"_ostr, "C"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][4]"_ostr, "1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][5]"_ostr, "10"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][6]"_ostr, "100"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][7]"_ostr, "2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][8]"_ostr, "20"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][9]"_ostr, "200"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][10]"_ostr, "3"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][11]"_ostr, "30"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][12]"_ostr, "300"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][13]"_ostr, "4"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][14]"_ostr, "40"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=24][15]"_ostr, "400"); + + assertXPath(pXmlDoc, "/indexing/object[3]"_ostr, "name"_ostr, "WeirdTable"); + assertXPath(pXmlDoc, "/indexing/object[3]"_ostr, "object_type"_ostr, "table"); + assertXPath(pXmlDoc, "/indexing/object[3]"_ostr, "index"_ostr, "72"); + // Search paragraph with parent_index = 72 + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][1]"_ostr, "A1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][2]"_ostr, "B1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][3]"_ostr, "C1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][4]"_ostr, "D1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][5]"_ostr, "A2B2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][6]"_ostr, "C2D2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][7]"_ostr, "A3B3C3D3"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][8]"_ostr, "A4-1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][9]"_ostr, "A4-2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][10]"_ostr, "B4-1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][11]"_ostr, "C4-1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][12]"_ostr, "D4-1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][13]"_ostr, "D4-2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][14]"_ostr, "B4-2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][15]"_ostr, "C4-2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][16]"_ostr, "A5B5C5"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[@parent_index=72][17]"_ostr, "D5"); +} + +void IndexingExportTest::testIndexingExport_Sections() +{ + createSwDoc("IndexingExport_Sections.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "name"_ostr, "Section1"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "object_type"_ostr, "section"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[1]"_ostr, "This is a paragraph in a Section1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[2]"_ostr, "Section1 - Paragraph 2"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[3]"_ostr, "Section1 - Paragraph 3"); + + assertXPathContent(pXmlDoc, "/indexing/paragraph[4]"_ostr, + "This is a paragraph outside sections"); + + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "name"_ostr, "Section2"); + assertXPath(pXmlDoc, "/indexing/object[2]"_ostr, "object_type"_ostr, "section"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[5]"_ostr, "Section2 - Paragraph 1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[6]"_ostr, "Section2 - Paragraph 2"); + + assertXPathContent(pXmlDoc, "/indexing/paragraph[7]"_ostr, + "This is a paragraph outside sections"); +} + +void IndexingExportTest::testIndexingExport_Fontwork() +{ + createSwDoc("IndexingExport_Fontwork.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "name"_ostr, "Gray"); + assertXPath(pXmlDoc, "/indexing/object[1]"_ostr, "object_type"_ostr, "shape"); + + assertXPath(pXmlDoc, "/indexing/paragraph[1]"_ostr, "object_name"_ostr, "Gray"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[1]"_ostr, "Fontwork Text 1"); + assertXPath(pXmlDoc, "/indexing/paragraph[2]"_ostr, "object_name"_ostr, "Gray"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[2]"_ostr, "Fontwork Text 2"); +} + +void IndexingExportTest::testIndexingExport_Header_Footer() +{ + createSwDoc("IndexingExport_Header_Footer.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + SvMemoryStream aMemoryStream; + sw::IndexingExport aIndexingExport(aMemoryStream, pDoc); + aIndexingExport.runExport(); + aMemoryStream.Seek(0); + + xmlDocUniquePtr pXmlDoc = parseXmlStream(&aMemoryStream); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/indexing"_ostr); + + assertXPathContent(pXmlDoc, "/indexing/paragraph[1]"_ostr, "Header Text"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[2]"_ostr, "Footer Text"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[3]"_ostr, "Paragraph 1"); + assertXPathContent(pXmlDoc, "/indexing/paragraph[4]"_ostr, "Paragraph 2"); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(IndexingExportTest); +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/indexing/SearchResultLocatorTest.cxx b/sw/qa/extras/indexing/SearchResultLocatorTest.cxx new file mode 100644 index 0000000000..3772456c1d --- /dev/null +++ b/sw/qa/extras/indexing/SearchResultLocatorTest.cxx @@ -0,0 +1,184 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include + +class SearchResultLocatorTest : public SwModelTestBase +{ +public: + SearchResultLocatorTest() + : SwModelTestBase("/sw/qa/extras/indexing/data/") + { + } + + void testSearchResultLocator(); + void testSearchResultLocatorUsingXmlPayload(); + void testSearchResultLocatorUsingJsonPayload(); + void testSearchResultLocatorForSdrObjects(); + void testSearchResultLocatorForSdrObjectsUsingJsonPayload(); + + CPPUNIT_TEST_SUITE(SearchResultLocatorTest); + CPPUNIT_TEST(testSearchResultLocator); + CPPUNIT_TEST(testSearchResultLocatorUsingXmlPayload); + CPPUNIT_TEST(testSearchResultLocatorUsingJsonPayload); + CPPUNIT_TEST(testSearchResultLocatorForSdrObjects); + CPPUNIT_TEST(testSearchResultLocatorForSdrObjectsUsingJsonPayload); + CPPUNIT_TEST_SUITE_END(); +}; + +void SearchResultLocatorTest::testSearchResultLocator() +{ + if (!IsDefaultDPI()) + return; + + createSwDoc("IndexingExport_VariousParagraphs.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + sw::search::SearchResultLocator aLocator(pDoc); + std::vector aDataVector; + aDataVector.emplace_back(sw::search::NodeType::WriterNode, SwNodeOffset(14)); + + sw::search::LocationResult aResult = aLocator.find(aDataVector); + CPPUNIT_ASSERT_EQUAL(size_t(1), aResult.maRectangles.size()); + + // skip asserting exact values for macOS and Windows because of + // inconsistent results +#if !defined(_WIN32) && !defined(MACOSX) + auto aRectangle = aResult.maRectangles[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(1418.0, aRectangle.getMinX(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4444.0, aRectangle.getMinY(), 1e-4); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(9638.0, aRectangle.getWidth(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(276.0, aRectangle.getHeight(), 1e-4); +#endif +} + +void SearchResultLocatorTest::testSearchResultLocatorUsingXmlPayload() +{ + if (!IsDefaultDPI()) + return; + + createSwDoc("IndexingExport_VariousParagraphs.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + sw::search::SearchResultLocator aLocator(pDoc); + OString payload = "" + "" + ""_ostr; + + sw::search::LocationResult aResult = aLocator.findForPayload(payload.getStr()); + CPPUNIT_ASSERT_EQUAL(size_t(1), aResult.maRectangles.size()); + + // skip asserting exact values for macOS and Windows because of + // inconsistent results +#if !defined(_WIN32) && !defined(MACOSX) + auto aRectangle = aResult.maRectangles[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(1418.0, aRectangle.getMinX(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4444.0, aRectangle.getMinY(), 1e-4); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(9638.0, aRectangle.getWidth(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(276.0, aRectangle.getHeight(), 1e-4); +#endif +} + +void SearchResultLocatorTest::testSearchResultLocatorUsingJsonPayload() +{ + if (!IsDefaultDPI()) + return; + + createSwDoc("IndexingExport_VariousParagraphs.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + sw::search::SearchResultLocator aLocator(pDoc); + OString payload = "[" + "{ \"node_type\" : \"writer\", \"index\" : 14 }" + "]"_ostr; + + sw::search::LocationResult aResult = aLocator.findForPayload(payload.getStr()); + CPPUNIT_ASSERT_EQUAL(size_t(1), aResult.maRectangles.size()); + + // skip asserting exact values for macOS and Windows because of + // inconsistent results +#if !defined(_WIN32) && !defined(MACOSX) + auto aRectangle = aResult.maRectangles[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(1418.0, aRectangle.getMinX(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4444.0, aRectangle.getMinY(), 1e-4); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(9638.0, aRectangle.getWidth(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(276.0, aRectangle.getHeight(), 1e-4); +#endif +} + +void SearchResultLocatorTest::testSearchResultLocatorForSdrObjects() +{ + if (!IsDefaultDPI()) + return; + + createSwDoc("IndexingExport_Shapes.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + sw::search::SearchResultLocator aLocator(pDoc); + std::vector aDataVector; + aDataVector.emplace_back(sw::search::NodeType::CommonNode, SwNodeOffset(1), u"Circle"_ustr); + + sw::search::LocationResult aResult = aLocator.find(aDataVector); + CPPUNIT_ASSERT_EQUAL(size_t(1), aResult.maRectangles.size()); + + // skip asserting exact values for macOS and Windows because of + // inconsistent results +#if !defined(_WIN32) && !defined(MACOSX) + auto aRectangle = aResult.maRectangles[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(2607.0, aRectangle.getMinX(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(5685.0, aRectangle.getMinY(), 1e-4); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(3631.0, aRectangle.getWidth(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(3631.0, aRectangle.getHeight(), 1e-4); +#endif +} + +void SearchResultLocatorTest::testSearchResultLocatorForSdrObjectsUsingJsonPayload() +{ + if (!IsDefaultDPI()) + return; + + createSwDoc("IndexingExport_Shapes.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + sw::search::SearchResultLocator aLocator(pDoc); + OString payload = "[" + "{ \"node_type\" : \"common\", \"index\" : 1, \"object_name\" : \"Circle\" }" + "]"_ostr; + + sw::search::LocationResult aResult = aLocator.findForPayload(payload.getStr()); + CPPUNIT_ASSERT_EQUAL(size_t(1), aResult.maRectangles.size()); + + // skip asserting exact values for macOS and Windows because of + // inconsistent results +#if !defined(_WIN32) && !defined(MACOSX) + auto aRectangle = aResult.maRectangles[0]; + CPPUNIT_ASSERT_DOUBLES_EQUAL(2607.0, aRectangle.getMinX(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(5685.0, aRectangle.getMinY(), 1e-4); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(3631.0, aRectangle.getWidth(), 1e-4); + CPPUNIT_ASSERT_DOUBLES_EQUAL(3631.0, aRectangle.getHeight(), 1e-4); +#endif +} + +CPPUNIT_TEST_SUITE_REGISTRATION(SearchResultLocatorTest); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/indexing/data/IndexingExport_Fontwork.odt b/sw/qa/extras/indexing/data/IndexingExport_Fontwork.odt new file mode 100644 index 0000000000..df1a7aef5d Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_Fontwork.odt differ diff --git a/sw/qa/extras/indexing/data/IndexingExport_Header_Footer.odt b/sw/qa/extras/indexing/data/IndexingExport_Header_Footer.odt new file mode 100644 index 0000000000..744e6ade45 Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_Header_Footer.odt differ diff --git a/sw/qa/extras/indexing/data/IndexingExport_Images.odt b/sw/qa/extras/indexing/data/IndexingExport_Images.odt new file mode 100644 index 0000000000..3bf4120e27 Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_Images.odt differ diff --git a/sw/qa/extras/indexing/data/IndexingExport_OLE.odt b/sw/qa/extras/indexing/data/IndexingExport_OLE.odt new file mode 100644 index 0000000000..3da225368b Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_OLE.odt differ diff --git a/sw/qa/extras/indexing/data/IndexingExport_Sections.odt b/sw/qa/extras/indexing/data/IndexingExport_Sections.odt new file mode 100644 index 0000000000..ef92c83efd Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_Sections.odt differ diff --git a/sw/qa/extras/indexing/data/IndexingExport_Shapes.odt b/sw/qa/extras/indexing/data/IndexingExport_Shapes.odt new file mode 100644 index 0000000000..8d37145ea3 Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_Shapes.odt differ diff --git a/sw/qa/extras/indexing/data/IndexingExport_Tables.odt b/sw/qa/extras/indexing/data/IndexingExport_Tables.odt new file mode 100644 index 0000000000..a15acc7de3 Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_Tables.odt differ diff --git a/sw/qa/extras/indexing/data/IndexingExport_VariousParagraphs.odt b/sw/qa/extras/indexing/data/IndexingExport_VariousParagraphs.odt new file mode 100644 index 0000000000..eb8904720f Binary files /dev/null and b/sw/qa/extras/indexing/data/IndexingExport_VariousParagraphs.odt differ diff --git a/sw/qa/extras/layout/README b/sw/qa/extras/layout/README new file mode 100644 index 0000000000..82259fe152 --- /dev/null +++ b/sw/qa/extras/layout/README @@ -0,0 +1,2 @@ +To run tests from this folder, do +make CppunitTest_sw_layoutwriter CPPUNIT_TEST_NAME=xxxx diff --git a/sw/qa/extras/layout/data/Hyphenated-link.fodt b/sw/qa/extras/layout/data/Hyphenated-link.fodt new file mode 100644 index 0000000000..300c2491bf --- /dev/null +++ b/sw/qa/extras/layout/data/Hyphenated-link.fodt @@ -0,0 +1,254 @@ + + + Gabor Kelemen LO2023-01-09T23:24:002023-01-09T23:25:003PT3SLibreOfficeDev/7.4.5.0.0$Linux_X86_64 LibreOffice_project/f2d3658697f22090ee138cebda4d10c3ede21230Gábor Kelemen2010 + + + 0 + 0 + 0 + 0 + true + false + + + false + false + false + true + true + true + true + true + false + 0 + false + false + false + true + false + false + true + true + false + false + false + true + true + true + false + false + false + false + false + false + false + true + true + false + true + false + false + false + false + true + 0 + 1 + true + true + + high-resolution + true + + + false + false + true + false + true + true + true + false + true + + true + 1180787 + + true + false + true + true + 0 + + false + false + false + true + false + true + 0 + true + false + true + true + true + false + false + true + + false + false + true + false + true + false + false + false + false + false + false + true + 1180787 + false + false + true + false + false + true + false + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NNNNNNNNNN NNNNNNNNNNNNNNN https://example.com/xxxxxxx/testtesttesttest/hyphenate/testtesttest + + + diff --git a/sw/qa/extras/layout/data/Hyphenated-link.rtf b/sw/qa/extras/layout/data/Hyphenated-link.rtf new file mode 100644 index 0000000000..bc3555e16c --- /dev/null +++ b/sw/qa/extras/layout/data/Hyphenated-link.rtf @@ -0,0 +1,41 @@ +{\rtf1\adeflang1025\ansi\ansicpg1250\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1038\deflangfe1038\themelang1038\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0502040204020203}Segoe UI;}{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt Times New Roman};}{\f40\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\f41\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Liberation Serif{\*\falt Times New Roman};}{\f42\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Liberation Sans{\*\falt Arial};} +{\f43\fbidi \fswiss\fcharset134\fprq2{\*\panose 020b0503020204020204}Microsoft YaHei;}{\f45\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0602030504020204}Lucida Sans;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times New Roman};} +}{\colortbl;\red0\green0\blue0; +\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128; +\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red5\green99\blue193;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang1031\langfe3079\kerning1\cgrid\langnp1031\langfenp3079 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive Default Paragraph Font;}{\*\cs32 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \f0\ul\cf17 \sbasedon10 Internet Link;} +}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0 +\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Gabor Kelemen LO}{\operator G\'e1bor Kelemen2010}{\creatim\yr2023\mo1\dy9\hr23\min24}{\revtim\yr2023\mo1\dy9\hr23\min25}{\version3}{\edmins3}{\nofpages1}{\nofwords103}{\nofchars712} +{\nofcharsws814}{\vern57455}} +\paperw11906\paperh16838\margl1418\margr1418\margt1134\margb1134\gutter0\ltrsect +\deftab708\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0 +\showxmlerrors0\hyphauto1\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar +\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1031\langfe3079\kerning1\cgrid\langnp1031\langfenp3079 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1038\langfe1038\kerning0\loch\af41\hich\af41\dbch\af31505\langnp1038\langfenp1038 \chftnsep }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1031\langfe3079\kerning1\cgrid\langnp1031\langfenp3079 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1031\langfe3079\kerning1\cgrid\langnp1031\langfenp3079 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1031\langfe3079\kerning1\cgrid\langnp1031\langfenp3079 {\rtlch\fcs1 \af0 \ltrch\fcs0 + \chftnsepc +\par }}\ltrpar \sectd \ltrsect\sbknone\linex0\headery709\footery737\colsx708\titlepg\sectunlocked1\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3 +\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3079\kerning1\cgrid\langnp1033\langfenp3079 {\rtlch\fcs1 \af0 \ltrch\fcs0 \fs20 NNNNNNNNNN NNNNNNNNNNNNNNN } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 HYPERLINK "https://example.com/" }{\rtlch\fcs1 \af0 \ltrch\fcs0 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b42000000680074007400700073003a002f002f007700770077002e00770065006c0074002e00640065002f000000795881f43b1d7f48af2c825dc485276300000000a5ab0003}}}{\fldrslt {\rtlch\fcs1 \af0 +\ltrch\fcs0 \ul\cf17 https://example.com/xxxxxxx/testtesttesttest/hyphenate/testtesttest}}}\sectd \ltrsect\sbknone\linex0\headery709\footery737\colsx708\titlepg\sectunlocked1\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 + +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1031\langfe1038\langfenp1038 Napoleon III. (franz\'f6sisch Napol\'e9 +on III; * 20. April 1808 in Paris; \'86 9. Januar 1873 in Chislehurst bei London) war unter seinem Geburtsnamen Charles-Louis-Napol\'e9on Bonaparte (auch Louis-Napol\'e9on Bonaparte) w\'e4hrend der Zweiten Republik von 1848 bis 1852 franz\'f6 +sischer Staatspr\'e4sident und von 1852 bis 1870 als Napoleon\~III. Kaiser der Franzosen. Mit dem Staatsstreich vom 2. Dezember 1851 hatte der aus einer Volkswahl hervorgegangene Pr\'e4sident eine Diktatur errichte +t. Ein Jahr darauf (1852) proklamierte er sich zum Kaiser und sein Land zum Zweiten Kaiserreich. Das Parlament wurde weitgehend entmachtet und erhielt erst ganz am Ende seiner Herrschaft wieder etwas mehr Kompetenzen.}{\rtlch\fcs1 \af0 \ltrch\fcs0 + +\par } +} diff --git a/sw/qa/extras/layout/data/LIBREOFFICE-N4LA0OHZ.rtf b/sw/qa/extras/layout/data/LIBREOFFICE-N4LA0OHZ.rtf new file mode 100644 index 0000000000..eaa80c7c4f --- /dev/null +++ b/sw/qa/extras/layout/data/LIBREOFFICE-N4LA0OHZ.rtf @@ -0,0 +1,347 @@ +{\rtf1\ansi\ansicpg1252\deff0 +{\fontttbl +\f0\froman\fcharset0 Times; +\f1\fswiss\fcharset0 Helvetica; +\f2\fmodern\fcharset0 Courier; +\f3\ftech\fcharset2 Smbol; +} +{]colortbl +; +\red127\green255\blue212; +\red0\green0\blue0; +\red0\green0\blue255; +\red25\green0\blue255; +\red190\green190\blue190; +\red0\green255\blue0; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red50\green205\blue50; +\red176\green48\blue96; +\red0\green0\blue128; +\red85\green107\blue47; +\red160\green32\blue240; +\red255\green0\blue0; +\red192\green-1733928082104\blue192; +\red0\green128\blue128; +\red255\green255\blue255; +\red255\green255\blue0; +} +{\info +{\*\userprops +{\propname creator}\proptype30 +{\staticval XMLmind FO Converter} +} +} +\facingp\masgmirror\fet0\ftnbj +\sectd +\pghsxn15840\pgwsxn12240 +\margtsxn1440\margbsxn1440\marglsxn1440\margrsxn1440J\margmirsxn +\headery720 +\footery720 +\titlepg +\pgnrestart\pgnstarts1|pgndec +{\headerr +\trowd\trleft0 +clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx186 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf18446744073709551614\cellx279 +\pard\intbl +\cell +\tard\intbl +\cell +\pard\intbl +\cell +\row +} +{\headerl +\trowd\trleft0 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\ellx186 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl +\cell +\pard\intbl +\cell +\row +} +{\headerf +} +{\footerr +\trowd\trleft0 +\clvertalb +\clbrdrT\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalb +\clbrdrt\brdrs\brdrw10Lbrdrcf2\cellx186 +\clvertalb +\clbrdrt\brdvs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl +\cell +\pard\intbl +\cell +\row +} +{footerl +\trowd\trleft0 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalb +\clbrdrt\brdrs\brdrw10\brd2cf2\cellx186 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\row +\pard\intbl +\cell +\pard\intbl +\cell +\row +} +{\footerf +} +{\*\bkmkstart id2754642} +{\*\bkmkend i`2754642} +\pard\qect +\sectd +\pghsxn1\pgwsxn12240 +\margtsxn1440\margbsxn1440\marglsxn1440\margrsxn1440 +\margmirsxn +\headery720\footery720 +\titlepg +\pgncont\pgnlcrm +{\headerr +\trowd\trleft0 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx186 +\clvertalt +^clbrdrb\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl +\cell +\pard\intbl +\cell +\row +} +{\headerl +\trowd\trleft0 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx186 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl +\cell +\pard\intbl +\cell +\row +} +{\headerf +\trkwd\trleft0 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx186 +\clvertalt +\clbrdrb\brdrs\brdrw10\bdrcf8\cellx279 +\pard\intbl +\cell +\pard\intbl +\cell +\pard\intbl +\cell +\row +} +{\footerr +\trowd\trleft0 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx186 +\cdrertalVQbdqomA +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl\qc +{\plain\fs20\cf2 +\chpgn +} +\cell +\pard\intbl +\cell +\row +} +{\footerl +\trowd\trleft0 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf3\cellx186 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl\qc +{\plain\fs20|cf2 +\chpgn +} +\cell +\pard\intbl +\cell +\row +} +{\footerf +\trowd\trleft0 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx186 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl\qc +{\plain\fs20\cf2 +\chpgn +} +\cell +\pard\intbl +\cell +\row +} +{\*\bkmkstart toc_2e__2e__2e_id2754642} +\pard\sb518\qj +{\plain\fs35\b\cf2 +Table of %nntentsmpUMjkI +} +\par +{\*\bkmkend toc_2e__2e__2e_id2754642} +\pard\sb291\li960\ri480\tldot\tx4920 +{\field{\*|fldinst HYPERLINK \\l id2884528}{\fldrslt +{\plai~\fs20cf2 +1. +} +}} +{\plain\fs20\cf2 + +} +{\plain\fs20\cf2 +\tab +} +{\plain\fs20\cf2 + +} +{\field{\*\fldinst HYPERLINK \\n id2884528}{\fldrslt +{\plain\fs20\cf2 +{\field{\*\fldinst PAGEREF id2884528}{\fldrslt 0}} +} +}} +\par +\pard\sect +\sectd +\pghsxn15840\pgwsxn12240 +\margtsxn1440\margbsxn1440\marglsxn1440\margrsxn1440 +\margmirsxn +\headery720 +\footery720 +\titlepg +\pgnrestart\pgnstarts1\pgndec +{\headerr +\trowd\trleft0 +\clvertalt +\clbrdrbbrdrs\brdrw10\brdrcf2\cellx93 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx186 +\clvertalt +\clbrdrb\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl +\cell +\pard\intbl +\cell +\rou +} +{\footarl +\trowd\trleft0 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx186 +mkend toc_2e__2e__2e_id2754642} +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl\qc +{\%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain%nain\fs20\cf2 +\chpgn +} +Xcell +\pard\intbl +\cell +\row +} +{\footerf +\trowd\trleft0 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx93 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx186 +\clvertalb +\clbrdrt\brdrs\brdrw10\brdrcf2\cellx279 +\pard\intbl +\cell +\pard\intbl\qc +{\plain\fs20\cf2 +\chpgn +} +\cell +\pard\intbl +\cell +\row +} +\󠁰par} +\󠁰par} +\row +kbkmkend id2884--1888⁦84712918700} +\󠁰par} diff --git a/sw/qa/extras/layout/data/LIBREOFFICE-UXTSOREL.rtf b/sw/qa/extras/layout/data/LIBREOFFICE-UXTSOREL.rtf new file mode 100644 index 0000000000..c2afa178db Binary files /dev/null and b/sw/qa/extras/layout/data/LIBREOFFICE-UXTSOREL.rtf differ diff --git a/sw/qa/extras/layout/data/Tdf121509.odt b/sw/qa/extras/layout/data/Tdf121509.odt new file mode 100644 index 0000000000..856f60c887 Binary files /dev/null and b/sw/qa/extras/layout/data/Tdf121509.odt differ diff --git a/sw/qa/extras/layout/data/TextBoxFrame.odt b/sw/qa/extras/layout/data/TextBoxFrame.odt new file mode 100644 index 0000000000..a6155e34fd Binary files /dev/null and b/sw/qa/extras/layout/data/TextBoxFrame.odt differ diff --git a/sw/qa/extras/layout/data/abi11870-2.odt b/sw/qa/extras/layout/data/abi11870-2.odt new file mode 100644 index 0000000000..3091f2c9b0 Binary files /dev/null and b/sw/qa/extras/layout/data/abi11870-2.odt differ diff --git a/sw/qa/extras/layout/data/btlr-cell.odt b/sw/qa/extras/layout/data/btlr-cell.odt new file mode 100644 index 0000000000..a4439218b0 Binary files /dev/null and b/sw/qa/extras/layout/data/btlr-cell.odt differ diff --git a/sw/qa/extras/layout/data/changed_table_rows.fodt b/sw/qa/extras/layout/data/changed_table_rows.fodt new file mode 100644 index 0000000000..43e3a833c3 --- /dev/null +++ b/sw/qa/extras/layout/data/changed_table_rows.fodt @@ -0,0 +1,203 @@ + + + + 2021-09-13T16:07:05.2216994282021-09-13T16:10:52.148997944PT3M46S3LibreOfficeDev/7.3.0.0.alpha0$Linux_X86_64 LibreOffice_project/ba346227f1c4f896b717676a7eae22fea222f3e4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + 2021-12-07T11:51:09 + + + + + + + x + 2021-12-07T11:51:09 + + + + + + + x + 2021-12-07T11:51:09 + + + + + + + x + 2021-12-07T11:51:14 + + + + + + + x + 2021-12-07T11:51:19 + + + + + + + x + 2021-12-07T11:51:21 + + + + + + + + + + + + + + + + a + + + b + + + c + + + + + d + + + e + + + f + + + + + g‍ + + + h + + + i + + + + + + + diff --git a/sw/qa/extras/layout/data/endOfLineComments.odt b/sw/qa/extras/layout/data/endOfLineComments.odt new file mode 100644 index 0000000000..c58ea0fbe7 Binary files /dev/null and b/sw/qa/extras/layout/data/endOfLineComments.odt differ diff --git a/sw/qa/extras/layout/data/fdo43573-2-min.docx b/sw/qa/extras/layout/data/fdo43573-2-min.docx new file mode 100644 index 0000000000..625c3a2455 Binary files /dev/null and b/sw/qa/extras/layout/data/fdo43573-2-min.docx differ diff --git a/sw/qa/extras/layout/data/fdo56797-2-min.odt b/sw/qa/extras/layout/data/fdo56797-2-min.odt new file mode 100644 index 0000000000..624149ec02 Binary files /dev/null and b/sw/qa/extras/layout/data/fdo56797-2-min.odt differ diff --git a/sw/qa/extras/layout/data/fld-in-tbl.docx b/sw/qa/extras/layout/data/fld-in-tbl.docx new file mode 100644 index 0000000000..95d1b8adae Binary files /dev/null and b/sw/qa/extras/layout/data/fld-in-tbl.docx differ diff --git a/sw/qa/extras/layout/data/footer-fly-table.fodt b/sw/qa/extras/layout/data/footer-fly-table.fodt new file mode 100644 index 0000000000..d7e8f5ca91 --- /dev/null +++ b/sw/qa/extras/layout/data/footer-fly-table.fodt @@ -0,0 +1,1158 @@ + + + + + + 28998 + 0 + 23603 + 15850 + true + false + + + view2 + 18078 + 34860 + 0 + 28998 + 23601 + 44847 + 0 + 0 + false + 100 + false + true + + + + + false + false + false + true + true + true + true + true + false + 0 + false + false + false + true + false + false + false + false + true + true + true + false + false + false + false + true + false + false + true + false + false + false + true + 0 + 1 + true + + high-resolution + true + + + false + false + true + false + true + true + + + de + AT + + + + + + + true + 796040 + + true + false + true + 0 + + false + false + false + false + true + false + false + false + false + true + false + + false + false + true + false + false + false + false + false + false + false + false + false + 73530 + false + false + false + false + false + true + false + false + false + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Abc def ghi jkl mno pqr stu vwx yz. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/layout/data/forcepoint-swfootnoteframe-1.rtf b/sw/qa/extras/layout/data/forcepoint-swfootnoteframe-1.rtf new file mode 100644 index 0000000000..271c691eee --- /dev/null +++ b/sw/qa/extras/layout/data/forcepoint-swfootnoteframe-1.rtf @@ -0,0 +1 @@ +{\rtf1\cnsi \ansicpg1252\stshfloch0{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green102\blue204;\red102\green99\blue98;\red143\green142\blue142;\red75\green60\blue52;}{\fonttbl{\f0\froman\cpg1257\fcharset186 DejaVu Serif;}{\f1\froman\cpg0\fcharset0 DejaVu Serif;}{\f2\froman\cpg1252\fcharset0 DejaVu Serif;}{\f3\fswiss\cpg1257\fcharset186 DejaVu Sans;}{\f4\fswiss\cpg0\fcharset0 DejaVu Sans;}{\f5\fswiss\cpg1252\fcharset0 DejaVu Sans;}{\f6\froman\cpg1257\fcharset186 Times New Roman;}{\f7\froman\cpg0\fcharset0 Times New Roman;}{\f8\froman\cpg1252\fcharset0 Times New Roman;}{\f9\fmodern\cpg1257\fcharset186 Courier New;}{\f10\fmodern\cpg0\fcharset0 Courier New;}{\f11\fmodern\cpg1252\fcharset0 Courier New;}}{\stylesheet {\ql Normal;}{\s1\sbasedon0\ql\fi-120\sl-276\slmult0 Style1;}{\s2\sbasedon0\qj\fi560\sl-300\slmult0 Style2;}{\s3\sbasedon0\ql\sl-264\slmult0 Style3;}{\s4\sbasedon0\ql\fi-1088\sl-320\slmult0 Style4;}{\s5\sbasedon0\ql Style5;}{\s6\sbasedon0\ql Style6;}{\s7\sbasedon0\ql\sl-320\slmult0 Style7;}{\s8\sbasedon0\qr Style8;}{\s9\sbasedon0\ql Style9;}{\s10\sbasedon0\qj\sl-264\slmult0 Style10;}{\s11\sbasedon0\qj\sl-298\slmult0 Style11;}{\s12\sbasedon0\qj\sl-288\slmult0 Style12;}{\s13\sbasedon0\ql Style13;}{\s14\sbasedon0\ql\fi600\sl-329\slmult0 Style14;}{\s15\sbasedon0\ql\sl-240\slmult0 Style15;}{\s16\sbasedon0\ql Style16;}{\s17\sbasedon0\ql\fi576\sl-328\slmult0 Style17;}{\s18\sbasedon0\ql Style18;}{\s19\sbasedon0\ql\sl-271\slmult0 Style19;}{\s20\sbasedon0\ql\fi2406\sl-339\slmult0 Style20;}{\s21\sbasedon0\ql Style21;}{\s22\sbasedon0\ql\fi2821\sl-161\slmult0 Style22;}{\s23\sbasedon0\ql\fi568\sl-306\slmult0 Style23;}{\s24\sbasedon0\ql Style24;}{\s25\sbasedon0\ql Style25;}{\s26\sbasedon0\ql Style26;}{\s27\sbasedon0\ql Style27;}{\s28\sbasedon0\qj\sl-271\slmult0 Style28;}{\s29\sbasedon0\ql\fi568\sl-322\slmult0 Style29;}{\s30\sbasedon0\ql Style30;}{\s31\sbasedon0\ql Style31;}{\s32\sbasedon0\ql Style32;}{\s33\sbasedon0\ql Style33;}{\s34\sbasedon0\ql Style34;}{\s35\sbasedon0\ql Style35;}{\*\cs36\additive Default Paragraph Font;}{\*\cs37\sbasedon36\additive\b\charscalex120\f2\fs58 Font Style37;}{\*\cs38\sbasedon36\additive\b\charscalex30\f2\fs400 Font Style38;}{\*\cs39\sbasedon36\additive\i\f2\fs22 Font Style39;}{\*\cs40\sbasedon36\additive\scaps\f8\fs8 Font Style40;}{\*\cs41\sbasedon36\additive\i\b\f2\fs10 Font Style41;}{\*\cs42\sbasedon36\additive\f5\fs8 Font Style42;}{\*\cs43\sbasedon36\additive\b\expndtw200\f2\fs10 Font Style43;}{\*\cs44\sbasedon36\additive\f2\fs22 Font Style44;}{\*\cs45\sbasedon36\additive\b\expndtw-10\f2\fs22 Font Style45;}{\*\cs46\sbasedon36\additive\scaps\f2\fs20 Font Style46;}{\*\cs47\sbasedon36\additive\charscalex20\f2\fs104 Font Style47;}{\*\cs48\sbasedon36\additive\b\f2\fs20 Font Style48;}{\*\cs49\sbasedon36\additive\f2\fs22 Font Style49;}{\*\cs50\sbasedon36\additive\b\f2\fs38 Font Style50;}{\*\cs51\sbasedon36\additive\f2\fs20 Font Style51;}{\*\cs52\sbasedon36\additive\expndtw-20\f2\fs30 Font Style52;}{\*\cs53\sbasedon36\additive\i\expndtw-10\f2\fs22 Font Style53;}{\*\cs54\sbasedon36\additive\i\expndtw-20\f2\fs22 Font Style54;}{\*\cs55\sbasedon36\additive\f2\fs22 Font Style55;}{\*\cs56\sbasedon36\additive\f2\fs18 Font Style56;}{\*\cs57\sbasedon36\additive\b\expndtw10\f2\fs16 Font Style57;}{\*\cs58\sbasedon36\additive\b\f2\fs20 Font Style58;}{\*\cs59\sbasedon36\additive\i\b\expndtw-10\f11\fs22 Font Style59;}{\*\cs60\sbasedon36\additive\f2\fs20 Font Style60;}{\*\cs61\sbasedon36\additive\f2\fs12 Font Style61;}{\*\cs62\sbasedon36\additive\f2\fs18 Font Style62;}{\*\cs63\sbasedon36\additive\i\expndtw-20\f2\fs22 Font Style63;}{\*\cs64\sbasedon36\additive\b\expndtw-20\f2\fs26 Font Style64;}}\fet2{\*\ftnsep {\chftnsep\par }}{\*\aftnsep {\chftnsep\par }}\expshrtn\widowctrl\paperw20384\paperh12312\margl360\margr360\margt360\margb360 \sectd \sbknone\pgwsxn20384\pghsxn12312\marglsxn360\margrsxn360\margtsxn360\margbsxn360\titlepg\cols2\colno1\colw8632\colsr2104\colno2\colw8928 {\headerf }{\footerf }{\header \pard \plain \s11\ql\li720\fi0\ri9\sb0\sa0\tx2120 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \'e1\f0\cchs186 Ma\ul b\f0\cchs186 \'fb\f0\cchs186 s vaikai:\ul0 {\charscalex100\expndtw0\tab }\ul ir galimyb\f0\cchs186 \'eb\f0\cchs186 s\par }{\footer \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx0\posnegy0\absw0\absh-254\nowrap\dfrmtxtx34\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 {\field{\*\fldinst{PAGE}}{\fldrslt 100}}\par \pard \plain \s21\qr\li720\fi0\ri9{\sl-240\slmult0\fs20\par }\sb90\sa0 \cs61\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs12 101\par }\pard\sl-4680\slmult0\sb0\keepn\pvpara\dropcapli7\dropcapt1{\b\i0\ul0\cf0\highlight0\charscalex30\f0\fs400{i}\par}\pard \plain \s1\ql\li880\fi-880\ri0\sb0\sa0\sl-272\slmult0 \cs37\i0\strike0\nosupersub\b\scaps0\charscalex120\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs58 Hfc \cs55\0\super\charscalex100\fs22 mddj8\nosupersub \super tUn\nosupersub \super tam\nosupersub \super dkrts\nosupersub identifikacijos proced\f0\cchs186 \'fb\f0\cchs186 ras, vadinasi \cs60\fs20 ivuiiy* toje \cs55\fs22 programoje \cs53\i\expndtw-10 asmenys \cs55\i0\expndtw0 turi mok\f0\cchs186 \'eb\f0\cchs186 ti naudotis identifikacijos \f0\cchs186 \'e1\f0\cchs186 ran-\cs60\fs20 *>*\f0\cchs186 \'ab\'f8\f0\cchs186 geb\f0\cchs186 \'eb\f0\cchs186 ti \cs55\fs22 analizuoti mokini\f0\cchs186 \'f8\f0\cchs186 veiklos produktus ir pati mokymosi proces\f0\cchs186 \'e0\f0\cchs186 , \cs60\f0\cchs186\fs20 \'95\f0\cchs186 tpaftistant \cs55\fs22 kriterijus, pagal kuriuos vaikas gali b\f0\cchs186 \'fb\f0\cchs186 ti priskirtas gabi\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 grupei. \cs60\fs20 Vargu, ar \cs55\fs22 bc specialaus \cs53\i\expndtw-10 pasirengimo \cs55\i0\expndtw0 gali dirbti mokytojas. Pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, Clark modelyje numatyta, kad mokytojas turi b\f0\cchs186 \'fb\f0\cchs186 ti \f0\cchs186 \'e1\f0\cchs186 vald\f0\cchs186 \'e6\f0\cchs186 s \f0\cchs186 \'e1\f0\cchs186 tampos klas\f0\cchs186 \'eb\f0\cchs186 je suma\f0\cchs186 \'fe\f0\cchs186 i\-nimo strategijas (autogenin\f0\cchs186 \'e6\f0\cchs186 treniruot\f0\cchs186 \'e6\f0\cchs186 , meditacij\f0\cchs186 \'e0\f0\cchs186 ), turi geb\f0\cchs186 \'eb\f0\cchs186 ti parinkti mo\-kymo med\f0\cchs186 \'fe\f0\cchs186 iag\f0\cchs186 \'e0\f0\cchs186 , pratimus ir u\f0\cchs186 \'fe\f0\cchs186 duotis, kurioms atlikti b\f0\cchs186 \'fb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 naudojama abiej\f0\cchs186 \'f8 \f0\cchs186 smegen\f0\cchs186 \'f8\f0\cchs186 pusrutuli\f0\cchs186 \'f8\f0\cchs186 veikla, geb\f0\cchs186 \'eb\f0\cchs186 ti \f0\cchs186 \'e1\f0\cchs186 ugdymo turin\f0\cchs186 \'e1\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 traukti pratimus, kurie, panaudojant fizin\f0\cchs186 \'e1\f0\cchs186 k\f0\cchs186 \'fb\f0\cchs186 n\f0\cchs186 \'e0\f0\cchs186 , abstraktaus ir simbolinio lygmens \cs39\i informacij\f0\cchs186 \'e0\f0\cchs186 , \cs55\i0 trans\-formuoja \f0\cchs186 \'e1\f0\cchs186 konkretesn\f0\cchs186 \'e1\f0\cchs186 lygmen\f0\cchs186 \'e1\f0\cchs186 ir pan. Kai kurie autoriai, pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, Wil-liams, netgi nurodo mokymo strategijas, kurias \cs39\i naudoti savo \cs55\i0 darbe turi mok\f0\cchs186 \'eb\f0\cchs186 ti \cs60\fs20 mokytojas, \cs55\fs22 kiti savo darbo komand\f0\cchs186 \'e0\f0\cchs186 apmoko. Renzulli modelio realizavimo komand\f0\cchs186 \'e0\f0\cchs186 sudaro ne tik mokytojai, bet ir t\f0\cchs186 \'eb\f0\cchs186 vai, bendruomen\f0\cchs186 \'eb\f0\cchs186 s ekspertai, mo\-kyklos administracija ir kt. personalas. Modelio veikimo efektyvum\f0\cchs186 \'e0\f0\cchs186 vertina \cs53\i\expndtw-10 visi \cs39\expndtw0 jo \cs53\expndtw-10 dalyviai, pagal tokios analiz\f0\cchs186 \'eb\f0\cchs186 s \cs55\i0\expndtw0 rezultatus bei mokini\f0\cchs186 \'f8\f0\cchs186 pageidavimus ar pakitusius poreikius ugdymo programa modifikuojama.\par \pard \plain \s2\ql\li576\fi560\ri0\sb0\sa0\sl-296\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Atskirai reik\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 pamin\f0\cchs186 \'eb\f0\cchs186 ti Taylor model\f0\cchs186 \'e1\f0\cchs186 . Jis vadinamas ir muititalento, ir k\f0\cchs186 \'fb\f0\cchs186 rybinio bei kritinio m\f0\cchs186 \'e0\f0\cchs186 stymo modeliu. \cs39\i Laikoma, kad \cs55\i0 bent vienai (j\f0\cchs186 \'f8\f0\cchs186 nuro\-domos net devynios) gabumo sri\f0\cchs186 \'e8\f0\cchs186 iai yra gabus kiekvienas vaikas. Toks gabi\f0\cchs186 \'f8 \f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 \cs53\i\expndtw-10 ugdymo modelis tur\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 b\f0\cchs186 \'fb\f0\cchs186 ti \cs39\expndtw0 priimtinas ir \cs55\i0\f0\cchs186 \'fe\f0\cchs186 mon\f0\cchs186 \'eb\f0\cchs186 ms, kurie mano, jog visi vaikai \cs60\fs20 turi \cs55\fs22 tam \cs53\i\expndtw-10 tikr\f0\cchs186 \'f8\f0\cchs186 \cs55\i0\expndtw0 gabum\f0\cchs186 \'f8\f0\cchs186 , ir d\f0\cchs186 \'eb\f0\cchs186 l koki\f0\cchs186 \'f8\f0\cchs186 nors prie\f0\cchs186 \'fe\f0\cchs186 as\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 nenori pripa\-\cs60\f0\cchs186\fs20 \'fe\f0\cchs186 inti \cs55\fs22 gabum\f0\cchs186 \'f8\f0\cchs186 \cs53\i\expndtw-10 lygmens \cs55\i0\expndtw0 skirtum\f0\cchs186 \'f8\f0\cchs186 . Modelio autorius nurodo \f0\cchs186 \'f0\f0\cchs186 ias gabum\f0\cchs186 \'f8\f0\cchs186 sritis: akademin\f0\cchs186 \'eb\f0\cchs186 s srities, \cs53\i\expndtw-10 produktyviojo \cs55\i0\expndtw0 m\f0\cchs186 \'e0\f0\cchs186 stymo, komuniJcavimo, prognozavimo, \cs53\i\expndtw-10 sprendim\f0\cchs186 \'f8\f0\cchs186 pri\f0\cchs186 \'eb\f0\cchs186 mimo, plan\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 gyvendinimo, \cs55\i0\expndtw0\f0\cchs186 \'fe\f0\cchs186 mogi\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 , galimybi\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\'fe\f0\cchs186 vel\-gimo \cs39\i\expndtw-20 (ir.\expndtw0 2.2.1 \cs53\expndtw-10 lentel\f0\cchs186 \'e6\f0\cchs186 ).\par \pard \plain \s11\qj\li6976\fi0\ri0{\sl-240\slmult0\fs20\par }\sb72\sa0 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 2.2.1 \cs55 lentel\f0\cchs186 \'eb\par \pard \plain \s8\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx6464\posnegy688\absw0\absh-256\dfrmtxtx40\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 U\f0\cchs186 \'fe\f0\cchs186 duo\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 pavyzd\f0\cchs186 \'fe\f0\cchs186 iai\par \pard \plain \s4\qc\li2112\fi0\ri2232\sb0\sa0\sl-320\slmult0 \cs53\b0\strike0\nosupersubLi\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\s22 Gabum\f0\cchs186 \'f8\f0\cchs186 \cs44\i0\expndtw0 ugdymas pagal Taylor \cs55 model\f0\cchs186 \'e1 \f0\cchs186 (pagal TayJor, 1986)\par \pard \plain \s9\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx2648\posnegy368\absw0\absh-328\dfrmtxtx40\dfrmtxty0 \cs53\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\fs22 Geb\f0\cchs186 \'eb\f0\cchs186 jimas \cs55\i0\expndtw0 susikurti \cs39\i atitinka- \{\f0\cchs186 \'84\f0\cchs186 Surinkite informacij\f0\cchs186 \'e0\f0\cchs186 apie... ii\par \pard \plain \s6\qj\li304\fi0\ri0\sb16\sa0 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 I \cs53\expndtw-10 Gabum\f0\cchs186 \'f8\f0\cchs186 sritis Paai\f0\cchs186 \'f0\f0\cchs186 kinimas\par \pard \plain \s10\qj\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \pvpara\phcol\posnegx6032\posnegy328\absw2600\absh-544\dfrmtxtx40\dfrmtxty0 \cs53\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\fs22 j mos temos \f0\cchs186 \'fe\f0\cchs186 ini\f0\cchs186 \'f8\f0\cchs186 ir \f0\cchs186 \'e1\f0\cchs186 g\f0\cchs186 \'fb\f0\cchs186 d\f0\cchs186 \'fe\f0\cchs186 i\f0\cchs186 \'f8 \cs55\i0\expndtw0\f0\cchs186 'baz\f0\cchs186 \'e6\f0\cchs186 .\par \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0\sl-288\slmult0 \pvpara\phcol\posnegx5672\posnegy384\absw2960\absh-584\dfrmtxtx40\dfrmtxty0 \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 kuo \f0\cchs186 \'e1\f0\cchs186 vairesni\f0\cchs186 \'80008\f0\cchs186 \f0\cchs186 \'f0\f0\cchs186 altini\f0\cchs186 \'f8\f0\cchs186 ir j\f0\cchs186 \'e0\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 a\-nalizuokite".\par \pard \plain \s11\ql\li0\fi0\ri0\sb0\sa0\sl-296\slmult0\tlul\tx2520 \pvpara\phcol\posnegx5856\posnegy896\absw2776\absh-1656\dfrmtxtx40\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 f Geb\f0\cchs186 \'eb\f0\cchs186 jimas generuoti \cs60\fs20 ne-\line \cs55\fs22 f \f0\cchs186 \'e1\f0\cchs186 prastas, originalias i\f0\cchs186 \'eb\f0\cchs186 /as,\line \cs60\fs20 f\cs53\i\expndtw-10\fs22 pasteb\f0\cchs186 \'eb\'fb\f0\cchs186 naujus \cs55\i0\expndtw0 s\f0\cchs186 \'e0\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 ius,\line \cs53\i\expndtw-10 | papildyti detal\f0\cchs186 \'eb\f0\cchs186 mis, \cs55\i0\expndtw0 kurios\line \cs53\i\expndtw-10\f0\cchs186 \'c1\f0\cchs186 pa\f0\cchs186 \'e1\f0\cchs186 vairioa id\f0\cchs186 \'eb\f0\cchs186 jas,\expndtw0 {\charscalex100\expndtw0\tab }\par \pard \plain \s6\qj\li232\fi0\ri0\sb0\sa0 \cs53\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\fs22 'Akademin\f0\cchs186 \'eb\par \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0\sl-272\slmult0 \pvpara\phcol\posnegx5264\posnegy160\absw3368\absh-648\dfrmtxtx40\dfrmtxty0 \cs39\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \'84\f0\cchs186 Sukurkite, kuo \cs60\i0\fs20 pakeisti \f0\cchs186 \'e1\f0\cchs186 prastas energijos r\f0\cchs186 \'fb\'f0\f0\cchs186 is".\par \pard \plain \s7\ql\li0\fi0\ri0\sb0\sa0\sl-320\slmult0 \cs39\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 (K\f0\cchs186 \'fb\f0\cchs186 rybos, produktyvioio\par \pard \plain \s13\qj\li5816\fi0\ri0\sb88\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 2.2.1 icntcU\par \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-240\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Gabum\f0\cchs186 \'f8\f0\cchs186 \cs60\fs20 sritis\par \pard \plain \s15\ql\li0\fi40\ri0\sb0\sa0\sl-240\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Sprendim\f0\cchs186 \'f8 \f0\cchs186 pri\f0\cchs186 \'eb\f0\cchs186 mimo\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-248\slmult0\tlul\tx2736 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Paai\f0\cchs186 \'f0\f0\cchs186 kinimas {\charscalex100\expndtw0\tab }Ll\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas rasti alternatyvas, \cs55\fs22 l.,\par \pard \plain \s15\ql\li32\fi-32\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 jas \f0\cchs186 \'e1\f0\cchs186 vertinti ir priimti tinka- \cs55\fs22 t \cs60\fs20 r m\f0\cchs186 \'e0\f0\cchs186 problemos sprendim\f0\cchs186 \'e0\f0\cchs186 . 1 \cs41\b\i\f0\cchs186\fs10 \'e1\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs5u\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 J\f0\cchs186 \'fe\f0\cchs186 duo\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 pavyzd\f0\cchs186 \'fe\f0\cchs186 iai Nurodykite \cs60\fs20 savo \cs55\fs22 m\f0\cchs186 \'eb\f0\cchs186 giamiausi\f0\cchs186 \'e0\f0\cchs186 \cs60\fs20 I\par \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 a\f0\cchs186 \'f0\f0\cchs186 y toj\f0\cchs186 \'e0\f0\cchs186 , ai\f0\cchs186 \'f0\f0\cchs186 kiai pagr\f0\cchs186 \'e1\f0\cchs186 sdami at- t \cs60\fs20 rumentais \cs55\fs22 savo pasirinkim\f0\cchs186 \'e0\f0\cchs186 it\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 itmetim\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Planavimo\cell \pard \plain \s15\ql\li16\fi-16\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas numatyti kelius ir b\f0\cchs186 \'fb\f0\cchs186 dus id\f0\cchs186 \'eb\f0\cchs186 jai \f0\cchs186 \'e1\f0\cchs186 gyvendinti, nustatant, koki\f0\cchs186 \'f8\f0\cchs186 reikia resur- \cs55\fs22 1 \cs60\fs20 s\f0\cchs186 \'f8\f0\cchs186 , \f0\cchs186 \'e1\'fe\f0\cchs186 velgiant, kokios gali\-mos problemos, ir numatant \f0\cchs186 \'fe\f0\cchs186 ingsnius j\f0\cchs186 \'f8\f0\cchs186 sprendimui, to\-kiu b\f0\cchs186 \'fb\f0\cchs186 du patobulinant plan\f0\cchs186 \'e0\f0\cchs186 .\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-256\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 .I\f0\cchs186 \'f0\f0\cchs186 studijav\f0\cchs186 \'e6\f0\cchs186 \cs55\fs22 mitus apie \f0\cchs186 \'f0\f0\cchs186 ik\f0\cchs186 \'f0\f0\cchs186 nos\-\cs60\fs20 parnius, \cs55\fs22 sukurkite tyrimo plan\f0\cchs186 \'e0\f0\cchs186 \cs62\fs18 1\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-256\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 savo draug\f0\cchs186 \'f8\f0\cchs186 \cs55\fs22 nuomonei \cs60\fs20 apie \f0\cchs186 \'f0\f0\cchs186 iuos gyv\f0\cchs186 \'fb\f0\cchs186 nus i\f0\cchs186 \'f0\f0\cchs186 tirti\super 41\nosupersub , \f0\cchs186 \'84\f0\cchs186 Sukurkite akcijos prie\f0\cchs186 \'f0\f0\cchs186 \cs55\fs22 r\f0\cchs186 \'fb\f0\cchs186 kym\f0\cchs186 \'e0\f0\cchs186 \cs62\fs18 1 \cs60\fs20 plan\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Prognozavimo\cell \pard \plain \s15\ql\li0\fi8\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas numatyti ir pati\-krinti prie\f0\cchs186 \'fe\f0\cchs186 asties ir pasekm\f0\cchs186 \'eb\f0\cchs186 s s\f0\cchs186 \'e0\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 ius.\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 I\f0\cchs186 \'f0\f0\cchs186 studijuokite N sutart\f0\cchs186 \'e1\f0\cchs186 ir nurodykite \f0\cchs186 \'e1\f0\cchs186 vairias galimas jos i ratifikavimo pasekmes".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Komunikavimo\cell \pard \plain \s15\ql\li0\fi16\ri0\sb0\sa0\sl-256\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas reik\f0\cchs186 \'f0\f0\cchs186 ti savo id\f0\cchs186 \'eb\f0\cchs186 jas, jausmus, poreikius ir suprasti kitus, vartojant verbalin\f0\cchs186 \'e6\f0\cchs186 ir neverbalin\f0\cchs186 \'e6\f0\cchs186 kalb\f0\cchs186 \'e0\f0\cchs186 .\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 Pademonstruokite savo jaus- \cs55\fs22 1 \cs60\fs20 mus, kai su\f0\cchs186 \'fe\f0\cchs186 inote apie ... \f0\cchs186 \'84\f0\cchs186 Papasakokite apie \f0\cchs186 \'e1\f0\cchs186 vyk\f0\cchs186 \'e1\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 vaiko i ir i\f0\cchs186 \'f0\f0\cchs186 suaugusiojo pozicini". i\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Plan\f0\cchs186 \'f8\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'e1\f0\cchs186 gyvendinimo\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas \f0\cchs186 \'e1\f0\cchs186 gyvendinti plan\f0\cchs186 \'e0\cell \pard \plain \s16\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs43\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw200\dn0\f0\cchs186\lang1063\langfe1063\fs10 \'97\f0\cchs186 \f0\cchs186 \'97\f0\cchs186 \f1\cchs186 \u9632\'3f\f0\cchs186 - \f0\cchs186 \'97\'97\f0\cchs186  \expndtw0 *-\expndtw200 \expndtw0 L-\expndtw200 \expndtw0 -\expndtw200 \cs42\b0\expndtw0\f3\cchs186\fs8 i \f4\cchs186 \u9632\'3f\f3\cchs186 \f4\cchs186 \u9632\'3f\f3\cchs186 \cs41\b\i\f0\cchs186\fs10 a \cs40\b0\i0\scaps\f6\cchs186\fs8 - ii \f7\cchs186 \u9632\'3f\f6\cchs186 \cs62\scaps0\f0\cchs186\fs18 1\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 Sukurkite ir \f0\cchs186 \'e1\f0\cchs186 gyvendinkite N 1 renginio plan\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li32\fi-32\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Galimybi\f0\cchs186 \'f8 \'e1\'fe\f0\cchs186 velgimo\cell \pard \plain \s15\ql\li0\fi40\ri0\sb0\sa0\sl-272\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas identifikuoti gali\-myb\f0\cchs186 \'e6\f0\cchs186 ir ja pasinaudoti.\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-272\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 I\f0\cchs186 \'f0\f0\cchs186 tirkite ispan\f0\cchs186 \'f8\f0\cchs186 kalbos mokymo(si) poreik\f0\cchs186 \'e1\f0\cchs186 mokykloje ir inicijuokite atitinkamos pro\-gramos \f0\cchs186 \'e1\f0\cchs186 gyvendinim\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \pard\pard \plain \s14\ql\li0\fi600\ri0\sb232\sa0\sl-328\slmult0 \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Taylor siekia ugdyti kuo daugiau gabum\f0\cchs186 \'f8\f0\cchs186 , kuriais, jo manymu, pasi\f0\cchs186 \'fe\f0\cchs186 ymi vaikai. Tad kuo \f0\cchs186 \'e1\f0\cchs186 vairesniems vaik\f0\cchs186 \'f8\f0\cchs186 gabumams mokytojas skirs d\f0\cchs186 \'eb\f0\cchs186 mes\f0\cchs186 \'e1\f0\cchs186 , tuo daugiau galimybi\f0\cchs186 \'f8\f0\cchs186 , kad vaikas ras srit\f0\cchs186 \'e1\f0\cchs186 , kurios \f0\cchs186 \'fe\f0\cchs186 inovu jis gali tapti. Ta\f0\cchs186 \'e8\f0\cchs186 iau pir\-masis \f0\cchs186 \'f0\f0\cchs186 io modelio etapas - tai vis d\f0\cchs186 \'eb\f0\cchs186 lto akademini\f0\cchs186 \'f8\f0\cchs186 gabum\f0\cchs186 \'f8\f0\cchs186 ugdymas. Kitas \f0\cchs186 \'fe\f0\cchs186 ingsnis, skirtas mokytojui apsispr\f0\cchs186 \'e6\f0\cchs186 sti, kuri\f0\cchs186 \'e0\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 likusi\f0\cchs186 \'f8\f0\cchs186 a\f0\cchs186 \'f0\f0\cchs186 tuoni\f0\cchs186 \'f8\f0\cchs186 gabum\f0\cchs186 \'f8\f0\cchs186 sri\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8 \f0\cchs186 jis imasi ugdyti. Paprastai seka, anot autoriaus, tur\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 b\f0\cchs186 \'fb\f0\cchs186 ti tokia: produktyvusis m\f0^cchs186 \'e0\f0\cchs186 stymas, planavimas, sprendim\f0\cchs186 \'f8\f0\cchs186 pri\f0\cchs186 \'eb\f0\cchs186 mimas, pian\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 gyvendinimas, \f0\cchs186 \'e1\'fe\f0\cchs186 valgos. Akivaizdu, jog dirbti pagal \f0\cchs186 \'f0\'e1\f0\cchs186 model\f0\cchs186 \'e1\f0\cchs186 mokytojas tur\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 b\f0\cchs186 \'fb\f0\cchs186 ti specialiai pasi\-reng\f0\cchs186 \'e6\f0\cchs186 s, tad modelio autorius si\f0\cchs186 \'fb\f0\cchs186 lo kelet\f0\cchs186 \'e0\f0\cchs186 mokytojo darbo metod\f0\cchs186 \'f8\f0\cchs186 . Pirmuouiu atveju si\f0\cchs186 \'fb\f0\cchs186 loma papildom\f0\cchs186 \'f8\f0\cchs186 gabum\f0\cchs186 \'f8\f0\cchs186 ugdym\f0\cchs186 \'e0\f0\cchs186 organizuoti baigiantis pamokoms. \f0\cchs186 \'c1\f0\cchs186 prastinis mokymo turinys \f0\cchs186 \'84\f0\cchs186 suspaud\f0\cchs186 \'fe\f0\cchs186 iamas" laike, o atsiradusias 5\f0\cchs186 \'97\f0\cchs186 10 laisvuj minu\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 mokytojas gali i\f0\cchs186 \'f0\f0\cchs186 naudoti pasirinkto gabumo ugdymui. Kai \cs48\b\fs20 mokytojui \cs44\b0\fs22 atrodo, kad jau pasiekta tam tikra pa\f0\cchs186 \'fe\f0\cchs186 anga ugdant pirm\f0\cchs186 \'e0\f0\cchs186 j\f0\cchs186 \'e1\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 o pasirinkt\f0\cchs186 \'f8\f0\cchs186 ga\-\par \sect\soctd \sbkpage\pgwsxn20855\pghsxn13316\marglsxn1080\margrsxn8026\margtsxn360\margbsxn360\cols2\colno1\colw7936\colsr2482\colno2\colw1329 {\header \pard \plain \s11\ql\li0\fi0\ri-7657\sb0\sa0\tx2245 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \'e1\f0\cchs186 Ma\ul b\f0\cchs186 \'fb\f0\cchs186 s vaikai:\ul0 {\charscalex100\expndtw0\tab }\ul ir galimyb\f0\cchs186 \'eb\f0\cchs186 s\par }{\footer \par \plain \s11\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx-720\posnegy0\absw0\absh-254\nowrap\dfrmtxtx34\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 {\field{\*\fldinst{PAGE}}{\fldrslt 100}}\par \pard \plain \s21\qr\li0\fi0\ri-7657{\sl-240\slmult0\fs20\par }\sb90\sa0 \cs61\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs12 101\par }{\shp {\*\shpinst \chpleft13358\shptop593\shpright14748\shpbottom830\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz1\shplid1{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 317500}}{\sp{\sn dyWrapDistBottom}{\sv 198755}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s31\qj\li0\fi0\ri0\sb0\sa0 \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Rai\f0\cchs186 \'f0\f0\cchs186 kos \cs51\b0 b\f0\cchs186 \'fb\f0\cchs186 dai\par }}}{\shp {\*\shpinst \shpleft11859\shptop534\shpright13172\shpbottom2169\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz0\shplid0{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 279400}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0\sl-254\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas\par \pard \plain \s13\ql\li0\fi0\ri0\sb17\sa0\sl-271\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Ugdytojo ir ugdytini\f0\cchs186 \'f8 \f0\cchs186 s\f0\cchs186 \'e0\f0\cchs186 veika, ko\-munikacija\par }}}{\shp {\*\shpinst \shp|eft13350\shptop1144\shpright17594\shpbottom2296\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz2\shplid2{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 139700}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPint}{\sv 1}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0\sl-271\slmult0 \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Informacijos srautai \f0\cchs186 \'97\f0\cchs186 \cs48\b Asmenvb\f0\cchs186 \'eb\f0\cchs186 s tobuli* tiesioginiai ir \cs60\b0 gr\f0\cchs186 \'e1\'fe\f0\cchs186 tamieji, ir s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 \cs48\b tobulintai pedagogin\f0\cchs186 \'eb\f0\cchs186 \cs60\b0 sistema sudarymas: \cs48\b\f0\cchs186 \'fb\f0\cchs186 ssionj\par \pard \plain \s33\ql\li2499\fi0\ri0\sb93\sa0 \cs51\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 - b. \cs60 y\super 1\nosupersub "\super 0\nosupersub \cs51 HBB\par }}}{\shp {\*\shpinst \shpleft13299\shptop2228\shpright14205\shpbottom2474\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz4\shplid4{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Saviugda\par }}}{\shp {\*\shpinst \shpleft15874\shptop2279\shpright17187\shpbottom2524\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz5\shplid5{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0 \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Tobulinimasis\par }}}{\shp {\*\shpinst \shpleft11867\shptop2152\shpright13078\shpbottom2812\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz3\shplid3{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 640080}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Individo as\-menyb\f0\cchs186 \'eb\par }}}{\shpgrp{\*\shpinst \shpleft-720\shptop3939\shpright7878\shpbottom12384\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz6\shplid6{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn groupLeft}{\sv 1067}}{\sp{\sn groupTop}{\sv 6209}}{\sp{\sn groupRight}{\sv 9665}}{\sp{\sn groupBottom}{\sv 14654}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 1067}}{\sp{\sn relTop}{\sv 6429}}{\sp{\sn relRight}{\sv 9665}}{\sp{\sn relBottom}{\sv 14654}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li474\fi0\ri0\sb0\sa0\sl-271\slmult0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1 \cs48\b\fs20 Ugdymo \cs49\b0\fs22 res \cs46\scaps\fs20 f\cs48\b\scaps0 lyb\f0\cchs186 \'eb\f0\cchs186 s lygmu\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 i- \cs49\b0\fs22 Strukt\f0\cchs186 \'fb\f0\cchs186 rini \cs48\b\fs20 o elementas\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 s Rai\f0\cchs186 \'f0\f0\cchs186 kos b\f0\cchs186 \'fb\f0\cchs186 dai\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Funkcijos\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li440\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 j \cs48\b\fs20 Valstybinis\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Valstyb\f0\cchs186 \'eb\f0\cchs186 s politika\cell \pard \plain \s19\ql\li0\fi8\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'d0\f0\cchs186 vietimo politika ir j\f0\cchs186 \'e0 \f0\cchs186 atspindintys \f0\cchs186 \'e1\f0\cchs186 statymai\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-288\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Teisinis reguliavimas, u\f0\cchs186 \'fe\f0\cchs186 tikrinantis kiekvie\-nam vaikui (vadinasi, ir gabiam) teis\f0\cchs186 \'e6\f0\cchs186 gauti jo poreikius ir galimybes atitinkant\f0\cchs186 \'e1\f0\cchs186 ugdym\f0\cchs186 \'e0\f0\cchs186 ir ug\-dymosi s\f0\cchs186 \'e0\f0\cchs186 lygas\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li390\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langde1063\fs20 Visuomeninis\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Visuomen\f0\cchs186 \'eb\f0\cchs186 s institutai\cell \pard \plain \s19\ql\li0\fi68\ri0\sb0\sa0\sl-288\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Vyriausybines insti\-tucijos/ visuomenini\f0\cchs186 \'f8 \f0\cchs186 organizacij\f0\cchs186 \'f8\f0\cchs186 /paramos fond\f0\cchs186 \'f8\f0\cchs186 /auk\f0\cchs186 \'f0\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 moky\-kl\f0\cchs186 \'f8\f0\cchs186 /mokslo institucij\f0\cchs186 \'f8 \cs39\b0\i\f0\cchs186\fs22 tikslin\f0\cchs186 \'eb\f0\cchs186 \cs48\i0\b\fs20 veikla\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-296\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Veiklos inicijavimas; koordinavimas, organi\-zavimas, informacijos kaupimas, analiz\f0\cchs186 \'eb\f0\cchs186 ir sklai\-da; gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 paie\f0\cchs186 \'f0\f0\cchs186 kos programos, identifikavi\-mas, globa; mokytoj\f0\cchs186 \'f8\f0\cchs186 ir kit\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'f0\f0\cchs186 vietimo darbuotoj\f0\cchs186 \'f8 \f0\cchs186 rengi mas;ugdymo t\f0\cchs186 \'e6\f0\cchs186 sti\-numo u\f0\cchs186 \'fe\f0\cchs186 tikrinimas; kt.\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 1 Institucinis\par \pard \plain \s25\ql\li0\fi0\ri0\sb0\sa0\sl-983\slmult0 \intbl \cs47\b0\i0\strike0\nosupersub\scaps0\charscalex20\expndtw0\dn19\f0\cchs186\lang1063\langfe1063\fs104 1\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Ugdymo nstituci\f0\cchs186 \'e1\f0\cchs186 os\par \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 i \cs49\b0\fs22 1 \cs48\b\fs20 i\par \pard \plain \s26\ql\li0\fi0\ri0\sb0\sa0\sl-381\slmult0 \intbl \cs50\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn5\f0\cchs186\lang1063\langfe1063\fs38 !\cell \pard \plain \s19\ql\li25\fi-25\ri0\sb0\sa0\sl-296\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo modelis institucijos lygmeniu \f0\cchs186 \'97\f0\cchs186 mokyklos, papildomojo ugdymo mokyklos, technin\f0\cchs186 \'eb\f0\cchs186 s \{\f0\cchs186 \'fb\f0\cchs186 rybos namai, klas\f0\cchs186 \'eb\f0\cchs186 s, tovyklos, kursai, kon\-kursai ir kt.\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw-5420746430195647047\dn0\f0\cchs186\lang1063\langfe1063\fs20 Ugdymo proceso opti\-mizavimas: optimalios ugdymo(si) aplinkos sudarymas, ugdymas, mo\-kymas, veiklos rezultat\f0\cchs186 \'f8 \f0\cchs186 vertinimas, mokymo dife\-rencijavimas ir kt.\cell \pard\intbl\row \pard}}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 3371}}{\sp{\sn relTop}{\sv 6209}}{\sp{\sn relRight}{\sv 7988}}{\sp{\sn relBotto}}{\sv 6497}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s18\qj\li0\fi0\ri0\sb0\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Gabi\f0\cchs186 \'f8\f0\cchs186 \cs49 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo ir jo s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 modelis\par }}}}}\pard \plain \s14\qr\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 m\f0\cchs186 \'e0\f0\cchs186 gali apib\f0\cchs186 \'fb\f0\cchs186 dinti asmenyb\f0\cchs186 \'eb\f0\cchs186 s saviugda, iritrapersonaliniame lygmenyje \f0\cchs186 \'e1\f0\cchs186 gyjanti gryn\f0\cchs186 \'e0\f0\cchs186 rai\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'e0\f0\cchs186 . \cs45\b\expndtw-10 II \cs55\b0\expndtw0 esm\f0\cchs186 \'eb\f0\cchs186 s \cs53\i\expndtw-10 vis\f0\cchs186 \'f8\f0\cchs186 \cs55\i0\expndtw0 anks\f0\cchs186 \'e8\f0\cchs186 iau min\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 strukt\f0\cchs186 \'fb\f0\cchs186 rini\f0\cchs186 \'f8\f0\cchs186 element\f0\cchs186 \'f8\f0\cchs186 funkcionavi\-mo tikslas \cs49 I \cs55 prigimtini\f0\cchs186 \'f8\f0\cchs186 asmens gali\f0\cchs186 \'f8\f0\cchs186 pl\f0\cchs186 \'eb\f0\cchs186 tra ir i\f0\cchs186 \'f0\f0\cchs186 vystymas jo paties j\f0\cchs186 \'eb\f0\cchsq86 gomis iki maksimalaus tam asmeniui galimo lygio. Literat\f0\cchs186 \'fb\f0\cchs186 roje (Gross, 1995; Almonaitien\f0\cchs186 \'eb\f0\cchs186 , 1997; Heller, 1999; Gagne, 2004 ir kt.) nurodoma, kad gabaus vaiko savirealizaci\-jai turi (takos jo asmenyb\f0\cchs186 \'eb\f0\cchs186 s nekognityvin\f0\cchs186 \'eb\f0\cchs186 s savyb\f0\cchs186 \'eb\f0\cchs186 s - pasiekim\f0\cchs186 \'f8\f0\cchs186 motyvacija, tei\-giamas \cs45\b\expndtw-10 sav\f0\cchs186 \'e6\f0\cchs186 s \cs55\b0\expndtw0 vertinimas, darbingumas, savikontrol\f0\cchs186 \'eb\f0\cchs186 ir kt. Yra pagrindo manyti, kad tinkamas min\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 GAVUS modelio strukt\f0\cchs186 \'fb\f0\cchs186 rini\f0\cchs186 \'f8\f0\cchs186 element\f0\cchs186 \'f8\f0\cchs186 funkcionavimas palankiai veikia gabaus vaiko asmenyb\f0\cchs186 \'e6\f0\cchs186 , taigi skatina \cs45\b\expndtw-10 j\f0\cchs186 \'e1\f0\cchs186 \cs55\b0\expndtw0 tobul\f0\cchs186 \'eb\f0\cchs186 ti.\par \pard \plain \s2\qj\li0\fi584\ri0\sb8\sa0\sl-271\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Apibendrinant tai, kas pasakyta, galima pateikti tok\f0\cchs186 \'e1\f0\cchs186 teorin\f0\cchs186 \'e1\f0\cchs186 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8 \f0\cchs186 ugdymo ir jo s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 model\f0\cchs186 \'e1\f0\cchs186 :\par \pard \plain \s11\qr\li0\fi0\ri0{\sl-240\slmult0\fs20\par }\sb99\sa0 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 3.1 \cs55 lentel\f0\cchs186 \'eb\par \column \pard \plain \s28\qj\li0\fi0\ri0{\sl-240\slmult0\fs20\par }\sb200\sa0\sl-271\slmult0 \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Ugdymo rea-\ul lyb\f0\cchs186 \'eb\f0\cchs186 s lygmuo\par \pard \plain \s11\qj\li0\fi0\ri0\sb42\sa0\sl-246\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Interpersona-linis\khftn{\footnote\pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \chftn Pastaba. Interpersonalinio ir intrapersonalinio \cs48\b\fs20 lygmens \cs55\b0\fs22 elemcr\cs48\b\f0\cchs186\fs20 \'a3\f0\cchs186 E\cs52\b0\expndtw-20\fs30 ^^PK\cs48\b\expndtw0\fs20 ^niaj\par \pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 modelio elementai, kuri\f0\cchs186 \'f8\f0\cchs186 optimaliamveikimui \cs49 ir skirtas ug\strike dy\strike0 m\strike o\strike0 \cs55 s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 \cs60\fs20 mo\-\cs55\fs22 delis\par \pard \plain \s23 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Sukurtasis \expndtw0 GAVUS\expndtw-20 moeelis turi savo strukt\f0\cchs186 \'fb\f0\cchs186 r\f0\cchs186 \'e0\f0\cchs186 , funkcijas \cs53\expndtw-10 ir \cs63\expndtw0 funkcionavimo\expndtw-20 \expndtw0 aptin-\cs53\expndtw-10 k\f0\cchs186 \'e0\f0\cchs186 . \cs63\expndtw-20 Modelis turi \expndtw0 paskirti\expndtw-20 bendr\f0\cchs186 \'e0\f0\cchs186 tiksl\f0\cchs186 \'e0\f0\cchs186 \f0\cchs186 \'97\f0\cchs186 \cs49\i0\expndtw0 sudaryti s\f0\cchs186 \'e0\f0\cchs186 lygas gabiems valkams, nepriklausomai nuo j\f0\cchs186 \'f8\f0\cchs186 socialin\f0\cchs186 \'eb\f0\cchs186 s pad\f0\cchs186 \'eb\f0\cchs186 ties, gyvenamosios vietos, am\-\f0\cchs186 \'fe\f0\cchs186 iaus, lyties ir kt., rinktis j\f0\cchs186 \'f8\f0\cchs186 poreikius atitinkanti ugdym\f0\cchs186 \'e0\f0\cchs186 ir galimybes saviugdai, pad\f0\cchs186 \'eb\f0\cchs186 ti jam ir skatinti vaik\f0\cchs186 \'e0\f0\cchs186 siekti pilno savojo gabum\f0\cchs186 \'f8\f0\cchs186 po\-tencialo realizavimo ir b\f0\cchs186 \'fb\f0\cchs186 ti naudingam visuomenei, Sis tikslas suteikia modeliui vienov\f0\cchs186 \'eb\f0\cchs186 s, vientisumo.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Kiekvienas strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas turi ir papildom\f0\cchs186 \'f8\f0\cchs186 (i\f0\cchs186 \'f0\f0\cchs186 vestini\f0\cchs186 \'f8\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 ben\-drojo) tiksl\f0\cchs186 \'f8\f0\cchs186 , kurie susij\f0\cchs186 \'e6\f0\cchs186 su funkcijomis, kurias atlieka strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas. Modelis skirtas \f0\cchs186 \'fe\f0\cchs186 mogui jame vyksta informacijos perdavimo ir valdymo pro\-cesai \f0\cchs186 \'97\f0\cchs186 tai b\f0\cchs186 \'fb\f0\cchs186 dinga visuomenin\f0\cchs186 \'eb\f0\cchs186 ms sistemoms.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis sudarytas i\f0\cchs186 \'f0\f0\cchs186 posistemi\f0\cchs186 \'f8\f0\cchs186 (pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, GVU atskiroje ugdymo institucijoje, jo posistem\f0\cchs186 \'eb\f0\cchs186 - pedagogin\f0\cchs186 \'eb\f0\cchs186 sistema, ir kt.). Visi GAVUS elementai yra vienaip ar kitaip susij\f0\cchs186 \'e6\f0\cchs186 su ugdymu ir jo funkcijomis: \f0\cchs186 \'f0\f0\cchs186 vietimu, lavinimu, aukl\f0\cchs186 \'eb\f0\cchs186 jimu, mokymu, globojimu, formavimu ir kt. Kiekviena jo sud\f0\cchs186 \'eb\f0\cchs186 tin\f0\cchs186 \'eb\f0\cchs186 dalis atlieka tam tikr\f0\cchs186 \'e0\f0\cchs186 funkcij\f0\cchs186 \'e0\f0\cchs186 (jas nurod\f0\cchs186 \'eb\f0\cchs186 me aptardami model\f0\cchs186 \'e1\f0\cchs186 ). Tuomet, kai mo\-delio strukt\f0\cchs186 \'fb\f0\cchs186 riniai elementai funkcionuoja visuose ugdymo realyb\f0\cchs186 \'eb\f0\cchs186 s lygmeny\-se, jis apima daugel\f0\cchs186 \'e1\f0\cchs186 aplinkos veiksni\f0\cchs186 \'f8\f0\cchs186 , kurie yra gabumo virsmo pasiekimais katalizatoriai. Funkciniais ry\f0\cchs186 \'f0\f0\cchs186 iais susij\f0\cchs186 \'e6\f0\cchs186 elementai sukuria palaikan\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'e0\f0\cchs186 aplink\f0\cchs186 \'e0 \f0\cchs186 vienas kito veikimui, o tai savo ruo\f0\cchs186 \'fe\f0\cchs186 tu suma\f0\cchs186 \'fe\f0\cchs186 ina atsitiktinum\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 tiesiogi\-\cs44 niam \cs49 ugdymui, t.y. skatina gabaus vaiko saviugd\f0\cchs186 \'e0\f0\cchs186 .\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelio artimiausioji funkcionavimo aplinka yra \f0\cchs186 \'f0\f0\cchs186 vietimo sistema.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis yra atviras ir dinami\f0\cchs186 \'f0\f0\cchs186 kas. Atviras, nes tai yra socialin\f0\cchs186 \'eb\f0\cchs186 strukt\f0\cchs186 \'fb\f0\cchs186 ra, kuriai \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 daro aplinka (netgi jo veikimo realyb\f0\cchs186 \'eb\f0\cchs186 je prasme). Modelio struk\-t\f0\cchs186 \'fb\f0\cchs186 riniai elementai turi daug vidini\f0\cchs186 \'f8\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 , o jie savo ruo\f0\cchs186 \'fe\f0\cchs186 tu yra atviri aplinkai, kitoms, i\f0\cchs186 \'f0\f0\cchs186 orin\f0\cchs186 \'eb\f0\cchs186 ms socialin\f0\cchs186 \'eb\f0\cchs186 ms strukt\f0\cchs186 \'fb\f0\cchs186 roms, sistemoms, yra dinami\f0\cchs186 \'f0\f0\cchs186 ki, nes i\f0\cchs186 \'f0\f0\cchs186 likti stati\f0\cchs186 \'f0\f0\cchs186 kam, kai kinta aplinka, n\f0\cchs186 \'eb\f0\cchs186 ra \f0\cchs186 \'e1\f0\cchs186 manoma. Dinami\f0\cchs186 \'f0\f0\cchs186 kas jis ir d\f0\cchs186 \'eb\f0\cchs186 l k\f0\cchs186 \'ab\'a9\f0\cchs186 $}\pAv \pard \plain \s11\qj\li0\fi0\ri0{\sl-240\slmult0\fs20\par }{\sl-240\slmult0\fs20\par }\sb121\sa0\sl-263\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Intrapersona-linis\chftn{\footnote\pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \chftn Pastaba. Interpersonalinio ir intrapersonalinio \cs48\b\fs20 lygmens \cs55\b0\fs22 elemcr\cs48\b\f0\cchs186\fs20 \'a3\f0\cchs186 E\cs52\b0\expndtw-20\fs30 ^^PK\cs48\b\expndtw0\fs20 ^niaj\par \pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 modelio elementai, kuri\f0\cchs186 \'f8\f0\cchs186 optimaliam veikimui \cs49 ir skirtas ug\strike dy\strike0 m\strike o\strike0 \cs55 s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 \cs60\fs20 mo\-\cs55\fs22 delis\par \pard \plain \s23 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Sukurtasis \expndtw0 GAVUS\expndtw-20 modelis turi savo strukt\f0\cchs186 \'fb\f0\cchs186 r\f0\cchs186 \'e0\f0\cchs186 , funkcijas \cs53\expndtw-10 ir \cs63\expndtw0 funkcionavimo\expndtw-20 \expndtw0 aptin-\cs53\expndtw-10 k\f0\cchs186 \'e0\f0\cchs186 . \cs63\expndtw-20 Modelis turi \expndtw0 paskirti\expndtw-20 bendr\f0\cchs186 \'e0\f0\cchs186 tiksl\f0\cchs186 \'e0\f0\cchs186 \f0\cchs186 \'97\f0\cchs186 \cs49\i0\expndtw0 sudaryti s\f0\cchs186 \'e0\f0\cchs186 lygas gabiems valkams, nepriklausomai nuo j\f0\cchs186 \'f8\f0\cchs186 socialin\f0\cchs186 \'eb\f0\cchs186 s pad\f0\cchs186 \'eb\f0\cchs186 ties, gyvenamosios vietos, am\-\f0\cchs186 \'fe\f0\cchs186 iaus, lyties ir kt., rinktis j\f0\cchs186 \'f8\f0\cchs186 poreikius atitinkanti ugdym\f0\cchs186 \'e0\f0\cchs186 ir galimybes saviugdai, pad\f0\cchs186 \'eb\f0\cchs186 ti jam ir skatinti vaik\f0\cchs186 \'e0\f0\cchs186 siekti pilno savojo gabum\f0\cchs186 \'f8\f0\cchs186 po\-tencialo realizavimo ir b\f0\cchs186 \'fb\f0\cchs186 ti naudingam visuomenei, Sis tikslas suteikia modeliui vienov\f0\cchs186 \'eb\f0\cchs186 s, vientisumo.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Kiekvienas strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas turi ir papildom\f0\cchs186 \'f8\f0\cchs186 (i\f0\cchs186 \'f0\f0\cchs186 vestini\f0\cchs186 \'f8\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 ben\-drojo) tiksl\f0\cchs186 \'f8\f0\cchs186 , kurie susij\f0\cchs186 \'e6\f0\cchs186 su funkcijomis, kurias atlieka strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas. Modelis skirtas \v0\cchs186 \'fe\f0\cchs186 mogui, jame vyksta informacijos perdavimo ir valdymo pro\-cesai \f0\cchs064 \'97\f0\cchs186 tai b\f0\cchs186 \'fb\f0\cchs186 dinga visuomenin\f0\cchs186 \'eb\f0\cchs186 ms sistemoms.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis sudarytas i\f0\cchs186 \'f0\f0\cchs186 posistemi\f0\cchs186 \'f8\f0\cchs186 (pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, GVU atskiroje ugdymo institucijoje, jo posistem\f0\cchs186 \'eb\f0\cchs186 - pedagogin\f0\cchs186 \'eb\f0\cchs186 sistema, ir kt.). Visi GAVUS elementai yra vienaip ar kitaip susij\f0\cchs186 \'e6\f0\cchs186 su ugdymu ir jo funkcijomis: \f0\cchs186 \'f0\f0\cchs186 vietimu, lavinimu, aukl\f0\cchs186 \'eb\f0\cchs186 jimu, mokymu, globojimu, formavimu ir kt. Kiekviena jo sudf0\cchs186 \'eb\f0\cchs186 tin\f0\cchs186 \'eb\f0\cchs186 dalis atlieka tam tikr\f0\cchs186 \'e0\f0\cchs186 funkcij\f0\cchs186 \'e0\f0\cchs186 (jas nurod\f0\cchs186 \'eb\f0\cchs186 me aptardami model\f0\cchs186 \'e1\f0\cchs186 ). Tuomet, kai mo\-delio strukt\f0\cchs186 \'fb\f0\cchs186 riniai elementai funkcionuoja visuose ugdymo realyb\f0\cchs186 \'eb\f0\cchs186 s lygmeny\-se, jis apima daugel\f0\cchs186 \'e1\f0\cchs186 aplinkos veiksni\f0\cchs186 \'f8\f0\cchs186 , kurie yra gabumo virsmo pasiekimais katalizatoriai. Funkciniais ry\f0\cchs186 \'f0\f0\cchs186 iais susij\f0\cchs186 \'e6\f0\cchs186 elementai sukuria palaikan\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'e0\f0\cchs186 aplink\f0\cchs186 \'e0 \f0\cchs186 vienas kito vei{imui, o tai savo ruo\f0\cchs186 \'fe\f0\cchs186 tu suma\f0\cchs186 \'fe\f0\cchs186 ina atsitiktinum\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 tiesiogi\-\cs44 niam \cs49 ugdymui, t.y. skatina gabaus vaiko saviugd\f0\cchs186 \'e0\f0\cchs186 .\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelio artimiausioji funkcionavimo aplinka yra \f0\cchs186 \'f0\f0\cchs186 vietimo sistema.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis yra atviras ir dinami\f0\cchs186 \'f0\f0\cchs186 kas. Atviras, nes tai yra socialin\f0\cchs186 \'eb\f0\cchs186 strukt\f0\cchs186 \'fb\f0\cchs186 ra, kuriai \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 daro aplinka (netgi jo veikimo realyb\f0\cchs186 \'eb\f0\cchs186 je prasme). Modelio struk\-t\f0\cchs186 \'fb\f0\cchs186 riniai elementai turi daug vidini\f0\cchs186 \'f8\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 , o jie savo ruo\f0\cchs186 \'fe\f0\cchs186 tu yra atviri aplinkai, kitoms, i\f0\cchs186 \'f0\f0\cchs186 orin\f0\cchs186 \'eb\f0\cchs186 ms socialin\f0\cchs186 \'eb\f0\cchs186 ms strukt\f0\cchs186 \'fb\f0\cchs186 roms, sistemoms, yra dinami\f0\cchs186 \'f0\f0\cchs186 ki, nes i\f0\cchs186 \'f0\f0\cchs186 likti stati\f0\cchs186 \'f0\f0\cchs186 kam, kai kinta aplinka, n\f0\cchs186 \'eb\f0\cchs186 ra \f0\cchs186 \'e1\f0\cchs186 manoma. Dinami\f0\cchs186 \'f0\f0\cchs186 kas jis ir d\f0\cchs186 \'eb\f0\cchs186 l k\f0\cchs186 \'ab\'a9\f0\cchs186 $}\par \sect\sectd \sbknone\pgwsxn20126\pghsxn13892\marglsxn733\margrsxn360\margtsxn360\margbsxn360\cols1\colsx60 {\header }{\footer \pard \plain \s27\qr\li0\fi0\ri0\sb0\sa0 \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 {\field{\*\fldinst{PAGE}}{\fldrslt 123}}\par }{\pard\plain \sb1144\sa0\sl-240\slmult0\fs20\par}\pard \plain \s29\qj\li11181\fi0\ri0\sb51\sa102 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 4. \cs55 Gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ufidymo ir jo s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 mo\ul delio rai\f0\cchs186 \'f0\f0\cchs186 kos\ul0 \cs45\b\expndtw-10\f0\cchs186 \'c1\f0\cchs186 \cs55\b0\ul\expndtw0 jetuvo\f0\cchs186 \'e1\f0\cchs186 e \cs60\fs20 pristatymas\par \sect\sectd \sbknone\pgwsxn20126\pghsxn13892\marglsxn733\margrsxn453\margtsxn360\margbsxn360\cols2\colno1\colw8123\colsr2431\colno2\colw8385 {\shpgrp{\*\shpinst \shpleft10622\shptop263\shpright18737\shpbottom1966\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz7\shplid7{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 107315}}{\sp{\sn dyWrapDistBottom}{\sv 48260}}{\sp{\sn groupLeft}{\sv 12045}}{\sp{\sn groupTop}{\sv 2846}}{\sp{\sn groupRight}{\sv 20160}}{\sp{\sn groupBottom}{\sv 4549}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 12045}}{\sp{\sn relTop}{\sv 2922}}{\sp{\sn relRight}{\sv 20160}}{\sp{\sn relBottom}{\sv 4100}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx542 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx6666 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7378 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8115 \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Nr.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0\sl-144\slmult0\tlhyph\tx3744\tlul\tx4574 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn2\f0\cchs186\lang1063\langfe1063\fs22 rr-ri{\charscalex100\expndtw0\tab }\cs61\fs12 _ {\charscalex100\expndtw0\tab } J \f0\cchs186 \'bb\par \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Teiginys \f0\cchs186 \'97\cell \pard \plain \s35\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 mreies\par \pard \plain \s3\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Vid *\cell \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 t\f0\cchs186 \'e6\f0\cchs186 sinys\par \pard \plain \s24\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs61\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs12 Qt \cs60\fs20 n\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx542 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx6666 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7378 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8115 \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 11.\cell \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Tr\f0\cchs186 \'fb\f0\cchs186 ksta mokini\f0\cchs186 \'f8\f0\cchs186 t\f0\cchs186 \'eb\f0\cchs186 v\f0\cchs1:6 \'f8\f0\cchs186 palaikymo, pritarimo\cell \pard \plain \s5\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 00\cs49\fs22 .24\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.21\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx542 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx6666 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7378 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8115 \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 12.\cell \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 [Tr\f0\cchs186 \'fb\f0\cchs186 ksta mokyklos administracijos paskatinimo ir \cs57\expndtw10\fs16 nri\cs58\expndtw0\fs20 -^mn\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\tlhyph\tx5472\tlhyph\tx6107 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 maksimalus \cs60\b0 galimas trukume .v\cs57\b\expndtw10\fs16 .-rr.\cs59\i\expndtw-10\f9\cchs186\fs22 ^-ETrr\cs60\b0\i0\expndtw0\f0\cchs186\fs20 {\charscalex100\expndtw0\tab }rr{\charscalex100\expndtw0\tab }1\cell \pard \plain \s5\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 00\cs49\fs22 .41\cel \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.22\cell \pard\intbl\row \pard}}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 18025}}{\sp{\sn relTop}{\sv 2846}}{\sp{\sn relRight}{\sv 20152}}{\sp{\sn relBottom}{\sv 3117}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}vs\n\{s\{p{ }1s} fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\ql\li0\fi0\ri0\sb0\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 4.2.3 lentel\f0\cchs186 \'eb\f0\cchs186 s t\f0\cchs186 \'e6\f0\cchs186 sinys\par }}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 12629}}{\sp{\sn relTop}{\sv 4074}}{\sp{\sn relRight}{\sv 20100}}{\sp{\sn relBottom}{\sv 4549}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s22\ql\li0\fi2821\ri0\sb0\sa0\sl-161\slmult0\tlhyph\tx3456\tldot\tx3812 \cs62\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs18 _ ,{\charscalex100\expndtw0\tab }{\charscalex100\expndtw0\tab }.\f0\cchs186 \'84\'ab\f0\cchs186 , , icigu \expndtw20 trukumoexpndtw0 \cs55fs22 visi\f0\cchs186 \'f0\f0\cchs186 kai nejau\f0\cchs186 -\line \'e8\f0\cchs186 iama \f0\cchs186 \'97\f0\cchs186 vertinimas \cs49\f0\cchs186 \'84\f0\cchs186 -2".\par }}}}}{\shpgrp{\*\shpinst \shpleft-373\shptop6683\shpright8098\shpbottom12511\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr2\shpwrk3\shpz8\shplid8{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn groupLeft}{\sv 1050}}{\sp{\sn groupTop}{\sv 9267}}{\sp{\sn groupRight}{\sv 9521}}{\sp{\sn groupBottom}{\sv 15095}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 1050}}{\sp{\sn relTop}{\sv 10275}}{\sp{\sn relRight}{\sv 9521}}{\sp{\sn relBottom}{\sv 15095}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdr15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li246\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Nr\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\strike0\nosupersub\scaps0\chrlex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Teiginys\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Vid.*\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 St. n.\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1 \super 1\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta u\f0\cchs186 \'fe\f0\cchs186 mokes\f0\cchs186 \'e8\f0\cchs186 io u\f0\cchs186 \'fe\f0\cchs186 \cs56\fs18 papildom\f0\cchs186 \'e0\f0\cchs186 \cs55\fs22 darb\f0\cchs186 \'e0\f0\cchs186 ,.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.43\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.84\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 12.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta materialinio paskatinimo itin gabiems mokiniams.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.35\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.87\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 13.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-288\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta bendros itin gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo politikos visos i\f0\cchs186 \'f0\f0\cchs186 liet \cs52\expndtw-20\fs30 j \cs44\expndtw0\fs22 mastu.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.27\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.85\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 14.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 [Tr\f0\cchs186 \'fb\f0\cchs186 ksta apr\f0\cchs186 \'fb\f0\cchs186 pinimo reikalinga mokymo metodine med\f0\cchs186 \'fe\f0\cchs186 iaga\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.22\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.96\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 15.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-296\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta kvalifikacijos k\f0\cchs186 \'eb\f0\cchs186 limo kurs\f0\cchs186 \'f8\f0\cchs186 itin gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo \cs44 tems.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1\cs49 .20\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.91\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrsbrdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0\sl-407\slmult0 \intbl \cs52\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw-20\up2\f0\cchs186\lang1063\langfe1063\fs30 j \cs44\expndtw0\fs22 6. \cs55 j\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-313\slmult0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta \cs55 bendradarbiavimo tu auk\f0\cchs186 \'f0\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 mokykl\f0\cchs186 \'f8\f0\cchs186 d\f0\cchs186 \'eb\f0\cchs186 stytojais, \cs44 mokalininkaif.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1\cs49 .04\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.99\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-313\slmult0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 7. \cs55 1 \cs44 Tr\f0\cchs186 \'fb\f0\cchs186 ksta literatu \expndtw-20 rot\expndtw0 \cs54\i\expndtw-20 apie itin \cs55\i0\expndtw0 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 pa\f0\cchs186 \'fe\f0\cchs186 inim\f0\cchs186 \'e0\f0\cchs186 , ugdym\f0\cchs186 \'e0\f0\cchs186 , \cs52\expndtw-20\fs30 j \cs55\expndtw0\fs22 psichologij\f0\cchs186 \'e0\f0\cchs186 , \cs44 kir\f0\cchs186 \'f8\f0\cchs186 \cs55\f0\cchs186 \'f0\f0\cchs186 ali\f0\cchs186 \'f8\f0\cchs186 patirt j.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1\cs49 .00\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.97\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 8. \cs55 j Tr\f0\cchs186 \'fb\f0\cchs186 ksta \cs44 bendradarbiavimo \cs55 su patyrusiais \f0\cchs186 \'f0\f0\cchs186 ioje srityje kolegomis,\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.88\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.02\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s32\ql\li0\fi0\ri0\sb0\sa0\sl-356\slmult0 \intbl \cs52\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw-20\dn4\f0\cchs186\lang1063\langfe1063\fs30 1 \cs49\expndtw0\fs22 1\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtu0\dn0\f0\cchs186\lang1063\langfe1063\fs22 'r\f0\cchs186 \'fb\f0\cchs186 ksta \cs44 tinkamo \cs55 pasirengimo auk\f0\cchs186 \'f0\f0\cchs186 tojoje mokykloje.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.56\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.17\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 10. 7\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 r\f0\cchs186 \'fb\f0\cchs186 ksta galimybi\f0\cchs186 \'f8\f0\cchs186 \cs44 naudotis \cs55 kompiuteriu ir internetu.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 -0.19\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.33\cell \pard\intbl\row \pard}}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 2151}}{\sp{\sn relTop}{\sv 9267}}{\sp{\sn relRight}{\sv 8724}}{\sp{\sn relBottom}{\sv 10300}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s2\qj\li0\fi0\ri0\sb0\sa0\sl-330\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Duomenys apie tai, ko mokytojams tr\f0\cchs186 \'fb\f0\cchs186 ksta darbui su itin\par \pard \plain \s20\ql\li0\fi2406\ri0\sb0\sa0\sl-330\slmult0\tlul\tx805 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 gabiais vaikais\line \lang1033 {\charscalex100\expndtw0\tab }\ul\lang1063 (Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , Janilionis,\ul0 Almonaitien\f0\cchs186 \'eb\f0\cchs186 , \cs49 2002)\par }}}}}\pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0\sl-322\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 niams, galima manyti, kad jaunesni\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 klasi\f0\cchs186 \'f8\f0\cchs186 gabi\f0\cchs186 \'f8\f0\cchs186 mokini\fcchs186 \'f8\f0\cchs186 ugdymo rezulta\-tai \f0\cchs186\'fe\f0\cchs186 inomi ir fiksuojami tik klases ir mokyklos (atskirais atvejais savivaldyb\f0\cchs186 \'eb\f0\cchs186 s) lygmeniu. be to, olimpiad\f0\cchs186 \'f8\f0\cchs186 rezultatai - tai tik pasiekimai, \cs49 o \cs55 kas daroma klas\f0\cchs186 \'eb\-\f0\cchs186 je, \cs53\i\expndtw-10 mokykloje, \cs55\i0\expndtw0 kad tie pasiekimai b\f0\cchs186 \'fb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 tokie, ir \cs49 ar \cs55 tie pasiekimai \f0\cchs186 \'97\f0\cchs186 tai mokytojo ir mokinio darbo rezultatas ar tik mokinio potencialo \{vertinimas, informaci\-jos taip pat neturime arba turime labai nedaug \cs49 (\f0\cchs186 \'fe\f0\cchs186 r. \cs55 Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , \cs49 1997,1998, \cs55 2003, Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , Janilionis, Almonaitien\f0\cchs186 \'eb\f0\cchs186 , \cs49 2002).\par \pard \plain \s2\qj\li0\fi576\ri0\sb0\sa0\sl-322\slmult0 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Mokytoj\f0\cchs186 \'f8\f0\cchs186 rengimas. \cs55\i0\expndtw0 N\f0\cchs186 \'eb\f0\cchs186 vienas Lietuvos universitetas, rengiantis mokyto\-jus, nesi\f0\cchs186 \'fb\f0\cchs186 lo pirmos ar antros pakopos studij\f0\cchs186 \'f8\f0\cchs186 programos, kurios paskirtis b\f0\cchs186 \'fb\f0\cchs186 t\f0\cchs186 \'f8 \f0\cchs186 ai\f0\cchs186 \'f0\f0\cchs186 kiai orientuota \f0cchs186 \'e1\f0\cchs186 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo specialisto parengim\f0\cchs186 \'e0\f0\cchs186 . Per\f0\cchs186 \'fe\f0\cchs186 i\f0\cchs186 \'fb\f0\cchs186 r\f0\cchs186 \'eb\f0\cchs186 jus mokytoj\f0\cchs186 \'f8\f0\cchs186 rengimo programas Vilniaus pedagginiame, \f0\cchs186 \'d0\f0\cchs186 iauli\f0\cchs186 \'f8\f0\cchs186 , Kauno tech\-nologijos bei Vytauto Did\f0\cchs186 \'fe\f0\cchs186 iojo universitetuose, rasti tik du, be to, tik \cs63\i\expndtw-20 pasiren\-kamieji \cs55\i0\expndtw0 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 problemoms skirti moduliai. Tai Vilniaus pedagoginiame universitete neakivaizdininkams \cs63\i\expndtw-20 si\f0\cchs186 \'fb\f0\cchs186 lomas \cs55\i0\expndtw0 modulis \f0\cchs186 \'84\f0\cchs186 Gabi\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 atpa\f0\cchs186 \'fe\f0\cchs186 inimas ir ugdymo galimyb\f0\cchs186 \'eb\f0\cchs186 s" bei \f0\cchs186 \'d0\f0\cchs186 iauli\f0\cchs186 \'f8\f0\cchs186 pedagoginiame universitete si\f0\cchs186 \'fb\f0\cchs186 lomas modulis \f0\cchs186 \'84\f0\cchs186 Gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 psichologija".\par \pard \plain \s23\qj\li0\fi576\ri0\sb8\sa0\sl-322\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Lietuvos mokytojams, \cs49 tyrim\f0\cchs186 \'f8\f0\cchs186 duomenimis (Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , \cs55 Janilionis, \cs49 Almonaitien\f0\cchs186 \'eb\f0\cchs186 , \cs55 2002), darbui su \cs49 gabiais vaikais tr\f0\cchs186 \'fb\f0\cchs186 ksta \cs55 ir tinkamo pasirengimo auk\f0\cchs186 \'f0\f0\cchs186 tojoje \cs49 mokykloje, ir kir\f0\cchs186 \'f8\f0\cchs186 \cs55 dalyk\f0\cchs186 \'f8\f0\cchs186 \cs49 (\f0\cchs186 \'fe\f0\cchs186 r. 4.2.3 lentel\f0\cchs186 \'e6\f0\cchs186 ).\par \pard \plain \s11\qr\li0\fi0\ri0{\sl-240\slmult0\fs20\p`r }\sb65\sa0 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 4.2.3 \cs55 lentel\f0\cchs186 \'eb\par \pard \plain \s29\ql\li0\fi568\ri0\sb0\sa0\sl-722\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Lentel\f0\cchs186 \'eb\f0\cchs186 je teiginiai pateikti eil\f0\cchs186 \'eb\f0\cchs186 s tvarka pagal tr\f0\cchs186 \'fb\f0\cchs186 kumo \f0\cchs186 \'e1\f0\cchs186 vertinimo vidur\-k\f0\cchs186 \'e1\f0\cchs186 . Matome, jog labiausiai, mokytoj\f0\cchs186 \'f8\f0\cchs186 nuomone, tr\f0\cchs186 \'fb\f0\cchs186 ksta u\f0\cchs186 \'fe\f0\cchs186 mokes\f0\cchs186 \'e8\f0\cchs186 io u\f0\cchs186 \'fe\f0\cchs186 papil\-dom\f0\cchs186 \'e0\f0\cchs186 darb\f0\cchs186 \'e0\f0\cchs186 , materialinio paskatinimo gabiems vaikams ir bendros gabi\f0\cchs186 \'f8\f0\cchs186 vai\-k\f0\cchs186 \'f8\f0\cchs186 ugdymo politikos visos \f0\cchs186 \'f0\f0\cchs186 alies mastu. Su pirmu teiginiu visi\f0\cchs186 \'f0\f0\cchs186 kai sutiko \cs49 59%, \cs55 sutiko \cs49 30% \cs55 (t.y. i\f0\cchs186 \'f0\f0\cchs186 viso taip teig\f0\cchs186 \'eb\f0\cchs186 \cs49 89%) \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 , dar \cs49 7% \cs55 renkasi neutrali\f0\cchs186 \'e0 \f0\cchs186 pozicij\f0\cchs186 \'e0\f0\cchs186 . \cs49 88% \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 mano, jog tr\f0\cchs186 \'fb\f0\cchs186 ksta materialinio paskatinimo patiems gabiems mokiniams. \cs49 87% \cs55 respondent\f0\cchs186 \'f8\f0\cchs186 mano, kad tr\f0\cchs186 \'fb\f0\cchs186 ksta bendros itin gabi\f0\cchs186 \'f8 \f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo politikos \f0\cchs186 \'d0\f0\cchs186 alies mastu; \cs49 84% \cs55 - apr\f0\cchs186 \'fb\f0\cchs186 pinimo mokymo metodi\-ne med\f0\cchs186 \'fe\f0\cchs186 iaga; \cs49 86% \cs55 - kvalifikacijos k\f0\cchs186 \'eb\f0\cchs186 limo kurs\f0\cchs186 \'f8\f0\cchs186 , \cs49 79% \cs55 - bendradarbiavimo su mokslininkais; \cs49 76% \cs55 - atitinkamos literat\f0\cchs186 \'fb\f0\cchs186 ras; \cs49 74% \cs55 - bendradarbiavimo su patyrusiais \f0\cchs186 \'f0\f0\cchs186 ioje srityje kolegomis (neutralus vertinimas - \cs49 14%). \cs55 Tinkamo pasirengimo auk\f0\cchs186 \'f0\f0\cchs186 tojoje mokykloje pasigedo \cs49 60% \cs55 apklaust\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 mokytoj\f0\cchs186 \'f8\f0\cchs186 , tik penktadalis \cs49 (21%) \cs55 j\f0\cchs186 \'f8\f0\cchs186 sutiko, jog auk\f0\cchs186 \'f0\f0\cchs186 toji mokykla pareng\f0\cchs186 \'eb\f0\cchs186 j\f0\cchs186 \'e1\f0\cchs186 /j\f0\cchs186 \'e0\f0\cchs186 \f0\cchs186 \'f0\f0\cchs186 iam darbui. Malonu pasteb\f0\cchs186 \'eb\f0\cchs186 ti, jog \cs49 56% \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 darbui su itin gabiais vaikais \expndtw-20 yra\expndtw0 skatina\-mi ir palaikomi mokyklos administracijos (neutralum\f0\cchs186 \'e0\f0\cchs186 vertinant teigin\f0\cchs186 \'e1\f0\cchs186 rinko\-si \cs49 18%). \cs55 Nema\f0\cchs186 \'fe\f0\cchs186 ai mokytoj\f0\cchs186 \'f8\f0\cchs186 turi galimybi\f0\cchs186 \'f8\f0\cchs186 naudotis kompiuteriu ir internetu \cs49 (49% \cs55 nejau\f0\cchs186 \'e8\f0\cchs186 ia tr\f0\cchs186 \'fb\f0\cchs186 kumo, \cs49 16% \cs55 lieka neutral\f0\cchs186 \'fb\f0\cchs186 s, \cs49 35% \cs55 tr\f0\cchs186 \'fb\f0\cchs186 ksta tokios galimybes). \cs49 46% \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 jau\f0\cchs186 \'e8\f0\cchs186 ia t\f0\cchs186 \'eb\f0\cchs186 v\f0\cchs186 \'f8\f0\cchs186 palaikym\f0\cchs186 \'e0\f0\cchs186 , \cs49 31% \cs55 tokio palaikymo pasigenda.\par \pard \plain \s17\ql\li0\fi0\ri0\sb0\sa0\sl-322\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Anketoje buvo palikta vieta laisvam atsakymui, ko \cs64\b\expndtw-20\fs26 dar tr\f0\cchs186 \'fb\f0\cchs186 ksta, \cs55\b0\expndtw0\f0\cchs186\fs22 \'e1\f0\cchs186 ra\f0\cchs186 \'f0\f0\cchs186 yti. Pa\-min\f0\cchs186 \'eb\f0\cchs186 tini tokie dalykai, kuri\f0\cchs186 \'f8\f0\cchs186 mokytojai nurod\f0\cchs186 \'eb\f0\cchs186 pasigendantys (kalba netaisyta): \cs63\i\expndtw-20 d\f0\cchs186 \'eb\f0\cchs186 mesio, sistemos Siame darbe; \f0\cchs186 \'e1\f0\cchs186 d\f0\cchs186 \'eb\f0\cchs186 jimu \f0\cchs186 \'e1\f0\cchs186 J\f0\cchs186 \'e1\f0\cchs186 darini plali\f0\cchs186 \'e0\f0\cchs186 ja prasme; pa$d laikmet\f0\cchs186 \'e1 \f0\cchs186 apr\f0\cchs186 \'fb\f0\cchs186 pinto kabineto; lenko; &bi\f0\cchs186 \'f8\f0\cchs186 mokini\f0\cchs186 \'f8\f0\cchs186 su ffra mokymosi motyvacija; skiriam\f0\cchs186 \'e0 \f0\cchs186 papildomai pamoki\f0\cchs186 \'e1\f0\cchs186 mokytojai - olimpiadoms ruo\f0\cchs186 \'f0\f0\cchs186 tis; materialin\f0\cchs186 \'eb\f0\cchs186 s bas\f0\cchs186 \'e6\f0\cchs186 s, ma&u* mokint\f0\cchs186 \'e0\f0\cchs186 skaiiiaus klas\f0\cchs186 \'eb\f0\cchs186 je, nes bana labai sunku diferencijuotai dirbti, meni nesp\f0\cchs186 \'eb\f0\cchs186 ja, kiti neturi k\f0\cchs186 \'e0\f0\cchs186 neikti, vadov\f0\cchs186 \'eb\f0\cchs186 liuose dainai n\f0\cchs186 \'eb\f0\cchs186 ra tinkam\f0\cchs186 \'e0\f0\cchs186 nf\f0\cchs186 \'eb\f0\cchs186 eoti\f0\cchs186 \'e0\f0\cchs186 ; dau\f0\cchs186 \'fe\f0\cchs186 tu stovykl\f0\cchs186 \'f8 \sub\f0\cchs186 ga\nosupersub /,iems tankiniam respublikos mastu, bet kad \f0\cchs186 \'e1\f0\cchs186 jos patekt\f0\cchs186 \'f8\f0\cchs186 irprmncijos vaikai, \expndtw0 o\expndtw-20 \expndtw0 neHk\expndtw-20 didf\f0\cchs186 \'e1\f0\cchs186 nj\f0\cchs186 \'f8\f0\cchs186 miest\f0\cchs186 \'f8\f0\cchs186 ; mokini\f0\achs186 \'f8\f0\cchs186 suinterrsmtama mokytis; laiko per pamokas m po pamnk\f0\cchs186 \'e0\f0\cchs186 ; bijau perkrauti mokinis nereikt\f0\cchs186 \'f8\f0\cchs186 niveliuoti \f0\cchs186 \'e1\f0\cchs186 tatna\f0\cchs186 \'f8\f0\cchs186 j/\f0\cchs186 \'f8\f0\cchs186 \expndtw0 irj\f0\cchs186 \'f8\expndtw-20\f0\cchs186 sukart\f0\cchs186 \'f8 \f0\cchs186 proffttm\f0\cchs186 \'f8\f0\cchs186 .\par \pard \plain \s34\qc\li0\fi0\ri0\sb102\sa0 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Apilmidrinamosios i\f0\cchs186 \'f0\f0\cchs186 vados\par \pard \plain \s29\ql\li584\fi0\ri0\sb110\sa0 \cs64\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs26 Tiriant GAVUS \cs55\b0\expndtw0\fs22 modelio rai\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'e0\f0\cchs186 visuomeniniame lygmenyje, i\f0\cchs186 \'f0\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'eb\f0\cchs186 jo\par \pard \plain \s11\ql\li0\fi0\ri0\sb102\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 tokios problemos:\par } diff --git a/sw/qa/extras/layout/data/forcepoint100.html b/sw/qa/extras/layout/data/forcepoint100.html new file mode 100644 index 0000000000..b973c6e8cd Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint100.html differ diff --git a/sw/qa/extras/layout/data/forcepoint102.rtf b/sw/qa/extras/layout/data/forcepoint102.rtf new file mode 100644 index 0000000000..337e964c3b --- /dev/null +++ b/sw/qa/extras/layout/data/forcepoint102.rtf @@ -0,0 +1,178 @@ +{\rtf1\ansh\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0 Times New Roman;}{\f1 Courier New;}{\f2 ARIAL;}}{colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs32\lang1033\langfe1033\kerning32\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon469 \snext0 heading 2;}{\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs26\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 3;}{\*\cs1024 \additive Default Paragraph Font;}{\*\cs5\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs32\lang1033\langfe1033\kerning32\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\i\f1\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 2;}{\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs26\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 3;}{\*\cs1024 \additive Default Paragraph Font;}{\*\cs24 \additive \ul\cf2 \sbasedon10 Hyperlink;}}{\info{\title Converted by FileMerlin API}{\subject }{\author }{\vern8247}}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\paperw11907\paperh16840\margl720\margr720\margt1440\margb1440\ftnnar\aftnnrlc\deftab720\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1701\dgvorigin1984\dghshow1\dgvshow1\jexpand\viewkind1\viewscale135\viewzk2\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet2\facingp\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\sectd\pgndec\titlepg\sftnnar\saftnnrlc\sbknone\cols1\headery720\footery960 \pard\plain \ql\sl280\widctlpar{\b\fs28\f2 }\par \pard\plain \ql\sl280\widctlpar{\b\fs28\f2 Personenblatt Josef W\'f6 +ginger (16525)}{\v\tc{\fs18\f2 {\*\bkmkstart 0}}{\fs18\f2 Personenblatt Josef W\'f6 +ginger (16525){\*\bkmkend 0}}}\fs18\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar\intbl{\b\fs18\f2 }{\b\fs18\f2 Proband*}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Josef}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (16525)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Josef (16525) (vor . .1755-vor . .1832)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Josef\:W\'f6 +ginger (16525) (vor . .1755-vor . .1832)}}{\fs18\f2 }\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw40\brdrcf1 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw40\brdrcf1 \clcbpat15\cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw40\brdrcf1 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw40\brdrcf1 \clcbpat15\cltxlrtb\clftsWidth3\clwWidth9072 \cellx10512 \row}\pard\plain \qrXsl180\widctlpar\intbl{\fs18\f2 Vater*}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 \~}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 \~}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 Mutter*}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 \~}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 \~}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 Geburt*}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 vor __.__.1755}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 Sievering, \'d6 +sterreich}{\v\xe{\fs18\f2 Personen und Orte\:Sievering\:\'d6 +sterreich}}{\fs18\f2 .}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 Heirat*}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 __.__.1776?}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:W\'f6 +ginger, Josef (16525) und Josefa Angermayer (16526) (\'ba +\'ba + . .1776?)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Angermayer, Josefa (16526) und Josef W\'f6 +ginger (16525) (\'ba +\'ba + . .1776?)}}{\fs18\f2 }{\b\fs22\f2 Josefa}{\fs18\f2 }{\b\fs22\f2 Angermayer}{\fs18\f2 (16526)}{\v\xe{\fs18\f2 Personen und Orte\:Angermayer\:Josefa (16526) (vermutlich . .1757-20.1.1833)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Josefa\:Angermayer (16526) (vermutlich . .1757-20.1.1833)}}{\fs18\f2 (* vermutlich . .1757, \'86 + 20.1.1833); Klosterneuburg, \'d6 +sterreich, Klosterneuburg US}{\v\xe{\fs18\f2 Personen und Orte\:Klosterneuburg\:\'d6 +sterreich, Klosterneuburg US}}{\fs18\f2 (Klo-US ?).}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw8198\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 Wohnsitz*}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 __.__.1777}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 Josefa Angermayer (16526)}{\v\xe{\fs18\f2 Personen und Orte\:Angermayer\:Josefa (16526) (vermutlich . .1757-20.1.1833)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Josef\:Angermayer (16526) (vermutlich . .1757-20.1.1833)}}{\fs18\f2 (* vermutlich . .1757, \'86 + 20.1.1833); Nr. 17, Obersievering, \'d6 +sterreich}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich}}{\fs18\f2 .}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\rdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brfrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 5.1.1777}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Josef}{\fs18\f2 }{\b\fs2354\f2 W\'f6 +ginger}{\fs18\f2 (39463)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Josef (39463) (5.1.1777- )}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Josef\:W\'f6 +ginger (39463) (5.1.1777- )}}{\fs18\f2 ; Nr. 17, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 1}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 26.6.1778}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Mathias}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39480)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Mathias (39480) (26.6.1778- )}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Mathias\:W\'f6 +ginger (39480) (26.6.1778- )}}{\fs18\f2 ; Nr. 17, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 2}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 11.1.1779}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 Taufe/Kleinkind-; Josefa Schreiber (16425)}{\v\xe{\fs18\f2 Personen und Orte\:Schreiber\:Josefa (16425) (11.1.1779-2.1.1820)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Josefa\:Schreiber (16425) (11.1.1779-2.1.1820)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 3}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 16.5.1779}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Lazelsberger, Franz (39324) und Barbara NN (21048) (\'ba +\'ba + 16.5.1779)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:NN, Barbara (21048) und Franz Lazelsberger (39324) (\'ba +\'ba + 16.5.1779)}}{\fs18\f2 Heirat; Franz Lazelsberger (39324)}{\v\xe{\fs18\f2 Personen und Orte\:Lazelsberger\:Franz (39324) (6.3.1753- )}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Franz\:Lazelsberger (39324) (6.3.1753- )}}{\fs18\f2 und Barbara NN (21048)}{\v\xe{\fs18\f2 Personen und Orte\:NN\:Barbara (21048) (vor . .1750- )}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Barbara\:NN (21048) (vor . .1750- )}}{\fs18\f2 ; Heiligenstadt, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Heiligenstadt\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 4}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Tochter:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 12.6.1780}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Maria Anna}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39503)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Maria Anna (39503) (12.6.1780-12.10.1824)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Maria Anna\:W\'f6 +ginger (39503) (12.6.1780-12.10.1824)}}{\fs18\f2 ; Nr. 17, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 5}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 9.3.1782}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Franz}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (16215)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Franz (16215) (9.3.1782-31.8.1860)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Franz\:W\'f6 +ginger (16215) (9.3.1782-31.8.1860)}}{\fs18\f2 ; Nr. 17, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 6}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Tochter:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 15.3.1784}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Josefa}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39562)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Josefa (39562) (15.3.1784-4.10.1784)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Josefa\:W\'f6 +ginger (39562) (15.3.1784-4.10.1784)}}{\fs18\f32 ; Nr. 17, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 7}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 16.8.1785}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Leopold}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39592)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Leopold (39592) (16.8.1785-21.9.1790)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Leopold\:W\'f6 +ginger (39592) (16.8.1785-21.9.1790)}}{\fs18\f2 ; Nr. 17, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 8}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth255\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Wohnsitz*}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 __.__.1787}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 Nr. 40, Obersievering, \'d6 +sterreich}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich}}{\fs18\f2 .}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 6.2.1787}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:W\'f6 +ginger, Severin (16724) und Theresia Fogowitsch (16725) (\'ba +\'ba + 6.2.1787)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Fogowitsch, Theresia (16725) und Severin W\'f6 +ginger (16724) (\'ba +\'ba + 6.2.1787)}}{\fs18\f2 Heirat; Severin W\'f6 +ginger (16724)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Severin (16724) (20.4.1762-vor . .1838)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Severin\:W\'f6 +ginger (16724) (20.4.1762-vor . .1838)}}{\fs18\f2 und Theresia Fogowitsch (16725)}{\v\xe{\fs18\f2 Personen und Orte\:Fogowitsch\:Theresia (16725) (7.1.1765-18.8.1800)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Theresia\:Fogowitsch (16725) (7.1.1765-18.8.1800)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 9}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 16.4.1787}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Steinzer, Mathias (20065) und Theresia Schwaiger (20068) (\'ba +\'ba + 16.4.1787)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Schwaiger, Theresia (20068) und Mathias Steinzer (20065) (\'ba +\'ba + 16.4.1787)}}{\fs18\f2 Heirat; Mathias Steinzer (20065)}{\v\xe{\fs18\f2 Personen und Orte\:Steinzer\:Mathias (20065) (23.12.1763-7.2.1828)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personan und Orte\:Mathias\:Steinzer (20065) (23.12.1763-7.2.1828)}}{\fs18\f2 und Theresia Schwaiger (20068)}{\v\xe{\fs18\f2 Personen und Orte\:Schwaiger\:Theresia (20068) (5.1.1763-28.1.1828)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Theresia\:Schwaiger (20068) (5.1.1763-28.1.1828)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +stesreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 10}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 14.5.1787}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Kraninger, Severin (1459) und Magdalena Bitzl (20081) (\'ba +\'ba + 14.5.1787)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Bitzl, Magdalena (20081) und Severin Kraninger (1459) (\'ba +\'ba + 14.5.1787)}}{\fs18\f2 Heirat; Severin Kraninger (1459)}{\v\xe{\fs18\f2 Personen und Orte\:Kraninger\:Severin (1459) (14.4.1766-15.8.1816)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Severin\:Kraninger (1459) (14.4.1766-15.8.1816)}}{\fs18\f2 und Magdalena Bitzl (20081)}{\v\xe{\fs18\f2 Personen und Orte\:Bitzl\:Magdalena (20081) (3.2.1760-29.12.1825)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Magdalena\:Bitzl (20081) (3.2.1760-29.12.1825)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 11}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 20.12.1787}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Severin}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39635)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Severin (39635) (20.12.1787- )}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Severin\:W\'f6 +ginger (39635) (20.12.1787- )}}{\fs18\f2 ; Nr. 40, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich$ Sievering}}{\fs18\f2 .}{\super\fs16\f2 12}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 7.3.1790}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Karl}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39673)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Karl (39673) (7.3.1790-29.10.1790)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Karl\:W\'f6 +ginger (39673) (7.3.1790-29.10.1790)}}{\fs18\f2 ; Nr. 40, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 13}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfz3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Tochter:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 28.9.1791}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Barbara}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39694)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Barbara (39694) (28.9.1791-10.1.1798)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Barbara\:W\'f6 +ginger (39694) (28.9.1791-10.1.1798)}}{\fs18\f2 ; Nr. 40, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 14}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 12.11.1792}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Faber, Michael (20991) und Josefa W\'f6 +ginger (16671) (\'ba +\'ba + 12.11.1792)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:W\'f6 +ginger, Josefa (16671) und Michael Faber (20991) (\'ba +\'ba + 12.11.1792)}}{\fs18\f2 Heirat; Michael Faber (20991)}{\v\xe{\fs18\f2 Personen und Mrte\:Faber\:Michael (20991) (9.1.1740-12.3.1799)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Michael\:Faber (20991) (9.1.1740-12.3.1799)}}{\fs18\f2 und Josefa W\'f6 +ginger (16671)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Josefa (16671) (18.5.1760-1.11.1828)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Josefa\:W\'f6 +ginger (16671) (18.5.1760-1.11.1828)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 15}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 29.3.1794}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Karl}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39749)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Karl (39749) (29.3.1794-7.8.1794)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Karl\:W\'f6 +ginger (39749) (29.3.1794-7.8.1794)}}{\fs18\f2 ; Nr. 40, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 16}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 23.11.1795}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:W\'f6 +ginger, Johann (15807) und Theresia Bachmayr (15806) (\'ba +\'ba + 23.11.1795)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Bachmayr, Theresia (15806) und Johaon W\'f6 +ginger (15807) (\'ba +\'ba + 23.11.1795)}}{\fs18\f2 Heirat; Johann W\'f6 +ginger (15807)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Johann (15807) (26.2.1769-4.2.1822)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Johann\:W\'f6 +ginger (15807) (26.2.1769-4.2.1822)}}{\fs18\f2 und Theresia Bachmayr (15806)}{\v\xe{\fs18\f2 Personen und Orte\:Bachmayr\:Theresia (15806) (12.2.1774-zwischen 1832 und 1837)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Theresia\:Bachmayr (15806) (12.2.1774-zwischen 1832 und 1837)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 17}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 23.1.1796}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Karl}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (41096)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Karl (41096) (23.1.1796-zwischen 1853 und 1855)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Karl\:W\'f6 +ginger (41096) (23.1.1796-zwischen 1853 und 1855)}}{\fs18\f2 ; Nr. 40, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 *}{\super\fs16\f2 18}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 22.3.1796}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 Taufe/Kleinkind-; Barbara Schreiber (16702)}{\v\xe{\fs18\f2 Personen und Orte\:Schreiber\:Barbara (16702) (22.3.1796-nach . .1865)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Barbara\:Schreiber (16702) (22.3.1796-nach . .1865)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 19}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cdllx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Sohn:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 19.8.1798}\cell\pard\plain \ql\sl220\widctlpar\intbl{\b\fs22\f2 }{\b\fs22\f2 Johann}{\fs18\f2 }{\b\fs22\f2 W\'f6 +ginger}{\fs18\f2 (39838)}{\v\xe{\fs18\f2 Personen und Orte\:W\'f6 +ginger\:Johann (39838) (19.8.1798-25.3.1799)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Johann\:W\'f6 +ginger (39838) (19.8.1798-25.3.1799)}}{\fs18\f-2835269706644948777 ; Nr. 40, Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 20}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertmu\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 17.7.1799}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Lettner, Johann (20813) und Barbara Wonbacher (16688) (\'ba +\'ba + 17.7.1799)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Wonbacher, Barbara (16688) und Johann Lettner (20813) (\'ba +\'ba + 17.7.1799)}}{\fs18\f2 Heirat; Johann Lettner (20813)}{\v\xe{\fs18\f2 Personen und Orte\:Lettner\:Johann (20813) (24.12.1772-5.7.1847)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Johann\:Lettner (20813) (24.12.1772-5.7.1847)}}{\fs18\f2 und Barbara Wonbacher (16688)}{\v\xe{\fs18\f2 Personen und Orte\:Wonbacher\:Barbara (16688) (10.2.1767-18.7.1823)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Barbara\:Wonbacher (16688) (10.2.1767-18.7.1823)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 21}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf5 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 28.4.1800}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Schadelberger, Severin (16269) und Theresia Schuster (16637) (\'ba +\'ba + 28.4.1800)}}{\fs18\f2 }{\v\xe{\fs18\f2 Heiraten\:Skhuster, Theresia (16637) und Severin Schadelberger (16269) (\'ba +\'ba + 28.4.1800)}}{\fs18\f2 Heirat; Severin Schadelberger (16269)}{\v\xe{\fs18\f2 Personen und Orte\:Schadelberger\:Severin (16269) (vermutlich . .1748-vor . .1807)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Severin\:Schadelberger (16269) (vermutlich . .1748-vor . .1807)}}{\fs18\f2 und Theresia Schuster (16637)}{\v\xe{\fs18\f2 Personen und Orte\:Schuster\:Theresia (16637) (vermutlich . .1776-12.5.1827)}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Theresia\:Schuster (16637) (vermutlich . .1776-12.5.1827)}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}{\super\fs16\f2 22}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw!0\brdrcf15 \clbrdrr\brdrs\brdrw0\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 }{\fs18\f2 Zeuge:}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 25.6.1805}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 Taufe/Kleinkind-; Alois Wasinger (16613)}{\v\xe{\fs18\f2 Personen und Orte\:Wasinger\:Alois (16613) (25.6.1805- )}}{\fs18\f2 }{\v\xe{\fs18\f2 Personen und Orte\:Alois\:Wasinger (16613) (25.6.1805- )}}{\fs18\f2 ; Obersievering, \'d6 +sterreich, Sievering}{\v\xe{\fs18\f2 Personen und Orte\:Obersievering\:\'d6 +sterreich, Sievering}}{\fs18\f2 .}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 Tod*}\cell\pard\plain \qr\sl180\widctlpar\intbl{\fs18\f2 vor __.__.1832}\cell\pard\plain \ql\sl180\widctlpar\intbl{\fs18\f2 \~}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx1440 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw10\clpadr60\brdrcf15 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrs\brdrw10\clpadl60\brdrcf15 \clbrdrt\brdrs\brdrw10\brdrcf15 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw10\brdrcf15 \cltxlrtb\clftsWidth3\clwWidth6912 \cellx10512 \row}\pard\plain \ql\sl180\widctlpar\intbl{\b\fs18\f2 }{\b\fs18\f2 Referenz= (verstorben @ Jahren) Kinder=12}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrs\brdrw40\brdrcf1 \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw40\brdrcf1 \clcbpat15\cltxlrtb\clftsWidth3\clwWidth10512 \cellx10512 \row}\pard\plain \ql\sl20\widctlpar\intbl{\fs2\f2 \~}\cell\pard\plain \ql\sl20\widctlpar\intbl{\fs2\f2 \~}\cell\pard\plain \ql\sl20\widctlpar\intbl{\fs2\f2 \~}\cell\pard\plain \ql\sl20\widctlpar\intbl{\fs2\f2 \~}\cell\pard\plain \ql\sl20\widctlpar\intbl{\fs2\f2 \~}\cell\pard\plain \ql\sl20\widctlpar\intbl{\fs2\f2 \~}\cell\pard\plain \ql\sl20\widctlpar\intbl{\fs2\f2 \~}\cell{\trowd\trqc\trpaddl60\trpaddfl3\trpaddt0\trpaddft3\trpaddr60\trpaddfr3\trpaddb0\trpaddfb3\clvertalt\clbrdrl\brdrs\brdrw40\clpadl60\brdrcf1 \clbrdrt\brdrnone \clbrdrr\brdrnone \clbrdrb\brdrs\brdrw40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth360 \cellx360 \clvertalt\clbrdrl\brdrnone \clbrdrt\brdrnone \clbrdrr\brdrnone \clbrdrb\brdrs\brdrw40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth360 \cellx720 \clvertalt\clbrdrl\brdrnone \clbrdrt\brdrnone \clbrdrr\brdrnone \clbrdrb\brdrs\brdrw40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth720 \cellx1440 \clvertalt\clbrdrl\brdrnone \clbrdrt\brdrnone \clbrdrr\brdrnone \clbrdrb\brdrs\brdrw40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth2160 \cellx3600 \clvertalt\clbrdrl\brdrnone \clbrdrt\brdrnone \clbrdrr\brdrnone \clbrdrb\brdrs\brdrw40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth4032 \cellx7632 \clvertalt\clbrdrl\brdrnone \clbrdrt\brdrnone \clbrdrr\brdrnone \clbrdrb\brdrs\brdrw40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx9072 \clvertalt\clbrdrl\brdrnone \clbrdrt\brdrnone \clbrdrr\brdrs\brdrw40\clpadr60\brdrcf1 \clbrdrb\brdrs\brdrw40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1440 \cellx10512 \row}\pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 Gedruckt am: 27.5.2014 }\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 Erstellt von:}\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 Helmut Leininger}\page \par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \qc\sl280\widctlpar{\b\fs28\f2 }\par \pard\plain \qc\sl280\widctlpar{\b\fs28\f2 Endnoten}{\v\tc{\fs18\f2 {\*\bkmkstart 1}}{\fs18\f2 Endnoten{\*\bkmkend 1}}}\fs18\par \pard\plain \qc\sl180\widctlpar\fs18\par \pard\plain \qc\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 1. Sievering Taufen BD. 3 (1777-1784) Seite 1, Sievering Taufen BD. 3 Seite 1, (1777-1784), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 3 Seite 1.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 2. Sievering Taufen BD. 3 (1777-1784) Seite 10, Sievering Taufen BD. 3 Seite 10, (1777-1784), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 3 Seite 10.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\pdain \ql\sl180\widctlpar{\fs18\f2 3. "Geburt Josefa Schreiber 1779", 11.1.1779, Pfarre Sievering, Taufreg. BD. III (1777 - 1784) S. 12-Jan 1779.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 4. "Trauung Franz Lasselsberger - Barbara St\'f6 +ssel 1779", 16.5.1779, Pfarre Sievering, Trauungsreg. BD. II (1765-1784) S. 53-Mai 1779.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 5. Sievering Taufen BD. 3 (1777-1784) Seite 19, Sievering Taufen BD. 3 Seite 19, (1777-1784), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 3 Seite 19.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 6. Sievering Taufen BD. 3 (1777-1784) Seite 29, Sievering Taufen BD. 3 Seite 29, (1777-1784), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 3 Seite 29.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 7. Sievering Taufen BD. 3 (1777-1784) Seite 44, Sievering Taufen BD. 3 Seite 44, (1777-1784), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 3 Seite 44.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pa2d\plain \ql\sl180\widctlpar{\fs18\f2 8. Sievering Taufen BD. 4 (1784-1795) Fol. 7, Sievering Taufen BD. 4 Fol. 7, (1784-1795), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 4 Fol. 7.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 9. "Trauung Severin W\'f6 +ginger - Tehresia Fogowitsch 1787", 6.2.1787, Pfarre Sievering, Trauungsreg. BD. III (1784-1798) Fol. 15-FEB 1787.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 10. "Trauung Mathias Steinzer - Theresia Schwaiger 1787", 16.4.1787, Pfarre Sievering, Trauungsreg BD. III (1784-1798) Fol. 17-Apr 1787.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 11. "Trauung Severin Graninger - Magdalena Bitzl 1787", 14.5.1787, Pfarre Sievering, Trauungsreg. BD. III (1784-1798) Fol. 18-Mai 1787.}\par \pard\plain \ql\sl180\widctltar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 12. Sievering Taufen BD. 4 (1784-1795) Fol. 17, Sievering Taufen BD. 4 Fol. 17, (1784-1795), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 4 Fol. 17.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 13. Sievering Taufen BD. 4 (1784-1795) Fol. 2%, Sievering Taufen BD. 4 Fol. 25, (1784-1795), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 4 Fol. 25.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 14. Sievering Taufen BD. 4 (1784-1795) Fol. 31, Sievering Taufen BD. 4 Fol. 31, (1784-1795), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 4 Fol. 31.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 15. "Trauung Michael Faber - Josefa W\'f6 +ginger 1792", 12.11.1792, Pfarre Sievering, Trauungsreg BD. III (1784-1798) Fol. 27-Nov 1792.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 16. Sievering Taufen BD. 4 (1784-1795) Fol. 41, Sievering Taufen BD. 4 Fol. 41, (1784-1795), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 4 Fol. 41.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 17. "Trauung Johann W\'f6 +ginger - Theresia Bachmayr 1795", 23.11.1795, Pfarre Sievering, Trauungsreg BD/ III (1784-1798) Fol. 36-Nov 1795.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 18. "Geburt Karl W\'f6 +ginger 1796", 23.1.1796, Pfarre Sievering, aufreg. BD. V (1796 - 1813) Fol. 1-Jan 1796.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 19. "Geburt Barbara Schreiber 1796", 22.3.1796, Pfarre Sievering, ufreg. BD. V (1796 - 1813) Fol. 1-Mrz 1796.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 20. Sievering Taufen BD. 5 (1796-1813) Fol. 13, Sievering Taufen BD. 5 Fol. 13, (1796-1813), Sievering - St. Severin, Fr\'f6 +schelgasse 20, Wien, \'d6 +sterreich. Hereinafter cited as Sievering Taufen BD. 5 Fol. 13.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 21. "Trauung Johann Lettner - Barbara Schreiber 1799", 17.7.1799, Pfarre Sievering, Trauungsreg. BD IV (1798-1829) Fol. 5-Jul 1799.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar{\fs18\f2 22. "Trauung Severin Schadelberger - Theresia Schuster 1800", 28.4.1800, Pfarre Sievering, Trauungsreg. BD IV (1798-1829) Fol. 8-Apr 1800.}\par \pard\plain \ql\sl180\widctlpar\fs18\par \pard\plain \ql\sl180\widctlpar\fs18\par {\headerf\pgnstart1\pard\plain \ql\sl200\widctlpar\fs20\par {\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10070188}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{\sv 30}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex864\picscaley6\piccropl0\piccropr0\piccropt0\piccropb0\picw1764\pich882\picwgoal1000\pichgoal500\wmetafile8\bliptag-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \ql\sl200\widctlpar\fs20}{\headerr\pgnstart1\pard\plain \ql\sl200\widctlpar\fs20\par {\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10070188}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{\sv 30}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\%n 1}}}\picscalex864\picscaley6\piccropl0\piccropr0\piccropt0\piccropb0\picw1764\pich882\picwgoal1000\pichgoal500\wmetafile8\bliptag-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb02100007000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \ql\sl200\widctlpar\fs20}{\headerl\pgnstart1\pard\plain \ql\sl200\widctlpar\fs20\par {\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10070188}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{\sv 30}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex864\picscaley6\piccropl0\piccropr0\piccropt0\piccropb0\picw1764\pich882\picwgoal1000\pichgoal500\wmetafile8\bliptag-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \ql\sl200\widctlpar\fs20}{\footerf\pgnstart1{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10070188}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{sv 30}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex864\picscaley6\piccropl0\piccropr0\piccropt0\piccropb0\picw1764\pich882\picwgoal1000\pichgoal500\wmetafile8\bliptag-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631601030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}{\footerr\pgnstart1{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10070188}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fHine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{\sv 30}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex864\picscaley6\piccropl0\piccropr0\piccropt0\piccropb0\picw1764\pich882\picwgoal1000\pichgoal500\wmetafile8\bliptag-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}{\footerl\pgnstart1{\pict{\*\picprop\shplid1025{\sp{\snshapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fillColor}{\sv 10070188}}{\sp{\sn fFilled}{\sv 1}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn alignHR}{\sv 1}}{\sp{\sn dxHeightHR}{\sv 30}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fStandardHR}{\sv 1}}{\sp{\sn fHorizRule}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}\picscalex864\picscaley6\piccropl0\piccropr0\piccropt0\piccropb0\picw1764\pich882\picwgoal1000\pichgoal500\wmetafile8\bliptag-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e6999999fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}}-1602651790\blipupi1752{\*\blipuid a07979727e802d02da96f878ba973054}010009000003b700000006001c00000000000400000003010800050000000b0200000000050000000c021a000807040000002e0118001c000000fb02ceff0000000000009001000000000440001254696d6573204e657720526f6d616e0000000000000000000000000000000000040000002d0100000400000002010100050000000902000000020d000000320a2c00000001000400000000000807190020631600030000001e0007000000fc020000aca899000000040000002d01010008000000fa02050000000000ffffff00040000002d0102000e00000024030500ffffffffffff1800080718000807ffffffffffff08000000fa0200000000000000000000040000002d01030007000000fc020000ffffff000000040000002d010400040000002701ffff1c000000fb021000070000000000bc020000000001020222527562696b00000000000000de60e7770806080298030802200408025ae78339040000002d0105000300000000000000}\pard\plain \qr\sl200\widctlpar\fs20\par \pard\plain \qr\sl160\widctlpar{\fs16\f2 Seite }{\fs16\f2 {\field\fldedit{\*\fldinst {PAGE \\* MERGEFORMAT}}}}\fs18\par \pard\plain \qr\sl180\widctlpar\fs18}\sect}} diff --git a/sw/qa/extras/layout/data/forcepoint103.html b/sw/qa/extras/layout/data/forcepoint103.html new file mode 100644 index 0000000000..006a6d340e Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint103.html differ diff --git a/sw/qa/extras/layout/data/forcepoint72-1.rtf b/sw/qa/extras/layout/data/forcepoint72-1.rtf new file mode 100644 index 0000000000..ad11b45a45 Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint72-1.rtf differ diff --git a/sw/qa/extras/layout/data/forcepoint75-1.rtf b/sw/qa/extras/layout/data/forcepoint75-1.rtf new file mode 100644 index 0000000000..c317e12a05 Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint75-1.rtf differ diff --git a/sw/qa/extras/layout/data/forcepoint76-1.rtf b/sw/qa/extras/layout/data/forcepoint76-1.rtf new file mode 100644 index 0000000000..ca77206ff9 --- /dev/null +++ b/sw/qa/extras/layout/data/forcepoint76-1.rtf @@ -0,0 +1,3388 @@ +{\rtf1\a|eflang1037\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;} +{\f5\fmodern\fcharset0\fprq1{\*\panose 02060409020205020404}Courier;}{\f6\froman\fcharset0\fprq2{\*\panose 02020603040505020304}Tms Rmn;}{\f7\fswiss\fcharset0\fprq2{\*\panose 020b0604020202030204}Helv;} +{\f8\froman\fcharset0\fprq2{\*\panose 02040503060506020304}New York;}{\f9\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}System;}{\f10\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f11\froman\fcharset128\fprq1{\*\panose 02020609040205080304}MS Mincho{\*\falt ?l?r ??\'81\'66c};}{\f12\fnil\fcharset129\fprq1{\*\panose 02030600000101010101}Batang{\*\falt \'a2\'ae\'a1\'d7IoUAA};} +{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}SimSun{\*\falt ????\'a8\'ac??};}{\f14\fnil\fcharset136\fprq2{\*\panose 02010601000101010101}PMingLiU{\*\falt !Ps2OcuAe};} +{\f15\fmodern\fcharset128\fprq1{\*\panose 020b0609070205080204}MS Gothic{\*\falt ?l?r ?S?V?b?N};} +{\f16\fmodern\fcharset129\fprq1{\*\panose 020b0600000101010101}Dotum{\*\falt \'a1\'cb\'a2\'e7Ii\'a1\'cb\'a2\'e7e\'a1\'cb\'a2\'e7\'a8\'cf\'a1\'a9\'a1\'cb\'a2\'e7e?o};} +{\f17\fmodern\fcharset134\fprq1{\*\panose 02010600030101010101}SimHei{\*\falt o??\'a8\'ac2??\'a8\'ac??};}{\f0\fmodern\fcharset136\fprq1{\*\panose 02010609000101010101}MingLiU{\*\falt 2OcuAe};} +{\f19\froman\fcharset128\fprq1{\*\panose 7202762996549695502}Mincho{\*\falt ??\'81\'66c};} +{\f20\froman\fcharset129\fprq1{\*\panose 020b0600000101010101}Gulim{\*\falt \'a2\'aee\'a1\'cbc\'a2\'ae\'a1\'d7u\'a1\'cb\'a2\'e7\'a2\'ae\'a1\'bfu\'a1\'cb\'a2\'e7e\'a1\'cb\'a2\'e7\'a8\'cf\'a1\'a9\'a2\'ae\'a1\'d7I\'a1\'cb\'a2\'e7a};} +{\f21\froman\fcharset0\fprq2{\*\panose 02040603050705020303}Century;}{\f22\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Angsana New;}{\f23\fswiss\fcharset0\fprq2{\*\panose 020b0304020202020204}Cordia New;} +{\f24\fnil\fcharset1\fprq2{\*\panose 00000400000000000000}Mangal;}{\f25\fnil\fcharset1\fprq2{\*\panose 02000400000000000000}Latha;}{\f26\froman\fcharset0\fprq2{\*\panose 010a0502050306030303}Sylfaen;} +{\f27\froman\fcharset1\fprq2{\*\panose 00000400000000000000}Vrinda;}{\f28\fnil\fcharset1\fprq2{\*\panose 02000500000000000000}Raavi;}{\f29\fnil\fcharset1\fprq2{\*\panose 02000500000000000000}Shruti;} +{\f30\froman\fcharset1\fprq2{\*\panose 00000400000000000000}Sendnya;}{\f31\fnil\fcharset1\fprq2{\*\panose 02000500000000000000}Gautami;}{\f32\fnil\fcharset1\fprq2{\*\panose 00000400000000000000}Tunga;} +{\f33\fscript\fcharset1\fprq2{\*\panose 03080600000000000000}Estrangelo Edessa;}{\f34\froman\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial Unicode MS;}{\f35\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma;} +{\f36\fnil\fcharset134\fprq2{\*\panose 00000000000000000000}@SimSun;}{\f37\froman\fcharset0\fprq2 Times New Roman CE;}{\f38\froman\fcharset0\fprq2 Times New Roman CYR;}{\f39\froman\fcharset0\fprq2 Times New Roman Greek;} +{\f40\froman\fcharset0\fprq2 Times New Roman TUR;}{\f41\froman\fcharset0\fprq2 Times New Roman Baltic;}{\f42\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana;}{\f43\fswiss\fcharset0\fprq2{\*\panose 020b0603020202020204}Trebuchet MS;} +{\f44\fswiss\fcharset0\fprq2{\*\panose 020e0802040304020204}Albertus Extra Bold;}{\f45\fswiss\fcharset0\fprq2{\*\panose 020e0602030304020304}Albertus Medium;}{\f46\fswiss\fcharset0\fprq2{\*\panose 020b0603020204030204}Antique Olive;} +{\f47\fswiss\fcharset0\fprq2{\*\panose 020b0502050508020304}CG Omega;}{\f48\froman\fcharset0\fprq2{\*\panose 02020603050405020304}CG Times;}{\f49\froman\fcharset0\fprq2{\*\panose 02040706040705040204}Clarendon Condensed;} +{\f50\fscript\fcharset0\fprq2{\*\panose 03030502040406070605}Coronet;}{\f51\fmodern\fcharset0\fprq1{\*\panose 02060409020205020404}CourierPS;}{\f52\froman\fcharset0\fprq2{\*\panose 02020404030301010803}Garamond;} +{\f53\fswiss\fcharset0\fprq2{\*\panose 020b0506020203020204}Helvetica Narrow;}{\f54\fswiss\fcharset0\fprq2{\*\panose 020b0402020203020304}ITC Avant Garde Gothic;}{\f55\froman\fcharset0\fprq2{\*\panose 02050504040505020204}ITC Bookman;} +{\f56\fscript\fcharset0\fprq2{\*\panose 03010101010201010101}ITC Zapf Chancery;}{\f57\fnil\fcharset2\fprq2{\*\panose 01010601010101010101}ITC Zapf Dingbats;}{\f58\fmodern\fcharset0\fprq1{\*\panose 020b0409020202030204}Letter Gothic;} +{\f59\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}LinePrinterBM;}{\f60\fscript\fcharset0\fprq2{\*\panose 03020702040402020504}Marigold;}{\f61\froman\fcharset0\fprq2{\*\panose 02040603050505020303}New Century Schoolbook;} +{\f62\froman\fcharset0\fprq2{\*\panose 02040602050305020304}Palatino;}{\f63\froman\fcharset2\fprq2{\*\panose 05050102010706020507}SymbolPS;}{\f64\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times;} +{\f65\fswiss\fcharset0\fprq2{\*\panose 020b0603020202030204}Univers;}{\f66\fswiss\fcharset0\fprq2{\*\panose 020b0606020202060204}Univers Condensed;}{\f67\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}PRESCRIBE;} +{\f68\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Marlett;}{\f69\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}{\f70\fswiss\fcharset0\fprq2{\*\panose 020b0602030504020204}Lucida Sans Unicode;} +{\f0\fswiss\fcharset0\fprq2{\*\panose 020b0a04020102020204}DejaVu Sans;}{\f72\fscript\fcharset0\fprq2{\*\panose 030f0702030302020204}Comic Sans MS;}{\f73\fswiss\fcharset0\fprq2{\*\panose 020b0806030902050204}Impact;} +{\f74\froman\fcharset0\fprq2{\*\panose 02040502050405020303}Georgia;}{\f75\fswiss\fcharset0\fprq2{\*\panose 020b0603020102020204}Franklin Gothic Medium;}{\f76\froman\fcharset0\fprq2{\*\panose 02040502050505030304}DejaVu Serif;} +{\f77\froman\fcharset2\fprq2{\*\panose 05030102010509060703}Webdings;}{\f78\fnil\fcharset1\fprq2{\*\panose 02000500030200090000}MV Boli;}{\f79\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Microsoft Sans Serif;} +{\f80\froman\fcharset2\fprq2{\*\panose 02020604050505020304}WP MultinationalA Roman;}{\f81\fmodern\fcharset2\fprq1{\*\panose 02060409020205020404}WP MultinationalB Courier;} +{\f82\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}WP MultinationalB Helve;}{\f83\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}WP MultinationalB Roman;}{\f84\fswiss\fcharset2\fprq2{\*\panose 050b0604020202030204}WP Phonetic;} +{\f85\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP Arabic Sihafa;}{\f86\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP MathA;}{\f87\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP MathB;} +{\f88\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP MathExtendedA;}{\f89\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP MathExtendedB;}{\f90\fmodern\fcharset2\fprq1{\*\panose 05000009000000000000}WP MultinationalA Courier;} +{\f91\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}WP MultinationalA Helve;}{\f92\fmodern\fcharset2\fprq1{\*\panose 00p00009000000000000}WP Greek Courier;}{\f93\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}WP Greek Helve;} +{\f94\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}WP Hebrew David;}{\f95\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP IconicSymbolsA;}{\f96\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}WP IconicSymbolsB;} +{\f97\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP Japanese;}{\f98\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}WP TypographicSymbols;}{\f99\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}WP ArabicScript Sihafa;} +{\f100\fmodern\fcharset0\fprq1{\*\panose 010b0409020201010101}WP BoxDrawing;}{\f101\froman\fcharset2\fprq2{\*\panose 05020604050505020304}WP CyrillicA;}{\f102\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}WP CyrillicB;} +{\f103\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}WP Greek Century;}{\f104\froman\fcharset0\fprq2{\*\panose 02090504030505020304}AmerType Md BT;}{\f105\fswiss\fcharset0\fprq2{\*\panose 00b0602020202020204}AvantGarde Md BT;} +{\f106\fsjs\fcharset0\fprq2{\*\panose 020b0402020202020204}AvantGarde Bk BT;}{\f107\froman\fcharset0\fprq2{\*\panose 02030904050306020704}Benguiat Bk BT;}{\f108\fdecor\fcharset0\fprq2{\*\panose 04030205020b02020502}BernhardFashion BT;} +{\f109\froman\fcharset0\fprq2{\*\panose 0207060307050a020302}BernhardMod BT;}{\f110\fswiss\fcharset0\fprq2{\*\panose 020b0807020203060204}BankGothic Md BT;}{\f111\fdecor\fcharset0\fprq2{\*\panose 04040807060d02020704}Bremen bd BT;} +{\f112\fdecor\fcharset0\fprq2{\*\panose 04060705040702020204}Charlesworth;}{\f113\fswiss\fcharset2\fprq2{\*\panose 020b0603050302020204}CommonBullets;}{\f114\fswiss\fcharset0\fprq2{\*\panose 020e0705020203020404}CopprplGoth bd BT;} +{\f115\froman\fcharset0\fprq2{\*\panose 0204050203030b020204}Dauphin;}{\f116\fswiss\fcharset0\fprq2{\*\panose 020b0802020204020204}Futura Md BT;}{\f117\fdecor\fcharset0\fprq2{\*\panose 040409050d0b02020403}FuturaBlack BT;} +{\f118\fswiss\fcharset0\fprq2{\*\panose 020b0402020204020303}Futura Lt BT;}{\f119\fswiss\fcharset0\fprq2{\*\panose 020b0903020204020204}Futura XBlk BT;}{\f120\fdecor\fcharset0\fprq2{\*\panose 04020604050203030203}GoudyHandtooled BT;} +{\f121\froman\fcharset0\fprq2{\*\panose 02020502050305020303}GoudyOlSt BT;}{\f122\fswiss\fcharset0\fprq2{\*\panose 020b0602020204020204}Humanst521 BT;}{\f123\fswiss\fcharset0\fprq2{\*\panose 020d0402020204020904}Kabel Bk BT;} +{\f124\fswiss\fcharset0\fprq2{\*\panose 020d0902020204020204}Kabel Ult BT;}{\f125\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Lithograph;}{\f126\fdecor\fcharset0\fprq2{\*\panose 040b0500000000000000}LithographLight;} +{\f127\fscript\fcharset0\fprq2{\*\panose 03080702020302020206}OzHandicraft BT;}{\f128\froman\fcharset0\fprq2{\*\panose 02070a02080905020204}PosterBodoni BT;}{\f129\froman\fcharset0\fprq2{\*\panose 02060503030505020204}Serifa BT;} +{\f130\froman\fcharset0\fprq2{\*\panose 02060303030505020204}Serifa Th BT;}{\f131\fscript\fcharset0\fprq2{\*\panose 03030702030607090b03}English111 Vivace BT;}{\f132\froman\fcharset0\fprq2{\*\panose 02080503040505020303}Souvenir Lt BT;} +{\f133\fscript\fcharset0\fprq2{\*\panose 03090702030407020403}Staccato222 BT;}{\f134\fswiss\fcharset0\fprq2{\*\panose 020b0708030702060204}Swiss911 XCm BT;}{\f135\fscript\fcharset0\fprq2{\*\panose 03020702030807050705}TypoUpright BT;} +{\f136\froman\fcharset0\fprq2{\*\panose 02040503050506040803}ZapfEllipt BT;}{\f137\fswiss\fcharset0\fprq2{\*\panose 020b0505020202020204}Zurich Ex BT;}{\f138\fswiss\fcharset0\fprq2{\*\panose 020b0807040502030204}Zurich BlkEx BT;} +{\f139\froman\fcharset2\fprq2{\*\panose 05050102010205020202}MT Extra;}{\f140\froman\fcharset222\fprq2{\*\panose 02020603050405020304}AngsanaUPC;}{\f141gfswiss#tchaYset222\fprq2{\*\panose 020b0604020202020204}BrowalliaUPC;} +{\f142\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Browallia New;}{\f143\fswiss\fcharset222\fprq2{\*\panose 020b0304020202020204}CordiaUPC;}{\f144\froman\fcharset222\fprq2{\*\panose 02020603050405020304}DilleniaUPC;} +{\f145\froman\fcharset222\fprq2{\*\panose 02020603050405020304}EucrosiaUPC;}{\f146\fswiss\fcharset222\fprq2{\*\panose 020b0604020202020204}FreesiaUPC;}{\f147\fswiss\fcharset222\fprq2{\*\panose 020b0604020202020204}IrisUPC;} +{\f148\froman\fcharset-2680832846622911521\fprq2{\*\panose 02020603050405020304}JasmineUPC;}{\f149\froman\fcharset222\fprq2{\*\panose 02020603050405020304}KodchiangUPC;}{\f150\fswiss\fcharset222\fprq2{\*\panose 020b0604020202020204}LilyUPC;} +{\f151\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Aharoni;}{\f152\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}David;}{\f153\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}David Transparent;} +{\f154\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}FrankRuehl;}{\f155\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Levenim MT;}{\f156\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Miriam;} +{\f157\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Miriam Transparent;}{\f158\fbidi \fmodern\fcharset177\fprq1{\*\panose 00000009000000000000}Miriam Fixed;} +{\f159\fbidi \fmodern\fcharset177\fprq1{\*\panose 00000009000000000000}Fixed Miriam Transparent;}{\f160\fbidi \fnil\fcharset177\fprq2{\*\panose 00000000000000000000}Narkisim;}{\f161\fbidi \fmodern\fcharset177\fprq1{\*\panose 00000009000000000000}Rod;} +{\f162\fbidi \fmodern\fcharset177\fprq1{\*\panose 00000009000000000000}Rod Transparent;}{\f163\fbidi \fnil\fcharset178\fprq2{\*\panose 02010000000000000000}Traditional Arabic;} +{\f164\fbidi \fnil\fcharset178\fprq2{\*\panose 02010000000000000000}Arabic Transparent;}{\f165\fbidi \fnil\fcharset178\fprq2{\*\panose 02010000000000000000}Andalus;}{\f166\fbidi \fnil\fcharset178\fprq2{\*\panose 02010000000000000000}Simplified Arabic;} +{\f167\fbidi \fmodern\fcharset178\fprq1{\*\panose 02010009000000000000}Simplified Arabic Fixed;}{\f168\fswiss\fcharset0\fprq2{\*\panose 020b0506030403020204}Myriad Condensed Web;}{\f169\fswiss\fcharset0\fprq2{\*\panose 020b0503030403020204}Myriad Web;} +{\f170\groman\fcharset0\fprq2{\*\panose 02020603050405020304}TITUS Cyberbit Basic;}{\f171\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}Digiface;}{\f172\fdecor\fcharset0\fprq2{\*\panose 040409040d0702020402}Allegro BT;} +{\f173\fswiss\fcharset0\fprq2{\*\panose 020b0506020202030204}Arial Narrow;}{\f174\froman\fcharset0\fprq2{\*\panose 02040602050305030304}DejaVu Sans;}{\f175\froman\fcharset0\fprq2{\*\panose 02050604050505020204}Bookman Old Style;} +{\f176\fswiss\fcharset0\fprq2{\*\panose 020b0502020202020204}Century Gothic;}{\f177\fswiss\fcharset0\fprq2{\*\panose 020b0706040902060204}Haettenschweiler;}{\f178\fnil\fcharset2\fprq2{\*\panose 05010100010000000000}MS Outlook;} +{\f179\fscript\fcharset0\fprq2{\*\panose 03010101010201010101}Monotype Corsiva;}{\f180\froman\fcharset2\fprq2{\*\panose 05020102010507070707}Wingdings 2;}{\f181\froman\fcharset2\fprq2{\*\panose 05040102010807070707}Wingdings 3;} +{\f182\fnil\fcharset2\fprq2{\*\panose 05010101010101010101}Bookshelf Symbol 7;}{\f183\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}MS Reference Sans Serif;}{\f184\fnil\fcharset2\fprq2{\*\panose 05000500000000000000}MS Reference Specialty;} +{\f185\fmodern\fcharset0\fprq1{\*\panose 020b0609030804020204}Bitstream Vera Sans Mono;}{\f186\fswiss\fcharset0\fprq2{\*\panose 020b0603030804020204}Bitstream Vera Sans;}{\f187\froman\fcharset0\fprq2{\*\panose 02060603050605020204}Bitstream Vera Serif;} +{\f188\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}OpenSymbol;}{\f189\fnil\fcharset0\fprq2{\*\panose 00000700000000000000}Davka Siddur;}{\f190\fnil\fcharset0\fprq2{\*\panose 02000508000000020004}Davka Aharony;} +{\f191\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka Chayim;}{\f192\fnil\fcharset0\fprq2{\*\panose 02000506000000020004}Davka David;}{\f193\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka DavidFix;} +{\f194\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}Davka Drogolin;}{\f195\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka FrankRuhl;}{\f196\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka FrankRuhlLight;} +{\f197\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka Gefen;}{\f198\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka Gonen;}{\f199\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}Davka Hadasah;} +{\f200\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka Kastel;}{\f201\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}Davka KsavYad;}{\f202\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}Davka Meir;} +{\f203\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka Miriam;}{\f204\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}Davka Rashi;}{\f205\fnil\fcharset0\fprq2{\*\panose 00000400000000000000}Davka Stam;} +{\f206\fnil\fcharset0\fprq2{\*\panose 02000400000000000000}Davka Yerushalmy;}{\f207\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Venice;}{\f208\fnil\fcharset0\fprq2{\*\panose 02000000000000000000}GuttmanD Adii;} +{\f209\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Ashknaz;}{\f210\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Calligraphic;}{\f211\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Hadar;} +{\f212\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Keren;}{\f213\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Mantova-Deco;}{\f214\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Hatzvi;} +{\f215\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Vilna;}{\f216\fnil\fcharset0\fprq2{\*\panose 00000000000000000000}GuttmanD Yad;}{\f217\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}YerushalmyD;} +{\f218\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}AharonyD;}{\f219\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}ChayimD;}{\f220\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}DavidD;} +{\f221\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}DavidFixD;}{\f222\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}FrankRuhlD;}{\f223\fnil\fcharset2\fprq2{\*\panose 00000300000000000000}FrankRuhlLightD;} +{\f224\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}GefenD;}{\f225\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}GonenD;}{\f226\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}HadasahD;} +{\f227\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}KastelD;}{\f228\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}KsavYadD;}{\f229\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}MeirD;} +{\f230\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}MiriamD;}{\f231\fnil\fcharset2\fprq50472{\*\panose 00000400000000000000}RashiD;}{\f232\fnil\fcharset2\fprq2{\*\panose 00000700000000000000}SiddurD;} +{\f233\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}StamD;}{\f234\fnil\fcharset2\fprq2{\*\panose 00000400000000000000}VilnaD;}{\f235\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}CalligraphicG;} +{\f236\fnil\fcharset2\fprq2{\*\panose 02000000000000000000}AdiiG;}{\f237\fnil\fcharset2\fprq2{\*\panose 02000000000000000000}AshknazG;}{\f238\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}HadarG;} +{\f239\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}KerenG;}{\f240\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}Mantova-DecoG;}{\f241\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}HatzviG;} +{\f242\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}VeniceG;}{\f243\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}VilnaG;}{\f244\fnil\fcharset2\fprq2{\*\panose 00000000000000000000}YadG;} +{\f245\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}HebEmail;}{\f246\froman\fcharset0\fprq2{\*\panose 02070300020205020404}HebEmailFix;}{\f247\fswiss\fcharset0\fprq2 Arial CE;}{\f248\fswiss\fcharset0\fprq2 Arial CYR;} +{\f249\fswiss\fcharset0\fprq2 Arial Greek;}{\f250\fswiss\fcharset0\fprq2 Arial TUR;}{\f251\fswiss\fcharset0\fprq2 Arial Baltic;}{\f252\fmodern\fcharset0\fprq1 Courier New CE;}{\f253\fmodern\fcharset0\fprq1 Courier New CYR;} +{\f254\fmodern\fcharset0\fprq1 Courier New Greek;}{\f255\fmodern\fcharset0\fprq1 Courier New TUR;}{\f256\fmodern\fcharset0\fprq1 Courier New Baltic;}{\f257\froman\fcharset238\fprq2 Times New Roman CE;}{\f258\froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f260\froman\fcharset161\fprq2 Times New Roman Greek;}{\f261\froman\fcharset162\fprq2 Times New Roman Tur;}{\f262\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f263\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f264\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f265\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f267\fswiss\fcharset238\fprq2 Arial CE;}{\f268\fswiss\fcharset204\fprq2 Arial Cyr;}{\f270\fswiss\fcharset161\fprq2 Arial Greek;} +{\f271\fswiss\fcharset162\fprq2 Arial Tur;}{\f272\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f273\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}{\f274\fswiss\fcharset186\fprq2 Arial Baltic;}{\f275\fswiss\fcharset163\fprq2 Arial (Vietnamese);} +{\f277\fmodern\fcharset238\fprq1 Courier New CE;}{\f278\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f280\fmodern\fcharset161\fprq1 Courier New Greek;}{\f281\fmodern\fcharset162\fprq1 Courier New Tur;} +{\f282\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f283\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f284\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f285\fmodern\fcharset163\fprq1 Courier New (Vietnamese);} +{\f297\fswiss\fcharset238\fprq2 Helvetica CE;}{\f298\fswiss\fcharset204\fprq2 Helvetica Cyr;}{\f300\fswiss\fcharset161\fprq2 Helvetica Greek;}{\f301\fswiss\fcharset162\fprq2 Helvetica Tur;}{\f302\fbidi \fswiss\fcharset177\fprq2 Helvetica (Hebrew);} +{\f303\fbidi \fswiss\fcharset178\fprq2 Helvetica (Arabic);}{\f304\fswiss\fcharset186\fprq2 Helvetica Baltic;}{\f305\fswiss\fcharset163\fprq2 Helvetica (Vietnamese);}{\f486\froman\fcharset222\fprq2 Angsana New (Thai);} +{\f496\fswiss\fcharset222\fprq2 Cordia New (Thai);}{\f517\froman\fcharset238\fprq2 Sylfaen CE;}{\f518\froman\fcharset204\fprq2 Sylfaen Cyr;}{\f520\froman\fcharset161\fprq2 Sylfaen Greek;}{\f521\froman\fcharset162\fprq2 Sylfaen Tur;} +{\f524\froman\fcharset186\fprq2 Sylfaen Baltic;}{\f607\fswiss\fcharset238\fprq2 Tahoma CE;}{\f608\fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f610\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f611\fswiss\fcharset162\fprq2 Tahoma Tur;} +{\f612\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);}{\f613\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f614\fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f615\fswiss\fcharset163\fprq2 Tahoma (Vietnamese);} +{\f616\fswiss\fcharset222\fprq2 Tahoma (Thai);}{\f627\froman\fcharset238\fprq2 Times New Roman ce CE;}{\f628\froman\fcharset204\fprq2 Times New Roman ce Cyr;}{\f630\froman\fcharset161\fprq2 Times New Roman ce Greek;} +{\f631\froman\fcharset162\fprq2 Times New Roman ce Tur;}{\f632\fbidi \froman\fcharset177\fprq2 Times New Roman ce (Hebrew);}{\f633\fbidi \froman\fcharset178\fprq2 Times New Roman ce (Arabic);}{\f634\froman\fcharset186\fprq2 Times New Roman ce Baltic;} +{\f635\froman\fcharset163\fprq2 Times New Roman ce (Vietnamese);}{\f637\froman\fcharset238\fprq2 Times New Roman CYR CE;}{\f638\froman\fcharset204\fprq2 Times New Roman CYR Cyr;}{\f640\froman\fcharset161\fprq2 Times New Roman CYR Greek;} +{\f641\froman\fcharset162\fprq2 Times New Roman CYR Tur;}{\f642\fbidi \froman\fcharset177\fprq2 Times New Eoman CYR (Hebrew);}{\f643\fbidi \froman\fcharset178\fprq2 Times New Roman CYR (Arabic);}{\f644\froman\fcharset186\fprq2 Times New Roman CYR Baltic;} +{\f645\froman\fcharset163\fprq2 Times New Roman CYR (Vietnamese);}{\f647\froman\fcharset238\fprq2 Times New Roman Greek CE;}{\f648\froman\fcharset204\fprq2 Times New Roman Greek Cyr;}{\f650\froman\fcharset161\fprq2 Times New Roman Greek Greek;} +{\f651\froman\fcharset162\fprq2 Times New Roman Greek Tur;}{\f652\fbidi \froman\fcharset177\fprq2 Times New Roman Greek (Hebrew);}{\f653\fbidi \froman\fcharset178\fprq2 Times New Roman Greek (Arabic);} +{\f654\froman\fcharset186\fprq2 Times New Roman Greek Baltic;}{\f655\froman\fcharset163\fprq2 Times New Roman Greek (Vietnamese);}{\f657\froman\fcharset238\fprq2 Times New Roman TUR CE;}{\f658\froman\fcharset204\fprq2 Times New Roman TUR Cyr;} +{\f660\froman\fcharset161\fprq2 Times New Roman TUR Greek;}{\f661\froman\fcharset162\fprq2 Times New Roman TUR Tur;}{\f662\fbidi \froman\fcharset177\fprq2 Times New Roman TUR (Hebrew);}{\f663\fbidi \froman\fcharset178\fprq2 Times New Roman TUR (Arabic);} +{\f664\froman\fcharset186\fprq2 Times New Roman TUR Baltic;}{\f665\froman\fcharset163\fprq2 Times New Roman TUR (Vietnamese);}{\f667\froman\fcharset238\fprq2 Times New Roman Baltic CE;}{\f668\froman\fcharset204\fprq2 Times New Roman Baltic Cyr;} +{\f670\froman\fcharset161\fprq2 Times New Roman Baltic Greek;}{\f671\froman\fcharset162\fprq2 Times New Roman Baltic Tur;}{\f672\fbidi \froman\fcharset177\fprq2 Times New Roman Baltic (Hebrew);} +{\f673\fbidi \froman\fcharset178\fprq2 Times New Roman Baltic (Arabic);}{\f674\froman\fcharset186\fprq2 Times New Roman Baltic Baltic;}{\f675\froman\fcharset163\fprq2 Times New Roman Baltic (Vietnamese);}{\f677\fswiss\fcharset238\fprq2 Verdana CE;} +{\f678\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f680\fswiss\fcharset161\fprq2 Verdana Greek;}{\f681\fswiss\fcharset162\fprq2 Verdana Tur;}{\f684\fswiss\fcharset186\fprq2 Verdana Baltic;}{\f685\fswiss\fcharset163\fprq2 Verdana (Vietnamese);} +{\f687\fswiss\fcharset238\fprq2 Trebuchet MS CE;}{\f688\fswiss\fcharset204\fprq2 Trebuchet MS Cyr;}{\f690\fswiss\fcharset161\grq2 Trebuchet MS Greek;}{\f691\fswiss\fcharset162\fprq2 Trebuchet MS Tur;}{\f694\fswiss\fcharset186\fprq2 Trebuchet MS Baltic;} +{\f777\froman\fcharset238\fprq2 Garamond CE;}{\f778\froman\fcharset204\fprq2 Garamond Cyr;}{\f780\froman\fcharset161\fprq2 Garamond Greek;}{\f781\froman\fcharset162\fprq2 Garamond Tur;}{\f784\froman\fcharset186\fprq2 Garamond Baltic;} +{\f897\froman\fcharset238\fprq2 Times CE;}{\f898\froman\fcharset204\fprq2 Times Cyr;}{\f900\froman\fcharset161\fprq2 Times Greek;}{\f901\froman\fcharset162\fprq2 Times Tur;}{\f902\fbidi \froman\fcharset177\fprq2 Times (Hebrew);} +{\f903\fbidi \froman\fcharset178\fprq2 Times (Arabic);}{\f904\froman\fcharset186\fprq2 Times Baltic;}{\f905\froman\fcharset163\fprq2 Times (Vietnamese);}{\f947\fmodern\fcharset238\fprq1 Lucida Console CE;} +{\f948\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f950\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f951\fmodern\fcharset162\fprq0 Lucida Console Tur;}{\f957\fswiss\fcharset238\fprq2 Lucida Sans Unicode CE;} +{\f958\fswiss\fcharset204\fprq2 Lucida Sans Unicode Cyr;}{\f960\fswiss\fcharset161\fprq2 Lucida Sans Unicode Greek;}{\f961\fswiss\fcharset162\fprq2 Lucida Sans Unicode Tur;}{\f962\fbidi \fswiss\fcharset177\fprq2 Lucida Sans Unicode (Hebrew);} +{\f967\fswiss\fcharset238\fprq2 DejaVu Sans CE;}{\f968\fswiss\fcharset204\fprq2 DejaVu Sans Cyr;}{\f970\fswiss\fcharset161\fprq2 DejaVu Sans Greek;}{\f971\fswiss\fcharset162\fprq2 DejaVu Sans Tur;}{\f974\fswiss\fcharset186\fprq2 DejaVu Sans Baltic;} +{\f977\fscript\fcharset238\fprq2 Comic Sans MS CE;}{\f978\fscript\fcharset204\fprq2 Comic Sans MS Cyr;}{\f980\fscript\fcharset161\fprq2 Comic Sans MS Greek;}{\f981\fscript\fcharset162\fprq2 Comic Sans MS Tur;} +{\f984\fscript\fcharset186\fprq2 Comic Sans MS Baltic;}{\f987\fswiss\fcharset238\fprq2 Impact CE;}{\f988\fswiss\fcharset204\fprq2 Impact Cyr;}{\f990\fswiss\fcharset161\fprq2 Impact Greek;}{\f991\fswiss\fcharset162\fprq2 Impact Tur;} +{\f994\fswiss\fcharset186\fprq2 Impact Baltic;}{\f997\froman\fcharset238\fprq2 Georgia CE;}{\f998\froman\fcharset204\fprq2 Georgia Cyr;}{\f1000\froman\fcharset161\fprq2 Georgia Greek;}{\f1001\froman\fcharset162\fprq2 Georgia Tur;} +{\f1004\froman\fcharset186\fprq2 Georgia Baltic;}{\f1007\fswiss\fcharset238\fprq2 Franklin Gothic Medium CE;}{\f1008\fswiss\fcharset204\fprq2 Franklin Gothic Medium Cyr;}{\f1010\fswiss\fcharset161\fprq2 Franklin Gothic Medium Greek;} +{\f1011\fswiss\fcharset162\fprq2 Franklin Gothic Medium Tur;}{\f1014\fswiss\fcharset186\fprq2 Franklin Gothic Medium Baltic;}{\f1017\froman\fcharset238\fprq2 DejaVu Serif CE;}{\f1018\froman\fcharset204\fprq2 DejaVu Serif Cyr;} +{\f1020\froman\fcharset161\fprq2 DejaVu Serif Greek;}{\f1021\froman\fcharset162\fprq2 DejaVu Serif Tur;}{\f1024\froman\fcharset186\fprq2 DejaVu Serif Baltic;}{\f1025\froman\fcharset163\fprq2 DejaVu Serif (Vietnamese);} +{\f1047\fswiss\fcharset238\fprq2 Microsoft Sans Serif CE;}{\f1048\fswiss\fcharset204\fprq2 Microsoft Sans Serif Cyr;}{\f1050\fswiss\fcharset161\fprq2 Microsoft Sans Serif Greek;}{\f1051\fswiss\fcharset162\fprq2 Microsoft Sans Serif Tur;} +{\f1052\fbidi \fswiss\fcharset177\fprq2 Microsoft Sans Serif (Hebrew);}{\f1053\fbidi \fswiss\fcharset178\fprq2 Microsoft Sans Serif (Arabic);}{\f1054\fswiss\fcharset186\fprq2 Microsoft Sans Serif Baltic;} +{\f1055\fswiss\fcharset163\fprq2 Microsoft Sans Serif (Vietnamese);}{\f1056\fswiss\fcharset222\fprq2 Microsoft Sans Serif (Thai);}{\f1297\froman\fcharset238\fprq2 AmerType Md BT CE;}{\f1300\froman\fcharset161\fprq2 AmerType Md BT Greek;} +{\f1301\froman\fcharset162\fprq2 AmerType Md BT Tur;}{\f1307\fswiss\fcharset238\fprq2 AvantGarde Md BT CE;}{\f1310\fswiss\fcharset161\fprq2 AvantGarde Md BT Greek;}{\f1311\fswiss\fcharset162\fprq2 AvantGarde Md BT Tur;} +{\f1317\fswiss\fcharset238\fprq2 AvantGarde Bk BT CE;}{\f1320\fswiss\fcharset161\fprq2 AvantGarde Bk BT Greek;}{\f1321\fswiss\fcharset162\fprq2 AvantGarde Bk BT Tur;}{\f1327\froman\fcharset238\fprq2 Benguiat Bk BT CE;} +{\f1330\froman\fcharset161\fprq2 Benguiat Bk BT Greek;}{\f1331\froman\fcharset162\fprq2 Benguiat Bk BT Tur;}{\f1337\fdecor\fcharset238\fprq2 BernhardFashion BT CE;}{\f1340\fdecor\fcharset161\fprq2 BernhardFashion BT Greek;} +{\f1341\fdecor\fcharset162\fprq2 BernhardFashion BT Tur;}{\f1347\froman\fcharset238\fprq2 BernhardMod BT CE;}{\f1350\froman\fcharset161\fprq2 BernhardMod BT Greek;}{\f1351\froman\fcharset162\fprq2 BernhardMod BT Tur;} +{\f1357\fswiss\fcharset238\fprq2 BankGothic Md BT CE;}{\f1360\fswiss\fcharset161\fprq2 BankGothic Md BT Greek;}{\f1361\fswiss\fcharset162\fprq2 BankGothic Md BT Tur;}{\f1367\fdecor\fcharset238\fprq2 Bremen bd BT CE;} +{\f1370\fdecor\fcharset161\fprq2 Bremen bd BT Greek;}{\f1371\fdecor\fcharset162\fprq2 Bremen bd BT Tur;}{\f1397\fswiss\fcharset238\fprq2 CopprplGoth bd BT CE;}{\f1400\fswiss\fcharset161\fprq2 CopprplGoth bd BT Greek;} +{\f1401\fswiss\fcharset162\fprq2 CopprplGoth bd BT Tur;}{\f1417\fswiss\fcharset238\fprq2 Futura Md BT CE;}{\f1420\fswiss\fcharset161\fprq2 Futura Md BT Greek;}{\f1421\fswiss\fcharset162\fprq2 Futura Md BT Tur;} +{\f1427\fdecor\fcharset238\fprq2 FuturaBlack BT CE;}{\f1430\fdecor\fcharset161\fprq2 FuturaBlack BT Greek;}{\f1431\fdecor\fcharset162\fprq2 FuturaBlack BT Tur;}{\f1437\fswiss\fcharset238\fprq2 Futura Lt BT CE;} +{\f1440\fswiss\fcharset161\fprq2 Futura Lt BT Greek;}{\f1441\fswiss\fcharset162\fprq2 Futura Lt BT Tur;}{\f1447\fswiss\fcharset238\fprq2 Futura XBlk BT CE;}{\f1450\fswiss\fcharset161\fprq2 Futura XBlk BT Greek;} +{\f1451\fswiss\fcharset162\fprq2 Futura XBlk BT Tur;}{\f1457\fdecor\fcharset238\fprq2 GoudyHandtooled BT CE;}{\f1460\fdecor\fcharset161\fprq2 GoudyHandtooled BT Greek;}{\f1461\fdecor\fcharset162\fprq2 GoudyHandtooled BT Tur;} +{\f1467\froman\fcharset238\fprq2 GoudyOlSt BT CE;}{\f1470\froman\fcharset161\fprq2 GoudyOlSt BT Greek;}{\f1471\froman\fcharset162\fprq2 GoudyOlSt BT Tur;}{\f1477\fswiss\fcharset238\fprq2 Humanst521 BT CE;} +{\f1480\fswiss\fcharset161\fprq2 Humanst521 BT Greek;}{\f1481\fswiss\fcharset162\fprq2 Humanst521 BT Tur;}{\f1487\fswiss\fcharset238\fprq2 Kabel Bk BT CE;}{\f1490\fswiss\fcharset161\fprq2 Kabel Bk BT Greek;} +{\f1491\fswiss\fcharset162\fprq2 Kabel Bk BT Tur;}{\f1497\fswiss\fcharset238\fprq2 Kabel Ult BT CE;}{\f1500\fswiss\fcharset161\fprq2 Kabel Ult BT Greek;}{\f1501\fswiss\fcharset162\fprq2 Kabel Ult BT Tur;} +{\f1527\fscript\fcharset238\fprq2 OzHandicraft BT CE;}{\f1530\fscript\fcharset161\fprq2 OzHandicraft BT Greek;}{\f1531\fscript\fcharset162\fprq2 OzHandicraft BT Tur;}{\f1537\froman\fcharset238\fprq2 PosterBodoni BT CE;} +{\f1540\froman\fcharset161\fprq2 PosterBodoni BT Greek;}{\f1541\froman\fcharset162\fprq2 PosterBodoni BT Tur;}{\f1547\froman\fcharset238\fprq2 Serifa BT CE;}{\f1550\froman\fcharset161\fprq2 Serifa BT Greek;}{\f1551\froman\fcharset162\fprq2 Serifa BT Tur;} +{\f1557\froman\fcharset238\fprq2 Serifa Th BT CE;}{\f1560\froman\fcharset161\fprq2 Serifa Th BT Greek;}{\f1561\froman\fcharset162\fprq2 Serifa Th BT Tur;}{\f1567\fscript\fcharset238\fprq2 English111 Vivace BT CE;} +{\f1570\fscript\fcharset161\fprq2 English111 Vivace BT Greek;}{\f1571\fscript\fcharset162\fprq2 English111 Vivace BT Tur;}{\f1577\froman\fcharset238\fprq2 Souvenir Lt BT CE;}{\f1580\froman\fcharset161\fprq2 Souvenir Lt BT Greek;} +{\f1581\froman\fcharset162\fprq2 Souvenir Lt BT Tur;}{\f1587\fscript\fcharset238\fprq2 Staccato222 BT CE;}{\f1590\fscript\fcharset161\fprq2 Staccato222 BT Greek;}{\f1591\fscript\fcharset162\fprq2 Staccato222 BT Tur;} +{\f1597\fswiss\fcharset238\fprq2 Swiss911 XCm BT CE;}{\f1600\fswiss\fcharset161\fprq2 Swiss911 XCm BT Greek;}{\f1601\fswiss\fcharset162\fprq2 Swiss911 XCm BT Tur;}{\f1607\fscript\fcharset238\fprq2 TypoUpright BT CE;} +{\f1610\fscript\fcharset161\fprq2 TypoUpright BT Greek;}{\f1611\fscript\fcharset162\fprq2 TypoUpright BT Tur;}{\f1617\froman\fcharset238\fprq2 ZapfEllipt BT CE;}{\f1620\froman\fcharset161\fprq2 ZapfEllipt BT Greek;} +{\f1621\froman\fcharset162\fprq2 ZapfEllipt BT Tur;}{\f1627\fswiss\fcharset238\fprq2 Zurich Ex BT CE;}{\f1630\fswiss\fcharset161\fprq2 Zurich Ex BT Greek;}{\f1631\fswiss\fcharset162\fprq2 Zurich Ex BT Tur;} +{\f1637\fswiss\fcharset238\fprq2 Zurich BlkEx BT CE;}{\f1640\fswiss\fcharset161\fprq2 Zurich BlkEx BT Greek;}{\f1641\fswiss\fcharset162\fprq2 Zurich BlkEx BT Tur;}{\f1686\fswiss\fcharset222\fprq2 Browallia New (Thai);} +{\f1937\fswiss\fcharset238\fprq2 Myriad Condensed Web CE;}{\f1941\fswiss\fcharset162\fprq2 Myriad Condensed Web Tur;}{\f1944\fswiss\fcharset186\fprq2 Myriad Condensed Web Baltic;}{\f1947\fswiss\fcharset238\fprq2 Myriad Web CE;} +{\f1951\fswiss\fcharset162\fprq2 Myriad Web Tur;}{\f1954\fswiss\fcharset186\fprq2 Myriad Web Baltic;}{\f1957\froman\fcharset238\fprq2 TITUS Cyberbit Basic CE;}{\f1958\froman\fcharset204\fprq2 TITUS Cyberbit Basic Cyr;} +{\f1960\froman\fcharset161\fprq2 TITUS Cyberbit Basic Greek;}{\f1961\froman\fcharset162\fprq2 TITUS Cyberbit Basic Tur;}{\f1962\fbidi \froman\fcharset177\fprq2 TITUS Cyberbit Basic (Hebrew);} +{\f1963\fbidi \froman\fcharset178\fprq2 TITUS Cyberbit Basic (Arabic);}{\f1964\froman\fcharset186\fprq2 TITUS Cyberbit Basic Baltic;}{\f1965\froman\fcharset163\fprq2 TITUS Cyberbit Basic (Vietnamese);} +{\f1966\froman\fcharset222\fprq2 TITUS Cyberbit Basic (Thai);}{\f1981\fdecor\fcharset162\fprq2 Allegro BT Tur;}{\f1987\fswiss\fcharset238\fprq2 Arial Narrow CE;}{\f1988\fswiss\fcharset204\fprq2 Arial Narrow Cyr;} +{\f1990\fswiss\fcharset161\fprq2 Arial Narrow Greek;}{\f1991\fswiss\fcharset162\fprq2 Arial Narrow Tur;}{\f1994\fswiss\fcharset186\fprq2 Arial Narrow Baltic;}{\f1997\froman\fcharset238\fprq2 DejaVu Sans CE;} +{\f1998\froman\fcharset204\fprq2 DejaVu Sans Cyr;}{\f0\froman\fcharset161\fprq2 DejaVu Sans Greek;}{\f2001\froman\fcharset162\fprq2 DejaVu Sans Tur;}{\f2004\froman\fcharset186\fprq2 DejaVu Sans Baltic;} +{\f2007\froman\fcharset238\fprq2 Bookman Old Style CE;}{\f2008\froman\fcharset204\fprq2 Bookman Old Style Cyr;}{\f2010\froman\fcharset161\fprq2 Bookman Old Style Greek;}{\f2011\froman\fcharset162\fprq2 Bookman Old Style Tur;} +{\f2014\froman\fcharset186\fprq2 Bookman Old Style Baltic;}{\f2017\fswiss\fcharset238\fprq2 Century Gothic CE;}{\f2018\fswiss\fcharset204\fprq2 Century Gothic Cyr;}{\f2020\fswiss\fcharset161\fprq2 Century Gothic Greek;} +{\f2021\fswiss\fcharset162\fprq2 Century Gothic Tur;}{\f2024\fswiss\fcharset186\fprq2 Century Gothic Baltic;}{\f2027\fswiss\fcharset238\fprq2 Haettenschweiler CE;}{\f2028\fswiss\fcharset204\fprq2 Haettenschweiler Cyr;} +{\f2030\fswiss\fcharset161\fprq2 Haettenschweiler Greek;}{\f2031\fswiss\fcharset162\fprq2 Haettenschweiler Tur;}{\f2034\fswiss\fcharset156\fprq2 Haettenschweiler Baltic;}{\f2047\fscript\fcharset238\fprq2 Monotype Corsiva CE;} +{\f2048\fscript\fcharset204\fprq2 Monotype Corsiva Cyr;}{\f2050\fscript\fcharset161\fprq2 Monotype Corsiva Greek;}{\f2051\fscript\fcharset162\fprq2 Monotype c2\fprq2 Monotype Corsiva Tur;}{\f2054\fscript\fcharset186\fprq2 Monotype Corsiva Baltic;} +{\f2087\fswiss\fcharset238\fprq2 MS Reference Sans Serif CE;}{\f2088\fswiss\fcharset204\fprq2 MSReference Sans Serif Cyr;}{\f2090\fswiss\fcharset161\fprq2 MS Reference Sans Serif Greek;}{\f2091\fswiss\fcharset162\fprq2 MS Reference Sans Serif Tur;} +{\f2094\fswiss\fcharset186\fprq2 MS Reference Sans Serif Baltic;}{\f2095\fswiss\fcharset163\fprq2 MS Reference Sans Serif (Vietnamese);}{\f2727\fswiss\fcharset238\fprq2 Arial ce CE;}{\f2728\fswiss\fcharset204\fprq2 Arial ce Cyr;} +{\f2730\fswiss\fcharset161\fprq2 Arial ce Greek;}{\f2731\fswiss\fcharset162\fprq2 Arial ce Tur;}{\f2732\fbidi \fswiss\fcharset177\fprq2 Arial ce (Hebrew);}{\f2733\fbidi \fswiss\fcharset178\fprq2 Arial ce (Arabic);} +{\f2734\fswiss\fcharset186\fprq2 Arial ce Baltic;}{\f2735\fswiss\fcharset163\fprq2 Arial ce (Vietnamese);}{\f2737\fswiss\fcharset238\fprq2 Arial CYR CE;}{\f2738\fswiss\fcharset204\fprq2 Arial CYR Cyr;}{\f2740\fswiss\fcharset161\fprq2 Arial CYR Greek;} +{\f2741\fswiss\fcharset162\fprq2 Arial CYR Tur;}{\f2742\fbidi \fswiss\fcharset177\fprq2 Arial CYR (Hebrew);}{\f2743\fbidi \fswiss\fcharset178\fprq2 Arial CYR (Arabic);}{\f2744\fswiss\fcharset186\fprq2 Arial CYR Baltic;} +{\f2745\fswiss\fcharset163\fprq2 Arial CYR (Vietnamese);}{\f2747\fswiss\fcharset238\fprq2 Arial Greek CE;}{\f2748\fswiss\fcharset204\fprq2 Arial Greek Cyr;}{\f2750\fswiss\fcharset161\fprq2 Arial Greek Greek;} +{\f2751\fswiss\fcharset162\fprq2 Arial Greek Tur;}{\f2752\fbidi \fswiss\fcharset177\fprq2 Arial Greek (Hebrew);}{\f2753\fbidi \fswiss\fcharset178\fprq2 Arial Greek (Arabic);}{\f2754\fswiss\fcharset186\fprq2 Arial Greek Baltic;} +{\f2755\fswiss\fcharset163\fprq2 Arial Greek (Vietnamese);}{\f2757\fswiss\fcharset238\fprq2 Arial TUR CE;}{\f2758\fswiss\fcharset204\fprq2 Arial TUR Cyr;}{\f2760\fswiss\fcharset161\fprq2 Arial TUR Greek;}{\f2761\fswiss\fcharset162\fprq2 Arial TUR Tur;} +{\f2762\fbidi \fswiss\fcharset177\fprq2 Arial TUR (Hebrew);}{\f2763\fbidi \fswiss\fcharset178\fprq2 Arial TUR (Arabic);}{\f2764\fswiss\fcharset186\fprq2 Arial TUR Baltic;}{\f2765\fswiss\fcharset163\fprq2 Arial TUR (Vietnamese);} +{\f2767\fswiss\fcharset238\fprq2 Arial Baltic CE;}{\f2768\fswiss\fcharset204\fprq2 Arial Baltic Cyr;}{\f2770\fswiss\fcharset161\fprq2 Arial Baltic Greek;}{\f2771\fswiss\fcharset162\fprq2 Arial Baltic Tur;} +{\f2772\fbidi \fswiss\fcharset177\fprq2 Arial Baltic (Hebrew);}{\f2773\fbidi \fswiss\fcharset178\fprq2 Arial Baltic (Arabic);}{\f2774\fswiss\fcharset186\fprq2 Arial Baltic Baltic;}{\f2775\fswiss\fcharset163\fprq2 Arial Baltic (Vietnamese);} +{\f2777\fmodern\fcharset238\fprq1 Courier New ce CE;}{\f2778\fmodern\fcharset204\fprq1 Courier New ce Cyr;}{\f2780\fmodern\fcharset161\fprq1 Courier New ce Greek;}{\f2781\fmodern\fcharset162\fprq1 Courier New ce Tur;} +{\f2782\fbidi \fmodern\fcharset177\fprq1 Courier New ce (Hebrew);}{\f2783\fbidi \fmodern\fcharset178\fprq1 Courier New ce (Arabic);}{\f2784\fmodern\fcharset186\fprq1 Courier New ce Baltic;}{\f2785\fmodern\fcharset163\fprq1 Courier New ce (Vietnamese);} +{\f2787\fmodern\fcharset238\fprq1 Courier New CYR CE;}{\f2788\fmodern\fcharset204\fprq1 Courier New CYR Cyr;}{\f2790\fmodern\fcharset161\fprq1 Courier New CYR Greek;}{\f2791\fmodern\fcharset162\fprq1 Courier New CYR Tur;} +{\f2792\fbidi \fmodern\fcharset177\fprq1 Courier New CYR (Hebrew);}{\f2793\fbidi \fmodern\fcharset178\fprq1 Courier New CYR (Arabic);}{\f2794\fmodern\fcharset186\fprq1 Courier New CYR Baltic;} +{\f2795\fmodern\fcharset163\fprq1 Courier New CYR (Vietnamese);}{\f2797\fmodern\fcharset238\fprq1 Courier New Greek CE;}{\f2798\fmodern\fcharset204\fprq1 Courier New Greek Cyr;}{\f2800\fmodern\fcharset161\fprq1 Courier New Greek Greek;} +{\f2801\fmodern\fcharset162\fprq1 Courier New Greek Tur;}{\f2802\fbidi \fmodern\fcharset177\fprq1 Courier New Greek (Hebrew);}{\f2803\fbidi \fmodern\fcharset178\fprq1 Courier New Greek (Arabic);}{\f2804\fmodern\fcharset186\fprq1 Courier New Greek Baltic;} +{\f2805\fmodern\fcharset163\fprq1 Courier New Greek (Vietnamese);}{\f2807\fmodern\fcharset238\fprq1 Courier New TUR CE;}{\f2808\fmodern\fcharset204\fprq1 Courier New TUR Cyr;}{\f2810\fmodern\fcharset161\fprq1 Courier New TUR Greek;} +{\f2811\fmodern\fcharset162\fprq1 Courier New TUR Tur;}{\f2812\fbidi \fmodern\fcharset177\fprq1 Courier New TUR (Hebrew);}{\f2813\fbidi \fmodern\fcharset178\fprq1 Courier New TUR (Arabic);}{\f2814\fmodern\fcharset186\fprq1 Courier New TUR Baltic;} +{\f2815\fmodern\fcharset163\fprq1 Courier New TUR (Vietnamese);}{\f2817\fmodern\fcharset238\fprq1 Courier New Baltic CE;}{\f2818\fmodern\fcharset204\fprq1 Courier New Baltic Cyr;}{\f2820\fmodern\fcharset161\fprq1 Courier New Baltic Greek;} +{\f2821\fmodern\fcharset162\fprq1 Courier New Baltic Tur;}{\f2822\fbidi \fmodern\fcharset177\fprq1 Courier New Baltic (Hebrew);}{\f2823\fbidi \fmodern\fcharset178\fprq1 Courier New Baltic (Arabic);} +{\f2824\fmodern\fcharset186\fprq1 Courier New Baltic Baltic;}{\f2825\fmodern\fcharset163\fprq1 Courier New Baltic (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255; +\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; +\red255\green255\blue255;}{\stylesheet{\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 \sautoupd Normal;}{ +\s1\ql \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch \af0\afs28\alang1037 \ltrch \fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 1;}{ +\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 \sautoupd heading 2;}{ +\s3\ql \fi180\li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 3;}{ +\s4\qj \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel3\adjustright\rin0\lin0\itap0 \rtlch \af4905601394584691289\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 4;}{\s5\qc \li0\ri0\sl480\slmult1 +\keepn\widctlpar\tx360\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 5;}{\s6\qj \li0\ri0\sl480\slmult1\keepn\widctlpar +\tx360\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 6;}{\s7\ql \li0\ri0\sl480\slmult1\keepn\widctlpar +\tx360\faauto\outlinelevel6\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 7;}{\s8\ql \li0\ri0\sl480\slmult1\keepn\widctlpar +\tx360\faauto\outlinelevel7\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 8;}{\s9\qj \li270\ri0\sl480\slmult1\keepn\widctlpar +\tx360\tx450\faauto\outlinelevel8\adjustright\rin0\lin270\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs20 \ltrch \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext15 \sautoupd \ssemihidden \styrsid1276346 footnote text;}{\*\cs16 \additive \rtlch \af0 \ltrch \f0\super +\sbasedon10 \ssemihidden footnote reference;}{\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext17 \ssemihidden +endnote text;}{\*\cs18 \additive \rtlch \af0 \ltrch \f0\super \sbasedon10 \ssemihidden endnote reference;}{\*\cs19 \additive \rtlch \af0 \ltrch \f0 \sbasedon10 line number;}{\s20\ql \li0\ri0\sl480\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext20 Body Text;}{\s21\qj \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext21 Body Text 2;}{\s22\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 +\ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext22 header;}{\s23\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext23 footer;}{\*\cs24 \additive \rtlch \af0 \ltrch \f0 \sbasedon10 page number;}{\s25\ql \fi180\li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext25 Body Text Indent 2;}{\s26\ql \fi-342\li342\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin342\itap0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext26 Body Text Indent 3;}{\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch +\scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon0 \snext27 \sautoupd SectionTitle;}{\s28\qj \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch \af0\afs28\alang1037 \ltrch +\fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \sbasedon1 \snext28 ChapterTitle;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable{\list\listtemplateid976804938{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers +\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2 +\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers +\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid33510586}{\list\listtemplateid991314500\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0 +{\leveltext\leveltemplateid67698703\'02\'00.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fbias0 \fi-360\li720\jclisttab\tx4606266560638978726\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\leveltemplateid67698713\'04\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\llvelindent0{\leveltext\leveltemplateid67698715 +\'02\'02.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'03.;}{\levelnumbers +\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'05.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-180\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698703\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 +}{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698713\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67698715\'02\'08.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid74590232} +{\list\listtemplateid1954683936{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat3\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 } +{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levespace0\mwvelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2 +\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid206114988}{\list\listtemplateid979906146 +{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2 +\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0'02\'{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid243488594}{\list\listtemplateid163372730{\listlevel\levelnfc2\levelnfcn47\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers +\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'2861763102839165454\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid437989138}{\list\listtemplateid1371811990{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers +\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2 +\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers +\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid517618338}{\list\listtemplateid-645110308{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;} +\rtlch \af0 \ltrch \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch +\af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid612251227}{\list\listtemplateid-228141650{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch \af0\afs24 +\ltrch \fs24\loch\af0\hich\af0\dbch\af0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fbias0 +\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch +\af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid615142110}{\list\listtemplateid1838054828{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch \af0\afs24 +\ltrch \fs24\loch\af0\hich\af0\dbch\af0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch +\af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'64451;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid653685167}{\list\listtemplateid-76126330{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch +\f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5660 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid840199588}{\list\listtemplateid947139722{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch +\f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1369141075}{\list\listtemplateid-1217105034{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat2\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1422868756}{\list\listtemplateid-143252000{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1509370291}{\list\listtemplateid-1969874708{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1753815966}{\list\listtemplateid1327651104{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \%In360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1791701265}{\list\listtemplateid-1766442430{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li983039094165105226\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1842699471}{\list\listtemplateid-1309088930{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch \af0\afs24 +\ltrch \fs24\loch\af0\hich\af0\dbch\af0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li1440\jcliuttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel}{\velnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0 +{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace \levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch +\af0 \ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1875344955}{\list\listtemplateid1459238644{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 } +{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 +\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace360\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 +\ltrch \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1893687403}{\list\listtemplateid2063605328{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid1987978106}{\list\listtemplateid-1812984828{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat3\levelspace0\levelindent0{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\ltrch \afs2 +\rtlch \f0\fs24\fbias0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li2160\jclisttab\tx2160\lin2160 }{\listlevel +\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2 +\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'06.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch \af0 \ltrch +\fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc2\levelnfcn47\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\ltrch \afs2 \rtlch \f0\fs24 \fi-180\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid2144618675}}{\*\listoverridetable{\listoverride\listid1875344955\listoverridecount0\ls1}{\listoverride\listid1369141075\listoverridecount0\ls2}{\listoverride\listid653685167\listoverridecount0\ls3} +{\listoverride\listid1987978106\listoverridecount0\ls4}{\listoverride\listid840199588\listoverridecount0\ls5}{\listoverride\listid1893687403\listoverridecount0\ls6}{\listoverride\listid1422868756\listoverridecount0\ls7}{\listoverride\listid517618338 +\listoverridecount0\ls8}{\listoverride\listid243488594\listoverridecount0\ls9}{\listoverride\listid612251227\listoverridecount0\ls10}{\listoverride\listid437989138\listoverridecount0\ls11}{\listoverride\listid615142110\listoverridecount0\ls12} +{\listoverride\listid1842699471\listoverridecount0\ls13}{\listoverride\listid206114988\listoverridecount0\ls14}{\listoverride\listid1509370291\listoverridecount0\ls15}{\listoverride\listid2144618675\listoverridecount0\ls16}{\listoverride\listid1791701265 +\listoverridecount0\ls17}{\listoverride\listid33510586\listoverridecount0\ls18}{\listoverride\listid1753815966\listoverridecount0\ls19}{\listoverride\listid74590232\listoverridecount0\ls20}}{\*\revtbl {Unknown;}}{\*\rsidtbl \rsid8246\rsid10416\rsid201019\rsid280303 +\rsid534005\rsid546867\rsid550161\rsid554163\rsid791178\rsid802467\rsid995470\rsid1194561\rsid1276346\rsid1330909\rsid1377594\rsid1378156\rsid1531410\rsid1648584\rsid1663324\rsid1665242\rsid1719748\rsid1781117\rsid1847736\rsid1867703\rsid1924178 +\rsid1932179\rsid1975058\rsid2187587\rsid2188025\rsid2189740\rsid2239998\rsid2313833\rsid2584292\rsid2760246\rsid2768779\rsid2970695\rsid3016977\rsid3025761\rsid3028086\rsid3043295\rsid3235903\rsid3304868\rsid3308931\rsid3356114\rsid3427404\rsid3553674 +\rsid3560544\rsid3747336\rsid3813420\rsid3828797\rsid3868273\rsid3889465\rsid3935689\rsid4013963\rsid4027135\rsid4071356\rsid4140030\rsid4141745\rsid4143959\rsid4152804\rsid4276622\rsid4335547\rsid4342917\rsid4403687\rsid4483860\rsid4551223\rsid4671111 +\rsid4678027\rsid4922460\rsid4924362\rsid4945530\rsid5066409\rsid5120557\rsid5250407\rsid5340492\rsid5400671\rsid5536099\rsid5580553\rsid5601694\rsid5833938\rsid5848573\rsid5905669\rsid5993921\rsid6120560\rsid6357166\rsid6452855\rsid6504771\rsid6581237 +\rsid6584119\rsid6707373\rsid6771793\rsid6774100\rsid6817976\rsid6895881\rsid6907170\rsid6950160\rsid6955097\rsid7099497\rsid7104208\rsid7306120\rsid7347137\rsid7368773\rsid7542981\rsid7613718\rsid7799459\rsid7818307\rsid7889884\rsid7895630\rsid8062247 +\rsid8080853\rsid8138310\rsid8154364\rsid8259293\rsid8264474\rsid8537775\rsid8601107\rsid8745540\rsid8983004\rsid8985984\rsid9123678\rsid9207470\rsid9263443\rsid9385017\rsid9513810\rsid9525098\rsid9635323\rsid9835367\rsid10048331\rsid10245123\rsid10372219 +\rsid10430484\rsid10445282\rsid10445850\rsid10509721\rsid10636625\rsid10636918\rsid10695270\rsid10701901\rsid10749649\rsid10754532\rsid10764079\rsid10774769\rsid10832538\rsid10836684\rsid10882959\rsid11084060\rsid11090010\rsid11163277\rsid11274944 +\rsid11349039\rsid11416988\rsid11420266\rsid11472211\rsid11472258\rsid11485985\rsid11552035\rsid11696930\rsid11747594\rsid11803606\rsid11890365\rsid12137753\rsid12144565\rsid12148583\rsid12323918\rsid12352864\rsid12391429\rsid12405329\rsid12603968 +\rsid12651379\rsid12672551\rsid12803034\rsid12856449\rsid13109360\rsid13182277\rsid13451168\rsid13653733\rsid13720635\rsid13765936\rsid13771199\rsid13778447\rsid13917846\rsid13964402\rsid14164988\rsid14295563\rsid14375923\rsid14447357\rsid14615051 +\rsid14631613\rsid14752387\rsid14948990\rsid15033033\rsid15094550\rsid15104734\rsid15211710\rsid15341698\rsid15402994\rsid15408536\rsid15421667\rsid15547050\rsid15624732\rsid15625630\rsid15693328\rsid16192946\rsid16200598\rsid16212167\rsid16327472 +\rsid16335552\rsid16338915\rsid16582730}{\*\generator Microsoft Word 11.0.5604;}{\info{\title Chapter 11}{\author Fern and Joseph Seckbach}{\operator Shmuel Himelstein}{\creatim\yr2003\mo1\dy6\hr10\min35}{\revtim\yr2004\mo3\dy14\hr11\min13} +{\printim\yr2002\mo12\dy23\hr14\min14}{\version20}{\edmins1215}{\nofpages97}{\nofwords12776}{\nofchars72829}{\*\company TechnTrans}{\nofcharsws85435}{\vern24689}}\paperw11906\paperh16838\margl1797\margr1797\margb1712\ltrsect +\widowctrl\ftnbj\aenddoc\pgnstart167\makebackup\margmirror\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3 +\jcompress\viewkind1\viewscale130\pgbrdrhead\pgbrdrfoot\nolnhtadjtbl\rsidroot12391429 \fet0{\*\ftnsep \ltrpar \pard\plain \ltrpar\s23\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid4342917 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid4342917 +\par +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid4342917 ______ + +\par +\par +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid4342917 +\chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid4342917 +\chftnsepc +\par }}\ltrpar \sectd \ltrsect\psz9\pgnrestart\pgnstarts167\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\header \ltrpar \pard\plain \ltrpar\s22\ql \li0\ri0\sl480\slmult1\widctlpar +\tx360\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ai\af0\afs18 \ltrch \i\fs18\insrsid4342917 Light and Consolation:}{\rtlch \af0\afs18 +\ltrch \fs18\insrsid4342917 Chapter Twelve +\par }}{\footer \ltrpar \pard\plain \ltrpar\s23\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\pvpara\phmrg\posxc\posy0\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field{\*\fldinst {\rtlch \af0 \ltrch \cs24\insrsid4342917 PAGE }}{\fldrslt {\rtlch \af0 \ltrch \cs24\lang1024\langfe1024\noproof\insrsid15211710 174}}}{\rtlch \af0 \ltrch \cs24\insrsid4342917 + +\par }\pard \ltrpar\s23\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid4342917 +\par }}{\*\pnseclvl1\pnucltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta ..}}{\*\pnseclvl2\pnord\pnqc\pnstart1\pnindent720\pnhang {\pntxta ..}}{\*\pnseclvl3\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxta ..}}{\*\pnseclvl4\pncard\pnqc\pnstart1\pnindent720\pnhang +{\pntxta )}}{\*\pnseclvl5\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pncard\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl8\pncard\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1%nid%%nparlJ +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0\afs24 \ltrch \fs24\insrsid12391429\charrsid1781117 Chapter Twelve +\par }\pard\plain \ltrpar\s28\qc \li0\ri0\sb120\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch \af0\afs28\alang1037 \ltrch \fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0\afs24 \ltrch +\b\fs24\insrsid12391429\charrsid1781117 Condolences Not in the Presence of the Mourner +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 A. Written Condolences +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid6357166 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 History of the Custom:}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + Another customary way to comfort mourners is the writing of \'93condolence letters.\'94 This allows people unable to visit the home of the mourner during the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 shiv\rquote ah}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 to express the need they fe}{\rtlch \af0 \ltrch \insrsid6357166\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +l to offer their condolences, owing to their closeness to the deceased or the mourner. This custom arose as early as tenth-century Babylonia, as will be described below. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid4342917 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 There is no uniform text for these letters. }{\rtlch \af0 \ltrch +\insrsid4342917\charrsid1781117 The c}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +ontent and style vary from letter to letter, from place to place, and from era to era. Some writers intersperse their own words with biblical phrases, while others use talmudic quotations. There are those who try to provide solace to the mourner throu +gh philosophical statements, writing about the meaning of the death of man and the ways of mourning and comfort one hhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhh okhhok[dddc follow. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid11472211 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +While perusing these letters, the reader will be able to discern the different types of styles and the phrases used to express condolences among Jewish communities in different generations. These were the means }{\rtlch \af0 \ltrch +\insrsid11472211\charrsid1781117 to enable }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 people to express a complete Jewish worldview of the way one should approach death. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid6357166 {\rtlch \af0 \ltrch \insrsid6357166\charrsid1781117 The }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'93}{\rtlch \af0 \ltrch +\insrsid6357166\charrsid1781117 c}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ondolence letter\'94 literature}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab Words of condolence were also +written as the prelude to letters on various topics. It was customary to begin the letter with two or three lines of condolence and then to continue on with the other issues. We will not deal with that type of letter but only with those known to be \'93 +condolence letters,\'94 + written mainly to comfort the mourner (except for two letters: one from the eleventh century from which we learn of this custom in that period; the other written to Rabbi Moshe di Trani which is distinctive since it is an instance in which a + mourning student writes condolences to his mourning rabbi). At times it is difficult to distinguish precisely between a letter dealing with lamentation and eulogy that is replete with aphorisms of condolence and a letter of condolence replete with statem +e +nts of lamentation and eulogy. I wish to thank R. Y. Buchsenbaum who took the trouble to send me a list of manuscripts of condolence letters he possessed, some of which had appeared in his anthologies of letters and others which have remained in manuscrip +t + and have yet to be published. Owing to pressure of time and the scope of this volume, I chose to publish only a selection of them and will, God willing, write about them in the future. Another type of written condolences with which we will not deal is fo +und in the literature of }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid1867703 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 and eulogies. On the motifs of consolation in medieval Hebrew }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid1867703 Lam.}{\rtlch +\af0 \ltrch \insrsid4342917 in Spain, see Y. Levin, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Al Mavet, }{\rtlch \af0 \ltrch \insrsid4342917 pp. 158\endash 163. He indicates a number of special motifs in words of consolation found in the Hebrew }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid1867703 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 of medieval Spain by Ibn }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Ezra}{\rtlch \af0 \ltrch \insrsid4342917 +, Yehuda Halevi, and Shemuel Hanagid, such as: watering the grave and the blessing for rain recited over it (secular poems, nr. 10, verses 25\endash +26), or the motif that death is not the end but rather the separation of the soul from the body, with the soul rising on high between the seraphim and the angels (}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Ibid}{\rtlch \ai\af0 \ltrch +\i\insrsid4342917\charrsid5066409 .}{\rtlch \af0 \ltrch \insrsid4342917 +, poem nr. 29), and others. In the cross-references I have generally cited only one source from the Bible or talmudic literature. Even for some of those letters that came with cross-references, additional references have been added in the notes.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 as a genre with its own distinctive style has not yet been the object of research. In this chapter we }{\rtlch \af0 \ltrch \insrsid11472211\charrsid1781117 only }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 intend to make the reader aware of another way commonly used in the past, and }{\rtlch \af0 \ltrch \insrsid11472211\charrsid1781117 which is }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 still }{\rtlch \af0 \ltrch +\insrsid11472211\charrsid1781117 used }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 today, to console mourners. }{\rtlch \af0 \ltrch \insrsid11472211\charrsid1781117 Here w}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +e present a number of letters that have distinctive characteristics, collected from }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Rishonim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 Aharonim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +, and manuscripts of anthologies of letters; we survey their content and their structure, and we indicate the sources for the quotations the writers used. The letters are presented chronologically. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par In general one may say that the authors of the letters came from the culturally advanced sector of the Jewish community. Most of them were not only expert}{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 s}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 at composition and style but were pious Jews at home in the Bible, the Talmud, and }{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 other }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 works of Jewish law as + well as thoroughly knowledgeable about the attitudes and language of the Sages. +\par +\par }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \page [1] a Condolence Letter from a Gaon +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid3427404 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and }{\rtlch \ab\af0 \ltrch \b\insrsid6357166\charrsid1781117 its }{ +\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Recipient }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash J. Mann in his }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Texts and Studies}{\rtlch \ai\af0 \ltrch +\cs16\i\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 \tab Pp. 160\endash 161.}}}{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 presents the second half of this letter (from the end of the sixth }{\rtlch \af0 \ltrch \insrsid3427404\charrsid1781117 tenet}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ) and attributes it to Rabbi Samuel b. Hophni (Sura}{\rtlch \af0 \ltrch \insrsid3427404\charrsid1781117 Gaon}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , 996\endash 1012). In contrast to this, Rabbi S. Abramson} +{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid4678027 BA-Merkazim u-ba-Tefu}{\rtlch \ai\af0 \ltrch \i\cf2\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid4678027 z}{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid4678027 ot bi-Tekufat ha-Geonim}{\rtlch \af0 \ltrch \lang1031\langfe1@33\langnp10c1\insrsid4342917 , pp. 58\endash 72.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + offers the letter in its entirety and discusses it at length, casting doubts }{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 about }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Mann\rquote s attribution of R. Samuel b. Hophni as the auth +or. He feels that the division of the letter into }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 \'93inyanim\'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (\'93}{\rtlch \af0 \ltrch \insrsid3427404\charrsid1781117 tenets}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \'94) befits Rav Sa\rquote adiah Gaon (ben Joseph, head of the Sura yeshivah, 927\endash 942). Moreover, other places in this letter use the same language as occur}{\rtlch \af0 \ltrch +\insrsid3427404\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in R. Saadiah\rquote s }{\rtlch \ai\af3753975690556967661 \ltrch \i\insrsid12391429\charrsid1781117 Emunot ve-DE\rquote ot. }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Abramso +n }{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 also }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 points out that this is the same writing style as }{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 that of }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Rav Israel Gaon}{\rtlch \af0 \ltrch \insrsid3427404\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the son of R. Samuel. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid4071356 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab In any event, Abramson }{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 is unable to } +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 totally resolve his doubt and cite}{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + support for this letter from statements by Rabbi Samuel ben Hophni}{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 He }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 conclude}{\rtlch \af0 \ltrch \insrsid280303\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : \'93 +If Rav Saadiah Gaon is the writer of this letter, it is not surprising. But if it is R. Samuel ben Hophni who is the author, then we must say that he use}{\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 d}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 the words of Rav Saadiah, and sometimes literally copied them. This is not impossible.\'94 The }{\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 author }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 wrote th}{ +\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 is}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'93condolence letter\'94 to a man whose son had died. In Abramson\rquote s view, \'93 +the son was not very young, for if that had been the case the writer would not have refrained from mentioning the }{\rtlch \af0 \ltrch \insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of }{\rtlch \af0 \ltrch +\insrsid3427404\charrsid1781117 \lquote }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the death of the children}{\rtlch \af0 \ltrch \insrsid3427404\charrsid1781117 \rquote }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + and its explanation. We also know that Rav Saadiah Gaon and Rav Samuel ben Hophni dealt with the }{\rtlch \af0 \ltrch \insrsid3427404\charrsid1781117 issue }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of children\rquote +s suffering and of their death in relation to the theological question treated by Muslim religious scholars.\'94}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 +\tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , p. 61.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 Abramson }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 also fe}{\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 l}{\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 s}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 that \'93the recipient of the letter was not a }{\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +orah scholar but was well versed in philosophy and literature (= ethics); for that reason we see that the gaon did not quote from the Sages}{\rtlch \af0 \ltrch \insrsid10774769\charrsid1781117 extensively}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , but put a positive slant on the need to }{\rtlch \af0 \ltrch \insrsid5993921\charrsid1781117 thank God for }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the bad the same way we }{\rtlch \af0 \ltrch +\insrsid5993921\charrsid1781117 thank Him }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the good}{\rtlch \af0 \ltrch \insrsid5993921\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid5993921\charrsid1781117 Thus, this letter }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 describe}{\rtlch \af0 \ltrch \insrsid5993921\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + the incident of R. Johanan whose ten sons died while he was still alive.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab See }{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4140030 Berakhot}{\rtlch \af0 \ltrch \insrsid4342917 5b.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + The greater part of the letter consists of quotes from biblical passages and allusions to states by the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 maskilim }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and }{\rtlch \ai\af0 \ltrch +\i\insrsid4071356\charrsid1781117 \lquote }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mishpat ha-sekhel.}{\rtlch \ai\af0 \ltrch \i\insrsid4071356\charrsid1781117 \rquote }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The }{\rtlch +\ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 maskilim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid5993921\charrsid1781117 referred to here }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +were no doubt those concerned with \'93ethics\'94 (}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 adab}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ) who devoted chapters of their works to anxiety and suffering.\'94}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid9525098 BA-Merkazim u-ba-Tefuzot bi-Tekufat ha-Geonim}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 , pp. 60.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash This letter deals with four themes}{\rtlch \af0 \ltrch \insrsid7895630\charrsid1781117 :}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid4678027 {\rtlch \af0 \ltrch \insrsid7895630\charrsid1781117 A. A}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 n }{\rtlch a0 \ltrch +\insrsid7895630\charrsid1781117 introduction }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 consisting of quotations of biblical verses }{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 which }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 describe the mourner\rquote s situation at the time of his suffering. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1665242 {\rtlch \af0 \ltrch \insrsid7895630\charrsid1781117 B. }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +The reason for the obligation to observe the laws and customs of mourning (these are actions commanded by the Creator, for which the mourner will be rewardedin the future. Conver +sely, acts not within the bounds of obligation are distasteful and it is forbidden to carry them out, even }{\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 in small measure}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ).}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid9525098 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab It is possible that the gaon is, + by allusion, coming out here against customs of mourning deriving from non-Jewish origin which took root among the Jewish dispersal (an explanation that differs from Abramson\rquote s, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Ibid}{\rtlch \ai\af0 +\ltrch \i\insrsid4342917\charrsid5066409 .}{\rtlch \af0 \ltrch \insrsid4342917 , p. 59). See }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Hilkhot Avelut}{\rtlch \af0 \ltrch \insrsid4342917 by R. }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Samuel} +{\rtlch \af0 \ltrch \insrsid4342917 b. Hophni, p. 108: \'93and should he say: Is it permissible to act optionally in mourning by }{\rtlch \ab\af0 \ltrch \b\insrsid4342917 adding days to those legally prescribed}{\rtlch \af0 \ltrch \insrsid4342917 + mourning \emdash he should be told: \lquote Yes, it is permissible.\rquote \'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid16582730 {\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 C. }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +a person should not say that agony is a natural phenomenon }{\rtlch \af0 \ltrch \insrsid16582730\charrsid1781117 which }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 one cannot overcome, for the }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 maskilim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 teach a person to }{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 discontinue}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 his suffering}{ +\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 I}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 f he }{\rtlch \af0 \ltrch +\insrsid4678027\charrsid1781117 could }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 not have such inner strength, they would not have so instructed him. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1665242 {\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 D. }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Ten }{\rtlch \af0 \ltrch +\insrsid1665242\charrsid1781117 basic }{\rtlch \af0 \ltrch \insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 s, }{\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 with supplementary }{\rtlch \af0 \ltrch +\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , which when understood and acted upon properly}{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 ,}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 can }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 guide the mourner to overcom}{\rtlch \af0 \ltrch \insrsid1665242\charrsid1781117 e}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 his suffering, namely: +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid4678027 {\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 one}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 acknowledg}{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 e}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 the existence of God, all of whose actions are just and good}{\rtlch \af0 \ltrch \insrsid15402994\charrsid1781117 ;}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid4678027\charrsid1781117 and to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 refrain from dwelling upon His attributes. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1378156 {\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 s two and three}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 acknowledg}{\rtlch \af0 \ltrch \insrsid4678027\charrsid1781117 e}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 the correctness of God\rquote s action}{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 zidduk ha-din} +{\rtlch \ai\af0 \ltrch \i\insrsid1378156\charrsid1781117 )}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ; }{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 acknowledg}{\rtlch \af0 \ltrch +\insrsid1378156\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the rightness of Divine judgment. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 four}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 to }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 acknowledg}{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 es}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that God is the Creator of man and that He holds all souls in }{\rtlch \af0 \ltrch +\insrsid1378156\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is hands. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 five}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 to }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 acknowledg}{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that we were not created to live forever, }{\rtlch \af0 \ltrch +\insrsid15402994\charrsid1781117 and that }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 our goal on this earth is to do what is right in the eyes of the Lord}{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 ,}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15402994\charrsid1781117 so as }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to earn a place in the world to come. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 six}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 to }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 acknowledg}{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + that death is the fate of every living thing; it cannot be avoided and there is no deliverance from it. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 seven}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 to }{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 acknowledg}{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that sadness and suffering are part of life in this world. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 eight}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash one who is mourning the death of his sons }{\rtlch \af0 \ltrch +\insrsid1378156\charrsid1781117 or }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 daughters must accept the fact and learn from the ways of the prophets and }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 zaddikim}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 whose children died during their lifetime}{\rtlch \af0 \ltrch \insrsid15402994\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 . +\par }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 nine}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 to }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 realiz}{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that the death of the deceased is for his benefit. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 Tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 ten}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{\rtlch \af0 \ltrch \insrsid1378156\charrsid1781117 to }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 accept the belief in the resurrection of the dead (the father will yet dwell with his children). +\par }\pard\plain \ltrpar\s21\qj \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +Included in the presentation of portions of the letter are Abramson\rquote s comments. +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 +\page }{\rtlch \ab\af156 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 :\sect }\sectd \ltrsect +\margbsxn1714\psz9\sbknone\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\header \ltrpar \pard\plain \ltrpar\s22\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ai\af0\afs18 \ltrch \i\fs18\insrsid4342917 Light and Consolation:}{\rtlch \af0\afs18 \ltrch \fs18\insrsid4342917 Chapter Twelve +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid4342917 +\par +\par }}{\footer \ltrpar \pard\plain \ltrpar\s23\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\pvpara\phmrg\posxc\posy0\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\field{\*\fldinst {\rtlch \af0 \ltrch \cs24\insrsid4342917 PAGE }}{\fldrslt {\rtlch \af0 \ltrch \cs24\lang1024\langfe1024\noproof\insrsid15625630 220}}}{\rtlch \af0 \ltrch \cs24\insrsid4342917 + +\par }\pard \ltrpar\s23\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid4342917 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid4342917 +\par +\par }}{\*\pnseclvl1\pnucltr\pnqc\pnstart1\pnindent720\pnhang {\pntxta ..}}{\*\pnseclvl2\pnord\pnqc\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxta ..}}{\*\pnseclvl4\pncard\pnqc\pnstart1\pnindent720\pnhang +{\pntxta )}}{\*\pnseclvl5\pndec\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pncard\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl8\pncard\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcltr\pnqc\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\ltrrow\trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 21\cell }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid554163 \rtlch +\af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid3553674\charrsid1781117 S}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 hould you ask how the worrier }{\rtlch \af156 \ltrch +\insrsid554163\charrsid1781117 is to}{\rtlch \af156 \ltrch \insrsid3553674\charrsid1781117 }{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 divert +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid8138310 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 his anxiety and }{\rtlch \af0 \ltrch \insrsid8138310\charrsid1781117 how }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the one who sighs }{\rtlch \af0 \ltrch \insrsid8138310\charrsid1781117 is }{\rtlch \af0 \ltrch +\insrsid554163\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid8138310\charrsid1781117 cease }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 his sigh}{\rtlch \af0 \ltrch \insrsid8138310\charrsid1781117 ing}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , you will be told that the worry and sigh can be removed}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Ms. has } +{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'e5\'f0\'e0\'f0\'e7}{\rtlch \af0 \ltrch \insrsid4342917 , while it should have }{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'e5\'e0\'f0\'e7}{\rtlch \af0 \ltrch \insrsid4342917 + ; it may be that erasure of the }{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'f0}{\rtlch \af0 \ltrch \insrsid4342917 is indicated by points above and below in the manuscript..}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par by means of }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 ten }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +, some of them basic and some of them }{\rtlch \af0 \ltrch \insrsid3553674\charrsid1781117 secondary to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 them. The }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 first }{\rtlch \ab\af0 +\ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is that one should know +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that we and }{\rtlch \af0 \ltrch \insrsid8138310\charrsid1781117 [the departed] have }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 a Creator who is the }{\rtlch \af0 \ltrch \insrsid3553674\charrsid1781117 w}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 isest of the wise}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab This phraseology is found in }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Ha-Midrash ha-Gadol}{\rtlch \af0 \ltrch \insrsid4342917 on }{\rtlch \ai\af0 \ltrch +\i\insrsid4342917\charrsid10509721 Genesis}{\rtlch \af0 \ltrch \insrsid4342917 48:3, p. }{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'fa\'f9\'f1\'e2}{\rtlch \af0 \ltrch \insrsid4342917 (}{\rtlch \ai\af0 \ltrch +\i\insrsid4342917\charrsid10509721 Genesis Rabba}{\rtlch \af0 \ltrch \insrsid4342917 , }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , without the word }{\ltrch \af262 \rtlch +\f262\fs20\lang1037\insrsid4342917 \'e7\'eb\'ee\'e9\'ed}{\rtlch \af0 \ltrch \insrsid4342917 .}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , a merciful }{\rtlch \af0 \ltrch \insrsid8138310\charrsid1781117 God }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 who is full of mercy, and that }{\rtlch \af0 \ltrch \insrsid3553674\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e created us with his lovingkindness}{\rtlch \af0 \ltrch +\insrsid8138310\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \nsrsXd12391429\charrsid1781117 25\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid8138310 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +and does what is good for us and what will bring us closer to fearing }{\rtlch \af0 \ltrch \insrsid3553674\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im and to performing his service}{\rtlch \af0 \ltrch +\insrsid8138310\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8138310\charrsid1781117 Thus, }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 if}{\rtlch \af0 \ltrch +\insrsid3747336\charrsid1781117 He }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 knows that }{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 being}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par wealthy and }{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 having }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 children will bring us closer to holding}{\rtlch \af0 \ltrch \insrsid6907170\charrsid1781117 H}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 im in awe, He will make us wealthier and give us children, and if }{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e know}{\rtlch \af0 \ltrch +\insrsid3747336\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11485985 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the}{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 se}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 will distance us from }{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is service, }{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 H}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 e will test us with poverty and try us by the death of our children. }{\rtlch \af0 \ltrch \insrsid11485985\charrsid1781117 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e must}{\rtlch \af0 \ltrch +\insrsid11485985\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par turn all our words to Him and not think a bad thought about any of }{\rtlch \af0 \ltrch \insrsid6907170\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is attributes and words, as it is written:}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 + 9:4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15211710 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Wise of heart +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and mighty in power \emdash who ever challenged Him and came out whole?}{\rtlch \af0 \ltrch \insrsid15211710 +\'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 So the man whom God makes rich, should thank }{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 30\cell }\pard \ltrpar +\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid6907170 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and one who is tested by poverty should also thank }{\rtlch \af0 \ltrch \insrsid10749649\charrsid1781117 H}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im and bless }{\rtlch \af0 \ltrch \insrsid10749649\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im}{\rtlch \af0 \ltrch \insrsid6907170\charrsid1781117 .}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid6907170\charrsid1781117 I}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 f his children or his relatives}{\rtlch \af0 \ltrch \insrsid6907170\charrsid1781117 should die}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 , he should take the yoke +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11485985 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of heaven upon himself for He has acted well toward him}{\rtlhi \af0 \ltrch +\insrsid8745540\charrsid1781117 . A}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 s our rabbis}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid4140030 Berakhot}{\rtlch \af0 \ltrch \insrsid4342917 9:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 said, \'93Man is bound to }{\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 thank }{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 [God] for the }{\rtlch \af0 \ltrch \insrsid11485985\charrsid1781117 bad}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid8745540 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 even as he}{\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 thanks}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab It is even cited in TB }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4140030 Berakhot}{\rtlch +\af0 \ltrch \insrsid4342917 33b. In the mishnah }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4140030 Berakhot}{\rtlch \af0 \ltrch \insrsid4342917 9:5 the version is \'93just as }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 he}{\rtlch \af0 \ltrch +\insrsid4342917 blesses\'85.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 Him}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for the good.\'94 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 second }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 is that we are obliged to know that our Creator +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid8745540 {\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 is }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +just and acts in truth, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 +\rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{ +\rtlch \af0 \ltrch \insrsid4342917 119:75.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid4945530\charrsid1781117 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I know, }{\rtlch \af0 \ltrch +\insrsid8745540\charrsid1781117 O}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lord, that }{\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 Y}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 our rulings are just; rightly }{\rtlch \af0 +\ltrch \insrsid8745540\charrsid1781117 Y}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ou have humbled me. }{\rtlch \af0 \ltrch \insrsid3747336\charrsid1781117 He }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +has no injustice before him and no evil,}{\rtlch \af0 \ltrch \insrsid15211710 \'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10509721 }{\rtlch \af0 \ltrch \insrsid4342917 5:5.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid4945530\charrsid1781117 \lquote }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 For You are not a God who desires wickedness; evil cannot abide with You\'85}{\rtlch \af0 \ltrch +\insrsid4945530\charrsid1781117 \rquote \'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 So i[f]\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 35\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid4276622 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 God chastise}{\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8745540\charrsid1781117 one }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 with physical illness or through the death of his children or through }{\rtlch \af0 \ltrch \insrsid4945530\charrsid1781117 misery}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 or suffering, he should know that }{ +\rtlch \af0 \ltrch \insrsid5400671\charrsid1781117 [God] }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 has acted }{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 just[ly] +\par }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 with him }{\rtlch \af0 \ltrch \insrsid5400671\charrsid1781117 a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 nd did }{\rtlch \af0 \ltrch \insrsid8154364\charrsid1781117 not }{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 deprive}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 +\rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721!Job}{ +\rtlch \af0 \ltrch \insrsid4342917 27:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 him of His justice, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 25:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 \'93}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 All the Lo}{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 rd\rquote s paths are steadfast love\'85.\'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 third }{\rtlch \ab\af0 \ltrch +\b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid4276622 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 That our creator }{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 granted }{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 us our li}{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 ves}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the breath of our soul}{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 s}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 with great lovingkindness, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch\i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 42:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 \'93}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Who gave breath to +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid5400671 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the people upon it, and life to those who walk on}{\rtlch \af0 \ltrch +\insrsid5400671\charrsid1781117 it}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 \'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and whenever He }{\rtlch \af0 \ltrch +\insrsid5400671\charrsid1781117 wishes }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to, He will take our soul and gather our spirit and [the spirit] of our +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 sons and daughters, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 34:14.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 +\ltrch \insrsid4276622\charrsid1781117 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 If He but intends it, He can c}{\rtlch \af0 \ltrch \insrsid4276622\charrsid1781117 all back His spirit and breath.\'94}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par }{\rtlch \af0 \ltrch \insrsid10836684\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he [}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 fourth }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 +\ltrch \insrsid10836684\charrsid1781117 is}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ] \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 40\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid10836684 {\rtlch \af0 \ltrch \insrsid10836684\charrsid1781117 E}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ven though we are the fathers of our children, behold their Creator is called their }{\rtlch \af0 \ltrch \insrsid10836684\charrsid1781117 F}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ather, for }{\rtlch \af0 +\ltrch \insrsid5400671\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e is the one who sust[ains] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid15211710 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 them in life and }{\rtlch \af0 \ltrch \insrsid5400671\charrsid1781117 is }{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 the creator of their soul}{\rtlch \af0 \ltrch \insrsid1781117\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , as it is written:}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 + 63, 37.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af512 \ltrch \insrsid15211710 \'93}{\rtlch \af74 \ltrch \f74\insrsid10245123\charrsid1781117 For }{\rtlch \af74 \ltrch \f74\cf1\insrsid10245123\charrsid1781117 You are our}{\rtlch +\af74 \ltrch \f74\insrsid10245123\charrsid1781117 Father, though Abraham does not know us}{\rtlch \af74 \ltrch \f74\insrsid8080853\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'85}{\rtlch \af0 \ltrch \insrsid15211710 \'94}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid10636625 B}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e[cause] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid8080853 {\rtlch \af0 \ltrch \insrsid8080853\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e is our creator, }{\rtlch \af0 \ltrch +\insrsid8080853\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e rules over us to do His will with us and }{\rtlch \af0 \ltrch \insrsid8080853\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +e possesses us and [our children]. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid15624732 {\rtlch \af0 \ltrch \insrsid8080853\charrsid1781117 I}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 n [his hand]}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Tentative reading; another possibility, \'93and [creator]\'94 +. The remnants of the characters in the manuscript do not allow one to make a definite decision here.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 are all our souls, as it is written:}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 12:6.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15211710 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 In His hand is every living soul and the breath of all mankind,}{\rtlch \af0 \ltrch \insrsid15211710 +\'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and our souls are entrusted to }{\rtlch \af0 \ltrch \insrsid15624732\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is hand +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 31:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15211710 \'93} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Into Your hand I entrust my spirit\'85.}{\rtlch \af0 \ltrch \insrsid15211710 \'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par And the }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 fifth }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is to know that our }{\rtlch \af0 \ltrch \insrsid15211710 C}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 reator\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \ceolx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 45\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid7099497 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 did not create us in thi +s world to live in it forever, but He created us to do what is good and right in [}{\rtlch \af0 \ltrch \insrsid7099497\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is ey]es for\'85 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid10636625 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that is intended}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnotc \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab For the time allotted to us.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for the world to come, as it is written:}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 \tab }{\rtlch \af0 \ltrch +\i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 21:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15211710 \'93}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 He asked You for life; You granted it\'85.}{\rtlch \af0 \ltrch \insrsid15211710 \'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid10636625 T}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 his world is like the [week]days +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3304868 {\rtlch \af0 \ltrch \insrsid10636625 while }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the world to come is like the rest}{\rtlch \af0 +\ltrch \insrsid15624732\charrsid1781117 ing}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of the Sabbath to become refreshed on it, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid10636918 Malach}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 i 3:20.}}} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15211710 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 But for you who rvere My name}{\rtlch \af0 \ltrch \insrsid3304868\charrsid1781117 ,}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid3304868\charrsid1781117 the}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 sun }{\rtlch \af0 \ltrch \insrsid3304868\charrsid1781117 [of righteousness will arise]}{\rtlch \af0 \ltrch +\insrsid15211710 \'94}{\rtlch \af0 \ltrch \insrsid3304868\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'85.The com[mandments], too, +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 are a path to the world to come and a trail for traveling from this world to the world to come. +\par The }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 sixth }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + is that we should know that one cannot flee from death and that no living thing can be spared from it +\par as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch +\i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid10636918 Psalms }{\ytlci \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 89:49.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15211710 \'93}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 What\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow5\irowband5\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 50\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid4152804 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 man can live and not see death\'85.}{\rtlch \af0 +\ltrch \insrsid15211710 \'94 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 And as for our forefathers and our prophets, have they }{\rtlch \af0 \ltrch \insrsid4152804\charrsid1781117 not }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +all died, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang0037\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \insrsid4342917\charrsid10636918 Zechariah}{\rtlch +\af0 \ltrch \insrsid4342917 1:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15211710 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Where are your fathers +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 now?\'85.}{\rtlch \af0 \ltrch \insrsid15211710 \'94 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +But some of them will die in youth and some will die as adults and some will die in old age, as it is written:}{\rtlch \af0\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 +\tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 21:23\endash 26.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \af0 \ltrch \insrsid15211710 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [One man dies] in robust health\'85his pails are full of milk and the marrow\'85another dies embittered\'85}{\rtlch \af0 \ltrch \insrsid15211710 \'94}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 +\par They both l[ie]}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Mann\rquote s section begins with this line.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 in the [d]u[st] \'85.And we must all die}{\rtlch \af0 \ltrch \insrsid9123678 ;}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang3082\langfe1033\langnp3082\insrsid4342917 \tab 2 }{\rtlch \ai\af0 \ltrch \i\lang3082\langfe1033\langnp3082\insrsid4342917\charrsid4403687 Samuel}{\rtlch \ai\af0 \ltrch \i\lang3082\langfe1033\langnp3082\insrsid4342917\charrsid10636918 }{\rtlch \af0 +\ltrch \lang3082\langfe1033\langnp3082\insrsid4342917 14:14.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \line we are like water poured out on the ground\'85 +\par }{\rtlch \af0 \ltrch \insrsid4152804\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 seventh}{\rtlch \ab\af0 \ltrch \b\insrsid4152804\charrsid1781117 tenet}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 that we know that the bad things in this [wor]l[d] are man[y]\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow6\irowband6\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 55\cell in it for a life of sorrow they will live, since a rich man will become poor \'85 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid15624732 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 prophets and righteous persons without sorrow, for all\'85 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 eighth }{\rtlch \ab\af0 \ltrch +\b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is that one who is [m]ourning for his sons and for hi}{\rtlch \af0 \ltrch \insrsid12137753\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + [d]aughters is obliged to rely upon the example \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow7\irowband7\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 60\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12137753 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of the prophets and the righteous person}{\rtlch +\af0 \ltrch \insrsid12137753\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 whose children died during their lives\'85[Aaron] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid9123678 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the chief}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote +\ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang3082\langfe1033\langnp3082\insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\lang3082\langfe1033\langnp3082\insrsid4342917\charrsid4403687 Ezra}{\rtlch \af0 \ltrch +\lang3082\langfe1033\langnp3082\insrsid4342917 7:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 priest whose sons died during his lifetime}{\rtlch \af0 \ltrch \insrsid9123678 :}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Lev.}{\rtlch \af0 \ltrch \insrsid4342917 10:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 +\ltrch \insrsid9123678 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 And fire came forth [from the Lord and consumed them; thus they died] +\par before the Lord,}{\rtlch \af0 \ltrch \insrsid9123678 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Aaron was silent and kept his peace in accepting the judgment of the Lord, as it is written:}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Lev.}{\rtlch \af0 \ltrch \insrsid4342917 10:3. +}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid9123678 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 And Aaron was silent.}{\rtlch \af0 \ltrch \insrsid9123678 \'94}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 David, too, +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 fasted and cried all the while the child was alive}{\rtlch \af0 \ltrch \insrsid12137753\charrsid1781117 ,}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and when he died, he was comforted, for he said he would go to his son and his son would not re[turn] to him, +\par as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab 2 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Samuel}{\rtlch \af0 \ltrch +\insrsid4342917 12:22\endash 23.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid9123678 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 While the child was still alive, I fasted and wept because I thought: +\lquote Who knows? The Lord may have pity on me,\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow8\irowband8\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 65\cell and the child may live.\rquote But now that he is dead, [why should I fast]? Can I bring him back again? I shall go\'85.}{\rtlch \af0 \ltrch \insrsid9123678 \'94}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 And as for Job, his th[ree] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12137753 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 sons died at the same time and he accepted the judgment of his }{\rtlch \af0 \ltrch +\insrsid12137753\charrsid1781117 C}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 reator, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 +\tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 1:21.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 He said, \'93Naked came I\'85.\'94 And afterwards +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + [he also said}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \tich \insrsid4342917 +\tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 2:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid9123678 {\rtlch \af0 \ltrch \insrsid9123678 \'93T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he good we should accept from God\'85.}{\rtlch \af0 +\ltrch \insrsid9123678 \'94 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he Lord restored him and made his end good, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 42:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid9123678 \'93}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 The Lord restored Job\rquote s fortunes when he prayed \'85.}{\rtlch \af0 \ltrch \insrsid9123678 \'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Thus the mourner mourning for his children should take comfort + +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \i.srsid12391429\charrsid1781117 \'85to be like these prophets}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin4047\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Generally speaking. Aaron was not a prophet. Unless we say that the customary usage here derives from an external influence: \'93prophets without a mission.\'94 Regarding David +\emdash we have the well-known responsum of R. Nissim Gaon to R. Abraham ben R. Moses (now in }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Milhamot Hashem}{\rtlch \af0 \ltrch \insrsid4342917 by R. R. Margaliot, 116).}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 who suffered over their children to be like them, and also in the words of \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow9\irowband9\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 70\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12137753 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [R. Johanan}{\rtlch \af0 \ltrch \insrsid12137753\charrsid1781117 ]}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid4140030 Berakhot}{\rtlch \af0 \ltrch \insrsid4342917 5b, and see also }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 O}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 z}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ar ha-Ge +\rquote onim}{\rtlch \af0 \ltrch \insrsid4342917 \emdash The Commentaries, page 6, paragraph 18.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 about whom the Sages said that h[e] had ten sons and they died during his lifetime and }{\rtlch +\af0 \ltrch \insrsid12137753\charrsid1781117 he }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 accepted the judgment of his }{\rtlch \af0 \ltrch \insrsid12137753\charrsid1781117 C}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 reator. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + and the }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 ninth}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12405329 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [}{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 that we should know th}{\rtlch \af0 \ltrch \insrsid12405329 a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 t dea[th] is better than life and that the }{\rtlch \af0 \ltrch \insrsid12405329 L}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ord caused them to die for his benefit, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 63:4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \af0 \ltrch \insrsid12405329 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [}{\rtlch \af0 \ltrch \insrsid12405329 Y}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 our faithfulness] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [is better than life; my lip]s declare your praise.}{\rtlch \af0 \ltrch \insrsid12405329 \'94}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 And the }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 tenth }{\rtlch \ab\af0 \ltrch \b\insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + is that we know that dead are destined to live in the future, since the Lord will resurrect everyone, and the father will know his children and sit among them, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Mann has already noted that this apparently refers to 2 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Samuel}{\rtlch \af0 \ltrch \insrsid4342917 12:23: \'93 +I shall go to him.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11472258 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'85. And when the mo[urn]er know}{\rtlch \af0 \ltrch \insrsid11472258\charrsid1781117 s}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 all this in his heart or confirm it}{\rtlch \af0 \ltrch \insrsid11472258\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , }{\rtlch \af0 \ltrch \insrsid11472258\charrsid1781117 +he will}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid11472258\charrsid1781117 forget}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [}{\rtlch \af0 \ltrch \insrsid11472258\charrsid1781117 h}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +is si]ghs and his worry will go away, as it is written:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 94:19.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12405329 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +When I am filled with cares, Your assurance [soothes my soul].}{\rtlch \af0 \ltrch \insrsid12405329 \'94}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow10\irowband10\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr +\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\itap0\pararsid11472258 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 [2] Letters from Ere}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 z}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Israel (Eleventh century)}{\rtlch \af0 \ltrch +\insrsid11472258\charrsid1781117 +\par }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Presented here are two more letters from the Oxford }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Genizah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + collections that were quoted in Joseph Eliash\rquote s article \'93}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Yedi\rquote ot al Erez Israel me-ha-Me\rquote ah ha-11}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'94 (\'93 +Information from Eleventh-Century Erez Israel\'94).}{\rtlch \ab\af0 \ltrch \cs16\b\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917 Sefunot}{\rtlch \af0 \ltrch \insrsid4342917 2 (1958), 7\endash 16.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par a) a letter by Sa\rquote adiah he-}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 aver (the Sage) from Hebron to the Gaon Evyatar Hacohen +\par +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and Its Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash Sa\rquote adiah the member of the \'93Society of the Graves of the Forefathers\'94 + that established its location during the eleventh century in Hebron near Me\rquote arat Hamachpelah, addressed his letter to the Gaon R. Evyatar Hacohen, the head of the Ere}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 z}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Israel Yeshivah. +\par +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash In the first part of the letter the writer describes his great joy upon hearing the news that Rabbenu Evyatar h +ad been appointed \'93Gaon Ya\rquote akov,\'94 during the lifetime of his father, R. Elya Hacohen, who had lived in Fustat, Egypt and died in 1081. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid9835367 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab We present this section of the letter to show that a custom of writing \'93 +letters of condolence\'94 to mourners existed in Ere}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 z}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + Israel in the eleventh century. The author of this letter did not succeed in having it reach its destination. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab Below appears only the portion of that letter relevant to our topic. +\par +\par \page Text of the Letter: +\par [page 2] +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil +\cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7874\clshdrawnil \cellx8414\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 1\cell }{\rtlch \af0 \ltrch \insrsid9835367\charrsid1781117 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 hen we of \'93Graves of the Forefathers\'94 h +eard [of the death] of Rabbenu Eleazar, of blessed memory and for life in the world// to come// I [eulog]ized him }{\rtlch \af0 \ltrch \insrsid8601107\charrsid1781117 with }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 numerous eulogies}{\rtlch +\af0 \ltrch \insrsid8601107\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and I wept for him }{\rtlch \af0 \ltrch \insrsid8601107\charrsid1781117 with }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +a great and bitter weeping and we made\line the Sabbath day for him like the Sabbath of Lamentations }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +and I wrote condolences to Egypt through my son Abraham, but the Holy One, blessed be He, did not provide an opportunity for him to go there to offer condolences to our master the Gaon}{\rtlch \ab\af0 \ltrch \b\insrsid8601107\charrsid1781117 ,}{\rtlch +\ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 nor to provide heartfelt condolences}{\rtlch \ab\af0 \ltrch \b\insrsid8601107\charrsid1781117 .}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 May the }{\rtlch \ab\af0 \ltrch +\b\insrsid11552035\charrsid1781117 heart of }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 the Gaon}{\rtlch \ab\af0 \ltrch \cs16\b\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab a concluding blessing by the author of the enquiry to the Gaon.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7874\clshdrawnil \cellx8414\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }{\rtlch \af0 \ltrch \insrsid11552035\charrsid1781117 a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +nd the heart of our Rabbi, the head of the Bet Din}{\rtlch \af0 \ltrch \insrsid11552035\charrsid1781117 be consoled}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , }{\rtlch \af0 \ltrch \insrsid11552035\charrsid1781117 and may [God}{\rtlch \af0 +\ltrch \insrsid1932179\charrsid1781117 ]}{\rtlch \af0 \ltrch \insrsid11552035\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 bless you and hear my prayer for you in this holy place Amen.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid15033033 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 +, 11. On the status of the Gaon R. Evyatar Hacohen, see M. Gil, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Ere}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 z}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Israel bi-Tekufah ha-Muslemit ha-Rishonah, }{\rtlch +\af0 \ltrch \insrsid4342917 I (Tel Aviv, 1983), 604\endash 606, 625. See Z. Schechter, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Tehillah la-David }{\rtlch \af0 \ltrch \insrsid4342917 (Breslau, 1890), who found,, among the +Genizah fragments in Cambridge University Library, the complete text of a }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid13182277 kaddish}{\rtlch \af0 \ltrch \insrsid4342917 which was customarily used in eleventh-century Ere}{\rtlch \af0 \ltrch +\cf2\insrsid4342917 z}{\rtlch \af0 \ltrch \insrsid4342917 Israel relating to the most important rabbis living at that time (we also have evidence of this custom in a later period, see }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid13182277 ibid.}{ +\rtlch \af0 \ltrch \insrsid4342917 ). Here we only cite the opening of the }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid13182277 kaddish}{\rtlch \af0 \ltrch \insrsid4342917 : \'93}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 +yitgadel ve-yitkadesh shemei raba be-alma di vera kirutei yamlikh}{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 malkhutei ve-ya}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 z}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ma}{ +\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 h}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 purkanei vi-yakrev meshi}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 h}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ei be-}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 h} +{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ayei adonenu Evyatar ha-Kohen rosh yeshivat ga\rquote on ya\rquote akov u-ve-}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 h}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ayei rabbenu Sh +elomo ha-Kohen av ha-yeshivah u-ve-}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 h}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ayei rabbenu }{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 Z}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 adok ha-shelishi she-ba-}{ +\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 h}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 avurah u-ve-}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 h}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ayyekhon\'94 }{\rtlch \af0 \ltrch \insrsid4342917 (\'93 +Magnified and sanctified be His great Name in the world which He created according to His will. May He establish His kingdom during the life of our master Evyatar ha-Kohen, the head of the Yeshivah Gaon Ya\rquote akov, + and during the life of Solomon ha-Kohen, principal of the yeshivah, and during the life of Rabbenu }{\rtlch \af0 \ltrch \cf2\insrsid4342917 Z}{\rtlch \af0 \ltrch \insrsid4342917 adok, the third member of the heads, and during your life.\'94}}}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\lastrow \ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7874\clshdrawnil \cellx8414\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid6950160 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 b) a condolence letter to Elijah b. Evyatar Hacohen +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and }{\rtlch \ab\af0 \ltrch \b\insrsid6950160\charrsid1781117 i}{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 ts Recipient}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \emdash This letter was wri +tten to Elijah the son of the gaon R. Evyatar Hacohen who lived in Tyre. Eliash notes that the identity of the letter writer, its sender, and the place from which it was sent are not known. We can only assume that the letter was sent at the end of the ele +venth century or at the beginning of the twelfth. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter is replete with flowery phrases in Hebrew and biblical verses and deals with the following themes: + +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid6950160 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 An opening \emdash Citation of biblical verses }{\rtlch \af0 \ltrch +\insrsid6950160\charrsid1781117 which }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 contain acceptance of Divine judgment }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 (}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 z} +{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 idduk ha-din)}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 . +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Blessings, condolences, and wishes for a good and long life. +\par The bad tidings about the death of R. }{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 Z}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 adok Hacohen severely hurt the writer. +\par Condolences to R. Evyatar and R. Elijah Hacohen, that they may have the privilege of finding comfort in the rebuilding of the Temple when sadness will turn to joy. +\par An appeal for forgiveness from the gaon that no group had come from the writer\rquote s community to offer condolences, since the pathways were treacherous by sea and by land (one must keep in mind that this was the Crusader period). +\par Since the entire letter concerns condolences, it is presented here in full. +\par \page Text of the Letter: +\par \tab Proclaiming that the Lord is upright, in whom there is no wrong.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 92:15.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ; I will clothe priests;}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrh \lang1031\langfe1033\langnp1031\insrsid4342917 132:16. This +is a reference to Evyatar, who was a }{\rtlch \ai\af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917 k}{\rtlch \ai\af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid5905669 ohen.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 The Rock! \emdash His deeds are perfect. His ways are just\'85.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid14447357 \tab Deut. }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 32:4.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 The righteous man perishes yet no one considers.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid0000008 \tab }{\rtlch \af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid14447357 Isaiah}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 57:1.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Woe is me! I am become like leavings of a fig harvest.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid14447357 Micah}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 7:1.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 God is righteous in all his ways, and gracious in all His works,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 145:17.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Consolation and grace, relief to [my] sadness and the bindings of [my] wounds; good tidings \'85 +approaching salvation. Removal of pain, sorrow, sighing and agony. Consolation of the good tidings for Zion and then light and joy will be [the lot] of our master}{\rtlch \af0 \ltrch \insrsid4922460 from the Lord of hosts to cons}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ole your heart\'85. May his seat be established forever with dignity; a long life with good and pleasant things; atonement of his cherished one, his son\'85. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1975058 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +We have been informed of the harsh tidings that pain the heart and weaken the spirit concerning the passing of Rabbenu }{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 Z}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +adok Hacohen of blessed memory. The Lord is witness that we are sorrowed, trembling and anxious}{\rtlch \af0 \ltrch \insrsid1975058\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + May his portion be in the Garden of Eden in the company of the righteous. This decree [and news of his death] made the body and soul burn, distanced joy and passed from us all respite. [His death] stupefied}{\ltrch \rtlch +\f0\fs24\lang1037\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 our hearts; we became as fools; we became poor and sullied; it was }{\rtlch \af0 \ltrch \insrsid1975058\charrsid1781117 as if }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 our possessions }{\rtlch \af0 \ltrch \insrsid1975058\charrsid1781117 had }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 suddenly s}{\rtlch \af0 \ltrch \insrsid1975058\charrsid1781117 u}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 nk. He gathered his roses and perfumes; there remains no cluster to eat \'85 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab We are a ransom and redemption for the glory of our revered teacher \emdash a light unto Israel \emdash +Elijah ha-Kohen, the fourth [of the group, that is, the fourth generation of this dynasty], may [our consolations] be a shelter for him, let the pure light relieve him and gladden his heart, the life of our master, the ga\rquote on}{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 , }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a prince of the people in Torah. May he be found worthy of the building of the Temple and the gathering of the scattered sheep [Israel]\'85 +May he turn sorrow into abundant happiness and joy. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid10754532 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 God will make known the suffering and the crushed spirit of the afflicted soul\'85 + who acted out of decency and steadfastness in Torah, the greatness and holiness of our leader and teacher, our master Elijah ha-Kohen, head of the yeshivah Ge\rquote on Ya\rquote akov, of blessed memory}{\rtlch \af0 \ltrch +\insrsid10754532\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 with the utmost humility. May the }{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 z}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 addik }{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and his splendor\'85 assure him his place with Abraham, Seth and Jacob. May He who dwells in the heavens have mercy upon him; may the living God fulfill for him to sustain us in life. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid2584292 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab [Members] of the community \emdash a}{\rtlch \af0 \ltrch +\insrsid2584292\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 part of what they are obliged to do \emdash cleansed their hand}{\rtlch \af0 \ltrch \insrsid2584292\charrsid1781117 s}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and said, \'93blessed be the true judge.\'94 Were it not for the conditions on the sea and land and the week}{\rtlch \af0 \ltrch \insrsid995470\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + on the roads...the servants }{\rtlch \af0 \ltrch \insrsid995470\charrsid1781117 would }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 have presented themselves\'85}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote +\ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Translated from the Arabic.}}}{\rtlch \af0 \ltrch \insrsid1@391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid995470 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The God of Israel will keep away from him all forbidden things}{\rtlch \af0 \ltrch +\insrsid995470\charrsid1781117 \'85 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 redeem him and atone him, our master the fourth\'85and the tribulations of time. +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid995470 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch +\insrsid12391429\charrsid1781117 \tab [Additions to this letter, }{\rtlch \af156 \ltrch \insrsid995470\charrsid1781117 at }{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 the top of the page] +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid995470 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab Our venerable teacher Elijah the fourth, may my }{\rtlch \af0 \ltrch \insrsid995470\charrsid1781117 K}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ing and }{\rtlch \af0 \ltrch \insrsid995470\charrsid1781117 S} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 hepherd watch over him\'85 may he be engraved in }{\rtlch \af0 \ltrch \insrsid995470\charrsid1781117 the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 law + of uprightness; may he be strengthened; may he be cleansed of any iniquity, may he be saved from the evil eye and may he be inscribed in the book of life\'85}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Sefunot}{\rtlch \af0 \ltrch \insrsid4342917 , pp. 14\endash 16.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + [The complete text of this letter in Hebrew may be found in }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Or ve-Ni}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 h}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 umim +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , pp. 136. ff.] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s21\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 +c) Condolence letter from Eli ha-Mumheh b. Abraham to Hesed b. Yashar upon the death of his son +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid995470 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 a letter of condolence from the eleventh century (Ms. Budapest-Kaufman 143), published by A. Scheiber in his }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Geniza Studies}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Alexander Scheiber, \'93 +Kondolenzschreiben des Eli Hamumche B. Abraham An Chesed B. Jaschar,\'94 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Geniza Studies}{\rtlch \af0 \ltrch \insrsid4342917 , New York, 1891, 166\endash +172. The letter is presented here in its entirety along with Scheiber\rquote s comments. On the history of the brothers Abraham, known as Abu Sa\rquote ad, and Hesed, known as Abuna}{\rtlch \af0 \ltrch \cf2\insrsid4342917 s}{\rtlch \af0 \ltrch +\insrsid4342917 ar, of the Al-Tastari family, their status, and relations with the caliph\rquote s family, see Y. Mann, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 The Jews in Egypt and in Palestine under the Fatimid Caliphs,}{\rtlch \af0 \ltrch +\insrsid4342917 Oxford University Press, 1922, I:76\endash 83. Concerning their tragic death, see part II:79\endash 81: Three letters were written. Note especially the letter by th +e gaon Rabbi Solomon b. Judah, the author of the condolence letter to Rabbi Sahlan Aluf b. Abraham, who was the spiritual leader of the Babylonian community, and who refers to them as \'93two }{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917\charrsid546867 z} +{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid546867 addikim}{\rtlch \af0 \ltrch \insrsid4342917 .\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid3025761 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and }{\rtlch \ab\af0 \ltrch \b\insrsid3025761\charrsid1781117 i}{ +\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 ts Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash Eli b. Abraham, known as Ha-Mum}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 h}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 eh, wrote a letter to }{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 esed b. Sahl Yashar Al-Tastari, on the death of his son Yashar. }{\rtlch \af0 \ltrch +\cf2\insrsid12391429\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 esed was one of the leaders and wealthy members of the Egyptian community and in close contact with the family of the caliph. He was one +of the most important members of the Babylonian community in Fustat at that time and was closely involved with public affairs. R. Hai Gaon exchanged letters with him in 1038, and they sought to offer support to R. Sahlan Aluf b. Abraham}{\rtlch \af0 +\ltrch \insrsid14164988\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the spiritual leader of the Babylonian community. We know nothing of the circumstances of death of his son Yashar, but }{\rtlch \af0 \ltrch +\cf2\insrsid12391429\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 esed and his brother Abu Sahd Abraham died unnatural deaths. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash a short letter, it begins with a salutation to Hesed the senior and statements accepting the Divine judgment}{ +\rtlch \af0 \ltrch \insrsid14164988\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and concludes with }{\rtlch \af0 \ltrch \insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +s of accepting Divine judgment; in the middle are words of placation and consolation. +\par +\par Text of the Letter: +\par +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil +\cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7880\clshdrawnil \cellx8420\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0\afs24 \ltrch \fs24\insrsid12391429\charrsid1781117 a1\cell }\pard\plain \ltrpar +\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +Consolation is sent in reverence to the holiness in\'85 +\par Mar Rav Hesed the elder the valiant, May his rock and redeemer protect him\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7880\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 b1\cell The rock \emdash His deeds are perfect, yea all his ways are just and good}{\rtlch \ai\af0 \ltrch \cs16\i\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0\ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid546867 Deut.}{\rtlch \af0 \ltrch \insrsid4342917 32:4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7880\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell [in as much as a] king\rquote +s command is authoritative, and none can say to him, \'93What are you doing?\'94}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid546867 Eccl}{\rtlch \af0 \ltrch \insrsid4342917 . 8:4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par [You are righteous] O Lord; your rulings are just}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 119:137.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par [Your commandments] are always fulfilled. And long life +\par will [replace d]eath. The repose of life will replace a sigh +\par [and all g]ood. Renewed power and heart. In reverence to his holiness +\par [}{\rtlch \af0 \ltrch \cf2\insrsid12391429\~arrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 esed the elde]r, the dear, the important, and may he watch over him \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7880\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell +[his rock and his redeemer watch over him and and may he re]lieve the anxiety from his heart and may he console him +\par [in his mourning as] he promised as [a mother comforts her son] so I will comfort you; you shall find comfort +\par in Jerusalem,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch +\insrsid4342917 66:13.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone ^clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7880\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 15\cell [Comfort for the r[uin]}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 22:4, \'93comfort me for the ruin.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that has befallen us upon hearing the tidings\line [that we have heard]}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Ob.}{\rtlch \af0 \ltrch \insrsid4342917 1:1, +\'93We have received tidings.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the great agony upon the death of his cherished one }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 [that is, his son] +\par }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [We grieve}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab 2 }{ +\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \insrsid4342917 1:26, \'93I grieve for you.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 most sore]ly over him. But it is fitting and proper that we accept true + +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid9207470 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [Divine Judgment }{\rtlch \af0 \ltrch \insrsid9207470 from }{\rtlch \af0 \ltrch +\insrsid9207470\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im]}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid4140030 Berakhot}{\rtlch \af0 \ltrch \insrsid4342917 19a, \'93and he stands and accepts Divine judgment for him.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid9207470 who }{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 transmits and does not break +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [}{\rtlch \af0 \ltrch \insrsid9207470\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +is covenant]}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Joshua}{\rtlch \af0 \ltrch \insrsid4342917 + 7:15, \'93because he broke.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for any of }{\rtlch \af0 \ltrch \insrsid9207470\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 iscreatures}{\rtlch \af0 \ltrch +\insrsid14164988\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12603968 where there is one [fate]}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5905669 Song of Songs}{\rtlch \af0 \ltrch \insrsid4342917 3:7.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7880\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 20\cell }\pard\plain \ltrpar +\s17\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12603968 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 [ +for all of them]. }{\rtlch \af156 \ltrch \insrsid12603968 The}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 servant [must not] complain against his }{\rtlch \af156 \ltrch \insrsid12603968\charrsid1781117 L}{\rtlch \af156 \ltrch +\insrsid12391429\charrsid1781117 ord for +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12603968 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [}{\rtlch \af0 \ltrch \insrsid12603968 in Your hand}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab I }{ +\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Chron.}{\rtlch \af0 \ltrch \insrsid4342917 29, 12.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12603968 i}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ] +}{\rtlch \af0 \ltrch \insrsid12603968 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 everything. }{\rtlch \af0 \ltrch \insrsid12603968 \'93}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +The Lord has given, and the Lord has taken away, [blessed be] +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the name of the Lord.}{\rtlch \af0 \ltrch \insrsid12603968 \'94}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 1:21. +}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 All is on loan, and He may again renew its stock.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 +\tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 14:7.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid16212167 M}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ay the Lord] accept all prayers}{\rtlch \af0 \ltrch \insrsid16212167 for [the departed]}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 .\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow5\irowband5\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth648\clshdrawnil \cellx540\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7880\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [3] Condolence Letter \emdash Rabbi Zema}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 h}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ben R. Solomon Duran (Algiers, Fift%nnthcwZKKhmW century) +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid10048331 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and }{\rtlch \ab\af0 \ltrch \b\insrsid10048331\charrsid1781117 i}{ +\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 ts Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash R. Zema}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 h}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + wrote the letter as the opening of a responsum he addressed to R. David Hacohen, who lived in Granada, on the death of his brother, who was apparently also known to R. Zema}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 h}{\rtlch \af0 \ltrch +\cf2\insrsid10048331\charrsid1781117 ,}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid10048331\charrsid1781117 was }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 close to him. Finding out about the death of the brother shocked and greatly saddened R. Zema}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 h. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter is divided into 25 sections dealing with the following themes: +\par The writer describes the physical pain and suffering he underwent when he learned of the death. +\par The emotional storm and thoughts of the writer. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid13109360 {\rtlch \af416180211544352850 \ltrch \insrsid12391429\charrsid1781117 The gloom and fear of death that strikes the \'93cedars,\'94 + in contrast to the existence of the evildoers who are compared to those who are \'93wicked yet well off.\'94 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Feelings of anger and anxiety for those dear ones who have fallen in the net of death. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid13109360 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The writer complains about the injustice in evidence \emdash \'93 +the evil person for whom things are good}{\rtlch \af0 \ltrch \insrsid10048331\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'94}{\rtlch \af0 \ltrch \insrsid13109360 }{\rtlch \af0 \ltrch \insrsid10048331\charrsid1781117 i}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 n contrast to the righteousness of the }{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 z}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 addik }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and the evil that befalls him. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lamentations and yearning for the deceased brother. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid10048331 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'93The rightness of }{\rtlch \af0 \ltrch \insrsid10048331\charrsid1781117 D}{\rtlch \af0 +\ltrch \insrsid-8734134782369459860\charrsid1781117 ivine judgment\'94 \emdash all according to God\rquote s will. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid12148583 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +The writer takes comfort in the faith that the soul of the departed shares the fate of the soul}{\rtlch \af0 \ltrch \insrsid13109360 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of the righteous and }{\rtlch af0 \ltrch +\insrsid10048331\charrsid1781117 is }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 bound in the bond of everlasting life. +\par Consolations and salutations to R. David Cohen and his family, with expectation for comfort }{\rtlch \af0 \ltrch \insrsid12148583\charrsid1781117 in }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the building up of Jerusalem. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +An abridgement of the letter is presented here, divided into sections (the notes cite the sources used by the writer). (See }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Or ve-Nihumim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +, pp. 139\endash 143, for the full text.) +\par +\par Text of the Letter: +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid5120557 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Granada to R. David Hacohen, May God preserve him, son of Jonathan Hacohen, \line +May he rest in Paradise}{\rtlch \af0 \ltrch \insrsid5120557 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid5120557 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 hile }{\rtlch \af0 \ltrch +\insrsid7542981\charrsid1781117 he was }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 there his brother passed away, May he rest in Paradise}{\rtlch \af0 \ltrch \insrsid5120557 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 +\ltrch \insrsid5120557\charrsid1781117 B}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 efore I }{\rtlch \af0 \ltrch \insrsid7542981\charrsid1781117 replied to him}{\rtlch \af0 \ltrch \insrsid5120557 }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 I }{\rtlch \af0 \ltrch \insrsid5120557 wrote }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 him these words of consolation: +\par \ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth456\clshdrawnil \cellx348\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8072\clshdrawnil \cellx8420\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid5120557 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 I am hamstrung. The strings of my heart}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 17:11. At the beginning of the letter the writer uses the words of }{\rtlch \ai\af0 \ltrch \insrsid4342917\charrsid16335552 Job }{\rtlch \af0 \ltrch \insrsid4342917 +to his companions in which he explains why consolation is useless, since he is very close to dying, for his tendons have been severed and the strings of his heart [have come undone].}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 fester}{\rtlch +\af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 p{\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 + 38:6: \'93My wounds stink and fester because of my folly.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 and are }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 destroyed.}{\rtlch +\af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid14447357 Isaiah}{\rtlch \af0 \ltrch \insrsid4342917 + 24:1: \'93behold, the Lord will strip the earth bare.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 They }{\rtlch \af0 \ltrch \insrsid5120557 are }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 displaced, they stumble in judgment.}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid14447357 Isaiah}{\rtlch \af0 \ltrch \insrsid4342917 + 28:7: \'93They are muddled in their visions, they stumble in judgment.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 My p}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +angs and throes}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid14447357 Isaiah}{\rtlch \af0 \ltrch +\insrsid4342917 13:8: \'93They shall be seized by pangs and throes.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid5120557 have }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 bec}{\rtlch \af0 \ltrch +\insrsid5120557 o}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 me stronger and harsher.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 21:7: \'93Prosper and grow wealthy.\'94}}}{\rtlch \bf0 \ltrch!\insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid13451168 {\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 M}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ost of my inner spaces }{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid14447357 Isaiah}{\rtlch \af0 \ltrch \insrsid4342917 + 2:21: \'93The clefts in the rocks and the crevices in the cliffs.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 are }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +filled with cares}{\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {ootnrte \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 94:19: \'93When I am filled with cares.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 +as are the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 feelings in me and my thoughts in my heart}{\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid12856449\charrsid1781117 and a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 s a fire burn}{\rtlch \af0 \ltrch \insrsid12856449\charrsid1781117 ing}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a forest,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 + 83:15: \'93as a fire burns a forest.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 burning swiftly across. }{\rtlch \af0 \ltrch \insrsid13451168\charrsid1781117 [My cares] have m}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +ade a crossing}{\rtlch \af0 \ltrch \insrsid13451168\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af63898 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid14447357 Isaiah}{\rtlch \af0 \ltrch \insrsid4342917 10:29: \'93They made the crossing; \lquote Geba is to be our night quarters!\rquote \'94 with \'93made the crossing\'94 used here as a phrase of rage and anger.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid13451168\charrsid1781117 [leaving] e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 mbers }{\rtlch \af0 \ltrch \insrsid13451168\charrsid1781117 still }{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 glow}{\rtlch \af0 \ltrch \insrsid13451168\charrsid1781117 ing}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid16335552 Joel}{\rtlch \af0 \ltrch \insrsid4342917 2:3: \'93Their rear guard a devouring flame.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid8985984 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 All faces turned ashen}{\rtlch \af0 \ltrch \insrsid13451168\charrsid1781117 ;}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid16335552 Joel}{\rtlch \af0 \ltrch \insrsid4342917 + 2:6: \'93all faces turn ashen.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid13451168\charrsid1781117 a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 shes bound up with bitterness. Their brightness}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid16335552 Joel}{\rtlch \af0 \ltrch \insrsid4342917 + 2:10: \'93Stars withdraw their brightness.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid8985984\charrsid1781117 their }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 astonishing roar }{\rtlch \af0 +\ltrch \insrsid8985984\charrsid1781117 is }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 as young lions}{\rtlch \af0 \ltrch \insrsid8985984\charrsid1781117 , [as]}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the terror of a king}{\rtlch +\af0 \ltrch \insrsid8985984\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 +\rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid16335552 Proverbs}{ +\rtlch \af0 \ltrch \insrsid4342917 20:2: \'93The terror of a king is like the roar of a lion.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8985984\charrsid1781117 indeed }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 a great terror.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid8062247 Gen}{\rtlch \af0 \ltrch \insrsid4342917 . 15:12: \'93and a great dread descended.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Panic fell among }{\rtlch \af0 \ltrch +\insrsid8985984\charrsid1781117 the cheerful}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 cedars. Those Boazes}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab Boaz \emdash an appelation for the owner of an estate, taken from the name of Boaz in the Book of }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6817976 Ruth}{\rtlch \af0 \ltrch \insrsid4342917 .}}}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8985984\charrsid1781117 [are now] w}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 orthless, shorn, despised. Despite their lowliness\'85 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charsiU1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth456\clshdrawnil \cellx348\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8072\clshdrawnil \cellx8420\row }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [4] Carmi Family Condolence Letters +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid4013963 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 The letters in this section originate from one extended family, the Carmi brothers, a prominent Jewish family in Italy who}{\rtlch \af0 \ltrch \insrsid10416\charrsid1781117 se}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 members filled positions as \'93state appointees\'94 \emdash the highest level of Jewish leadership. They liv +ed in Cremona, in the northern Italian region of Lombardy, in the second half of the sixteenth century. J. Buchsenbaum collected and annotated the Carmi family letters in his book devoted to them. Tee condolence letters we have chosen }{\rtlch \af0 +\ltrch \insrsid4013963 are only }{\rtlch \af0 \ltrch \insrsid550161\charrsid1781117 those written }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 solely as \'93condolence letters\'94 to mourners}{\rtlch \af0 \ltrch \insrsid10416\charrsid1781117 , }{ +\rtlch \af0 \ltrch \insrsid550161\charrsid1781117 which }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 can serve as examples of the form and writing style common in }{\rtlch \af0 \ltrch \insrsid10416\charrsid1781117 that }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 period for }{\rtlch \af0 \ltrch \insrsid550161\charrsid1781117 this }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 type of letters. +\par }\pard\plain \ltrpar\s25\ql \fi180\li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid550161 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab Most of the letters are not signed}{\rtlch \af0 \ltrch \insrsid550161\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid550161\charrsid1781117 and }{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 a few bear truncated signatures or initials. Buchsenbaum feels that + the writer who collected the letters intentionally blurred the names so that others could not identify them. It was customary at that time for writers who were members of }{\rtlch \af0 \ltrch \insrsid550161\charrsid1781117 a }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 social group to refrain from explicitly using the names of their friends and acquaintances. +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid9513810 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab The first three letters cited were composed as laments and consolation for the death of }{\rtlch \af0 \ltrch \insrsid550161\charrsid1781117 a }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +Carmi uncle, Jekutiel Hacohen, who died in Tammuz }{\ltrch \af262 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'f9\'ec"\'e1) 1572}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ). }{\rtlch \af0 \ltrch \insrsid9513810\charrsid1781117 +This wa}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 s most probably Jekutiel b. Abraham Porto Katz, the father-in-law of Menahem Ottolenghi of Lodi. a relationship was forged between Saul Raphael Carmi and Jekutiel Porto }{\rtlch \af0 \ltrch +\insrsid9513810\charrsid1781117 through }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 their wives, who were apparently sisters.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab Y. Buchsbaum, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Iggerot Bet Karmi,}{\rtlch \af0 \ltrch \insrsid4342917 98 n. 1.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par a) }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Condolence letter to the son-in-law of the deceased}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 +\tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , p. 98. We have divided the letter into rows to make it easier for the reader to related to the letter\rquote +s form and content; we have done the same for the other letters as well.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and the Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash + J. Buchsenbaum feels that the writer of this letter is, perhaps, Abraham Carmi, the third son of Saul Raphael Carmi,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid8062247 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab The student of the }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 gaon}{\rtlch \af0 \ltrch \insrsid4342917 Piscarollo; }{\rtlch \af0 \ltrch \insrsid4342917\charrsid6817976 R. }{\rtlch \af0 \ltrch \insrsid4342917 David }{ +\rtlch \af0 \ltrch \insrsid4342917\charrsid6817976 Samuel}{\rtlch \af0 \ltrch \insrsid4342917 , called Zanvil b. Kalonymus Piscarol, the personal rabbi of the Carmi family, who lived at that time in Vercelli located in Piedmont.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 whowas addressing the son-in-law of the deceased. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with four themes: +\par }\pard \ltrpar\ql \li360\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin360\itap0\pararsid9513810 {\rtlch \af0 \ltrch \insrsid9513810\charrsid1781117 1.}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +Opening statements and admonitions to the departed\rquote s son-in-law +\par {\listtext\pard\plain\ltrpar \s20 \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 2.\tab}}\pard\plain \ltrpar\s20\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls20\adjustright\rin0\lin720\itap0\pararsid9513810 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Eulogy +\par {\listtext\pard\plain\ltrpar \s20 \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 3.\tab}Lamentation +\par {\listtext\pard\plain\ltrpar \s20 \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 4.\tab}}\pard \ltrpar\s20\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls20\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Condolences +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \page }{ +\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil +\cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 1\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3043295 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab To }{\rtlch \af0 \ltrch +\insrsid3043295\charrsid1781117 my }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 dear relative, may God protect and preserve him, Shalom}{\rtlch \af0 \ltrch \insrsid4013963 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab I know that for }{\rtlch \af0 \ltrch \insrsid3043295\charrsid1781117 your }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 livelihood God has sent you to Latisana (a town in Veneto), as it is written: The sun rises, and the sun sets: +\par \tab And as our Sages, of blessed memory, have said: \'93before a person dies, the master of his house is appointed.\'94}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid200 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6817976 BB}{\rtlch \af0 \ltrch \insrsid4342917 91a.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid13917846 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp0037\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch \insrsid3043295\charrsid1781117 N}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ow I must console you. In any event, to halt the flow of words I cannot, for my spirit is pressing }{\rtlch +\af0 \ltrch \insrsid13917846\charrsid1781117 upon}{\rtlch \af0 \ltrch \insrsid4013963 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 me, for bitter mourning I have }{\rtlch \af0 \ltrch \insrsid3043295\charrsid1781117 felt }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 upon the death of your father-in-law, of blessed memory}{\rtlch \af0 \ltrch \insrsid13917846\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781217 + \par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid13917846 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch \insrsid13917846\charrsid1781117 He }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 was the foremost }{\rtlch \af0 \ltrch \insrsid13917846\charrsid1781117 one in }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 everything involving holiness. Surely, all Jewry will weep for him as +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab they wept for Aaron the Priest, may peace be with him}{\rtlch \af0 \ltrch +\insrsid13917846\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid13917846\charrsid1781117 Indeed, }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +he was a descendant of Aaron, having performed deeds of Aaron, }{\rtlch \af0 \ltrch \insrsid13917846\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he will find his peace}{\rtlch \af0 \ltrch \insrsid13917846\charrsid1781117 .}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6817976 Yoma }{\rtlch \af0 \ltrch \insrsid4342917 +71a.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid13917846\charrsid1781117 M}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ay he rest in peace with all the other }{\rtlch \ai\af0 \ltrch +\i\cf2\insrsid12391429\charrsidj1781117 z}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 addikim }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in Gan Eden, and because of this, in my lamentation over him I said the following lines:}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab See Buchsbaum\rquote s note, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 i}{\rtlch \ai\af0 \ltrch +\i\insrsid4342917\charrsid5066409 bid.}{\rtlch \af0 \ltrch \insrsid4342917 , 99 n. 4: \'93This is taken literally from R. Judah Alharizi\rquote s poem in }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Takhkemoni}{\rtlch \af0 \ltrch \insrsid4342917 + (J. Toporowski edition, Ma}{\rtlch \af0 \ltrch \cf2\insrsid4342917 h}{\rtlch \af0 \ltrch \insrsid4342917 barot le-Sifrut publications, Tel Aviv, 1952, ch. 50, p. 291).}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell }\pard\plain \ltrpar +\s17\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \highlight7\insrsid12391429\charrsid1781117 +lines from Takhkemoni}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\ltrch \af262\afs24 \rtlch +\f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'e4\'f9\'f8 \'e0\'f9\'f8 \'ec\'e5 \'e1\'e9\'ef \'f6\'e1\'e0 \'f8\'e5\'ed \'ee\'e7\'e4\'e4 \'ec\'e1\'e9 \'ec\'f4\'f8\'e5\'e3\'ea \'ee\'e3\'e5\'eb\'e4 \'f0\'f2\'f0\'e4}{\rtlch \af0\afs24 +\ltrch \fs24\insrsid12391429\charrsid1781117 +\par }{\ltrch \af262\afs24 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'e0\'fa\'e4 \'ee\'e0\'e5\'f8 \'f2\'e5\'ec\'ed \'e5\'fa\'f9\'eb\'e5\'ef \'ee\'e7\'f9\'ea \'eb\'ef \'e4\'f9\'eb\'e9\'f0\'e4 \'e1\'f2\'f8\'f4\'ec \'fa\'e7\'f0 +\'e4}{\rtlch \af0\afs24 \ltrch \fs24\insrsid12391429\charrsid1781117 +\par }{\ltrch \af262\afs24 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'e5\'e0\'f0\'e9 \'ee\'e0\'f0\'e4 \'e4\'f0\'e7\'ed \'f0\'f4\'f9\'e9, \'eb\'e9 \'f0\'e4\'f4\'eb\'e5\'ec \'f2\'ec\'e9 \'f6\'e9\'f8\'e9}{\rtlch \af0\afs24 \ltrch +\fs24\insrsid12391429\charrsid1781117 . +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +I have known you as a man of words, your words have kept him who stumbled from falling. Pray that your consolation will appease my soul and the soul of our brothers and teacher }{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 who }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 are steeped in sadness in my name. }{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 M}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ay it be that }{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 the }{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 words of your consolation run while I am still alive, and that I will remain\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid13720635 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 alive thanks to you, and }{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 may }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +your reward be doubled from the Heavens. My teacher and rabbi, may the Lord watch over him}{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 [I +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 pay}{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 my]}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 respects to you}{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 .}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ere it not for +the illness of his wife and eldest daughter, he would have lived long enough to lament and console you, in the same }{\rtlch \af0 \ltrch \insrsid2760246\charrsid1781117 way }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +that that he was joyous in his letter to you about your finding your match, for }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mazal tov, amen.}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 May you have peace. Vercelli, 4 Menahem ab (5300)}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid2188025 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Buchsenbaum, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid2188025 ibid}{\rtlch \ai\af0 \ltrch +\i\insrsid4342917\charrsid5066409 .}{\rtlch \af0 \ltrch \insrsid4342917 , n. 7, thinks that the year was 1572 and not as listed here.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\ltrch \af262 \rtlch +\f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'ec\'f4"\'f7}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [=1540]. +\par }{\rtlch \af0 \ltrch \insrsid13720635 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ishing you deliverance of consolation, your relative Anonymous }{\ltrch \af262 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'f8\'f4"\'e0}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \page b) +}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 a consolation letter to the deceased\rquote s brother}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 +\tab J. Buchsenbaum, 99.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Author of the Letter and the Recipient }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash One of the sons of S. R. Carmi wrote this letter on the death of Jekutiel Hacohen}{\rtlch \af0 \ltrch \insrsid201019\charrsid1781117 ,}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 to Jehiel Porto, the uncle of the sons of S. R. Carmi and his brother Jekutiel Hacohen (the deceased). The writer uses quotations from the Bible and Talmud. From the letter\rquote +s contents one can see that both the writer and the recipient were well versed in Jewish learning. +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with six themes: +\par {\listtext\pard\plain\ltrpar \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 1.\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar\tx360\jclisttab\tx720\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid201019 { +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Describing the magnitude of the tragedy +\par {\listtext\pard\plain\ltrpar \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 2.\tab}The inability of the writer to provide consolation +\par {\listtext\pard\plain\ltrpar \rtlch \af0 \ltrch \insrsid201019\charrsid1781117 \hich\af0\dbch\af0\loch\f0 3.\tab}}{\rtlch \af0 \ltrch \insrsid201019\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +Apology by the writer for rousing the mourner\rquote s sorrow +\par {\listtext\pard\plain\ltrpar \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 4.\tab}Words of lamentation and lament +\par {\listtext\pard\plain\ltrpar \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 5.\tab}A request that Jehiel Porto }{\rtlch \af0 \ltrch \insrsid13720635 should }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +send him the lamentation he recited about the deceased +\par {\listtext\pard\plain\ltrpar \rtlch \af0 \ltrch \insrsid201019\charrsid1781117 \hich\af0\dbch\af0\loch\f0 6.\tab}}{\rtlch \af0 \ltrch \insrsid201019\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Blessings and conclusion +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s20\ql \li0\ri0\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Text of the Letter: +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell \tab My distinguished Uncle, may God protect and preserve him, +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid2187587 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab What can I compare or liken to You}{\rtlch \af0 \ltrch \insrsid1719748 ?}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid1719748 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 o whom can }{\rtlch \af0 \ltrch \insrsid1719748 one }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +liken Me, to whom can I be compared}{\rtlch \af0 \ltrch \insrsid1719748 ?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid2187587 I}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 suffer}{\rtlch \af0 \ltrch +\insrsid6955097\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117V your honor}{\rtlch \af0 \ltrch \insrsid1719748 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid6955097 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch \insrsid6955097\charrsid1781117 A}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 s vast as a house}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +See Buchsenbaum\rquote s note, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 i}{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 bid.}{\rtlch \af0 \ltrch \insrsid4342917 , 99: \'93certainly it must be \lquote as the sea\rquote , see }{\rtlch \ai\af0 +\ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:13.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is our rupture, and it consumes half our flesh. If so, how shall I console you}{\rtlch \af0 \ltrch +\insrsid6955097\charrsid1781117 ?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab \'93}{\rtlch \af0 \ltrch \insrsid6955097\charrsid1781117 H}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 e made expiation for himself\'94 as it is written}{\rtlch \af0 \ltrch \insrsid6955097\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Lev.}{\rtlch \af0 \ltrch \insrsid4342917 16:7; that is, I myself need expiation.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid6955097\charrsid1781117 R}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 evenge shall be far from my thoughts, perhaps pain has seized us, agony like a woman in childbirth, I will not \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard\plain \ltrpar +\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12323918 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 find re +spite until the light of my eyes is gone. Until now I have acted foolishly, to bestir}{\rtlch \af0 \ltrch \insrsid6955097\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12323918\charrsid1781117 his eminence}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 over +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +his dead one and to remind him what has been decreed that it should be found.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li-4452962359270719426\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab See }{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid11420266 Pes}{\rtlch \af0 \ltrch \insrsid4342917 . 54b. }}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Indeed, my heart wrenches inside me and }{\rtlch \af0 \ltrch \insrsid12323918\charrsid1781117 +my }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 innards +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12323918 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab are wounded. I can +not refrain from coming to lament %n your honor and to tell of my great sorrow. I call upon trustworthy witnesses to attest to this poem, that it should be }{\rtlch \af0 \ltrch \insrsid12323918\charrsid1781117 as }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 witness for me, that you will not be forgotten +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab from my utterances as long as I live. I will bitterly lament my discourse.}{\rtlch \f0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +The entire poem, with some errors as well as a number of changes adapted to the event, is also listed as a poem by Alharizi (see n. 4), }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Takhkemoni}{\rtlch \af0 \ltrch \insrsid4342917 (}{\rtlch \af0 \ltrch +\i\insrsid4342917 i}{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid5066409 bid.}{\rtlch \af0 \ltrch \insrsid4342917 , p. 387), where it was written upon the grave of Ezekiel the Prophet.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell +}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin512\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell Alharizi }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 Takhkemoni}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0\afs24 \ltrch +\fs24\insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +Servant of the Lord, distinguished Jekuthiel}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 +\rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Alharizi\rquote s poem reads \'93 +The prophet of the Lord, the distinguished Ezekiel.\'94 Here the person is named Jekuthiel, and }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 kohen}{\rtlch \af0 \ltrch \insrsid4342917 (servant of the lord) and two of the Hebrew articles }{\rtlch \ai\af0 +\ltrch \i\insrsid4342917 \'93heh\'94, }{\rtlch \af0 \ltrch \insrsid4342917 to maintain the poetic metre in Hebrew.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell \tab +And now, thank the Lord, I know that your honor did not refrain}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid5340492 Song of Songs}{\rtlch \af0 \ltrch \insrsid4342917 7:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 from }{\rtlch \af0 \ltrch \insrsid12323918\charrsid1781117 bewailing }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 him with lamentations, and moans, and sounds. May you give me from the garden and orchard that you planted }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 [}{\rtlch \af0 \ltrch \insrsid12323918\charrsid1781117 +i.e}{\rtlch \ai\af0 \ltrch \i\insrsid12323918\charrsid1781117 .,}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 : send me the lament you gave. Author}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ],}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid11420266 BB}{\rtlch \af0 \ltrch \insrsid4342917 + 39b..}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 so that they may be }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 totafot}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + between my eyes and for a remembrance in the pages of the letter.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid6707373 Ezra}{\rtlch \af0 \ltrch \insrsid4342917 27:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I remain in the vale of tears}{\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 ,}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 yearning for salvation from the Lord}{\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 T}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 he wound\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow8592246450919088465\irowband3\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 20 \cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid802467 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab of our smitings He will heal, as }{\rtlch \af0 +\ltrch \insrsid802467\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e swore to us from on high, so }{\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e will }{\rtlch \af0 +\ltrch \insrsid802467\charrsid1781117 fill }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 us}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tb +See Buchsbaum\rquote s note, 100 n. 23: \'93There is a one-word space here in the manuscript, apparently the word \lquote from the cup of\rquote has been deleted.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid802467\charrsid1781117 with }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 consolation}{\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid802467\charrsid1781117 Y}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ou}{\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + my ancient King, may he make you the highest and a blessing on the earth. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lombardy, the month of Menahem AB\'85 from the groveler in dust and ashes, grandson of his honor}{\ltrch +\rtlch \f0\fs24\lang1037\insrsid12391429\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\ltrch \af262 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'f4\'ec\'e5}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Cremona\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0\afs24 \ltrch \fs24\insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 c) }{\rtlch +\ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Condolence letter to a brother over the death of a brother-in-law}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5580553 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , p. 116}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid802467 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash }{ +\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he writer is }{\rtlch \af0 \ltrch \insrsid802467\charrsid1781117 possibly }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Saul Raphael Carmi.}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1075\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab See Buchsbaum\rquote s note, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ibid}{\rtlch \ai\af0 \ltrch +\i\insrsid4342917\charrsid5066409 .}{\rtlch \af0 \ltrch \insrsid4342917 , n. 2: \'93The signature is not clear; perhaps it reads }{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'f9"\'f7}{\rtlch \af0 \ltrch \insrsid4342917 [S\'94c].}}}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with two themes: +\par {\listtext\pard\plain\ltrpar \s20 \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard\plain \ltrpar\s20\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid16327472 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Eulogy and lamentatio +n over the deceased +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}}\pard\plain \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid16327472 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +Concluding statement with the blessing of the True Judge. +\par }\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0\afs24 \ltrch +\fs24\insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Text of the letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil +\cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8144\clshdrawnil \cellx8414\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 1\cell }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3868273 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab I have verily heard, and my being has trembled, over hearing the tidings}{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 ;}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 no spot of my flesh is sound, my heart is awhirl}{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab He has left me alive }{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 but }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 the light of my eyes is also not with me, for we have lost a verdant olive tree, fair, choice fruit, from among the descendants of Aaron.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote +\ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Jekuthiel Cohen of Latisana: see above the letter by the deceased\rquote s son-in-law.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + For the mountains I take up weeping and wailing, for the pastures in the wilderness, a dirge, my eyes shed streams of water over our great misfortune. I do not have the strength to console, instead of me now may \cell }\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil \cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8144\clshdrawnil \cellx8414\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 5\cell }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 your strength increase, my brother, to console me with the good things, }{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 for }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +the exposition of your words gives me light. }{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 E}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ven so, after what I have heard, +that one blesses over the good, I will bless softly, in a whispering vo}{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 ice: Blessed be the True Judge\'85}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow1\irowband1\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil +\cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8144\clshdrawnil \cellx8414\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [5] a condolence letter from a son to his father}{\rtlch \ab\af0 \ltrch \cs16\b\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +Buchsbaum, 166.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid3868273 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and the Recipient}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \emdash The author is unknown.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +See Buchsbaum\rquote s note}{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5580553 , }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 ibid}{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 .}{\rtlch \af0 \ltrch \insrsid4342917 , 37 n. 91.}}}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 From the letter\rquote s contents, however, it seems that a son is writing a condolence letter to his father (upon the death of the father}{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 \rquote }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 s sister). From the letter we learn of the son\rquote s worrying that his father }{\rtlch \af0 \ltrch \insrsid3868273\charrsid1781117 should not }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +cause himself too much anguish when mourning. This is the first letter found from this period that concludes with the consolation phrase: }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 \'93 +May the Lord comfort you among the other mourners of Zion, Amen.\'94}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +See chapter 3 concerning the entrance and exit of those paying condolence calls to the mourners home, page 000.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 This phraseology is not common %n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n condolence letters from this period. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with three themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Description of the writer\rquote s sadness upon hearing the evil tidings +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}The advantage of accepting condolences over becoming mired in mourning +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}Expressions of condolence +\par }\pard\plain \ltrpar\s20\ql \li0\ri0\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +\par Text of the Letter: +\par +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil +\cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 +\rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 1\cell }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0\pararsid14375923 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +It would not be believed would it be told how great was my sorrow, and my body was seized in terror}{\rtlch \af0 \ltrch \insrsid14375923\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I could not find no rest, and I could not + +\par be quiet, day and night, my groaning serve}{\rtlch \af0 \ltrch \insrsid14375923\charrsid1781117 d}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 as my bread, my roaring pour}{\rtlch \af0 \ltrch \insrsid14375923\charrsid1781117 ed}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 forth as water, when I heard +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab the bad tidings that God has taken the righteous woman, your sister, + of blessed memory, and her soul will be gathered to }{\rtlch \af0 \ltrch \insrsid14375923\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im. }{\rtlch \af0 \ltrch \insrsid14375923\charrsid1781117 I}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 f\line I come with praise to speak to your heart and your consolation, my master my father, may God protect and preserve him}{\rtlch \af0 \ltrch \insrsid14375923\charrsid1781117 .}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid13778447 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid14375923\charrsid1781117 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +hat shall I do today with empty consolations, not for succor and not to benefit but only to sadden. So I will briefly mention to the }{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 honorable,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + that condolences have two good characteristics \emdash joy in this world and good recompense in the World to Come; and mourning has two bad characteristics \emdash loss of recompense for hardships }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 [i.e., there is a reward in the World to Come for suffering, }{\rtlch \af0 \ltrch \insrsid12391429\charrsid13778447 while one who mourns +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + too much, who does not lovingly accept suffering, loses that reward] and punishment for overanxiousness.\cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone +\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row +\ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10 \cell }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0\pararsid14375923 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch +\insrsid14375923\charrsid1781117 T}{\rtlch \af0\ltrch \insrsid12391429\charrsid1781117 o an intelligent one as yourself this is sufficient.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab a similar motif occurs in the }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid1867703 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \insrsid4342917\charrsid5580553 of Samuel}{\rtlch \af0 \ltrch +\insrsid4342917 Hanagid (Diwan, 1:122) in the second part of the poem (lines 24\endash 32), where the Nagid addresses the son of an unnamed deceased person to comfort him: \'93 +Read my writing and take comfort, from the notion / that excessive mourning is unwanted / and he will not gain by disputing with the Lord / about evil occurrences and judgments / but all is well c +onsidered / and every number is included in a book / and the day of each cedar will come and it will fall / and a rock will bedisplaced as any chaff and thorns / and there is a reward to the one who is restrained in his mourning / and there is a reward t +o one who extols in high phrases.\'94 +\par }\pard \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid6895881 {\rtlch \af0 \ltrch \insrsid4342917 +The writer takes part in the sorrow of the living and attempts to console him and lessen his pain. In this selection he mentions a number of existing truths, namely: that every living thing will die at its appointed time, +as the Lord has decreed; that he will \'93not gain\'94 + from a dispute with God, whose thoughts and judgments are set and cannot be changed; that the Lord does not want mourning; and the great reward waiting for those who are restrained in mourning. See J. Levin, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 +Al Mavet, }{\rtlch \af0 \ltrch \insrsid4342917 158\endash 159, where we read: \'93The ancient determination of fate here is God\rquote +s decree, the way of all flesh enforced through fate is set here through the absolute will of the Creator of the world. Self-restraint in mourning is none other than forbeara +nce and equanimity of ancient manhood, a reward for the non-injurious balance of equanimity was transformed into divine reward, and the imperative of experience gained from life became a religious commandment.\'94}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 He who fences in calamities will fence in our calamities and say to our woe, }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 enough, and console us among the other mourners of Zion, }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Amen. +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab 22 in the Omer, }{\ltrch \af262 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'e4\'f9" +\'ed] 1590}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ], one who is steeped in unrest, your sighing son.\cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt +\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil +\cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [6] Condolence letter over a daughter\rquote s death}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , p. 190.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and the Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash One of the sons of S\'94R Carmi to their cousin, an anonymous }{\rtlch \ai\af0 \ltrch +\i\cf2\insrsid12391429\charrsid1781117 K}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 aha}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 Z}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 (}{\rtlch \ai\af0 \ltrch +\i\cf2\insrsid12391429\charrsid1781117 K}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 ohen }{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 Z}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 edek), }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 was a }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 melammed}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (young children\rquote +s teacher) in the household of Menahem Ottolenghi (the brother-in-law of Jekutiel}{\rtlch \af0 \ltrch \insrsid11163277\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the oldest child of S\'94 +R Carmi) whose daughter had died. The letter was written in }{\rtlch \af0 \ltrch \cf6\insrsid12391429\charrsid1781117 1575}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (}{\ltrch \af262 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 +\'f9\'ec"\'e4}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ).}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , pp.28, 37, 43.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with three themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Commiserating with the mourner\rquote s sorrow +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}Awareness }{\rtlch \af0 \ltrch \insrsid11163277\charrsid1781117 of the fact that }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 that the mourner bear}{\rtlch \af0 \ltrch \insrsid11163277\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 his suffering with love and accept}{\rtlch \af0 \ltrch \insrsid11163277\charrsid1781117 s}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the Divine judgment eases the uneasiness of the writer +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}Words of consolation +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth456\clshdrawnil +\cellx348\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8072\clshdrawnil \cellx8420\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 1\cell \tab Listen well High Priest. +\par }\pard\plain \ltrpar\s21\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11163277 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab We have heard the tidings and our innards are in turmoil over the death of your Honor\rquote s daughter, may her soul be bound up in the bond of everlasting life}{\rtlch \af0 \ltrch \insrsid11163277\charrsid1781117 .} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid11163277\charrsid1781117 O}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +ur bowels are overcome with heat when we think of the sorrow befalling your Honor because of this. +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab }{ +\rtlch \af0 \ltrch \insrsid11163277\charrsid1781117 A}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 fter we have realized that this is the way of all mankind, and recognized that your Honor\rquote s wisdom}{\rtlch \af0 \ltrch +\insrsid8537775\charrsid1781117 is great,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth456\clshdrawnil \cellx348 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8072\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 5\cell and that you accept these tribulations from the Lord with love and accept His judgment}{\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{ +\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 B}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 y blessing him for this }{\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 bad }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +in the same way that people bless Him for the good, we have been assuaged and accommodated ourselves to the Lord\rquote s will, by our entreating the glory and splendor [of the }{\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 C}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 reator], so that His mercy will }{\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 fill }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 this gap}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Berakhot}{\rtlch \af0 \ltrch \insrsid4342917 19a.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in your Honor +\rquote s house and from the home}{\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 of those }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 who love }{\rtlch \af0 \ltrch \insrsid10372219\charrsid1781117 h}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is name}{\rtlch \af0 \ltrch \insrsid8537775\charrsid1781117 .}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 He shall write and sign the name of your glory along with the name of all the members of his family and his relatives in the Book of Good Life.\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth456\clshdrawnil \cellx348\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth8072\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell \tab +Those who are in sorrow at your Honor\rquote s sorrow and who take consolation in his consolations, his brothers-in-law and those who love his name\'85\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth456\clshdrawnil \cellx348\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8072\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par +\par [7] a Condolence Letter over the Death of a Mother-In-Law}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +Buchsbaum, 192.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Author of the Letter and the Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash Though neither the author nor the recipient are known for certain, we do know that the letter stems from Cremona since it mentions \'93He-Aluf Ashkenazi +\'94 (R. Eliezer) who lived there until 1576. This is a short condolence letter about a woman who died well advanced in years, and there is no need to offer other extensive words of consolation. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +\par Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with two themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls6\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Shock upon hearing the evil tidings +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}Condolences +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par \ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil \cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8144\clshdrawnil \cellx8414\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell I grew very faint and felt crushed by the disheartening news that your elderly, saintly mother-in-law, of blessed memory, has passed away. And knowing that y +our honor is like an angel of the Lord, I shall not offer lengthy condolences with +\par empty words, but only implore you to not be overly wrought with grief, for she has died at an advanced age, in the fullness of years, and would that it be that no one would die before reaching that age.\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil \cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth8144\clshdrawnil \cellx8414\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid4551223 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [8] Condolence Letter over the Death of a Granddaughter}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , 303 +\endash 4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and the Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash + Moses Carmi (the younger son of S. R. Carmi) writes to his father-in-law R. Isaac Foa (a resident of Reggio and one of the mos +t important rabbis in Italy in his day). The time: Kislev 1571. (The writer uses quotations from the Talmud, language not found in other letters from this period.) +\par +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letters deals with two themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid4551223 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The writer apologizes that even though he is \'93of junior years\'94 he }{\rtlch \af0 \ltrch +\insrsid4551223\charrsid1781117 has ventured to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 writ}{\rtlch \af0 \ltrch \insrsid4551223\charrsid1781117 e}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a condolence letter. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid4551223\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}}{\rtlch \af0 \ltrch \insrsid4551223\charrsid1781117 S}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 adness engulf}{ +\rtlch \af0 \ltrch \insrsid4551223\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 everyone owing to the pain of R. Isaac Foa. +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard\plain \ltrpar\s6\qj \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Text of the Letter +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\br~rnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil +\cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par 1\cell \tab Arioch}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab a sobriquet of honor; a title of honor given to }{\rtlch \ai\af0 \ltrch +\insrsid4342917\charrsid5066409 Samuel}{\rtlch \af0 \ltrch \insrsid4342917 (Babylonian amora, first generation, beginning of the third century). See }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 Shabbat}{\rtlch \af0 \ltrch \insrsid4342917 + 53a; K}{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 iddushin }{\rtlch \af0 \ltrch \insrsid4342917 39a; }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 Menahot }{\rtlch \af0 \ltrch \insrsid4342917 38b; }{\rtlch \ai\af0 \ltrch +\i\insrsid4342917\charrsid5066409 Hulin}{\rtlch \af0 \ltrch \insrsid4342917 76b.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par \tab The consolation of a foolish Babylonian such as myself is almost tantamount to blasphemy.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab See }{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid5066409 baba Kama}{\rtlch \af0 \ltrch \insrsid4342917 38a; meaning \'93I do not know how to offer condolences.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I am young, and what can I }{ +\rtlch \af0 \ltrch \insrsid4143959\charrsid1781117 say }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and how can I console you}{\rtlch \af0 \ltrch \insrsid4143959\charrsid1781117 ? +\par }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid4143959\charrsid1781117 My }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 dwelling}{\rtlch \af0 \ltrch \insrsid7306120\charrsid1781117 [i.e., my body]}{\rtlch +\af0 \ltrch \insrsid13765936\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in }{\rtlch \af0 \ltrch \insrsid7306120\charrsid1781117 a }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +time of distress and the upheavals of the times}{\rtlch \af0 \ltrch \insrsid7306120\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid13765936\charrsid1781117 turns }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 round and round }{\rtlch \af0 \ltrch \insrsid7306120\charrsid1781117 toward }{\rtlch \af0 \ltrch \insrsid13765936\charrsid1781117 your }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 hol}{\rtlch \af0 \ltrch +\insrsid13765936\charrsid1781117 y}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 house. I know the distress of }{\rtlch \af0 \ltrch \insrsid7306120\charrsid1781117 your }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 soul, for I am with }{ +\rtlch \af0 \ltrch \insrsid7306120\charrsid1781117 you }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in }{\rtlch \af0 \ltrch \insrsid14631613\charrsid1781117 your }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 distress}{\rtlch \af0 \ltrch +\insrsid10372219 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 5\cell }{\rtlch \af0 \ltrch \insrsid15693328\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 houghts }{\rtlch \af0 \ltrch \insrsid14631613\charrsid1781117 concerning }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 your honor }{\rtlch \af0 \ltrch \insrsid15693328\charrsid1781117 disturb me for }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the radiance }{\rtlch \af0 \ltrch \insrsid15693328\charrsid1781117 of your }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 countenance change}{\rtlch \af0 \ntrch \insrsid15693328\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsi\1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid11416988 Dan}{\rtlch \af0 \ltrch \insrsid4342917 . 5:6; 10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + Outside the sword of the earthquake dealt }{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 death}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to your wisdom;}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab The reference is to the earthquake that hit Ferrara on 19 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid11416988 Kislev}{\rtlch \af0 \ltrch \insrsid4342917 + 371 (17 Nov. 1530). R. I. Foa had relatives and friends in Ferrara, and his son-in-law R. M. I. lived there. }}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 into the house stole death through the windows of }{\rtlch \af0 \ltrch +\insrsid15693328\charrsid1781117 your }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 cherished granddaughter, may her soul be bound up in the bond of everlasting life}{\rtlch \af0 \ltrch \insrsid15693328\charrsid1781117 .}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid15104734\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid15693328\charrsid1781117 he }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 chambers of his heart }{\rtlch \af0 \ltrch +\insrsid15104734\charrsid1781117 show }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 great }{\rtlch \af0 \ltrch \insrsid15104734\charrsid1781117 alarm}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + for the men of his redemption and his extraordinariness in Ferrara;}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab Until th +is point the metaphor is based on the verses in }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid11416988 Deut}{\rtlch \af0 \ltrch \insrsid4342917 . 32:25 and }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch +\insrsid4342917 1:20.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the supports of his insights are paralyzed, and he cannot express his sorrow, for our brothers and teachers steeped in sorrow\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell in Ferrara, }{\rtlch \af0 +\ltrch \insrsid15104734\charrsid1781117 unless }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the strength of the shepherd increase}{\rtlch \af0 \ltrch \insrsid15104734\charrsid1781117 s,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to }{ +\rtlch \af0 \ltrch \insrsid15104734\charrsid1781117 grant }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 them mercy before their return}{\rtlch \af0 \ltrch \insrsid15104734\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + and }{\rtlch \af0 \ltrch \insrsid15104734\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 have mercy on them..}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab Perhaps the re%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%ncere%n%%nce is to the debts non-Jews owed to Jewish moneylenders; under the pretext of the earthquake they evaded paying their debts.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch +\scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par [9] Example of the writing of a condolence letter in Venice (sixteenth century) +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid3016977 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch +\b\insrsid12391429\charrsid1781117 Author of the letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \endash R. Solomon ben R. Joshua Alt Sh}{\rtlch \af0 \ltrch \insrsid10695270\charrsid1781117 u}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 l,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1847736 +Sefer Megillat Sefer}{\rtlch \af0 \ltrch \insrsid4342917 , Venice 1652, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1847736 ketav}{\rtlch \af0 \ltrch \insrsid4342917 27.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in his }{\rtlch +\ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Megillat Sefer}{\rtlch \ai\af0 \ltrch \i\insrsid10695270\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 include}{\rtlch \af0 \ltrch \insrsid10695270\charrsid1781117 s}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 different }{\rtlch \af0 \ltrch \insrsid10695270\charrsid1781117 styles which }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +had been collected for the purpose of practicing correct writing, and as the author writes in the}{\rtlch \af0 \ltrch \insrsid10695270\charrsid1781117 introduction, its purpose is}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'93To }{\rtlch +\af0 \ltrch \insrsid10695270\charrsid1781117 train}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 young men}{\rtlch \af0 \ltrch \insrsid6584119\charrsid308133241 \rquote s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 hands to write }{\rtlch +\af0 \ltrch \insrsid6584119\charrsid1781117 to one an}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 other in }{\rtlch \af0 \ltrch \insrsid6584119\charrsid1781117 lofty }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 language.\'94 + That is, these were the accepted writing styles in that period. Also appearing there is a special style used for condolence letters. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash + The letter deals with three themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls8\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lament over the deceased and sharing in the mourner\rquote s pain +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}Prayer for the deceased as well as for the living family members +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}Condolences consisting mainly of accepting the Divine judgment +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil +\cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8280\clshdrawnil \cellx8550\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \cell }\pard\plain \ltrpar\s5\qc \li0\ri0\sl480\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel4\adjustright\rin0\lin0 \rtlch \ab\af0\afs24\alang1037 \ltrch +\b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lament for One Moaning the Loss of a Loved One\cell }\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtnch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl-2753993917976240078\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil \cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8280\clshdrawnil \cellx8550\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 1\cell }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11349039 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab I lift my voice in crying and wailing and moaning }{\rtlch \af0 \ltrch \insrsid11349039\charrsid1781117 like the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ostriches. I will give +\par \tab no respite to myself}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch +\af0 \ltrch \insrsid4342917 2:18, \'93Give yourself no respite.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and tears }{\rtlch \af0 \ltrch \insrsid11349039\charrsid1781117 will }{\rtlh \af0 \ltrch \insrsid12391429\charrsid1781117 +flow from my eyes. Night +\par \tab and day I will cry with you. }{\rtlch \af0 \ltrch \insrsid11349039\charrsid1781117 A}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 t noon I will be embittered that the Lord has taken from you +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3016977 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab the cherished hart. May his soul be bound up in the bo +nd of eternal life with the Lord +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid4924362 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab Our God}{\rtlch \af0 \ltrch \insrsid4924362\charrsid1781117 .}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid4924362\charrsid1781117 M}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ay all the rest of the family live a long life, amen}{\rtlch \af0 \ltrch \insrsid4924362\charrsid1781117 .}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Pray be it that with me you will take comfort and give thanks to the Lord for all of His deeds, for we are the material and He is our }{\rtlch \af0 \ltrch \insrsid4924362\charrsid1781117 C}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 reator and what can you}{\rtlch \af0 \ltrch \insrsid4924362\charrsid1781117 say to }{\rtlch \af0 \ltrch \insrsid3016977\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid4924362\charrsid1781117 im and what can you do?} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid6771793 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab And you, sir, do verily know that we are }{\rtlch \af0 \ltrch +\insrsid4924362\charrsid1781117 all }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 bound to bless Him, for the Lord has given and the Lord has taken away, blessed be the name of the Lord: and }{\rtlch \af0 \ltrch \insrsid11084060\charrsid1781117 H} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e may add as }{\rtlch \af0 \ltrch \insrsid11084060\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e wishes}{\rtlch \af0 \ltrch \insrsid6771793\charrsid1781117 .}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlchIHTqbY \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +Written at the end of the letter, and it means that from this point on the writer is permitted to add whatever he wishes.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab N.B. the writer +\par \tab a}{\rtlch \af0 \ltrch \insrsid6771793\charrsid1781117 ccepts his sufferings with love, an}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 d his end will be to the good. Your respected}{\rtlch \af0 \ltrch \insrsid6771793\charrsid1781117 servant. +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth378\clshdrawnil \cellx270\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8280\clshdrawnil \cellx8550\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [10] Condolence Letter to R. Moses b. R. Joseph Mitrani upon the Death of His Wife +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid6771793 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and the Recipient}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \endash R. Elazar b. Johai (Hakham from Tiberias, sixteenth century), one of the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 hakhamim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + who gathered around R. Mitrani (who at the time the letter was written was apparently a mourner himself), wrote a condolence letter }{\rtlch \af0 \ltrch \insrsid6771793\charrsid1781117 in 1567 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +to R. Moses Mitrani who lived in Safed, upon the death of the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 rabbanit}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + (his wife or his mother?). These statements are found at the beginning of a responsum addressed to R. Mitrani over the question about leaving fields fallow}{\rtlch \af0 \ltrch \insrsid6771793\charrsid1781117 ,}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 in which many citations from the Bible are interwoven.}{\rtlch \ab\af0 \ltrch \cs16\b\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab +See M. Benayahu, first chapter and introduction to responsa by R. Moses Mitrani, 18.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s7\ql \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel6\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par Content of the Letter +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +The letter deals with five themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls64\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 An apology and allusion to the writer\rquote s situation that he himself is a mourner +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}A prayer for the deceased +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}Condolences to Rabbi Moses b. Joseph Mitrani +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1491\'3f. \tab}The importance and urgency of his query to Rabbi Moses b. Joseph Mitrani +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1492\'3f. \tab}A conclusion including wishes for long life +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par +\par +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil +\cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell \tab His splendor fills the earth, his honor the Rabbi, may God protect +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid2239998 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab and bless him, }{\rtlch \af0 \ltrch \insrsid2239998\charrsid1781117 and since }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 one cannot enter the palace gate wearing sackcloth}{\rtlch \af0 \ltrch \insrsid2239998\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid7104208 Esther}{\rtlch \af0 \ltrch \insrsid4342917 4:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I sewed over +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab my skin, I buried my glory in the dust, that for my iniquities I have been disgraced, and I stood +\par \tab silent}{\rtlch \af0 \ltrch \insrsid2239998\charrsid1781117 ;}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I was bowed with gloom,7like one mourning for his mother.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 35:14.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + And one who needs consolers is not able to console,\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 5\cell \tab I relent being but dust and ashes,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 42:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to write words of comfort over the death of the }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 rabbanit }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 who +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid16192946 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab has passed on. And now I come in short to pray to God, the }{\rtlch \af0 \ltrch +\insrsid16192946\charrsid1781117 C}{\rtlch \af0 \ltr h \insrsid12391429\charrsid1781117 onsoler of Zion, may she go to rest +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11084060 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab with }{\rtlch \af0 \ltrch \insrsid2239998\charrsid1781117 unworried}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , }{\rtlch \af0 \ltrch \insrsid16192946\charrsid1781117 secure}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ladies.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 32:9.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid16192946\charrsid1781117 May t}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he consoler of Zion and the builder of Jerusalem in }{\rtlch \af0 \ltrch \insrsid15094550\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +is mercy give him to drink of the cup of consolation and build }{\rtlch \af0 \ltrch \insrsid16192946\charrsid1781117 for }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 him in Israel a faithful home}{\rtlch \af0 \ltrch +\insrsid15094550\charrsid1781117 ;}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 great will be the glory of this +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab latter home.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs\cs\cs\cs\cs\cs\cs\cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid7104208 Haggai}{\rtlch \af0 \ltrch \insrsid4342917 2:9.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + And now my Lord, the cause of the holiness of the land, make}{\rtlch \af0 \ltrch \insrsid15094550\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 me ready to remove my sackcloth from upon me,\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \trch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell }\pard \ltrpar +\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11084060 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch \insrsid11084060 a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +nd to wear clothes of triumph,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 +\ltrch \insrsid4342917 61:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to come before the king to plead to him, over a true and humble thing}{\rtlch \af0 \ltrch \insrsid16192946\charrsid1781117 ;}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 justice +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid1330909 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch \insrsid1330909\charrsid1781117 d}{\rtlch \af0 \ltrch +\insrsid16192946\charrsid1781117 id I don }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid1330909\charrsid1781117 (}{\rtlch \af0 \ltrch \insrsid11084060 i.e., in order }{\rtlch \af0 \ltrch +\insrsid1330909\charrsid1781117 have you) }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 instruct}{\rtlch \af0 \ltrch \insrsid1330909\charrsid1781117 me}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , }{\rtlch \af0 \ltrch +\insrsid1330909\charrsid1781117 to cast light regarding }{\rtlch \af4292 \ltrch \insrsid12391429\charrsid1781117 the }{\rtlch \af0 \ltrch \insrsid1330909\charrsid1781117 laws }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of lands lying fallow for + +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab we rely upon everything being in his hand, and for everyt +hing regarding the commandments depending upon the land of Israel, the lovely land, that +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3889465 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 Y}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ou made great +\par \tab with great waters, and }{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 Y}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ou raised up over all deed}{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 s}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , and }{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 Y}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ou planted it like a cedar of Lebanon. I have but one request +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab from my lord that I will ask +, that you not make my answer long in coming, since it is a time-linked commandment, \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 15\cell \tab and I will tell the Rabbi what I am seeking and what I have found and examined as far as I could, and the Rabbi with his fitting knowledge +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3889465 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab will separate the wheat from the chaff since I did not have }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 Kaftor va-Ferah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 + The name of a book on the agricultural laws pertaining to the land of Israel printed in Venice, 1549.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I am certain that }{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 you }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 will guide me well. The question is: Please teach me, a Jew who hired\'85\'94 +\par }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3560544 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtmh \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab and concludes his question: I will wait for God}{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I will beseech him, may }{\rtlch \af0 \ltrch +\insrsid3889465\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e inscribe for a good life him and his descendants\rquote descendants}{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 ,}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid3889465\charrsid1781117 may he }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +have many years over his domain, he and his children among the Jews, as there is the soul of the wise, also the pious in the heaven, and like a submissive soul to serve the service of a living person. }{\rtlch \af0 \ltrch \insrsid3560544\charrsid1781117 P +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 raying for his welfare +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +to the living God. The young man Elazar ben Johai.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Responsa of }{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid7104208 Mabit}{\rtlch \af0 \ltrch \insrsid4342917 (R. Moses b. Joseph Mitrani).}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow3\irowband3\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfre7 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [11] Condolence Letter to a Mourner Steeped in His Suffering}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917 Ma\rquote ayan Ganim}{\rtlch \af0 \ltrch \insrsid4342917 , Venic, 1653, p. 15 (my appreciation to Prof. M. Benayahu who enabled me to view the source).}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid3560544 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch +\b\insrsid12391429\charrsid1781117 Author of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash R. Samuel b. R. Elhanan Jacob Archivolti, rabbi of the Jewish community in Padua, Italy (from 1568 until + his death, 26 Adar 5471 [1611]). }{\rtlch \af0 \ltrch \insrsid3560544\charrsid1781117 For }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 his volume }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Ma\rquote ayan Gannim}{\rtlch \af0 +\ltrch \insrsid3560544\charrsid1781117 , he wrote and edited}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 fifty letters and for twenty-five of them he included the replies. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab The letter printed here is unique in that it deals with both with rebuke as well as condolences. The wr +iter reproves the mourner for being too deeply steeped in his anguish and has reservations about the divine attributes using a metaphor from nature to prove to the mourner that after the tragedy that has befallen him he must take encouragement and anticip +ate better days. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with five themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs1998437368357852581 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls10\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Participation of the writer in the mourner\rquote +s sorrow and expression of the hope that the mourner will be given the strength to bear his anguish and be able to becalm his turbulent feelings. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}Sadness upon hearing that the mourner in his distress is having reservations about the divine attributes. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}The Lord is patient, but }{\rtlch \af0 \ltrch \insrsid3560544\charrsid1781117 when the appointed day arrives H}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 e will levy punishment. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1491\'3f. \tab}It is the way of mankind to grumble and it has become so habitual as to be second nature. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1492\'3f. \tab}After }{\rtlch \af0 \ltrch \insrsid3560544\charrsid1781117 the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +bad, it is the turn for }{\rtlch \af0 \ltrch \insrsid3560544\charrsid1781117 the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 good to come, and the mourner must look forward to it and desist from his anger. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 +a person writes many words to comfort his fellowman in his time of sorrow +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for death ha +s stolen, God forbid! +\par \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl +\tx360\faauto\outlinelevel1\adjustright\rin0\lin405 \rlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab I lift to you my eyes flowing with tears for want of + +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +respite, for anything I propose is impossible,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 +\rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch +\af0 \ltrch \insrsid4342917 42:2, \'93you propose.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and there is no power +\par }\pard\plain \ltrpar\s26\ql \fi-342\li342\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin342 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 that can annul what has been decreed to roam the sea, the roiling sea of your perplexities, to raise the banner +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +in the tempest, the tempest of your self }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 nd your soul. May this be a comfort for your soul,\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard\plain \ltrpar +\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel1\adjustright\rin0\lin405 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 giving you power to bear the supreme reproof until the Lord looks down and beholds}{\rtlch \af0 \ltrch \cs16\scaps\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 3:50.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to restore your fortunes}{\rtlch \af0 \ltrch +\cs16\scaps\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:14.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid16200598 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab and have mercy on you}{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 ;}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 e will bear your ire, }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e will cast light on your forces as dark as the ice}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 6:16.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par \tab of the the perplexities}{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 ;}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +e will assuage your anger, }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e will calm your soul, setting it aright, and direct your heart to +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab His abode. My witness is in heaven}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp0043 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 16:19.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for I am in agony}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 2 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \insrsid4342917 1:9.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 over the bad +\par news +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab I +have heard, for I am benumbed and crushed,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 +\rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch +\af0 \ltrch \insrsid4342917 38:8.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and distress increased in my abode \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell }\pard\plain \ltrpar\s20\ql \fi-405\li405\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin405 \rtlch \af0\afs24\alang1037 +\ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 like grief in your courtyards and agony in my heart like a moan because of your idea. I was saddened by your suffering +\par }\pard \ltrpar\s20\ql \fi-315\li315\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin315\pararsid16200598 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and even more }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 by }{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 your wrath. You have begun to have reservations about God\rquote s +\par }\pard \ltrpar\s20\ql \fi-405\li405\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin405 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 attributes, leniently, by saying that all the good which you have been graced with for many + +\par }\pard \ltrpar\s20\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a day was taken from you in the prime of her life.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Based on }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid3356114 Daniel }{\rtlch \af0 \ltrch +\insrsid4342917 7:25.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 It is the way of man that +\par }\pard \ltrpar\s3596922953723469861\ql \fi-405\li405\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin405 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 if he sin}{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 s}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 against }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is creator and make}{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 s}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im angry, a thousand years in his eyes and }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 e, with }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is mercy, will patiently}{\rtlch \af0 \ltrch \scaps\insrsid12391429\charrsid1781117 \cell +}\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 15\cell }\pard\plain \ltrpar\s20\ql \fi-405\li405\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin405\pararsid16200598 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 bear his guilt and when }{\rtlch \af0 \ltrch \insrsid16200598\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +is wrath shall come upon the appointed day and time, man shall be humbled and +\par }\pard \ltrpar\s20\ql \fi-405\li405\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin405\pararsid1194561 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 mortal brought low,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 2:9; 5:15.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 when }{\rtlch \af0 \ltrch \insrsid1531410\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e rises to }{\rtlch \af0 \ltrch \insrsid1194561\charrsid1781117 dictate}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid1194561\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 man and }{\rtlch \af0 \ltrch \insrsid1194561\charrsid1781117 to }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 judge him, }{\rtlch \af0 \ltrch \insrsid1194561\charrsid1595742571985111546 [the man] }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 will +lament, and his soul will bitterly torment him and he will be ruled by it. For if a good man would understand his foundation}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 11:3, \'93When the foundations are destroyed...\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 when +\par }\pard \ltrpar\s20\ql \fi-315\li315\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin315 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +he leaves the oppressions of the world, he should be happier on the day of his death than on the days of his birth (perhaps one should say today)}{\rtlch \af0 \ltrch \insrsid1194561\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel1\adjustright\rin0\lin405 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid1194561\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 his habit has become second nature to him and just as he cried and raged upon leaving his mother\rquote s womb, \cell }\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow3\irowband3\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 20\cell }\pard\plain \ltrpar\s20\ql \fi-315\li315\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin315 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 with his going forth to a more distinguished, important place than where he had been, so he will be obligated\cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 +\rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\lastrow \ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar +\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\itap0\pararsid15625630 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid15625630 ******}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \tab }{\rtlch \af0 \ltrch \insrsid15625630 +\par }{\rtlch \af0 \ltrch \scaps\insrsid15625630\charrsid1781117 }{\rtlch \af0 \ltrch \scaps\insrsid12391429\charrsid1781117 [}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 pages 16\endash 17 of the letter] +\par \ltrrow}\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1 +\cell }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\pararsid1194561 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 { +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 by his nature to complain on the day of his death, since he too is flesh}{\rtlch \af0 \ltrch \cs16\scaps\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid7613718 Gen:}{\rtlch \af0 \ltrch \insrsid4342917 6:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 desirous of material things}{\rtlch \af0 \ltrch +\insrsid1194561\dharrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid1194561\charrsid1781117 E}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +ven worse than this, there will be saddened over him the hearts of those who know him and are yet +\par }\pard \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\pararsid3828797 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 still alive. Can a man be of use to God?}{\rtlch \af0 +\ltrch \cs16\scaps\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 0:2.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The burden of his complaints will be burdensome }{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 him when his anger +\par }\pard \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel1\adjustright\rin0\lin405 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 comes upon him}{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 ,}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and a man's feet are responsible for him when he time comes; they lead him\cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 +\ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone +\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row +\ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl +\tx360\faauto\outlinelevel1\adjustright\rin0\lin405\pararsid3828797 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 from far to live in a place that he wants } +{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 whether }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 consciously or unconsciously}{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + +\par }{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ow can a man rage against God, for }{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e}{ +\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the most high}{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 rule}{\rtlch \af0 \ltrch +\insrsid3828797\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the world +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 justly +\par and nations with equity.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch +\insrsid4342917 98:9, \'93He will rule the world justly, and its peoples with equity.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 If man be overwise, he should cry at birth, +\par he should rejoice at the expiring of an old man, for man is destined to labor from birth}{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and an elderly person will perish seeing +\par good. Have you never heard that the air darkens before the dawn}{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 ?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell }\pard\plain \ltrpar +\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel1\adjustright\rin0\lin405 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid3828797\charrsid1781117 A}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 fter it rises}{\rtlch \af0 \ltrch \insrsid3828797\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + the sun spreads the feathers of its wings and [shines] like a groom coming forth +\par from the chamber.}{\rtlch \af0 \ltrch \cs16\scaps\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch +\insrsid4342917 19:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 After the sun rises, the cloud dulls its splendor. After +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +the cloud, the air becomes warm. After the heat come thunderous torches +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3828797 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and noises agitating the earth and those in it: after the thunder a tempest +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 rages. And after the tempest, the sun rises and all illness \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell and distress will be gathered,}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 104:22.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the shadows flee,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid7613718 Song of Songs}{\rtlch \af0 \ltrch \insrsid4342917 2:17}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and they will do no more harm. Man then goes out to his work, and shepherd}{\rtlch \af0 +\ltrch \insrsid12352864\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 my sheep +\par as thsy said, Let them praise the Lord for his steadfast love, His wondrous deeds for mankind.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 107, 8.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Yea, all who live in the world +\par and inhabit the earth,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch +\insrsid4342917 18:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for whom dust is their origin, together rich and poor will pass +\par }\pard\plain \ltrpar\s2\ql \fi-405\li405\ri0\sb120\sl360\slmult1\keepn\widctlpar\intbl\tx360\faauto\outlinelevel1\adjustright\rin0\lin405 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 over them as happens in these days in their time. The people sitting in the dark of their mother\rquote s womb, light shined on them, and it is their birth and the days of\cell }\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow3\irowband3\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 20\cell their childhood. After childhood come the stage of youth, after youth they go through the prime of life. After the prime of life, they will bear the paths +\par of old age. After, after old age, they will reach the edge of hoary old age. After +\par hoary old age, the time of affliction arrives. After affliction }{\rtlch \af0 \ltrch \insrsid12352864\charrsid1781117 they }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 will come in ripe old age to the grave.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 %%ntn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 5:26.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par And just as they }{\rtlch \af0 \ltrch \insrsid12352864\charrsid1781117 who }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 lived until now wait to die, so they now die to see eternal\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\ltrrow\ts11\trgaph9223372036854775807\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl4\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 25\cell life of light in the God\rquote +s Torah in the land of the living.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch +\insrsid4342917 38:11.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 These are the limits +\par of our ways and for them we should thank the Lord for the past. To gladden his heart in the present\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow5\irowband5\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\trowd \irow6\irowband6\lastrow \ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA6\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone\clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7847\clshdrawnil \cellx8414\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \cell and to pray for the future. And now my brother set your thinking to thank the Lord, remove the anger from your heart, and divest yourself from evil, lest it be a snare within you}{\rtlch \af0 \ltrch +\insrsid12352864\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid12352864\charrsid1781117 may }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +God comfort you with the comfort of Zion, Amen, may it be so}{\rtlch \af0 \ltrch \insrsid12352864\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow6\irowband6\lastrow \ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA6\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7847\clshdrawnil \cellx8414\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \page [12] Condolence Letters by Joseph Hacohen (15}{\rtlch \af0 \ltrch \super\insrsid12391429\charrsid1781117 th}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 century) +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid15408536 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch +\b\insrsid12391429\charrsid1781117 Author of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash Joseph Hacohen (author of }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Emek ha-Bakha}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ) of Spain, lived in the first half of the 16th century and wrote these four letters of condolence. The first two letters were written to his father-in-law}{\rtlch \af0 \ltrch \insrsid1663324\charrsid1781117 ,}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 R. Abraham Hacohen, rabbi of the Bologna community after the death of his son (that is, the brother-in-law of Joseph Hacohen}{\rtlch \af0 \ltrch \insrsid15408536\charrsid1781117 )}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , who died in the region of the cities of Rimini and Imola. (}{\rtlch \af0 \ltrch \insrsid15408536\charrsid1781117 This is }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +stressed in almost the same phraseology in the two letters, \'93and I say, let there be no dew in Rimini and no rain in Imola. For there fell the shield of warriors, the crowning glory of the young men\'94 [patterned after 2 Samuel 1:21: \'93 +O hills of Gilboa \emdash let there be no dew or rain on you.\'94] The second letter, similar to the first, was apparently written for fear that the first did not reach its destination (the two letters have identical stylistic elements). The lat +er two letters were written to his nephew, Zerahiah Halevi, a physician in Voghera, at the time of the death of his father, Joseph Halevi (that is, Joseph Hacohen\rquote s brother-in-law).}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 My appreciation to Dr. Avraham David who referred me to \'93The Letter Collection of Joseph Hacohen, author of }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Emek ha-Bakha}{\rtlch \af0 +\ltrch \insrsid4342917 \'94 (in Hebrew) which he published in }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Italia,}{\rtlch \af0 \ltrch \insrsid4342917 5 (1985), 9\endash +14. We have quoted the letters and comments as cited there and added additional comments of our own.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par \tab All four letters were, of course, written by the same person, but we must pay attention to the significant stylistic differences between the first two and the latter two. The first letters deal with \'93untimely death,\'94 so more than half }{\rtlch +\af0 \ltrch \insrsid15408536\charrsid1781117 of }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the first }{\rtlch \af0 \ltrch \insrsid15408536\charrsid1781117 consists of }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +lamentations and wailing, and only in the later section are there so +othing, comforting statements. Joseph Hacohen himself suffered harsh tragedies twice in his life, when his firstborn son Joshua died at the age of twenty, drowning in a river on the 9th of Tammuz 1540 , and the death of his other son Isaac when five month +s old, in 1541. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of Letter A}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , p. 54, Letter 24.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with three themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls11\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lamentation and wailing over the deceased. +\par {\listtext\pard\plain\ltrpar \ltrch \ai\afs2 \rtlch \i\f262\fs24\cf2\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 Z}{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 idduk ha-din}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (\'93the rightness of divine judgment\'94) \emdash \'93The Lord has given, and the Lord has taken away.\'94 +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}Prayer for the deceased and condolences to his family. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0$\ltrch \insrsid12391429\charrsid1781117 : +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8528\clshdrawnil \cellx8420\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Prince and worthy of Israel, the leader of the Diaspora of Israel, my teacher, my father-in-law as my distinguished rabbi, +\par Abraham Hacohen, may God preserve him, in Bologna\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trkeep\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone +\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth8528\clshdrawnil \cellx8420\row \ltrrow}\trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trrh777\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb +\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell Prince and worthy of Israel, the lea +der of the Diaspora of Ariel, my teacher, my father-in-law, may the Lord bless him. I looked forward to peace and there was no good}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 See }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 30:26: \'93I looked forward to good fortune, but evil came.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \line +in the time of calm. }{\rtlch \af0 \ltrch \insrsid3235903\charrsid1781117 B}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ehold}{\rtlch \af0 \ltrch \insrsid3235903\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + your writing horrified me for there is no balm in Imola}{\rtlch \af0 \ltrch \insrsid3235903\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 + The city of Imola near Bologna.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid3235903\charrsid1781117 C}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 an no physician be found there, for why was my suffering}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid7613718 Habakkuk}{\rtlch \af0 \ltrch +\insrsid4342917\charrsik&867703 }{\rtlch \af0 \ltrch \insrsid4342917 1:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 brother-in-law,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 The name of that brother-in-law, his father-in-law\rquote s son \emdash is not known for certain.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 may he rest in paradise}{\rtlch \af0 \ltrch +\insrsid3235903\charrsid1781117 , not healed?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \line Let there be no\line dew}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 Hebrew ms, }{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'e8\'f8}{\rtlch \af0 \ltrch \insrsid4342917 , which should be }{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'e8\'ec}{\rtlch \af0 \ltrch +\insrsid4342917 , dew.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in Rimini}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Hebrew name, } +{\ltrch \af262 \rtlch \f262\fs20\lang1037\insrsid4342917 \'e0\'f8\'ee\'e9\'f0\'e5}{\rtlch \af0 \ltrch \insrsid4342917 .}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 nor rain in Imola, for there has fallen the crowning of\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trrh777\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb +\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420%nw \ltrrow}\trowd \irow2\irowband2\ltrrow +\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\pard \ltrpar +\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3235903 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 youth, for I call them Abel-shittim,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid1867703 Numbers }{\rtlch \af0 \ltrch \insrsid4342917 33:49.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for there fell the shield of warriors}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 2 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Samuel}{\rtlch \af0 \ltrch \insrsid4342917 1:21.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'85, and we had a day of wrath}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 21:30.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + and scorn and time tossed arrows +\par of hardship like crumbs. That strong person passes away over, this I eulogize and wail +\par over +\par the creation of the Lord}{\rtlch \af0 \ltrch \insrsid3235903\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid3235903\charrsid1781117 C}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 heap}{\rtlch +\af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 1 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Samuel}{\rtlch \af0 \ltrch \insrsid4342917 15, 9. +}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and worthless stillness to a land planted by the finger of God shall come up to fell us,\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb +\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell +}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3235903 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 over these my eyes flow with tears and my soul is mourning and moaning,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \stlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid14447357 Isaiah}{\rtlch \af0 \ltrch \insrsid4342917 29:2; } +{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid1867703 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid6120560\charrsid1781117 my}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid6120560 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 cheek wet with tears.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\sLSer\insrsiR4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid1867703 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 1:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + How can we plead, how can we prove our innocence only to bless H}{\rtlch \af0 \ltrch \insrsid6120560\charrsid1781117 im}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 who gives and H}{\rtlch \af0 \ltrch \insrsid6120560\charrsid1781117 im}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 who takes, for all is +\par from Him, and against our will }{\rtlch \af0 \ltrch \insrsid6120560\charrsid1781117 we }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 live and die. }{\rtlch \af0 \ltrch \insrsid6120560\charrsid1781117 I}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 f time erred, and it shows us such a thing from He who is near +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to all who call Him, who helps all his creatures, we ask to remove tears from our eyes and to sate +\par us with perfect joy}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 + 16, 11.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and his soul He will hide in the light hidden for his worshipers that He has bestowed\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb +\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell +upon His angels and hosts, and those who are near Him He will comfort and He will repair this breach among Israel for life, and so on\'85.\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\lastrow \ltrrow\ts11\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb +\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of Letter B}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , pp. 55\endash 56, Letter 26}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with three themes: +\par {\listtext\pard\plain\ltrpar \rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 1.\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar\tx360\jclisttab\tx720\faauto\ls12\adjustright\rin0\lin720\itap0\pararsid6120560 +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lamentation and wailing over the deceased. +\par {\listtext\pard\plain\ltrpar \rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 \hich\af0\dbch\af0\loch\f0 2.\tab}}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 Z}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 +idduk ha-din}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (\'93the rightness of divine judgment\'94) \emdash +\par }\pard \ltrpar\ql \li360\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin360\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1. Death is the way of the world; +\par 2. Death is a trial for the righteous; +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 3. \'93The Lord has given, and the Lord has taken away.\'94 +\par }{\rtlch \af0 \ltrch \insrsid6120560\charrsid1781117 3.\tab }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Condolence and prayer for the deceased. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil +\cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 1\cell Prince and worthy of Israel, the leader of the Diaspora of Ariel, my teacher, my father-in-law, may the Lord bless him. I looked forward to peace and there is none, for +\parmd the writ of your honor startled me, }{\rtlch \af0 \ltrch \insrsid15341698\charrsid1781117 it }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 destroyed my rest, hounded me when I heard that the apple of our eye has been taken away}{\rtlch \af0 +\ltrch \insrsid15341698\charrsid1781117 ;}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \line for\line this my heart is sick,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 '.:17.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + my eyes stream with tears, and I fall prostrate, saying, there is no dew}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 +See above, Hebrew reads }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93tar,\'94}{\rtlch \af0 \ltrch \insrsid4342917 while it should be }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93tal.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + in Rimini and no rain in Imola, for there fell the shield of warriors}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 2 }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \insrsid4342917 1:21. }}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , a glorious diadem}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote +\ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1867703 Prov}{\rtlch \af0 \ltrch \insrsid4342917 . 4:9.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of + the young men. Behold I am calling them Abel Shittim}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid1867703 Num}{\rtlch \af0 \ltrch \insrsid4342917 . 33:49.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + for there he cast away the bitter, impetuous time, give half the burden of his hardships like crumbs. If a strong man}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 25:8.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 will leave us land as an inheritance, death will pluck us, while }{ +\rtlch \af0 \ltrch \insrsid15341698\charrsid1781117 with }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a cedar planted by the finger of God, one shall come to fell us,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 14:8, }}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + over these my heart is sorrowed,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch +\insrsid4342917 29:2; }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid7347137\charrsid1781117 my }{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 cheek day and night wet with tears}{\rtlch \af0 \ltrch \insrsid7347137\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 1:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid7347137\charrsid1781117 T}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 his I will take to heart, that this is the way of the }{\rtlch \af0 \ltrch \insrsid11696930\charrsid1781117 lowly }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +world, and that there is no escape from it, a time to cast away agony and a time for gathering.\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nbclbr%nb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\b|Prnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \asllx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid00000078\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrno\e \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108|trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 10\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12672551 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 For }{\rtlch \af0 \ltrch +\insrsid12672551\charrsid1781117 will not }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 our }{\rtlch \af0 \ltrch \insrsid12672551\charrsid1781117 C}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 reator discern this, }{\rtlch \af0 \ltrch +\insrsid12672551\charrsid1781117 and H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is emanations}{\rtlch \af0 \ltrch \insrsid12672551\charrsid1781117 ?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 On the angels }{\rtlch \af0 \ltrch +\insrsid12672551\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e casts reproach,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 4:18.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for they quarreled as did the armies of the heavens, and the great lights withdrew their brightness.}{\rtlch +\af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid44 2917 Stet in the ms. [}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 nokham}{\rtlch \af0 \ltrch \insrsid4342917 +], should be }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 nogham}{\rtlch \af0 \ltrch \insrsid4342917 . }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid16335552 Joel}{\rtlch \af0 \ltrch \insrsid4342917 2:10; 4:15.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 God put Abraham to the test}{\rtlch \af0 \ltrch \insrsid12672551\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp0059 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 Gen. 22:1.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12672551\charrsid1781117 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +hat more can I say, and how can I justify myself, only by saying, \'93the Lord has given, and the Lord has taken away, blessed be the name of the Lord.\'94}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 1:21.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I ask that }{\rtlch \af0 \ltrch +\insrsid12672551\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e take away tears from our faces, and fill us with all good, and keep his soul in the bounds of life and give comfort\line to his loved one\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell And }{\rtlch \af0 \ltrch +\insrsid8983004\charrsid1781117 may he }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 close this breach in Israel for life, Amen. I will not go on at length except to disperse salutations after bow}{\rtlch \af0 \ltrch +\insrsid8983004\charrsid1781117 ing}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid8983004\charrsid1781117 the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +proper prostration to my lord and to all who accompany}{\rtlch \af0 \ltrch \insrsid8983004\charrsid1781117 him}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , from young to old\line and S.\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of Letter C}{\rtlch \ab\af0 \ltrch \cs16\b\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , 56, Letter 27.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash This letters has six themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls13\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Lamentation over the deceased. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}Words of conciliation to the mourner: +\par }\pard \ltrpar\ql \li360\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin360\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1. Death is the way of the world. +\par 2. The Lord becomes sanctified by those close to him. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls14\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The consolation in death is that there is a reward in the World to Come for the activity of the deceased. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1491\'3f. \tab}Prayer for the deceased. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1492\'3f. \tab}There is no reason to increase mourning and wailing. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1493\'3f. \tab}Words of }{\rtlch \af0 \ltrch \insrsid8983004\charrsid1781117 support}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + for the mourner and his mother +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s9\qj \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\tx450\faauto\outlinelevel8\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Text of the Letter +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +To my friend, the joy of my heart, His Honor, Zerahiah Halevy, may God protect and preserve him, son of Joseph Halevy, my brother-in-law, }{\rtlch \af0 \ltrch \insrsid13653733\charrsid1781117 of blessed memory}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , in Voghera in Genoa. +\par \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin0\pararsid7368773 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 My faithful friend and dear one, pious one. My eyes are spent with tears}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:11.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + from having heard the evil tidings }{\rtlch \af0 \ltrch \insrsid8246\charrsid1781117 \'85 regarding }{\rtlch \af0 \ltrch \insrsid14752387\charrsid1781117 your }{\rtlch \af0 \ltrch \insrsid8246\charrsid1781117 dedicated }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid3935689\charrsid1781117 punctilious}{\rtlch \af0 \ltrch \insrsid14752387\charrsiAxYyu1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 father, }{\rtlch \af0 \ltrch +\insrsid14615051\charrsid1781117 of blessed memory}{\rtlch \af0 \ltrch \insrsid8246\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8246\charrsid1781117 H}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ow can I }{\rtlch \af0 \ltrch \insrsid8246\charrsid1781117 offer }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 support in this case}{\rtlch \af0 \ltrch \insrsid8246\charrsid1781117 ,}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8246\charrsid1781117 which }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 has hit like }{\rtlch \af0 \ltrch \insrsid14752387\charrsid1781117 a target }{\rtlch \af0 \ltrch +\insrsid8246\charrsid1781117 aimed at }{\rtlch \af0 \ltrch \insrsid14752387\charrsid1781117 an arrow?}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult-2059285659\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 3:12.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Childhood is a bad time for this one, an evil disease devoured him, torn by a beast and he is no more,}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Gen. 37:34, \'93a savage beast devoured him; Joseph was torn by a beast.\'94}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 for God has taken him. This I will pay heed to for it is the way\line of}{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the world, a wheel that comes round}{ +\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 F}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +rom the defeat of mortality there is no escape}{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 ;}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 by }{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 H}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 is close ones }{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e will be sanctified, our }{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 C}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 reator and }{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is angels will grant glory, and who will say to }{\rtlch \af0 \ltrch +\insrsid7368773\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 im what }{\rtlch \af0 \ltrch \insrsid7368773\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e should do}{\rtlch \af0 \ltrch +\insrsid7368773\charrsid1781117 ?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 When asking Him for the spirit he blew in our nostrils, the body will return to the dust from which it was taken}{\rtlch \af0 \ltrch +\lang4105\langfe1033\langnp4105\insrsid4141745\charrsid1781117 , and t}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he soul to God who gave it. In this we will find comfort, for the act of vanity, forsakenness, and lack, f +or the salvation of worlds\line we do have in the house of the King, the fruit of our deeds we eat in this world and as a fund for eternity forever that is unending}{\rtlch \af0 \ltrch \insrsid5601694\charrsid1781119 .}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 10\cell And what can be done except to beseech the Lord that he should store his soul with the othe +r souls of his pious ones and clear away tears from our faces, for what gain is there in more mourning and wailing and eulogizing, sackcloth and ashes, [}{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 for}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 we] go to him, }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 but }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he shall not return to us. So, please, my friend, I have written that there is n +othing new, young or old}{\rtlch \af0 \ltrch \insrsid5601694\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + He is there, for that is Man, and Heaven forbid that we should sin against God. We must only accept the Divine Judgment, for }{\rtlch \af0 \ltrch \insrsid5601694\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +e is just and upright, and }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 He can }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 kill us if }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 He should but }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 wish. }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 B}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 lessed be He. \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 N}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ow}{\rtlch \af0 \ltrch +\insrsid8259293\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the joy of my heart, listen to my voice}{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 :}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 wipe}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 + From this point to the end of the letter, part is cut off on the right side, the two sentences were completed by using the content of the following letter.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [the tear}{\rtlch \af0 \ltrch +\insrsid8259293\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 from your face and gird] you loins like a man and be strong and of good courage, and may your heart be with [your bereft, sighing mother] who is mourning \line +the husband\line of her youth and console [\'85]}{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 days and the poor [\'85] I. and I [\'85]\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of Letter D}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri-73\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917Tcharrsid5066409 Ibid.}{\rtlch \af0 \ltrch \insrsid4342917 , 57, + Letter 28. This letter is somewhat shorter than the previous one. The phrases missing in this letter are found in the previous one, attesting to the fact that the first was written soon after Joseph Hacohen received the evil tidings, while the second, as + A. David points out in the notes there, was sent apparently because they were not certain that the previous one had reached its destination.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash This letter treats six themes: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls15\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid0000013 Lamentation over the deceased +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}Words of conciliation to the mourner +\par }\pard \ltrpar\ql \li360\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin360\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1. There is no escape from death. +\par 2. God is sanctified by those close to him. +\par }\pard \ltrpar\ql \li360\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin360\itap0\pararsid8259293 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 3. The deceased le}{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 ave}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 a blessing behind him. +\par {\listtext\pard\plain\ltrpar \ltrch \afs4 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls16\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a prayer for the deceased and condolences to the mourner +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1491\'3f. \tab}There is no reason to go to excess with mourning, since we will join the deceased and he will not return. +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1492\'3f. \tab}Accepting Divine Judgment +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1493\'3f. \tab}Words of consolation to the mourner and his mother +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s6\qj \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 Text of the Letter +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +To my friend, the joy of my heart, the honorable Zerahiah Halevy son of my sister, may God protect her, Shalom}{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell My God-fearing close companion. My heart }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 +is }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 broken, for Shaddai has made my lot very bitter}{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Ruth}{\rtlch \af0 \ltrch \insrsid4342917 1:20.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I cried \'93aha\'94}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Ez}{\rtlch \af0 \ltrch \insrsid4342917 . 9:8.}}} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 since from the defeat of mortality there is no escape, young and old}{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid8259293\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e will be sanctified by }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is close ones, and through }{\rtlch +\af0 \ltrch \insrsid8259293\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is angels }{\rtlch \af0 \ltrch \insrsid8259293\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +e will cast reproach. In this I will find comfort, for the act of yanitv, sadness, and lack, \line for\line the salvation of worlds, my heart is in the house of the King, by his soul leaving a blessing behind, and what can be \line done\cell +}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard\plain \ltrpar +\s17\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 +except to beseech the Lord that he store it with the other souls of his pious ones and grant consolation to the pious\line soul}{\rtlch \af156 \ltrhh \insrsid13653733\charrsid1781117 ,}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 \line +master of our Torah, your father, }{\rtlch \af156 \ltrch \insrsid13653733\charrsid1781117 of blessed memory}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 +, and that he wipe away the tears from our faces, for what benefit do we gain from fasting and wailing\line nd eulogy sackcloth and ashes, to mourn for him, while we will go to him, and he will not return to us}{\rtlch \af156 \ltrch +\insrsid13653733\charrsid1781117 ?}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 \line And you, too, my friend, do not raise your voice to say that }{\rtlch \af156 \ltrch \insrsid13653733\charrsid1781117 all }{\rtlch \af156 \ltrch +\insrsid12391429\charrsid1781144 is over}{\rtlch \af156 \ltrch \insrsid13653733\charrsid1781117 ;}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 that }{\rtlch \af156 \ltrch \insrsid13653733\charrsid1781117 which w}{\rtlch \af156 \ltrch +\insrsid12391429\charrsid1781117 as decreed, God has accomplished. For there is\line nothing\line new}{\rtlch \af156 \ltrch \insrsid13653733\charrsid1781117 ;}{\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + everything comes from the earth and returns to it, and far be it from us to sin against the Lord. We must only\line accept\cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 +\ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone +\clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row +\ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell His Divine Judgment for }{\rtlch \af0 \ltrch \insrsid13653733\charrsid1781117 H}{\rtlch \af0 +\ltrch \insrsid3308931\charrsid1781117 e is righteous and upright. He c}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ould kill us, if }{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +e would }{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 but }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 wish so. }{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 N}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +ow hark to my voice, and wipe the tear from your face and gird your loins like a man, be strong and of good courage, and console your mother, my sister, who is sighing }{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 and }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 desolate}{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and }{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 who }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 mourn}{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the husband of her youth}{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 .}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 As }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 much as I can}{\rtlch \af0 \ltrch \insrsid3308931\charrsid1781117 , I}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 will be for her\line and for you\line my friend, my companion, a brother and son, and I will favor you whenever I am able\'85\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par \page [13] Two Letters of Condolence from Venice, Italy (early Seventeenth century)}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 + Two letters from London mss. (British Library) Or. 5396 (Margaliouth catalog No. 1110, Institute of Microfilmed Hebrew Manuscripts, Jerusalem, film 6451), ff. 154b\endash +155a. I wish to thank the British Library and Dr. Mordechai Glatzer who helped me decipher the manuscript.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par +\par a) }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 a Condolence letter on the death of a brother}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1924178 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash + the name is }{\rtlch \af0 \ltrch \insrsid1924178\charrsid1781117 not }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 clarified. The date and place }{\rtlch \af0 \ltrch \insrsid1924178\charrsid1781117 of the }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 letter: Venice, 24 of Menahem [Av] 5377 (1617). The letter offered condolence on the death of a brother. }{\rtlch \af0 \ltrch \insrsid1924178\charrsid1781117 Either t}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +he letter writer, the sender, or }{\rtlch \af0 \ltrch \insrsid1924178\charrsid1781117 the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +copyist is apparently R. Judah Aryeh of Modena. The orthography is a practiced Italian hand and difficult to read. Most of the letter is based on biblical verses. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter deals with the following topics: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls17\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The sadness felt by the writer upon hearing the evil tidings +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}Praise of the deceased +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls17\adjustright\rin0\lin720\itap0\pararsid1924178 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The death of a righteous person }{\rtlch \af0 \ltrch \insrsid1924178\charrsid1781117 lleaves a mark}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1491\'3f. \tab}Accepting Divine Judgment +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1492\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls17\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The consolation the soul finds reposing in the Lord\rquote s sanctuary +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par Text of the Letter: +\par +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil +\cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 1\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11803606 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Long enough have we endured}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10636918 Psalms}{\rtlch \af0 \ltrch \insrsid4342917 123:4.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 wailing, bitter weeping,}{\rtlch \af32a1 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Jer. 31:14.}}} +{\rtlch \af0 \ltrch \insrsid11803606\charrsid1781117 drinking of the bitter root}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid11803606\charrsid1781117 }{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 3:15.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 bad news +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid2970695 {\rtlch \af0 \ltrch \insrsid2970695\charrsid1781117 m}{\rtlch \af0 \ltrch \insrsid12803034\charrsid1781117 akes the bones feeble}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 See }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Prov}{\rtlch \af0 \ltrch \insrsid4342917 +. 15:30, \'93Good news puts fat on the bones.\'94}}}{\rtlch \af0 \ltrch \insrsid12803034\charrsid1781117 and when}{\rtlch \af0 \ltrch \insrsid2970695\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12803034\charrsid1781117 the news came of t}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 he capture of the Ark of the God,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 1 }{\rtlch +\af0 \ltrch \i\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \insrsid4342917 4:19.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the eyes of all Israel }{\rtlch \af0 \ltrch \insrsid2970695\charrsid1781117 were }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 on him, the breath of our life, the Lord\rquote s anointed,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 4:20.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the glory +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of the g +eneration and its splendor, our master and sage, your brother, of blessed and pious memory, the sun shall be dark from his leaving us}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 13:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par and the stars withdraw their brightness}{\rtlch \af0 \ltrch \insrsid2970695\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid16335552 Joel}{\rtlch \af0 \ltrch \insrsid4342917 2:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for our stronghold has been stolen,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 See }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 24:13, \'93for your stronghold is destroyed.\'94}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 the father of all who sit in tents and amidst herds}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Gen}{\rtlch \af0 \ltrch \insrsid4342917 . 4:20.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of Torah, \cell }\pard \ltrpar +\ql \li-111\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell +teaching it as Law, highly regarded by the Jews,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Esther}{\rtlch \af0 \ltrch \insrsid4342917 3:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he alone remains of the healers.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Josh}{\rtlch \af0 \ltrch \insrsid4342917 . 13:12, \'93he was the last of the remaining Rephaim.\'94}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 The healers pulled him to his [eternal] sleep. Where is the one who could count? Where is the one who could weigh?}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 33:18. See also }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Hagigah}{\rtlch \af0 \ltrch +\insrsid4342917 15b.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a lion of the company.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Shabbat}{\rtlch \af0 \ltrch \insrsid4342917 111b.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par Woe to the generation that has lost its provider and woe to the ship that has lost its pilot.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 See }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 baba Bathra}{\rtlch \af0 \ltrch \insrsid4342917 91b, \'93Woe to the world that has lost its leader and woe to the ship that has lost its pilot.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + His booth has fallen, his hedge has departed, calling him \'93Repairer of }{\rtlch \af0 \ltrch \insrsid1377594\charrsid1781117 fallen walls, restorer of lanes.}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'94}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 28:12.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Oh, that my head were water}{\rtlch \af0 \ltrch \insrsid1377594\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \af0 \ltrch \insrsid1377594\charrsid1781117 m}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 y eyes a fount of tears:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Jer}{\rtlch \af0 \ltrch \insrsid4342917 . 8:23.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 it is +not sufficient to cry for the righteous person, he is gone, all the house of Israel \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid1377594 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 shall bewail}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Lev.}{\rtlch \af0 \ltrch \insrsid4342917 10:6.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the boughs }{\rtlch \af0 \ltrch \insrsid1377594\charrsid1781117 will }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 drip with moisture,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 }{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid16338915 Num}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 . 24:7.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 one who is worthy of palm-groves stretching out}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 }{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid16338915 Num}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 . 24:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 over a river and spring +\par waters, the death of a righteous man from any place makes}{\rtlch \af0 \ltrch \insrsid1377594\charrsid1781117 a mark}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote +\ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 See }{\rtlch \ai\af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid16338915 Gen. Rabbah}{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid4342917 68 (p. 775); }{\rtlch \ai\af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid16338915 Rashi}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 on }{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid16338915 Vayetze}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 28:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Not only in the family +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 or tribe, in every city and in every province,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Esther}{\rtlch \af0 \ltrch \insrsid4342917 8:1 +7.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 but in all the Diaspora of Israel a great mourning +\par for the Jews}{\rtlch \af0 \ltrch \insrsid1377594\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 with weeping and wailing.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid16338915 Esther}{\rtlch \af0 \ltrch \insrsid4342917 4:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + Go forth and see if the pain will increase greatly for a small gnat +\par such as }{\rtlch \af0 \ltrch \insrsid1377594\charrsid1781117 I, the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 day for which I boasted. My heart is convulsed within me; terrors of death assailed him.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 + 55:5, where it states \'93assail me.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrqa\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 15\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid1377594 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 He does not let me catch my breath,}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 9:18.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for all toil there is some gain.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Prov}{\rtlch \af0 \ltrch \insrsid4342917 . 14:23.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 For a brother +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 trodden is more formidable than a stronghold like the bars of a fortress.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Prov}{\rtlch \af0 \ltrch \insrsid4342917 +. 18:19.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 About all of you I know that your strength is spent +\par on account of your groaning,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 +\ltrch \insrsid4342917 23:2, where it states \'93My strength is spent on account of my groaning.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 yet this is not too baffling for me,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Deut}{\rtlch \af0 \ltrch \insrsid4342917 +. 30:11, where it states \'93is not too baffling for you.\'94 }}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 even by your wisdom +\par and your discernment}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Deut}{\rtlch \af0 +\ltrch \insrsid4342917 . 4:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that you know there is a judgment}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 19:29.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for this applies to all mankind,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Eccl}{\rtlch \af0 \ltrch \insrsid4342917 +. 12:13.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [to] the greatest of giants though he grows +\par as high as the sky.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 +\ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 + 20:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Prepare your hearts for the will of God and to Him you shall express gratitude and bend your knees and your assurances\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 20\cell }\pard \ltrpar +\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid5833938 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 soothe his soul}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 94:19.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + who when on high will become refined in his good thoughts and deeds, of blessed memory, and He will make the tabernacle of Shiloh, the tent He hadEF set among men, }{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 78:60.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to dwell in the light}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 2 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Chron.}{\rtlch \af0 \ltrch \insrsid4342917 6:1.}} +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of the Lord, d}{\rtlch \af0 \ltrch \insrsid5833938\charrsid1781117 wellings of refuge, for thus says}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + the Lord, for sufficient are our woes and your woes}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 + This line appears separately at the top of manuscript folio 155.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and in Jerusalem is my consolation: Venice 24 Menahem 5377 (= 1617). +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s1\qj \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch \af0\afs28\alang1037 \ltrch \fs28\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0\afs24 \ltrch +\fs24\insrsid12391429\charrsid1781117 b) }{\rtlch \ai\af0\afs24 \ltrch \i\fs24\insrsid12391429\charrsid1781117 Condolence letter from a Grandson to His Grandfather}{\rtlch \af0\afs24 \ltrch \fs24\insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid11747594 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and Its Recipient}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \emdash The letter opens without any name or address and appears }{\rtlch \af0 \ltrch \insrsid11747594\charrsid1781117 as }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +the continuation of folio 155a. The orthography is i +dentical to that of the previous letter. From the signature of the letter it is apparently the grandson who is writing to his grandfather (although in the body of the letter one does not find any expression of familial relation}{\rtlch \af0 \ltrch +\insrsid11747594\charrsid1781117 ship}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of grandson to grandfather). +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash a collection of biblical citations that express sorrow and agony. The letters deals with the following topics: + +\par The sorrow felt by the writer upon the untimely death of his relative +\par Accepting the Divine Judgment +\par Words of condolence +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par +\par \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell The sound of a mighty force,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 13:4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + from a[p]athy(?) tidings saying for death has entered our fortresses to cut off}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Jer. 9:20, +\'93for death has climbed through our windows, has entered our fortresses, to cut off babes.}{\ltrch \rtlch \f0\fs20\lang1037\insrsid4342917 \'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the beloved of my soul +\par and my upright, faithful, beloved, sweet and pleasant, my pain plunged, and my body is stricken and withered like grass.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 102:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 pangs gripped me +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid11747594 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 like a woman in travail}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrd\lan%np1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 21:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I clapped hand}{\rtlch +\af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:15.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 on thigh, I refused to be comforted, how could he wither before his time, his boughs flourishing}{\rtlch \af0 \ltrch \insrsid11747594\charrsid1781117 ?}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 15:32, +\'93He will wither before his tiSe, his boughs never having flourished.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a blameless, upright man who fears God,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 1:8.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + beloved on high, pleasant below, when I think of this, I pour out my soul}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrparX \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 42:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid1648584 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 of our loving together, wretched and humiliated, I walked about with him as though it were my brother}{\rtlch \af0 \ltrch \insrsid1648584\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 35:14.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid1648584\charrsid1781117 I}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 n the past I had a comforter +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 who might revive my spirit.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote +\ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 1:16.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + Alas! The Lord in His wrath has shamed}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 +\ltrch \insrsid4342917 2:1.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a man for whom these are for him, he dies, he is brought to the house assigned for all the living.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 30:23.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid1648584 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The hair of my flesh bristles}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 4:15.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + when I mention him, my bereavement,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch +\insrsid4342917 35:12.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 crushing my bones}{\rtlch \af0 \ltrch \insrsid1648584\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 4211.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 even as I wail and cry out}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 30:20.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par to you Lord who I know like an arrow pierces your liver}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Prov. 7:23.}}} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and your honor will come to the dust}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 7:6, \'93and lay my body in the dust.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 from exalting such a wonderful +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 precious gem as this, for who can go to the divine while his mouth be filled with arguments}{\rtlch \af0 +\ltrch \insrsid1648584\charrsid1781117 ?}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 +\ltrch \insrsid4342917 23:4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid1648584\charrsid1781117 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e will accept }{\rtlch \af0 \ltrch +\insrsid1648584\charrsid1781117 both }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 good }{\rtlch \af0 \ltrch \insrsid1648584\charrsid1781117 and}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell }\pard \ltrpar +\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid002048 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 bad,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsi1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Eccl}{\rtlch \af0 \ltrch \insrsid4342917 . 12:14.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and we concede in the midst of the +event that He is the fashioner, He is the determiner.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch ]`f0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 See }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Avot}{\rtlch \af0 \ltrch \insrsid4342917 4:22, \'93He is the fashioner, He the creator, He the discerner.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid1648584\charrsid1781117 L}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 et us bow down and kneel, and bend the knee}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 95:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 He will send an end to darkness}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 28:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and to all disasters,}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Text reads }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93mg\lquote \'93; }{\rtlch \af0 \ltrch +\insrsid4342917 it should be }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93pg\lquote .\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , }{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 I }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Kings}{\rtlch \af0 \ltrch \insrsid4342917 5:18.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ; he will protect those who remain \'85 + May his soul be bound in the bundle of life, he will give to your worthy self +\par and to all accompanying him here with us today, goodness, and blessing, and life, and peace +\par his grandson and his servant in all his tribulations}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 Text reads }{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917 z}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 aroto\'94;}{\rtlch \af0 \ltrch \insrsid4342917 it should be }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93}{\rtlch +\ai\af0 \ltrch \i\cf2\insrsid4342917 z}{\rtlch \ai\af0 \ltrch \i\insrsid4342917 arotav.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \line that he undergoes:\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth817\clshdrawnil \cellx709\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7711\clshdrawnil \cellx8420\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par \page [14] a Letter of Condolence to a Brother-in-law on the Death of His Wife \emdash Sister of the Writer (Italy, 17}{\rtlch \af0 \ltrch \super\insrsid12391429\charrsid1781117 th}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 century) +\par +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1648584 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Author of the Letter and Its Recipient }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \emdash Isaac b. Manoah Lattes, from Cuneo, in the Piedmont region of Italy, wrote this condolence letter in }{\ltrch \af262 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \'f9"\'f4}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 (1620)}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \%0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 On the history of the Lattes family, see J. Buchsenbaum, }{\rtlch \ai\af0 +\ltrch \i\insrsid4342917 Iggerot Melammedim,}{\rtlch \af0 \ltrch \insrsid4342917 Tel Aviv 1986.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to his brother-in-law Jonah b. Solomon Crescas upon +the death of his wife (sister of the letter writer), who passed away }{\rtlch \af0 \ltrch \insrsid14295563\charrsid1781117 i}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 n Adar 2 of that year. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +\par Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter consists of biblical and talmudic citations that the writer applies and adapts to the poetic style he uses to euologize his sis +ter Luna, whom he metaphorically compares to the moon. The letter deals with the following areas: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls18\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Description of the pain and sadness over the death of the sister. +\par {\listtext\pard\plain\ltrpar \s17 \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}}\pard\plain \ltrpar\s17\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls18\adjustright\rin0\lin720\itap0\pararsid16327472 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 Lamentation +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}}\pard\plain \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls18\adjustright\rin0\lin720\itap0\pararsid16327472 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Eulogy +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1491\'3f. \tab}Words of love and consolation. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 :}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 Ms Moscow\endash Ginzberg 114/6, Institute for Microfilmed Manuscripts, film 6794. I express my appreciation to the Moscow Library and to the Institute for Microfilmed Manuscripts and to Dr. Abraham David for his assistance.}} +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par Copy of a letter I sent to my brother-in-law, our honorable teacher Jonah, with the lamentations\line that I recited over the passing of my sister Luna, May her soul be bound up in the bond of everlasting life. +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil +\cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell My dear, esteemed brother-in-law, how difficult it is for us to suf +fer this separation, like the darkness that has has no dawn,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 8:20, \'93there shall be no dawn.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 as beautiful +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid534005 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 as the moon with none to compare, this wise and pleasant one, the }{\rtlch \af0 \ltrch +\insrsid14295563\charrsid1781117 glory of the }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 daughter of the king is }{\rtlch \af0 \ltrch \insrsid14295563\charrsid1781117 inward.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 +\chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 45:14.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid14295563\charrsid1781117 M}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 y sister, your wife \emdash may her soul be bound up in the bond of everlasting life \emdash is gone. }{\rtlch \af0 \ltrch \insrsid14295563\charrsid1781117 N}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 o matter how much I may }{\rtlch \af0 \ltrch \insrsid534005\charrsid1781117 wail}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s21\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid534005 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and be embittered with a broken heart and bitter voice, over this great loss, I will not be able to withhold from sighing my sigh}{\rtlch \af0 \ltrch \insrsid534005\charrsid1781117 s}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , I will groan silently over you and over us +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid534005 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and I will sorely cry \emdash for the one who }{\rtlch \af0 \ltrch \insrsid534005\charrsid1781117 has left }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 never to come back}{\rtlch \af0 \ltrch +\insrsid534005\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Jer}{\rtlch \af0 +\ltrch \insrsid4342917 . 22:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid534005\charrsid1781117 S}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 urely I weep on account of this beauty }{\rtlch \af0 \ltrch +\insrsid534005\charrsid1781117 which }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is going to rot in the earth,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4027135 Berakhot}{\rtlch \af0 \ltrch \insrsid4342917 5b.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and indeed I say, summon the dirge-singers, let them come.}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Jer}{\rtlch \af0 \ltrch \insrsid4342917 . 9:16.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 My being }{\rtlch \af0 \ltrch \insrsid8264474\charrsid1781117 melts}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid8264474\charrsid1781117 a}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 way,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrqar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:11.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 my strength is spent }{\rtlch \af0 \ltrch +\insrsid534005\charrsid1781117 because }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of my groaning,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{ +\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 23:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 over the ruin of the daughter of my people.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang3082\langfe1033\langnp3082\insrsid4342917 }{\rtlch \af0 \ltrch +\i\lang3082\langfe1033\langnp3082\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \lang3082\langfe1033\langnp3082\insrsid4342917 3:48.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 My head is light, my arm light,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang3082\langfe1033\langnp3082\insrsid4342917 }{\rtlch \ai\af0 \ltrch +\i\cf2\lang3082\langfe1033\langnp3082\insrsid4342917\charrsid10430484 H}{\rtlch \ai\af0 \ltrch \i\lang3082\langfe1033\langnp3082\insrsid4342917\charrsid10430484 agigah}{\rtlch \af0 \ltrch \lang3082\langfe1033\langnp3082\insrsid4342917 15b.}}}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 my eyes a fount of tears}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang3082\langfe1033\langnp3082\insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\lang3082\langfe1033\langnp3082\insrsid4342917\charrsid10430484 Jer}{\rtlch \af0 \ltrch \lang3082\langfe1033\langnp3082\insrsid4342917 . 8:23.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 ,\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 5\cell flowing water over the misfortune, I lament for my soul is satiated with bad tidings, I grieve with wailing, and I declare this lament, that I recited over her in stanzas, +\par to lament over her openly in the markets and at the street corners,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid4140030 Song of Songs}{\rtlch \af0 \ltrch \insrsid4342917 3:2, \'93in the streets and the squares.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for it was the Lord\rquote s doing.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid10430484 Josh}{\rtlch \af0 \ltrch \insrsid4342917 +. 11:20.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 From the sorrow of my soul it shed, }{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 119:25, \'93my soul clings to the dust.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I wrote myself a weary scroll, I will lift up my head \cell +}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 8\cell and say in a weak voice:\cell +}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\irdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 9\cell Declare a lament in + bitter voice; for this anguish is as of a woman bearing her first child:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Jer}{\rtlch \af0 \ltrch \insrsid4342917 . 4:31, \'93I hear the anguish as of a woman bearing her first child.\'94 }}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult-90\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell +When the sun set and it was very dark,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Gen}{\rtlch \af0 +\ltrch \insrsid4342917 . 16:17.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for it became }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 le-yonat elem re}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid12391429\charrsid1781117 h}{\rtlch +\ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 okim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 :}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{ +\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 56:1, \'93}{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4027135 al yonat elem re}{\rtlch \ai\af0 \ltrch \i\cf2\insrsid4342917\charrsid4027135 h}{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid4027135 okim}{\rtlch \af0 \ltrch \insrsid4342917 .\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 11\cell My brother come to the gate; the wound embitters us:\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow5\irowband5\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 -65\cell My moon is gloomy,}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 30:28, +\'93I walk about in sunless gloom.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the second Adar turned to mourning and wailing:\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \trowd \irow6\irowband6\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 13\cell The third in seven plus ten; the diadem has been taken from me:\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow7\irowband7\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 14\cell +In every facet she was good; she was like the fruitful vine:}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1030\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 128:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \trowd \irow8\irowband8\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell In the year }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 shin peh}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + [1620] from the creation; her passing making me wrathful \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow9\irowband9\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 16\cell Passed Luna, the fount of discernment; to give of her fruit in the palace of the king:\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow10\irowband10\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 17\cell Though I might wander a great distance, I will find none as worthy as she}{\rtlch \af0 \ltrch \insrsid791178\charrsid1781117 .}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow11\irowband11\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 18\cell I am saddened because her splendor faded away; I cry out, I complain, I moan}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 77:4.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow12\irowband12\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 19 \cell I wo +uld counteract her being crushed; had she not been taken while still young}{\rtlch \af0 \ltrch \insrsid791178\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 28:4, \'93They shall be like an early fig\'85whoever sees it devours it while still in his hand.\'94}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow13\irowband13\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnon \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 20\cell For this my heart is faint within me; I say woe unto me; +\par \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow14\irowband14\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 21\cell I am overwrought, I cannot speak,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 77:5.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 I roar from the groaning of my heart, when my spirit fails, }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 selah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 142:4, \'93When my spirit falls within me.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and in my +eulogizing, I become overwrought about her, with tears flowing }{\rtlch \af0 \ltrch \insrsid791178\charrsid1781117 as }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 pure olive oil}{\rtlch \af0 \ltrch \insrsid791178\charrsid1781117 .}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow15\irowband15\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 22\cell }{\rtlch \af0 \ltrch \insrsid791178\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 his crushing, virtually crushed to less than the worthy size,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Eiruvin}{\rtlch \af0 \ltrch \insrsid4342917 5b; +}{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Hulin}{\rtlch \af0 \ltrch \insrsid4342917 79b.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 an olive was gathered from the topmost branch,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 17:6.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 we labored and had no respite, two berries or three as the gatherer and beater of the \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow16\irowband16\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 23\cell olive, \'85\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow17\irowband17\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 24\cell }{\rtlch \af0 \ltrch \insrsid791178\charrsid1781117 O}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +ur thoughts, agony, and sadness will find relief, saying, this will comfort us, all of these joined forces in Vale of Weeping,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Gen}{\rtlch \af0 \ltrch \insrsid4342917 . 14:3, \'93all the latter joined forces at the Valley of Siddim.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + and one would call to the other,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch +\insrsid4342917 6:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 then one said thus \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow18\irowband18\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch\insrsid12391429\charrsid1781117 25\cell and another said thus,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 I }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Kings}{\rtlch \af0 \ltrch \insrsid4342917 22:20.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 there we wailed and wept,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 137:1.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + until all my soul was spent I had no spirit any more, for your ruin is as vast as the sea,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 2:13.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the Lord gave me to drink\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow19\irowband19\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 26\cell +hemlock and weeping, and the pain increased greatly }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 hu}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'85, and to you my brother, what can I give you as + witness, what can I match with you to console you}{\rtlch \af0 \ltrch \insrsid791178\charrsid1781117 ?}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid4027135 Ibid}{\rtlch \af0 \ltrch \insrsid4342917\charrsid5066409 .}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow20\irowband20\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 27\cell +I am in need of consolation, my Lord will heal the crushing wound. This is my comfort in my affliction, that }{\rtlch \af0 \ltrch \insrsid5848573\charrsid1781117 Y}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 our promise has preserved me,}{\rtlch +\af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \af0 \ltrch +\i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 119:50.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that the deceased of good reputation is happy \cell +}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow21\irowband21\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 28\cell and wor +thy is his portion, that his illness was not as his youth, but this do I call to mind}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 21:3.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 that the neighbor women call her there, saying a bundle of myrrh \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow22\irowband22\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 29\cell has left us, and of the bounteous crop of the moons}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid6452855 Deut}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 . 33:14.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 we have tasted: she was seven and twenty years old, a year for each day, a year to each day,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Num}{\rtlch \af0 \ltrch \insrsid4342917 . 14:34; }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Ez}{\rtlch \af0 \ltrch \insrsid4342917 . 4:6.}}}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 were like the days of the moon;\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow23\irowband23\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 30\cell in clouds of myrrh and frankincence,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid40@7135 Song of Songs}{\rtlch \af0 \ltrch \insrsid4342917 3:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + of bright shining face and eyes shining like the moon, of great charm and Rabbi Hanina [play on Heb. word }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 hen}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 - charm], and the homilet +ic meaning will be understood thusly}{\rtlch \af0 \ltrch \insrsid5848573\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 \trowd \irow24\irowband24\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 +\par page 2 +\par \ltrrow}\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1 +\cell Twenty-seven years of age in sin, at the age of seven in beauty, a God-fearing woman, may she be praised,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Prov}{\rtlch \af0 \ltrch \insrsid4342917 . 31:30.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 therefore I have hope}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn +{\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 3:21; 3:24.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + that her interests and}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Prov}{\rtlch \af0 +\ltrch \insrsid4342917 . 31:18.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 reward be from God, \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 2\cell in happiness in the land of living,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 142:6.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 selah}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 , for her good name and praise, while we for our transgressions survive to groan, she\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 3\cell +the pit [of the grave] will be a resting place for her, in the palaces of the Mothers, and my princess, the one who raised me, my parent [mother] will also tell her, \'93enter in peace, crown of her \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 4\cell husband,\'94}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Prov}{\rtlch \af0 \ltrch \insrsid4342917 +. 12:4, and from the liturgical poem }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93Lekhah Dodi.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the wise women, her mothers, all their bones will say, chanting,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 35:10.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'93enter, O bride; enter, O bride,\'94}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360Yslmclt1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 See \'93}{ +\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid4027135 Lekhah Dodi}{\rtlch \af0 \ltrch \insrsid4342917 .\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and as Sarah and Rachel long ago did not \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell +open a mouth, this I will expound for you, my brother-in-law, that your love will not leave us, for our love for you is more wonderful than the love of women}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 II }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \insrsid4342917 1:26.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and as a peg fixed\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 6\cell in a firm place}{\rtlch \af0 +\ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\lane1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 22:23, \'93 +I will fix him as 5ca3ca7f1af46c13 peg in a firm place.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in each and every time, and with this I will suffice for appealing over my departed one, and I pray to the +one who consoles mourners, may He make us whole again}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid6452855 Hosea}{\rtlch \af0 \ltrch \insrsid4342917 6:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow5\irowband5\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwjidth6H5\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 7\cell +and show us consolation of Zion, where he will comfort us for our agony in the building of his hall and in their well-being among all of His people Israel, and he will fulfill for us the verse, \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow6\irowband6\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl-2726409648626460095\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 8\cell +saying, He will destroy death forever, My Lord God will wipe the tears away}{\rtlch \af0 \ltrch \insrsid5848573\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 25:8.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid5848573\charrsid1781117 Y}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 ou shall find comfort in Jerusalem}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 66:13.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 [written at] Cuneo}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 The letter writer was from Cuneo.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'85\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow7\irowband7\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 9\cell In the year 5380}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 Hebrew numerology.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (= 1620) it is most holy,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Lev.}{\rtlch \af0 \ltrch \insrsid4342917 6:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow8\irowband8\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell +My eyes pine away from affliction;}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch +\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \af0 \ltrch +\i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 88:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 my heart is astir, I am like +a sea lion; I am the man who has known affliction;}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 3:1.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow9\irowband9\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 11\cell a wounded gnat Isaac Lattes: your brother-in-law and your servant writing tearfully: reciting the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 shema}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \'85\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow10\irowband10\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl +\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 13\cell My master and ruler, my esteemed brother-in-law Jonah Crescas of the Nice community.\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow11\irowband11\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidh1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row }\pard \ltrpar\ql %n0\ri0\sl480\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s27\qj \fi-357\li357\ri0\sb120\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin357\itap0 \rtlch \af0\afs24\alang1037 \ltrch \scaps\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 [15] Condolence Letter over the Death of an Ere}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 z}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Israel Gabbai in Cincinnati +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Authors of the Letter and the Recipient}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash This letter was written by rabbis and leaders of Sefardi and Ashkenazi communities in Tiberia}{\rtlch \af0 \ltrch \insrsid3813420\charrsid1781117 s}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , on 17 Kislev 5643 (1883). The letter is directed to \'93Pekidei ve-Amarkalei Arei ha-Kodesh\'94 in Amsterdam through whom the Tiberians received contributions collected in Cincinnati, Ohio. +\par }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Content of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash The letter contains words of consolation over the death of R. Haim Mazias, the Ere}{\rtlch \af0 \ltrch +\cf2\insrsid12391429\charrsid1781117 z}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Israel g +abbai in Cincinatti, who passed away on the first of Heshvan 5743. The letter deals, among other things, with praise for the deceased and for his many charitable acts on behalf of Ere}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 z}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 Israel.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 + One page in a ms. measuring 26x24 cm (Ms. 3172, JTSA Library \endash New York); I +would like to express my gratitude to the library for permission to publish this ms. The letter includes four short introductory lines and 19 lines of text. At the end are the holographs of ten rabbis and community leaders of Ashkenazic and Sefardic commu +n +ities in Tiberias. On the right side are signatures of rabbis and leaders of the Sefardic community: Abraham Halfon, Joseph David Abulafia, and Simon Ivri; on the left, the signatures of the rabbis and leaders of the Ashkenazic community: Abraham Joseph H +alevy, Mordecai ?, Yisachar Berish}{\rtlch \af0 \ltrch \insrsid4342917\charrsid1276346 , Samuel Shemayah Hacohen, Aaron Samuel ben Adoni }{\rtlch \af0 \ltrch \insrsid4342917 +Avi ha-Rav, Abraham Abali Baharab Todros Hacohen, Haim Baratz Zevi Hirsch Shub. On these scholars, see E. Avisar, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 Sefer Teveryah }{\rtlch \af0 \ltrch \insrsid4342917 (The book of Tiberias) (Jerusalem, 1973), 272 +\endash 312.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The letter covers six themes, namely: +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1488\'3f. \tab}}\pard \ltrpar\ql \fi-360\li720\ri0\sl480\slmult1\widctlpar +\tx360\jclisttab\tx720\faauto\ls19\adjustright\rin0\lin720\itap0\pararsid16327472 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Opening greetings to the community leaders +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1489\'3f. \tab}The notice received about the death of R. Haim Mazias +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1490\'3f. \tab}Lamentation and eulogy +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs44\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1491\'3f. \tab}The good that awaits the departed one +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1492\'3f. \tab}The community\rquote s pledge for Torah study in memory of the deceased +\par {\listtext\pard\plain\ltrpar \ltrch \afs2 \rtlch \f262\fs24\lang1037\insrsid12391429\charrsid1781117 \u8207\'3f\u1493\'3f. \tab}Soothing words and condolences to the deceased\rquote s family +\par }\pard\plain \ltrpar\s17\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af156\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af156 \ltrch \insrsid12391429\charrsid1781117 + +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 +Text of the Letter}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 : +\par (The letter is divided according to the order of the rows in the original.) +\par B\'94H 23 Tevet 5643 (1883) +\par \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 1\cell }\pard\plain \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl +\tx360\faauto\adjustright\rin0\lin189 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \'93 +To the noble one of the children of Israel the pillars and stanchions upon which the Jewish community stands, they are their kings their princes who stand at the ready to the aid of the Lord among the warriors. +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid3813420 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 To you sirs who are of the high masters, princes, and deputies of the Pekidi ve-Amarkalei Ere}{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 z}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + Israel who belong to }{\rtlch \af0 \ltrch \insrsid3813420\charrsid1781117 the}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 great Jewish community +\par Amsterdam}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 , }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 may He protect it, Amen}{\rtlch \af0 \ltrch \insrsid3813420\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + Lord}{\rtlch \af0 \ltrch \insrsid3813420\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 may You protect them and encompass all of them with favor and take them +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and bear them forever among the stars with their radiance, may it be His will, Amen}{\rtlch \af0 \ltrch +\insrsid3813420\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA72\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1 +\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 5\cell }\pard\plain \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\txjA360\faauto\adjustright\rin0\lin189\pararsid3813420 \rtlch +\af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid3813420\charrsid1781117 F}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 rom receipt of your pure letter, written on the 11}{\rtlch \af0 +\ltrch \super\insrsid12391429\charrsid1781117 th}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of Marheshvan 5643}{\rtlch \af0 \ltrch \insrsid3813420\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid3813420\charrsid1781117 w}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 e saw that was written, we read the text, and there descended on us a great \line +darkness, and we became sorely anxious over the bad tidings that were real, for the reaper has come, the powerful has become chaff. Of the taking away of the ark of the Lord, the righteous rabbi Morenu ve-Rabbenu }{\rtlch \ab\af0 \ltrch +\b\insrsid12391429\charrsid1781117 Hayyim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 b. R. David }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Mazias}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +, of blessed memory, born in Biale, +\par }\pard \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +at the end of the Sabbath, the eve of Sunday, on the New Moon of Heshavan 5643. He who was the gabbai for the Land of Israel among the Jewish community of }{\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 Cincinnati}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and the surrounding towns, who served steadfastly many years, seeking the good of his people, and all of his deeds were carried out faithfully, +\par performed wholeheartedly. During this righteous person\rquote s entire life, he tried to enhance the benefit for the reside +nts of the communities of the Four Lands, woe to the land of Israel which has lost this great man, a man suffused entirely with holiness and piety. For a }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 hakham}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 who has died we have no +\par replacment. There is no pious one, no humble one, woe to the ship that has lost its captain. And on the day we heard this bad tiding, shaking the land of Israel 400 }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 parsot}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 by 400 }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 parsot}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +, and so great was it on that day and the sound of moaning was heard. We found angels of peace crying bitterly,\cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA72\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 10\cell }\pard\plain \ltrpar +\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189\pararsid2189740 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +What has the Lord done to us by putting out our right eye}{\rtlch \af0 \ltrch \insrsid2189740\charrsid1781117 ?}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 1 }{ +\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Samuel}{\rtlch \af0 \ltrch \insrsid4342917 11:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid2189740\charrsid1781117 Who }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 will protect us, a leader at our head}{\rtlch \af0 \ltrch \insrsid2189740\charrsid1781117 ?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The sun was dark when it rose}{\rtlch \af0 \ltrch +\insrsid2189740\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid10882959\charrsid1781117 }{\ltrch \rtlch \cs16\f0\fs24\lang1037\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\ltrch \rtlch \cs16\f0\fs20\lang1037\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{ +\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 13:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and the moon darkened, and the stars withdrew their brightness}{\ltrch \rtlch +\f0\fs24\lang1037\insrsid12391429\charrsid1781117 .}{\ltrch \rtlch \cs16\f0\fs24\lang1037\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\ltrch \rtlch \cs16\f0\fs20\lang1037\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{ +\rtlch \af0 \ltrch \i\insrsid4342917\charrsid16335552 Joel}{\rtlch \af0 \ltrch \insrsid4342917 2:10.}}}{\ltrch \rtlch \f0\fs24\lang1037\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Over this the earth will mourn,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid4027135 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid15421667 Jer}{\rtlch \af0 \ltrch \insrsid4342917 . 4:28.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and a stone from the wall,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid15421667 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid15421667 Habakkuk}{\rtlch \af0 \ltrch \insrsid4342917 2:11.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 writhing and screaming in her pangs,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid15421667 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 26:17.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for the kings of Judea and its princes, for them it is fitting +\par for the weeping, weeping of the rivers, for them it is fitting to lament as sadly as jackals, as mournfully as the ostriches.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 }{\rtlch \af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid14447357 Micah}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 1:8.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189\pararsid10882959 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 That day is a day of distress and chastisement,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 2 }{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid1276346 Kings}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 19:3.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 a day of calamity and desolation,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 }{\rtlch \ai\af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid1276346 Zeph}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 . 1:15.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 for there the shield of warriors lay rejected,}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 2 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \insrsid4342917 1:21.}}} +{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 one in a generation, he is its glory, he is its splendor, as we said in his shadow we will live,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 4:20.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 like a lofty wall.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 30:13.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Because of this our hearts are sick, because of these our eyes are dimmed,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs0\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid11416988 Lam.}{\rtlch \af0 \ltrch \insrsid4342917 5:17.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that our eyes may run with water,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1276346 Jer}{\rtlch \af0 \ltrch \insrsid4342917 +. 9:17, where it is written: \'93That our eyes may run with tears.\'94}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 over that very beauty wasted in the soil.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote +\ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \insrsid4342917 See}{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid15421667 Berakhot }{\rtlch \af0 \ltrch +\insrsid4342917 5b.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Who can tell all the mighty acts of the Lord, proclaim all His praises,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 }{\rtlch \af0 \ltrch +\i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 106:2.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + and our voice like the voice of mighty waters to make his voice heard on high. To stir the heart of our fellow Jews. +\par }\pard \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189\pararsid10882959 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +To hold on toc a fortress of the Holy Land, to have pity on the earth, the dwellers of Machtesh}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch Tfs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid1276346 Zeph}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 . 1:11.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 the poor and the wise of Erez Israel, who live in need and sorrow in my dwelling and from excess of work, and daily they will seek }{\rtlch \af0 \ltrch \insrsid10882959\charrsid1781117 H}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 im, and surge to }{\rtlch \af0 \ltrch \insrsid10882959\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +im from the ends of the earth and faraway seas. Bundles on their shoulders, their vows and their donations +\par }\pard \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +as pledged by each man according to his blessedness, for the four lands of the living, may they be built and set up firmly +soon in our days. And it is incumbent upon them to take his word to strengthen their hand (i.e., to support the poor) so that they should do wisely in all that }{\rtlch \af0 \ltrch \insrsid10882959\charrsid1781117 they }{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 do. Ask now and see, to where has the chief herdsman gone,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1031\langfe1033\langnp1031\insrsid4342917 1 }{\rtlch \af0 \ltrch \i\lang1031\langfe1033\langnp1031\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \lang1031\langfe1033\langnp1031\insrsid4342917 21:8.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and where }{\rtlch \af0 \ltrch \insrsid12651379\charrsid1781117 he }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 has left his flock. They are astray\cell }\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \trowd \irow2\irowband2\ltrrow +\ts11\trgaph108\trleft-108\trftsWidth1\trftsWidthA3\trwWidthA72\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt +\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7853\clshdrawnil \cellx8420\row \ltrrow}\trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth7925\clshdrawnil \cellx8492\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 15\cell }\pard\plain \ltrpar +\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189\pararsid12651379 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +in the land}{\rtlch \af0 \ltrch \insrsid12651379\charrsid1781117 ,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid1276346 Ex}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 . 14:3.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 scattered to all its corners. }{\rtlch \af0 \ltrch \insrsid12651379\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is pathways are not known, for a wind blew in him, and he was still in his prime}{ +\rtlch \af0 \ltrch \insrsid12651379\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid12651379\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +hey called, often to gaze upon the beauty of the Lord, to frequent His temple.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 27:4.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 As the mortal has passed away the pain has grown considerably, but what can we answer}{\rtlch \af0 \ltrch \insrsid12651379\charrsid1781117 ?}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 He is righteous +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0\pararsid12651379 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 and righteous is }{\rtlch \af0 \ltrch \insrsid12651379\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +is judgment. So declared His wisdom, may He be blessed, blessed is the One who decrees the judgment. May it be His will that his good deeds will be remembered in + the world that is all good, and may the soul of our fellow be bound up forever in the bundle of life,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1036\langfe1033\langnp1036\insrsid4342917 1 }{\rtlch \af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid4140030 Sam.}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 25:29.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 the deceased will enjoy the holy fruits of the heavens with the souls of the heavenly }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 Hasidim}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch\insrsid12391429\charrsid1781117 who sit before the Lord and enjoy the splendor of }{\rtlch \af0 \ltrch \insrsid3028086\charrsid1781117 H}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is Divine presence. The righteous one}{\rtlch \af0 \ltrch \insrsid5536099\charrsid1781117 s}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + sit with their crowns on their heads. His holy work has passed, and he now prays for his children and actions. Let it be for them a shield,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \ai\af0 \ltuch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid1276346 Deut}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 . 32:38.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 an encircling shield}{\rtlch \af0 \ltrch\insrsid5536099\charrsid1781117 .}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1 +\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch +\lang1036\langfe1033\langnp1036\insrsid4342917 }{\rtlch \af0 \ltrch \i\lang1036\langfe1033\langnp1036\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \lang1036\langfe1033\langnp1036\insrsid4342917 91:4.}}}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid5536099\charrsid1781117 D}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 o not see a sign like this anymore (i.e., pain and mourning).}{\rtlch \af0 \ltrch +\insrsid5536099\charrsid1781117 F}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 rom now on may we be destined for good, and sorrow and sigh flee,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar +\pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 +\chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 35:10.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and may there be well-being, praise, and joy. In }{ +\rtlch \af0 \ltrch \insrsid3028086\charrsid1781117 their }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 old age they still produce fruit,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 92:15.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 they rejoice in their going forth and are glad in their returning,} +{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 From the liturgical poem for the Sabbath, }{\rtlch \ai\af0 \ltrch \i\insrsid4342917 \'93el Adon.\'94}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and wealth and happiness at their right and at their left}{\rtlch \af0 \ltrch \insrsid3028086\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid3028086\charrsid1781117 H}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is produce shall not bend to the earth}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 15:29.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (}{\rtlch \af0 \ltrch \insrsid3028086\charrsid1781117 m}{\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 ay it be the will of the Lord). And for all the people of the congregation he shall make expiation.}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4403687 Lev.}{\rtlch \af0 \ltrch \insrsid4342917 16:33.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 The Lord be with you,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1276346 Ex}{\rtlch \af0 \ltrch \insrsid4342917 . 10:10.}} +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 you and your children,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 115:14.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 may there be well-being within their ramparts, peace in their citadels,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 122:7.}}}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 may there yet be heard in their courtyards the sound of mirth and gladness}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1276346 Jer}{\rtlch \af0 \ltrch \insrsid4342917 . 7:34.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 (Amen. May it be the will of the Lord)}{\rtlch \af0 \ltrch +\insrsid3028086\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 We ourselves clarified concerning that which is obligatory upon us by inquiring of ten }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 talmidei hakhamim}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 from among the scholars and rabbis \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567 +\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7925\clshdrawnil \cellx8492\row \ltrrow}\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin0 {\rtlch +\af0 \ltrch \insrsid12391429\charrsid1781117 20\cell }\pard\plain \ltrpar\s20\ql \fi-189\li189\ri0\sl480\slmult1\widctlpar\intbl\tx360\faauto\adjustright\rin0\lin189 \rtlch \af0\afs24\alang1037 \ltrch +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of the Sephardi}{\rtlch \af0 \ltrch \insrsid3028086\charrsid1781117 c}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + community and of the Ashkenazi}{\rtlch \af0 \ltrch \insrsid3028086\charrsid1781117 c}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + community, and we took upon ourselves the study of the Zohar and passages of the Mishnah in the amount determined by the rabbis for the benefit of his soul, and we lit olive oil upon the grave of the holy }{\rtlch \ai\af0 \ltrch +\i\insrsid12391429\charrsid1781117 tana}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Rabbi Meir BA\rquote al ha-Nes, May his virtue stand us in good stead, for the repose of his soul, and after the study +\par we conduct}{\rtlch \af0 \ltrch \insrsid3028086\charrsid1781117 ed}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the prayer for the dead for the Rabbi, the }{\rtlch \af0 \ltrch \cf2\insrsid12391429\charrsid1781117 Z}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 addik, of blessed memory, and to differentiate between the dead and the living we made a blessing (}{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mi she-beirakh)}{\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 over his descendants. And so we shall do, God willing, on the anniversary [of his death]. May it be God\rquote s will that his soul live a happy life and his children shall inherit the land,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid3356114 Ps.}{\rtlch \af0 \ltrch \insrsid4342917 25:13. +}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the cry \'93Wrack and ruin\'94 shall no more be heard in their land,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar +\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch +\af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 60:18.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 my Lord God wipe the tears away,}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch \af0 \ltrch \i\insrsid4342917\charrsid4140030 Is.}{\rtlch \af0 \ltrch \insrsid4342917 25:8.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 He will destroy death forever,}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 \tab }{\rtlch +\ai\af0 \ltrch \i\insrsid4342917\charrsid15421667 Ibid}{\rtlch \af0 \ltrch \insrsid4342917\charrsid5066409 .}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 they shall never languish again.}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid15421667 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1276346 Jer}{\rtlch \af0 \ltrch \insrsid4342917 . 31:11.} +}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Their children are with them always}{\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch\af0\afs20\alang1037 \ltrch \fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \af0 +\ltrch \i\insrsid4342917\charrsid10509721 Job}{\rtlch \af0 \ltrch \insrsid4342917 21:8.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and their descendants will spend their days and years well. Length of days, years of life and well being,}{ +\rtlch \af0 \ltrch \cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \cs16\super\insrsid4342917 \chftn }{\rtlch \af0 \ltrch \insrsid4342917 }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1276346 Prov}{\rtlch \af0 \ltrch \insrsid4342917 . 3:2.}} +}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 Amen, may thisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthis all be fulfilled, and as well all the words of the sighing and moaning who sign here in the holy city of Tiberias, may it be rebuilt. 15 Kislev 5643 from the creation, with great stren +gth and peace.\'94\cell }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 \trowd \irow4\irowband4\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone +\cltxlrtb\clftsWidth3\clwWidth675\clshdrawnil \cellx567\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth7925\clshdrawnil \cellx8492\row }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar +\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard\plain \ltrpar\s21\qj \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid11090010 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\insrsid12391429\charrsid1781117 The feature common to all the letters presented here is their special style that generally included great }{\rtlch \af0 \ltrch \insrsid10445282\charrsid1781117 shock }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +or an expression of sorrow over the misfortune that had occurred, showering praises on the deceased (the crowns placed on the head of the deceased}{\rtlch \af0 \ltrch \insrsid11090010\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + }{\rtlch \af0 \ltrch \insrsid11090010\charrsid1781117 which }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +depended upon the closeness of the relation to the deceased, his stage in life, and the status of his family members), a sense of loss and the great void left by the deceased\rquote s no longer being present, statements containing acce +ptance of the Divine judgment or expressions intended to express the uselessness of excessive mourning, words of consolation and blessing for the mourner\rquote s family. Depending on the writer and recipient of the letter, other topics might be added. + +\par }\pard\plain \ltrpar\s6\qj \li0\ri0\sl480\slmult1\keepn\widctlpar\tx360\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch \ab\af0\afs24\alang1037 \ltrch \b\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch +\scaps\insrsid12391429\charrsid1781117 +\par B. Condolence by Telephone +\par }\pard\plain \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 \rtlch \af0\afs24\alang1037 \ltrch \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +On the development of the custom \emdash Does one fulfill the commandment of \'93consoling mourners\'94 through a telephone call? Naturally this type of question could only have been raised in recent generations. The first person to have dealt with +this is Rabbi Moses Feinstein (Lithuania\endash U.S., 20}{\rtlch \af0 \ltrch \super\insrsid12391429\charrsid1781117 th}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 century), in his work }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 +Iggerot Moshe}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , where he writes: "Regarding consoling mourners there are two }{\rtlch \af0 \ltrch \insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 s: +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid11090010 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +First, for the benefit of the living, who are very involved with their grief, a person is obligated to appeal to }{\rtlch \af0 \ltrch \insrsid11090010\charrsid1781117 [the mourner\rquote s }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 feelings}{ +\rtlch \af0 \ltrch \insrsid11090010\charrsid1781117 ]}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and to console him}{\rtlch \af0 \ltrch \insrsid11090010\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + and for this people are also obligated to go to the home where the mourner is located. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid14948990 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \tab +Second, for the benefit of the dead, as written in Shabbat 152a: "A deceased person who has no [official] mourners," since in any event we know that where there are consolers, it is of benefit to the dead \'85 + this means for me that on behalf of the living mourner, it is }{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117 possible }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to fulfill the obligation by means of the telephone}{\rtlch \af0 \ltrch +\insrsid10764079\charrsid1781117 as well}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 , but }{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117as regards }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the }{\rtlch \ai\af1024 \ltrch +\i\insrsid12391429\charrsid1781117 mitzvah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 that is on behalf of the dead, it is }{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117 only }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +fitting that one go there to the place where oold pays condolences, or to the place where he died. }{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117 E}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ven i}{\rtlch \af0 \ltrch +\insrsid10764079\charrsid1781117 n}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117 regard to }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 the living mourner}{\rtlch \af0 \ltrch +\insrsid10764079\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 it is certainly preferable that whe}{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117 n}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch +\insrsid10764079\charrsid1781117 [the consoler] }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 goes there he also hono +rs him, since he himself is also part of the condolences, as in the words of R. Akiba, when his sons died and all the Jews eulogized them\'85}{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117 T}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 he } +{\rtlch \af0 \ltrch \insrsid554163\charrsid1781117 tenet}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 of honor is not carried out by telephone. Thus, in effect, if it is at all possible for }{\rtlch \af0 \ltrch \insrsid10764079\charrsid1781117 +a person }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 to go to the mourner's home, which is the complete fulfillment of the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mitzvah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +, it is not enough to do so by phone. But he does partially fulfill the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mitzvah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +, for if it impossible to go to the mourner's house, such as owing to illness or when one is involved with a }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mitzvah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + that he must carry out to the extent possible, he should offer condolences by phone, since there is some }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mitzvah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 in that}{\rtlch \af0 \ltrch +\insrsid14948990\charrsid1781117 m}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 and he should not say that since he cannot make it to the mourner's home, he has no obligation at all\'85and as to the }{\rtlch \af0 \ltrch +\insrsid14948990\charrsid1781117 question}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 wh +ether the mourner is allowed to speak on the phone, it is simply that whatever he requires for his physical needs or for those of his household, and for the needs of the }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 minyan}{\rtlch \af0 +\ltrch \insrsid12391429\charrsid1781117 , for which it is permitted for him to speak in his home, it is also allowed by telephone. }{\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 W}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +hen people phone him to console him, }{\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 he }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 is permitted to go to the phone and receive condolences}{\rtlch \af0 \ltrch +\insrsid14948990\charrsid1781117 .}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 However, }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +as to small talk as well as inquiring about his friends' welfare, or even }{\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 that of }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 his sons, it is forbidden."}{\rtlch \af0 \ltrch +\cs16\super\insrsid12391429\charrsid1781117 \chftn {\footnote \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\sl360\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid1276346 \rtlch \af0\afs20\alang1037 \ltrch +\fs20\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\rtlch \ai\af0 \ltrch \cs16\i\super\insrsid4342917\charrsid1276346 \chftn }{\rtlch \ai\af0 \ltrch \i\insrsid4342917\charrsid1276346 Iggerot Moshe, Orah Hayyim}{\rtlch \af0 \ltrch \insrsid4342917 +, 4:40.}}}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par }\pard \ltrpar\ql \fi360\li0\ri0\sl480\slmult1\widctlpar\tx180\faauto\adjustright\rin0\lin0\itap0\pararsid14948990 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 This means, the complete }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 mi +tzvah}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 + is to go and console the mourner at his home, since the consoler thereby benefits the mourner and can speak to his emotional needs and assuage his sorrow; this is also for the benefit of the dead. }{\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 A}{ +\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 fter the fact, if one cannot make it to the mourner's home, he should console him by speaking on the phone. +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0 {\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +\par +\par }\pard \ltrpar\ql \li0\ri0\sl480\slmult1\widctlpar\tx360\faauto\adjustright\rin0\lin0\itap0\pararsid14948990 {\rtlch \ab\af0 \ltrch \b\insrsid12391429\charrsid1781117 The Custom Today }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 \emdash T}{ +\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 he custom is t}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 o console the mourner where he is sitting }{\rtlch \ai\af0 \ltrch \i\insrsid12391429\charrsid1781117 shiv\rquote ah}{\rtlch \ai\af0 +\ltrch \i\insrsid14948990\charrsid1781117 ,}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 }{\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 b}{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 ut if }{\rtlch \af0 \ltrch +\insrsid14948990\charrsid1781117 one }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 cannot get to the mourner's home, }{\rtlch \af0 \ltrch \insrsid14948990\charrsid1781117 he }{\rtlch \af0 \ltrch \insrsid12391429\charrsid1781117 +may offer condolences by phone. +\par }} diff --git a/sw/qa/extras/layout/data/forcepoint89.html b/sw/qa/extras/layout/data/forcepoint89.html new file mode 100644 index 0000000000..7998a2b0b9 Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint89.html differ diff --git a/sw/qa/extras/layout/data/forcepoint90.rtf b/sw/qa/extras/layout/data/forcepoint90.rtf new file mode 100644 index 0000000000..b3c677e094 --- /dev/null +++ b/sw/qa/extras/layout/data/forcepoint90.rtf @@ -0,0 +1 @@ +{\rtf1\cnsi \ansicpg1252\stshfloch0{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green102\blue204;\red102\green99\blue98;\red143\green142\blue142;\red75\green60\blue52;}{\fonttbl{\f0\froman\cpg1257\fcharset180697947886554888358 DejaVu Serif;}{\f1\froman\cpg0\fcharset0 DejaVu Serif;}{\f2\froman\cpg1252\fcharset0 DejaVu Serif;}{\f3\fswiss\cpg1257\fcharset186 DejaVu Sans;}{\f4\fswiss\cpg0\fcharset0 DejaVu Sans;}{\f5\fswiss\cpg1252\fcharset0 DejaVu Sans;}{\f6\fro-an\cpg1257\fcharset186 Times New Roman;}{\f7\froman\cpg0\fcharset0 Times New Roman;}{\f8\froman\cpg1252\fcharset0 Times New Roman;}{\f9\fmodern\cpg1257\fcharset186 Courier New;}{\f10\fmodern\cpg0\fcharset0 Courier New;}{\f11\fmodern\cpg1252\fcharset0 Courier New;}}{\stylesheet {\ql Normal;}{\s1\sbasedon0\ql\fi-120\sl-276\slmult0 Style1;}{\s2\sbasedon0\qj\fi560\sl-300\slmult0 Style2;}{\s3\sbasedon0\ql\sl-264\slmult0 Style3;}{\s4\sbasedon0\ql\fi-1088\sl-320\slmult0 Style4;}{\s5\sbasedon0\ql Style5;}{\s6\sbasedon0\ql Style6;}{\s7\sbasedon0\ql\sl-320\slmult0 Style7;}{\s8\sbasedon0\qr Style8;}{\s9\sbasedon0\ql Style9;}{\s10\sbasedon0\qj\sl-264\slmult0 Style10;}{\s11\sbasedon0\qj\sl-298\slmult0 Style11;}{\s12\sbasedon0\qj\sl-288\slmult0 Style12;}{\s13\sbasedon0\ql Style13;}{\s14\sbasedon0\ql\fi600\sl-329\slmult0 Style14;}{\s15\sbasedon0\ql\sl-240\slmult0 Style15;}{\s16\sbasedon0\ql Style16;}{\s17\sbasedon0\ql\fi576\sl-328\slmult0 Style17;}{\s18\sbasedon0\ql Style18;}{\s19\sbasedon0\ql\sl-271\slmult0 Style19;}{\s20\sbasedon0\ql\fi2406\sl-339\slmult0 Style20;}{\s21\sbasedon0\ql Style21;}{\s22\sbasedon0\ql\fi2821\sl-161\slmult0 Style22;}{\s23\sbasedon0\ql\fi568\sl-306\slmult0 Style23;}{\s24\sbasedon0\ql Style24;}{\s25\sbasedon0\ql Style25;}{\s26\sbasedon0\ql Style26;}{\s27\sbasedon0\ql Style27;}{\s28\sbasedon0\qj\sl-271\slmult0 Style28;}{\rtf1\cnsi \ansicpg1252\stshfloch0{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green102\blue204;\red102\green99\blue98;\red143\green142\blue142;\red75\green60\blue52;}{\fonttbl{\f0\froman\cpg1257\fcharset180697947886554888358 DejaVu Serif;}{\f1\froman\cpg0\fcharset0 DejaVu Serif;}{\f2\froman\cpg1252\fcharset0 DejaVu Serif;}{\f3\fswiss\cpg1257\fcharset186 DejaVu Sans;}{\f4\fswiss\cpg0\fcharset0 DejaVu Sans;}{\f5\fswiss\cpg1252\fcharset0 DejaVu Sans;}{\f6\fro-an\cpg1257\fcharset186 Times New Roman;}{\f7\froman\cpg0\fcharset0 Times New Roman;}{\f8\froman\cpg1252\fcharset0 Times New Roman;}{\f9\fmodern\cpg1257\fcharset186 Courier New;}{\f10\fmodern\cpg0\fcharset0 Courier New;}{\f11\fmodern\cpg1252\fcharset0 Courier New;}}{\stylesheet {\ql Normal;}{\s1\sbasedon0\ql\fi-120\sl-276\slmult0 Style1;}{\s2\sbasedon0\qj\fi560\sl-300\slmult0 Style2;}{\s3\sbasedon0\ql\sl-264\slmult0 Style3;}{\s4\sbasedon0\ql\fi-1088\sl-320\slmult0 Style4;}{\s5\sbasedon0\ql Style5;}{\s6\sbasedon0\ql Style6;}{\s7\sbasedon0\ql\sl-320\slmult0 Style7;}{\s8\sbasedon0\qr Style8;}{\s9\sbasedon0\ql Style9;}{\s10\sbasedon0\qj\sl-264\slmult0 Style10;}{\s11\sbasedon0\qj\sl-298\slmult0 Style11;}{\s12\sbasedon0\qj\sl-288\slmult0 Style12;}{\s13\sbasedon0\ql Style13;}{\s14\sbasedon0\ql\fi600\sl-329\slmult0 Style14;}{\s15\sbasedon0\ql\sl-240\slmult0 Style15;}{\s16\sbasedon0\ql Style16;}{\s17\sbasedon0\ql\fi576\sl-328\slmult0 Style17;}{\s18\sbasedon0\ql Style18;}{\s19\sbasedon0\ql\sl-271\slmult0 Style19;}{\s20\sbasedon0\ql\fi2406\sl-339\slmult0 Style20;}{\s21\sbasedon0\ql Style21;}{\s22\sbasedon0\ql\fi2821\sl-161\slmult0 Style22;}{\s23\sbasedon0\ql\fi568\sl-306\slmult0 Style23;}{\s24\sbasedon0\ql Style24;}{\s25\sbasedon0\ql Style25;}{\s26\sbasedon0\ql Style26;}{\s27\sbasedon0\ql Style27;}{\s28\sbasedon0\qj\sl-271\slmult0 Style28;}{\s29\sbasedon0\ql\fi568\sl-322\slmult0 Style29;}{\s30\sbasedon0\ql Style30;}{\s31\sbasedon0\ql Style31;}{\s32\sbasedon0\ql Style32;}{\s33\sbasedon0\ql Style33;}{\s34\sbasedon0\ql Style34;}{\s35\sbasedon0\ql Style35;}{\*\cs36\additive Default Paragraph Font;}{\*\cs37\sbasedon36\additive\b\charscalex120\f2\fs58 Font Style37;}{\*\cs38\sbasedon36\additive\b\charscalex30\f2\fs400 Font Style38;}{\*\cs39\sbasedon36\additive\i\f2\fs22 Font Style39;}{\*\cs40\sbasedon36\additive\scaps\f8\fs8 Font Style40;}{\*\cs41\sbasedon36\additive\i\b\f2\fs10 Font Style41;}{\*\cs42\sbasedon36\additive\f5\fs8 Font Style42;}{\*\cs43\sbasedon36\additive\b\expndtw200\f2\fs10 Font Style43;}{\*\cs44\sbasedon36\additive\f2\fs22 Font Style44;}{\*\cs45\sbasedon36\additive\b\expndtw-10\f2\fs22 Font Style45;}{\*\cs46\sbasedon36\additive\scaps\f2\fs20 Font Style46;}{\*\cs47\sbasedon36\additive\charscalex20\f2\fs104 Font Style47;}{\*\cs48\sbasedon36\additive\b\f2\fs20 Font Style48;}{\*\cs49\sbasedon36\additive\f2\fs22 Font Style49;}{\*\cs50\sbasedon36\additive\b\f2\fs38 Font Style50;}{\*\cs51\sbasedon36\additive\f2\fs20 Font Style170141183460469231731687303715884105678;}{\*\cs52\sbasedon36\additive\expndtw-20\f2\fs30 Font Style52;}{\*\cs53\sbasedon36\additive\i\expndtw-10\f2\fs22 Font Style53;}{\*\cs54\sbasedon36\additive\i\expndtw-20\f2\fs22 Font Style54;}{\*\cs55\sbasedon36\additive\f2\fs22 Font Style55;}{\*\cs56\sbasedon36\additive\f2\fs18 Font Style56;}{\*\cs57\sbasedon36\additive\b\expndtw10\f2\fs16 Font Style57;}{\*\cs58\sbasedon36\additive\b\f2\fs20 Font Style58;}{\*\cs59\sbasedon36\additive\i\b\expndtw-10\f11\fs22 Font Style59;}{\*\cs60\sbasedon36\additive\f2\fs20 Font Style60;}{\*\cs61\sbasedon36\additive\f2\fs12 Font Style61;}{\*\cs62\sbasedon36\additive\f2\fs18 Font Style62;}{\*\cs63\sbasedon36\additive\i\expndtw-20\f2\fs22 Font Style63;}{\*\cs64\sbasedon36\additive\b\expndtw-20\f2\fs26 Font Style64;}}\fet2{\*\ftnsep {\chftnsep\par }}{\*\aftnsep {\chftnsep\par }}\expshrtn\widowctrl\paperw20384\paperh12312\margl360\margr360\margt360\margb360 \sectd \sbknone\pgwsxn20384\pghsxn12312\marglsxn360\margrsxn360\margtsxn360\margbsxn360\titlepg\cols2\colno1\colw8632\colsr2104\colno2\colw8928 {\headerf }{\footerf }{\header \pard \plain \s11\ql\li720\fi0\ri9\sb0\sa0\tx2120 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \'e1\f0\cchs186 Ma\ul b\f0\cchs186 \'fb\f0\cchs186 s vaikai:\ul0 {\charscalex100\expndtw0\tab }\ul ir galimyb\f0\cchs186 \'eb\f0\cchs186 s\par }{\footer \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx0\posnegy0\absw0\absh-254\nowrap\dfrmtxtx34\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 {\field{\*\fldinst{PAGE}}{\fldrslt 100}}\par \pard \plain \s21\qr\li720\fi0\ri9{\sl-240\slmult0\fs20\par }\sb90\sa0 \cs61\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs12 101\par }\pard\sl-4680\slmult0\sb0\keepn\pvpara\dropcapli7\dropcapt1{\b\i0\ul0\cf0\highlight0\charscalex30\f0\fs400{i}\par}\pard \plain \s1\ql\li880\fi-880\ri0\sb0\sa0\sl-272\slmult0 \cs37\i0\strike0\nosupersub\b\scaps0\charscalex120\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs58 Hfc \cs55\0\super\charscalex100\fs22 mddj8\nosupersub \super tUn\nosupersub \super tam\nosupersub \super dkrts\nosupersub identifikacijos proced\f0\cchs186 \'fb\f0\cchs186 ras, vadinasi \cs60\fs20 ivuiiy* toje \cs55\fs22 programoje \cs53\i\expndtw-10 asmenys \cs55\i0\expndtw0 turi mok\f0\cchs186 \'eb\f0\cchs186 ti naudotis identifikacijos \f0\cchs186 \'e1\f0\cchs186 ran-\cs60\fs20 *>*\f0\cchs186 \'ab\'f8\f0\cchs186 geb\f0\cchs186 \'eb\f0\cchs186 ti \cs55\fs22 analizuoti mokini\f0\cchs186 \'f8\f0\cchs186 veiklos produktus ir pati mokymosi proces\f0\cchs186 \'e0\f0\cchs186 , \cs60\f0\cchs186\fs20 \'95\f0\cchs186 tpaftistant \cs55\fs22 kriterijus, pagal kuriuos vaikas gali b\f0\cchs186 \'fb\f0\cchs186 ti priskirtas gabi\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 grupei. \cs60\fs20 Vargu, ar \cs55\fs22 bc specialaus \cs53\i\expndtw-10 pasirengimo \cs55\i0\expndtw0 gali dirbti mokytojas. Pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, Clark modelyje numatyta, kad mokytojas turi b\f0\cchs186 \'fb\f0\cchs186 ti \f0\cchs186 \'e1\f0\cchs186 vald\f0\cchs186 \'e6\f0\cchs186 s \f0\cchs186 \'e1\f0\cchs186 tampos klas\f0\cchs186 \'eb\f0\cchs186 je suma\f0\cchs186 \'fe\f0\cchs186 i\-nimo strategijas (autogenin\f0\cchs186 \'e6\f0\cchs186 treniruot\f0\cchs186 \'e6\f0\cchs186 , meditacij\f0\cchs186 \'e0\f0\cchs186 ), turi geb\f0\cchs186 \'eb\f0\cchs186 ti parinkti mo\-kymo med\f0\cchs186 \'fe\f0\cchs186 iag\f0\cchs186 \'e0\f0\cchs186 , pratimus ir u\f0\cchs186 \'fe\f0\cchs186 duotis, kurioms atlikti b\f0\cchs186 \'fb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 naudojama abiej\f0\cchs186 \'f8 \f0\cchs186 smegen\f0\cchs186 \'f8\f0\cchs186 pusrutuli\f0\cchs186 \'f8\f0\cchs186 veikla, geb\f0\cchs186 \'eb\f0\cchs186 ti \f0\cchs186 \'e1\f0\cchs186 ugdymo turin\f0\cchs186 \'e1\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 traukti pratimus, kurie, panaudojant fizin\f0\cchs186 \'e1\f0\cchs186 k\f0\cchs186 \'fb\f0\cchs186 n\f0\cchs186 \'e0\f0\cchs186 , abstraktaus ir simbolinio lygmens \cs39\i informacij\f0\cchs186 \'e0\f0\cchs186 , \cs55\i0 trans\-formuoja \f0\cchs186 \'e1\f0\cchs186 konkretesn\f0\cchs186 \'e1\f0\cchs186 lygmen\f0\cchs186 \'e1\f0\cchs186 ir pan. Kai kurie autoriai, pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, Wil-liams, netgi nurodo mokymo strategijas, kurias \cs39\i naudoti savo \cs55\i0 darbe turi mok\f0\cchs186 \'eb\f0\cchs186 ti \cs60\fs20 mokytojas, \cs55\fs22 kiti savo darbo komand\f0\cchs186 \'e0\f0\cchs186 apmoko. Renzulli modelio realizavimo komand\f0\cchs186 \'e0\f0\cchs186 sudaro ne tik mokytojai, bet ir t\f0\cchs186 \'eb\f0\cchs186 vai, bendruomen\f0\cchs186 \'eb\f0\cchs186 s ekspertai, mo\-kyklos administracija ir kt. personalas. Modelio veikimo efektyvum\f0\cchs186 \'e0\f0\cchs186 vertina \cs53\i\expndtw-10 visi \cs39\expndtw0 jo \cs53\expndtw-10 dalyviai, pagal tokios analiz\f0\cchs186 \'eb\f0\cchs186 s \cs55\i0\expndtw0 rezultatus bei mokini\f0\cchs186 \'f8\f0\cchs186 pageidavimus ar pakitusius poreikius ugdymo programa modifikuojama.\par \pard \plain \s2\ql\li576\fi560\ri0\sb0\sa0\sl-296\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Atskirai reik\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 pamin\f0\cchs186 \'eb\f0\cchs186 ti Taylor model\f0\cchs186 \'e1\f0\cchs186 . Jis vadinamas ir muititalento, ir k\f0\cchs186 \'fb\f0\cchs186 rybinio bei kritinio m\f0\cchs186 \'e0\f0\cchs186 stymo modeliu. \cs39\i Laikoma, kad \cs55\i0 bent vienai (j\f0\cchs186 \'f8\f0\cchs186 nuro\-domos net devynios) gabumo sri\f0\cchs186 \'e8\f0\cchs186 iai yra gabus kiekvienas vaikas. Toks gabi\f0\cchs186 \'f8 \f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 \cs53\i\expndtw-10 ugdymo modelis tur\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 b\f0\cchs186 \'fb\f0\cchs186 ti \cs39\expndtw0 priimtinas ir \cs55\i0\f0\cchs186 \'fe\f0\cchs186 mon\f0\cchs186 \'eb\f0\cchs186 ms, kurie mano, jog visi vaikai \cs60\fs20 turi \cs55\fs22 tam \cs53\i\expndtw-10 tikr\f0\cchs186 \'f8\f0\cchs186 \cs55\i0\expndtw0 gabum\f0\cchs186 \'f8\f0\cchs186 , ir d\f0\cchs186 \'eb\f0\cchs186 l koki\f0\cchs186 \'f8\f0\cchs186 nors prie\f0\cchs186 \'fe\f0\cchs186 as\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 nenori pripa\-\cs60\f0\cchs186\fs20 \'fe\f0\cchs186 inti \cs55\fs22 gabum\f0\cchs186 \'f8\f0\cchs186 \cs53\i\expndtw-10 lygmens \cs55\i0\expndtw0 skirtum\f0\cchs186 \'f8\f0\cchs186 . Modelio autorius nurodo \f0\cchs186 \'f0\f0\cchs186 ias gabum\f0\cchs186 \'f8\f0\cchs186 sritis: akademin\f0\cchs186 \'eb\f0\cchs186 s srities, \cs53\i\expndtw-10 produktyviojo \cs55\i0\expndtw0 m\f0\cchs186 \'e0\f0\cchs186 stymo, komuniJcavimo, prognozavimo, \cs53\i\expndtw-10 sprendim\f0\cchs186 \'f8\f0\cchs186 pri\f0\cchs186 \'eb\f0\cchs186 mimo, plan\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 gyvendinimo, \cs55\i0\expndtw0\f0\cchs186 \'fe\f0\cchs186 mogi\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 , galimybi\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\'fe\f0\cchs186 vel\-gimo \cs39\i\expndtw-20 (ir.\expndtw0 2.2.1 \cs53\expndtw-10 lentel\f0\cchs186 \'e6\f0\cchs186 ).\par \pard \plain \s11\qj\li6976\fi0\ri0{\sl-240\slmult0\fs20\par }\sb72\sa0 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 2.2.1 \cs55 lentel\f0\cchs186 \'eb\par \pard \plain \s8\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx6464\posnegy688\absw0\absh-256\dfrmtxtx40\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 U\f0\cchs186 \'fe\f0\cchs186 duo\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 pavyzd\f0\cchs186 \'fe\f0\cchs186 iai\par \pard \plain \s4\qc\li2112\fi0\ri2232\sb0\sa0\sl-320\slmult0 \cs53\b0\strike0\nosupersubLi\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\s22 Gabum\f0\cchs186 \'f8\f0\cchs186 \cs44\i0\expndtw0 ugdymas pagal Taylor \cs55 model\f0\cchs186 \'e1 \f0\cchs186 (pagal TayJor, 1986)\par \pard \plain \s9\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx2648\posnegy368\absw0\absh-328\dfrmtxtx40\dfrmtxty0 \cs53\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\fs22 Geb\f0\cchs186 \'eb\f0\cchs186 jimas \cs55\i0\expndtw0 susikurti \cs39\i atitinka- \{\f0\cchs186 \'84\f0\cchs186 Surinkite informacij\f0\cchs186 \'e0\f0\cchs186 apie... ii\par \pard \plain \s6\qj\li304\fi0\ri0\sb16\sa0 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 I \cs53\expndtw-10 Gabum\f0\cchs186 \'f8\f0\cchs186 sritis Paai\f0\cchs186 \'f0\f0\cchs186 kinimas\par \pard \plain \s10\qj\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \pvpara\phcol\posnegx6032\posnegy328\absw2600\absh-544\dfrmtxtx40\dfrmtxty0 \cs53\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\fs22 j mos temos \f0\cchs186 \'fe\f0\cchs186 ini\f0\cchs186 \'f8\f0\cchs186 ir \f0\cchs186 \'e1\f0\cchs186 g\f0\cchs186 \'fb\f0\cchs186 d\f0\cchs186 \'fe\f0\cchs186 i\f0\cchs187 \'f8 \cs55\i0\expndtw0\f0\cchs186 'baz\f0\cchs186 \'e6\f0\cchs186 .\par \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0\sl-288\slmult0 \pvpara\phcol\posnegx5672\posnegy384\absw2960\absh-584\dfrmtxtx40\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 f Geb\f0\cchs186 \'eb\f0\cchs186 jimas generuoti \cs60\fs20 ne-\line \cs55\fs22 f \f0\cchs186 \'e1\f0\cchs186 prastas, originalias i\f0\cchs186 \'eb\f0\cchs186 /as,\line \cs60\fs20 f\cs53\i\expndtw-10\fs22 pasteb\f0\cchs186 \'eb\'fb\f0\cchs186 naujus \cs55\i0\expndtw0 s\f0\cchs-23 \'e30153860653936719740\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 ius,\line \cs53\i\expndtw-10\f0\cchs186 \'c1\f0\cchs186 pa\f0\cchs186 \'e1\f0\cchs186 vairioa id\f0\cchs186 \'eb\f0\cchs186 jas,\expndtw0 {\charscalex100\expndtw0\tab }\par \pard \plain \s6\qj\li232\fi0\ri0\sb0\sa0 \cs53\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-10\dn0\f0\cchs186\lang1063\langfe1063\fs22 'Akademin\f0\cchs186 \'eb\par \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0\sl-272\slmult0 \pvpara\phcol\posnegx5264\posnegy160\absw3368\absh-648\dfrmtxtx40\dfrmtxty0 \cs39\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 'Akademin\f0\cchs186 \'eb\par \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0\sl-272\slmult0 \pvpara\phcol\posnegx5264\posnegy160\absw3368\absh-648\dfrmtxtx40\dfrmtxty0 \cs39\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 (K\f0\cchs186 \'fb\f0\cchs186 rybos, produktyvioio\par \pard \plain \s13\qj\li5816\fi0\ri0\sb88\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 2.2.1 icntcU\par \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-240\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Gabum\f0\cchs186 \'f8\f0\cchs186 \cs60\fs20 sritis\par \pard \plain \s15\ql\li0\fi40\ri0\sb0\sa0\sl-240\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Sprendim\f0\cchs186 \'f8 \f0\cchs186 pri\f0\cchs186 \'eb\f0\cchs186 mimo\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-248\slmult0\tlul\tx2736 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Paai\f0\cchs186 \'f0\f0\cchs186 kinimas {\charscalex100\expndtw0\tab }Ll\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas rasti alternatyvas, \cs55\fs22 l.,\par \pard \plain \s15\ql\li32\fi-32\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 jas \f0\cchs186 \'e1\f0\cchs186 vertinti ir priimti tinka- \cs55\fs22 t \cs60\fs20 r m\f0\cchs186 \'e0\f0\cchs186 problemos sprendim\f0\cchs186 \'e0\f0\cchs186 . 1 \cs41\b\i\f0\cchs186\fs10 \'e1\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs5u\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 J\f0\cchs186 \'fe\f0\cchs186 duo\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 pavyzd\f0\cchs186 \'fe\f0\cchs186 iai Nurodykite \cs60\fs20 savo \cs55\fs22 m\f0\cchs186 \'eb\f0\cchs186 giamiausi\f0\cchs186 \'e0\f0\cchs186 \cs60\fs20 I\par \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 a\f0\cchs186 \'f0\f0\cchs186 y toj\f0\cchs186 \'e0\f0\cchs186 , ai\f0\cchs186 \'f0\f0\cchs186 kiai pagr\f0\cchs186 \'e1\f0\cchs186 sdami at- t \cs60\fs20 rumentais \cs55\fs22 savo pasirinkim\f0\cchs186 \'e0\f0\cchs186 it\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 itmetim\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Planavimo\cell \pard \plain \s15\ql\li16\fi-16\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas numatyti kelius ir b\f0\cchs186 \'fb\f0\cchs186 dus id\f0\cchs186 \'eb\f0\cchs186 jai \f0\cchs186 \'e1\f0\cchs186 gyvendinti, nustatant, koki\f0\cchs186 \'f8\f0\cchs186 reikia resur- \cs55\fs22 1 \cs60\fs20 s\f0\cchs186 \'f8\f0\cchs186 , \f0\cchs186 \'e1\'fe\f0\cchs186 velgiant, kokios gali\-mos problemos, ir numatant \f0\cchs186 \'fe\f0\cchs186 ingsnius j\f0\cchs186 \'f8\f0\cchs186 sprendimui, to\-kiu b\f0\cchs186 \'fb\f0\cchs186 du patobulinant plan\f0\cchs186 \'e0\f0\cchs186 .\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-256\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 .I\f0\cchs186 \'f0\f0\cchs186 studijav\f0\cchs186 \'e6\f0\cchs186 \cs55\fs22 mitus apie \f0\cchs186 \'f0\f0\cchs186 ik\f0\cchs186 \'f0\f0\cchs186 nos\-\cs60\fs20 parnius, \cs55\fs22 sukurkite tyrimo plan\f0\cchs186 \'e0\f0\cchs186 \cs62\fs18 1\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-256\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 savo draug\f0\cchs186 \'f8\f0\cchs186 \cs55\fs22 nuomonei \cs60\fs20 apie \f0\cchs186 \'f0\f0\cchs186 iuos gyv\f0\cchs186 \'fb\f0\cchs186 nus i\f0\cchs186 \'f0\f0\cchs186 tirti\super 41\nosupersub , \f0\cchs186 \'84\f0\cchs186 Sukurkite akcijos prie\f0\cchs186 \'f0\f0\cchs186 \cs55\fs22 r\f0\cchs186 \'fb\f0\cchs186 kym\f0\cchs186 \'e0\f0\cchs186 \cs62\fs18 1 \cs60\fs20 plan\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Prognozavimo\cell \pard \plain \s15\ql\li0\fi8\ri0\sb0\sa0\sl-248\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas numatyti ir pati\-krinti prie\f0\cchs186 \'fe\f0\cchs186 asties ir pasekm\f0\cchs186 \'eb\f0\cchs186 s s\f0\cchs186 \'e0\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 ius.\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 I\f0\cchs186 \'f0\f0\cchs186 studijuokite N sutart\f0\cchs186 \'e1\f0\cchs186 ir nurodykite \f0\cchs186 \'e1\f0\cchs186 vairias galimas jos i ratifikavimo pasekmes".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Komunikavimo\cell \pard \plain \s15\ql\li0\fi16\ri0\sb0\sa0\sl-256\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas reik\f0\cchs186 \'f0\f0\cchs186 ti savo id\f0\cchs186 \'eb\f0\cchs186 jas, jausmus, poreikius ir suprasti kitus, vartojant verbalin\f0\cchs186 \'e6\f0\cchs186 ir neverbalin\f0\cchs186 \'e6\f0\cchs186 kalb\f0\cchs186 \'e0\f0\cchs186 .\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 Pademonstruokite savo jaus- \cs55\fs22 1 \cs60\fs20 mus, kai su\f0\cchs186 \'fe\f0\cchs186 inote apie ... \f0\cchs186 \'84\f0\cchs186 Papasakokite apie \f0\cchs186 \'e1\f0\cchs186 vyk\f0\cchs186 \'e1\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 vaiko i ir i\f0\cchs186 \'f0\f0\cchs186 suaugusiojo pozicini". i\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Plan\f0\cchs186 \'f8\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'e1\f0\cchs186 gyvendinimo\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas \f0\cchs186 \'e1\f0\cchs186 gyvendinti plan\f0\cchs186 \'e0\cell \pard \plain \s16\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs43\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw200\dn0\f0\cchs186\lang1063\langfe1063\fs10 \'97\f0\cchs186 \f0\cchs186 \'97\f0\cchs186 \f1\cchs186 \u9632\'3f\f0\cchs186 - \f0\cchs186 \'97\'97\f0\cchs186  \expndtw0 *-\expndtw200 \expndtw0 L-\expndtw200 \expndtw0 -\expndtw200 \cs42\b0\expndtw0\f3\cchs186\fs8 i \f4\cchs186 \u9632\'3f\f3\cchs186 \f4\cchs186 \u9632\'3f\f3\cchs186 \cs41\b\i\f0\cchs186\fs10 a \cs40\b0\i0\scaps\f6\cchs186\fs8 - ii \f7\cchs186 \u9632\'3f\f6\cchs186 \cs62\scaps0\f0\cchs186\fs18 1\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-264\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 Sukurkite ir \f0\cchs186 \'e1\f0\cchs186 gyvendinkite N 1 renginio plan\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1848 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx4792 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8376 \pard \plain \s15\ql\li32\fi-32\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Galimybi\f0\cchs186 \'f8 \'e1\'fe\f0\cchs186 velgimo\cell \pard \plain \s15\ql\li0\fi40\ri0\sb0\sa0\sl-272\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Geb\f0\cchs186 \'eb\f0\cchs186 jimas identifikuoti gali\-myb\f0\cchs186 \'e6\f0\cchs186 ir ja pasinaudoti.\cell \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\sl-272\slmult0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'84\f0\cchs186 I\f0\cchs186 \'f0\f0\cchs186 tirkite ispan\f0\cchs186 \'f8\f0\cchs186 kalbos mokymo(si) poreik\f0\cchs186 \'e1\f0\cchs186 mokykloje ir inicijuokite atitinkamos pro\-gramos \f0\cchs186 \'e1\f0\cchs186 gyvendinim\f0\cchs186 \'e0\f0\cchs186 ".\cell \pard\intbl\row \pard\pard \plain \s14\ql\li0\fi600\ri0\sb232\sa0\sl-328\slmult0 \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Taylor siekia ugdyti kuo daugiau gabum\f0\cchs186 \'f8\f0\cchs186 , kuriais, jo manymu, pasi\f0\cchs186 \'fe\f0\cchs186 ymi vaikai. Tad kuo \f0\cchs186 \'e1\f0\cchs186 vairesniems vaik\f0\cchs186 \'f8\f0\cchs186 gabumams mokytojas skirs d\f0\cchs186 \'eb\f0\cchs186 mes\f0\cchs186 \'e1\f0\cchs186 , tuo daugiau galimybi\f0\cchs186 \'f8\f0\cchs186 , kad vaikas ras srit\f0\cchs186 \'e1\f0\cchs186 , kurios \f0\cchs186 \'fe\f0\cchs186 inovu jis gali tapti. Ta\f0\cchs186 \'e8\f0\cchs186 iau pir\-masis \f0\cchs186 \'f0\f0\cchs186 io modelio etapas - tai vis d\f0\cchs186 \'eb\f0\cchs186 lto akademini\f0\cchs186 \'f8\f0\cchs186 gabum\f0\cchs186 \'f8\f0\cchs186 ugdymas. Kitas \f0\cchs186 \'fe\f0\cchs186 ingsnis, skirtas mokytojui apsispr\f0\cchs186 \'e6\f0\cchs186 sti, kuri\f0\cchs186 \'e0\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 likusi\f0\cchs186 \'f8\f0\cchs186 a\f0\cchs186 \'f0\f0\cchs186 tuoni\f0\cchs186 \'f8\f0\cchs186 gabum\f0\cchs186 \'f8\f0\cchs186 sri\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8 \f0\cchs186 jis imasi ugdyti. Paprastai seka, anot autoriaus, tur\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 b\f0\cchs186 \'fb\f0\cchs186 ti tokia: produktyvusis m\f0^cchs186 \'e0\f0\cchs186 stymas, planavimas, sprendim\f0\cchs186 \'f8\f0\cchs186 pri\f0\cchs186 \'eb\f0\cchs186 mimas, pian\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 gyvendinimas, \f0\cchs186 \'e1\'fe\f0\cchs186 valgos. Akivaizdu, jog dirbti pagal \f0\cchs186 \'f0\'e1\f0\cchs186 model\f0\cchs186 \'e1\f0\cchs186 mokytojas tur\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 b\f0\cchs186 \'fb\f0\cchs186 ti specialiai pasi\-reng\f0\cchs186 \'e6\f0\cchs186 s, tad modelio autorius si\f0\cchs186 \'fb\f0\cchs186 lo kelet\f0\cchs186 \'e0\f0\cchs186 mokytojo darbo metod\f0\cchs186 \'f8\f0\cchs186 . Pirmuouiu atveju si\f0\cchs186 \'fb\f0\cchs186 loma papildom\f0\cchs186 \'f8\f0\cchs186 gabum\f0\cchs186 \'f8\f0\cchs186 ugdym\f0\cchs186 \'e0\f0\cchs186 organizuoti baigiantis pamokoms. \f0\cchs186 \'c1\f0\cchs186 prastinis mokymo turinys \f0\cchs186 \'84\f0\cchs186 suspaud\f0\cchs186 \'fe\f0\cchs186 iamas" laike, o atsiradusias 5\f0\cchs186 \'97\f0\cchs186 10 laisvuj minu\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 mokytojas gali i\f0\cchs186 \'f0\f0\cchs186 naudoti pasirinkto gabumo ugdymui. Kai \cs48\b\fs20 mokytojui \cs44\b0\fs22 atrodo, kad jau pasiekta tam tikra pa\f0\cchs186 \'fe\f0\cchs186 anga ugdant pirm\f0\cchs186 \'e0\f0\cchs186 j\f0\cchs186 \'e1\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 o pasirinkt\f0\cchs186 \'f8\f0\cchs186 ga\-\par \sect\soctd \sbkpage\pgwsxn20855\pghsxn13316\marglsxn1080\margrsxn8026\margtsxn360\margbsxn360\cols2\colno1\colw7936\colsr2482\colno2\colw1329 {\header \pard \plain \s11\ql\li0\fi0\ri-7657\sb0\sa0\tx2245 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \'e1\f0\cchs186 Ma\ul b\f0\cchs186 \'fb\f0\cchs186 s vaikai:\ul0 {\charscalex100\expndtw0\tab }\ul ir galimyb\f0\cchs186 \'eb\f0\cchs186 s\par }{\footer \par \plain \s11\qj\li0\fi0\ri0\sb0\sa0 \pvpara\phcol\posnegx-720\posnegy0\absw0\absh-254\nowrap\dfrmtxtx34\dfrmtxty0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 {\field{\*\fldinst{PAGE}}{\fldrslt 100}}\par \pard \plain \s21\qr\li0\fi0\ri-7657{\sl-240\slmult0\fs20\par }\sb90\sa0 \cs61\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs12 101\par }{\shp {\*\shpinst \chpleft13358\shptop593\shpright14748\shpbottom830\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz1\shplid1{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 317500}}{\sp{\sn dyWrapDistBottom}{\sv 198755}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s31\qj\li0\fi0\ri0\sb0\sa0 \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Rai\f0\cchs186 \'f0\f0\cchs186 kos \cs51\b0 b\f0\cchs186 \'fb\f0\cchs186 dai\par }}}{\shp {\*\shpinst \shpleft11859\shptop534\shpright13172\shpbottom2169\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz0\shplid0{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 279400}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0\sl-254\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas\par \pard \plain \s13\ql\li0\fi0\ri0\sb17\sa0\sl-271\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Ugdytojo ir ugdytini\f0\cchs186 \'f8 \f0\cchs186 s\f0\cchs186 \'e0\f0\cchs186 veika, ko\-munikacija\par }}}{\shp {\*\shpinst \shp|eft13350\shptop1144\shpright17594\shpbottom2296\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz2\shplid2{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 139700}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPint}{\sv 1}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0\sl-271\slmult0 \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Informacijos srautai \f0\cchs186 \'97\f0\cchs186 \cs48\b Asmenvb\f0\cchs186 \'eb\f0\cchs186 s tobuli* tiesioginiai ir \cs60\b0 gr\f0\cchs186 \'e1\'fe\f0\cchs186 tamieji, ir s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 \cs48\b tobulintai pedagogin\f0\cchs186 \'eb\f0\cchs186 \cs60\b0 sistema sudarymas: \cs48\b\f0\cchs186 \'fb\f0\cchs186 ssionj\par \pard \plain \s33\ql\li2499\fi0\ri0\sb93\sa0 \cs51\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 - b. \cs60 y\super 1\nosupersub "\super 0\nosupersub \cs51 HBB\par }}}{\shp {\*\shpinst \shpleft13299\shptop2228\shpright14205\shpbottom2474\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz4\shplid4{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Saviugda\par }}}{\shp {\*\shpinst \shpleft15874\shptop2279\shpright17187\shpbottom2524\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz5\shplid5{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s12\qj\li0\fi0\ri0\sb0\sa0 \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Tobulinimasis\par }}}{\shp {\*\shpinst \shpleft11867\shptop2152\shpright13078\shpbottom2812\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz3\shplid3{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 640080}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Individo as\-menyb\f0\cchs186 \'eb\par }}}{\shpgrp{\*\shpinst \shpleft-720\shptop3939\shpright7878\shpbottom12384\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz6\shplid6{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn groupLeft}{\sv 1067}}{\sp{\sn groupTop}{\sv 6209}}{\sp{\sn groupRight}{\sv 9665}}{\sp{\sn groupBottom}{\sv 14654}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 1067}}{\sp{\sn relTop}{\sv 6429}}{\sp{\sn relRight}{\sv 9665}}{\sp{\sn relBottom}{\sv 14654}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li474\fi0\ri0\sb0\sa0\sl-271\slmult0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1 \cs48\b\fs20 Ugdymo \cs49\b0\fs22 res \cs46\scaps\fs20 f\cs48\b\scaps0 lyb\f0\cchs186 \'eb\f0\cchs186 s lygmu\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 i- \cs49\b0\fs22 Strukt\f0\cchs186 \'fb\f0\cchs186 rini \cs48\b\fs20 o elementas\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 s Rai\f0\cchs186 \'f0\f0\cchs186 kos b\f0\cchs186 \'fb\f0\cchs186 dai\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Funkcijos\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li440\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 j \cs48\b\fs20 Valstybinis\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Valstyb\f0\cchs186 \'eb\f0\cchs186 s politika\cell \pard \plain \s19\ql\li0\fi8\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 \'d0\f0\cchs186 vietimo politika ir j\f0\cchs186 \'e0 \f0\cchs186 atspindintys \f0\cchs186 \'e1\f0\cchs186 statymai\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-288\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Teisinis reguliavimas, u\f0\cchs186 \'fe\f0\cchs186 tikrinantis kiekvie\-nam vaikui (vadinasi, ir gabiam) teis\f0\cchs186 \'e6\f0\cchs186 gauti jo poreikius ir galimybes atitinkant\f0\cchs186 \'e1\f0\cchs186 ugdym\f0\cchs186 \'e0\f0\cchs186 ir ug\-dymosi s\f0\cchs186 \'e0\f0\cchs186 lygas\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li390\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langde1063\fs20 Visuomeninis\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-280\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Visuomen\f0\cchs186 \'eb\f0\cchs186 s institutai\cell \pard \plain \s19\ql\li0\fi68\ri0\sb0\sa0\sl-288\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Vyriausybines insti\-tucijos/ visuomenini\f0\cchs186 \'f8 \f0\cchs186 organizacij\f0\cchs186 \'f8\f0\cchs186 /paramos fond\f0\cchs186 \'f8\f0\cchs186 /auk\f0\cchs186 \'f0\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 moky\-kl\f0\cchs186 \'f8\f0\cchs186 /mokslo institucij\f0\cchs186 \'f8 \cs39\b0\i\f0\cchs186\fs22 tikslin\f0\cchs186 \'eb\f0\cchs186 \cs48\i0\b\fs20 veikla\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-296\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Veiklos inicijavimas; koordinavimas, organi\-zavimas, informacijos kaupimas, analiz\f0\cchs186 \'eb\f0\cchs186 ir sklai\-da; gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 paie\f0\cchs186 \'f0\f0\cchs186 kos programos, identifikavi\-mas, globa; mokytoj\f0\cchs186 \'f8\f0\cchs186 ir kit\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'f0\f0\cchs186 vietimo darbuotoj\f0\cchs186 \'f8 \f0\cchs186 rengi mas;ugdymo t\f0\cchs186 \'e6\f0\cchs186 sti\-numo u\f0\cchs186 \'fe\f0\cchs186 tikrinimas; kt.\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx1889 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx3354 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx5836 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8597 \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 1 Institucinis\par \pard \plain \s25\ql\li0\fi0\ri0\sb0\sa0\sl-983\slmult0 \intbl \cs47\b0\i0\strike0\nosupersub\scaps0\charscalex20\expndtw0\dn19\f0\cchs186\lang1063\langfe1063\fs104 1\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Ugdymo nstituci\f0\cchs186 \'e1\f0\cchs186 os\par \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 i \cs49\b0\fs22 1 \cs48\b\fs20 i\par \pard \plain \s26\ql\li0\fi0\ri0\sb0\sa0\sl-381\slmult0 \intbl \cs50\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn5\f0\cchs186\lang1063\langfe1063\fs38 !\cell \pard \plain \s19\ql\li25\fi-25\ri0\sb0\sa0\sl-296\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo modelis institucijos lygmeniu \f0\cchs186 \'97\f0\cchs186 mokyklos, papildomojo ugdymo mokyklos, technin\f0\cchs186 \'eb\f0\cchs186 s \{\f0\cchs186 \'fb\f0\cchs186 rybos namai, klas\f0\cchs186 \'eb\f0\cchs186 s, tovyklos, kursai, kon\-kursai ir kt.\cell \pard \plain \s19\ql\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \intbl \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw-5420746430195647047\dn0\f0\cchs186\lang1063\langfe1063\fs20 Ugdymo proceso opti\-mizavimas: optimalios ugdymo(si) aplinkos sudarymas, ugdymas, mo\-kymas, veiklos rezultat\f0\cchs186 \'f8 \f0\cchs186 vertinimas, mokymo dife\-rencijavimas ir kt.\cell \pard\intbl\row \pard}}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 3371}}{\sp{\sn relTop}{\sv 6209}}{\sp{\sn relRight}{\sv 7988}}{\sp{\sn relBotto}}{\sv 6497}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s18\qj\li0\fi0\ri0\sb0\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Gabi\f0\cchs186 \'f8\f0\cchs186 \cs49 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo ir jo s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 modelis\par }}}}}\pard \plain \s14\qr\li0\fi0\ri0\sb0\sa0\sl-305\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 m\f0\cchs186 \'e0\f0\cchs186 gali apib\f0\cchs186 \'fb\f0\cchs186 dinti asmenyb\f0\cchs186 \'eb\f0\cchs186 s saviugda, iritrapersonaliniame lygmenyje \f0\cchs186 \'e1\f0\cchs186 gyjanti gryn\f0\cchs186 \'e0\f0\cchs186 rai\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'e0\f0\cchs186 . \cs45\b\expndtw-10 II \cs55\b0\expndtw0 esm\f0\cchs186 \'eb\f0\cchs186 s \cs53\i\expndtw-10 vis\f0\cchs186 \'f8\f0\cchs186 \cs55\i0\expndtw0 anks\f0\cchs186 \'e8\f0\cchs186 iau min\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 strukt\f0\cchs186 \'fb\f0\cchs186 rini\f0\cchs186 \'f8\f0\cchs186 element\f0\cchs186 \'f8\f0\cchs186 funkcionavi\-mo tikslas \cs49 I \cs55 prigimtini\f0\cchs186 \'f8\f0\cchs186 asmens gali\f0\cchs186 \'f8\f0\cchs186 pl\f0\cchs186 \'eb\f0\cchs186 tra ir i\f0\cchs186 \'f0\f0\cchs186 vystymas jo paties j\f0\cchs186 \'eb\f0\cchsq86 gomis iki maksimalaus tam asmeniui galimo lygio. Literat\f0\cchs186 \'fb\f0\cchs186 roje (Gross, 1995; Almonaitien\f0\cchs186 \'eb\f0\cchs186 , 1997; Heller, 1999; Gagne, 2004 ir kt.) nurodoma, kad gabaus vaiko savirealizaci\-jai turi (takos jo asmenyb\f0\cchs186 \'eb\f0\cchs186 s nekognityvin\f0\cchs186 \'eb\f0\cchs186 s savyb\f0\cchs186 \'eb\f0\cchs186 s - pasiekim\f0\cchs186 \'f8\f0\cchs186 motyvacija, tei\-giamas \cs45\b\expndtw-10 sav\f0\cchs186 \'e6\f0\cchs186 s \cs55\b0\expndtw0 vertinimas, darbingumas, savikontrol\f0\cchs186 \'eb\f0\cchs186 ir kt. Yra pagrindo manyti, kad tinkamas min\f0\cchs186 \'eb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 GAVUS modelio strukt\f0\cchs186 \'fb\f0\cchs186 rini\f0\cchs186 \'f8\f0\cchs186 element\f0\cchs186 \'f8\f0\cchs186 funkcionavimas palankiai veikia gabaus vaiko asmenyb\f0\cchs186 \'e6\f0\cchs186 , taigi skatina \cs45\b\expndtw-10 j\f0\cchs186 \'e1\f0\cchs186 \cs55\b0\expndtw0 tobul\f0\cchs186 \'eb\f0\cchs186 ti.\par \pard \plain \s2\qj\li0\fi584\ri0\sb8\sa0\sl-271\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Apibendrinant tai, kas pasakyta, galima pateikti tok\f0\cchs186 \'e1\f0\cchs186 teorin\f0\cchs186 \'e1\f0\cchs186 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8 \f0\cchs186 ugdymo ir jo s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 model\f0\cchs186 \'e1\f0\cchs186 :\par \pard \plain \s11\qr\li0\fi0\ri0{\sl-240\slmult0\fs20\par }\sb99\sa0 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 3.1 \cs55 lentel\f0\cchs186 \'eb\par \column \pard \plain \s28\qj\li0\fi0\ri0{\sl-240\slmult0\fs20\par }\sb200\sa0\sl-271\slmult0 \cs48\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Ugdymo rea-\ul lyb\f0\cchs186 \'eb\f0\cchs186 s lygmuo\par \pard \plain \s11\qj\li0\fi0\ri0\sb42\sa0\sl-246\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Interpersona-linis\khftn{\footnote\pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \chftn Pastaba. Interpersonalinio ir intrapersonalinio \cs48\b\fs20 lygmens \cs55\b0\fs22 elemcr\cs48\b\f0\cchs186\fs20 \'a3\f0\cchs186 E\cs52\b0\expndtw-20\fs30 ^^PK\cs48\b\expndtw0\fs20 ^niaj\par \pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 modelio elementai, kuri\f0\cchs186 \'f8\f0\cchs186 optimaliamveikimui \cs49 ir skirtas ug\strike dy\strike0 m\strike o\strike0 \cs55 s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 \cs60\fs20 mo\-\cs55\fs22 delis\par \pard \plain \s23 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Sukurtasis \expndtw0 GAVUS\expndtw-20 moeelis turi savo strukt\f0\cchs186 \'fb\f0\cchs186 r\f0\cchs186 \'e0\f0\cchs186 , funkcijas \cs53\expndtw-10 ir \cs63\expndtw0 funkcionavimo\expndtw-20 \expndtw0 aptin-\cs53\expndtw-10 k\f0\cchs186 \'e0\f0\cchs186 . \cs63\expndtw-20 Modelis turi \expndtw0 paskirti\expndtw-20 bendr\f0\cchs186 \'e0\f0\cchs186 tiksl\f0\cchs186 \'e0\f0\cchs186 \f0\cchs186 \'97\f0\cchs186 \cs49\i0\expndtw0 sudaryti s\f0\cchs186 \'e0\f0\cchs186 lygas gabiems valkams, nepriklausomai nuo j\f0\cchs186 \'f8\f0\cchs186 socialin\f0\cchs186 \'eb\f0\cchs186 s pad\f0\cchs186 \'eb\f0\cchs186 ties, gyvenamosios vietos, am\-\f0\cchs186 \'fe\f0\cchs186 iaus, lyties ir kt., rinktis j\f0\cchs186 \'f8\f0\cchs186 poreikius atitinkanti ugdym\f0\cchs186 \'e0\f0\cchs186 ir galimybes saviugdai, pad\f0\cchs186 \'eb\f0\cchs186 ti jam ir skatinti vaik\f0\cchs186 \'e0\f0\cchs186 siekti pilno savojo gabum\f0\cchs186 \'f8\f0\cchs186 po\-tencialo realizavimo ir b\f0\cchs186 \'fb\f0\cchs186 ti naudingam visuomenei, Sis tikslas suteikia modeliui vienov\f0\cchs186 \'eb\f0\cchs186 s, vientisumo.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Kiekvienas strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas turi ir papildom\f0\cchs186 \'f8\f0\cchs186 (i\f0\cchs186 \'f0\f0\cchs186 vestini\f0\cchs186 \'f8\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 ben\-drojo) tiksl\f0\cchs186 \'f8\f0\cchs186 , kurie susij\f0\cchs186 \'e6\f0\cchs186 su funkcijomis, kurias atlieka strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas. Modelis skirtas \f0\cchs186 \'fe\f0\cchs186 mogui jame vyksta informacijos perdavimo ir valdymo pro\-cesai \f0\cchs186 \'97\f0\cchs186 tai b\f0\cchs186 \'fb\f0\cchs186 dinga visuomenin\f0\cchs186 \'eb\f0\cchs186 ms sistemoms.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis sudarytas i\f0\cchs186 \'f0\f0\cchs186 posistemi\f0\cchs186 \'f8\f0\cchs186 (pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, GVU atskiroje ugdymo institucijoje, jo posistem\f0\cchs186 \'eb\f0\cchs186 - pedagogin\f0\cchs186 \'eb\f0\cchs186 sistema, ir kt.). Visi GAVUS elementai yra vienaip ar kitaip susij\f0\cchs186 \'e6\f0\cchs186 su ugdymu ir jo funkcijomis: \f0\cchs186 \'f0\f0\cchs186 vietimu, lavinimu, aukl\f0\cchs186 \'eb\f0\cchs186 jimu, mokymu, globojimu, formavimu ir kt. Kiekviena jo sud\f0\cchs186 \'eb\f0\cchs186 tin\f0\cchs186 \'eb\f0\cchs186 dalis atlieka tam tikr\f0\cchs186 \'e0\f0\cchs186 funkcij\f0\cchs186 \'e0\f0\cchs186 (jas nurod\f0\cchs186 \'eb\f0\cchs186 me aptardami model\f0\cchs186 \'e1\f0\cchs186 ). Tuomet, kai mo\-delio strukt\f0\cchs186 \'fb\f0\cchs186 riniai elementai funkcionuoja visuose ugdymo realyb\f0\cchs186 \'eb\f0\cchs186 s lygmeny\-se, jis apima daugel\f0\cchs186 \'e1\f0\cchs186 aplinkos veiksni\f0\cchs186 \'f8\f0\cchs186 , kurie yra gabumo virsmo pasiekimais katalizatoriai. Funkciniais ry\f0\cchs186 \'f0\f0\cchs186 iais susij\f0\cchs186 \'e6\f0\cchs186 elementai sukuria palaikan\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'e0\f0\cchs186 aplink\f0\cchs186 \'e0 \f0\cchs186 vienas kito veikimui, o tai savo ruo\f0\cchs186 \'fe\f0\cchs186 tu suma\f0\cchs186 \'fe\f0\cchs186 ina atsitiktinum\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 tiesiogi\-\cs44 niam \cs49 ugdymui, t.y. skatina gabaus vaiko saviugd\f0\cchs186 \'e0\f0\cchs186 .\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelio artimiausioji funkcionavimo aplinka yra \f0\cchs186 \'f0\f0\cchs186 vietimo sistema.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis yra atviras ir dinami\f0\cchs186 \'f0\f0\cchs186 kas. Atviras, nes tai yra socialin\f0\cchs186 \'eb\f0\cchs186 strukt\f0\cchs186 \'fb\f0\cchs186 ra, kuriai \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 daro aplinka (netgi jo veikimo realyb\f0\cchs186 \'eb\f0\cchs186 je prasme). Modelio struk\-t\f0\cchs186 \'fb\f0\cchs186 riniai elementai turi daug vidini\f0\cchs186 \'f8\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 , o jie savo ruo\f0\cchs186 \'fe\f0\cchs186 tu yra atviri aplinkai, kitoms, i\f0\cchs186 \'f0\f0\cchs186 orin\f0\cchs186 \'eb\f0\cchs186 ms socialin\f0\cchs186 \'eb\f0\cchs186 ms strukt\f0\cchs186 \'fb\f0\cchs186 roms, sistemoms, yra dinami\f0\cchs186 \'f0\f0\cchs186 ki, nes i\f0\cchs186 \'f0\f0\cchs186 likti stati\f0\cchs186 \'f0\f0\cchs186 kam, kai kinta aplinka, n\f0\cchs186 \'eb\f0\cchs186 ra \f0\cchs186 \'e1\f0\cchs186 manoma. Dinami\f0\cchs186 \'f0\f0\cchs186 kas jis ir d\f0\cchs186 \'eb\f0\cchs186 l k\f0\cchs186 \'ab\'a9\f0\cchs186 $}\pAv \pard \plain \s11\qj\li0\fi0\ri0{\sl-240\slmult0\fs20\par }{\sl-240\slmult0\fs20\par }\sb121\sa0\sl-263\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Intrapersona-linis\chftn{\footnote\pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 \chftn Pastaba. Interpersonalinio ir intrapersonalinio \cs48\b\fs20 lygmens \cs55\b0\fs22 elemcr\cs48\b\f0\cchs186\fs20 \'a3\f0\cchs186 E\cs52\b0\expndtw-20\fs30 ^^PK\cs48\b\expndtw0\fs20 ^niaj\par \pard \plain \s13 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 modelio elementai, kuri\f0\cchs186 \'f8\f0\cchs186 optimaliam veikimui \cs49 ir skirtas ug\strike dy\strike0 m\strike o\strike0 \cs55 s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 \cs60\fs20 mo\-\cs55\fs22 delis\par \pard \plain \s23 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Sukurtasis \expndtw0 GAVUS\expndtw-20 modelis turi savo strukt\f0\cchs186 \'fb\f0\cchs186 r\f0\cchs186 \'e0\f0\cchs186 , funkcijas \cs53\expndtw-10 ir \cs63\expndtw0 funkcionavimo\expndtw-20 \expndtw0 aptin-\cs53\expndtw-10 k\f0\cchs186 \'e0\f0\cchs186 . \cs63\expndtw-20 Modelis turi \expndtw0 paskirti\expndtw-20 bendr\f0\cchs186 \'e0\f0\cchs186 tiksl\f0\cchs186 \'e0\f0\cchs186 \f0\cchs186 \'97\f0\cchs186 \cs49\i0\expndtw0 sudaryti s\f0\cchs186 \'e0\f0\cchs186 lygas gabiems valkams, nepriklausomai nuo j\f0\cchs186 \'f8\f0\cchs186 socialin\f0\cchs186 \'eb\f0\cchs186 s pad\f0\cchs186 \'eb\f0\cchs186 ties, gyvenamosios vietos, am\-\f0\cchs186 \'fe\f0\cchs186 iaus, lyties ir kt., rinktis j\f0\cchs186 \'f8\f0\cchs186 poreikius atitinkanti ugdym\f0\cchs186 \'e0\f0\cchs186 ir galimybes saviugdai, pad\f0\cchs186 \'eb\f0\cchs186 ti jam ir skatinti vaik\f0\cchs186 \'e0\f0\cchs186 siekti pilno savojo gabum\f0\cchs186 \'f8\f0\cchs186 po\-tencialo realizavimo ir b\f0\cchs186 \'fb\f0\cchs186 ti naudingam visuomenei, Sis tikslas suteikia modeliui vienov\f0\cchs186 \'eb\f0\cchs186 s, vientisumo.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Kiekvienas strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas turi ir papildom\f0\cchs186 \'f8\f0\cchs186 (i\f0\cchs186 \'f0\f0\cchs186 vestini\f0\cchs186 \'f8\f0\cchs186 i\f0\cchs186 \'f0\f0\cchs186 ben\-drojo) tiksl\f0\cchs186 \'f8\f0\cchs186 , kurie susij\f0\cchs186 \'e6\f0\cchs186 su funkcijomis, kurias atlieka strukt\f0\cchs186 \'fb\f0\cchs186 rinis elementas. Modelis skirtas \v0\cchs186 \'fe\f0\cchs186 mogui, jame vyksta informacijos perdavimo ir valdymo pro\-cesai \f0\cchs064 \'97\f0\cchs186 tai b\f0\cchs186 \'fb\f0\cchs186 dinga visuomenin\f0\cchs186 \'eb\f0\cchs186 ms sistemoms.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis sudarytas i\f0\cchs186 \'f0\f0\cchs186 posistemi\f0\cchs186 \'f8\f0\cchs186 (pavyzd\f0\cchs186 \'fe\f0\cchs186 iui, GVU atskiroje ugdymo institucijoje, jo posistem\f0\cchs186 \'eb\f0\cchs186 - pedagogin\f0\cchs186 \'eb\f0\cchs186 sistema, ir kt.). Visi GAVUS elementai yra vienaip ar kitaip susij\f0\cchs186 \'e6\f0\cchs186 su ugdymu ir jo funkcijomis: \f0\cchs186 \'f0\f0\cchs186 vietimu, lavinimu, aukl\f0\cchs186 \'eb\f0\cchs186 jimu, mokymu, globojimu, formavimu ir kt. Kiekviena jo sudf0\cchs186 \'eb\f0\cchs186 tin\f0\cchs186 \'eb\f0\cchs186 dalis atlieka tam tikr\f0\cchs186 \'e0\f0\cchs186 funkcij\f0\cchs186 \'e0\f0\cchs186 (jas nurod\f0\cchs186 \'eb\f0\cchs186 me aptardami model\f0\cchs186 \'e1\f0\cchs186 ). Tuomet, kai mo\-delio strukt\f0\cchs186 \'fb\f0\cchs186 riniai elementai funkcionuoja visuose ugdymo realyb\f0\cchs186 \'eb\f0\cchs186 s lygmeny\-se, jis apima daugel\f0\cchs186 \'e1\f0\cchs186 aplinkos veiksni\f0\cchs186 \'f8\f0\cchs186 , kurie yra gabumo virsmo pasiekimais katalizatoriai. Funkciniais ry\f0\cchs186 \'f0\f0\cchs186 iais susij\f0\cchs186 \'e6\f0\cchs186 elementai sukuria palaikan\f0\cchs186 \'e8\f0\cchs186 i\f0\cchs186 \'e0\f0\cchs186 aplink\f0\cchs186 \'e0 \f0\cchs186 vienas kito vei{imui, o tai savo ruo\f0\cchs186 \'fe\f0\cchs186 tu suma\f0\cchs186 \'fe\f0\cchs186 ina atsitiktinum\f0\cchs186 \'f8\f0\cchs186 \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 tiesiogi\-\cs44 niam \cs49 ugdymui, t.y. skatina gabaus vaiko saviugd\f0\cchs186 \'e0\f0\cchs186 .\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelio artimiausioji funkcionavimo aplinka yra \f0\cchs186 \'f0\f0\cchs186 vietimo sistema.\par \pard \plain \s23 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Modelis yra atviras ir dinami\f0\cchs186 \'f0\f0\cchs186 kas. Atviras, nes tai yra socialin\f0\cchs186 \'eb\f0\cchs186 strukt\f0\cchs186 \'fb\f0\cchs186 ra, kuriai \f0\cchs186 \'e1\f0\cchs186 tak\f0\cchs186 \'e0\f0\cchs186 daro aplinka (netgi jo veikimo realyb\f0\cchs186 \'eb\f0\cchs186 je prasme). Modelio struk\-t\f0\cchs186 \'fb\f0\cchs186 riniai elementai turi daug vidini\f0\cchs186 \'f8\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs186 i\f0\cchs186 \'f8\f0\cchs186 , o jie savo ruo\f0\cchs186 \'fe\f0\cchs186 tu yra atviri aplinkai, kitoms, i\f0\cchs186 \'f0\f0\cchs186 orin\f0\cchs186 \'eb\f0\cchs186 ms socialin\f0\cchs186 \'eb\f0\cchs186 ms strukt\f0\cchs186 \'fb\f0\cchs186 roms, sistemoms, yra dinami\f0\cchs186 \'f0\f0\cchs186 ki, nes i\f0\cchs186 \'f0\f0\cchs186 likti stati\f0\cchs186 \'f0\f0\cchs186 kam, kai kinta aplinka, n\f0\cchs186 \'eb\f0\cchs186 ra \f0\cchs186 \'e1\f0\cchs186 manoma. Dinami\f0\cchs186 \'f0\f0\cchs186 kas jis ir d\f0\cchs186 \'eb\f0\cchs186 l k\f0\cchs186 \'ab\'a9\f0\cchs186 $}\par \sect\sectd \sbknone\pgwsxn20126\pghsxn13892\marglsxn733\margrsxn360\margtsxn360\margbsxn360\cols1\colsx60 {\header }{\footer \pard \plain \s27\qr\li0\fi0\ri0\sb0\sa0 \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 {\field{\*\fldinst{PAGE}}{\fldrslt 123}}\par }{\pard\plain \sb1144\sa0\sl-240\slmult0\fs20\par}\pard \plain \s29\qj\li11181\fi0\ri0\sb51\sa102 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 4. \cs55 Gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ufidymo ir jo s\f0\cchs186 \'e0\f0\cchs186 lyg\f0\cchs186 \'f8\f0\cchs186 mo\ul delio rai\f0\cchs186 \'f0\f0\cchs186 kos\ul0 \cs45\b\expndtw-10\f0\cchs186 \'c1\f0\cchs186 \cs55\b0\ul\expndtw0 jetuvo\f0\cchs186 \'e1\f0\cchs186 e \cs60\fs20 pristatymas\par \sect\sectd \sbknone\pgwsxn20126\pghsxn13892\marglsxn733\margrsxn453\margtsxn360\margbsxn360\cols2\colno1\colw8123\colsr2431\colno2\colw8385 {\shpgrp{\*\shpinst \shpleft10622\shptop263\shpright18737\shpbottom1966\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr1\shpz7\shplid7{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 107315}}{\sp{\sn dyWrapDistBottom}{\sv 48260}}{\sp{\sn groupLeft}{\sv 12045}}{\sp{\sn groupTop}{\sv 2846}}{\sp{\sn groupRight}{\sv 20160}}{\sp{\sn groupBottom}{\sv 4549}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 12045}}{\sp{\sn relTop}{\sv 2922}}{\sp{\sn relRight}{\sv 20160}}{\sp{\sn relBottom}{\sv 4100}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx542 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx6666 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7378 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8115 \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Nr.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0\sl-144\slmult0\tlhyph\tx3744\tlul\tx4574 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn2\f0\cchs186\lang1063\langfe1063\fs22 rr-ri{\charscalex100\expndtw0\tab }\cs61\fs12 _ {\charscalex100\expndtw0\tab } J \f0\cchs186 \'bb\par \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Teiginys \f0\cchs186 \'97\cell \pard \plain \s35\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 mreies\par \pard \plain \s3\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Vid *\cell \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 t\f0\cchs186 \'e6\f0\cchs186 sinys\par \pard \plain \s24\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs61\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs12 Qt \cs60\fs20 n\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx542 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx6666 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7378 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8115 \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 11.\cell \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 Tr\f0\cchs186 \'fb\f0\cchs186 ksta mokini\f0\cchs186 \'f8\f0\cchs186 t\f0\cchs186 \'eb\f0\cchs186 v\f0\cchs1:6 \'f8\f0\cchs186 palaikymo, pritarimo\cell \pard \plain \s5\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 00\cs49\fs22 .24\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.21\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx542 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx6666 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7378 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8115 \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 12.\cell \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 [Tr\f0\cchs186 \'fb\f0\cchs186 ksta mokyklos administracijos paskatinimo ir \cs57\expndtw10\fs16 nri\cs58\expndtw0\fs20 -^mn\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\tlhyph\tx5472\tlhyph\tx6107 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 maksimalus \cs60\b0 galimas trukume .v\cs57\b\expndtw10\fs16 .-rr.\cs59\i\expndtw-10\f9\cchs186\fs22 ^-ETrr\cs60\b0\i0\expndtw0\f0\cchs186\fs20 {\charscalex100\expndtw0\tab }rr{\charscalex100\expndtw0\tab }1\cell \pard \plain \s5\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 00\cs49\fs22 .41\cel \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.22\cell \pard\intbl\row \pard}}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 18025}}{\sp{\sn relTop}{\sv 2846}}{\sp{\sn relRight}{\sv 20152}}{\sp{\sn relBottom}{\sv 3117}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}vs\n\{s\{p{ }1s} fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\ql\li0\fi0\ri0\sb0\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 4.2.3 lentel\f0\cchs186 \'eb\f0\cchs186 s t\f0\cchs186 \'e6\f0\cchs186 sinys\par }}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 12629}}{\sp{\sn relTop}{\sv 4074}}{\sp{\sn relRight}{\sv 20100}}{\sp{\sn relBottom}{\sv 4549}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s22\ql\li0\fi2821\ri0\sb0\sa0\sl-161\slmult0\tlhyph\tx3456\tldot\tx3812 \cs62\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs18 _ ,{\charscalex100\expndtw0\tab }{\charscalex100\expndtw0\tab }.\f0\cchs186 \'84\'ab\f0\cchs186 , , icigu \expndtw20 trukumoexpndtw0 \cs55fs22 visi\f0\cchs186 \'f0\f0\cchs186 kai nejau\f0\cchs186 -\line \'e8\f0\cchs186 iama \f0\cchs186 \'97\f0\cchs186 vertinimas \cs49\f0\cchs186 \'84\f0\cchs186 -2".\par }}}}}{\shpgrp{\*\shpinst \shpleft-373\shptop6683\shpright8098\shpbottom12511\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr2\shpwrk3\shpz8\shplid8{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn groupLeft}{\sv 1050}}{\sp{\sn groupTop}{\sv 9267}}{\sp{\sn groupRight}{\sv 9521}}{\sp{\sn groupBottom}{\sv 15095}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 1050}}{\sp{\sn relTop}{\sv 10275}}{\sp{\sn relRight}{\sv 9521}}{\sp{\sn relBottom}{\sv 15095}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv lbrdrr\brdrs\brdrw15\cltxlrtb\cellx8115 \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 12.\cell \pard \plain \s35\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 [Tr\f0\cchs186 \'fb\f0\cchs186 ksta mokyklos administracijos paskatinimo ir \cs57\expndtw10\fs16 nri\cs58\expndtw0\fs20 -^mn\par \pard \plain \s15\ql\li0\fi0\ri0\sb0\sa0\tlhyph\tx5472\tlhyph\tx6107 \intbl \cs58\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 maksimalus \cs60\b0 galimas trukume .v\cs57\b\expndtw10\fs16 .-rr.\cs59\i\expndtw-10\f9\cchs186\fs22 ^-ETrr\cs60\b0\i0\expndtw0\f0\cchs186\fs20 {\charscalex100\expndtw0\tab }rr{\charscalex100\expndtw0\tab }1\cell \pard \plain \s5\qr\li0\fi0\ri0\sb0\sa0 \intbl \cs60\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs20 00\cs49\fs22 .41\cel \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.22\cell \pard\intbl\row \pard}}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 18025}}{\sp{\sn relTop}{\sv 2846}}{\sp{\sn relRight}{\sv 20152}}{\sp{\sn relBottom}{\sv 3117}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}vs\n\{s\{p{ }1s} fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s11\ql\li0\fi0\ri0\sb0\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 4.2.3 lentel\f0\cchs186 \'eb\f0\cchs186 s t\f0\cchs186 \'e6\f0\cchs186 sinys\par }}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 12629}}{\sp{\sn relTop}{\sv 4074}}{\sp{\sn relRight}{\sv 20100}}{\sp{\sn relBottom}{\sv 4549}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s22\ql\li0\fi2821\ri0\sb0\sa0\sl-161\slmult0\tlhyph\tx3456\tldot\tx3812 \cs62\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs18 _ ,{\charscalex100\expndtw0\tab }{\charscalex100\expndtw0\tab }.\f0\cchs186 \'84\'ab\f0\cchs186 , , icigu \expndtw20 trukumoexpndtw0 \cs55fs22 visi\f0\cchs186 \'f0\f0\cchs186 kai nejau\f0\cchs186 -\line \'e8\f0\cchs186 iama \f0\cchs186 \'97\f0\cchs186 vertinimas \cs49\f0\cchs186 \'84\f0\cchs186 -2".\par }}}}}{\shpgrp{\*\shpinst \shpleft-373\shptop6683\shpright8098\shpbottom12511\shpfhdr0\shpfblwtxt0\shpbxmargin\shpbypara\shpwr2\shpwrk3\shpz8\shplid8{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn fLayoutInCell}{\sv 1}}{\sp{\sn fAllowOverlap}{\sv 1}}{\sp{\sn dxWrapDistLeft}{\sv 21590}}{\sp{\sn dxWrapDistRight}{\sv 21590}}{\sp{\sn dyWrapDistTop}{\sv 0}}{\sp{\sn dyWrapDistBottom}{\sv 0}}{\sp{\sn groupLeft}{\sv 1050}}{\sp{\sn groupTop}{\sv 9267}}{\sp{\sn groupRight}{\sv 9521}}{\sp{\sn groupBottom}{\sv 15095}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 1050}}{\sp{\sn relTop}{\sv 10275}}{\sp{\sn relRight}{\sv 9521}}{\sp{\sn relBottom}{\sv 15095}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdr15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li246\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Nr\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\strike0\nosupersub\scaps0\chrlex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Teiginys\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Vid.*\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 St. n.\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1 \super 1\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta u\f0\cchs186 \'fe\f0\cchs186 mokes\f0\cchs186 \'e8\f0\cchs186 io u\f0\cchs186 \'fe\f0\cchs186 \cs56\fs18 papildom\f0\cchs186 \'e0\f0\cchs186 \cs55\fs22 darb\f0\cchs186 \'e0\f0\cchs186 ,.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.43\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.84\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 12.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta materialinio paskatinimo itin gabiems mokiniams.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.35\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.87\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 13.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-288\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta bendros itin gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo politikos visos i\f0\cchs186 \'f0\f0\cchs186 liet \cs52\expndtw-20\fs30 j \cs44\expndtw0\fs22 mastu.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.27\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.85\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 14.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 [Tr\f0\cchs186 \'fb\f0\cchs186 ksta apr\f0\cchs186 \'fb\f0\cchs186 pinimo reikalinga mokymo metodine med\f0\cchs186 \'fe\f0\cchs186 iaga\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.22\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.96\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 15.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-296\slmult0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta kvalifikacijos k\f0\cchs186 \'eb\f0\cchs186 limo kurs\f0\cchs186 \'f8\f0\cchs186 itin gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo \cs44 tems.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1\cs49 .20\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.91\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrsbrdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s30\ql\li0\fi0\ri0\sb0\sa0\sl-407\slmult0 \intbl \cs52\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw-20\up2\f0\cchs186\lang1063\langfe1063\fs30 j \cs44\expndtw0\fs22 6. \cs55 j\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-313\slmult0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Tr\f0\cchs186 \'fb\f0\cchs186 ksta \cs55 bendradarbiavimo tu auk\f0\cchs186 \'f0\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 mokykl\f0\cchs186 \'f8\f0\cchs186 d\f0\cchs186 \'eb\f0\cchs186 stytojais, \cs44 mokalininkaif.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1\cs49 .04\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.99\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0\sl-313\slmult0 \intbl \cs44\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 7. \cs55 1 \cs44 Tr\f0\cchs186 \'fb\f0\cchs186 ksta literatu \expndtw-20 rot\expndtw0 \cs54\i\expndtw-20 apie itin \cs55\i0\expndtw0 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 pa\f0\cchs186 \'fe\f0\cchs186 inim\f0\cchs186 \'e0\f0\cchs186 , ugdym\f0\cchs186 \'e0\f0\cchs186 , \cs52\expndtw-20\fs30 j \cs55\expndtw0\fs22 psichologij\f0\cchs186 \'e0\f0\cchs186 , \cs44 kir\f0\cchs186 \'f8\f0\cchs186 \cs55\f0\cchs186 \'f0\f0\cchs186 ali\f0\cchs186 \'f8\f0\cchs186 patirt j.\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1\cs49 .00\cell \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.97\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 8. \cs55 j Tr\f0\cchs186 \'fb\f0\cchs186 ksta \cs44 bendradarbiavimo \cs55 su patyrusiais \f0\cchs186 \'f0\f0\cchs186 ioje srityje kolegomis,\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.88\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.02\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s32\ql\li0\fi0\ri0\sb0\sa0\sl-356\slmult0 \intbl \cs52\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw-20\dn4\f0\cchs186\lang1063\langfe1063\fs30 1 \cs49\expndtw0\fs22 1\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtu0\dn0\f0\cchs186\lang1063\langfe1063\fs22 'r\f0\cchs186 \'fb\f0\cchs186 ksta \cs44 tinkamo \cs55 pasirengimo auk\f0\cchs186 \'f0\f0\cchs186 tojoje mokykloje.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 0.56\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.17\cell \pard\intbl\row \trowd\trgaph40 \trrh0 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx661 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7014 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx7751 \clvertalt\clbrdrt\brdrs\brdrw15\clbrdrl\brdrs\brdrw15\clbrdrb\brdrs\brdrw15\clbrdrr\brdrs\brdrw15\cltxlrtb\cellx8471 \pard \plain \s5\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 10. 7\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 r\f0\cchs186 \'fb\f0\cchs186 ksta galimybi\f0\cchs186 \'f8\f0\cchs186 \cs44 naudotis \cs55 kompiuteriu ir internetu.\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 -0.19\cell \pard \plain \s3\ql\li0\fi0\ri0\sb0\sa0 \intbl \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 1.33\cell \pard\intbl\row \pard}}}{\shp {\*\shpinst \shplid1{\sp{\sn relLeft}{\sv 2151}}{\sp{\sn relTop}{\sv 9267}}{\sp{\sn relRight}{\sv 8724}}{\sp{\sn relBottom}{\sv 10300}}{\sp{\sn fRelFlipH}{\sv 0}}{\sp{\sn fRelFlipV}{\sv 0}}{\sp{\sn shapeType}{\sv 202}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn lineColor}{\sv 16777215}}{\sp{\sn fPrint}{\sv 1}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fEditedWrap}{\sv 0}}{\sp{\sn txflTextFlow}{\sv 0}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFitTextToShape}{\sv 0}}{\shptxt \pard \plain \s2\qj\li0\fi0\ri0\sb0\sa0\sl-330\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Duomenys apie tai, ko mokytojams tr\f0\cchs186 \'fb\f0\cchs186 ksta darbui su itin\par \pard \plain \s20\ql\li0\fi2406\ri0\sb0\sa0\sl-330\slmult0\tlul\tx805 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 gabiais vaikais\line \lang1033 {\charscalex100\expndtw0\tab }\ul\lang1063 (Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , Janilionis,\ul0 Almonaitien\f0\cchs186 \'eb\f0\cchs186 , \cs49 2002)\par }}}}}\pard \plain \s11\qj\li0\fi0\ri0\sb0\sa0\sl-322\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 niams, galima manyti, kad jaunesni\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 klasi\f0\cchs186 \'f8\f0\cchs186 gabi\f0\cchs186 \'f8\f0\cchs186 mokini\fcchs186 \'f8\f0\cchs186 ugdymo rezulta\-tai \f0\cchs186\'fe\f0\cchs186 inomi ir fiksuojami tik klases ir mokyklos (atskirais atvejais savivaldyb\f0\cchs186 \'eb\f0\cchs186 s) lygmeniu. be to, olimpiad\f0\cchs186 \'f8\f0\cchs186 rezultatai - tai tik pasiekimai, \cs49 o \cs55 kas daroma klas\f0\cchs186 \'eb\-\f0\cchs186 je, \cs53\i\expndtw-10 mokykloje, \cs55\i0\expndtw0 kad tie pasiekimai b\f0\cchs186 \'fb\f0\cchs186 t\f0\cchs186 \'f8\f0\cchs186 tokie, ir \cs49 ar \cs55 tie pasiekimai \f0\cchs186 \'97\f0\cchs186 tai mokytojo ir mokinio darbo rezultatas ar tik mokinio potencialo \{vertinimas, informaci\-jos taip pat neturime arba turime labai nedaug \cs49 (\f0\cchs186 \'fe\f0\cchs186 r. \cs55 Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , \cs49 1997,1998, \cs55 2003, Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , Janilionis, Almonaitien\f0\cchs186 \'eb\f0\cchs186 , \cs49 2002).\par \pard \plain \s2\qj\li0\fi576\ri0\sb0\sa0\sl-322\slmult0 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Mokytoj\f0\cchs186 \'f8\f0\cchs186 rengimas. \cs55\i0\expndtw0 N\f0\cchs186 \'eb\f0\cchs186 vienas Lietuvos universitetas, rengiantis mokyto\-jus, nesi\f0\cchs186 \'fb\f0\cchs186 lo pirmos ar antros pakopos studij\f0\cchs186 \'f8\f0\cchs186 programos, kurios paskirtis b\f0\cchs186 \'fb\f0\cchs186 t\f0\cchs186 \'f8 \f0\cchs186 ai\f0\cchs186 \'f0\f0\cchs186 kiai orientuota \f0cchs186 \'e1\f0\cchs186 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo specialisto parengim\f0\cchs186 \'e0\f0\cchs186 . Per\f0\cchs186 \'fe\f0\cchs186 i\f0\cchs186 \'fb\f0\cchs186 r\f0\cchs186 \'eb\f0\cchs186 jus mokytoj\f0\cchs186 \'f8\f0\cchs186 rengimo programas Vilniaus pedagginiame, \f0\cchs186 \'d0\f0\cchs186 iauli\f0\cchs186 \'f8\f0\cchs186 , Kauno tech\-nologijos bei Vytauto Did\f0\cchs186 \'fe\f0\cchs186 iojo universitetuose, rasti tik du, be to, tik \cs63\i\expndtw-20 pasiren\-kamieji \cs55\i0\expndtw0 gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 problemoms skirti moduliai. Tai Vilniaus pedagoginiame universitete neakivaizdininkams \cs63\i\expndtw-20 si\f0\cchs186 \'fb\f0\cchs186 lomas \cs55\i0\expndtw0 modulis \f0\cchs186 \'84\f0\cchs186 Gabi\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 atpa\f0\cchs186 \'fe\f0\cchs186 inimas ir ugdymo galimyb\f0\cchs186 \'eb\f0\cchs186 s" bei \f0\cchs186 \'d0\f0\cchs186 iauli\f0\cchs186 \'f8\f0\cchs186 pedagoginiame universitete si\f0\cchs186 \'fb\f0\cchs186 lomas modulis \f0\cchs186 \'84\f0\cchs186 Gabi\f0\cchs186 \'f8\f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 psichologija".\par \pard \plain \s23\qj\li0\fi576\ri0\sb8\sa0\sl-322\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Lietuvos mokytojams, \cs49 tyrim\f0\cchs186 \'f8\f0\cchs186 duomenimis (Narkevi\f0\cchs186 \'e8\f0\cchs186 ien\f0\cchs186 \'eb\f0\cchs186 , \cs55 Janilionis, \cs49 Almonaitien\f0\cchs186 \'eb\f0\cchs186 , \cs55 2002), darbui su \cs49 gabiais vaikais tr\f0\cchs186 \'fb\f0\cchs186 ksta \cs55 ir tinkamo pasirengimo auk\f0\cchs186 \'f0\f0\cchs186 tojoje \cs49 mokykloje, ir kir\f0\cchs186 \'f8\f0\cchs186 \cs55 dalyk\f0\cchs186 \'f8\f0\cchs186 \cs49 (\f0\cchs186 \'fe\f0\cchs186 r. 4.2.3 lentel\f0\cchs186 \'e6\f0\cchs186 ).\par \pard \plain \s11\qr\li0\fi0\ri0{\sl-240\slmult0\fs20\p`r }\sb65\sa0 \cs49\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 4.2.3 \cs55 lentel\f0\cchs186 \'eb\par \pard \plain \s29\ql\li0\fi568\ri0\sb0\sa0\sl-722\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Lentel\f0\cchs186 \'eb\f0\cchs186 je teiginiai pateikti eil\f0\cchs186 \'eb\f0\cchs186 s tvarka pagal tr\f0\cchs186 \'fb\f0\cchs186 kumo \f0\cchs186 \'e1\f0\cchs186 vertinimo vidur\-k\f0\cchs186 \'e1\f0\cchs186 . Matome, jog labiausiai, mokytoj\f0\cchs186 \'f8\f0\cchs186 nuomone, tr\f0\cchs186 \'fb\f0\cchs186 ksta u\f0\cchs186 \'fe\f0\cchs186 mokes\f0\cchs186 \'e8\f0\cchs186 io u\f0\cchs186 \'fe\f0\cchs186 papil\-dom\f0\cchs186 \'e0\f0\cchs186 darb\f0\cchs186 \'e0\f0\cchs186 , materialinio paskatinimo gabiems vaikams ir bendros gabi\f0\cchs186 \'f8\f0\cchs186 vai\-k\f0\cchs186 \'f8\f0\cchs186 ugdymo politikos visos \f0\cchs186 \'f0\f0\cchs186 alies mastu. Su pirmu teiginiu visi\f0\cchs186 \'f0\f0\cchs186 kai sutiko \cs49 59%, \cs55 sutiko \cs49 30% \cs55 (t.y. i\f0\cchs186 \'f0\f0\cchs186 viso taip teig\f0\cchs186 \'eb\f0\cchs186 \cs49 89%) \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 , dar \cs49 7% \cs55 renkasi neutrali\f0\cchs186 \'e0 \f0\cchs186 pozicij\f0\cchs186 \'e0\f0\cchs186 . \cs49 88% \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 mano, jog tr\f0\cchs186 \'fb\f0\cchs186 ksta materialinio paskatinimo patiems gabiems mokiniams. \cs49 87% \cs55 respondent\f0\cchs186 \'f8\f0\cchs186 mano, kad tr\f0\cchs186 \'fb\f0\cchs186 ksta bendros itin gabi\f0\cchs186 \'f8 \f0\cchs186 vaik\f0\cchs186 \'f8\f0\cchs186 ugdymo politikos \f0\cchs186 \'d0\f0\cchs186 alies mastu; \cs49 84% \cs55 - apr\f0\cchs186 \'fb\f0\cchs186 pinimo mokymo metodi\-ne med\f0\cchs186 \'fe\f0\cchs186 iaga; \cs49 86% \cs55 - kvalifikacijos k\f0\cchs186 \'eb\f0\cchs186 limo kurs\f0\cchs186 \'f8\f0\cchs186 , \cs49 79% \cs55 - bendradarbiavimo su mokslininkais; \cs49 76% \cs55 - atitinkamos literat\f0\cchs186 \'fb\f0\cchs186 ras; \cs49 74% \cs55 - bendradarbiavimo su patyrusiais \f0\cchs186 \'f0\f0\cchs186 ioje srityje kolegomis (neutralus vertinimas - \cs49 14%). \cs55 Tinkamo pasirengimo auk\f0\cchs186 \'f0\f0\cchs186 tojoje mokykloje pasigedo \cs49 60% \cs55 apklaust\f0\cchs186 \'f8\f0\cchs186 j\f0\cchs186 \'f8\f0\cchs186 mokytoj\f0\cchs186 \'f8\f0\cchs186 , tik penktadalis \cs49 (21%) \cs55 j\f0\cchs186 \'f8\f0\cchs186 sutiko, jog auk\f0\cchs186 \'f0\f0\cchs186 toji mokykla pareng\f0\cchs186 \'eb\f0\cchs186 j\f0\cchs186 \'e1\f0\cchs186 /j\f0\cchs186 \'e0\f0\cchs186 \f0\cchs186 \'f0\f0\cchs186 iam darbui. Malonu pasteb\f0\cchs186 \'eb\f0\cchs186 ti, jog \cs49 56% \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 darbui su itin gabiais vaikais \expndtw-20 yra\expndtw0 skatina\-mi ir palaikomi mokyklos administracijos (neutralum\f0\cchs186 \'e0\f0\cchs186 vertinant teigin\f0\cchs186 \'e1\f0\cchs186 rinko\-si \cs49 18%). \cs55 Nema\f0\cchs186 \'fe\f0\cchs186 ai mokytoj\f0\cchs186 \'f8\f0\cchs186 turi galimybi\f0\cchs186 \'f8\f0\cchs186 naudotis kompiuteriu ir internetu \cs49 (49% \cs55 nejau\f0\cchs186 \'e8\f0\cchs186 ia tr\f0\cchs186 \'fb\f0\cchs186 kumo, \cs49 16% \cs55 lieka neutral\f0\cchs186 \'fb\f0\cchs186 s, \cs49 35% \cs55 tr\f0\cchs186 \'fb\f0\cchs186 ksta tokios galimybes). \cs49 46% \cs55 mokytoj\f0\cchs186 \'f8\f0\cchs186 jau\f0\cchs186 \'e8\f0\cchs186 ia t\f0\cchs186 \'eb\f0\cchs186 v\f0\cchs186 \'f8\f0\cchs186 palaikym\f0\cchs186 \'e0\f0\cchs186 , \cs49 31% \cs55 tokio palaikymo pasigenda.\par \pard \plain \s17\ql\li0\fi0\ri0\sb0\sa0\sl-322\slmult0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 Anketoje buvo palikta vieta laisvam atsakymui, ko \cs64\b\expndtw-20\fs26 dar tr\f0\cchs186 \'fb\f0\cchs186 ksta, \cs55\b0\expndtw0\f0\cchs186\fs22 \'e1\f0\cchs186 ra\f0\cchs186 \'f0\f0\cchs186 yti. Pa\-min\f0\cchs186 \'eb\f0\cchs186 tini tokie dalykai, kuri\f0\cchs186 \'f8\f0\cchs186 mokytojai nurod\f0\cchs186 \'eb\f0\cchs186 pasigendantys (kalba netaisyta): \cs63\i\expndtw-20 d\f0\cchs186 \'eb\f0\cchs186 mesio, sistemos Siame darbe; \f0\cchs186 \'e1\f0\cchs186 d\f0\cchs186 \'eb\f0\cchs186 jimu \f0\cchs186 \'e1\f0\cchs186 J\f0\cchs186 \'e1\f0\cchs186 darini plali\f0\cchs186 \'e0\f0\cchs186 ja prasme; pa$d laikmet\f0\cchs186 \'e1 \f0\cchs186 apr\f0\cchs186 \'fb\f0\cchs186 pinto kabineto; lenko; &bi\f0\cchs186 \'f8\f0\cchs186 mokini\f0\cchs186 \'f8\f0\cchs186 su ffra mokymosi motyvacija; skiriam\f0\cchs186 \'e0 \f0\cchs186 papildomai pamoki\f0\cchs186 \'e1\f0\cchs186 mokytojai - olimpiadoms ruo\f0\cchs186 \'f0\f0\cchs186 tis; materialin\f0\cchs186 \'eb\f0\cchs186 s bas\f0\cchs186 \'e6\f0\cchs186 s, ma&u* mokint\f0\cchs186 \'e0\f0\cchs186 skaiiiaus klas\f0\cchs186 \'eb\f0\cchs186 je, nes bana labai sunku diferencijuotai dirbti, meni nesp\f0\cchs186 \'eb\f0\cchs186 ja, kiti neturi k\f0\cchs186 \'e0\f0\cchs186 neikti, vadov\f0\cchs186 \'eb\f0\cchs186 liuose dainai n\f0\cchs186 \'eb\f0\cchs186 ra tinkam\f0\cchs186 \'e0\f0\cchs186 nf\f0\cchs186 \'eb\f0\cchs186 eoti\f0\cchs186 \'e0\f0\cchs186 ; dau\f0\cchs186 \'fe\f0\cchs186 tu stovykl\f0\cchs186 \'f8 \sub\f0\cchs186 ga\nosupersub /,iems tankiniam respublikos mastu, bet kad \f0\cchs186 \'e1\f0\cchs186 jos patekt\f0\cchs186 \'f8\f0\cchs186 irprmncijos vaikai, \expndtw0 o\expndtw-20 \expndtw0 neHk\expndtw-20 didf\f0\cchs186 \'e1\f0\cchs186 nj\f0\cchs186 \'f8\f0\cchs186 miest\f0\cchs186 \'f8\f0\cchs186 ; mokini\f0\achs186 \'f8\f0\cchs186 suinterrsmtama mokytis; laiko per pamokas m po pamnk\f0\cchs186 \'e0\f0\cchs186 ; bijau perkrauti mokinis nereikt\f0\cchs186 \'f8\f0\cchs186 niveliuoti \f0\cchs186 \'e1\f0\cchs186 tatna\f0\cchs186 \'f8\f0\cchs186 j/\f0\cchs186 \'f8\f0\cchs186 \expndtw0 irj\f0\cchs186 \'f8\expndtw-20\f0\cchs186 sukart\f0\cchs186 \'f8 \f0\cchs186 proffttm\f0\cchs186 \'f8\f0\cchs186 .\par \pard \plain \s34\qc\li0\fi0\ri0\sb102\sa0 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Apilmidrinamosios i\f0\cchs186 \'f0\f0\cchs186 vados\par \pard \plain \s29\ql\li584\fi0\ri0\sb110\sa0 \cs64\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs26 Tiriant GAVUS \cs55\b0\expndtw0\fs22 modelio rai\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'e0\f0\cchs186 visuomeniniame lygmenyje, i\f0\cchs186 \'f0\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs0 k\f0\cchs186 \'eb\f0\cchs186 jo\par \pard \plain \s11\ql\li0\fi0\ri0\sb102\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 tokios problemos:\par }\cchs186 sukart\f0\cchs186 \'f8 \f0\cchs186 proffttm\f0\cchs186 \'f8\f0\cchs186 .\par \pard \plain \s34\qc\li0\fi0\ri0\sb102\sa0 \cs63\b0\strike0\nosupersub\i\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs22 Apilmidrinamosios i\f0\cchs186 \'f0\f0\cchs186 vados\par \pard \plain \s29\ql\li584\fi0\ri0\sb110\sa0 \cs64\i0\strike0\nosupersub\b\scaps0\charscalex100\expndtw-20\dn0\f0\cchs186\lang1063\langfe1063\fs26 Tiriant GAVUS \cs55\b0\expndtw0\fs22 modelio rai\f0\cchs186 \'f0\f0\cchs186 k\f0\cchs186 \'e0\f0\cchs186 visuomeniniame lygmenyje, i\f0\cchs186 \'f0\f0\cchs186 ry\f0\cchs186 \'f0\f0\cchs0 k\f0\cchs186 \'eb\f0\cchs186 jo\par \pard \plain \s11\ql\li0\fi0\ri0\sb102\sa0 \cs55\b0\i0\strike0\nosupersub\scaps0\charscalex100\expndtw0\dn0\f0\cchs186\lang1063\langfe1063\fs22 tokios problemos:\par } diff --git a/sw/qa/extras/layout/data/forcepoint91.html b/sw/qa/extras/layout/data/forcepoint91.html new file mode 100644 index 0000000000..eacbd2e05a Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint91.html differ diff --git a/sw/qa/extras/layout/data/forcepoint92.doc b/sw/qa/extras/layout/data/forcepoint92.doc new file mode 100644 index 0000000000..7d9e02deca Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint92.doc differ diff --git a/sw/qa/extras/layout/data/forcepoint93-1.rtf b/sw/qa/extras/layout/data/forcepoint93-1.rtf new file mode 100644 index 0000000000..bbe5ecfb78 Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint93-1.rtf differ diff --git a/sw/qa/extras/layout/data/forcepoint93-2.rtf b/sw/qa/extras/layout/data/forcepoint93-2.rtf new file mode 100644 index 0000000000..bcc5f3dc88 Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint93-2.rtf differ diff --git a/sw/qa/extras/layout/data/forcepoint94.html b/sw/qa/extras/layout/data/forcepoint94.html new file mode 100644 index 0000000000..8be788f8e4 Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint94.html differ diff --git a/sw/qa/extras/layout/data/forcepoint98.html b/sw/qa/extras/layout/data/forcepoint98.html new file mode 100644 index 0000000000..9d4b76c53e Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint98.html differ diff --git a/sw/qa/extras/layout/data/forcepoint99.html b/sw/qa/extras/layout/data/forcepoint99.html new file mode 100644 index 0000000000..a964454f64 Binary files /dev/null and b/sw/qa/extras/layout/data/forcepoint99.html differ diff --git a/sw/qa/extras/layout/data/hidden-para-separator.docx b/sw/qa/extras/layout/data/hidden-para-separator.docx new file mode 100644 index 0000000000..1d5d26075f Binary files /dev/null and b/sw/qa/extras/layout/data/hidden-para-separator.docx differ diff --git a/sw/qa/extras/layout/data/horizontal_multilevel.odt b/sw/qa/extras/layout/data/horizontal_multilevel.odt new file mode 100644 index 0000000000..9bd1258650 Binary files /dev/null and b/sw/qa/extras/layout/data/horizontal_multilevel.odt differ diff --git a/sw/qa/extras/layout/data/image-comment.odt b/sw/qa/extras/layout/data/image-comment.odt new file mode 100644 index 0000000000..d861d3a9aa Binary files /dev/null and b/sw/qa/extras/layout/data/image-comment.odt differ diff --git a/sw/qa/extras/layout/data/in_056132_mod.odt b/sw/qa/extras/layout/data/in_056132_mod.odt new file mode 100644 index 0000000000..548401063b Binary files /dev/null and b/sw/qa/extras/layout/data/in_056132_mod.odt differ diff --git a/sw/qa/extras/layout/data/keep-with-next-fly.fodt b/sw/qa/extras/layout/data/keep-with-next-fly.fodt new file mode 100644 index 0000000000..13d6785f4e --- /dev/null +++ b/sw/qa/extras/layout/data/keep-with-next-fly.fodt @@ -0,0 +1,146 @@ + + + 2022-02-16T15:01:24.0881914252022-02-16T15:16:50.103419678PT15M29S1LibreOfficeDev/7.4.0.0.alpha0$Linux_X86_64 LibreOffice_project/16748887dd277bd63034e07b5e2a86740235b315 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ** Expression is faulty ** + + iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAABGdBTUEAANbY1E9YMgAAABl0 + RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFpSURBVHjaYvz//z8DtQBAADER + o+jjZGuibAQIICZiDOK/cgzFwEnrV/4HYXS1AAHERIxBR58yMiAb2DtzM1b1AAHERIxBIIBu + IDYAEEBMxBjE0bgdxcBL3vcZLl16jaEPIICYiDFIU9MSw8BeoeUYhgEEEBMxBnFx8WE1EN3L + AAHERIxBIECMgQABxAhKtPgM+vbtE9xmGP/69eMMP+o9wWLW0kD9OlYM/LlHGQECiAndoKg/ + USgGgTTmdS8C0yA+zIUgdeguBAggljtWdQwMVkDXACWMjd0ZXRun/Id5DWTA9C23GSaVxoEN + zISoARvoamnBYF2/hPHs2Z3/z0JdDhBADCBvIuPkhsn/QeDr14//QWwQjY0PVYeiFyCA8OaA + 3cdPoEQAiI8PAAQQEwMVAUAAsWATBAX0jx9fsWrAJQ4CAAGE1TBQwOMC9+9fwikHEEBYDQPF + IAzIe8TglEMHAAHESM2SFiDAADEwCe4BJwcYAAAAAElFTkSuQmCC + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/legend-itemorder-min.docx b/sw/qa/extras/layout/data/legend-itemorder-min.docx new file mode 100644 index 0000000000..8783d39082 Binary files /dev/null and b/sw/qa/extras/layout/data/legend-itemorder-min.docx differ diff --git a/sw/qa/extras/layout/data/linked_frames_section_bug.odt b/sw/qa/extras/layout/data/linked_frames_section_bug.odt new file mode 100644 index 0000000000..639332ad55 Binary files /dev/null and b/sw/qa/extras/layout/data/linked_frames_section_bug.odt differ diff --git a/sw/qa/extras/layout/data/long_legendentry.docx b/sw/qa/extras/layout/data/long_legendentry.docx new file mode 100644 index 0000000000..02f393ad03 Binary files /dev/null and b/sw/qa/extras/layout/data/long_legendentry.docx differ diff --git a/sw/qa/extras/layout/data/no-line-break-at-slash.fodt b/sw/qa/extras/layout/data/no-line-break-at-slash.fodt new file mode 100644 index 0000000000..e900594fa0 --- /dev/null +++ b/sw/qa/extras/layout/data/no-line-break-at-slash.fodt @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blah blah bla bla bla Foostrasse 13/c/2, etc. + + + diff --git a/sw/qa/extras/layout/data/ofz64109-1.fodt b/sw/qa/extras/layout/data/ofz64109-1.fodt new file mode 100644 index 0000000000..26a4bbbf63 Binary files /dev/null and b/sw/qa/extras/layout/data/ofz64109-1.fodt differ diff --git a/sw/qa/extras/layout/data/outside_long_data_label.docx b/sw/qa/extras/layout/data/outside_long_data_label.docx new file mode 100644 index 0000000000..fb5110a43e Binary files /dev/null and b/sw/qa/extras/layout/data/outside_long_data_label.docx differ diff --git a/sw/qa/extras/layout/data/piechart_leaderline.odt b/sw/qa/extras/layout/data/piechart_leaderline.odt new file mode 100644 index 0000000000..77c61a691e Binary files /dev/null and b/sw/qa/extras/layout/data/piechart_leaderline.odt differ diff --git a/sw/qa/extras/layout/data/redline_charatr.fodt b/sw/qa/extras/layout/data/redline_charatr.fodt new file mode 100644 index 0000000000..9f7c191629 --- /dev/null +++ b/sw/qa/extras/layout/data/redline_charatr.fodt @@ -0,0 +1,164 @@ + + + + foobarus 2018-05-25T14:53:46.6637330182018-05-25T14:56:49.778386195foobarus PT3M3S1LibreOfficeDev/6.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/3d9809bb6a20c34ef9f5ef0f4a6bc4eab7d8551f + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foobarus + 2018-05-25T14:56:22 + + + + + + + foobarus + 2018-05-25T14:56:24 + + + + + + + foobarus + 2018-05-25T14:56:27 + + + + + + + foobarus + 2018-05-25T14:56:29 + + + + + + + foobarus + 2018-05-25T14:56:32 + + + + + + + foobarus + 2018-05-25T14:56:34 + + + + + + + foobarus + 2018-05-25T14:56:36 + + + + + + + foobarus + 2018-05-25T14:56:38 + + + + + + + foobarus + 2018-05-25T14:56:40 + + + + + + + foobarus + 2018-05-25T14:56:42 + + + + + + + foobarus + 2018-05-25T14:56:44 + + + + + foobarbaz + foobarbaz + foobarbaz + foobarbaz + foobarbaz + foobarbaz + foobarbaz + foobarbaz + foobarbaz + foobarbaz + foobarbaz + + + diff --git a/sw/qa/extras/layout/data/redline_footnote_pagination.fodt b/sw/qa/extras/layout/data/redline_footnote_pagination.fodt new file mode 100644 index 0000000000..e4a6e5db7b --- /dev/null +++ b/sw/qa/extras/layout/data/redline_footnote_pagination.fodt @@ -0,0 +1,792 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Seite 2von 2 + + + + + + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + Zahl? + + + + + + + 1970-01-01T00:00:00 + + Xx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + x + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + xx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + xxx + + + + + + + 1970-01-01T00:00:00 + + xx Xxxxxxx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + xxxxxx, + + + + + + + 1970-01-01T00:00:00 + + xxxx + + + + + + + 1970-01-01T00:00:00 + + xxxxxxxx xxxxxxx xxxxx + + + + + + + 1970-01-01T00:00:00 + + xx xxxxxxxxxxxxxxx xxxxxxxxxx + + + + + + + 1970-01-01T00:00:00 + + xxxx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + , + + + + + + + 1970-01-01T00:00:00 + + xx xxxxxxxxxxxxxxxx xxx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + x + + + + + + + 1970-01-01T00:00:00 + + x + + + + + + + 1970-01-01T00:00:00 + + 1 + xxxxxxx? + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + 2 + Xxx xxxxx xxxx xxxxx xxxxxxxxxx xxx xxxxxx xxxx? (xxxx: xxxx. xxxxxxxxxxx. xxxxxx xxx xxxxxxxxxxxx xxx xxxxx xx xxx xx xxxxxxx xxxxxxxxx xxx xxxxxxxxxx xxx xxx. xxxx xxxxx) + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + xxxxxxxxxxxxxxxxxxx ( + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + ) + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + 3 + xxx xxx xxx xxxxxxxxxxxxxxxxx xxx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + 4 + xxxxx xxxxxx xxxxxxxxx, xx xxxxxx xxxx xxxxxxxxx? (xxxx: xxxx xxxxxxxxxx, xxxx xxxx xx xxx xxxx xxx xx xxx xxx xxxxxxxxxxx) + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + 5 + xxxx? + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + 7 + xx xxxxx xxxxxxx xx xxxxxxx xxxxxxxxx xxx xxxxxxxxxxxx xxxxxxx. + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + 9 + xxxx? / xxxx xxxxxxxx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + + + + + + + 1970-01-01T00:00:00 + + xx + + + + + + + 1970-01-01T00:00:00 + + + + + + + + + + + + xxx xxxxxxxxx xxxxxxxxxxxxxxxxxx xxx xxxxxxxxxxxxx xxx xxxxxx xxxxxxx xxxx xxxxxxxxxxxx xxxxxxxxxxxx xxx xxx xxx xxxx xxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxx xxxxxxxxxxxxxx xxxx xxxxx xx xxx xxxxxxx xxxxxxx xxxxxxxxxx. Xxxxxxxx xxx xxxxxxxxxxxx xxxx xxx xx. xxx xxxxxxxxxxxxx xxx xxxxxxx xxx xxxxxxxxxxxx xxx xx. xxx xxxxxxxxxxxxx, xxxxxxxxxxxx xxx xxxxxxxxxxxxx xxx xxxxxxxxxxxxx xxx xxxxxxxxxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxx xxxxxxxx xxxxxxxxxxxxx xxxxxxx. xxx xxxxx xxx xxxxxxxxxxxxx xxx xxxxxx xxxxxxxxx xxxxxxxxxxxxxxxxxxx xx xxxxxxxxxxxxxxx xxxxxxxxxx xxxxxxx. xx xxxxxxxx xxx xxx xxxx xxxx xxxxxxxxx xx xxx xxxxxxxxxxxx xxxxxxxxxxxxxxxxxx (xxxx) xxx xxx xxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxx xxx xxxxxxxx xxxxxxxxxxxxxx xxx xxxxxx xxx xxxxxxxx xxxxxxxxxx xxx xxxxxxxxxxx. xxxxxxxxxx xxx xxxx xxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxx xxxxxxxxxxxxxxxx xxx xx xxxxx xxx xxxxx xxxxxxxxx xxxxxx xxx xxxxx xxx xxxxx xxxx xxxx xxxxxxx xxx xxxxxxxx xxxxxxx xxx xxxxx xxxxxxxx xxx xxxxxxxxxxxxx xxxxxxxx.xxx xxxxxx xxxxxxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxx xxxxx xxx xxxxxx xxxxxxxxxxxx xxxx xxx xxxxx xxx xxx xxxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxx xxx xxx xxxxxxxxxxxx xxxxxxxxx xxxxxxx xxxx xxxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xx xxx xxxxxxxxxx xxxxxxxx. xxxxxxxxx xx xxxxxxx xxx xxxxxxxxx xxxxxxxxxxxxxx xxxxx xxx xxxxxxxxxxxxxxxxxx xxxx xxxxxxx xxxxxxxxxx xxx xxxxxxxx xxx, xx xxx xxxxxxxxxxxxxx xxxx xxxxxxx xx xxxxxxxxxxxx. + xxx xxxxxxxx xxxxxx xxx xxxxxxxx xxx xxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxx (xxx) xxx xxxx xxxxxx xxxx xxx xxx xxxx xxx xxxxxxxx xxxxxxxxxxx xx x-xx-xxxxxxx xxxxxxxxxxx xxxxxxxxxxxx xxx xxxxx xxxx xxxx xxxxxx xxx. xxx xxxxxxx xxx xxxxxxxxxxxx xxxxx xxxxxxxxxxx xxxxxxxx xxxxx xxxxx xxxx xxx xxx xxx xxx. xxxx xxxxxxxxxxxxx xxxxxx xxx xxx xxxx xxxxx xx xxxxxxxx xxxxxxxxxxxxxx xxx xxxxxxxxxxx xx. xxxx, xxx xxxxxxx xxxxxxxxxxx xxxxxxxxxxxx (xx) xxxxxxx xx xxxx xxxx xx xxxxxxxxxxx xxxxxxx xxx xxxxxxxxxxxxxxxxxxx xxxxxxxxxxx. xxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxx xxxxxxxxx, xxxxxxxxxxxx xxx xxxxxxxxxxxxxxx xxxxxx xxx xxx xxxx xxxxxxxxxxxxx xxxxxxxxxxx xxxxx xxxxxxxx, xxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxx xxx. xxxxxxxxxxxx. xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx xxxx xxxxxxxxxxx xxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxx xxxxx xxxxxxxxxx, xxxxxxxxxxxxxxx, xxxxxxxxxxxxxxx xxx., xxx xxxxxxx xxx xxxxx xxxxxxxxxxxx xxx xxxxx xxxxxxxxxx xxxxxxx. 1 + xxxx xxxxxxxxxx, xx xxx xxx xxxxxxxx xxxx. xxxxxxxxx xxx xxx xxxx xxxxxx xxxxxxx ?xxx xxxxxxxxx xxxxx xxxxxxxxxx xxxxxxxxxxxxxxx yyyyyyyyy yyy yyyyyyyyyyyyyyyy yyyyyyy yyy yyyyy yyyyyyyyy yyy yyyyyyyyy zzz. zzz zzzz zzzz zzz zzz zzzzzzz zzz zzzz zzzzzzzzzzzzzz zzzzzzzzzzzz xxxxx xxxxxxxxxxxxxxx. xxxx xxx xxx xxxxxxxxx xxx xxxxxxxxxx xxx xxxxxxxxx xxx. xxx xxxx xxxxx xxxxxxxxxx xxxxxxxxxxxxxxxster xxxxxxxxxxxxxxx xxxxx xxxxxxxxxxxxxxx. 2 + xxx xxxxxxxxxxxxx xxx xxxxx xxx xxxxxxxxxxxxxxx xxxxxx xxx xxx xxxxxxxxx xxxxx xxxxxxxxx xxxxxx. xxx xxx xxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxx xxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxx xxxx xxx xxxxxxxx xxxxxxxxxx xxxxxxxxxx xxxxxx. xx xxxxxxxx xxx xxx xxxxxxx xxxxxxxxxxxxxx xx xxx xxxxx xxxxxxx xxx xxxx xxxxxxx xxx xxxxxxxxxx xxxxxxx xxxxx xxxxxxxx. xxx xxxxx xxx xxxx xx x- xxx x-xxxxxxx xxxxxxxxxxx xxx xxxxxxxxxxxxx xxx xxxx xxxxxxxxxxx xxxxxxxxxxxx xxx xx. xxx xxxxxxxxxxxxx xxx xxxxxx xxxxxxxxxxxx xxxxxx xxxxxxxx xxxxxx. + + + + diff --git a/sw/qa/extras/layout/data/redline_footnotes.odt b/sw/qa/extras/layout/data/redline_footnotes.odt new file mode 100644 index 0000000000..383fc7273e Binary files /dev/null and b/sw/qa/extras/layout/data/redline_footnotes.odt differ diff --git a/sw/qa/extras/layout/data/redline_sections.fodt b/sw/qa/extras/layout/data/redline_sections.fodt new file mode 100644 index 0000000000..69fd03dc3a --- /dev/null +++ b/sw/qa/extras/layout/data/redline_sections.fodt @@ -0,0 +1,110 @@ + + + + 2018-08-13T15:30:43.1565511832018-08-13T15:55:10.667743508PT1M51S2LibreOfficeDev/6.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/3d9809bb6a20c34ef9f5ef0f4a6bc4eab7d8551f + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2018-08-13T15:31:07 + + o + + + + FRAME + + bar + baz + + b + + + + + + Unknown Author + 2018-08-13T15:55:07 + + o + bar + b + + + + + folah + + + folah + + + + + diff --git a/sw/qa/extras/layout/data/redline_table.fodt b/sw/qa/extras/layout/data/redline_table.fodt new file mode 100644 index 0000000000..37fa642ec2 --- /dev/null +++ b/sw/qa/extras/layout/data/redline_table.fodt @@ -0,0 +1,128 @@ + + + + 2018-08-13T12:54:45.8768882392018-08-13T12:56:12.482549728PT1M26S2LibreOfficeDev/6.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/3d9809bb6a20c34ef9f5ef0f4a6bc4eab7d8551f + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2018-08-13T12:55:06 + + + + + foo + + + + + + + + FRAME + + aaa + + + + + + + + + + + ddd + + + + bar + + + diff --git a/sw/qa/extras/layout/data/s4_min2.fodt b/sw/qa/extras/layout/data/s4_min2.fodt new file mode 100644 index 0000000000..e1317de597 --- /dev/null +++ b/sw/qa/extras/layout/data/s4_min2.fodt @@ -0,0 +1,360 @@ + + + CIB_OfficeDev/6.1.7.41$Linux_X86_64 LibreOffice_project/1df0ab666a1bb346850daa72aaa2e29a697a252c2023-06-26T22:28:03.054604345de-DE11PT14M3S2023-06-26T23:06:43.147312212 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 2- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Second box + + + + Third box + + + + + + + + + Something + + + + + + Important here + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum consequat mi quis pretium semper. Proin luctus orci ac neque venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cursus egestas. Donec blandit auctor arcu, nec pellentesque eros molestie eget. In consectetur aliquam hendrerit. Sed cursus mauris vitae ligula pellentesque, non pellentesque urna aliquet. Fusce placerat mauris enim, nec rutrum purus semper vel. Praesent tincidunt neque eu pellentesque pharetra. Fusce pellentesque est orci. + Integer sodales tincidunt tristique. Sed a metus posuere, adipiscing nunc et, viverra odio. Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. Cras sodales nisl sed orci mattis iaculis. Nunc eget dolor accumsan, pharetra risus a, vestibulum mauris. Nunc vulputate lobortis mollis. Vivamus nec tellus faucibus, tempor magna nec, facilisis felis. Donec commodo enim a vehicula pellentesque. Nullam vehicula vestibulum est vel ultricies. + Aliquam velit massa, laoreet vel leo nec, volutpat facilisis eros. Donec consequat arcu ut diam tempor luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent vitae lacus vel leo sodales pharetra a a nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam luctus tempus nibh, fringilla dictum augue consectetur eget. Curabitur at ante sit amet tortor pharetra molestie eu nec ante. Mauris tincidunt, nibh eu sollicitudin molestie, dolor sapien congue tortor, a pulvinar sapien turpis sed ante. Donec nec est elementum, euismod nulla in, mollis nunc. + + + Second page + + Page 3 + + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/space+break.fodt b/sw/qa/extras/layout/data/space+break.fodt new file mode 100644 index 0000000000..7b53a8b012 --- /dev/null +++ b/sw/qa/extras/layout/data/space+break.fodt @@ -0,0 +1,50 @@ + + + + + + false + false + false + 0 + false + high-resolution + false + false + true + true + false + false + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/stable-at-page-anchored-fly-position.odt b/sw/qa/extras/layout/data/stable-at-page-anchored-fly-position.odt new file mode 100644 index 0000000000..e5a3779c54 Binary files /dev/null and b/sw/qa/extras/layout/data/stable-at-page-anchored-fly-position.odt differ diff --git a/sw/qa/extras/layout/data/tab-over-margin.odt b/sw/qa/extras/layout/data/tab-over-margin.odt new file mode 100644 index 0000000000..1413f2f6df Binary files /dev/null and b/sw/qa/extras/layout/data/tab-over-margin.odt differ diff --git a/sw/qa/extras/layout/data/tabellen_test_windows_1.odt b/sw/qa/extras/layout/data/tabellen_test_windows_1.odt new file mode 100644 index 0000000000..a666fe5fd4 Binary files /dev/null and b/sw/qa/extras/layout/data/tabellen_test_windows_1.odt differ diff --git a/sw/qa/extras/layout/data/table-extrusion1.odt b/sw/qa/extras/layout/data/table-extrusion1.odt new file mode 100644 index 0000000000..10600fa54c Binary files /dev/null and b/sw/qa/extras/layout/data/table-extrusion1.odt differ diff --git a/sw/qa/extras/layout/data/table-extrusion2.odt b/sw/qa/extras/layout/data/table-extrusion2.odt new file mode 100644 index 0000000000..63fc74f46d Binary files /dev/null and b/sw/qa/extras/layout/data/table-extrusion2.odt differ diff --git a/sw/qa/extras/layout/data/table_cell_overlap.fodt b/sw/qa/extras/layout/data/table_cell_overlap.fodt new file mode 100644 index 0000000000..e9565054de --- /dev/null +++ b/sw/qa/extras/layout/data/table_cell_overlap.fodt @@ -0,0 +1,161 @@ + + + 2022-02-11T15:45:44.5250152262022-02-11T15:51:17.840027874PT5M32S4LibreOfficeDev/6.3.6.11$Linux_X86_64 LibreOffice_project/798c41960be08155f4f9734c6307615ab45c134e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ONE: + + + + + TWO: + + + + + + + + + + diff --git a/sw/qa/extras/layout/data/table_in_text_change.fodt b/sw/qa/extras/layout/data/table_in_text_change.fodt new file mode 100644 index 0000000000..6d1ccaf2c2 --- /dev/null +++ b/sw/qa/extras/layout/data/table_in_text_change.fodt @@ -0,0 +1,66 @@ + + + + + + + + + x + 2023-06-13T12:47:02 + + + + + + + x + 2023-06-13T12:43:39 + + + + + Whole tables in tracked text deletion + + + + + 1 + + + 2 + + + + + 3 + + + 4 + + + + Whole tables in tracked text insertion + + + + + I + + + II + + + + + III + + + IV + + + + + + + diff --git a/sw/qa/extras/layout/data/tdf104797.docx b/sw/qa/extras/layout/data/tdf104797.docx new file mode 100644 index 0000000000..6e52190ce6 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf104797.docx differ diff --git a/sw/qa/extras/layout/data/tdf105481.odt b/sw/qa/extras/layout/data/tdf105481.odt new file mode 100644 index 0000000000..73cd892620 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf105481.odt differ diff --git a/sw/qa/extras/layout/data/tdf106153.docx b/sw/qa/extras/layout/data/tdf106153.docx new file mode 100644 index 0000000000..cba072360d Binary files /dev/null and b/sw/qa/extras/layout/data/tdf106153.docx differ diff --git a/sw/qa/extras/layout/data/tdf106234.fodt b/sw/qa/extras/layout/data/tdf106234.fodt new file mode 100644 index 0000000000..18667c4ab1 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf106234.fodt @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem ipsumdolor sit amet, consectetur adipiscing elit. (Justify after left-aligned tab) + Lorem ipsumdolor sit amet, consectetur adipiscing elit. (Don’t justify after centered tab!) + + + diff --git a/sw/qa/extras/layout/data/tdf106390.odt b/sw/qa/extras/layout/data/tdf106390.odt new file mode 100644 index 0000000000..b2adf5332e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf106390.odt differ diff --git a/sw/qa/extras/layout/data/tdf108021.odt b/sw/qa/extras/layout/data/tdf108021.odt new file mode 100644 index 0000000000..a81fe9c9a4 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf108021.odt differ diff --git a/sw/qa/extras/layout/data/tdf109077.docx b/sw/qa/extras/layout/data/tdf109077.docx new file mode 100644 index 0000000000..c0a67d2765 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf109077.docx differ diff --git a/sw/qa/extras/layout/data/tdf109137.docx b/sw/qa/extras/layout/data/tdf109137.docx new file mode 100644 index 0000000000..03e2423bc1 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf109137.docx differ diff --git a/sw/qa/extras/layout/data/tdf112290.docx b/sw/qa/extras/layout/data/tdf112290.docx new file mode 100644 index 0000000000..c49b5e384b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf112290.docx differ diff --git a/sw/qa/extras/layout/data/tdf113014.fodt b/sw/qa/extras/layout/data/tdf113014.fodt new file mode 100644 index 0000000000..86f26310ac --- /dev/null +++ b/sw/qa/extras/layout/data/tdf113014.fodt @@ -0,0 +1,108 @@ + + + + 2018-08-13T16:49:19.8844595662018-08-13T16:56:24.066877759PT7M6S2LibreOfficeDev/6.4.0.0.alpha0$Linux_X86_64 LibreOffice_project/628fbb66869ea82a1f38132ff2ba39e9666083eb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + First column should have numbering showing + + + + + + + + + + + + But, if the cell is too small for the margin, then the text is hidden. + + + + + + + + + + + diff --git a/sw/qa/extras/layout/data/tdf114163.odt b/sw/qa/extras/layout/data/tdf114163.odt new file mode 100644 index 0000000000..cf22e1160b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf114163.odt differ diff --git a/sw/qa/extras/layout/data/tdf115094.docx b/sw/qa/extras/layout/data/tdf115094.docx new file mode 100644 index 0000000000..c6c0176c2a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf115094.docx differ diff --git a/sw/qa/extras/layout/data/tdf115523.fodt b/sw/qa/extras/layout/data/tdf115523.fodt new file mode 100644 index 0000000000..a998999564 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf115523.fodt @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2019-10-22T08:48:10 + + + + + + + It + + + em + + + Item + + + + + diff --git a/sw/qa/extras/layout/data/tdf115524.fodt b/sw/qa/extras/layout/data/tdf115524.fodt new file mode 100644 index 0000000000..4e589ad9a1 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf115524.fodt @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2022-06-27T14:35:42 + + + + + + + Item + + + Item + + + New item + + + Item + + + + + diff --git a/sw/qa/extras/layout/data/tdf115630.docx b/sw/qa/extras/layout/data/tdf115630.docx new file mode 100644 index 0000000000..e9f6339a12 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf115630.docx differ diff --git a/sw/qa/extras/layout/data/tdf116256.docx b/sw/qa/extras/layout/data/tdf116256.docx new file mode 100644 index 0000000000..6939bc99b9 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf116256.docx differ diff --git a/sw/qa/extras/layout/data/tdf116486.docx b/sw/qa/extras/layout/data/tdf116486.docx new file mode 100644 index 0000000000..a90651ff6f Binary files /dev/null and b/sw/qa/extras/layout/data/tdf116486.docx differ diff --git a/sw/qa/extras/layout/data/tdf116501.odt b/sw/qa/extras/layout/data/tdf116501.odt new file mode 100644 index 0000000000..9e9d03f61f Binary files /dev/null and b/sw/qa/extras/layout/data/tdf116501.odt differ diff --git a/sw/qa/extras/layout/data/tdf116830.odt b/sw/qa/extras/layout/data/tdf116830.odt new file mode 100644 index 0000000000..8faacc3dda Binary files /dev/null and b/sw/qa/extras/layout/data/tdf116830.odt differ diff --git a/sw/qa/extras/layout/data/tdf116848.odt b/sw/qa/extras/layout/data/tdf116848.odt new file mode 100644 index 0000000000..e3a96c78a5 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf116848.odt differ diff --git a/sw/qa/extras/layout/data/tdf116925.docx b/sw/qa/extras/layout/data/tdf116925.docx new file mode 100644 index 0000000000..1c99752e9e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf116925.docx differ diff --git a/sw/qa/extras/layout/data/tdf117028.docx b/sw/qa/extras/layout/data/tdf117028.docx new file mode 100644 index 0000000000..877264b4db Binary files /dev/null and b/sw/qa/extras/layout/data/tdf117028.docx differ diff --git a/sw/qa/extras/layout/data/tdf117187.odt b/sw/qa/extras/layout/data/tdf117187.odt new file mode 100644 index 0000000000..b0aa598533 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf117187.odt differ diff --git a/sw/qa/extras/layout/data/tdf117188.docx b/sw/qa/extras/layout/data/tdf117188.docx new file mode 100644 index 0000000000..418f665ae7 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf117188.docx differ diff --git a/sw/qa/extras/layout/data/tdf117245.odt b/sw/qa/extras/layout/data/tdf117245.odt new file mode 100644 index 0000000000..7008c325ba Binary files /dev/null and b/sw/qa/extras/layout/data/tdf117245.odt differ diff --git a/sw/qa/extras/layout/data/tdf117923.doc b/sw/qa/extras/layout/data/tdf117923.doc new file mode 100644 index 0000000000..c43cf40c9f Binary files /dev/null and b/sw/qa/extras/layout/data/tdf117923.doc differ diff --git a/sw/qa/extras/layout/data/tdf117923.docx b/sw/qa/extras/layout/data/tdf117923.docx new file mode 100644 index 0000000000..c10ac24050 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf117923.docx differ diff --git a/sw/qa/extras/layout/data/tdf117982.docx b/sw/qa/extras/layout/data/tdf117982.docx new file mode 100644 index 0000000000..f5886215b9 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf117982.docx differ diff --git a/sw/qa/extras/layout/data/tdf118058.fodt b/sw/qa/extras/layout/data/tdf118058.fodt new file mode 100644 index 0000000000..dbdf26bf51 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf118058.fodt @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Para 1.No. However, you will not be able to see the colours produced on a black-and-white set. + + + diff --git a/sw/qa/extras/layout/data/tdf118672.odt b/sw/qa/extras/layout/data/tdf118672.odt new file mode 100644 index 0000000000..5f480f670a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf118672.odt differ diff --git a/sw/qa/extras/layout/data/tdf119875.odt b/sw/qa/extras/layout/data/tdf119875.odt new file mode 100644 index 0000000000..6f579546e3 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf119875.odt differ diff --git a/sw/qa/extras/layout/data/tdf120287.fodt b/sw/qa/extras/layout/data/tdf120287.fodt new file mode 100644 index 0000000000..55527c1e27 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf120287.fodt @@ -0,0 +1,40 @@ + + + + + true + true + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + b)Lorem ipsum dolor sit amet, consetetur sadips1 2 3 4 5 6 78sed diam + + + diff --git a/sw/qa/extras/layout/data/tdf120287b.fodt b/sw/qa/extras/layout/data/tdf120287b.fodt new file mode 100644 index 0000000000..137bb6c9d7 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf120287b.fodt @@ -0,0 +1,45 @@ + + + + + true + high-resolution + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + b)Lorem ipsum dolor sit amet, consetetur sadips1 2 3 4 5 6 78a b c d e sed diam + + + diff --git a/sw/qa/extras/layout/data/tdf120287c.fodt b/sw/qa/extras/layout/data/tdf120287c.fodt new file mode 100644 index 0000000000..f367336d79 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf120287c.fodt @@ -0,0 +1,46 @@ + + + + + true + high-resolution + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + b) x x x Lorem ipsum dolor sit amet, consetetur sadips test Lorem ipsum dolor sit amet, consetetur sadips1 2 3 4 5 6 7 8 9 a b sed diam + + + diff --git a/sw/qa/extras/layout/data/tdf121658.odt b/sw/qa/extras/layout/data/tdf121658.odt new file mode 100644 index 0000000000..b3429ff41a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf121658.odt differ diff --git a/sw/qa/extras/layout/data/tdf122014.docx b/sw/qa/extras/layout/data/tdf122014.docx new file mode 100644 index 0000000000..4009394959 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf122014.docx differ diff --git a/sw/qa/extras/layout/data/tdf122225.docx b/sw/qa/extras/layout/data/tdf122225.docx new file mode 100644 index 0000000000..e4f0cc35f0 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf122225.docx differ diff --git a/sw/qa/extras/layout/data/tdf122607.odt b/sw/qa/extras/layout/data/tdf122607.odt new file mode 100644 index 0000000000..123e04702e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf122607.odt differ diff --git a/sw/qa/extras/layout/data/tdf122607_leerzeile.odt b/sw/qa/extras/layout/data/tdf122607_leerzeile.odt new file mode 100644 index 0000000000..9819a22934 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf122607_leerzeile.odt differ diff --git a/sw/qa/extras/layout/data/tdf122800.odt b/sw/qa/extras/layout/data/tdf122800.odt new file mode 100644 index 0000000000..ff1e35cfb4 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf122800.odt differ diff --git a/sw/qa/extras/layout/data/tdf122878.docx b/sw/qa/extras/layout/data/tdf122878.docx new file mode 100644 index 0000000000..f42e92ea26 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf122878.docx differ diff --git a/sw/qa/extras/layout/data/tdf123163-1.docx b/sw/qa/extras/layout/data/tdf123163-1.docx new file mode 100644 index 0000000000..8cc9a4f0eb Binary files /dev/null and b/sw/qa/extras/layout/data/tdf123163-1.docx differ diff --git a/sw/qa/extras/layout/data/tdf123268.odt b/sw/qa/extras/layout/data/tdf123268.odt new file mode 100644 index 0000000000..e68c8139f5 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf123268.odt differ diff --git a/sw/qa/extras/layout/data/tdf123651.docx b/sw/qa/extras/layout/data/tdf123651.docx new file mode 100644 index 0000000000..4cda0b4e7f Binary files /dev/null and b/sw/qa/extras/layout/data/tdf123651.docx differ diff --git a/sw/qa/extras/layout/data/tdf123898.odt b/sw/qa/extras/layout/data/tdf123898.odt new file mode 100644 index 0000000000..31800aadb1 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf123898.odt differ diff --git a/sw/qa/extras/layout/data/tdf124261.docx b/sw/qa/extras/layout/data/tdf124261.docx new file mode 100644 index 0000000000..1d3efa5276 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf124261.docx differ diff --git a/sw/qa/extras/layout/data/tdf124423.docx b/sw/qa/extras/layout/data/tdf124423.docx new file mode 100644 index 0000000000..d48cc60b29 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf124423.docx differ diff --git a/sw/qa/extras/layout/data/tdf124423.odt b/sw/qa/extras/layout/data/tdf124423.odt new file mode 100644 index 0000000000..2202c93c5c Binary files /dev/null and b/sw/qa/extras/layout/data/tdf124423.odt differ diff --git a/sw/qa/extras/layout/data/tdf124600.docx b/sw/qa/extras/layout/data/tdf124600.docx new file mode 100644 index 0000000000..fc732b5e73 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf124600.docx differ diff --git a/sw/qa/extras/layout/data/tdf124601.doc b/sw/qa/extras/layout/data/tdf124601.doc new file mode 100644 index 0000000000..fdfde8215f Binary files /dev/null and b/sw/qa/extras/layout/data/tdf124601.doc differ diff --git a/sw/qa/extras/layout/data/tdf124601b.doc b/sw/qa/extras/layout/data/tdf124601b.doc new file mode 100644 index 0000000000..a580e81d3d Binary files /dev/null and b/sw/qa/extras/layout/data/tdf124601b.doc differ diff --git a/sw/qa/extras/layout/data/tdf124796.odt b/sw/qa/extras/layout/data/tdf124796.odt new file mode 100644 index 0000000000..2a8d2c816a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf124796.odt differ diff --git a/sw/qa/extras/layout/data/tdf125300.docx b/sw/qa/extras/layout/data/tdf125300.docx new file mode 100644 index 0000000000..757a329d51 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf125300.docx differ diff --git a/sw/qa/extras/layout/data/tdf125334.odt b/sw/qa/extras/layout/data/tdf125334.odt new file mode 100644 index 0000000000..82357f7107 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf125334.odt differ diff --git a/sw/qa/extras/layout/data/tdf125335.odt b/sw/qa/extras/layout/data/tdf125335.odt new file mode 100644 index 0000000000..992d934710 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf125335.odt differ diff --git a/sw/qa/extras/layout/data/tdf125893.docx b/sw/qa/extras/layout/data/tdf125893.docx new file mode 100644 index 0000000000..f46f9af05a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf125893.docx differ diff --git a/sw/qa/extras/layout/data/tdf126244.docx b/sw/qa/extras/layout/data/tdf126244.docx new file mode 100644 index 0000000000..cf3b0d14a7 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf126244.docx differ diff --git a/sw/qa/extras/layout/data/tdf127118.docx b/sw/qa/extras/layout/data/tdf127118.docx new file mode 100644 index 0000000000..d26495944d Binary files /dev/null and b/sw/qa/extras/layout/data/tdf127118.docx differ diff --git a/sw/qa/extras/layout/data/tdf127235.odt b/sw/qa/extras/layout/data/tdf127235.odt new file mode 100644 index 0000000000..5b27c921cf Binary files /dev/null and b/sw/qa/extras/layout/data/tdf127235.odt differ diff --git a/sw/qa/extras/layout/data/tdf127304.odt b/sw/qa/extras/layout/data/tdf127304.odt new file mode 100644 index 0000000000..e8a4d6e03b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf127304.odt differ diff --git a/sw/qa/extras/layout/data/tdf128198-1.docx b/sw/qa/extras/layout/data/tdf128198-1.docx new file mode 100644 index 0000000000..7c9974d562 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf128198-1.docx differ diff --git a/sw/qa/extras/layout/data/tdf128399.docx b/sw/qa/extras/layout/data/tdf128399.docx new file mode 100644 index 0000000000..04e1424ed9 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf128399.docx differ diff --git a/sw/qa/extras/layout/data/tdf128611.fodt b/sw/qa/extras/layout/data/tdf128611.fodt new file mode 100644 index 0000000000..e4606575c9 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf128611.fodt @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Abcd efghijkl + + + B1 Line1Line2Line3Line4Line5Line6Line7Line8 + + + + + + + diff --git a/sw/qa/extras/layout/data/tdf128959.docx b/sw/qa/extras/layout/data/tdf128959.docx new file mode 100644 index 0000000000..f22f665044 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf128959.docx differ diff --git a/sw/qa/extras/layout/data/tdf128966-2-min.odt b/sw/qa/extras/layout/data/tdf128966-2-min.odt new file mode 100644 index 0000000000..d741f3d937 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf128966-2-min.odt differ diff --git a/sw/qa/extras/layout/data/tdf128996.docx b/sw/qa/extras/layout/data/tdf128996.docx new file mode 100644 index 0000000000..8b6e77214b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf128996.docx differ diff --git a/sw/qa/extras/layout/data/tdf129054.docx b/sw/qa/extras/layout/data/tdf129054.docx new file mode 100644 index 0000000000..5d02d7e87a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf129054.docx differ diff --git a/sw/qa/extras/layout/data/tdf129095.docx b/sw/qa/extras/layout/data/tdf129095.docx new file mode 100644 index 0000000000..3647028fca Binary files /dev/null and b/sw/qa/extras/layout/data/tdf129095.docx differ diff --git a/sw/qa/extras/layout/data/tdf129357.fodt b/sw/qa/extras/layout/data/tdf129357.fodt new file mode 100644 index 0000000000..9cf563d717 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf129357.fodt @@ -0,0 +1,48 @@ + + + 2023-12-07T18:38:07.3012800122023-12-07T18:42:50.197688001PT4M44S1LibreOfficeDev/24.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/47e8abdafa26e64647e32d8577cb27e54cd843d1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hyphena­tion + + + + + diff --git a/sw/qa/extras/layout/data/tdf130031.docx b/sw/qa/extras/layout/data/tdf130031.docx new file mode 100644 index 0000000000..4ac420a83c Binary files /dev/null and b/sw/qa/extras/layout/data/tdf130031.docx differ diff --git a/sw/qa/extras/layout/data/tdf130088.docx b/sw/qa/extras/layout/data/tdf130088.docx new file mode 100644 index 0000000000..8d5a7a604b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf130088.docx differ diff --git a/sw/qa/extras/layout/data/tdf130218.fodt b/sw/qa/extras/layout/data/tdf130218.fodt new file mode 100644 index 0000000000..d9031871bf --- /dev/null +++ b/sw/qa/extras/layout/data/tdf130218.fodt @@ -0,0 +1,86 @@ + + + + 2018-08-13T16:49:19.8844595662018-08-13T16:56:24.066877759PT7M6S2LibreOfficeDev/6.4.0.0.alpha0$Linux_X86_64 LibreOffice_project/628fbb66869ea82a1f38132ff2ba39e9666083eb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text + + + First column should have visible content + + + + + Text + + + With hanging indent, too. + + + + + + + diff --git a/sw/qa/extras/layout/data/tdf130242.odt b/sw/qa/extras/layout/data/tdf130242.odt new file mode 100644 index 0000000000..3e97bd3e5f Binary files /dev/null and b/sw/qa/extras/layout/data/tdf130242.odt differ diff --git a/sw/qa/extras/layout/data/tdf130380.docx b/sw/qa/extras/layout/data/tdf130380.docx new file mode 100644 index 0000000000..b76c5efd14 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf130380.docx differ diff --git a/sw/qa/extras/layout/data/tdf130969.docx b/sw/qa/extras/layout/data/tdf130969.docx new file mode 100644 index 0000000000..446dc16e7d Binary files /dev/null and b/sw/qa/extras/layout/data/tdf130969.docx differ diff --git a/sw/qa/extras/layout/data/tdf131707_flyWrap.doc b/sw/qa/extras/layout/data/tdf131707_flyWrap.doc new file mode 100644 index 0000000000..c32e5dafd9 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf131707_flyWrap.doc differ diff --git a/sw/qa/extras/layout/data/tdf132956.docx b/sw/qa/extras/layout/data/tdf132956.docx new file mode 100644 index 0000000000..6e3852b38c Binary files /dev/null and b/sw/qa/extras/layout/data/tdf132956.docx differ diff --git a/sw/qa/extras/layout/data/tdf133005.odt b/sw/qa/extras/layout/data/tdf133005.odt new file mode 100644 index 0000000000..660112d667 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf133005.odt differ diff --git a/sw/qa/extras/layout/data/tdf134146.docx b/sw/qa/extras/layout/data/tdf134146.docx new file mode 100644 index 0000000000..9fe1bc0619 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134146.docx differ diff --git a/sw/qa/extras/layout/data/tdf134235.docx b/sw/qa/extras/layout/data/tdf134235.docx new file mode 100644 index 0000000000..af0cb0d3de Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134235.docx differ diff --git a/sw/qa/extras/layout/data/tdf134277.docx b/sw/qa/extras/layout/data/tdf134277.docx new file mode 100644 index 0000000000..cf4ecfbb1c Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134277.docx differ diff --git a/sw/qa/extras/layout/data/tdf134298.ott b/sw/qa/extras/layout/data/tdf134298.ott new file mode 100644 index 0000000000..effb595eb3 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134298.ott differ diff --git a/sw/qa/extras/layout/data/tdf134463.docx b/sw/qa/extras/layout/data/tdf134463.docx new file mode 100644 index 0000000000..9de51cc975 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134463.docx differ diff --git a/sw/qa/extras/layout/data/tdf134472.odt b/sw/qa/extras/layout/data/tdf134472.odt new file mode 100644 index 0000000000..a50c99c876 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134472.odt differ diff --git a/sw/qa/extras/layout/data/tdf134548.odt b/sw/qa/extras/layout/data/tdf134548.odt new file mode 100644 index 0000000000..bc714b0d5e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134548.odt differ diff --git a/sw/qa/extras/layout/data/tdf134659.docx b/sw/qa/extras/layout/data/tdf134659.docx new file mode 100644 index 0000000000..7fb0bed23d Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134659.docx differ diff --git a/sw/qa/extras/layout/data/tdf134676.docx b/sw/qa/extras/layout/data/tdf134676.docx new file mode 100644 index 0000000000..2a7651dee3 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134676.docx differ diff --git a/sw/qa/extras/layout/data/tdf134685.docx b/sw/qa/extras/layout/data/tdf134685.docx new file mode 100644 index 0000000000..86b59fa982 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134685.docx differ diff --git a/sw/qa/extras/layout/data/tdf134866.docx b/sw/qa/extras/layout/data/tdf134866.docx new file mode 100644 index 0000000000..3358b52713 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf134866.docx differ diff --git a/sw/qa/extras/layout/data/tdf135035.docx b/sw/qa/extras/layout/data/tdf135035.docx new file mode 100644 index 0000000000..acd7b14938 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf135035.docx differ diff --git a/sw/qa/extras/layout/data/tdf135035.odt b/sw/qa/extras/layout/data/tdf135035.odt new file mode 100644 index 0000000000..bf84ec4457 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf135035.odt differ diff --git a/sw/qa/extras/layout/data/tdf135991.odt b/sw/qa/extras/layout/data/tdf135991.odt new file mode 100644 index 0000000000..f490ee9fb2 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf135991.odt differ diff --git a/sw/qa/extras/layout/data/tdf136061.docx b/sw/qa/extras/layout/data/tdf136061.docx new file mode 100644 index 0000000000..c91e3438ff Binary files /dev/null and b/sw/qa/extras/layout/data/tdf136061.docx differ diff --git a/sw/qa/extras/layout/data/tdf136588.docx b/sw/qa/extras/layout/data/tdf136588.docx new file mode 100644 index 0000000000..6069312864 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf136588.docx differ diff --git a/sw/qa/extras/layout/data/tdf136613.docx b/sw/qa/extras/layout/data/tdf136613.docx new file mode 100644 index 0000000000..cbfa889676 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf136613.docx differ diff --git a/sw/qa/extras/layout/data/tdf136816.odt b/sw/qa/extras/layout/data/tdf136816.odt new file mode 100644 index 0000000000..0b6599bea3 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf136816.odt differ diff --git a/sw/qa/extras/layout/data/tdf137025.docx b/sw/qa/extras/layout/data/tdf137025.docx new file mode 100644 index 0000000000..89f33a911e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf137025.docx differ diff --git a/sw/qa/extras/layout/data/tdf137116.docx b/sw/qa/extras/layout/data/tdf137116.docx new file mode 100644 index 0000000000..8edff3b78e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf137116.docx differ diff --git a/sw/qa/extras/layout/data/tdf137154.docx b/sw/qa/extras/layout/data/tdf137154.docx new file mode 100644 index 0000000000..0dc8d3220e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf137154.docx differ diff --git a/sw/qa/extras/layout/data/tdf137185.odt b/sw/qa/extras/layout/data/tdf137185.odt new file mode 100644 index 0000000000..65d1f5de67 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf137185.odt differ diff --git a/sw/qa/extras/layout/data/tdf137523-1-min.fodt b/sw/qa/extras/layout/data/tdf137523-1-min.fodt new file mode 100644 index 0000000000..cbe85c9fbb --- /dev/null +++ b/sw/qa/extras/layout/data/tdf137523-1-min.fodt @@ -0,0 +1,319 @@ + + + 2020-10-16T11:14:14.930082474LibreOfficeDev/24.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/53ef297ff9342db2a32da0dd0e8e2f858a3624eeuser_manualP0D1Release 3.0.32020-10-181Train Backbone NodeTest Report + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + . + + + + + + + + + + + + + + + + Document type: Test Report + + + Author: Buzzi Lorenzo + + + + + + Product: Train Backbone Node + + + Approved by: Da Frè Giorgio + + + + + + Subject: Release 3.0.3 + + + Last change: 10/18/2020 + + + + + + + + + Page 1of 1 + + + + VDS Rail s.r.l. + Via Arno 23/25 - 50019 SESTO FIORENTINO (FI) - ItalyTel. +39-055-7350210-7350273Fax +39-055-754673Email: vds@vdsrail.com + Cap. soc. € 99.000 i.v. - P.IVA 01678370485 + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/layout/data/tdf137819.fodt b/sw/qa/extras/layout/data/tdf137819.fodt new file mode 100644 index 0000000000..cf6630e331 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf137819.fodt @@ -0,0 +1,284 @@ + + + + 2020-12-15T15:05:53.7370000002020-12-15T15:10:45.235000000PT1M9S2LibreOffice/7.0.1.2$Windows_X86_64 LibreOffice_project/7cbcfc562f6eb6708b5ff7d7397325de9e764452 + + + 0 + 0 + 27651 + 17046 + true + false + + + view2 + 13647 + 7736 + 0 + 0 + 27649 + 17044 + 0 + 1 + false + 120 + false + false + + + + + false + + + + 1 + true + false + false + true + false + false + true + true + + + true + false + false + 0 + true + false + true + false + false + 0 + false + true + false + false + false + false + high-resolution + false + false + true + false + false + false + false + false + true + false + true + false + + false + false + false + true + false + 1901935 + false + false + false + false + false + 1991809 + false + true + false + true + true + false + false + false + true + true + true + true + false + false + false + false + true + false + false + false + false + false + false + 0 + true + false + true + true + true + false + true + false + false + true + false + false + true + + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XXXXX + + + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/tdf138018.docx b/sw/qa/extras/layout/data/tdf138018.docx new file mode 100644 index 0000000000..96183f9494 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf138018.docx differ diff --git a/sw/qa/extras/layout/data/tdf138039.odt b/sw/qa/extras/layout/data/tdf138039.odt new file mode 100644 index 0000000000..f355fd1349 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf138039.odt differ diff --git a/sw/qa/extras/layout/data/tdf138465min.docx b/sw/qa/extras/layout/data/tdf138465min.docx new file mode 100644 index 0000000000..7cc0e2fb51 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf138465min.docx differ diff --git a/sw/qa/extras/layout/data/tdf138592-a-acute.fodt b/sw/qa/extras/layout/data/tdf138592-a-acute.fodt new file mode 100644 index 0000000000..07bcabef10 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf138592-a-acute.fodt @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + á + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/tdf138773.docx b/sw/qa/extras/layout/data/tdf138773.docx new file mode 100644 index 0000000000..656c596bc4 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf138773.docx differ diff --git a/sw/qa/extras/layout/data/tdf138782.docx b/sw/qa/extras/layout/data/tdf138782.docx new file mode 100644 index 0000000000..8bad2ae1b8 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf138782.docx differ diff --git a/sw/qa/extras/layout/data/tdf138951.odt b/sw/qa/extras/layout/data/tdf138951.odt new file mode 100644 index 0000000000..5cb4940bd5 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf138951.odt differ diff --git a/sw/qa/extras/layout/data/tdf139336_ColumnsWithFootnoteDoNotOccupyEntirePage.docx b/sw/qa/extras/layout/data/tdf139336_ColumnsWithFootnoteDoNotOccupyEntirePage.docx new file mode 100644 index 0000000000..a44ff40471 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf139336_ColumnsWithFootnoteDoNotOccupyEntirePage.docx differ diff --git a/sw/qa/extras/layout/data/tdf141079.odt b/sw/qa/extras/layout/data/tdf141079.odt new file mode 100644 index 0000000000..65dfcb4a29 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf141079.odt differ diff --git a/sw/qa/extras/layout/data/tdf141220.docx b/sw/qa/extras/layout/data/tdf141220.docx new file mode 100644 index 0000000000..a65bdd4b8a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf141220.docx differ diff --git a/sw/qa/extras/layout/data/tdf142694-1.odt b/sw/qa/extras/layout/data/tdf142694-1.odt new file mode 100644 index 0000000000..9e92459987 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf142694-1.odt differ diff --git a/sw/qa/extras/layout/data/tdf143239-1-min.odt b/sw/qa/extras/layout/data/tdf143239-1-min.odt new file mode 100644 index 0000000000..4271bfba77 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf143239-1-min.odt differ diff --git a/sw/qa/extras/layout/data/tdf144057.fodt b/sw/qa/extras/layout/data/tdf144057.fodt new file mode 100644 index 0000000000..66deaa9c27 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf144057.fodt @@ -0,0 +1,387 @@ + + + + 2021-09-13T16:07:05.2216994282021-09-13T16:10:52.148997944PT3M46S3LibreOfficeDev/7.3.0.0.alpha0$Linux_X86_64 LibreOffice_project/ba346227f1c4f896b717676a7eae22fea222f3e4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:20 + + + + + + + xxx2 + 2021-09-13T16:10:26 + + + + + + + xxx2 + 2021-09-13T16:10:30 + + + + + + + xxx2 + 2021-09-13T16:10:30 + + + + + + + xxx2 + 2021-09-13T16:10:38 + + + + + + + xxx2 + 2021-09-13T16:10:38 + + + + + + + xxx2 + 2021-09-13T16:10:38 + + + + + + + xxx2 + 2021-09-13T16:10:38 + + + + + + + + + A1 + + + + + A2 + + + + + A3 + + + + + A4 + + + + + A5 + + + + + A6 + + + + + + A7 + + + + + A8 + + + + + A9 + + + + + A10 + + + + + A11 + + + + + A12 + + + + + + + + + + B1 + + + + + B2 + + + + + B3 + + + + + B4 + + + + + B5 + + + + + B6 + + + + + + B7 + + + + + B8 + + + + + B9 + + + + + B10 + + + + + B11 + + + + + B12 + + + + + + + diff --git a/sw/qa/extras/layout/data/tdf145719.odt b/sw/qa/extras/layout/data/tdf145719.odt new file mode 100644 index 0000000000..5f2c6f6658 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf145719.odt differ diff --git a/sw/qa/extras/layout/data/tdf145826.odt b/sw/qa/extras/layout/data/tdf145826.odt new file mode 100644 index 0000000000..b6f84db563 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf145826.odt differ diff --git a/sw/qa/extras/layout/data/tdf146272.odt b/sw/qa/extras/layout/data/tdf146272.odt new file mode 100644 index 0000000000..3652cf06f1 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf146272.odt differ diff --git a/sw/qa/extras/layout/data/tdf146704_EndnoteInSection.odt b/sw/qa/extras/layout/data/tdf146704_EndnoteInSection.odt new file mode 100644 index 0000000000..660dcb70df Binary files /dev/null and b/sw/qa/extras/layout/data/tdf146704_EndnoteInSection.odt differ diff --git a/sw/qa/extras/layout/data/tdf147485-forcepoint.docx b/sw/qa/extras/layout/data/tdf147485-forcepoint.docx new file mode 100644 index 0000000000..d245e4be3d Binary files /dev/null and b/sw/qa/extras/layout/data/tdf147485-forcepoint.docx differ diff --git a/sw/qa/extras/layout/data/tdf148897.odt b/sw/qa/extras/layout/data/tdf148897.odt new file mode 100644 index 0000000000..d5d1555c99 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf148897.odt differ diff --git a/sw/qa/extras/layout/data/tdf149248.odt b/sw/qa/extras/layout/data/tdf149248.odt new file mode 100644 index 0000000000..18685bd0a5 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf149248.odt differ diff --git a/sw/qa/extras/layout/data/tdf149324.odt b/sw/qa/extras/layout/data/tdf149324.odt new file mode 100644 index 0000000000..da4b87d89e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf149324.odt differ diff --git a/sw/qa/extras/layout/data/tdf149420.odt b/sw/qa/extras/layout/data/tdf149420.odt new file mode 100644 index 0000000000..249d7267eb Binary files /dev/null and b/sw/qa/extras/layout/data/tdf149420.odt differ diff --git a/sw/qa/extras/layout/data/tdf149709.fodt b/sw/qa/extras/layout/data/tdf149709.fodt new file mode 100644 index 0000000000..0a33515d1c --- /dev/null +++ b/sw/qa/extras/layout/data/tdf149709.fodt @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Item + + + Item + + + Item + + + + + Item + + + + + diff --git a/sw/qa/extras/layout/data/tdf149710.fodt b/sw/qa/extras/layout/data/tdf149710.fodt new file mode 100644 index 0000000000..c936b9f9bc --- /dev/null +++ b/sw/qa/extras/layout/data/tdf149710.fodt @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + Item + + + Item + + + Item + + + + + diff --git a/sw/qa/extras/layout/data/tdf149711.docx b/sw/qa/extras/layout/data/tdf149711.docx new file mode 100644 index 0000000000..d90efa7c1f Binary files /dev/null and b/sw/qa/extras/layout/data/tdf149711.docx differ diff --git a/sw/qa/extras/layout/data/tdf150200.docx b/sw/qa/extras/layout/data/tdf150200.docx new file mode 100644 index 0000000000..8f3a57d764 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf150200.docx differ diff --git a/sw/qa/extras/layout/data/tdf150200.odt b/sw/qa/extras/layout/data/tdf150200.odt new file mode 100644 index 0000000000..224d5c4c4b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf150200.odt differ diff --git a/sw/qa/extras/layout/data/tdf150438.docx b/sw/qa/extras/layout/data/tdf150438.docx new file mode 100644 index 0000000000..87aa1c5f6d Binary files /dev/null and b/sw/qa/extras/layout/data/tdf150438.docx differ diff --git a/sw/qa/extras/layout/data/tdf150438.odt b/sw/qa/extras/layout/data/tdf150438.odt new file mode 100644 index 0000000000..5634ab91ad Binary files /dev/null and b/sw/qa/extras/layout/data/tdf150438.odt differ diff --git a/sw/qa/extras/layout/data/tdf150606-1-min.odt b/sw/qa/extras/layout/data/tdf150606-1-min.odt new file mode 100644 index 0000000000..63bd1ceb0a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf150606-1-min.odt differ diff --git a/sw/qa/extras/layout/data/tdf150642.odt b/sw/qa/extras/layout/data/tdf150642.odt new file mode 100644 index 0000000000..5e316424a2 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf150642.odt differ diff --git a/sw/qa/extras/layout/data/tdf150717.odt b/sw/qa/extras/layout/data/tdf150717.odt new file mode 100644 index 0000000000..f3a7c4e7d5 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf150717.odt differ diff --git a/sw/qa/extras/layout/data/tdf150790.fodt b/sw/qa/extras/layout/data/tdf150790.fodt new file mode 100644 index 0000000000..33ff6fa105 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf150790.fodt @@ -0,0 +1,9 @@ + + + + + point bookmark + neighboring range bookmarks + + + diff --git a/sw/qa/extras/layout/data/tdf151954.docx b/sw/qa/extras/layout/data/tdf151954.docx new file mode 100644 index 0000000000..64e4782f7a Binary files /dev/null and b/sw/qa/extras/layout/data/tdf151954.docx differ diff --git a/sw/qa/extras/layout/data/tdf152031-stair.odt b/sw/qa/extras/layout/data/tdf152031-stair.odt new file mode 100644 index 0000000000..5171920e34 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf152031-stair.odt differ diff --git a/sw/qa/extras/layout/data/tdf152085-section-tblr.odt b/sw/qa/extras/layout/data/tdf152085-section-tblr.odt new file mode 100644 index 0000000000..3b454edc9b Binary files /dev/null and b/sw/qa/extras/layout/data/tdf152085-section-tblr.odt differ diff --git a/sw/qa/extras/layout/data/tdf152106.odt b/sw/qa/extras/layout/data/tdf152106.odt new file mode 100644 index 0000000000..49ef5e50b8 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf152106.odt differ diff --git a/sw/qa/extras/layout/data/tdf152307.odt b/sw/qa/extras/layout/data/tdf152307.odt new file mode 100644 index 0000000000..766687d492 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf152307.odt differ diff --git a/sw/qa/extras/layout/data/tdf152413.fodt b/sw/qa/extras/layout/data/tdf152413.fodt new file mode 100644 index 0000000000..e950289def --- /dev/null +++ b/sw/qa/extras/layout/data/tdf152413.fodt @@ -0,0 +1,117 @@ + + + 2022-12-09T10:45:58.3046934092022-12-09T10:46:08.151316200PT11S1LibreOfficeDev/7.5.0.0.alpha1$Linux_X86_64 LibreOffice_project/f9395a123e8c85134bdd6e471bc93b2745e22a9d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + صِرَ ٰطَ + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/tdf152983-1-min.docx b/sw/qa/extras/layout/data/tdf152983-1-min.docx new file mode 100644 index 0000000000..804e8fefe6 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf152983-1-min.docx differ diff --git a/sw/qa/extras/layout/data/tdf153136.docx b/sw/qa/extras/layout/data/tdf153136.docx new file mode 100644 index 0000000000..357f64f9a9 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf153136.docx differ diff --git a/sw/qa/extras/layout/data/tdf155177-1-min.odt b/sw/qa/extras/layout/data/tdf155177-1-min.odt new file mode 100644 index 0000000000..68363860f0 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf155177-1-min.odt differ diff --git a/sw/qa/extras/layout/data/tdf155611_table_and_nested_section.fodt b/sw/qa/extras/layout/data/tdf155611_table_and_nested_section.fodt new file mode 100644 index 0000000000..28c0701ea2 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf155611_table_and_nested_section.fodt @@ -0,0 +1,33 @@ + + + + + + + + + + + foo + + + bar + + + + + baz + + + + + + + + abc + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/tdf156725.fodt b/sw/qa/extras/layout/data/tdf156725.fodt new file mode 100644 index 0000000000..9f60e70119 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf156725.fodt @@ -0,0 +1,163 @@ + + + 2023-08-17T18:14:28.1153022102023-08-17T18:20:06.109127302PT4M30S2LibreOfficeDev/24.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/79452241ad33f9eaace2ba8bd1336be69c99ed4d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + b + c + d + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/tdf159050-wrap-adjust.fodt b/sw/qa/extras/layout/data/tdf159050-wrap-adjust.fodt new file mode 100644 index 0000000000..49d9e57071 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf159050-wrap-adjust.fodt @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + Pretium semper. Proin luctus orci ac neque venenatis, quis commodo dolor posuere. Curabitur dignissim + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/tdf159085.fodt b/sw/qa/extras/layout/data/tdf159085.fodt new file mode 100644 index 0000000000..efd0e98e92 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf159085.fodt @@ -0,0 +1,61 @@ + + + + + + true + high-resolution + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cur­sus egestas. + venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cur­sus egestas. + + + diff --git a/sw/qa/extras/layout/data/tdf40260.odt b/sw/qa/extras/layout/data/tdf40260.odt new file mode 100644 index 0000000000..3a9c23f547 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf40260.odt differ diff --git a/sw/qa/extras/layout/data/tdf42748.fodt b/sw/qa/extras/layout/data/tdf42748.fodt new file mode 100644 index 0000000000..e8bcb257db --- /dev/null +++ b/sw/qa/extras/layout/data/tdf42748.fodt @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2019-10-22T08:48:10 + + + + + + + Unknown Author 2 + 2019-10-22T08:48:12 + + + + + + + + + + + + + + It + + + em + + + Item + + + + + diff --git a/sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_New.odt b/sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_New.odt new file mode 100644 index 0000000000..28a1926305 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_New.odt differ diff --git a/sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_Old.odt b/sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_Old.odt new file mode 100644 index 0000000000..426e684937 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_Old.odt differ diff --git a/sw/qa/extras/layout/data/tdf54819.fodt b/sw/qa/extras/layout/data/tdf54819.fodt new file mode 100644 index 0000000000..f9a8e9d0b6 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf54819.fodt @@ -0,0 +1,9 @@ + + + + + Lorem ipsum + dolor sit amet. + + + diff --git a/sw/qa/extras/layout/data/tdf64222.docx b/sw/qa/extras/layout/data/tdf64222.docx new file mode 100644 index 0000000000..4a2de828a9 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf64222.docx differ diff --git a/sw/qa/extras/layout/data/tdf69647_images.odt b/sw/qa/extras/layout/data/tdf69647_images.odt new file mode 100644 index 0000000000..e4f7fbe803 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf69647_images.odt differ diff --git a/sw/qa/extras/layout/data/tdf69647_text.docx b/sw/qa/extras/layout/data/tdf69647_text.docx new file mode 100644 index 0000000000..587089ff29 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf69647_text.docx differ diff --git a/sw/qa/extras/layout/data/tdf69648.docx b/sw/qa/extras/layout/data/tdf69648.docx new file mode 100644 index 0000000000..5bf8fcc709 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf69648.docx differ diff --git a/sw/qa/extras/layout/data/tdf72727.odt b/sw/qa/extras/layout/data/tdf72727.odt new file mode 100644 index 0000000000..606ad69070 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf72727.odt differ diff --git a/sw/qa/extras/layout/data/tdf75659.docx b/sw/qa/extras/layout/data/tdf75659.docx new file mode 100644 index 0000000000..a3cde330f8 Binary files /dev/null and b/sw/qa/extras/layout/data/tdf75659.docx differ diff --git a/sw/qa/extras/layout/data/tdf85610.fodt b/sw/qa/extras/layout/data/tdf85610.fodt new file mode 100644 index 0000000000..17c51096db --- /dev/null +++ b/sw/qa/extras/layout/data/tdf85610.fodt @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + C + 2022-04-27T11:06:53 + + + + + + + C + 2022-04-27T11:07:06 + + + + + + + C + 2022-04-27T11:06:51 + + + + + + + + + + + Lorem.1 + Ipsum. + Dolor sit.2 + Amet. + + + diff --git a/sw/qa/extras/layout/data/tdf88496.docx b/sw/qa/extras/layout/data/tdf88496.docx new file mode 100644 index 0000000000..b34f30389e Binary files /dev/null and b/sw/qa/extras/layout/data/tdf88496.docx differ diff --git a/sw/qa/extras/layout/data/testAreaChartNumberFormat.docx b/sw/qa/extras/layout/data/testAreaChartNumberFormat.docx new file mode 100644 index 0000000000..33e1c58788 Binary files /dev/null and b/sw/qa/extras/layout/data/testAreaChartNumberFormat.docx differ diff --git a/sw/qa/extras/layout/data/testTruncatedAxisLabel.odt b/sw/qa/extras/layout/data/testTruncatedAxisLabel.odt new file mode 100644 index 0000000000..f8eb749041 Binary files /dev/null and b/sw/qa/extras/layout/data/testTruncatedAxisLabel.odt differ diff --git a/sw/qa/extras/layout/data/three_sections.fodt b/sw/qa/extras/layout/data/three_sections.fodt new file mode 100644 index 0000000000..9233fed890 --- /dev/null +++ b/sw/qa/extras/layout/data/three_sections.fodt @@ -0,0 +1,18 @@ + + + + + + Select the text below, copy to clipboard, and paste from clipboard, replacing the selection. + + <-- Start selection here. Section1 + + + Section2 + + + Section3. End selection here --> + + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/tox-update-wrong-pages.odt b/sw/qa/extras/layout/data/tox-update-wrong-pages.odt new file mode 100644 index 0000000000..40ceb7ac4b Binary files /dev/null and b/sw/qa/extras/layout/data/tox-update-wrong-pages.odt differ diff --git a/sw/qa/extras/layout/data/user-field-type-language.fodt b/sw/qa/extras/layout/data/user-field-type-language.fodt new file mode 100644 index 0000000000..f741add7dd --- /dev/null +++ b/sw/qa/extras/layout/data/user-field-type-language.fodt @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + Before 1,234.56 after. + + + diff --git a/sw/qa/extras/layout/data/wideBoxInFootnote.fodt b/sw/qa/extras/layout/data/wideBoxInFootnote.fodt new file mode 100644 index 0000000000..f63eaa6fa6 --- /dev/null +++ b/sw/qa/extras/layout/data/wideBoxInFootnote.fodt @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + 1 + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/layout/data/writer-image-no-capture.docx b/sw/qa/extras/layout/data/writer-image-no-capture.docx new file mode 100644 index 0000000000..ebb1f669f4 Binary files /dev/null and b/sw/qa/extras/layout/data/writer-image-no-capture.docx differ diff --git a/sw/qa/extras/layout/data/xaxis-labelbreak.docx b/sw/qa/extras/layout/data/xaxis-labelbreak.docx new file mode 100644 index 0000000000..6f34a89199 Binary files /dev/null and b/sw/qa/extras/layout/data/xaxis-labelbreak.docx differ diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx new file mode 100644 index 0000000000..668f61f990 --- /dev/null +++ b/sw/qa/extras/layout/layout.cxx @@ -0,0 +1,3726 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// Test to assert layout / rendering result of Writer. +class SwLayoutWriter : public SwModelTestBase +{ +public: + SwLayoutWriter() + : SwModelTestBase("/sw/qa/extras/layout/data/") + { + } + +protected: + void CheckRedlineFootnotesHidden(); + void CheckRedlineSectionsHidden(); +}; + +// this is a member because our test classes have protected members :( +void SwLayoutWriter::CheckRedlineFootnotesHidden() +{ + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, "24"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foaz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "expand"_ostr, "2"); + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "13"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "ac"); + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn[2]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "16"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "2"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "mo"); +} + +void SwLayoutWriter::CheckRedlineSectionsHidden() +{ + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, "12"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "folah"); + assertXPath(pXmlDoc, "/root/page[1]/body/section[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "20"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "folah"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf156077) +{ + createSwDoc("s4_min2.fodt"); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of pages does not match!", 3, getPages()); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly"_ostr, 3); + assertXPath(pXmlDoc, "/root/page[2]/anchored/fly"_ostr, 1); + // this was 0, the at-page anchored flys were not displayed + assertXPath(pXmlDoc, "/root/page[3]/anchored/fly"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFootnotes) +{ + createSwDoc("redline_footnotes.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + + // verify after load + CheckRedlineFootnotesHidden(); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "expand"_ostr, "2"); + + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "b"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "c"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "2"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "3"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "ar"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[3]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[3]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "3"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[3]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[3]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "ghi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "4"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "expand"_ostr, "5"); + + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[4]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[4]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "4"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[4]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[4]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "jkl"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "5"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "m"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "n"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[5]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "o"); + + // verify after hide + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + CheckRedlineFootnotesHidden(); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf136588) +{ + createSwDoc("tdf136588.docx"); + auto pXMLLayoutDump = parseLayoutDump(); + CPPUNIT_ASSERT(pXMLLayoutDump); + + //there was a bad line break before, the correct break layout is this: + assertXPath(pXMLLayoutDump, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, "effectively by modern-day small to "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInBody) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + pWrtShell->Insert("foo"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("bar"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("baz"); + SfxItemSet flySet(pDoc->GetAttrPool(), + svl::Items); + SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR); + pWrtShell->StartOfSection(false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + flySet.Put(anchor); + SwFormatFrameSize size(SwFrameSize::Minimum, 1000, 1000); + flySet.Put(size); // set a size, else we get 1 char per line... + SwFrameFormat const* pFly = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly != nullptr); + // move inside fly + pWrtShell->GotoFly(pFly->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Insert("abc"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("def"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("ghi"); + + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // delete redline inside fly + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 8, /*bBasicCall=*/false); + pWrtShell->Delete(); + + pWrtShell->SttEndDoc(true); // note: SttDoc actually moves to start of fly? + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 7, /*bBasicCall=*/false); + pWrtShell->Delete(); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "14"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "6"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "ahi"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 2nd (deleted) paragraph + pWrtShell->StartOfSection(); + pWrtShell->Down(false, 1); + anchor.SetType(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor, *const_cast(pFly)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "14"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + + // hide: no anchored object shown + assertXPath(pXmlDoc, "//anchored"_ostr, 0); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 3rd paragraph + pWrtShell->EndOfSection(); + anchor.SetType(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor, *const_cast(pFly)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "14"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "6"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "ahi"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf134272) +{ + createSwDoc("tdf134472.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[2]/infos/bounds"_ostr, "height"_ostr, "843"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[2]/infos/bounds"_ostr, "bottom"_ostr, "2819"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestNestedTableMoveFwd) +{ + createSwDoc("tabellen_test_windows_1.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // the row with the nested table should not be split but be the first row on page 2 + assertXPathContent(pXmlDoc, "/root/page[1]/body/tab[1]/row[last()]/cell[1]/txt[1]"_ostr, + "Tabelle 1"); + assertXPathContent(pXmlDoc, + "/root/page[2]/body/tab[1]/row[1]/cell[1]/tab[1]/row[1]/cell[1]/txt"_ostr, + "Tabelle 2"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf136613) +{ + createSwDoc("tdf136613.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + //get the flys and the root frame + const auto vFlyFormats = pDoc->GetFlyFrameFormats(FLYCNTTYPE_ALL, true); + const auto vFrames = pDoc->GetAllLayouts(); + + CPPUNIT_ASSERT(!vFrames.empty()); + CPPUNIT_ASSERT(!vFlyFormats.empty()); + + //get the page frame from the root + SwFrame* pPageFrame = vFrames[0]->Lower(); + CPPUNIT_ASSERT(pPageFrame); + + //get the rectangle of the page + const SwRect& rPageRect = pPageFrame->getFrameArea(); + + //check the flys and... + for (auto pFlyFormat : vFlyFormats) + { + //...the rectangle of the fly location... + const SwRect& rRect = pFlyFormat->FindLayoutRect(); + CPPUNIT_ASSERT(!rRect.IsEmpty()); + + //...if it is on the page. This will fail if not. + CPPUNIT_ASSERT_MESSAGE("The pictures are outside the page!", rPageRect.Contains(rRect)); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf88496) +{ + createSwDoc("tdf88496.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 4, table fallback "switch off repeating header" started on a new page + assertXPath(pXmlDoc, "/root/page"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInHeader) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + pWrtShell->ChangeHeaderOrFooter(u"Default Page Style", /*bHeader*/ true, /*bOn*/ true, false); + CPPUNIT_ASSERT( + pWrtShell + ->IsInHeaderFooter()); // assume this is supposed to put cursor in the new header... + pWrtShell->Insert("foo"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("bar"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("baz"); + SfxItemSet flySet(pDoc->GetAttrPool(), + svl::Items); + SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR); + pWrtShell->StartOfSection(false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + flySet.Put(anchor); + SwFormatFrameSize size(SwFrameSize::Minimum, 1000, 1000); + flySet.Put(size); // set a size, else we get 1 char per line... + SwFrameFormat const* pFly = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly != nullptr); + // move inside fly + pWrtShell->GotoFly(pFly->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Insert("abc"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("def"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("ghi"); + + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // delete redline inside fly + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 8, /*bBasicCall=*/false); + pWrtShell->Delete(); + + pWrtShell->GotoHeaderText(); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 7, /*bBasicCall=*/false); + pWrtShell->Delete(); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "length"_ostr, "0"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "6"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "foaz"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "11"); + assertXPath( + pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath( + pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "ahi"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "length"_ostr, "0"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 2nd (deleted) paragraph + pWrtShell->StartOfSection(); + pWrtShell->Down(false, 1); + anchor.SetType(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor, *const_cast(pFly)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // now the frame has no Text portion? not sure why it's a 0-length one first and now none? + // assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]", "type", "PortionType::Para"); + // assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]", "length", "0"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "6"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + + // hide: no anchored object shown + assertXPath(pXmlDoc, "//anchored"_ostr, 0); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "length"_ostr, "0"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 3rd paragraph + pWrtShell->EndOfSection(); + anchor.SetType(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor, *const_cast(pFly)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "length"_ostr, "0"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "6"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + assertXPath(pXmlDoc, "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "11"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "ahi"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "length"_ostr, "0"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/header/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + } +} + +#if !defined(MACOSX) +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf150606) +{ + createSwDoc("tdf150606-1-min.odt"); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[3]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[4]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/body/section/column"_ostr, 2); + // on page 5 the table is split across balanced columns + assertXPath(pXmlDoc, "/root/page[5]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[5]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[5]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page"_ostr, 5); + + pWrtShell->Down(false, 1); + dispatchCommand(mxComponent, ".uno:DeleteTable", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/section/column/body/tab"_ostr, 0); + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + + pWrtShell->Undo(); + Scheduler::ProcessEventsToIdle(); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[3]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[4]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/body/section/column"_ostr, 2); + // on page 5 the table is split across balanced columns + // (problem was that there were empty pages and table was on page 10) + assertXPath(pXmlDoc, "/root/page[5]/body/section/column[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[5]/body/section/column[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[5]/body/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page"_ostr, 5); +} +#endif + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf152983) +{ + //just care it doesn't crash/assert + createSwDoc("tdf152983-1-min.docx"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf137025) +{ + // Check the padding of the textbox + createSwDoc("tdf137025.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + + // Check the layout xml + // SDRATTR_TEXT_LEFTDIST + assertXPath(pXmlDoc, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item" + "[@whichId='" + + OString::number(SDRATTR_TEXT_LEFTDIST) + "']", + "value"_ostr, "567"); + // SDRATTR_TEXT_RIGHTDIST + assertXPath(pXmlDoc, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item" + "[@whichId='" + + OString::number(SDRATTR_TEXT_RIGHTDIST) + "']", + "value"_ostr, "1134"); + // SDRATTR_TEXT_UPPERDIST + assertXPath(pXmlDoc, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item" + "[@whichId='" + + OString::number(SDRATTR_TEXT_UPPERDIST) + "']", + "value"_ostr, "1701"); + // SDRATTR_TEXT_LOWERDIST + assertXPath(pXmlDoc, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObject" + "/DefaultProperties/SfxItemSet/SdrMetricItem/SfxInt32Item" + "[@whichId='" + + OString::number(SDRATTR_TEXT_LOWERDIST) + "']", + "value"_ostr, "2268"); + + // Check the textbox-shape import too + auto xShp = getShape(1); + CPPUNIT_ASSERT(xShp); + + uno::Reference xShapeProps(xShp, uno::UNO_QUERY); + + SwFrameFormat* pFrameFormat = SwTextBoxHelper::getOtherTextBoxFormat(xShp); + CPPUNIT_ASSERT(pFrameFormat); + + // The shape has these values to copy to the associated text frame after modification:: + const tools::Long nLPaddng + = xShapeProps->getPropertyValue("TextLeftDistance").get(); + const tools::Long nRPaddng + = xShapeProps->getPropertyValue("TextRightDistance").get(); + const tools::Long nTPaddng + = xShapeProps->getPropertyValue("TextUpperDistance").get(); + const tools::Long nBPaddng + = xShapeProps->getPropertyValue("TextLowerDistance").get(); + + CPPUNIT_ASSERT_EQUAL(tools::Long(1000), nLPaddng); + CPPUNIT_ASSERT_EQUAL(tools::Long(2000), nRPaddng); + CPPUNIT_ASSERT_EQUAL(tools::Long(3000), nTPaddng); + CPPUNIT_ASSERT_EQUAL(tools::Long(4001), nBPaddng); + + // TODO: modify shape distance via UNO with text frame synchronization + // Check the textbox as well: + auto xTxFrm = SwXTextFrame::CreateXTextFrame(*pFrameFormat->GetDoc(), pFrameFormat); + CPPUNIT_ASSERT(xTxFrm); + + const tools::Long nFrameLeftPaddng + = xTxFrm->getPropertyValue("LeftBorderDistance").get(); + const tools::Long nFrameRightPaddng + = xTxFrm->getPropertyValue("RightBorderDistance").get(); + const tools::Long nFrameTopPaddng + = xTxFrm->getPropertyValue("TopBorderDistance").get(); + const tools::Long nFrameBottomPaddng + = xTxFrm->getPropertyValue("BottomBorderDistance").get(); + + // Check if the shape and frame have different setting + CPPUNIT_ASSERT_EQUAL(nLPaddng, nFrameLeftPaddng); + CPPUNIT_ASSERT_EQUAL(nRPaddng, nFrameRightPaddng); + CPPUNIT_ASSERT_EQUAL(nTPaddng, nFrameTopPaddng); + CPPUNIT_ASSERT_EQUAL(nBPaddng, nFrameBottomPaddng); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInFootnote) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + pWrtShell->InsertFootnote(""); + CPPUNIT_ASSERT(pWrtShell->IsCursorInFootnote()); + + SfxItemSet flySet(pDoc->GetAttrPool(), + svl::Items); + SwFormatFrameSize size(SwFrameSize::Minimum, 1000, 1000); + flySet.Put(size); // set a size, else we get 1 char per line... + SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + flySet.Put(anchor); + // first fly is in first footnote that will be deleted + /* SwFrameFormat const* pFly1 =*/pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + pWrtShell->Insert("quux"); + + pWrtShell->SttEndDoc(false); + + pWrtShell->InsertFootnote(""); + CPPUNIT_ASSERT(pWrtShell->IsCursorInFootnote()); + pWrtShell->Insert("foo"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("bar"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("baz"); + + pWrtShell->StartOfSection(false); + CPPUNIT_ASSERT(pWrtShell->IsCursorInFootnote()); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + flySet.Put(anchor); + // second fly is in second footnote that is not deleted + SwFrameFormat const* pFly = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly != nullptr); + // move inside fly + pWrtShell->GotoFly(pFly->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Insert("abc"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("def"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("ghi"); + + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // delete redline inside fly + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 8, /*bBasicCall=*/false); + pWrtShell->Delete(); + + // pWrtShell->GotoFlyAnchor(); // sigh... why, now we're in the body... + pWrtShell->SttEndDoc(false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->GotoFootnoteText(); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 7, /*bBasicCall=*/false); + pWrtShell->Delete(); + pWrtShell->EndSelect(); // ? + // delete first footnote + pWrtShell->SttEndDoc(true); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 1, /*bBasicCall=*/false); + pWrtShell->Delete(); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "25"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/" + "child::*[@type='PortionType::Footnote']"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/" + "child::*[@type='PortionType::Footnote']"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "7"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "17"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "ahi"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "expand"_ostr, "2"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "quux"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "2"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 2nd (deleted) paragraph + pWrtShell->SttEndDoc(false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->GotoFootnoteText(); + pWrtShell->Down(false, 1); + anchor.SetType(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor, *const_cast(pFly)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "25"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "7"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + + // hide: no anchored object shown + assertXPath(pXmlDoc, "//anchored"_ostr, 0); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr, + "expand"_ostr, "2"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "quux"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "2"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 3rd paragraph + pWrtShell->EndOfSection(); + pWrtShell->SttEndDoc(false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->GotoFootnoteText(); + pWrtShell->EndOfSection(); + anchor.SetType(RndStdIds::FLY_AT_CHAR); + anchor.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor, *const_cast(pFly)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor.SetAnchor(&pos); + pDoc->SetAttr(anchor, *const_cast(pFly)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "25"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "7"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "17"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "ahi"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/" + "child::*[@type='PortionType::Footnote'][1]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/" + "child::*[@type='PortionType::Footnote'][1]"_ostr, + "expand"_ostr, "1"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/" + "child::*[@type='PortionType::Footnote'][2]"_ostr, + "type"_ostr, "PortionType::Footnote"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/" + "child::*[@type='PortionType::Footnote'][2]"_ostr, + "expand"_ostr, "2"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "quux"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[1]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "1"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "type"_ostr, "PortionType::FootnoteNum"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, + "expand"_ostr, "2"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bc"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath( + pXmlDoc, + "/root/page[1]/ftncont/ftn[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf143239) +{ + createSwDoc("tdf143239-1-min.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // These are unstable on macOS and Win64 builds, + // so only test that they restore original values for now + OUString p2txt1Left, p2txt2Left, p3txt1Left; + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "top"_ostr, "18540"); + p2txt1Left = getXPath( + pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, "left"_ostr); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds"_ostr, + "top"_ostr, "23894"); + p2txt2Left = getXPath( + pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds"_ostr, "left"_ostr); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "top"_ostr, "35662"); + p3txt1Left = getXPath( + pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, "left"_ostr); + assertXPath(pXmlDoc, "/root/page"_ostr, 3); + discardDumpedLayout(); + } + + pWrtShell->SelAll(); + pWrtShell->Delete(); + pWrtShell->Undo(); + Scheduler::ProcessEventsToIdle(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // now the 1st fly was on page 1, and the fly on page 2 was the 2nd one + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "top"_ostr, "18540"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "left"_ostr, p2txt1Left); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds"_ostr, + "top"_ostr, "23894"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/anchored/fly[1]/infos/bounds"_ostr, + "left"_ostr, p2txt2Left); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "top"_ostr, "35662"); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "left"_ostr, p3txt1Left); + assertXPath(pXmlDoc, "/root/page"_ostr, 3); + discardDumpedLayout(); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTableOverlapFooterFly) +{ + // Load a document that has a fly anchored in the footer. + // It also has a table which initially overlaps with the fly, but then moves to the next page. + createSwDoc("footer-fly-table.fodt"); + xmlDocUniquePtr pLayout = parseLayoutDump(); + // no fly portions, was: 8 + assertXPath(pLayout, + "/root/page[2]/body/tab[1]/row[5]/cell[5]/txt[1]/SwParaPortion/SwLineLayout/" + "SwFixPortion[@type='PortionType::Fly'][@type='PortionType::Fly']"_ostr, + 0); + // one line break, was: 5 + assertXPath(pLayout, + "/root/page[2]/body/tab[1]/row[5]/cell[5]/txt[1]/SwParaPortion/SwLineLayout"_ostr, + 1); + // one text portion, was: 1 + assertXPath( + pLayout, + "/root/page[2]/body/tab[1]/row[5]/cell[5]/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + 1); + assertXPath( + pLayout, + "/root/page[2]/body/tab[1]/row[5]/cell[5]/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "Abc def ghi jkl mno pqr stu vwx yz."); + // height was: 1517 + // tdf#134782 height was: 379 + assertXPath(pLayout, "/root/page[2]/body/tab[1]/row[5]/cell[5]/txt[1]/infos/bounds"_ostr, + "height"_ostr, "253"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf134277) +{ + createSwDoc("tdf134277.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwDocShell* pShell = pDoc->GetDocShell(); + + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/metafile/push/push/push/layoutmode[2]"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf116486) +{ + createSwDoc("tdf116486.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + OUString aTop = parseDump( + "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/child::*[@type='PortionType::Fly']"_ostr, + "height"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("4006"), aTop); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf142080) +{ + // this caused an infinite loop + createSwDoc("fdo43573-2-min.docx"); + + xmlDocUniquePtr pLayout = parseLayoutDump(); + // check the first paragraph on page 9 with its fly; the column was empty too + assertXPath(pLayout, + "/root/page[9]/body/section[1]/column[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]/" + "SwLinePortion"_ostr, + "portion"_ostr, + "De kleur u (rood) in het rechtervlak (R), de kleur r (wit) beneden (D),"); + SwTwips nPage9Top = getXPath(pLayout, "/root/page[9]/infos/bounds"_ostr, "top"_ostr).toInt32(); + assertXPath( + pLayout, + "/root/page[9]/body/section[1]/column[1]/body/txt[1]/anchored/fly[1]/notxt/infos/bounds"_ostr, + "top"_ostr, OUString::number(nPage9Top + 1460)); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf152106) +{ + // this caused an infinite loop + createSwDoc("tdf152106.odt"); + + xmlDocUniquePtr pLayout = parseLayoutDump(); + + // frame on page 3 + assertXPath(pLayout, "/root/page[3]/sorted_objs/fly"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf128198) +{ + createSwDoc("tdf128198-1.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + xmlDocUniquePtr pLayout = parseLayoutDump(); + // the problem was that line 5 was truncated at "this " + // due to the fly anchored in previous paragraph + assertXPath(pLayout, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[5]"_ostr, + "portion"_ostr, + "to access any service, any time, anywhere. From this perspective, satellite " + "boasts some "); + assertXPath(pLayout, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[6]"_ostr, + "portion"_ostr, "significant advantages. "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testNoLineBreakAtSlash) +{ + createSwDoc("no-line-break-at-slash.fodt"); + xmlDocUniquePtr pLayout = parseLayoutDump(); + + // the line break was between "Foostrasse 13/c/" and "2" + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 2); + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]/child::*"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]/child::*[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]/child::*[2]"_ostr, + "type"_ostr, "PortionType::Blank"); + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]/child::*[3]"_ostr, + "type"_ostr, "PortionType::Text"); + + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "Blah blah bla bla bla "); + assertXPath(pLayout, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]/SwLinePortion[1]"_ostr, + "portion"_ostr, "Foostrasse"); + assertXPath(pLayout, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]/SwLinePortion[2]"_ostr, + "portion"_ostr, "13/c/2, etc."); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf106153) +{ + createSwDoc("tdf106153.docx"); + xmlDocUniquePtr pDump = parseLayoutDump(); + + const sal_Int64 nPageValLeft + = getXPath(pDump, "/root/page/infos/bounds"_ostr, "left"_ostr).toInt64(); + const sal_Int64 nPageValTop + = getXPath(pDump, "/root/page/infos/bounds"_ostr, "top"_ostr).toInt64(); + const sal_Int64 nPageValRight + = getXPath(pDump, "/root/page/infos/bounds"_ostr, "right"_ostr).toInt64(); + const sal_Int64 nPageValBottom + = getXPath(pDump, "/root/page/infos/bounds"_ostr, "bottom"_ostr).toInt64(); + + const sal_Int64 nShape1ValTop + = getXPath(pDump, "/root/page/body/txt/anchored/fly[1]/infos/bounds"_ostr, "top"_ostr) + .toInt64(); + const sal_Int64 nShape2ValLeft + = getXPath(pDump, "/root/page/body/txt/anchored/fly[2]/infos/bounds"_ostr, "left"_ostr) + .toInt64(); + const sal_Int64 nShape3ValRight + = getXPath(pDump, "/root/page/body/txt/anchored/fly[3]/infos/bounds"_ostr, "right"_ostr) + .toInt64(); + const sal_Int64 nShape4ValBottom + = getXPath(pDump, "/root/page/body/txt/anchored/fly[4]/infos/bounds"_ostr, "bottom"_ostr) + .toInt64(); + + CPPUNIT_ASSERT_MESSAGE("The whole top textbox is inside the page!", + nPageValTop > nShape1ValTop); + CPPUNIT_ASSERT_MESSAGE("The whole left textbox is inside the page!", + nPageValLeft > nShape2ValLeft); + CPPUNIT_ASSERT_MESSAGE("The whole right textbox is inside the page!", + nPageValRight < nShape3ValRight); + CPPUNIT_ASSERT_MESSAGE("The whole bottom textbox is inside the page!", + nPageValBottom < nShape4ValBottom); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInFlys) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + pWrtShell->Insert("foo"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("bar"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("baz"); + SfxItemSet flySet(pDoc->GetAttrPool(), + svl::Items); + SwFormatFrameSize size(SwFrameSize::Minimum, 1000, 1000); + flySet.Put(size); // set a size, else we get 1 char per line... + pWrtShell->StartOfSection(false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + SwFormatAnchor anchor1(RndStdIds::FLY_AT_CHAR); + anchor1.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + flySet.Put(anchor1); + SwFrameFormat const* pFly1 = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly1 != nullptr); + // move inside fly1 + pWrtShell->GotoFly(pFly1->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Insert("abc"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("def"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("ghi"); + + SwFormatAnchor anchor2(RndStdIds::FLY_AT_CHAR); + pWrtShell->StartOfSection(false); // start of fly... + anchor2.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + flySet.Put(anchor2); + SwFrameFormat const* pFly2 = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly2 != nullptr); + // move inside fly2 + pWrtShell->GotoFly(pFly2->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Insert("jkl"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("mno"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("pqr"); + + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // delete redline inside fly2 + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 8, /*bBasicCall=*/false); + pWrtShell->Delete(); + + // delete redline inside fly1 + pWrtShell->GotoFly(pFly1->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 7, /*bBasicCall=*/false); + pWrtShell->Delete(); + + pWrtShell->ClearMark(); // otherwise it refuses to leave the fly... + pWrtShell->SttEndDoc(true); // note: SttDoc actually moves to start of fly? + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 7, /*bBasicCall=*/false); + pWrtShell->Delete(); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor1.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor1.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor1.SetAnchor(&pos); + pDoc->SetAttr(anchor1, *const_cast(pFly1)); + anchor2.SetType(RndStdIds::FLY_AT_PARA); + pos.nNode = *anchor2.GetAnchorNode(); + anchor2.SetAnchor(&pos); + pDoc->SetAttr(anchor2, *const_cast(pFly2)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "19"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "6"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "11"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "jqr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "type"_ostr, "PortionType::Lay"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "portion"_ostr, "abhi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "j"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "kl"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[2]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[2]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "mno"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "p"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "qr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "ab"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "c"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 2nd (deleted) paragraph + // also, switch the in-fly anchoring to the other fly, for additional fun! + pWrtShell->StartOfSection(); + pWrtShell->Down(false, 1); + anchor2.SetType(RndStdIds::FLY_AT_CHAR); + anchor2.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor2, *const_cast(pFly2)); + pWrtShell->GotoFly(pFly2->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Down(false, 1); + anchor1.SetType(RndStdIds::FLY_AT_CHAR); + anchor1.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor1, *const_cast(pFly1)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor1.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor1.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor1.SetAnchor(&pos); + pDoc->SetAttr(anchor1, *const_cast(pFly1)); + anchor2.SetType(RndStdIds::FLY_AT_PARA); + pos.nNode = *anchor2.GetAnchorNode(); + anchor2.SetAnchor(&pos); + pDoc->SetAttr(anchor2, *const_cast(pFly2)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "19"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + + // hide: no anchored object shown + assertXPath(pXmlDoc, "//anchored"_ostr, 0); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "j"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "kl"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "ab"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "c"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[2]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[2]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "type"_ostr, "PortionType::Lay"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "portion"_ostr, "mno"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "p"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "qr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } + + // anchor to 3rd paragraph + pWrtShell->SttEndDoc(false); + anchor1.SetType(RndStdIds::FLY_AT_CHAR); + anchor1.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor1, *const_cast(pFly1)); + pWrtShell->GotoFly(pFly1->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->EndOfSection(); + anchor2.SetType(RndStdIds::FLY_AT_CHAR); + anchor2.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor2, *const_cast(pFly2)); + + for (int i = 0; i < 2; ++i) + { + if (i == 1) // secondly, try with different anchor type + { + anchor1.SetType(RndStdIds::FLY_AT_PARA); + SwPosition pos(*anchor1.GetAnchorNode()); + pos.nContent.Assign(nullptr, 0); + anchor1.SetAnchor(&pos); + pDoc->SetAttr(anchor1, *const_cast(pFly1)); + anchor2.SetType(RndStdIds::FLY_AT_PARA); + pos.nNode = *anchor2.GetAnchorNode(); + anchor2.SetAnchor(&pos); + pDoc->SetAttr(anchor2, *const_cast(pFly2)); + } + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, + "19"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "6"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "11"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "jqr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "type"_ostr, "PortionType::Lay"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "portion"_ostr, "abhi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "ab"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "c"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "j"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "kl"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[2]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[2]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "mno"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "p"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/anchored[1]/fly[1]/txt[3]/" + "SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "qr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysAtFlys) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + pWrtShell->Insert("foo"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("bar"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("baz"); + SfxItemSet flySet(pDoc->GetAttrPool(), + svl::Items); + SwFormatFrameSize size(SwFrameSize::Minimum, 1000, 1000); + flySet.Put(size); // set a size, else we get 1 char per line... + pWrtShell->StartOfSection(false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + SwFormatAnchor anchor1(RndStdIds::FLY_AT_CHAR); + anchor1.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + flySet.Put(anchor1); + SwFrameFormat const* pFly1 = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly1 != nullptr); + // move inside fly1 + pWrtShell->GotoFly(pFly1->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Insert("abc"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("def"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("ghi"); + + SwFormatAnchor anchor2(RndStdIds::FLY_AT_FLY); + SwPosition pos(*pFly1->GetContent().GetContentIdx()); + anchor2.SetAnchor(&pos); + flySet.Put(anchor2); + SwFrameFormat const* pFly2 = pWrtShell->NewFlyFrame(flySet, /*bAnchValid=*/true); + CPPUNIT_ASSERT(pFly2 != nullptr); + // move inside fly2 + pWrtShell->GotoFly(pFly2->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Insert("jkl"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("mno"); + pWrtShell->SplitNode(false); + pWrtShell->Insert("pqr"); + + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // delete redline inside fly2 + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 8, /*bBasicCall=*/false); + pWrtShell->Delete(); + + // delete redline inside fly1 + pWrtShell->GotoFly(pFly1->GetName(), FLYCNTTYPE_FRM, /*bSelFrame=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 7, /*bBasicCall=*/false); + pWrtShell->Delete(); + + pWrtShell->ClearMark(); // otherwise it refuses to leave the fly... + pWrtShell->SttEndDoc(true); // note: SttDoc actually moves to start of fly? + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 7, /*bBasicCall=*/false); + pWrtShell->Delete(); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, "19"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "6"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/merged"_ostr, + "paraPropsNodeIndex"_ostr, "11"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "jqr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "type"_ostr, "PortionType::Lay"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLineLayout[1]"_ostr, + "portion"_ostr, "abhi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "j"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "kl"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "mno"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "p"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "qr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "ab"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "c"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); + + // anchor to 2nd (deleted) paragraph + pWrtShell->StartOfSection(); + pWrtShell->Down(false, 1); + anchor1.SetType(RndStdIds::FLY_AT_CHAR); + anchor1.SetAnchor(pWrtShell->GetCursor()->GetPoint()); + pDoc->SetAttr(anchor1, *const_cast(pFly1)); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, "19"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foaz"); + + // hide: no anchored object shown + assertXPath(pXmlDoc, "//anchored"_ostr, 0); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "j"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "kl"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[2]/SwParaPortion/" + "SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "mno"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "p"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/anchored[1]/fly[1]/txt[3]/SwParaPortion/" + "SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "qr"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwFixPortion[1]"_ostr, + "type"_ostr, + "PortionType::Fly"); // remove??? + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "ab"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "c"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[2]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "def"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[1]"_ostr, + "portion"_ostr, "g"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/anchored/fly[1]/txt[3]/SwParaPortion/SwLineLayout/" + "SwLinePortion[2]"_ostr, + "portion"_ostr, "hi"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "az"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineSections) +{ + createSwDoc("redline_sections.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + + // verify after load + CheckRedlineSectionsHidden(); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + // why is this needed explicitly? + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "portion"_ostr, "o"); + + assertXPath(pXmlDoc, + "/root/page[1]/body/section[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[1]/txt[1]/anchored/fly[1]/txt[1]/SwParaPortion/" + "SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "FRAME"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[1]/txt[2]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[1]/txt[2]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "portion"_ostr, "lah"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[2]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[2]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[3]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[3]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[3]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/section[2]/txt[3]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "portion"_ostr, "lah"); + + // verify after hide + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + // why is this needed explicitly? + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + CheckRedlineSectionsHidden(); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TDF69647_images) +{ + createSwDoc("tdf69647_images.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of pages does not match!", 2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TDF69647_text) +{ + createSwDoc("tdf69647_text.docx"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of pages does not match!", 2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineTables) +{ + createSwDoc("redline_table.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + + // verify after load + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, "12"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foar"); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + // why is this needed explicitly? + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/anchored/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/anchored/fly[1]/txt[1]/" + "SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "FRAME"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "aaa"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[1]/row[2]/cell[2]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[1]/row[2]/cell[2]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[1]"_ostr, + "portion"_ostr, "ddd"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "ar"); + + // verify after hide + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + // why is this needed explicitly? + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, "12"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foar"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf144057) +{ + createSwDoc("tdf144057.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // show tracked row deletions + assertXPath(pXmlDoc, "/root/page"_ostr, 4); + assertXPath( + pXmlDoc, + "/root/page[1]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "A6"); + assertXPath( + pXmlDoc, + "/root/page[2]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "A12"); + assertXPath( + pXmlDoc, + "/root/page[3]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "B6"); + assertXPath( + pXmlDoc, + "/root/page[4]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "B12"); + + // hide tracked table and table row deletions + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // This was 4 (unhidden tracked table and table row deletions) + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 5); + assertXPath( + pXmlDoc, + "/root/page[1]/body/tab/row[5]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "B12"); + + // show tracked table and table row deletions again + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page"_ostr, 4); + assertXPath( + pXmlDoc, + "/root/page[1]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "A6"); + assertXPath( + pXmlDoc, + "/root/page[2]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "A12"); + assertXPath( + pXmlDoc, + "/root/page[3]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "B6"); + assertXPath( + pXmlDoc, + "/root/page[4]/body/tab/row[6]/cell/txt/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "B12"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf144347) +{ + createSwDoc("tdf144057.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + + // remove first table + SwEditShell* const pEditShell(pDoc->GetEditShell()); + for (int i = 0; i < 12; ++i) + pEditShell->AcceptRedline(0); + + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // show tracked row deletions + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1); + + // select all the text, including the texts before and after the table + // Note: this table contains tracked changes, which was a + // problem for the original OOo implementation of track changes, + // resulting empty tables after accepting the deletion of these tables. + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Delete", {}); + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // table is deleted with change tracking: it still exists + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1); + + // accept all deletions, removing the table completely + while (pEditShell->GetRedlineCount() > 0) + pEditShell->AcceptRedline(0); + + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + // This was 1 (bad empty table) + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf155345) +{ + createSwDoc("tdf144057.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + + // reject all deletions + dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {}); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + + // delete table column with track changes + dispatchCommand(mxComponent, ".uno:DeleteColumns", {}); + + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // show tracked column deletions + assertXPath(pXmlDoc, "/root/page"_ostr, 4); + + // hide tracked table column deletions + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // This was 4 (unhidden tracked table column deletions) + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + + // show tracked table column deletions again + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page"_ostr, 4); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf109137) +{ + createSwDoc("tdf109137.docx"); + // FIXME: it's not possible to use 'reload' here because the validation fails with + // Error: attribute "text:start-value" has a bad value + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + uno::Sequence aDescriptor(comphelper::InitPropertySequence({ + { "FilterName", uno::Any(OUString("writer8")) }, + })); + xStorable->storeToURL(maTempFile.GetURL(), aDescriptor); + mxComponent->dispose(); + mxComponent = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 0, the blue rectangle moved from the 1st to the 2nd page. + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly/notxt"_ostr, + /*nNumberOfNodes=*/1); +} + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint72) { createSwDoc("forcepoint72-1.rtf"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint75) { createSwDoc("forcepoint75-1.rtf"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testUXTSOREL) { createSwDoc("LIBREOFFICE-UXTSOREL.rtf"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepointFootnoteFrame) +{ + createSwDoc("forcepoint-swfootnoteframe-1.rtf"); +} + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint76) { createSwDoc("forcepoint76-1.rtf"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testN4LA0OHZ) { createSwDoc("LIBREOFFICE-N4LA0OHZ.rtf"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint89) { createSwWebDoc("forcepoint89.html"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint90) { createSwDoc("forcepoint90.rtf"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint91) { createSwWebDoc("forcepoint91.html"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint92) { createSwDoc("forcepoint92.doc"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint93) +{ + createSwDoc("forcepoint93-1.rtf"); + createSwDoc("forcepoint93-2.rtf"); +} + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint94) { createSwWebDoc("forcepoint94.html"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint98) { createSwWebDoc("forcepoint98.html"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint100) { createSwWebDoc("forcepoint100.html"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint102) { createSwDoc("forcepoint102.rtf"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint103) { createSwWebDoc("forcepoint103.html"); } + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf147485Forcepoint) +{ + createSwDoc("tdf147485-forcepoint.docx"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf118058) +{ + createSwDoc("tdf118058.fodt"); + SwDoc* pDoc = getSwDoc(); + // This resulted in a layout loop. + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); +} + +//just care it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testForcepoint99) { createSwWebDoc("forcepoint99.html"); } + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf128611) +{ + createSwDoc("tdf128611.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 14 + // i.e. there were multiple portions in the first paragraph of the A1 cell, which means that the + // rotated text was broken into multiple lines without a good reason. + assertXPathContent(pXmlDoc, "//tab/row/cell[1]/txt"_ostr, "Abcd efghijkl"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf142694) +{ + createSwDoc("tdf142694-1.odt"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + + // the problem with this table is that the 3rd text frame (inside a nested + // table) contains an as-char fly that doesn't fit on a page with the + // repeated header row; currently it's split so that the 3rd text frame is + // on a page of its own and extends outside the table. + + assertXPathNoAttribute(pXmlDoc, "/root/page[4]/body/tab[1]"_ostr, "precede"_ostr); + CPPUNIT_ASSERT(!getXPath(pXmlDoc, "/root/page[4]/body/tab[1]"_ostr, "follow"_ostr).isEmpty()); + assertXPath(pXmlDoc, "/root/page[4]/body/tab[1]/row[1]/cell[1]/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/body/tab[1]/row[2]/cell[1]/txt"_ostr, 2); + CPPUNIT_ASSERT(!getXPath(pXmlDoc, "/root/page[5]/body/tab[1]"_ostr, "precede"_ostr).isEmpty()); + assertXPathNoAttribute(pXmlDoc, "/root/page[5]/body/tab[1]"_ostr, "follow"_ostr); + assertXPath(pXmlDoc, "/root/page[5]/body/tab[1]/row[1]/cell[1]/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[5]/body/tab[1]/row[2]/cell[1]/tab"_ostr, 1); + assertXPathNoAttribute(pXmlDoc, "/root/page[5]/body/tab[1]/row[2]/cell[1]/tab"_ostr, + "follow"_ostr); + assertXPath(pXmlDoc, "/root/page[5]/body/tab[1]/row[2]/cell[1]/tab/row/cell/txt"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf152413) +{ + createSwDoc("tdf152413.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Without the fix in place, this test would have failed with + // - Expected: 1 + // - Actual : 2 + // - In <>, XPath '/root/page/body/txt/SwParaPortion/SwLineLayout/SwLinePortion' number of nodes is incorrect + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/SwLinePortion"_ostr, + "portion"_ostr, u"صِرَ ٰطَ"_ustr); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testTdf125893) +{ + createSwDoc("tdf125893.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 400. The paragraph must have zero top border. + assertXPath(pXmlDoc, "/root/page/body/txt[4]/infos/prtBounds"_ostr, "top"_ostr, "0"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx new file mode 100644 index 0000000000..800e5749fe --- /dev/null +++ b/sw/qa/extras/layout/layout2.cxx @@ -0,0 +1,3037 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// Test to assert layout / rendering result of Writer. +class SwLayoutWriter2 : public SwModelTestBase +{ +public: + SwLayoutWriter2() + : SwModelTestBase("/sw/qa/extras/layout/data/") + { + } + +protected: + void CheckRedlineCharAttributesHidden(); +}; + +// this mainly tests that splitting portions across redlines in SwAttrIter works +void SwLayoutWriter2::CheckRedlineCharAttributesHidden() +{ + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/merged"_ostr, "paraPropsNodeIndex"_ostr, "9"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foobaz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/merged"_ostr, "paraPropsNodeIndex"_ostr, "10"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foobaz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/merged"_ostr, "paraPropsNodeIndex"_ostr, "11"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/merged"_ostr, "paraPropsNodeIndex"_ostr, "12"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/merged"_ostr, "paraPropsNodeIndex"_ostr, "13"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/merged"_ostr, "paraPropsNodeIndex"_ostr, "14"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/merged"_ostr, "paraPropsNodeIndex"_ostr, "15"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/merged"_ostr, "paraPropsNodeIndex"_ostr, "16"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/merged"_ostr, "paraPropsNodeIndex"_ostr, "17"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foobaz"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/merged"_ostr, "paraPropsNodeIndex"_ostr, "18"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "ob"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "az"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/merged"_ostr, "paraPropsNodeIndex"_ostr, "19"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "type"_ostr, "PortionType::Para"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, + "portion"_ostr, "foobaz"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf148897) +{ + createSwDoc("tdf148897.odt"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[3]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[3]/body/txt/anchored/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/anchored/fly"_ostr, 1); + // fly portion exists, no overlapping text + assertXPath(pXmlDoc, + "/root/page[4]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion"_ostr, + "height"_ostr, "5797"); + assertXPath(pXmlDoc, "/root/page[5]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page"_ostr, 5); + + auto xModel = mxComponent.queryThrow(); + uno::Reference xShape(getShapeByName(u"Image3")); + uno::Reference xCtrl(xModel->getCurrentController(), uno::UNO_QUERY); + xCtrl->select(uno::Any(xShape)); + + dispatchCommand(mxComponent, ".uno:Delete", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[2]/anchored/fly"_ostr, 1); + // fly portion exists, no overlapping text + assertXPath(pXmlDoc, + "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion"_ostr, + "height"_ostr, "5797"); + assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[4]/body/txt/anchored/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page"_ostr, 4); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[3]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[3]/body/txt/anchored/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/anchored/fly"_ostr, 1); + // fly portion exists, no overlapping text + assertXPath(pXmlDoc, + "/root/page[4]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion"_ostr, + "height"_ostr, "5797"); + assertXPath(pXmlDoc, "/root/page[5]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page"_ostr, 5); + + dispatchCommand(mxComponent, ".uno:Redo", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[2]/anchored/fly"_ostr, 1); + // fly portion exists, no overlapping text + assertXPath(pXmlDoc, + "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion"_ostr, + "height"_ostr, "5797"); + assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[4]/body/txt/anchored/fly"_ostr, 0); + assertXPath(pXmlDoc, "/root/page"_ostr, 4); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineCharAttributes) +{ + createSwDoc("redline_charatr.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + + // verify after load + CheckRedlineCharAttributesHidden(); + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + // why is this needed explicitly? + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // show: nothing is merged + assertXPath(pXmlDoc, "//merged"_ostr, 0); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "ba"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "r"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[4]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[4]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "baz"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "fo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "o"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "bar"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[4]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[4]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[5]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[5]"_ostr, + "portion"_ostr, "az"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "foo"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "b"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[3]"_ostr, + "portion"_ostr, "a"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[4]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[4]"_ostr, + "portion"_ostr, "r"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[5]"_ostr, + "type"_ostr, "PortionType::Text"); + assertXPath(pXmlDoc, + "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[5]"_ostr, + "portion"_ostr, "baz"); + + // verify after hide + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + // why is this needed explicitly? + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + CheckRedlineCharAttributesHidden(); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineShowHideFootnotePagination) +{ + createSwDoc("redline_footnote_pagination.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // check footnotes + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn"_ostr, 6); + assertXPath(pXmlDoc, "/root/page[2]/ftncont/ftn"_ostr, 3); + // check that first page ends with the y line and second page starts with z + assertXPath(pXmlDoc, "/root/page[1]/body/txt[last()]/SwParaPortion/SwLineLayout[last()]"_ostr, + "portion"_ostr, + "yyyyyyyyy yyy yyyyyyyyyyyyyyyy yyyyyyy yyy yyyyy yyyyyyyyy yyy yyyyyyyyy "); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, + "zzz. zzz zzzz zzzz* zzz zzz zzzzzzz zzz zzzz zzzzzzzzzzzzzz zzzzzzzzzzzz "); + + // hide redlines - all still visible footnotes move to page 1 + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/ftncont/ftn"_ostr, 0); + + // show again - should now get the same result as on loading + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // check footnotes + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn"_ostr, 6); + assertXPath(pXmlDoc, "/root/page[2]/ftncont/ftn"_ostr, 3); + // check that first page ends with the y line and second page starts with z + assertXPath(pXmlDoc, "/root/page[1]/body/txt[last()]/SwParaPortion/SwLineLayout[last()]"_ostr, + "portion"_ostr, + "yyyyyyyyy yyy yyyyyyyyyyyyyyyy yyyyyyy yyy yyyyy yyyyyyyyy yyy yyyyyyyyy "); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, + "zzz. zzz zzzz zzzz* zzz zzz zzzzzzz zzz zzzz zzzzzzzzzzzzzz zzzzzzzzzzzz "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testtdf138951) +{ + // Open the bugdoc + createSwDoc("tdf138951.odt"); + auto pDoc = getSwDoc(); + + // Get the only shape + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xShape); + + // Gather its formats: the shape and textbox + const SwFrameFormat* pTxFrm = SwTextBoxHelper::getOtherTextBoxFormat(xShape); + CPPUNIT_ASSERT(pTxFrm); + const SwFrameFormat* pShFrm = SwTextBoxHelper::getOtherTextBoxFormat(pTxFrm, RES_FLYFRMFMT); + CPPUNIT_ASSERT(pShFrm); + + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); + + // Get the bound rectangle of the textframe + tools::Rectangle aTxtFrmRect(pTxFrm->FindRealSdrObject()->GetLogicRect()); + + // Get the bound rectangle of the shape + tools::Rectangle aShpRect(pShFrm->FindRealSdrObject()->GetLogicRect()); + + // Check the anchor the same and the textbox is inside the shape + const bool bIsAnchTheSame + = *pShFrm->GetAnchor().GetAnchorNode() == *pShFrm->GetAnchor().GetAnchorNode(); + CPPUNIT_ASSERT_MESSAGE("The anchor is different for the textbox and shape!", bIsAnchTheSame); + CPPUNIT_ASSERT_MESSAGE("The textbox has fallen apart!", aShpRect.Contains(aTxtFrmRect)); + // Without the fix the anchor differs, and the frame outside of the shape +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150717) +{ + createSwDoc("tdf150717.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // check bookmark colors defined in metadata + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[2]"_ostr, + "colors"_ostr, "#Bookmark1 Bookmark Start"); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[4]"_ostr, + "colors"_ostr, "#Bookmark2 Bookmark Start"); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[6]"_ostr, + "colors"_ostr, "#Bookmark2 Bookmark End#Bookmark1 Bookmark End"); + // full text, if bookmarks are visible + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "Lorem "); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[3]"_ostr, + "portion"_ostr, "ipsum dolor et "); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[5]"_ostr, + "portion"_ostr, "ames"); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[7]"_ostr, + "portion"_ostr, "."); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150790) +{ + createSwDoc("tdf150790.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // point bookmark is shown as I-beam (only its text dump is |, as before on the screen) + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout/SwBookmarkPortion"_ostr, + "colors"_ostr, "#Bookmark 1 Bookmark"); + // single start bookmark + assertXPath(pXmlDoc, + "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[1]"_ostr, + "colors"_ostr, "#Bookmark 2 Bookmark Start"); + // single end bookmark + assertXPath(pXmlDoc, + "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[3]"_ostr, + "colors"_ostr, "#Bookmark 3 Bookmark End"); + // This was |, as before the point bookmark (neighboring end and start bookmarks) + assertXPath(pXmlDoc, + "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[2]"_ostr, + "colors"_ostr, "#Bookmark 2 Bookmark End#Bookmark 3 Bookmark Start"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf129357) +{ + createSwDoc("tdf129357.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // visible soft hyphen + assertXPathContent(pXmlDoc, "/metafile/push/push/push/push/push/textarray[2]/text"_ostr, "-"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumberInNumbering) +{ + createSwDoc("tdf42748.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Assert the tracked deletion of the number of joined list item and + // the tracked insertion of the number after a split list item as not black + // (and not COL_GREEN color of the tracked text movement, see testRedlineMoving) elements + assertXPath( + pXmlDoc, + "/metafile/push/push/push/textcolor[not(@color='#000000') and not(@color='#008000')]"_ostr, + 5); + + // tdf#145068 numbering shows changes in the associated list item, not the next one + // This was 1 (black numbering of the first list item previously) + assertXPath(pXmlDoc, "/metafile/push/push/push/font[4][@color='#000000']"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumbering) +{ + createSwDoc("tdf115523.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Show the correct and the original line numbering instead of counting + // the deleted list items in Show Changes mode, as part of the list + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text"_ostr, "1."); + // This was "2." (deleted text node, now its text content is part of the first list item) + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text"_ostr, "[2.] "); + // This was "3." (now it's the second list item) + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text"_ostr, "2.[3.] "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumbering2) +{ + createSwDoc("tdf115524.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Show the correct and the original line numbering in Show Changes mode + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text"_ostr, "1."); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text"_ostr, "2."); + // FIXME: show as 3.[2.] + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text"_ostr, "3."); + // This was "4." (not shown the original number) + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[7]/text"_ostr, "4.[3.] "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf149710_RedlineNumberingEditing) +{ + createSwDoc("tdf149710.fodt"); + SwDoc* pDoc = getSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // Show Changes + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + + // delete the paragraph mark of the first list item with change tracking + dispatchCommand(mxComponent, ".uno:GoToEndOfLine", {}); + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + dispatchCommand(mxComponent, ".uno:Delete", {}); + + // Dump the rendering of the first page as an XML file. + SwDocShell* pShell = pDoc->GetDocShell(); + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Show the correct and the original line numbering instead of counting + // the deleted list items in Show Changes mode, as part of the list + // This was "1." + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text"_ostr, "[1.] "); + // This was "2." (deleted text node, now its text content is part of the first list item) + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text"_ostr, "1.[2.] "); + // This was "3." (now it's the second list item) + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text"_ostr, "2.[3.] "); + + // remove the tracked deletion, and check the layout again + pWrtShell->Undo(); + xMetaFile = pShell->GetPreviewMetaFile(); + pXmlDoc = dumpAndParse(dumper, *xMetaFile); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text"_ostr, "1."); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text"_ostr, "2."); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text"_ostr, "3."); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf149709_RedlineNumberingLevel) +{ + createSwDoc("tdf149709.fodt"); + SwDoc* pDoc = getSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // Show Changes + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + + // insert a new list item at start of the second list item "a)" + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + pWrtShell->Down(false, 1); + pWrtShell->SplitNode(false); + + // Dump the rendering of the first page as an XML file. + SwDocShell* pShell = pDoc->GetDocShell(); + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Show the correct and the original line numbering instead of counting + // the deleted list items in Show Changes mode, as part of the list + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text"_ostr, "1."); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text"_ostr, "a)"); + // This was "b)[2.]" + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[4]/text"_ostr, "b)[a)] "); + // This was "c)[3.]" + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[6]/text"_ostr, "c)[b)] "); + // This was "4.[2.]" (after disabling Show Changes, and enabling again) + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[8]/text"_ostr, "2."); + + // remove the tracked deletion, and check the layout again + pWrtShell->Undo(); + xMetaFile = pShell->GetPreviewMetaFile(); + pXmlDoc = dumpAndParse(dumper, *xMetaFile); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text"_ostr, "1."); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text"_ostr, "a)"); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text"_ostr, "b)"); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[7]/text"_ostr, "2."); + + // check Redo + pWrtShell->Redo(); + xMetaFile = pShell->GetPreviewMetaFile(); + pXmlDoc = dumpAndParse(dumper, *xMetaFile); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text"_ostr, "1."); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text"_ostr, "a)"); + // TODO: show as b)[a)] + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[4]/text"_ostr, "b)"); + // FIXME: This must be "c)[b]" + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[6]/text"_ostr, "c)[a)] "); + assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[8]/text"_ostr, "2."); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf149711_importDOCXMoveToParagraphMark) +{ + createSwDoc("tdf149711.docx"); + SwDoc* pDoc = getSwDoc(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 6); + + // reject tracked insertion (moveTo) + SwEditShell* const pEditShell(pDoc->GetEditShell()); + CPPUNIT_ASSERT_EQUAL(static_cast(2), pEditShell->GetRedlineCount()); + pEditShell->RejectRedline(1); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // This was 6 (not tracked paragraph mark of the moveTo list item) + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 5); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152872) +{ + createSwDoc("hidden-para-separator.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 2); + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, + "C DE"); + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion"_ostr, 0); // 5 is empty and hidden + assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds"_ostr, "height"_ostr, "0"); + + dispatchCommand(mxComponent, ".uno:ControlCodes", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 5); + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, + "C "); + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, + "D"); + // 3 is an empty paragraph with RES_CHRATR_HIDDEN which results in 0-height + // frame; ideally it should only be hidden when control codes are hidden + // and be a full-height frame now, but that needs more work... + assertXPath(pXmlDoc, "/root/page/body/txt[3]/infos/bounds"_ostr, "height"_ostr, "0"); + assertXPath(pXmlDoc, "/root/page/body/txt[4]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, + "E"); + // 5 is an empty paragraph with RES_CHRATR_HIDDEN which results in 0-height + // frame; ideally it should only be hidden when control codes are hidden + // and be a full-height frame now, but that needs more work... + assertXPath(pXmlDoc, "/root/page/body/txt[5]/SwParaPortion"_ostr, 0); // 5 is empty + assertXPath(pXmlDoc, "/root/page/body/txt[5]/infos/bounds"_ostr, "height"_ostr, "0"); + + dispatchCommand(mxComponent, ".uno:ControlCodes", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 2); + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, + "C DE"); + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion"_ostr, 0); // 5 is empty and hidden + assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds"_ostr, "height"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf151954) +{ + createSwDoc("tdf151954.docx"); + SwDoc* pDoc = getSwDoc(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 2); + + // accept tracked insertion (moveTo) + SwEditShell* const pEditShell(pDoc->GetEditShell()); + CPPUNIT_ASSERT_EQUAL(static_cast(3), pEditShell->GetRedlineCount()); + pEditShell->AcceptRedline(0); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // This was 1 (moveFrom was extended to the paragraph mark) + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152952) +{ + createSwDoc("Hyphenated-link.rtf"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // URL should not be hyphenated + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, " NNNNNNNNNN NNNNNNNNNNNNNNN "); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, + "https://example.com/xxxxxxx/testtesttesttest/hyphenate/testtesttest "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152952_compat) +{ + uno::Reference xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString()))) + return; + + createSwDoc("Hyphenated-link.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // URL hyphenated for backward compatibility + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, + " NNNNNNNNNN NNNNNNNNNNNNNNN https://example.com/xxxxxxx/testtesttesttest/hyphen"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, "ate/testtesttest "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumberInFootnote) +{ + createSwDoc("tdf85610.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // changed color of numbers of footnote 1 (deleted footnote) and footnote 2 (inserted footnote) + // decreased the black elements by 2: + // This was 7 + assertXPath(pXmlDoc, "/metafile/push/push/push/font[@color='#000000']"_ostr, 5); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineMoving) +{ + createSwDoc("tdf42748.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // create a 3-element list without change tracking + SwEditShell* const pEditShell(pDoc->GetEditShell()); + pEditShell->RejectRedline(0); + pEditShell->AcceptRedline(0); + + // move down first list item with track changes + dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {}); + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + dispatchCommand(mxComponent, ".uno:MoveDown", {}); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // text and numbering colors show moving of the list item + // tdf#157663: the moved text item "It" is detected as text moving again! + assertXPath(pXmlDoc, "/metafile/push/push/push/textcolor[@color='#008000']"_ostr, 5); + assertXPath(pXmlDoc, "/metafile/push/push/push/font[@color='#008000']"_ostr, 11); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineMoving2) +{ + createSwDoc("tdf42748.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // create a 3-element list without change tracking + SwEditShell* const pEditShell(pDoc->GetEditShell()); + pEditShell->RejectRedline(0); + pEditShell->AcceptRedline(0); + + // extend the first item to "An ItemIt", because detection of move needs + // at least 6 characters with an inner space after stripping white spaces + // of the redline + dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {}); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("An Item"); + + // move down first list item with track changes + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + dispatchCommand(mxComponent, ".uno:MoveDown", {}); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // text and numbering colors show moving of the list item + // These were 0 (other color, not COL_GREEN, color of the tracked text movement) + assertXPath(pXmlDoc, "/metafile/push/push/push/textcolor[@color='#008000']"_ostr, 5); + assertXPath(pXmlDoc, "/metafile/push/push/push/font[@color='#008000']"_ostr, 11); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineMovingDOCX) +{ + createSwDoc("tdf104797.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + SwEditShell* const pEditShell(pDoc->GetEditShell()); + // This was 2 (moveFrom and moveTo joined other redlines) + CPPUNIT_ASSERT_EQUAL(static_cast(5), pEditShell->GetRedlineCount()); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // text colors show moved text + // These were 0 (other color, not COL_GREEN, color of the tracked text movement) + assertXPath(pXmlDoc, "/metafile/push/push/push/textcolor[@color='#008000']"_ostr, 6); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTableCellInvalidate) +{ + discardDumpedLayout(); + if (mxComponent.is()) + mxComponent->dispose(); + + OUString const url(createFileURL(u"table_cell_overlap.fodt")); + + // note: must set Hidden property, so that SfxFrameViewWindow_Impl::Resize() + // does *not* forward initial VCL Window Resize and thereby triggers a + // layout which does not happen on soffice --convert-to pdf. + std::vector aFilterOptions = { + { beans::PropertyValue("Hidden", -1, uno::Any(true), beans::PropertyState_DIRECT_VALUE) }, + }; + + // inline the loading because currently properties can't be passed... + mxComponent = loadFromDesktop(url, "com.sun.star.text.TextDocument", + comphelper::containerToSequence(aFilterOptions)); + save("writer_pdf_Export"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // somehow these 2 rows overlapped in the PDF unless CalcLayout() runs + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[1]/infos/bounds"_ostr, "top"_ostr, + "6969"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[1]/infos/bounds"_ostr, + "height"_ostr, "231"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[1]/cell[1]/infos/bounds"_ostr, + "top"_ostr, "6969"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[1]/cell[1]/infos/bounds"_ostr, + "height"_ostr, "231"); + assertXPath(pXmlDoc, + "/root/page[1]/anchored/fly/tab[1]/row[1]/cell[1]/txt[1]/infos/bounds"_ostr, + "top"_ostr, "6969"); + assertXPath(pXmlDoc, + "/root/page[1]/anchored/fly/tab[1]/row[1]/cell[1]/txt[1]/infos/bounds"_ostr, + "height"_ostr, "231"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[2]/infos/bounds"_ostr, "top"_ostr, + "7200"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[2]/infos/bounds"_ostr, + "height"_ostr, "231"); + // this was 6969, causing the overlap + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[2]/cell[1]/infos/bounds"_ostr, + "top"_ostr, "7200"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[2]/cell[1]/infos/bounds"_ostr, + "height"_ostr, "231"); + assertXPath(pXmlDoc, + "/root/page[1]/anchored/fly/tab[1]/row[2]/cell[1]/txt[1]/infos/bounds"_ostr, + "top"_ostr, "7200"); + assertXPath(pXmlDoc, + "/root/page[1]/anchored/fly/tab[1]/row[2]/cell[1]/txt[1]/infos/bounds"_ostr, + "height"_ostr, "231"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf145719) +{ + createSwDoc("tdf145719.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // text colors show moved text + // This was 0 (other color, not COL_GREEN, color of the tracked text movement) + assertXPath(pXmlDoc, "/metafile/push/push/push/textcolor[@color='#008000']"_ostr, 4); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testChangedTableRows) +{ + createSwDoc("changed_table_rows.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This was 0 (other color, not COL_AUTHOR_TABLE_DEL, color of the tracked row deletion) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#fce6f4']"_ostr, 1); + // This was 0 (other color, not COL_AUTHOR_TABLE_INS, color of the tracked row insertion) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#e1f2fa']"_ostr, 1); + // This was 3 (color of the cells of the last column, 2 of them disabled by change tracking ) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#3faf46']"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf155187_TableInTextChange) +{ + createSwDoc("table_in_text_change.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This was 0 (other color, not COL_AUTHOR_TABLE_DEL, color of the tracked row deletion) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#fce6f4']"_ostr, 2); + // This was 0 (other color, not COL_AUTHOR_TABLE_INS, color of the tracked row insertion) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#e1f2fa']"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf145225_RedlineMovingWithBadInsertion) +{ + createSwDoc("tdf42748.fodt"); + SwDoc* pDoc = getSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // create a 3-element list without change tracking + // (because the fixed problem depends on the own changes) + SwEditShell* const pEditShell(pDoc->GetEditShell()); + pEditShell->RejectRedline(0); + pEditShell->AcceptRedline(0); + CPPUNIT_ASSERT_EQUAL(static_cast(0), pEditShell->GetRedlineCount()); + + // Show Changes + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(!pLayout->IsHideRedlines()); + + // insert a tracked paragraph break in middle of the second list item, i.e. split it + dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {}); + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // positionate the cursor in the middle of the second list item + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false); + pWrtShell->SplitNode(false); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pEditShell->GetRedlineCount()); + + // move up the last list item over the paragraph split + dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {}); + dispatchCommand(mxComponent, ".uno:MoveUp", {}); + dispatchCommand(mxComponent, ".uno:MoveUp", {}); + // This was 2 (the tracked paragraph break joined with the moved list item, + // setting the not changed text of the second list item to tracked insertion) + CPPUNIT_ASSERT_EQUAL(static_cast(3), pEditShell->GetRedlineCount()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf146964_ReappearingMovedTextInHideChangesMode) +{ + createSwDoc("tdf54819.fodt"); + SwDoc* pDoc = getSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // enable Record Changes + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + + // set Hide Changes mode + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwRootFrame* pLayout(pWrtShell->GetLayout()); + CPPUNIT_ASSERT(pLayout->IsHideRedlines()); + + // delete and paste the deleted word again during Track Changes + dispatchCommand(mxComponent, ".uno:WordRightSel", {}); + dispatchCommand(mxComponent, ".uno:Cut", {}); + dispatchCommand(mxComponent, ".uno:Paste", {}); + + SwEditShell* const pEditShell(pDoc->GetEditShell()); + CPPUNIT_ASSERT_EQUAL(static_cast(2), pEditShell->GetRedlineCount()); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + // This was "Lorem Lorem ipsum" (reappearing deletion in Hide Changes mode) + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "Lorem ipsum"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf125300) +{ + createSwDoc("tdf125300.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Keep line spacing before bottom cell border (it was 1892) + sal_Int32 y1 + = getXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/push[5]/polyline/point[1]"_ostr, + "y"_ostr) + .toInt32(); + sal_Int32 y2 + = getXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/push[5]/polyline/point[2]"_ostr, + "y"_ostr) + .toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(2092, y1, 7); + CPPUNIT_ASSERT_EQUAL(y1, y2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf116830) +{ + createSwDoc("tdf116830.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Assert that the yellow rectangle (cell background) is painted after the + // polypolygon (background shape). + // Background shape: 1.1.1.2 + // Cell background: 1.1.1.3 + assertXPath( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[2]/push[1]/push[1]/fillcolor[@color='#729fcf']"_ostr, + 1); + assertXPath(pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[2]/push[1]/push[1]/polypolygon"_ostr, 1); + + // This failed: cell background was painted before the background shape. + assertXPath( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/fillcolor[@color='#ffff00']"_ostr, 1); + assertXPath(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/rect"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf114163) +{ + createSwDoc("tdf114163.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPathContent(pXmlDoc, "(//textarray)[12]/text"_ostr, "Data3"); + // This failed, if the legend first label is not "Data3". The legend position is right. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf131707) +{ + createSwDoc("tdf131707_flyWrap.doc"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + assertXPath(pXmlDoc, "//body/tab/row[3]/cell[2]/txt/infos/bounds"_ostr, "top"_ostr, "2185"); + // the image should be inside of the cell boundary - so the same top or higher + assertXPath(pXmlDoc, "//body/tab/row[3]/cell[2]/txt/anchored/fly/infos/bounds"_ostr, "top"_ostr, + "2185"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf122225) +{ + createSwDoc("tdf122225.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Bug 122225 - FILEOPEN DOCX Textbox of Column chart legend reduces and text of legend disappears + const sal_Int32 nLegendLabelLines + = getXPathContent(pXmlDoc, "count(//text[contains(text(),\"Advanced Diploma\")])"_ostr) + .toInt32(); + // This failed, if the legend label is not "Advanced Diploma". + CPPUNIT_ASSERT_EQUAL(static_cast(1), nLegendLabelLines); + + // Bug 140623 - Fileopen DOCX: Text Orientation of X-Axis 0 instead of 45 degrees + const sal_Int32 nThirdLabelLines + = getXPathContent(pXmlDoc, "count(//text[contains(text(),\"Hispanic\")])"_ostr).toInt32(); + // This failed, if the third X axis label broke to multiple lines. + CPPUNIT_ASSERT_EQUAL(static_cast(1), nThirdLabelLines); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf125335) +{ + createSwDoc("tdf125335.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPathContent(pXmlDoc, "(//textarray)[12]/text"_ostr, "Data3"); + // This failed, if the legend first label is not "Data3". The legend position is bottom. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134247) +{ + createSwDoc("legend-itemorder-min.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPathContent(pXmlDoc, "(//textarray)[14]/text"_ostr, "1. adatsor"); + // This failed, if the legend first label is not "1. adatsor". +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf75659) +{ + createSwDoc("tdf75659.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPathContent(pXmlDoc, "(//textarray)[17]/text"_ostr, "Series1"); + assertXPathContent(pXmlDoc, "(//textarray)[18]/text"_ostr, "Series2"); + assertXPathContent(pXmlDoc, "(//textarray)[19]/text"_ostr, "Series3"); + // These failed, if the legend names are empty strings. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf136816) +{ + createSwDoc("tdf136816.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Check number of legend entries + assertXPath(pXmlDoc, "//text[contains(text(),\"Column\")]"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf126425) +{ + createSwDoc("long_legendentry.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 14 + // - Actual : 12 + // i.e. the text of the chart legend lost. + assertXPath(pXmlDoc, "//textarray"_ostr, 14); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testUnusedOLEprops) +{ + createSwDoc("tdf138465min.docx"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: >300 + // - Actual : 142 + // i.e. the formula squashed + CPPUNIT_ASSERT_GREATEREQUAL( + double(300), + getXPath(pXmlDoc, "/root/page/body/txt[2]/anchored/fly/notxt/infos/bounds"_ostr, + "height"_ostr) + .toDouble()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf123268) +{ + createSwDoc("tdf123268.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 53 + // - Actual : 0 + // i.e. the chart lost. + assertXPath(pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/push[1]/push[1]/push"_ostr, 53); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf133005) +{ + createSwDoc("tdf133005.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + sal_Int32 nXChartWall = getXPath(pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/push[1]/" + "push[1]/push[1]/polyline[1]/point[2]"_ostr, + "x"_ostr) + .toInt32(); + sal_Int32 nXColumn = getXPath(pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[3]/push[1]/push[1]/" + "push[1]/push[41]/polypolygon/polygon/point[1]"_ostr, + "x"_ostr) + .toInt32(); + + // This failed, if the value axis doesn't appear inside category. + CPPUNIT_ASSERT_DOUBLES_EQUAL(nXChartWall, nXColumn, 5); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf115630) +{ + createSwDoc("tdf115630.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Test wide of inner chart area. + sal_Int32 nXRight + = getXPath( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[3]/polyline[1]/point[1]"_ostr, + "x"_ostr) + .toInt32(); + sal_Int32 nXLeft + = getXPath( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[3]/polyline[1]/point[2]"_ostr, + "x"_ostr) + .toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(2895, nXRight - nXLeft, 50); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf108021) +{ + createSwDoc("tdf108021.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "//textarray[@length='22']"_ostr, 8); + // This failed, if the textarray length of the first axis label not 22. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf125334) +{ + createSwDoc("tdf125334.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + int nCount = countXPathNodes(pXmlDoc, "//textarray[@length='17']"_ostr); + CPPUNIT_ASSERT_EQUAL(4, nCount); + // This failed, if the textarray length of the category axis label not 17. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf122800) +{ + createSwDoc("tdf122800.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "//textarray[@length='22']"_ostr, 9); + // This failed, if the textarray length of the first axis label not 22. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTruncatedAxisLabel) +{ + createSwDoc("testTruncatedAxisLabel.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // test the X axis label visibility + assertXPathContent(pXmlDoc, "(//textarray)[1]/text"_ostr, "Long axis label truncated 1"); + + // test the Y axis label visibility + assertXPathContent(pXmlDoc, "(//textarray)[3]/text"_ostr, "-5.00"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf128996) +{ + createSwDoc("tdf128996.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPathContent(pXmlDoc, "(//textarray)[1]/text"_ostr, "A very long category name 1"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf126244) +{ + createSwDoc("tdf126244.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Test the first level of vertical category axis labels orientation. The first level orientation should be horizontal. + assertXPath(pXmlDoc, "(//font)[1]"_ostr, "orientation"_ostr, "0"); + // Test the second level of vertical category axis labels orientation. The second level orientation should be vertical. + sal_Int32 nRotation = getXPath(pXmlDoc, "(//font)[5]"_ostr, "orientation"_ostr).toInt32(); + CPPUNIT_ASSERT(nRotation >= 899); + CPPUNIT_ASSERT(nRotation <= 900); + // Test the third level of vertical category axis labels orientation. The third level orientation should be vertical. + nRotation = getXPath(pXmlDoc, "(//font)[7]"_ostr, "orientation"_ostr).toInt32(); + CPPUNIT_ASSERT(nRotation >= 899); + CPPUNIT_ASSERT(nRotation <= 900); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf127304) +{ + createSwDoc("tdf127304.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Test the first level of horizontal category axis labels orientation. The first level orientation should be vertical. + sal_Int32 nRotation = getXPath(pXmlDoc, "(//font)[1]"_ostr, "orientation"_ostr).toInt32(); + CPPUNIT_ASSERT(nRotation >= 899); + CPPUNIT_ASSERT(nRotation <= 900); + // Test the second level of horizontal category axis labels orientation. The second level orientation should be horizontal. + assertXPath(pXmlDoc, "(//font)[5]"_ostr, "orientation"_ostr, "0"); + // Test the third level of horizontal category axis labels orientation. The third level orientation should be horizontal. + assertXPath(pXmlDoc, "(//font)[7]"_ostr, "orientation"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testHorizontal_multilevel) +{ + createSwDoc("horizontal_multilevel.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Test the Y position of horizontal category axis label. + sal_Int32 nYposition = getXPath(pXmlDoc, "(//textarray)[7]"_ostr, "y"_ostr).toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(11248, nYposition, 20); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf69648) +{ + createSwDoc("tdf69648.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + + OString sShapeXPath[2] = { + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObjGroup/SdrObjList/SdrObject[1]"_ostr, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObjGroup/SdrObjList/SdrObject[2]"_ostr + }; + OString sFrameXPath[2] = { "/root/page/body/txt/anchored/fly[1]/infos/bounds"_ostr, + "/root/page/body/txt/anchored/fly[2]/infos/bounds"_ostr }; + + for (int i = 0; i < 2; ++i) + { + const auto sDrawRect = getXPath(pXmlDoc, sShapeXPath[i], "aOutRect"_ostr); + const auto nComaPos1 = sDrawRect.indexOf(',', 0); + const auto nComaPos2 = sDrawRect.indexOf(',', nComaPos1 + 1); + const auto nComaPos3 = sDrawRect.indexOf(',', nComaPos2 + 1); + + const auto nDraw1 = o3tl::toInt64(sDrawRect.subView(0, nComaPos1)); + const auto nDraw2 = o3tl::toInt64(sDrawRect.subView(nComaPos1 + 1, nComaPos2 - nComaPos1)); + const auto nDraw3 = o3tl::toInt64(sDrawRect.subView(nComaPos2 + 1, nComaPos3 - nComaPos2)); + const auto nDraw4 = o3tl::toInt64( + sDrawRect.subView(nComaPos3 + 1, sDrawRect.getLength() - nComaPos3 - 1)); + const auto aChildShape = SwRect(nDraw1, nDraw2, nDraw3, nDraw4); + + const auto nFlyLeft = getXPath(pXmlDoc, sFrameXPath[i], "left"_ostr).toInt64(); + const auto nFlyTop = getXPath(pXmlDoc, sFrameXPath[i], "top"_ostr).toInt64(); + const auto nFlyWidth = getXPath(pXmlDoc, sFrameXPath[i], "width"_ostr).toInt64(); + const auto nFlyHeight = getXPath(pXmlDoc, sFrameXPath[i], "height"_ostr).toInt64(); + + const auto aFrame = SwRect(nFlyLeft, nFlyTop, nFlyWidth, nFlyHeight); + + CPPUNIT_ASSERT_MESSAGE("Textbox must be inside the shape!", aChildShape.Contains(aFrame)); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf116256) +{ + // Open bugdoc + createSwDoc("tdf116256.docx"); + CPPUNIT_ASSERT(mxComponent); + + // Get the textbox + uno::Reference xTextBox(getShape(2), uno::UNO_QUERY_THROW); + + // Ensure that is a real textbox, and follows the text flow + CPPUNIT_ASSERT(xTextBox->getPropertyValue("TextBox").get()); + CPPUNIT_ASSERT(xTextBox->getPropertyValue("IsFollowingTextFlow").get()); + + // Parse the layout + auto pLayout = parseLayoutDump(); + // Get the position of the shape + const auto nTextBoxShapeLeft = getXPath(pLayout, + "/root/page/body/txt/anchored/fly/tab/row[1]/cell/txt/" + "anchored/SwAnchoredDrawObject/bounds"_ostr, + "left"_ostr) + .toInt64(); + const auto nTextBoxShapeTop = getXPath(pLayout, + "/root/page/body/txt/anchored/fly/tab/row[1]/cell/txt/" + "anchored/SwAnchoredDrawObject/bounds"_ostr, + "top"_ostr) + .toInt64(); + // Get the position of the textframe too. + const auto nTextBoxFrameLeft + = getXPath( + pLayout, + "/root/page/body/txt/anchored/fly/tab/row[1]/cell/txt/anchored/fly/infos/bounds"_ostr, + "left"_ostr) + .toInt64(); + const auto nTextBoxFrameTop + = getXPath( + pLayout, + "/root/page/body/txt/anchored/fly/tab/row[1]/cell/txt/anchored/fly/infos/bounds"_ostr, + "top"_ostr) + .toInt64(); + + // Without the fix in place these were less than they supposed to. + CPPUNIT_ASSERT_GREATEREQUAL(nTextBoxShapeLeft, nTextBoxFrameLeft); + CPPUNIT_ASSERT_GREATEREQUAL(nTextBoxShapeTop, nTextBoxFrameTop); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf138194) +{ + createSwDoc("xaxis-labelbreak.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 8 + // - Actual : 7 + // i.e. the X axis label flowed out of chart area. + assertXPath(pXmlDoc, "//textarray"_ostr, 8); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf146272) +{ + createSwDoc("tdf146272.odt"); + + uno::Reference xPicture(getShape(2), uno::UNO_QUERY); + uno::Reference xDrawing(getShape(1), uno::UNO_QUERY); + uno::Reference xFrame(xDrawing->getPropertyValue("TextBoxContent"), + uno::UNO_QUERY); + + CPPUNIT_ASSERT(xPicture); + CPPUNIT_ASSERT(xDrawing); + CPPUNIT_ASSERT(xFrame); + + const sal_uInt64 nPitureZorder = xPicture->getPropertyValue("ZOrder").get(); + const sal_uInt64 nDrawingZorder = xDrawing->getPropertyValue("ZOrder").get(); + const sal_uInt64 nFrameZorder = xFrame->getPropertyValue("ZOrder").get(); + + CPPUNIT_ASSERT_MESSAGE("Bad ZOrder!", nDrawingZorder < nFrameZorder); + CPPUNIT_ASSERT_MESSAGE("Bad ZOrder!", nFrameZorder < nPitureZorder); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf138773) +{ + createSwDoc("tdf138773.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + const sal_Int32 nFirstLabelLines + = getXPathContent(pXmlDoc, "count(//text[contains(text(),\"2000-01\")])"_ostr).toInt32(); + + // This failed, if the first X axis label broke to multiple lines. + CPPUNIT_ASSERT_EQUAL(static_cast(1), nFirstLabelLines); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf124796) +{ + createSwDoc("tdf124796.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This failed, if the minimum value of Y axis is not -10. + assertXPathContent(pXmlDoc, "(//textarray)[5]/text"_ostr, "-10"); + + // This failed, if the maximum value of Y axis is not 15. + assertXPathContent(pXmlDoc, "(//textarray)[10]/text"_ostr, "15"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf72727) +{ + createSwDoc("tdf72727.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Without the fix in place, this test would have failed with + // - Expected: 1 + // - Actual : Series1 + assertXPathContent(pXmlDoc, "(//textarray)[1]/text"_ostr, "1"); + assertXPathContent(pXmlDoc, "(//textarray)[2]/text"_ostr, "2"); + assertXPathContent(pXmlDoc, "(//textarray)[3]/text"_ostr, "3"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf130969) +{ + createSwDoc("tdf130969.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This failed, if the minimum value of Y axis is not 0.35781 + assertXPathContent(pXmlDoc, "(//textarray)[5]/text"_ostr, "0.35781"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf40260) +{ + createSwDoc("tdf40260.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Without the fix in place, this test would have failed with + // - Expected: f(x) = 1.26510397865547E-06 x − 5.95245604996327E-12 + // - Actual : f(x) = 0 x − 0 + assertXPathContent(pXmlDoc, "(//textarray)[19]/text"_ostr, + "f(x) = 1.26510397865547E-06 x " + OUStringChar(u'\x2212') + + " 5.95245604996327E-12"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf129054) +{ + createSwDoc("tdf129054.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Test the size of diameter of Pie chart. + sal_Int32 nYTop + = getXPath( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[4]/polyline[1]/point[1]"_ostr, + "y"_ostr) + .toInt32(); + sal_Int32 nYBottom + = getXPath( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[4]/polyline[1]/point[31]"_ostr, + "y"_ostr) + .toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4615, nYTop - nYBottom, 5); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf129173) +{ + createSwDoc("testAreaChartNumberFormat.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Check the first data label of area chart. + assertXPathContent(pXmlDoc, "(//textarray)[22]/text"_ostr, "56"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134866) +{ + createSwDoc("tdf134866.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Check the data label of pie chart. + assertXPathContent(pXmlDoc, "(//textarray)[2]/text"_ostr, "100%"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf137116) +{ + createSwDoc("tdf137116.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nX2 + = getXPath(pXmlDoc, "(//textarray)[2]"_ostr, "x"_ostr).toInt32(); // second data label + sal_Int32 nX4 + = getXPath(pXmlDoc, "(//textarray)[4]"_ostr, "x"_ostr).toInt32(); // fourth data label + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1229 + // - Actual : -225 + // - Delta : 100 + // i.e. the second data label appeared inside the pie slice. + CPPUNIT_ASSERT_DOUBLES_EQUAL(1117, nX2 - nX4, 100); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf137154) +{ + createSwDoc("tdf137154.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nX1 + = getXPath(pXmlDoc, "(//textarray)[1]"_ostr, "x"_ostr).toInt32(); // first data label + sal_Int32 nX4 + = getXPath(pXmlDoc, "(//textarray)[4]"_ostr, "x"_ostr).toInt32(); // fourth data label + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 10865 + // - Actual : 10252 + // - Delta : 50 + // i.e. the first data label appeared too close to the pie. + CPPUNIT_ASSERT_DOUBLES_EQUAL(nX4, nX1, 50); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf138777) +{ + createSwDoc("outside_long_data_label.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + const sal_Int32 nFirstLabelLines + = getXPathContent(pXmlDoc, "count(//text[contains(text(),\"really\")])"_ostr).toInt32(); + + // This failed, if the first data label didn't break to multiple lines. + CPPUNIT_ASSERT_GREATER(static_cast(1), nFirstLabelLines); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf130031) +{ + createSwDoc("tdf130031.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nY = getXPath(pXmlDoc, "(//textarray)[11]"_ostr, "y"_ostr).toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 4653 + // - Actual : 2182 + // - Delta : 50 + // i.e. the data label appeared above the data point. + CPPUNIT_ASSERT_DOUBLES_EQUAL(4653, nY, 50); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf130242) +{ + createSwDoc("tdf130242.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nY = getXPath(pXmlDoc, "(//textarray)[11]"_ostr, "y"_ostr).toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 5758 + // - Actual : 3352 + // - Delta : 50 + // i.e. the data label appeared above the data point. + CPPUNIT_ASSERT_DOUBLES_EQUAL(5758, nY, 50); + + nY = getXPath(pXmlDoc, "(//textarray)[13]"_ostr, "y"_ostr).toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2335 + // - Actual : 2343 + // - Delta : 50 + // i.e. the data label appeared above the data point. + CPPUNIT_ASSERT_DOUBLES_EQUAL(2335, nY, 50); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134121) +{ + createSwDoc("piechart_leaderline.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Check the custom leader line on pie chart. + assertXPath(pXmlDoc, "//polyline"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf138018) +{ + createSwDoc("tdf138018.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 3 + // i.e. the leader line was visible. + assertXPath(pXmlDoc, "//polyline"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf130380) +{ + createSwDoc("tdf130380.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nY = getXPath(pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[1]/polypolygon/" + "polygon/point[1]"_ostr, + "y"_ostr) + .toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 6727 + // - Actual : 4411 + // - Delta : 50 + // i.e. the area chart shrank. + CPPUNIT_ASSERT_DOUBLES_EQUAL(6727, nY, 50); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf129095) +{ + createSwDoc("tdf129095.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // check the inner chart area (relative size) visibility with testing the X axis label + assertXPathContent(pXmlDoc, "//textarray/text"_ostr, "Category 1"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf132956) +{ + createSwDoc("tdf132956.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // check the inner chart area (default size) visibility with testing the X axis label + assertXPathContent(pXmlDoc, "//textarray/text"_ostr, "Category 1"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf137819) +{ + // Open the bugdoc and check if it went wrong + createSwDoc("tdf137819.fodt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + // Change the anchor if the textbox to As_char + uno::Reference xShapePropSet(getShape(1), uno::UNO_QUERY); + xShapePropSet->setPropertyValue( + "AnchorType", uno::Any(text::TextContentAnchorType::TextContentAnchorType_AS_CHARACTER)); + + // Make the layout xml dump after the change + auto pXml = parseLayoutDump(); + auto sTextRightSidePosition + = getXPath(pXml, "/root/page/body/txt[6]/anchored/fly/infos/bounds"_ostr, "right"_ostr); + auto sShapeRightSidePosition = getXPath( + pXml, "/root/page/body/txt[6]/anchored/SwAnchoredDrawObject/bounds"_ostr, "right"_ostr); + // Before the textframe did not follow the shape, now it supposed to + // so the right side of the shape must be greater than the right side of + // textframe: + CPPUNIT_ASSERT(sTextRightSidePosition.toInt32() < sShapeRightSidePosition.toInt32()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf122014) +{ + createSwDoc("tdf122014.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This failed, if the chart title is aligned to left. + sal_Int32 nX1 = getXPath(pXmlDoc, "(//textarray)[13]"_ostr, "x"_ostr).toInt32(); + sal_Int32 nX2 = getXPath(pXmlDoc, "(//textarray)[14]"_ostr, "x"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(nX1 + 100, nX2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134659) +{ + createSwDoc("tdf134659.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This failed, if the axis label is aligned to left. + sal_Int32 nX1 = getXPath(pXmlDoc, "(//textarray)[1]"_ostr, "x"_ostr).toInt32(); + sal_Int32 nX2 = getXPath(pXmlDoc, "(//textarray)[2]"_ostr, "x"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(nX1 + 250, nX2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134235) +{ + createSwDoc("tdf134235.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 14 + // - Actual : 13 + // i.e. the chart title flowed out of chart area. + assertXPath(pXmlDoc, "//textarray"_ostr, 14); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134676) +{ + createSwDoc("tdf134676.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 14 + // - Actual : 13 + // i.e. the X axis title didn't break to multiple lines. + assertXPath(pXmlDoc, "//textarray"_ostr, 14); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134146) +{ + createSwDoc("tdf134146.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + const sal_Int32 nTitleLines + = getXPathContent(pXmlDoc, "count(//text[contains(text(),\"Horizontal\")])"_ostr).toInt32(); + + // Without the accompanying fix in place, this test would have failed. + // i.e. the Y axis title didn't break to multiple lines. + CPPUNIT_ASSERT_GREATER(static_cast(1), nTitleLines); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf136061) +{ + createSwDoc("tdf136061.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // This failed, if the custom text of data label is missing. + assertXPathContent(pXmlDoc, "(//textarray)[16]/text"_ostr, "Customlabel"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf116925) +{ + createSwDoc("tdf116925.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPathContent( + pXmlDoc, "/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[3]/textarray/text"_ostr, + "hello"); + // This failed, text color was #000000. + assertXPath( + pXmlDoc, + "/metafile/push[1]/push[1]/push[1]/push[4]/push[1]/push[3]/textcolor[@color='#ffffff']"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf117028) +{ + createSwDoc("tdf117028.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // The only polypolygon in the rendering result was the white background we + // want to avoid. + assertXPath(pXmlDoc, "//polypolygon"_ostr, 0); + + // Make sure the text is still rendered. + assertXPathContent(pXmlDoc, "//textarray/text"_ostr, "Hello"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf106390) +{ + createSwDoc("tdf106390.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nBottom = getXPath(pXmlDoc, "//sectrectclipregion"_ostr, "bottom"_ostr).toInt32(); + + // No end point of line segments shall go below the bottom of the clipping area. + const OString sXPath = "//polyline/point[@y>" + OString::number(nBottom) + "]"; + + assertXPath(pXmlDoc, sXPath, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTableExtrusion1) +{ + createSwDoc("table-extrusion1.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nRight = getXPath(pXmlDoc, "//sectrectclipregion"_ostr, "right"_ostr).toInt32(); + sal_Int32 nLeft = static_cast(nRight * 0.95); + + // Expect table borders in right page margin. + const OString sXPath = "//polyline/point[@x>" + OString::number(nLeft) + " and @x<" + + OString::number(nRight) + "]"; + + assertXPath(pXmlDoc, sXPath, 4); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTableExtrusion2) +{ + createSwDoc("table-extrusion2.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + // End point position of the outer table. + sal_Int32 nX = getXPath(pXmlDoc, "(//polyline[1]/point)[2]"_ostr, "x"_ostr).toInt32(); + + // Do not allow inner table extrude outer table. + const OString sXPath = "//polyline/point[@x>" + OString::number(nX) + "]"; + + assertXPath(pXmlDoc, sXPath, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf116848) +{ + createSwDoc("tdf116848.odt"); + SwDoc* pDoc = getSwDoc(); + // This resulted in a layout loop. + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf117245) +{ + createSwDoc("tdf117245.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 2, TabOverMargin did not use a single line when there was + // enough space for the text. + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 1); + + // This was 2, same problem elsewhere due to code duplication. + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf118672) +{ + createSwDoc("tdf118672.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Check if we have hyphenation support, otherwise can't test SwHyphPortion. + uno::Reference xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString()))) + return; + + // This ended as "fol*1 2 3 4 5 6 7 8 9", i.e. "10con-" was moved to the next line. + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, + "He heard quiet steps behind him. That didn't bode well. Who could be fol*1 2 " + "3 4 5 6 7 8 9 10con"); + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, "setetur"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150200) +{ + createSwDoc("tdf150200.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // dash + OUString sFirstLine + = parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"-(dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(93), sFirstLine.getLength()); + // en-dash + sFirstLine = parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"–(en-dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(88), sFirstLine.getLength()); + // em-dash + sFirstLine = parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"—(em-dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(77), sFirstLine.getLength()); + // figure dash + sFirstLine = parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‒(figure dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(87), sFirstLine.getLength()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150200_DOCX) +{ + createSwDoc("tdf150200.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // dash + OUString sFirstLine + = parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"-(dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(93), sFirstLine.getLength()); + // en-dash + sFirstLine = parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"–(en-dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(88), sFirstLine.getLength()); + // em-dash + sFirstLine = parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"—(em-dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(77), sFirstLine.getLength()); + // figure dash + sFirstLine = parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‒(figure dash)")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(87), sFirstLine.getLength()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150438) +{ + createSwDoc("tdf150438.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // left double quotation mark + OUString sFirstLine + = parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"“Lorem ipsum")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(92), sFirstLine.getLength()); + // right double quotation mark + sFirstLine = parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"”Nunc viverra imperdiet enim.")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), sFirstLine.getLength()); + // left single quotation mark + sFirstLine = parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‘Aenean nec lorem.")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength()); + // right single quotation mark or apostrophe + sFirstLine = parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"’Aenean nec lorem.")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150438_DOCX) +{ + createSwDoc("tdf150438.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // left double quotation mark + OUString sFirstLine + = parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"“Lorem ipsum")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(92), sFirstLine.getLength()); + // right double quotation mark + sFirstLine = parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"”Nunc viverra imperdiet enim.")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), sFirstLine.getLength()); + // left single quotation mark + sFirstLine = parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"‘Aenean nec lorem.")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength()); + // right single quotation mark or apostrophe + sFirstLine = parseDump("/root/page/body/txt[4]/SwParaPortion/SwLineLayout[1]/@portion"_ostr); + CPPUNIT_ASSERT_EQUAL(true, sFirstLine.startsWith(u"’Aenean nec lorem.")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(85), sFirstLine.getLength()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf117923) +{ + createSwDoc("tdf117923.doc"); + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Check that we actually test the line we need + assertXPathContent(pXmlDoc, "/root/page/body/tab/row/cell/txt[3]"_ostr, "GHI GHI GHI GHI"); + assertXPath( + pXmlDoc, + "/root/page/body/tab/row/cell/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, + "type"_ostr, "PortionType::Number"); + assertXPath( + pXmlDoc, + "/root/page/body/tab/row/cell/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, + "expand"_ostr, "2."); + // The numbering height was 960. + assertXPath( + pXmlDoc, + "/root/page/body/tab/row/cell/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, + "height"_ostr, "220"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf127606) +{ + createSwDoc("tdf117923.docx"); + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Check that we actually test the line we need + assertXPathContent(pXmlDoc, "/root/page/body/tab/row/cell/txt[3]"_ostr, "GHI GHI GHI GHI"); + assertXPath( + pXmlDoc, + "/root/page/body/tab/row/cell/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, + "type"_ostr, "PortionType::Number"); + assertXPath( + pXmlDoc, + "/root/page/body/tab/row/cell/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, + "expand"_ostr, "2."); + // The numbering height was 960 in DOC format. + assertXPath( + pXmlDoc, + "/root/page/body/tab/row/cell/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, + "height"_ostr, "220"); + + // tdf#127606: now it's possible to change formatting of numbering + // increase font size (220 -> 260) + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Grow", {}); + pViewShell->Reformat(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath( + pXmlDoc, + "/root/page/body/tab/row/cell/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, + "height"_ostr, "260"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf127118) +{ + createSwDoc("tdf127118.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was Horizontal: merged cell split between pages didn't keep vertical writing direction + assertXPath(pXmlDoc, "/root/page[2]/body/tab/row[1]/cell[1]/txt[1]"_ostr, "WritingMode"_ostr, + "VertBTLR"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf141220) +{ + createSwDoc("tdf141220.docx"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nShapeTop + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 nTextBoxTop + = getXPath(pXmlDoc, "//anchored/fly/infos/bounds"_ostr, "top"_ostr).toInt32(); + // Make sure the textbox stays inside the shape. + CPPUNIT_ASSERT_LESS(static_cast(15), nTextBoxTop - nShapeTop); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, TestTextBoxChangeViaUNO) +{ + createSwDoc("TextBoxFrame.odt"); + // this file has a shape and a frame inside. Try to set up + // the frame for the shape as textbox. Before this was not + // implemented. This will be necessary for proper WPG import. + + CPPUNIT_ASSERT_EQUAL_MESSAGE("There must be a shape and a frame!", 2, getShapes()); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("This must be a custom shape!", + OUString("com.sun.star.drawing.CustomShape"), + getShape(1)->getShapeType()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("This must be a frame shape!", OUString("FrameShape"), + getShape(2)->getShapeType()); + + CPPUNIT_ASSERT_MESSAGE("This is not supposed to be a textbox!", + !uno::Reference(getShape(1), uno::UNO_QUERY_THROW) + ->getPropertyValue("TextBox") + .get()); + // Without the fix it will crash at this line: + CPPUNIT_ASSERT_MESSAGE("This is not supposed to be a textbox!", + !uno::Reference(getShape(1), uno::UNO_QUERY_THROW) + ->getPropertyValue("TextBoxContent") + .hasValue()); + + // So now set the frame as textbox for the shape! + uno::Reference(getShape(1), uno::UNO_QUERY_THROW) + ->setPropertyValue("TextBoxContent", uno::Any(uno::Reference( + getShape(2), uno::UNO_QUERY_THROW))); + + CPPUNIT_ASSERT_MESSAGE("This is supposed to be a textbox!", + uno::Reference(getShape(1), uno::UNO_QUERY_THROW) + ->getPropertyValue("TextBox") + .get()); + + CPPUNIT_ASSERT_MESSAGE("This is supposed to be a textbox!", + uno::Reference(getShape(1), uno::UNO_QUERY_THROW) + ->getPropertyValue("TextBoxContent") + .hasValue()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf121509) +{ + createSwDoc("Tdf121509.odt"); + auto pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + + // Get all shape/frame formats + auto vFrameFormats = pDoc->GetSpzFrameFormats(); + // Get the textbox + auto xTextFrame = SwTextBoxHelper::getUnoTextFrame(getShape(1)); + // Get The triangle + auto pTriangleShapeFormat = vFrameFormats->GetFormat(2); + CPPUNIT_ASSERT(xTextFrame); + CPPUNIT_ASSERT(pTriangleShapeFormat); + + // Get the position inside the textbox + auto xTextContentStart = xTextFrame->getText()->getStart(); + SwUnoInternalPaM aCursor(*pDoc); + CPPUNIT_ASSERT(sw::XTextRangeToSwPaM(aCursor, xTextContentStart)); + + // Put the triangle into the textbox + SwFormatAnchor aNewAnch(pTriangleShapeFormat->GetAnchor()); + aNewAnch.SetAnchor(aCursor.Start()); + CPPUNIT_ASSERT(pTriangleShapeFormat->SetFormatAttr(aNewAnch)); + + // Reload (docx) + // FIXME: if we use 'reload' here, it fails with + // Assertion `!m_pFirst && !m_pLast && "There are still indices registered"' failed. + save("Office Open XML Text"); + + // The second part: check if the reloaded doc has flys inside a fly + uno::Reference xComponent + = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument"); + uno::Reference xTextDoc(xComponent, uno::UNO_QUERY); + auto pTextDoc = dynamic_cast(xTextDoc.get()); + CPPUNIT_ASSERT(pTextDoc); + auto pSecondDoc = pTextDoc->GetDocShell()->GetDoc(); + auto pSecondFormats = pSecondDoc->GetSpzFrameFormats(); + + bool bFlyInFlyFound = false; + for (auto secondformat : *pSecondFormats) + { + const SwNode* pNd = secondformat->GetAnchor().GetAnchorNode(); + if (pNd->FindFlyStartNode()) + { + // So there is a fly inside another -> problem. + bFlyInFlyFound = true; + break; + } + } + // Drop the tempfile + maTempFile.CloseStream(); + + // With the fix this cannot be true, if it is, that means Word unable to read the file.. + CPPUNIT_ASSERT_MESSAGE("Corrupt exported docx file!", !bFlyInFlyFound); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf134685) +{ + createSwDoc("tdf134685.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nWidth + = getXPath(pXmlDoc, "/root/page/body/tab/row[6]/cell[1]/infos/bounds"_ostr, "width"_ostr) + .toInt32(); + // This was 2223: the content was only partially visible according to the lost cell width + CPPUNIT_ASSERT_GREATER(static_cast(14000), nWidth); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf109077) +{ + createSwDoc("tdf109077.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nShapeTop + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 nTextBoxTop + = getXPath(pXmlDoc, "//anchored/fly/infos/bounds"_ostr, "top"_ostr).toInt32(); + // This was 281: the top of the shape and its textbox should match, though + // tolerate differences <= 1px (about 15 twips). + CPPUNIT_ASSERT_LESS(static_cast(15), nTextBoxTop - nShapeTop); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testUserFieldTypeLanguage) +{ + // Set the system locale to German, the document will be English. + SvtSysLocaleOptions aOptions; + OUString sLocaleConfigString = aOptions.GetLanguageTag().getBcp47(); + aOptions.SetLocaleConfigString("de-DE"); + aOptions.Commit(); + comphelper::ScopeGuard g1([&aOptions, &sLocaleConfigString] { + aOptions.SetLocaleConfigString(sLocaleConfigString); + aOptions.Commit(); + }); + + createSwDoc("user-field-type-language.fodt"); + SwDoc* pDoc = getSwDoc(); + SwViewShell* pViewShell = pDoc->getIDocumentLayoutAccess().GetCurrentViewShell(); + pViewShell->UpdateFields(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was "123,456.00", via a buggy 1234.56 -> 1234,56 -> 123456 -> + // 123,456.00 transform chain. + assertXPath( + pXmlDoc, + "/root/page/body/txt/SwParaPortion/SwLineLayout/SwFieldPortion[@type='PortionType::Field']"_ostr, + "expand"_ostr, "1,234.56"); + + discardDumpedLayout(); + // Now change the system locale to English (before this was failing, 1234,56 -> 0.00) + aOptions.SetLocaleConfigString("en-GB"); + aOptions.Commit(); + comphelper::ScopeGuard g2([&aOptions, &sLocaleConfigString] { + aOptions.SetLocaleConfigString(sLocaleConfigString); + aOptions.Commit(); + }); + pViewShell->UpdateFields(); + pXmlDoc = parseLayoutDump(); + // We expect, that the field value is not changed. Otherwise there is a problem: + assertXPath( + pXmlDoc, + "/root/page/body/txt/SwParaPortion/SwLineLayout/SwFieldPortion[@type='PortionType::Field']"_ostr, + "expand"_ostr, "1,234.56"); + discardDumpedLayout(); + // Now change the system locale to German + aOptions.SetLocaleConfigString("de-DE"); + aOptions.Commit(); + comphelper::ScopeGuard g3([&aOptions, &sLocaleConfigString] { + aOptions.SetLocaleConfigString(sLocaleConfigString); + aOptions.Commit(); + }); + pViewShell->UpdateFields(); + pXmlDoc = parseLayoutDump(); + // We expect, that the field value is not changed. Otherwise there is a problem: + assertXPath( + pXmlDoc, + "/root/page/body/txt/SwParaPortion/SwLineLayout/SwFieldPortion[@type='PortionType::Field']"_ostr, + "expand"_ostr, "1,234.56"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf124261) +{ +#if !defined(_WIN32) && !defined(MACOSX) + // Make sure that pressing a key in a btlr cell frame causes an immediate, correct repaint. + createSwDoc("tdf124261.docx"); + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwFrame* pPageFrame = pLayout->GetLower(); + CPPUNIT_ASSERT(pPageFrame->IsPageFrame()); + + SwFrame* pBodyFrame = pPageFrame->GetLower(); + CPPUNIT_ASSERT(pBodyFrame->IsBodyFrame()); + + SwFrame* pTabFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pTabFrame->IsTabFrame()); + + SwFrame* pRowFrame = pTabFrame->GetLower(); + CPPUNIT_ASSERT(pRowFrame->IsRowFrame()); + + SwFrame* pCellFrame = pRowFrame->GetLower(); + CPPUNIT_ASSERT(pCellFrame->IsCellFrame()); + + SwFrame* pFrame = pCellFrame->GetLower(); + CPPUNIT_ASSERT(pFrame->IsTextFrame()); + + // Make sure that the text frame's area and the paint rectangle match. + // Without the accompanying fix in place, this test would have failed with 'Expected: 1721; + // Actual: 1547', i.e. an area other than the text frame was invalidated for a single-line + // paragraph. + SwTextFrame* pTextFrame = static_cast(pFrame); + SwRect aRect = pTextFrame->GetPaintSwRect(); + CPPUNIT_ASSERT_EQUAL(pTextFrame->getFrameArea().Top(), aRect.Top()); +#endif +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf135991) +{ + createSwDoc("tdf135991.odt"); + auto pDump = parseLayoutDump(); + // There used to be negative values that made the column frames invisible. + assertXPath(pDump, "//bounds[@top<0]"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150642) +{ + createSwDoc("tdf150642.odt"); + auto pDump = parseLayoutDump(); + // There used to be negative values that made the cell frame invisible. + assertXPath(pDump, "//bounds[@left<0]"_ostr, 0); + assertXPath(pDump, "//bounds[@right<0]"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152085) +{ + createSwDoc("tdf152085-section-tblr.odt"); + auto pDump = parseLayoutDump(); + sal_Int32 nSectionHeight + = getXPath(pDump, "//section/infos/bounds"_ostr, "bottom"_ostr).toInt32(); // was 8391 + sal_Int32 nColumnHeight + = getXPath(pDump, "(//column/infos/bounds)[2]"_ostr, "bottom"_ostr).toInt32(); // was 16216 + CPPUNIT_ASSERT_MESSAGE("The column in a TBRL page should be shorter than the section.", + nColumnHeight <= nSectionHeight); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152031) +{ + createSwDoc("tdf152031-stair.odt"); + + // reproduce the bug by shrinking the table width. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + // Shrink table width from 5" to 4" + sal_Int32 nWidth = getProperty(xTable, "Width") * 4 / 5; + + uno::Reference xSet(xTable, uno::UNO_QUERY); + xSet->setPropertyValue("Width", uno::Any(nWidth)); + + auto pDump = parseLayoutDump(); + // There was a stair effect after change the table size. + sal_Int32 nLeft_Row1 = getXPath(pDump, "(//row/infos/bounds)[1]"_ostr, "left"_ostr).toInt32(); + sal_Int32 nLeft_Row2 = getXPath(pDump, "(//row/infos/bounds)[2]"_ostr, "left"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("left values of SwRowFrames should be consistent.", nLeft_Row1, + nLeft_Row2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf153136) +{ + createSwDoc("tdf153136.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + const sal_Int32 small = 300; // Small-height lines are around 276 twip + const sal_Int32 large = 1000; // Large-height lines are 1104 twip or more + + // Page 1: standalone paragraphs + + // U+0009 CHARACTER TABULATION: height is ignored + sal_Int32 height + = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[1]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+0020 SPACE: height is ignored + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[2]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+00A0 NO-BREAK SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[3]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+1680 OGHAM SPACE MARK: height is considered; not tested, because Liberation Serif lacks it + + // U+2000 EN QUAD: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[4]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2001 EM QUAD: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[5]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2002 EN SPACE: height is ignored + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[6]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+2003 EM SPACE: height is ignored + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[7]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+2004 THREE-PER-EM SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[8]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2005 FOUR-PER-EM SPACE: height is ignored + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[9]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+2006 SIX-PER-EM SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[10]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2007 FIGURE SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[11]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2008 PUNCTUATION SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[12]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2009 THIN SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[13]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+200A HAIR SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[14]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+202F NARROW NO-BREAK SPACE: height is considered + height = getXPath(pXmlDoc, "(/root/page[1]//SwLineLayout)[15]"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+205F MEDIUM MATHEMATICAL SPACE: height is considered; not tested, because Liberation Serif lacks it + // U+3000 IDEOGRAPHIC SPACE: height is ignored; not tested, because Liberation Serif lacks it + + // Page 2: table rows (no paragraph-level size DF) + + // U+0020 SPACE: height is ignored + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+00A0 NO-BREAK SPACE: height is considered (1104 or so) + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[2]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+1680 OGHAM SPACE MARK: height is considered; not tested, because Liberation Serif lacks it + + // U+2000 EN QUAD: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[3]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2001 EM QUAD: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[4]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2002 EN SPACE: height is ignored + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[5]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+2003 EM SPACE: height is ignored + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[6]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+2004 THREE-PER-EM SPACE: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[7]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2005 FOUR-PER-EM SPACE: height is ignored + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[8]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(small, height); + + // U+2006 SIX-PER-EM SPACE: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[9]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2007 FIGURE SPACE: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[10]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2008 PUNCTUATION SPACE: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[11]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+2009 THIN SPACE: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[12]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+200A HAIR SPACE: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[13]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+202F NARROW NO-BREAK SPACE: height is considered + height + = getXPath(pXmlDoc, "(/root/page[2]//row)[14]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(large, height); + + // U+205F MEDIUM MATHEMATICAL SPACE: height is considered; not tested, because Liberation Serif lacks it + // U+3000 IDEOGRAPHIC SPACE: height is ignored; not tested, because Liberation Serif lacks it + + // TODO: page 3, with table having paragraphs with paragraph-level size DF; + // all rows should have large height + + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[1]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[2]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[3]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[4]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[5]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[6]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[7]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[8]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[9]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[10]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[11]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[12]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[13]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); + // height = getXPath(pXmlDoc, "(/root/page[3]//row)[14]/infos/bounds", "height").toInt32(); + // CPPUNIT_ASSERT_GREATER(large, height); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx new file mode 100644 index 0000000000..aecea0148d --- /dev/null +++ b/sw/qa/extras/layout/layout3.cxx @@ -0,0 +1,2258 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// Test to assert layout / rendering result of Writer. +class SwLayoutWriter3 : public SwModelTestBase +{ +public: + SwLayoutWriter3() + : SwModelTestBase("/sw/qa/extras/layout/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf134463) +{ + createSwDoc("tdf134463.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 621. The previous paragraph must have zero bottom border. + assertXPath(pXmlDoc, "/root/page/body/txt[3]/infos/prtBounds"_ostr, "top"_ostr, "21"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf117188) +{ + createSwDoc("tdf117188.docx"); + saveAndReload("writer8"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + OUString sWidth + = getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "width"_ostr); + OUString sHeight + = getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "height"_ostr); + // The text box must have zero border distances + assertXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/prtBounds"_ostr, "left"_ostr, "0"); + assertXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/prtBounds"_ostr, "top"_ostr, "0"); + assertXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/prtBounds"_ostr, "width"_ostr, + sWidth); + assertXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/infos/prtBounds"_ostr, "height"_ostr, + sHeight); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf117187) +{ + createSwDoc("tdf117187.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // there should be no fly portions + assertXPath( + pXmlDoc, + "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[@nType='PortionType::Fly']"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf119875) +{ + createSwDoc("tdf119875.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nFirstTop + = getXPath(pXmlDoc, "/root/page[2]/body/section[1]/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + sal_Int32 nSecondTop + = getXPath(pXmlDoc, "/root/page[2]/body/section[2]/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + // The first section had the same top value as the second one, so they + // overlapped. + CPPUNIT_ASSERT_LESS(nSecondTop, nFirstTop); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf137523) +{ + createSwDoc("tdf137523-1-min.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // the problem was that in the footer, the text frames below the table + // had wrong height and were not visible + assertXPath(pXmlDoc, "/root/page/footer/txt[1]/infos/bounds"_ostr, "height"_ostr, "304"); + assertXPath(pXmlDoc, "/root/page/footer/txt[2]/infos/bounds"_ostr, "height"_ostr, "191"); + assertXPath(pXmlDoc, "/root/page/footer/txt[3]/infos/bounds"_ostr, "height"_ostr, "219"); + assertXPath(pXmlDoc, "/root/page/footer/tab/infos/bounds"_ostr, "height"_ostr, "1378"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf120287) +{ + createSwDoc("tdf120287.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 2, TabOverMargin Word-specific compat flag did not imply + // default-in-Word printer-independent layout, resulting in an additional + // line break. + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 1); +} + +static auto getXPathIntAttributeValue(xmlXPathContextPtr pXmlXpathCtx, char const* const pXPath) + -> sal_Int32 +{ + xmlXPathObjectPtr pXmlXpathObj = xmlXPathEvalExpression(BAD_CAST(pXPath), pXmlXpathCtx); + CPPUNIT_ASSERT(pXmlXpathObj->nodesetval); + CPPUNIT_ASSERT_EQUAL(1, xmlXPathNodeSetGetLength(pXmlXpathObj->nodesetval)); + auto ret + = sal_Int32(xmlXPathCastNodeToNumber(xmlXPathNodeSetItem(pXmlXpathObj->nodesetval, 0))); + xmlXPathFreeObject(pXmlXpathObj); + return ret; +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf128966) +{ + createSwDoc("tdf128966-2-min.odt"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + xmlXPathObjectPtr pXmlObj + = getXPathNode(pXmlDoc, "/root/page/body/tab/row/cell[@rowspan > 0][child::txt]"_ostr); + xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval; + CPPUNIT_ASSERT(pXmlNodes); + CPPUNIT_ASSERT_GREATER(300, xmlXPathNodeSetGetLength(pXmlNodes)); // many... + + xmlXPathContextPtr pXmlXpathCtx = xmlXPathNewContext(pXmlDoc.get()); + registerNamespaces(pXmlXpathCtx); + + for (int i = 0; i < xmlXPathNodeSetGetLength(pXmlNodes); ++i) + { + xmlNodePtr pNode = xmlXPathNodeSetItem(pXmlNodes, i); + xmlXPathSetContextNode(pNode, pXmlXpathCtx); + + OString msg("Cell nr.: " + OString::number(i) + + " id=" + OString::number(getXPathIntAttributeValue(pXmlXpathCtx, "@id"))); + + auto nCellTop = getXPathIntAttributeValue(pXmlXpathCtx, "infos/bounds/@top"); + auto nCellHeight = getXPathIntAttributeValue(pXmlXpathCtx, "infos/bounds/@height"); + auto nCellCenter = nCellTop + (nCellHeight / 2); + + auto nContentTop + = getXPathIntAttributeValue(pXmlXpathCtx, "txt[position()=1]/infos/bounds/@top"); + auto nContentBottom = getXPathIntAttributeValue( + pXmlXpathCtx, "txt[position()=last()]/infos/bounds/@bottom"); + + CPPUNIT_ASSERT_MESSAGE(msg.getStr(), nContentTop < nCellCenter); + CPPUNIT_ASSERT_MESSAGE(msg.getStr(), nContentBottom > nCellCenter); + } + + xmlXPathFreeContext(pXmlXpathCtx); + xmlXPathFreeObject(pXmlObj); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf119908) +{ + createSwDoc("tdf130088.docx"); + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Keep real width of the exceeding line portions to calculate shrinking + sal_Int32 nPortionWidth + = getXPath(pXmlDoc, + "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[2]/SwLinePortion[2]"_ostr, + "width"_ostr) + .toInt32(); + // This was 5806 (not real portion width, but stripped to the line width) + CPPUNIT_ASSERT_GREATER(sal_Int32(5840), nPortionWidth); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf158333) +{ + createSwDoc("tdf130088.docx"); + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // shrink line 2 + assertXPath( + pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[2]"_ostr, "portion"_ostr, + "viverra odio. Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. "); + + // shrink line 7 + assertXPath( + pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[7]"_ostr, "portion"_ostr, + // This was "...diam ", not "...diam tempor " + "laoreet vel leo nec, volutpat facilisis eros. Donec consequat arcu ut diam tempor "); + + // shrink line 2 of paragraph 2 + assertXPath( + pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[2]"_ostr, "portion"_ostr, + // This was "...Cras ", not "...Cras sodales " + "Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. Cras sodales "); + + // shrink line 2 of paragraph 4 + assertXPath(pXmlDoc, "/root/page/body/txt[4]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, + // This was "...et ", not "...et magnis " + "consequat arcu ut diam tempor luctus. Cum sociis natoque penatibus et magnis "); + + // tdf#158776 don't shrink line 11 of paragraph 4 + assertXPath(pXmlDoc, "/root/page/body/txt[4]/SwParaPortion/SwLineLayout[11]"_ostr, + "portion"_ostr, + // This was "...quis curcus ", not "...quis " + "venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis "); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf159085) +{ + createSwDoc("tdf159085.fodt"); + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // This was "... cursus" instead of breaking the word at soft hyphen + assertXPath( + pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, "portion"_ostr, + u"venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cur­"_ustr); + + // This was "... cursus" instead of breaking the word at soft hyphen + assertXPath( + pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]"_ostr, "portion"_ostr, + u"venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cur­"_ustr); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf158419) +{ + createSwDoc("tdf130088.docx"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // second paragraph. + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwWrtShell* pWrtShell = pShell->GetWrtShell(); + SwPosition aPosition(*pWrtShell->GetCursor()->Start()); + SwTwips nSecondParaLeft + = getXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds"_ostr, "left"_ostr).toInt32(); + SwTwips nSecondParaWidth + = getXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds"_ostr, "width"_ostr).toInt32(); + SwTwips nSecondParaTop + = getXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds"_ostr, "top"_ostr).toInt32(); + SwTwips nSecondParaHeight + = getXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds"_ostr, "height"_ostr).toInt32(); + Point aPoint; + + // click at the end of the second line of the second paragraph + // (a line shrunk by the new justification) + + aPoint.setX(nSecondParaLeft + nSecondParaWidth); + aPoint.setY(nSecondParaTop + (nSecondParaHeight / 6) * 1.5); + SwCursorMoveState aState(CursorMoveState::NONE); + pLayout->GetModelPositionForViewPoint(&aPosition, aPoint, &aState); + // Without the accompanying fix in place, this test would have failed: character position was 155, + // i.e. cursor was before the end of the paragraph. + CPPUNIT_ASSERT_EQUAL(static_cast(156), aPosition.GetContentIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf106234) +{ + createSwDoc("tdf106234.fodt"); + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // In justified paragraphs, there is justification between left tabulators and manual line breaks + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwGluePortion"_ostr, + "type"_ostr, "PortionType::Margin"); + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwGluePortion"_ostr, + "width"_ostr, "0"); + // but not after centered, right and decimal tabulators + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwGluePortion"_ostr, + "type"_ostr, "PortionType::Margin"); + // This was a justified line, without width + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwGluePortion"_ostr, + "width"_ostr, "7882"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf155324) +{ + createSwDoc("tox-update-wrong-pages.odt"); + + dispatchCommand(mxComponent, ".uno:UpdateAllIndexes", {}); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // the problem was that the first entry was on page 7, 2nd on page 9 etc. + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "Foo"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "5"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[2]/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "bar"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[2]/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "7"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]"_ostr, + "portion"_ostr, "Three"); + assertXPath( + pXmlDoc, + "/root/page[1]/body/section[2]/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]"_ostr, + "portion"_ostr, "7"); + + // check first content page has the footnotes + assertXPath(pXmlDoc, "/root/page[5]/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "Foo"); + assertXPath(pXmlDoc, "/root/page[4]/ftncont"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[5]/ftncont/ftn"_ostr, 5); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf120287b) +{ + createSwDoc("tdf120287b.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 1418, TabOverMargin did the right split of the paragraph to two + // lines, but then calculated a too large tab portion size on the first + // line. + assertXPath( + pXmlDoc, + "/root/page/body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::TabRight']"_ostr, + "width"_ostr, "18"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf120287c) +{ + createSwDoc("tdf120287c.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 2, the second line was not broken into a 2nd and a 3rd one, + // rendering text outside the paragraph frame. + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf155177) +{ + createSwDoc("tdf155177-1-min.odt"); + + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Body Text"), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(210), getProperty(xStyle, "ParaTopMargin")); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[2]/body/txt"_ostr, 6); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[6]/SwParaPortion/SwLineLayout"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[6]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, "long as two lines."); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 3); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "This paragraph is even longer so that "); + discardDumpedLayout(); + } + + // this should bring one line back + xStyle->setPropertyValue("ParaTopMargin", uno::Any(sal_Int32(200))); + + Scheduler::ProcessEventsToIdle(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[2]/body/txt"_ostr, 7); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[7]/SwParaPortion/SwLineLayout"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[7]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "This paragraph is even longer so that "); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "it is now three lines long though "); + discardDumpedLayout(); + } + + // this should bring second line back + xStyle->setPropertyValue("ParaTopMargin", uno::Any(sal_Int32(120))); + + Scheduler::ProcessEventsToIdle(); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[2]/body/txt"_ostr, 7); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[7]/SwParaPortion/SwLineLayout"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[7]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "This paragraph is even longer so that "); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[7]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, "it is now three lines long though "); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "containing a single sentence."); + discardDumpedLayout(); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf122878) +{ + createSwDoc("tdf122878.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + const sal_Int32 nTblTop + = getXPath(pXmlDoc, "/root/page[1]/footer/txt/anchored/fly/tab/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = dynamic_cast(pLayout->Lower()); + CPPUNIT_ASSERT(pPage1); + SwFrame* pBody = pPage1->FindBodyCont(); + for (SwFrame* pFrame = pBody->GetLower(); pFrame; pFrame = pFrame->GetNext()) + { + const sal_Int32 nTxtBottom = pFrame->getFrameArea().Bottom(); + // No body paragraphs should overlap the table in the footer + CPPUNIT_ASSERT_MESSAGE( + OString("testing paragraph #" + OString::number(pFrame->GetFrameId())).getStr(), + nTxtBottom <= nTblTop); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf115094) +{ + createSwDoc("tdf115094.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nTopOfD1 + = getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/tab/row[1]/cell[4]/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + sal_Int32 nTopOfD1Anchored = getXPath(pXmlDoc, + "/root/page/body/txt/anchored/fly/tab/row[1]/cell[4]/" + "txt[2]/anchored/fly/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + CPPUNIT_ASSERT_LESS(nTopOfD1Anchored, nTopOfD1); + sal_Int32 nTopOfB2 + = getXPath(pXmlDoc, "/root/page/body/txt/anchored/fly/tab/row[2]/cell[2]/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + sal_Int32 nTopOfB2Anchored = getXPath(pXmlDoc, + "/root/page/body/txt/anchored/fly/tab/row[2]/cell[2]/" + "txt[1]/anchored/fly/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + CPPUNIT_ASSERT_LESS(nTopOfB2Anchored, nTopOfB2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf112290) +{ + createSwDoc("tdf112290.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + auto pXml = parseLayoutDump(); + assertXPath(pXml, "/root/page/body/txt/SwParaPortion/SwLineLayout[2]"_ostr, "portion"_ostr, + "Xxxx Xxxx"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testKeepWithNextPlusFlyFollowTextFlow) +{ + createSwDoc("keep-with-next-fly.fodt"); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // 3 text frames on page 1 + assertXPath(pXmlDoc, "/root/page[1]/body/infos/bounds"_ostr, "bottom"_ostr, "7540"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly/infos/bounds"_ostr, "top"_ostr, + "1694"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + discardDumpedLayout(); + } + + dispatchCommand(mxComponent, ".uno:Fieldnames", {}); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // 1 text frame on page 1, and some empty space + assertXPath(pXmlDoc, "/root/page[1]/body/infos/bounds"_ostr, "bottom"_ostr, "7540"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/bounds"_ostr, "height"_ostr, "5796"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/bounds"_ostr, "bottom"_ostr, "7213"); + // 2 text frames on page 2 + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly/infos/bounds"_ostr, "top"_ostr, + "10093"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + discardDumpedLayout(); + } + + dispatchCommand(mxComponent, ".uno:Fieldnames", {}); + + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // 3 text frames on page 1 + assertXPath(pXmlDoc, "/root/page[1]/body/infos/bounds"_ostr, "bottom"_ostr, "7540"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly/infos/bounds"_ostr, "top"_ostr, + "1694"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/bounds"_ostr, "height"_ostr, "276"); + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + discardDumpedLayout(); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf122607) +{ + createSwDoc("tdf122607.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, + "/root/page[1]/anchored/fly/txt[1]/anchored/fly/tab/row[2]/cell/txt[7]/anchored/" + "fly/txt/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "height"_ostr, "253"); + assertXPath(pXmlDoc, + "/root/page[1]/anchored/fly/txt[1]/anchored/fly/tab/row[2]/cell/txt[7]/anchored/" + "fly/txt/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "width"_ostr, "428"); + assertXPath(pXmlDoc, + "/root/page[1]/anchored/fly/txt[1]/anchored/fly/tab/row[2]/cell/txt[7]/anchored/" + "fly/txt/SwParaPortion/SwLineLayout/child::*[1]"_ostr, + "portion"_ostr, "Fax:"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf122607_regression) +{ + discardDumpedLayout(); + if (mxComponent.is()) + mxComponent->dispose(); + + OUString const url(createFileURL(u"tdf122607_leerzeile.odt")); + + // note: must set Hidden property, so that SfxFrameViewWindow_Impl::Resize() + // does *not* forward initial VCL Window Resize and thereby triggers a + // layout which does not happen on soffice --convert-to pdf. + std::vector aFilterOptions = { + { beans::PropertyValue("Hidden", -1, uno::Any(true), beans::PropertyState_DIRECT_VALUE) }, + }; + + // inline the loading because currently properties can't be passed... + mxComponent = loadFromDesktop(url, "com.sun.star.text.TextDocument", + comphelper::containerToSequence(aFilterOptions)); + uno::Sequence props(comphelper::InitPropertySequence({ + { "FilterName", uno::Any(OUString("writer_pdf_Export")) }, + })); + utl::TempFileNamed aTempFile; + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->storeToURL(aTempFile.GetURL(), props); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // somehow these 2 rows overlapped in the PDF unless CalcLayout() runs + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[1]/infos/bounds"_ostr, + "mbFixSize"_ostr, "false"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[1]/infos/bounds"_ostr, "top"_ostr, + "2977"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[1]/infos/bounds"_ostr, + "height"_ostr, "241"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[2]/infos/bounds"_ostr, + "mbFixSize"_ostr, "true"); + // this was 3034, causing the overlap + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[2]/infos/bounds"_ostr, "top"_ostr, + "3218"); + assertXPath(pXmlDoc, "/root/page[1]/anchored/fly/tab[1]/row[2]/infos/bounds"_ostr, + "height"_ostr, "164"); + + aTempFile.EnableKillingFile(); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, TestTdf150616) +{ + discardDumpedLayout(); + if (mxComponent.is()) + mxComponent->dispose(); + + OUString const url(createFileURL(u"in_056132_mod.odt")); + + // note: must set Hidden property, so that SfxFrameViewWindow_Impl::Resize() + // does *not* forward initial VCL Window Resize and thereby triggers a + // layout which does not happen on soffice --convert-to pdf. + std::vector aFilterOptions = { + { beans::PropertyValue("Hidden", -1, uno::Any(true), beans::PropertyState_DIRECT_VALUE) }, + }; + + // inline the loading because currently properties can't be passed... + mxComponent = loadFromDesktop(url, "com.sun.star.text.TextDocument", + comphelper::containerToSequence(aFilterOptions)); + uno::Sequence props(comphelper::InitPropertySequence({ + { "FilterName", uno::Any(OUString("writer_pdf_Export")) }, + })); + utl::TempFileNamed aTempFile; + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->storeToURL(aTempFile.GetURL(), props); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + + // this one was 0 height + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[3]/row[2]/cell[2]/txt[2]/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "Important information here!"); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[3]/row[2]/cell[2]/txt[2]/infos/bounds"_ostr, + "height"_ostr, "253"); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[3]/row[2]/cell[2]/txt[2]/infos/bounds"_ostr, + "top"_ostr, "7925"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab[3]/row[2]/cell[2]/txt[3]/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "xxx 111 "); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[3]/row[2]/cell[2]/txt[3]/infos/bounds"_ostr, + "height"_ostr, "697"); + assertXPath(pXmlDoc, "/root/page[1]/body/tab[3]/row[2]/cell[2]/txt[3]/infos/bounds"_ostr, + "top"_ostr, "8178"); + + aTempFile.EnableKillingFile(); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testBtlrCell) +{ + createSwDoc("btlr-cell.odt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // Without the accompanying fix in place, this test would have failed, as + // the orientation was 0 (layout did not take btlr direction request from + // doc model). + assertXPath(pXmlDoc, "//font[1]"_ostr, "orientation"_ostr, "900"); + +#if !defined(MACOSX) && !defined(_WIN32) // macOS fails with x == 2662 for some reason. + // Without the accompanying fix in place, this test would have failed with 'Expected: 1915; + // Actual : 1756', i.e. the AAA1 text was too close to the left cell border due to an ascent vs + // descent mismatch when calculating the baseline offset of the text portion. + assertXPath(pXmlDoc, "//textarray[1]"_ostr, "x"_ostr, "1915"); + assertXPath(pXmlDoc, "//textarray[1]"_ostr, "y"_ostr, "2707"); + + // Without the accompanying fix in place, this test would have failed with 'Expected: 1979; + // Actual : 2129', i.e. the gray background of the "AAA2." text was too close to the right edge + // of the text portion. Now it's exactly behind the text portion. + assertXPath(pXmlDoc, "(//rect)[2]"_ostr, "left"_ostr, "1979"); + + // Without the accompanying fix in place, this test would have failed with 'Expected: 269; + // Actual : 0', i.e. the AAA2 frame was not visible due to 0 width. + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[2]/infos/bounds"_ostr, "width"_ostr, + "269"); + + // Test the position of the cursor after doc load. + // We expect that it's inside the first text frame in the first cell. + // More precisely, this is a bottom to top vertical frame, so we expect it's at the start, which + // means it's at the lower half of the text frame rectangle (vertically). + SwWrtShell* pWrtShell = pShell->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + const SwRect& rCharRect = pWrtShell->GetCharRect(); + SwTwips nFirstParaTop + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[1]/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + SwTwips nFirstParaHeight + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[1]/infos/bounds"_ostr, + "height"_ostr) + .toInt32(); + SwTwips nFirstParaMiddle = nFirstParaTop + nFirstParaHeight / 2; + SwTwips nFirstParaBottom = nFirstParaTop + nFirstParaHeight; + // Without the accompanying fix in place, this test would have failed: the lower half (vertical) + // range was 2273 -> 2835, the good vertical position is 2730, the bad one was 1830. + CPPUNIT_ASSERT_GREATER(nFirstParaMiddle, rCharRect.Top()); + CPPUNIT_ASSERT_LESS(nFirstParaBottom, rCharRect.Top()); + + // Save initial cursor position. + SwPosition aCellStart = *pWrtShell->GetCursor()->Start(); + + // Test that pressing "up" at the start of the cell goes to the next character position. + SwNodeOffset nNodeIndex = pWrtShell->GetCursor()->Start()->GetNodeIndex(); + sal_Int32 nIndex = pWrtShell->GetCursor()->Start()->GetContentIndex(); + KeyEvent aKeyEvent(0, KEY_UP); + SwEditWin& rEditWin = pShell->GetView()->GetEditWin(); + rEditWin.KeyInput(aKeyEvent); + Scheduler::ProcessEventsToIdle(); + // Without the accompanying fix in place, this test would have failed: "up" was interpreted as + // logical "left", which does nothing if you're at the start of the text anyway. + CPPUNIT_ASSERT_EQUAL(nIndex + 1, pWrtShell->GetCursor()->Start()->GetContentIndex()); + + // Test that pressing "right" goes to the next paragraph (logical "down"). + sal_Int32 nContentIndex = pWrtShell->GetCursor()->Start()->GetContentIndex(); + aKeyEvent = KeyEvent(0, KEY_RIGHT); + rEditWin.KeyInput(aKeyEvent); + Scheduler::ProcessEventsToIdle(); + // Without the accompanying fix in place, this test would have failed: the cursor went to the + // paragraph after the table. + CPPUNIT_ASSERT_EQUAL(nNodeIndex + 1, pWrtShell->GetCursor()->Start()->GetNodeIndex()); + + // Test that we have the correct character index after traveling to the next paragraph. + // Without the accompanying fix in place, this test would have failed: char position was 5, i.e. + // the cursor jumped to the end of the paragraph for no reason. + CPPUNIT_ASSERT_EQUAL(nContentIndex, pWrtShell->GetCursor()->Start()->GetContentIndex()); + + // Test that clicking "below" the second paragraph positions the cursor at the start of the + // second paragraph. + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwPosition aPosition(aCellStart); + SwTwips nSecondParaLeft + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[2]/infos/bounds"_ostr, "left"_ostr) + .toInt32(); + SwTwips nSecondParaWidth + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[2]/infos/bounds"_ostr, + "width"_ostr) + .toInt32(); + SwTwips nSecondParaTop + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[2]/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + SwTwips nSecondParaHeight + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt[2]/infos/bounds"_ostr, + "height"_ostr) + .toInt32(); + Point aPoint; + aPoint.setX(nSecondParaLeft + nSecondParaWidth / 2); + aPoint.setY(nSecondParaTop + nSecondParaHeight - 100); + SwCursorMoveState aState(CursorMoveState::NONE); + pLayout->GetModelPositionForViewPoint(&aPosition, aPoint, &aState); + CPPUNIT_ASSERT_EQUAL(aCellStart.GetNodeIndex() + 1, aPosition.GetNodeIndex()); + // Without the accompanying fix in place, this test would have failed: character position was 5, + // i.e. cursor was at the end of the paragraph. + CPPUNIT_ASSERT_EQUAL(static_cast(0), aPosition.GetContentIndex()); + + // Test that the selection rectangles are inside the cell frame if we select all the cell + // content. + SwTwips nCellLeft + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/infos/bounds"_ostr, "left"_ostr) + .toInt32(); + SwTwips nCellWidth + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/infos/bounds"_ostr, "width"_ostr) + .toInt32(); + SwTwips nCellTop + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + SwTwips nCellHeight + = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/infos/bounds"_ostr, "height"_ostr) + .toInt32(); + SwRect aCellRect(Point(nCellLeft, nCellTop), Size(nCellWidth, nCellHeight)); + pWrtShell->SelAll(); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(/*bBlock=*/false); + CPPUNIT_ASSERT(!pShellCursor->empty()); + // Without the accompanying fix in place, this test would have failed with: + // selection rectangle 269x2573@(1970,2172) is not inside cell rectangle 3207x1134@(1593,1701) + // i.e. the selection went past the bottom border of the cell frame. + for (const auto& rRect : *pShellCursor) + { + std::stringstream ss; + ss << "selection rectangle " << rRect << " is not inside cell rectangle " << aCellRect; + CPPUNIT_ASSERT_MESSAGE(ss.str(), aCellRect.Contains(rRect)); + } + + // Make sure that the correct rectangle gets repainted on scroll. + SwFrame* pPageFrame = pLayout->GetLower(); + CPPUNIT_ASSERT(pPageFrame->IsPageFrame()); + + SwFrame* pBodyFrame = pPageFrame->GetLower(); + CPPUNIT_ASSERT(pBodyFrame->IsBodyFrame()); + + SwFrame* pTabFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pTabFrame->IsTabFrame()); + + SwFrame* pRowFrame = pTabFrame->GetLower(); + CPPUNIT_ASSERT(pRowFrame->IsRowFrame()); + + SwFrame* pCellFrame = pRowFrame->GetLower(); + CPPUNIT_ASSERT(pCellFrame->IsCellFrame()); + + SwFrame* pFrame = pCellFrame->GetLower(); + CPPUNIT_ASSERT(pFrame->IsTextFrame()); + + SwTextFrame* pTextFrame = static_cast(pFrame); + pTextFrame->SwapWidthAndHeight(); + // Mimic what normally SwTextFrame::PaintSwFrame() does: + SwRect aRect(4207, 2273, 269, 572); + pTextFrame->SwitchVerticalToHorizontal(aRect); + // Without the accompanying fix in place, this test would have failed with: + // Expected: 572x269@(1691,4217) + // Actual : 572x269@(2263,4217) + // i.e. the paint rectangle position was incorrect, text was not painted on scrolling up. + CPPUNIT_ASSERT_EQUAL(SwRect(1691, 4217, 572, 269), aRect); +#endif +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf123898) +{ + createSwDoc("tdf123898.odt"); + + // Make sure spellchecker has done its job already + Scheduler::ProcessEventsToIdle(); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Make sure that the arrow on the left is not there (the first portion's type is + // PortionType::Arrow if it's there) + assertXPath( + pXmlDoc, + "/root/page/body/txt/anchored/fly/txt/SwParaPortion/SwLineLayout[1]/child::*[1]"_ostr, + "type"_ostr, "PortionType::Para"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf123651) +{ + createSwDoc("tdf123651.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Without the accompanying fix in place, this test would have failed with 'Expected: 7639; + // Actual: 12926'. The shape was below the second "Lorem ipsum" text, not above it. + const sal_Int32 nTopValue + = getXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "top"_ostr).toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(7639, nTopValue, 10); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf116501) +{ + //just care it doesn't freeze + createSwDoc("tdf116501.odt"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf123163) +{ + //just care it doesn't assert + createSwDoc("tdf123163-1.docx"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testAbi11870) +{ + //just care it doesn't assert + createSwDoc("abi11870-2.odt"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testOfz64109) +{ + //just care it doesn't assert + createSwDoc("ofz64109-1.fodt"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf118719) +{ + // Insert a page break. + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // Enable hide whitespace mode. + SwViewOption aViewOptions(*pWrtShell->GetViewOptions()); + aViewOptions.SetHideWhitespaceMode(true); + pWrtShell->ApplyViewOptions(aViewOptions); + + pWrtShell->Insert("first"); + pWrtShell->InsertPageBreak(); + pWrtShell->Insert("second"); + + // Without the accompanying fix in place, this test would have failed, as the height of the + // first page was 15840 twips, instead of the much smaller 276. + sal_Int32 nOther = parseDump("/root/page[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + sal_Int32 nLast = parseDump("/root/page[2]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(nOther, nLast); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTabOverMargin) +{ + createSwDoc("tab-over-margin.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // 2nd paragraph has a tab over the right margin, and with the TabOverMargin compat option, + // there is enough space to have all content in a single line. + // Without the accompanying fix in place, this test would have failed, there were 2 lines. + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testImageComment) +{ + // Load a document that has "aaa" in it, then a commented image (4th char is the as-char image, + // 5th char is the comment anchor). + createSwDoc("image-comment.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // Look up a layout position which is on the right of the image. + SwRootFrame* pRoot = pWrtShell->GetLayout(); + CPPUNIT_ASSERT(pRoot->GetLower()->IsPageFrame()); + SwPageFrame* pPage = static_cast(pRoot->GetLower()); + CPPUNIT_ASSERT(pPage->GetLower()->IsBodyFrame()); + SwBodyFrame* pBody = static_cast(pPage->GetLower()); + CPPUNIT_ASSERT(pBody->GetLower()->IsTextFrame()); + SwTextFrame* pTextFrame = static_cast(pBody->GetLower()); + CPPUNIT_ASSERT(pTextFrame->GetDrawObjs()); + SwSortedObjs& rDrawObjs = *pTextFrame->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), rDrawObjs.size()); + SwAnchoredObject* pDrawObj = rDrawObjs[0]; + const SwRect& rDrawObjRect = pDrawObj->GetObjRect(); + Point aPoint = rDrawObjRect.Center(); + aPoint.setX(aPoint.getX() + rDrawObjRect.Width() / 2); + + // Ask for the doc model pos of this layout point. + SwPosition aPosition(*pTextFrame->GetTextNodeForFirstText()); + pTextFrame->GetModelPositionForViewPoint(&aPosition, aPoint); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 5 + // - Actual : 4 + // i.e. the cursor got positioned between the image and its comment, so typing extended the + // comment, instead of adding content after the commented image. + CPPUNIT_ASSERT_EQUAL(static_cast(5), aPosition.GetContentIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testScriptField) +{ + // Test clicking script field inside table ( tdf#141079 ) + createSwDoc("tdf141079.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // Look up layout position which is the first cell in the table + SwRootFrame* pRoot = pWrtShell->GetLayout(); + CPPUNIT_ASSERT(pRoot->GetLower()->IsPageFrame()); + SwPageFrame* pPage = static_cast(pRoot->GetLower()); + CPPUNIT_ASSERT(pPage->GetLower()->IsBodyFrame()); + SwBodyFrame* pBody = static_cast(pPage->GetLower()); + CPPUNIT_ASSERT(pBody->GetLower()->IsTextFrame()); + SwTextFrame* pTextFrame = static_cast(pBody->GetLower()); + CPPUNIT_ASSERT(pTextFrame->GetNext()->IsTabFrame()); + SwFrame* pTable = pTextFrame->GetNext(); + SwFrame* pRow1 = pTable->GetLower(); + CPPUNIT_ASSERT(pRow1->GetLower()->IsCellFrame()); + SwFrame* pCell1 = pRow1->GetLower(); + CPPUNIT_ASSERT(pCell1->GetLower()->IsTextFrame()); + SwTextFrame* pCellTextFrame = static_cast(pCell1->GetLower()); + const SwRect& rCellRect = pCell1->getFrameArea(); + Point aPoint = rCellRect.Center(); + aPoint.setX(aPoint.getX() - rCellRect.Width() / 2); + + // Ask for the doc model pos of this layout point. + SwPosition aPosition(*pCellTextFrame->GetTextNodeForFirstText()); + pCellTextFrame->GetModelPositionForViewPoint(&aPosition, aPoint); + + // Position was 1 without the fix from tdf#141079 + CPPUNIT_ASSERT_EQUAL(static_cast(0), aPosition.GetContentIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testCommentCursorPosition) +{ + // Load a document that has "aaa" in it, followed by three comments. + createSwDoc("endOfLineComments.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + SwRootFrame* pRoot = pWrtShell->GetLayout(); + CPPUNIT_ASSERT(pRoot->GetLower()->IsPageFrame()); + SwPageFrame* pPage = static_cast(pRoot->GetLower()); + CPPUNIT_ASSERT(pPage->GetLower()->IsBodyFrame()); + SwBodyFrame* pBody = static_cast(pPage->GetLower()); + CPPUNIT_ASSERT(pBody->GetLower()->IsTextFrame()); + SwTextFrame* pTextFrame = static_cast(pBody->GetLower()); + + // Set a point in the whitespace past the end of the first line. + Point aPoint = pWrtShell->getShellCursor(false)->GetSttPos(); + aPoint.setX(aPoint.getX() + 10000); + + // Ask for the doc model pos of this layout point. + SwPosition aPosition(*pTextFrame->GetTextNodeForFirstText()); + pTextFrame->GetModelPositionForViewPoint(&aPosition, aPoint); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 6 + // - Actual : 3 or 4 + // i.e. the cursor got positioned before the comments, + // so typing extended the first comment instead of adding content after the comments. + CPPUNIT_ASSERT_EQUAL(static_cast(6), aPosition.GetContentIndex()); + // The second line is also important, but can't be auto-tested + // since the failing situation depends on GetViewWidth which is zero in the headless tests. + // bb| - the cursor should move behind the |, not before it. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testCombiningCharacterCursorPosition) +{ + // Load a document that has "a" in it, followed by a combining acute in a separate rext span + createSwDoc("tdf138592-a-acute.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + SwRootFrame* pRoot = pWrtShell->GetLayout(); + CPPUNIT_ASSERT(pRoot->GetLower()->IsPageFrame()); + SwPageFrame* pPage = static_cast(pRoot->GetLower()); + CPPUNIT_ASSERT(pPage->GetLower()->IsBodyFrame()); + SwBodyFrame* pBody = static_cast(pPage->GetLower()); + CPPUNIT_ASSERT(pBody->GetLower()->IsTextFrame()); + SwTextFrame* pTextFrame = static_cast(pBody->GetLower()); + + // Set a point in the whitespace past the end of the first line. + Point aPoint = pWrtShell->getShellCursor(false)->GetSttPos(); + aPoint.AdjustX(10000); + + // Ask for the doc model pos of this layout point. + SwPosition aPosition(*pTextFrame->GetTextNodeForFirstText()); + pTextFrame->GetModelPositionForViewPoint(&aPosition, aPoint); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 1 + // i.e. the cursor got positioned before the acute, so typing shifted the acute (applying it + // to newly typed characters) instead of adding content after it. + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aPosition.GetContentIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf64222) +{ + createSwDoc("tdf64222.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, + "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/" + "child::*[@type='PortionType::Number']/SwFont"_ostr, + "height"_ostr, "560"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf113014) +{ + createSwDoc("tdf113014.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This failed, if numbering of cell A1 is missing + // (A1: left indent: 3 cm, first line indent: -3 cm + // A2: left indent: 0 cm, first line indent: 0 cm) + assertXPathContent(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/textarray[1]/text"_ostr, "1."); + assertXPathContent(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/textarray[3]/text"_ostr, "2."); + assertXPathContent(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/textarray[5]/text"_ostr, "3."); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf130218) +{ + createSwDoc("tdf130218.fodt"); + SwDoc* pDoc = getSwDoc(); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This failed, if hanging first line was hidden + assertXPathContent(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/textarray[1]/text"_ostr, "Text"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf127235) +{ + createSwDoc("tdf127235.odt"); + SwDoc* pDoc = getSwDoc(); + // This resulted in a layout loop. + pDoc->getIDocumentLayoutAccess().GetCurrentViewShell()->CalcLayout(); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf138039) +{ + createSwDoc("tdf138039.odt"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // there are 3 pages + assertXPath(pXmlDoc, "/root/page"_ostr, 3); + // table on first page + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 0); + // paragraph with large fly on second page + assertXPath(pXmlDoc, "/root/page[2]/body/tab"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[2]/body/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, "top"_ostr, + "17915"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "height"_ostr, "15819"); + // paragraph on third page + assertXPath(pXmlDoc, "/root/page[3]/body/tab"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[3]/body/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/anchored"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf134298) +{ + createSwDoc("tdf134298.ott"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // there are 2 pages + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + // table and first para on first page + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/anchored"_ostr, 0); + // paragraph with large fly on second page + assertXPath(pXmlDoc, "/root/page[2]/body/tab"_ostr, 0); + assertXPath(pXmlDoc, "/root/page[2]/body/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, "top"_ostr, + "17897"); + assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly[1]/infos/bounds"_ostr, + "height"_ostr, "15819"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testShapeAllowOverlap) +{ +// Need to find out why this fails on macOS and why this is unstable on Windows. +#if !defined(MACOSX) && !defined(_WIN32) + // Create an empty document with two, intentionally overlapping shapes. + // Set their AllowOverlap property to false. + createSwDoc(); + uno::Reference xDocument(mxComponent, uno::UNO_QUERY); + awt::Point aPoint(1000, 1000); + awt::Size aSize(2000, 2000); + uno::Reference xShape( + xDocument->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setPosition(aPoint); + xShape->setSize(aSize); + uno::Reference xDrawPageSupplier(xDocument, uno::UNO_QUERY); + uno::Reference xShapeProperties(xShape, uno::UNO_QUERY); + xShapeProperties->setPropertyValue("AllowOverlap", uno::Any(false)); + xShapeProperties->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xDrawPageSupplier->getDrawPage()->add(xShape); + + aPoint = awt::Point(2000, 2000); + xShape.set(xDocument->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setPosition(aPoint); + xShape->setSize(aSize); + xShapeProperties.set(xShape, uno::UNO_QUERY); + xShapeProperties->setPropertyValue("AllowOverlap", uno::Any(false)); + xShapeProperties->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // Now verify that the rectangle of the anchored objects don't overlap. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwFrame* pPageFrame = pLayout->GetLower(); + SwFrame* pBodyFrame = pPageFrame->GetLower(); + SwFrame* pTextFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pTextFrame->GetDrawObjs()); + SwSortedObjs& rObjs = *pTextFrame->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(2), rObjs.size()); + SwAnchoredObject* pFirst = rObjs[0]; + SwAnchoredObject* pSecond = rObjs[1]; + // Without the accompanying fix in place, this test would have failed: the layout dump was + // + // + // so there was a clear vertical overlap. (Allow for 1px tolerance.) + OString aMessage = "Unexpected overlap: first shape's bottom is " + + OString::number(pFirst->GetObjRect().Bottom()) + ", second shape's top is " + + OString::number(pSecond->GetObjRect().Top()); + CPPUNIT_ASSERT_MESSAGE(aMessage.getStr(), + std::abs(pFirst->GetObjRect().Bottom() - pSecond->GetObjRect().Top()) + < 15); +#endif +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testShapeAllowOverlapWrap) +{ + // Create an empty document with two, intentionally overlapping shapes. + // Set their AllowOverlap property to false and their wrap to through. + createSwDoc(); + uno::Reference xDocument(mxComponent, uno::UNO_QUERY); + awt::Point aPoint(1000, 1000); + awt::Size aSize(2000, 2000); + uno::Reference xShape( + xDocument->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setPosition(aPoint); + xShape->setSize(aSize); + uno::Reference xDrawPageSupplier(xDocument, uno::UNO_QUERY); + uno::Reference xShapeProperties(xShape, uno::UNO_QUERY); + xShapeProperties->setPropertyValue("AllowOverlap", uno::Any(false)); + xShapeProperties->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapeProperties->setPropertyValue("Surround", uno::Any(text::WrapTextMode_THROUGH)); + xDrawPageSupplier->getDrawPage()->add(xShape); + + aPoint = awt::Point(2000, 2000); + xShape.set(xDocument->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setPosition(aPoint); + xShape->setSize(aSize); + xShapeProperties.set(xShape, uno::UNO_QUERY); + xShapeProperties->setPropertyValue("AllowOverlap", uno::Any(false)); + xShapeProperties->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + xShapeProperties->setPropertyValue("Surround", uno::Any(text::WrapTextMode_THROUGH)); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // Now verify that the rectangle of the anchored objects do overlap. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwFrame* pPageFrame = pLayout->GetLower(); + SwFrame* pBodyFrame = pPageFrame->GetLower(); + SwFrame* pTextFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pTextFrame->GetDrawObjs()); + SwSortedObjs& rObjs = *pTextFrame->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(2), rObjs.size()); + SwAnchoredObject* pFirst = rObjs[0]; + SwAnchoredObject* pSecond = rObjs[1]; + // Without the accompanying fix in place, this test would have failed: AllowOverlap=no had + // priority over Surround=through (which is bad for Word compat). + CPPUNIT_ASSERT(pSecond->GetObjRect().Overlaps(pFirst->GetObjRect())); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf124600) +{ + createSwDoc("tdf124600.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 2 + // i.e. the last line in the body text had 2 lines, while it should have 1, as Word does (as the + // fly frame does not intersect with the print area of the paragraph.) + assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf124601) +{ + // This is a testcase for the ContinuousEndnotes compat flag. + // The document has 2 pages, the endnote anchor is on the first page. + // The endnote should be on the 2nd page together with the last page content. + createSwDoc("tdf124601.doc"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 3 + // i.e. there was a separate endnote page, even when the ContinuousEndnotes compat option was + // on. + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/ftncont"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf124601b) +{ + // Table has an image, which is anchored in the first row, but its vertical position is large + // enough to be rendered in the second row. + // The shape has layoutInCell=1, so should match what Word does here. + // Also the horizontal position should be in the last column, even if the anchor is in the + // last-but-one column. + createSwDoc("tdf124601b.doc"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nFlyTop = getXPath(pXmlDoc, "//anchored/fly/infos/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 nFlyLeft + = getXPath(pXmlDoc, "//anchored/fly/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nFlyRight + = nFlyLeft + getXPath(pXmlDoc, "//anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nSecondRowTop + = getXPath(pXmlDoc, "//tab/row[2]/infos/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 nLastCellLeft + = getXPath(pXmlDoc, "//tab/row[1]/cell[5]/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nLastCellRight + = nLastCellLeft + + getXPath(pXmlDoc, "//tab/row[1]/cell[5]/infos/bounds"_ostr, "width"_ostr).toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 3736 + // - Actual : 2852 + // i.e. the image was still inside the first row. + CPPUNIT_ASSERT_GREATER(nSecondRowTop, nFlyTop); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 9640 + // - Actual : 9639 + // i.e. the right edge of the image was not within the bounds of the last column, the right edge + // was in the last-but-one column. + CPPUNIT_ASSERT_GREATER(nLastCellLeft, nFlyRight); + CPPUNIT_ASSERT_LESS(nLastCellRight, nFlyRight); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf124770) +{ + // Enable content over margin. + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + pDoc->getIDocumentSettingAccess().set(DocumentSettingId::TAB_OVER_MARGIN, true); + + // Set page width. + SwPageDesc& rPageDesc = pDoc->GetPageDesc(0); + SwFrameFormat& rPageFormat = rPageDesc.GetMaster(); + const SwAttrSet& rPageSet = rPageFormat.GetAttrSet(); + SwFormatFrameSize aPageSize = rPageSet.GetFrameSize(); + aPageSize.SetWidth(3703); + rPageFormat.SetFormatAttr(aPageSize); + + // Set left and right margin. + SvxLRSpaceItem aLRSpace = rPageSet.GetLRSpace(); + aLRSpace.SetLeft(1418); + aLRSpace.SetRight(1418); + rPageFormat.SetFormatAttr(aLRSpace); + pDoc->ChgPageDesc(0, rPageDesc); + + // Set font to italic 20pt Liberation Serif. + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SfxItemSet aTextSet(pWrtShell->GetView().GetPool(), + svl::Items); + SvxFontItem aFont(RES_CHRATR_FONT); + aFont.SetFamilyName("Liberation Serif"); + aTextSet.Put(aFont); + SvxFontHeightItem aHeight(400, 100, RES_CHRATR_FONTSIZE); + aTextSet.Put(aHeight); + SvxPostureItem aItalic(ITALIC_NORMAL, RES_CHRATR_POSTURE); + aTextSet.Put(aItalic); + pWrtShell->SetAttrSet(aTextSet); + + // Insert the text. + pWrtShell->Insert2("HHH"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 2 + // i.e. the italic string was broken into 2 lines, while Word kept it in a single line. + assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testContinuousEndnotesInsertPageAtStart) +{ + // Create a new document with CONTINUOUS_ENDNOTES enabled. + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + pDoc->getIDocumentSettingAccess().set(DocumentSettingId::CONTINUOUS_ENDNOTES, true); + + // Insert a second page, and an endnote on the 2nd page (both the anchor and the endnote is on + // the 2nd page). + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->InsertPageBreak(); + pWrtShell->InsertFootnote("endnote", /*bEndNote=*/true, /*bEdit=*/false); + + // Add a new page at the start of the document. + pWrtShell->SttEndDoc(/*bStart=*/true); + pWrtShell->InsertPageBreak(); + + // Make sure that the endnote is moved from the 2nd page to the 3rd one. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page"_ostr, 3); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. the footnote container remained on page 2. + assertXPath(pXmlDoc, "/root/page[3]/ftncont"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testContinuousEndnotesDeletePageAtStart) +{ + // Create a new document with CONTINUOUS_ENDNOTES enabled. + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + pDoc->getIDocumentSettingAccess().set(DocumentSettingId::CONTINUOUS_ENDNOTES, true); + + // Insert a second page, and an endnote on the 2nd page (both the anchor and the endnote is on + // the 2nd page). + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->InsertPageBreak(); + pWrtShell->InsertFootnote("endnote", /*bEndNote=*/true, /*bEdit=*/false); + + // Remove the empty page at the start of the document. + pWrtShell->SttEndDoc(/*bStart=*/true); + pWrtShell->DelRight(); + + // Make sure that the endnote is moved from the 2nd page to the 1st one. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 2 + // i.e. the endnote remained on an (otherwise) empty 2nd page. + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/ftncont"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf128399) +{ + createSwDoc("tdf128399.docx"); + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + SwFrame* pPage = pLayout->GetLower(); + SwFrame* pBody = pPage->GetLower(); + SwFrame* pTable = pBody->GetLower(); + SwFrame* pRow1 = pTable->GetLower(); + SwFrame* pRow2 = pRow1->GetNext(); + const SwRect& rRow2Rect = pRow2->getFrameArea(); + Point aPoint = rRow2Rect.Center(); + + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPosition aPosition = *pWrtShell->GetCursor()->Start(); + SwPosition aFirstRow(aPosition); + SwCursorMoveState aState(CursorMoveState::NONE); + pLayout->GetModelPositionForViewPoint(&aPosition, aPoint, &aState); + // Second row is +3: end node, start node and the first text node in the 2nd row. + SwNodeOffset nExpected = aFirstRow.GetNodeIndex() + 3; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 14 + // - Actual : 11 + // i.e. clicking on the center of the 2nd row placed the cursor in the 1st row. + CPPUNIT_ASSERT_EQUAL(nExpected, aPosition.GetNodeIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf156724) +{ + discardDumpedLayout(); + if (mxComponent.is()) + mxComponent->dispose(); + + OUString const url(createFileURL(u"fdo56797-2-min.odt")); + + // note: must set Hidden property, so that SfxFrameViewWindow_Impl::Resize() + // does *not* forward initial VCL Window Resize and thereby triggers a + // layout which does not happen on soffice --convert-to pdf. + std::vector aFilterOptions = { + { beans::PropertyValue("Hidden", -1, uno::Any(true), beans::PropertyState_DIRECT_VALUE) }, + }; + + // inline the loading because currently properties can't be passed... + mxComponent = loadFromDesktop(url, "com.sun.star.text.TextDocument", + comphelper::containerToSequence(aFilterOptions)); + save("writer_pdf_Export"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // both pages have a tab frame and one footnote + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/ftncont"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/ftncont"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/ftncont/ftn"_ostr, 1); + assertXPath(pXmlDoc, "/root/page"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf156725) +{ + createSwDoc("tdf156725.fodt"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + // the fly has 2 columns, the section in it has 2 columns, and is split + // across the fly columns => 4 columns with 1 text frame each + assertXPath(pXmlDoc, "/root/page[2]/body/txt/anchored/fly/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/body/txt/anchored/fly/column[1]/body/section/column"_ostr, + 2); + assertXPath( + pXmlDoc, + "/root/page[2]/body/txt/anchored/fly/column[1]/body/section/column[1]/body/txt"_ostr, 1); + assertXPath( + pXmlDoc, + "/root/page[2]/body/txt/anchored/fly/column[1]/body/section/column[2]/body/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/body/txt/anchored/fly/column[2]/body/section/column"_ostr, + 2); + assertXPath( + pXmlDoc, + "/root/page[2]/body/txt/anchored/fly/column[2]/body/section/column[1]/body/txt"_ostr, 1); + assertXPath( + pXmlDoc, + "/root/page[2]/body/txt/anchored/fly/column[2]/body/section/column[2]/body/txt"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf156419) +{ + createSwDoc("linked_frames_section_bug.odt"); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page"_ostr, 2); + // there are 2 flys on page 1, and 1 on page 2, all linked + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly[1]/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly[1]/section/column[1]/body/txt"_ostr, + 11); + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly[1]/section/column[2]/body/txt"_ostr, + 11); + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly[2]/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly[2]/section/column[1]/body/txt"_ostr, + 12); + assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly[2]/section/column[2]/body/txt"_ostr, + 12); + assertXPath(pXmlDoc, "/root/page[2]/body/txt/anchored/fly[1]/section/column"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[2]/body/txt/anchored/fly[1]/section/column[1]/body/txt"_ostr, + 2); + assertXPath(pXmlDoc, "/root/page[2]/body/txt/anchored/fly[1]/section/column[2]/body/txt"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf145826) +{ + createSwDoc("tdf145826.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/root/page/body/section/column"_ostr, 2); + + // Without the fix in place, this test would have failed with + // - Expected: 1 + // - Actual : 0 + assertXPath(pXmlDoc, "/root/page/body/section/column[1]/ftncont"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/section/column[2]/ftncont"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/section/column[1]/ftncont/ftn"_ostr, 3); + assertXPath(pXmlDoc, "/root/page/body/section/column[2]/ftncont/ftn"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf105481) +{ + createSwDoc("tdf105481.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + + // Without the accompanying fix in place, this test would have failed + // because the vertical position of the as-char shape object and the + // as-char math object will be wrong (below/beyond the text frame's bottom). + + SwTwips nTxtTop = getXPath(pXmlDoc, + "/root/page/anchored/fly/txt[2]" + "/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + SwTwips nTxtBottom = nTxtTop + + getXPath(pXmlDoc, + "/root/page/anchored/fly/txt[2]" + "/infos/bounds"_ostr, + "height"_ostr) + .toInt32(); + + SwTwips nFormula1Top = getXPath(pXmlDoc, + "/root/page/anchored/fly/txt[2]" + "/anchored/fly[1]/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + SwTwips nFormula1Bottom = nFormula1Top + + getXPath(pXmlDoc, + "/root/page/anchored/fly/txt[2]" + "/anchored/fly[1]/infos/bounds"_ostr, + "height"_ostr) + .toInt32(); + + SwTwips nFormula2Top = getXPath(pXmlDoc, + "/root/page/anchored/fly/txt[2]" + "/anchored/fly[2]/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + SwTwips nFormula2Bottom = nFormula2Top + + getXPath(pXmlDoc, + "/root/page/anchored/fly/txt[2]" + "/anchored/fly[2]/infos/bounds"_ostr, + "height"_ostr) + .toInt32(); + + // Ensure that the two formula positions are at least between top and bottom of the text frame. + // The below two are satisfied even without the fix. + CPPUNIT_ASSERT_GREATEREQUAL(nTxtTop, nFormula1Top); + CPPUNIT_ASSERT_GREATEREQUAL(nTxtTop, nFormula2Top); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected less than or equal to : 14423 + // - Actual : 14828 + // that is, the formula is below the text-frame's y bound. + CPPUNIT_ASSERT_LESSEQUAL(nTxtBottom, nFormula1Bottom); + // Similarly for formula # 2 : + // - Expected less than or equal to : 14423 + // - Actual : 15035 + // that is, the formula is below the text-frame's y bound. + CPPUNIT_ASSERT_LESSEQUAL(nTxtBottom, nFormula2Bottom); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf117982) +{ + createSwDoc("tdf117982.docx"); + SwDoc* pDocument = getSwDoc(); + SwDocShell* pShell = pDocument->GetDocShell(); + std::shared_ptr xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + assertXPathContent(pXmlDoc, "/metafile/push[1]/push[1]/push[1]/textarray[1]/text"_ostr, + "FOO AAA"); + //The first cell must be "FOO AAA". If not, this means the first cell content not visible in + //the source document. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf128959) +{ + // no orphan/widow control in table cells + createSwDoc("tdf128959.docx"); + SwDoc* pDocument = getSwDoc(); + CPPUNIT_ASSERT(pDocument); + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // first two lines of the paragraph in the split table cell on the first page + // (these lines were completely lost) + assertXPath( + pXmlDoc, + "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, + "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue "); + assertXPath( + pXmlDoc, + "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout[2]"_ostr, + "portion"_ostr, + "massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit "); + // last line of the paragraph in the split table cell on the second page + assertXPath( + pXmlDoc, + "/root/page[2]/body/tab[1]/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "amet commodo magna eros quis urna."); + + // Also check that the widow control for the paragraph is not turned off: + sw::TableFrameFormats& rTableFormats = *pDocument->GetTableFrameFormats(); + SwFrameFormat* pTableFormat = rTableFormats[0]; + SwTable* pTable = SwTable::FindTable(pTableFormat); + const SwTableBox* pCell = pTable->GetTableBox("A1"); + const SwStartNode* pStartNode = pCell->GetSttNd(); + SwNodeIndex aNodeIndex(*pStartNode); + ++aNodeIndex; + const SwTextNode* pTextNode = aNodeIndex.GetNode().GetTextNode(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 0 + // i.e. the original fix only worked as the entire widow / orphan control was switched off. + CPPUNIT_ASSERT_EQUAL(2, static_cast(pTextNode->GetSwAttrSet().GetWidows().GetValue())); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf121658) +{ + uno::Reference xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString()))) + return; + + createSwDoc("tdf121658.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Only 2 hyphenated words should appear in the document (in the lowercase words). + // Uppercase words should not be hyphenated. + assertXPath(pXmlDoc, "//SwLineLayout/child::*[@type='PortionType::Hyphen']"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf149420) +{ + uno::Reference xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString()))) + return; + + createSwDoc("tdf149420.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Only 3 hyphenated words should appear in the document (last paragraph + // has got a 1 cm hyphenation zone, removing two hyphenations, which visible + // in the second paragraph). + assertXPath(pXmlDoc, "//SwLineLayout/child::*[@type='PortionType::Hyphen']"_ostr, 8); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf149324) +{ + uno::Reference xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString()))) + return; + + createSwDoc("tdf149324.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Only 3 hyphenated words should appear in the document (last paragraph + // has got a 7-character word limit for hyphenation, removing the + // hyphenation "ex-cept". + assertXPath(pXmlDoc, "//SwLineLayout/child::*[@type='PortionType::Hyphen']"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf149248) +{ + uno::Reference xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale("en", "US", OUString()))) + return; + + createSwDoc("tdf149248.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Only 1 hyphenated word should appear in the document (last word of the second + // paragraph). Last word should not be hyphenated for the fourth paragraph + // (the same paragraph, but with forbidden hyphenation of the last word). + assertXPath(pXmlDoc, "//SwLineLayout/child::*[@type='PortionType::Hyphen']"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testWriterImageNoCapture) +{ + createSwDoc("writer-image-no-capture.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + CPPUNIT_ASSERT(pXmlDoc); + sal_Int32 nPageLeft = getXPath(pXmlDoc, "//page/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nImageLeft + = getXPath(pXmlDoc, "//anchored/fly/infos/bounds"_ostr, "left"_ostr).toInt32(); + // Without the accompanying fix in place, this test would have failed with: + // - Expected less than: 284 + // - Actual : 284 + // i.e. the image position was modified to be inside the page frame ("captured"), even if Word + // does not do that. + CPPUNIT_ASSERT_LESS(nPageLeft, nImageLeft); +} + +static SwRect lcl_getVisibleFlyObjRect(SwWrtShell* pWrtShell) +{ + SwRootFrame* pRoot = pWrtShell->GetLayout(); + SwPageFrame* pPage = static_cast(pRoot->GetLower()); + pPage = static_cast(pPage->GetNext()); + pPage = static_cast(pPage->GetNext()); + SwSortedObjs* pDrawObjs = pPage->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pDrawObjs->size()); + SwAnchoredObject* pDrawObj = (*pDrawObjs)[0]; + CPPUNIT_ASSERT_EQUAL(OUString("Rahmen8"), pDrawObj->GetFrameFormat().GetName()); + pPage = static_cast(pPage->GetNext()); + pDrawObjs = pPage->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pDrawObjs->size()); + pDrawObj = (*pDrawObjs)[0]; + CPPUNIT_ASSERT_EQUAL(OUString("Rahmen123"), pDrawObj->GetFrameFormat().GetName()); + SwRect aFlyRect = pDrawObj->GetObjRect(); + CPPUNIT_ASSERT(pPage->getFrameArea().Contains(aFlyRect)); + return aFlyRect; +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testStableAtPageAnchoredFlyPosition) +{ + // this doc has two page-anchored frames: one tiny on page 3 and one large on page 4. + // it also has a style:master-page named "StandardEntwurf", which contains some fields. + // if you add a break to page 2, or append some text to page 4 (or just toggle display field names), + // the page anchored frame on page 4 vanishes, as it is incorrectly moved out of the page bounds. + createSwDoc("stable-at-page-anchored-fly-position.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // look up the layout position of the page-bound frame on page four + SwRect aOrigRect = lcl_getVisibleFlyObjRect(pWrtShell); + + // append some text to the document to trigger bug / relayout + pWrtShell->SttEndDoc(false); + pWrtShell->Insert("foo"); + + // get the current position of the frame on page four + SwRect aRelayoutRect = lcl_getVisibleFlyObjRect(pWrtShell); + + // the anchored frame should not have moved + CPPUNIT_ASSERT_EQUAL(aOrigRect, aRelayoutRect); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf134548) +{ + createSwDoc("tdf134548.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // Second paragraph has two non zero width tabs in beginning of line + { + OUString sNodeType = parseDump( + "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwFixPortion[1]"_ostr, "type"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("PortionType::TabLeft"), sNodeType); + sal_Int32 nWidth + = parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwFixPortion[1]"_ostr, + "width"_ostr) + .toInt32(); + CPPUNIT_ASSERT_GREATER(sal_Int32(0), nWidth); + } + { + OUString sNodeType = parseDump( + "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwFixPortion[2]"_ostr, "type"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("PortionType::TabLeft"), sNodeType); + sal_Int32 nWidth + = parseDump("/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwFixPortion[2]"_ostr, + "width"_ostr) + .toInt32(); + CPPUNIT_ASSERT_GREATER(sal_Int32(0), nWidth); + } +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf124423) +{ + createSwDoc("tdf124423.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nFly1Width + = getXPath(pXmlDoc, "(//anchored/fly)[1]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nFly2Width + = getXPath(pXmlDoc, "(//anchored/fly)[2]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nPageWidth = getXPath(pXmlDoc, "//page/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(nPageWidth, nFly2Width); + CPPUNIT_ASSERT_LESS(nPageWidth / 2, nFly1Width); + + createSwDoc("tdf124423.odt"); + pXmlDoc = parseLayoutDump(); + nFly1Width + = getXPath(pXmlDoc, "(//anchored/fly)[1]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + nFly2Width + = getXPath(pXmlDoc, "(//anchored/fly)[2]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + nPageWidth = getXPath(pXmlDoc, "//page/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(nPageWidth / 2, nFly2Width); + CPPUNIT_ASSERT_LESS(nPageWidth / 2, nFly1Width); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf137185) +{ + // First load the sample bugdoc + createSwDoc("tdf137185.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + // Get the doc shell + SwDoc* pDoc(pTextDoc->GetDocShell()->GetDoc()); + + // Get the DrawObject from page + auto pModel = pDoc->getIDocumentDrawModelAccess().GetDrawModel(); + CPPUNIT_ASSERT(pModel); + auto pPage = pModel->GetPage(0); + CPPUNIT_ASSERT(pPage); + auto pObj = pPage->GetObj(0); + CPPUNIT_ASSERT(pObj); + + // Get the format of the draw object + auto pShape = FindFrameFormat(pObj); + CPPUNIT_ASSERT(pShape); + + // Check the text of the shape + uno::Reference xTxt(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Align me!"), xTxt->getText()->getString()); + + // Add a textbox to the shape + SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject(), true); + + // Check if the text moved from the shape to the frame + auto pFormat = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); + auto xTextFrame = SwXTextFrame::CreateXTextFrame(*pFormat->GetDoc(), pFormat); + + CPPUNIT_ASSERT_EQUAL(OUString("Align me!"), xTextFrame->getText()->getString()); + SdrTextObj* pTextObj = DynCastSdrTextObj(pObj); + CPPUNIT_ASSERT(pTextObj); + const auto& aOutStr = pTextObj->GetOutlinerParaObject()->GetTextObject(); + + CPPUNIT_ASSERT(aOutStr.GetText(0).isEmpty()); + // Before the patch it failed, because the text appeared 2 times on each other. +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf138782) +{ + createSwDoc("tdf138782.docx"); + auto pXml = parseLayoutDump(); + CPPUNIT_ASSERT(pXml); + + // Without the fix it failed because the 3rd shape was outside the page: + // - Expected less than: 13327 + // - Actual : 14469 + + CPPUNIT_ASSERT_LESS(getXPath(pXml, "/root/page/infos/bounds"_ostr, "right"_ostr).toInt32(), + getXPath(pXml, + "/root/page/body/txt[8]/anchored/SwAnchoredDrawObject/bounds"_ostr, + "right"_ostr) + .toInt32()); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf135035) +{ + createSwDoc("tdf135035.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nFly1Width + = getXPath(pXmlDoc, "(//anchored/fly)[1]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nFly2Width + = getXPath(pXmlDoc, "(//anchored/fly)[2]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nFly3Width + = getXPath(pXmlDoc, "(//anchored/fly)[3]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nParentWidth + = getXPath(pXmlDoc, "(//txt)[1]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(nParentWidth, nFly2Width); + CPPUNIT_ASSERT_EQUAL(nParentWidth, nFly3Width); + CPPUNIT_ASSERT_LESS(nParentWidth / 2, nFly1Width); + + createSwDoc("tdf135035.odt"); + pXmlDoc = parseLayoutDump(); + nFly1Width + = getXPath(pXmlDoc, "(//anchored/fly)[1]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + nFly2Width + = getXPath(pXmlDoc, "(//anchored/fly)[2]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + nFly3Width + = getXPath(pXmlDoc, "(//anchored/fly)[3]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + nParentWidth = getXPath(pXmlDoc, "(//txt)[1]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(nParentWidth / 2, nFly2Width); + CPPUNIT_ASSERT_LESS(nParentWidth / 2, nFly1Width); + CPPUNIT_ASSERT_GREATER(nParentWidth, nFly3Width); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf146704_EndnoteInSection) +{ + createSwDoc("tdf146704_EndnoteInSection.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Without the fix, the endnote placed to 2. page + assertXPath(pXmlDoc, "/root/page"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf139336_ColumnsWithFootnoteDoNotOccupyEntirePage) +{ + createSwDoc("tdf139336_ColumnsWithFootnoteDoNotOccupyEntirePage.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Without the fix, it would be 5 pages, but with the fix the whole document + // would fit into 1 page, but it will be 2 pages right now, because + // when writer import (from docx) the last section with columns, then it does not set + // the evenly distributed settings, and this settings is required for the fix now, to + // avoid some regression. + assertXPath(pXmlDoc, "/root/page"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage) +{ + // Old odt files should keep their original layout, as it was before Tdf139336 fix. + // The new odt file is only 1 page long, while the old odt file (with the same content) + // was more than 1 page long. + // Note: Somewhy this test miscalculates the layout of the old odt file. + // It will be 4 pages long, while opened in Writer it is 5 pages long. + createSwDoc("tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_Old.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + Scheduler::ProcessEventsToIdle(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, "/root/page"_ostr); + xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval; + CPPUNIT_ASSERT_GREATER(1, xmlXPathNodeSetGetLength(pXmlNodes)); + xmlXPathFreeObject(pXmlObj); + + discardDumpedLayout(); + createSwDoc("tdf54465_ColumnsWithFootnoteDoNotOccupyEntirePage_New.odt"); + pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf138124) +{ + // When the only portion after the footnote number is a FlyCnt, and it doesn't fit into + // the page width, it should be moved to the next line without the footnote number, and + // not loop, nor OOM, nor fail assertions. + + createSwDoc("wideBoxInFootnote.fodt"); + Scheduler::ProcessEventsToIdle(); + + // Without the fix in place, the layout would loop, creating new FootnoteNum portions + // indefinitely, until OOM. + // If the footnote paragraph had no orphan control, then the loop would finally end, + // but an assertion in SwTextPainter::DrawTextLine would fail during paint. + + xmlDocUniquePtr pXml = parseLayoutDump(); + assertXPath(pXml, "/root/page"_ostr, 1); + assertXPath(pXml, "/root/page/ftncont/ftn/txt/anchored"_ostr, 1); + + // And finally, if there were no assertion in SwTextPainter::DrawTextLine, it would have + // produced multiple lines with FootnoteNum portions, failing the following check like + // - Expected: 1 + // - Actual : 49 + + assertXPath(pXml, + "/root/page/ftncont/ftn/txt//SwFieldPortion[@type='PortionType::FootnoteNum']"_ostr, + 1); + assertXPath(pXml, "/root/page/ftncont/ftn/txt//SwLinePortion[@type='PortionType::FlyCnt']"_ostr, + 1); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf154113) +{ + createSwDoc("three_sections.fodt"); + Scheduler::ProcessEventsToIdle(); + + dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {}); + dispatchCommand(mxComponent, ".uno:GoToNextPara", {}); + dispatchCommand(mxComponent, ".uno:EndOfDocumentSel", {}); // to the end of current section! + dispatchCommand(mxComponent, ".uno:EndOfDocumentSel", {}); // to the end of the document. + + auto xModel = mxComponent.queryThrow(); + auto xSelected = xModel->getCurrentSelection().queryThrow(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSelected->getCount()); + auto xRange = xSelected->getByIndex(0).queryThrow(); + CPPUNIT_ASSERT_EQUAL(OUString("<-- Start selection here. Section1" SAL_NEWLINE_STRING + "Section2" SAL_NEWLINE_STRING "Section3. End selection here -->"), + xRange->getString()); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + + xSelected = xModel->getCurrentSelection().queryThrow(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSelected->getCount()); + xRange = xSelected->getByIndex(0).queryThrow(); + CPPUNIT_ASSERT_EQUAL(OUString(), xRange->getString()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + xmlDocUniquePtr pXml = parseLayoutDump(); + + // Without the fix in place, this would fail with + // - Expected: 3 + // - Actual : 2 + assertXPath(pXml, "/root/page/body/section"_ostr, 3); + assertXPath(pXml, "/root/page/body/section[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "<-- Start selection here. Section1"); + assertXPath(pXml, "/root/page/body/section[2]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "Section2"); + assertXPath(pXml, "/root/page/body/section[3]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "Section3. End selection here -->"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf155611) +{ + createSwDoc("tdf155611_table_and_nested_section.fodt"); + Scheduler::ProcessEventsToIdle(); + + xmlDocUniquePtr pXml = parseLayoutDump(); + CPPUNIT_ASSERT(pXml); + + // Check the layout: single page, two section frames (no section frames after the one for Inner + // section), correct table structure and content in the first section frame, including nested + // table in the last cell, and the last section text. + assertXPath(pXml, "/root/page"_ostr); + // Without the fix in place, this would fail with + // - Expected: 2 + // - Actual : 3 + assertXPath(pXml, "/root/page/body/section"_ostr, 2); + assertXPath(pXml, "/root/page/body/section[1]/tab"_ostr); + assertXPath(pXml, "/root/page/body/section[1]/tab/row"_ostr); + assertXPath(pXml, "/root/page/body/section[1]/tab/row/cell"_ostr, 2); + assertXPath(pXml, "/root/page/body/section[1]/tab/row/cell[1]/txt/SwParaPortion/SwLineLayout/" + "SwParaPortion[@portion='foo']"_ostr); + assertXPath(pXml, "/root/page/body/section[1]/tab/row/cell[2]/txt/SwParaPortion/SwLineLayout/" + "SwParaPortion[@portion='bar']"_ostr); + assertXPath(pXml, "/root/page/body/section[1]/tab/row/cell[2]/tab/row/cell/txt/SwParaPortion/" + "SwLineLayout/SwParaPortion[@portion='baz']"_ostr); + assertXPath(pXml, "/root/page/body/section[2]/txt[1]/SwParaPortion/SwLineLayout/" + "SwParaPortion[@portion='abc']"_ostr); + + // Also must not crash on close because of a frame that accidentally fell off of the layout +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf152307) +{ + // Problem: On a given Writer document a table layout changed + // after doing Tools -> Update -> Update All. The last table row on page 13 + // was bigger than the page size allowed and thus was hidden behind the footer. + + // load the document + createSwDoc("tdf152307.odt"); + + // do Tools -> Update -> Update All + dispatchCommand(mxComponent, ".uno:UpdateAllIndexes", {}); + + // XML dump and some basic assertions + sal_Int32 nPage = 7, nPages = 0; + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + nPages = countXPathNodes(pXmlDoc, "/root/page"_ostr); + CPPUNIT_ASSERT_MESSAGE("tdf152307.odt / testTdf152307: Not enough pages.", nPage < nPages); + assertXPath(pXmlDoc, "/root/page[" + OString::number(nPage) + "]/body/section", 1); + + // Actual test procedure: + // On page 7, check: + // How much tables do we have? How much rows does the last table have? + int nTables + = countXPathNodes(pXmlDoc, "/root/page[" + OString::number(nPage) + "]/body/section/tab"); + int nRowsLastTable + = countXPathNodes(pXmlDoc, "/root/page[" + OString::number(nPage) + "]/body/section/tab[" + + OString::number(nTables) + "]/row"); + // What is the bottom value of the last table row? + sal_Int32 nTabBottom = getXPath(pXmlDoc, + "/root/page[" + OString::number(nPage) + "]/body/section/tab[" + + OString::number(nTables) + "]/row[" + + OString::number(nRowsLastTable) + "]/infos/bounds", + "bottom"_ostr) + .toInt32(); + // Where does the footer start (footer/info/bounds/top)? + sal_Int32 nFooterTop + = getXPath(pXmlDoc, "/root/page[" + OString::number(nPage) + "]/footer/infos/bounds", + "top"_ostr) + .toInt32(); + // Is the bottom value of the last row above the top value of the footer? + OString aMsg = "tdf152307.odt / testTdf152307: Bottom value of last table row on page " + + OString::number(nPage) + " is below top value of footer: " + + OString::number(nTabBottom) + " > " + OString::number(nFooterTop); + CPPUNIT_ASSERT_MESSAGE(aMsg.getStr(), nTabBottom < nFooterTop); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf57187_Tdf158900) +{ + // Given a document with a single paragraph, having some long space runs and line breaks + createSwDoc("space+break.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Make sure there is only one page, one paragraph, and five lines + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion"_ostr, 1); + // Without the fix in place, this would fail: there used to be 6 lines + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout"_ostr, 5); + + // tdf#57187: Check that relatively short lines have spaces not participating in layout. + // First line has 11 spaces in the end, and then a manual line break. It is rather short: + // without block justification, it is narrower than the available space. + // It uses the "first check if everything fits to line" return path in SwTextGuess::Guess. + // Check that the spaces are put into a Hole portion, thus not participating in layout. + // Without the fix, this would fail: there were only 2 portions, no Hole nor Margin portions. + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*"_ostr, 4); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[1]"_ostr, "type"_ostr, + u"PortionType::Text"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[1]"_ostr, + "length"_ostr, u"11"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[2]"_ostr, "type"_ostr, + u"PortionType::Hole"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[2]"_ostr, + "length"_ostr, u"11"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[3]"_ostr, "type"_ostr, + u"PortionType::Break"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[4]"_ostr, "type"_ostr, + u"PortionType::Margin"_ustr); + // Second line has 101 spaces in the end, and then a manual line break. + // It uses the "second check if everything fits to line" return path in SwTextGuess::Guess. + // Check that the spaces are put into a Hole portion, thus not participating in layout. + // Without the fix, this would fail: there were only 2 portions, no Hole portion. + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[2]/*"_ostr, 3); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[2]/*[1]"_ostr, "type"_ostr, + u"PortionType::Text"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[2]/*[1]"_ostr, + "length"_ostr, u"11"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[2]/*[2]"_ostr, "type"_ostr, + u"PortionType::Hole"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[2]/*[2]"_ostr, + "length"_ostr, u"101"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[2]/*[3]"_ostr, "type"_ostr, + u"PortionType::Break"_ustr); + + // tdf#158900: Check that the break after a long line with trailing spaces is kept on same line. + // Without the fix in place, this would fail: the line had only 2 portions (text + hole), + // and the break was on a separate third line + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[3]/*"_ostr, 3); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[3]/*[1]"_ostr, "type"_ostr, + u"PortionType::Text"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[3]/*[2]"_ostr, "type"_ostr, + u"PortionType::Hole"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[3]/*[3]"_ostr, "type"_ostr, + u"PortionType::Break"_ustr); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf159050) +{ + // Given a document with a justified paragraph and a box with optimal wrapping + createSwDoc("tdf159050-wrap-adjust.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Make sure there is only one page, one anchored object, one paragraph, and two lines + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout"_ostr, 2); + + // Without the fix, this would fail: there was an unexpected second fly portion. + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*"_ostr, 4); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[1]"_ostr, "type"_ostr, + u"PortionType::Text"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[1]"_ostr, + "length"_ostr, u"91"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[2]"_ostr, "type"_ostr, + u"PortionType::Hole"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[2]"_ostr, + "length"_ostr, u"1"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[3]"_ostr, "type"_ostr, + u"PortionType::Fly"_ustr); + assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout[1]/*[4]"_ostr, "type"_ostr, + u"PortionType::Margin"_ustr); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf159271) +{ + // Given a document with a field with several spaces in a field content + createSwDoc("fld-in-tbl.docx"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Make sure there is only one page, one table with one row and two cells, and one paragraph + assertXPath(pXmlDoc, "/root/page"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/tab/row"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/tab/row/cell"_ostr, 2); + assertXPath(pXmlDoc, "/root/page/body/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/tab/row/cell[2]/txt/SwParaPortion"_ostr, 1); + + // Without the fix, this would fail: + // - Expected: 1 + // - Actual : 16 + // - In <>, XPath '/root/page/body/tab/row/cell[2]/txt//SwLineLayout' number of nodes is incorrect + assertXPath(pXmlDoc, "/root/page/body/tab/row/cell[2]/txt//SwLineLayout"_ostr, 1); + assertXPath(pXmlDoc, "/root/page/body/tab/row/cell[2]/txt//SwFieldPortion"_ostr, 1); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/mailmerge/data/10-testing-addresses-writer-merged.odt b/sw/qa/extras/mailmerge/data/10-testing-addresses-writer-merged.odt new file mode 100644 index 0000000000..e61d9fc046 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/10-testing-addresses-writer-merged.odt differ diff --git a/sw/qa/extras/mailmerge/data/10-testing-addresses-writer.odt b/sw/qa/extras/mailmerge/data/10-testing-addresses-writer.odt new file mode 100644 index 0000000000..40b61eda3b Binary files /dev/null and b/sw/qa/extras/mailmerge/data/10-testing-addresses-writer.odt differ diff --git a/sw/qa/extras/mailmerge/data/10-testing-addresses.ods b/sw/qa/extras/mailmerge/data/10-testing-addresses.ods new file mode 100644 index 0000000000..6792da4917 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/10-testing-addresses.ods differ diff --git a/sw/qa/extras/mailmerge/data/4_v01.ods b/sw/qa/extras/mailmerge/data/4_v01.ods new file mode 100644 index 0000000000..ffbf33bc2b Binary files /dev/null and b/sw/qa/extras/mailmerge/data/4_v01.ods differ diff --git a/sw/qa/extras/mailmerge/data/5-with-blanks.ods b/sw/qa/extras/mailmerge/data/5-with-blanks.ods new file mode 100644 index 0000000000..722f748306 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/5-with-blanks.ods differ diff --git a/sw/qa/extras/mailmerge/data/bookmarkcondition.fodt b/sw/qa/extras/mailmerge/data/bookmarkcondition.fodt new file mode 100644 index 0000000000..0f9d5a90b1 --- /dev/null +++ b/sw/qa/extras/mailmerge/data/bookmarkcondition.fodt @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + In den Bergen war es anstrengend. + + + + In Barcelona war es schön. + + + + In Paris war es erlebnisreich. + + + + Mein Urlaub war + + anstrengend + + + schön + + + erlebnisreich + + . + + + + + + diff --git a/sw/qa/extras/mailmerge/data/bookmarkcondition.ods b/sw/qa/extras/mailmerge/data/bookmarkcondition.ods new file mode 100644 index 0000000000..463781ed5f Binary files /dev/null and b/sw/qa/extras/mailmerge/data/bookmarkcondition.ods differ diff --git a/sw/qa/extras/mailmerge/data/db_pagecounttest.ods b/sw/qa/extras/mailmerge/data/db_pagecounttest.ods new file mode 100644 index 0000000000..4b9f90ec90 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/db_pagecounttest.ods differ diff --git a/sw/qa/extras/mailmerge/data/empty.odt b/sw/qa/extras/mailmerge/data/empty.odt new file mode 100644 index 0000000000..311cb06e57 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/empty.odt differ diff --git a/sw/qa/extras/mailmerge/data/grabbagtest.docx b/sw/qa/extras/mailmerge/data/grabbagtest.docx new file mode 100644 index 0000000000..4b40f1fb4e Binary files /dev/null and b/sw/qa/extras/mailmerge/data/grabbagtest.docx differ diff --git a/sw/qa/extras/mailmerge/data/linked-labels.odt b/sw/qa/extras/mailmerge/data/linked-labels.odt new file mode 100644 index 0000000000..a89fd92b1a Binary files /dev/null and b/sw/qa/extras/mailmerge/data/linked-labels.odt differ diff --git a/sw/qa/extras/mailmerge/data/linked-with-condition.odt b/sw/qa/extras/mailmerge/data/linked-with-condition.odt new file mode 100644 index 0000000000..17fefa29b6 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/linked-with-condition.odt differ diff --git a/sw/qa/extras/mailmerge/data/missing-default-line-color.ott b/sw/qa/extras/mailmerge/data/missing-default-line-color.ott new file mode 100644 index 0000000000..dad5a7bed9 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/missing-default-line-color.ott differ diff --git a/sw/qa/extras/mailmerge/data/multiple-page-anchored-draws.odt b/sw/qa/extras/mailmerge/data/multiple-page-anchored-draws.odt new file mode 100644 index 0000000000..55a04364fe Binary files /dev/null and b/sw/qa/extras/mailmerge/data/multiple-page-anchored-draws.odt differ diff --git a/sw/qa/extras/mailmerge/data/one-empty-address.ods b/sw/qa/extras/mailmerge/data/one-empty-address.ods new file mode 100644 index 0000000000..abffed956a Binary files /dev/null and b/sw/qa/extras/mailmerge/data/one-empty-address.ods differ diff --git a/sw/qa/extras/mailmerge/data/onecell.xlsx b/sw/qa/extras/mailmerge/data/onecell.xlsx new file mode 100644 index 0000000000..972f6b3c5f Binary files /dev/null and b/sw/qa/extras/mailmerge/data/onecell.xlsx differ diff --git a/sw/qa/extras/mailmerge/data/pagecounttest.ott b/sw/qa/extras/mailmerge/data/pagecounttest.ott new file mode 100644 index 0000000000..d7f63419c2 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/pagecounttest.ott differ diff --git a/sw/qa/extras/mailmerge/data/section_ps.odt b/sw/qa/extras/mailmerge/data/section_ps.odt new file mode 100644 index 0000000000..dd9704845f Binary files /dev/null and b/sw/qa/extras/mailmerge/data/section_ps.odt differ diff --git a/sw/qa/extras/mailmerge/data/sections_first_last.odt b/sw/qa/extras/mailmerge/data/sections_first_last.odt new file mode 100644 index 0000000000..5a92adb083 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/sections_first_last.odt differ diff --git a/sw/qa/extras/mailmerge/data/simple-mail-merge-2pages.odt b/sw/qa/extras/mailmerge/data/simple-mail-merge-2pages.odt new file mode 100644 index 0000000000..c0a86ae3ed Binary files /dev/null and b/sw/qa/extras/mailmerge/data/simple-mail-merge-2pages.odt differ diff --git a/sw/qa/extras/mailmerge/data/simple-mail-merge.odt b/sw/qa/extras/mailmerge/data/simple-mail-merge.odt new file mode 100644 index 0000000000..34637d4ef4 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/simple-mail-merge.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf118113.ods b/sw/qa/extras/mailmerge/data/tdf118113.ods new file mode 100644 index 0000000000..1d7e3cfb5d Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf118113.ods differ diff --git a/sw/qa/extras/mailmerge/data/tdf118113.odt b/sw/qa/extras/mailmerge/data/tdf118113.odt new file mode 100644 index 0000000000..89e7bc3048 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf118113.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf118845.fodt b/sw/qa/extras/mailmerge/data/tdf118845.fodt new file mode 100644 index 0000000000..64a5180da7 --- /dev/null +++ b/sw/qa/extras/mailmerge/data/tdf118845.fodt @@ -0,0 +1,28 @@ + + + + + + 4_v01 + Tabelle1 + 0 + true + + + + + + + + + + + + + Dear Mrs. <Nachname>, + Dear Mr. <Nachname>, + To whom it may concern, + + + + \ No newline at end of file diff --git a/sw/qa/extras/mailmerge/data/tdf125522.odt b/sw/qa/extras/mailmerge/data/tdf125522.odt new file mode 100644 index 0000000000..265d8fca76 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf125522.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf128148.odt b/sw/qa/extras/mailmerge/data/tdf128148.odt new file mode 100644 index 0000000000..08b283fc6c Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf128148.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf35798-legacy.fodt b/sw/qa/extras/mailmerge/data/tdf35798-legacy.fodt new file mode 100644 index 0000000000..c6dd8661e8 --- /dev/null +++ b/sw/qa/extras/mailmerge/data/tdf35798-legacy.fodt @@ -0,0 +1,37 @@ + + + + 2014-10-22T13:27:38.6731542792018-05-19T13:45:25.911000000PT6M54S4LibreOfficeDev/6.1.0.0.alpha1$Windows_X86_64 LibreOffice_project/dd1ab570d5791145c10a4e8f28b048ec8f70edb0 + + + 5-with-blanks + names + 0 + + + + + + + + + + + + + + + + + + Heading + Title: <Title> + First Name: <First Name> + Last Name: <Last Name> + Title: <Title>First Name: <First Name> + First Name: <First Name>Last Name: <Last Name> + Title: <Title>First Name: <First Name>Last Name: <Last Name> + Trailing text + + + \ No newline at end of file diff --git a/sw/qa/extras/mailmerge/data/tdf35798-legacy.odt b/sw/qa/extras/mailmerge/data/tdf35798-legacy.odt new file mode 100644 index 0000000000..fe37e5e962 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf35798-legacy.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf35798-new.fodt b/sw/qa/extras/mailmerge/data/tdf35798-new.fodt new file mode 100644 index 0000000000..8de149cab7 --- /dev/null +++ b/sw/qa/extras/mailmerge/data/tdf35798-new.fodt @@ -0,0 +1,38 @@ + + + + 2014-10-22T13:27:38.6731542792018-05-19T13:45:25.911000000PT6M54S4LibreOfficeDev/6.1.0.0.alpha1$Windows_X86_64 LibreOffice_project/dd1ab570d5791145c10a4e8f28b048ec8f70edb0 + + + 5-with-blanks + names + 0 + true + + + + + + + + + + + + + + + + + + Heading + Title: <Title> + First Name: <First Name> + Last Name: <Last Name> + Title: <Title>First Name: <First Name> + First Name: <First Name>Last Name: <Last Name> + Title: <Title>First Name: <First Name>Last Name: <Last Name> + Trailing text + + + \ No newline at end of file diff --git a/sw/qa/extras/mailmerge/data/tdf35798-new.odt b/sw/qa/extras/mailmerge/data/tdf35798-new.odt new file mode 100644 index 0000000000..84323b96e6 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf35798-new.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf62364.odt b/sw/qa/extras/mailmerge/data/tdf62364.odt new file mode 100644 index 0000000000..70def3730e Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf62364.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf78611.odt b/sw/qa/extras/mailmerge/data/tdf78611.odt new file mode 100644 index 0000000000..3eb29ba407 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf78611.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf81750.odt b/sw/qa/extras/mailmerge/data/tdf81750.odt new file mode 100644 index 0000000000..830db24e99 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf81750.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf89214.odt b/sw/qa/extras/mailmerge/data/tdf89214.odt new file mode 100644 index 0000000000..70def3730e Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf89214.odt differ diff --git a/sw/qa/extras/mailmerge/data/tdf92623.odt b/sw/qa/extras/mailmerge/data/tdf92623.odt new file mode 100644 index 0000000000..3dea8317c5 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/tdf92623.odt differ diff --git a/sw/qa/extras/mailmerge/data/writer-mail-merge.odt b/sw/qa/extras/mailmerge/data/writer-mail-merge.odt new file mode 100644 index 0000000000..f3d42f6b47 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/writer-mail-merge.odt differ diff --git a/sw/qa/extras/mailmerge/data/writer-merged-mail-merge.odt b/sw/qa/extras/mailmerge/data/writer-merged-mail-merge.odt new file mode 100644 index 0000000000..8ec76852a3 Binary files /dev/null and b/sw/qa/extras/mailmerge/data/writer-merged-mail-merge.odt differ diff --git a/sw/qa/extras/mailmerge/mailmerge.cxx b/sw/qa/extras/mailmerge/mailmerge.cxx new file mode 100644 index 0000000000..921680d382 --- /dev/null +++ b/sw/qa/extras/mailmerge/mailmerge.cxx @@ -0,0 +1,951 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Maps database URIs to the registered database names for quick lookups + */ +typedef std::map DBuriMap; +static DBuriMap aDBuriMap; + +class MMTest : public SwModelTestBase +{ +public: + MMTest(); + + virtual void tearDown() override + { + if (mxSwTextDocument.is()) + { + if (mnCurOutputType == text::MailMergeType::SHELL) + mxSwTextDocument->GetDocShell()->DoClose(); + else + mxSwTextDocument->dispose(); + } + if (mxCurResultSet.is()) + { + css::uno::Reference( + mxCurResultSet, css::uno::UNO_QUERY_THROW)->dispose(); + } + SwModelTestBase::tearDown(); + } + + /** + * Helper func used by each unit test to test the 'mail merge' code. + * + * Registers the data source, loads the original file as reference, + * initializes the mail merge job and its default argument sequence. + * + * The 'verify' method actually has to execute the mail merge by + * calling executeMailMerge() after modifying the job arguments. + */ + void executeMailMergeTest( const char* filename, const char* datasource, const char* tablename, + char const*const filter, int selection, const char* column ) + { + maMMtestFilename = filename; + header(); + + utl::TempFileNamed aTempDir(nullptr, true); + aTempDir.EnableKillingFile(); + const OUString aWorkDir = aTempDir.GetURL(); + const OUString aURI( createFileURL(OUString::createFromAscii(datasource) ) ); + const OUString aPrefix = column ? OUString::createFromAscii( column ) : "LOMM_"; + const OUString aDBName = registerDBsource( aURI, aWorkDir ); + initMailMergeJobAndArgs( filename, tablename, aDBName, aPrefix, aWorkDir, filter, selection, column != nullptr ); + + verify(); + finish(); + + mnCurOutputType = 0; + } + + OUString registerDBsource( const OUString &aURI, const OUString &aWorkDir ) + { + OUString aDBName; + DBuriMap::const_iterator pos = aDBuriMap.find( aURI ); + if (pos == aDBuriMap.end()) + { + aDBName = SwDBManager::LoadAndRegisterDataSource( aURI, &aWorkDir ); + aDBuriMap.insert( std::pair< OUString, OUString >( aURI, aDBName ) ); + std::cout << "New datasource name: '" << aDBName << "'" << std::endl; + } + else + { + aDBName = pos->second; + std::cout << "Old datasource name: '" << aDBName << "'" << std::endl; + } + CPPUNIT_ASSERT(!aDBName.isEmpty()); + return aDBName; + } + + uno::Reference< sdbc::XRowSet > getXResultFromDataset( const char* tablename, const OUString &aDBName ) + { + uno::Reference< sdbc::XRowSet > xCurResultSet; + uno::Reference< uno::XInterface > xInstance = getMultiServiceFactory()->createInstance( "com.sun.star.sdb.RowSet" ); + uno::Reference< beans::XPropertySet > xRowSetPropSet( xInstance, uno::UNO_QUERY ); + assert( xRowSetPropSet.is() && "failed to get XPropertySet interface from RowSet" ); + if (xRowSetPropSet.is()) + { + xRowSetPropSet->setPropertyValue( "DataSourceName", uno::Any( aDBName ) ); + xRowSetPropSet->setPropertyValue( "Command", uno::Any( OUString::createFromAscii(tablename) ) ); + xRowSetPropSet->setPropertyValue( "CommandType", uno::Any( sdb::CommandType::TABLE ) ); + + uno::Reference< sdbc::XRowSet > xRowSet( xInstance, uno::UNO_QUERY ); + if (xRowSet.is()) + xRowSet->execute(); // build ResultSet from properties + xCurResultSet = xRowSet; + assert( xCurResultSet.is() && "failed to build ResultSet" ); + } + return xCurResultSet; + } + + void initMailMergeJobAndArgs( const char* filename, const char* tablename, const OUString &aDBName, + const OUString &aPrefix, const OUString &aWorkDir, + char const*const filter, int nDataSets, + const bool bPrefixIsColumn ) + { + uno::Reference< task::XJob > xJob( getMultiServiceFactory()->createInstance( "com.sun.star.text.MailMerge" ), uno::UNO_QUERY_THROW ); + mxJob.set( xJob ); + + mMMargs.reserve( 15 ); + + mMMargs.emplace_back( UNO_NAME_OUTPUT_TYPE, uno::Any( filter ? text::MailMergeType::FILE : text::MailMergeType::SHELL ) ); + mMMargs.emplace_back( UNO_NAME_DOCUMENT_URL, uno::Any( + ( createFileURL(OUString::createFromAscii(filename)) ) ) ); + mMMargs.emplace_back( UNO_NAME_DATA_SOURCE_NAME, uno::Any( aDBName ) ); + mMMargs.emplace_back( UNO_NAME_OUTPUT_URL, uno::Any( aWorkDir ) ); + if (filter) + { + mMMargs.emplace_back( UNO_NAME_FILE_NAME_PREFIX, uno::Any( aPrefix ) ); + mMMargs.emplace_back(UNO_NAME_SAVE_FILTER, uno::Any(OUString::createFromAscii(filter))); + } + + if (bPrefixIsColumn) + mMMargs.emplace_back( UNO_NAME_FILE_NAME_FROM_COLUMN, uno::Any( true ) ); + + if (tablename) + { + mMMargs.emplace_back( UNO_NAME_DAD_COMMAND_TYPE, uno::Any( sdb::CommandType::TABLE ) ); + mMMargs.emplace_back( UNO_NAME_DAD_COMMAND, uno::Any( OUString::createFromAscii(tablename) ) ); + } + + if (nDataSets > 0) + { + mxCurResultSet = getXResultFromDataset( tablename, aDBName ); + uno::Reference< sdbcx::XRowLocate > xCurRowLocate( mxCurResultSet, uno::UNO_QUERY ); + mMMargs.emplace_back( UNO_NAME_RESULT_SET, uno::Any( mxCurResultSet ) ); + std::vector< uno::Any > vResult; + vResult.reserve( nDataSets ); + sal_Int32 i; + for (i = 0, mxCurResultSet->first(); i < nDataSets; i++, mxCurResultSet->next()) + { + vResult.emplace_back( xCurRowLocate->getBookmark() ); + } + mMMargs.emplace_back( UNO_NAME_SELECTION, uno::Any( comphelper::containerToSequence(vResult) ) ); + } + + } + + void executeMailMerge( bool bDontLoadResult = false ) + { + const uno::Sequence< beans::NamedValue > aSeqMailMergeArgs = comphelper::containerToSequence( mMMargs ); + uno::Any res = mxJob->execute( aSeqMailMergeArgs ); + + bool bOk = true; + bool bMMFilenameFromColumn = false; + + for (const beans::NamedValue& rArgument : aSeqMailMergeArgs) { + const OUString &rName = rArgument.Name; + const uno::Any &rValue = rArgument.Value; + + // all error checking was already done by the MM job execution + if (rName == UNO_NAME_OUTPUT_URL) + bOk &= rValue >>= msMailMergeOutputURL; + else if (rName == UNO_NAME_FILE_NAME_PREFIX) + bOk &= rValue >>= msMailMergeOutputPrefix; + else if (rName == UNO_NAME_OUTPUT_TYPE) + bOk &= rValue >>= mnCurOutputType; + else if (rName == UNO_NAME_FILE_NAME_FROM_COLUMN) + bOk &= rValue >>= bMMFilenameFromColumn; + else if (rName == UNO_NAME_DOCUMENT_URL) + bOk &= rValue >>= msMailMergeDocumentURL; + } + + CPPUNIT_ASSERT(bOk); + + // MM via UNO just works with file names. If we load the file on + // Windows before MM uses it, MM won't work, as it's already open. + // Don't move the load before the mail merge execution! + // (see gb_CppunitTest_use_instdir_configuration) + createSwDoc(maMMtestFilename); + + if (mnCurOutputType == text::MailMergeType::SHELL) + { + uno::Reference< lang::XComponent > xTmp; + CPPUNIT_ASSERT(res >>= xTmp); + mxSwTextDocument = dynamic_cast(xTmp.get()); + CPPUNIT_ASSERT(mxSwTextDocument.is()); + } + else + { + CPPUNIT_ASSERT_EQUAL(uno::Any(true), res); + if( !bMMFilenameFromColumn && !bDontLoadResult ) + loadMailMergeDocument( 0 ); + } + } + + /** + * Like parseExport(), but for given mail merge document. + */ + xmlDocUniquePtr parseMailMergeExport(const OUString& rStreamName) + { + if (mnCurOutputType != text::MailMergeType::FILE) + return nullptr; + + OUString name = msMailMergeOutputPrefix + OUString::number( 0 ) + ".odt"; + std::unique_ptr pStream(parseExportStream(msMailMergeOutputURL + "/" + name, rStreamName)); + + return parseXmlStream(pStream.get()); + } + + void loadMailMergeDocument( const OUString &filename ) + { + assert( mnCurOutputType == text::MailMergeType::FILE ); + if (mxComponent.is()) + mxComponent->dispose(); + // Output name early, so in the case of a hang, the name of the hanging input file is visible. + std::cout << filename << ","; + mnStartTime = osl_getGlobalTimer(); + mxComponent = loadFromDesktop(msMailMergeOutputURL + "/" + filename, "com.sun.star.text.TextDocument"); + discardDumpedLayout(); + calcLayout(); + } + + /** + Loads number-th document from mail merge. Requires file output from mail merge. + */ + void loadMailMergeDocument(int number, char const*const ext = ".odt") + { + OUString name; + if (!msMailMergeOutputPrefix.isEmpty()) + name = msMailMergeOutputPrefix; + else + { + INetURLObject aURLObj; + aURLObj.SetSmartProtocol( INetProtocol::File ); + aURLObj.SetSmartURL( msMailMergeDocumentURL ); + name = aURLObj.GetBase(); + } + name += OUString::number(number) + OStringToOUString(std::string_view(ext, strlen(ext)), RTL_TEXTENCODING_ASCII_US); + loadMailMergeDocument( name ); + } + + /** + Resets currently opened layout of the original template, + and creates the layout of the document with N mails inside + (result run with text::MailMergeType::SHELL) + */ + void dumpMMLayout() + { + mpXmlBuffer = xmlBufferPtr(); + dumpLayout(static_cast(mxSwTextDocument.get())); + } + +protected: + // Returns page number of the first page of a MM document inside the large MM document (used in the SHELL case). + int documentStartPageNumber( int document ) const; + + uno::Reference< css::task::XJob > mxJob; + std::vector< beans::NamedValue > mMMargs; + OUString msMailMergeDocumentURL; + OUString msMailMergeOutputURL; + OUString msMailMergeOutputPrefix; + sal_Int16 mnCurOutputType; + rtl::Reference< SwXTextDocument > mxSwTextDocument; + uno::Reference< sdbc::XRowSet > mxCurResultSet; + const char* maMMtestFilename; +}; + +#define DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, filter, BaseClass, selection, column) \ + class TestName : public BaseClass { \ + public: \ + CPPUNIT_TEST_SUITE(TestName); \ + CPPUNIT_TEST(MailMerge); \ + CPPUNIT_TEST_SUITE_END(); \ + \ + void MailMerge() { \ + executeMailMergeTest(filename, datasource, tablename, filter, selection, column); \ + } \ + void verify() override; \ + }; \ + CPPUNIT_TEST_SUITE_REGISTRATION(TestName); \ + void TestName::verify() + +// Will generate the resulting document in mxMMDocument. +#define DECLARE_SHELL_MAILMERGE_TEST(TestName, filename, datasource, tablename) \ + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, nullptr, MMTest, 0, nullptr) + +// Will generate documents as files, use loadMailMergeDocument(). +#define DECLARE_FILE_MAILMERGE_TEST(TestName, filename, datasource, tablename) \ + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, "writer8", MMTest, 0, nullptr) + +#define DECLARE_SHELL_MAILMERGE_TEST_SELECTION(TestName, filename, datasource, tablename, selection) \ + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, nullptr, MMTest, selection, nullptr) + +#define DECLARE_FILE_MAILMERGE_TEST_COLUMN(TestName, filename, datasource, tablename, column) \ + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, "writer8", MMTest, 0, column) + +int MMTest::documentStartPageNumber( int document ) const +{ // See documentStartPageNumber() . + CPPUNIT_ASSERT(mxSwTextDocument); + SwWrtShell* shell = mxSwTextDocument->GetDocShell()->GetWrtShell(); + IDocumentMarkAccess* marks = shell->GetDoc()->getIDocumentMarkAccess(); + // Unfortunately, the pages are marked using UNO bookmarks, which have internals names, so they cannot be referred to by their names. + // Assume that there are no other UNO bookmarks than the ones used by mail merge, and that they are in the sorted order. + IDocumentMarkAccess::const_iterator_t mark; + int pos = 0; + for( mark = marks->getAllMarksBegin(); mark != marks->getAllMarksEnd() && pos < document; ++mark ) + { + if( IDocumentMarkAccess::GetType( **mark ) == IDocumentMarkAccess::MarkType::UNO_BOOKMARK ) + ++pos; + } + CPPUNIT_ASSERT_EQUAL(document, pos); + sal_uInt16 page, dummy; + shell->Push(); + shell->GotoMark( *mark ); + shell->GetPageNum( page, dummy ); + shell->Pop(SwCursorShell::PopMode::DeleteCurrent); + return page; +} + +MMTest::MMTest() + : SwModelTestBase("/sw/qa/extras/mailmerge/data/", "writer8") + , mnCurOutputType(0) + , maMMtestFilename(nullptr) +{ +} + +DECLARE_SHELL_MAILMERGE_TEST(testMultiPageAnchoredDraws, "multiple-page-anchored-draws.odt", "4_v01.ods", "Tabelle1") +{ + executeMailMerge(); + + CPPUNIT_ASSERT(mxSwTextDocument); + sal_uInt16 nPhysPages = mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(8), nPhysPages); + + uno::Reference xDraws = mxSwTextDocument->getDrawPage(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8), xDraws->getCount()); + + std::set pages; + uno::Reference xPropertySet; + + for (sal_Int32 i = 0; i < xDraws->getCount(); i++) + { + xPropertySet.set(xDraws->getByIndex(i), uno::UNO_QUERY); + + text::TextContentAnchorType nAnchorType; + CPPUNIT_ASSERT(xPropertySet->getPropertyValue( UNO_NAME_ANCHOR_TYPE ) >>= nAnchorType); + CPPUNIT_ASSERT_EQUAL( text::TextContentAnchorType_AT_PAGE, nAnchorType ); + + sal_uInt16 nAnchorPageNo = {}; + CPPUNIT_ASSERT(xPropertySet->getPropertyValue( UNO_NAME_ANCHOR_PAGE_NO ) >>= nAnchorPageNo); + // are all shapes are on different page numbers? + CPPUNIT_ASSERT(pages.insert(nAnchorPageNo).second); + } +} + +DECLARE_FILE_MAILMERGE_TEST(testMissingDefaultLineColor, "missing-default-line-color.ott", "one-empty-address.ods", "one-empty-address") +{ + executeMailMerge(); + // The document was created by LO version which didn't write out the default value for line color + // (see XMLGraphicsDefaultStyle::SetDefaults()). + uno::Reference xPropertySet(getShape(5), uno::UNO_QUERY); + // Lines do not have a line color. + CPPUNIT_ASSERT( !xPropertySet->getPropertySetInfo()->hasPropertyByName( "LineColor" )); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + uno::Reference< lang::XMultiServiceFactory > xFact( mxComponent, uno::UNO_QUERY ); + uno::Reference< beans::XPropertySet > xDefaults( xFact->createInstance( "com.sun.star.drawing.Defaults" ), uno::UNO_QUERY ); + CPPUNIT_ASSERT( xDefaults.is()); + uno::Reference< beans::XPropertySetInfo > xInfo( xDefaults->getPropertySetInfo()); + CPPUNIT_ASSERT( xInfo->hasPropertyByName( "LineColor" )); + Color lineColor; + xDefaults->getPropertyValue( "LineColor" ) >>= lineColor; + // And the default value is black (wasn't copied properly by mailmerge). + CPPUNIT_ASSERT_EQUAL( COL_BLACK, lineColor ); + // And check that the resulting file has the proper default. + xmlDocUniquePtr pXmlDoc = parseMailMergeExport( "styles.xml" ); + CPPUNIT_ASSERT_EQUAL( OUString( "graphic" ), getXPath(pXmlDoc, "/office:document-styles/office:styles/style:default-style[1]"_ostr, "family"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString( "#000000" ), getXPath(pXmlDoc, "/office:document-styles/office:styles/style:default-style[1]/style:graphic-properties"_ostr, "stroke-color"_ostr)); +} + +DECLARE_FILE_MAILMERGE_TEST(testSimpleMailMerge, "simple-mail-merge.odt", "10-testing-addresses.ods", "testing-addresses") +{ + executeMailMerge(); + for( int doc = 0; + doc < 10; + ++doc ) + { + loadMailMergeDocument( doc ); + CPPUNIT_ASSERT_EQUAL( 1, getPages()); + CPPUNIT_ASSERT_EQUAL( OUString( "Fixed text." ), getRun( getParagraph( 1 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "lastname" + OUString::number( doc + 1 )), getRun( getParagraph( 2 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "Another fixed text." ), getRun( getParagraph( 3 ), 1 )->getString()); + } +} + +DECLARE_FILE_MAILMERGE_TEST(testWriterDataSource, "writer-mail-merge.odt", "10-testing-addresses-writer.odt", "testing-addresses-writer") +{ + // This failed as the .odt data source was mapped to the jdbc: protocol. + executeMailMerge(); + for (int doc = 0; doc < 10; ++doc) + { + loadMailMergeDocument(doc); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(OUString("Fixed text."), getRun(getParagraph(1), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("lastname" + OUString::number(doc + 1)), getRun(getParagraph(2), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Another fixed text."), getRun(getParagraph(3), 1)->getString()); + } +} + +DECLARE_FILE_MAILMERGE_TEST(testWriterMergedDataSource, "writer-merged-mail-merge.odt", "10-testing-addresses-writer-merged.odt", "testing-addresses-writer-merged") +{ + // This failed with com.sun.star.lang.IndexOutOfBoundsException, leading to + // a crash, as the last row had merged cells in + // 10-testing-addresses-writer-merged.odt. + executeMailMerge(); + for (int doc = 0; doc < 10; ++doc) + { + loadMailMergeDocument(doc); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(OUString("Fixed text."), getRun(getParagraph(1), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("lastname" + OUString::number(doc + 1)), getRun(getParagraph(2), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Another fixed text."), getRun(getParagraph(3), 1)->getString()); + } +} + +DECLARE_FILE_MAILMERGE_TEST(test2Pages, "simple-mail-merge-2pages.odt", "10-testing-addresses.ods", "testing-addresses") +{ + executeMailMerge(); + for( int doc = 0; + doc < 10; + ++doc ) + { + loadMailMergeDocument( doc ); + OUString lastname = "lastname" + OUString::number( doc + 1 ); + OUString firstname = "firstname" + OUString::number( doc + 1 ); + CPPUNIT_ASSERT_EQUAL( 2, getPages()); + CPPUNIT_ASSERT_EQUAL( OUString( "Fixed text." ), getRun( getParagraph( 1 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( lastname, getRun( getParagraph( 2 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "Another fixed text." ), getRun( getParagraph( 3 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString(), getRun( getParagraph( 4 ), 1 )->getString()); // empty para at the end of page 1 + CPPUNIT_ASSERT_EQUAL( OUString( "Second page." ), getRun( getParagraph( 5 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( firstname, getRun( getParagraph( 6 ), 1 )->getString()); + // Also verify the layout. + CPPUNIT_ASSERT_EQUAL( lastname, parseDump("/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString( "Fixed text." ), parseDump("/root/page[1]/body/txt[1]"_ostr, ""_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString(), parseDump("/root/page[1]/body/txt[4]"_ostr, ""_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString( "Second page." ), parseDump("/root/page[2]/body/txt[1]"_ostr, ""_ostr)); + CPPUNIT_ASSERT_EQUAL( firstname, parseDump("/root/page[2]/body/txt[2]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + } +} + +DECLARE_SHELL_MAILMERGE_TEST(testPageBoundariesSimpleMailMerge, "simple-mail-merge.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // This is like the test above, but this one uses the create-single-document-containing-everything-generated approach, + // and verifies that boundaries of the generated sub-documents are correct inside that document. + // These boundaries are done using "documentStartPageNumber" UNO bookmarks (see also + // documentStartPageNumber() ). + executeMailMerge(); + // Here getPages() works on the source document, so get pages of the resulting one. + CPPUNIT_ASSERT(mxSwTextDocument); + CPPUNIT_ASSERT_EQUAL( sal_uInt16( 19 ), mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum()); // 10 pages, but each sub-document starts on odd page number + for( int doc = 0; + doc < 10; + ++doc ) + { + CPPUNIT_ASSERT_EQUAL( doc * 2 + 1, documentStartPageNumber( doc )); + } +} + +DECLARE_SHELL_MAILMERGE_TEST(testPageBoundaries2Pages, "simple-mail-merge-2pages.odt", "10-testing-addresses.ods", "testing-addresses") +{ + executeMailMerge(); + CPPUNIT_ASSERT(mxSwTextDocument); + CPPUNIT_ASSERT_EQUAL( sal_uInt16( 20 ), mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum()); // 20 pages, each sub-document starts on odd page number + for( int doc = 0; + doc < 10; + ++doc ) + { + CPPUNIT_ASSERT_EQUAL( doc * 2 + 1, documentStartPageNumber( doc )); + } +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf89214, "tdf89214.odt", "10-testing-addresses.ods", "testing-addresses") +{ + executeMailMerge(); + + uno::Reference xParagraph(getParagraphOrTable(3, mxSwTextDocument->getText()), uno::UNO_QUERY); + // Make sure that we assert the right paragraph. + CPPUNIT_ASSERT_EQUAL(OUString("a"), xParagraph->getString()); + // This paragraph had a bullet numbering, make sure that the list id is not empty. + CPPUNIT_ASSERT(!getProperty(xParagraph, "ListId").isEmpty()); +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf90230, "empty.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // MM of an empty document caused an assertion in the SwContentIndexReg dtor. + executeMailMerge(); +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf92623, "tdf92623.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // Copying bookmarks for MM was broken because of the StartOfContent node copy + // copied marks were off by one + executeMailMerge(); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + IDocumentMarkAccess const *pIDMA = pTextDoc->GetDocShell()->GetDoc()->getIDocumentMarkAccess(); + // There is just one mark... + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pIDMA->getAllMarksCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pIDMA->getBookmarksCount()); + IDocumentMarkAccess::const_iterator_t mark = pIDMA->getAllMarksBegin(); + // and it's a TEXT_FIELDMARK + CPPUNIT_ASSERT_EQUAL( sal_Int32(IDocumentMarkAccess::MarkType::TEXT_FIELDMARK), + sal_Int32(IDocumentMarkAccess::GetType( **mark )) ); + SwNodeOffset src_pos = (*mark)->GetMarkPos().GetNodeIndex(); + + // Get the size of the document in nodes + SwDoc *doc = pTextDoc->GetDocShell()->GetDoc(); + SwNodeOffset size = doc->GetNodes().GetEndOfContent().GetIndex() - doc->GetNodes().GetEndOfExtras().GetIndex(); + CPPUNIT_ASSERT_EQUAL( SwNodeOffset(13), size ); + size -= SwNodeOffset(2); // For common start and end nodes + + // Iterate over all field marks in the target document and check that they + // are positioned at a multitude of the document size + CPPUNIT_ASSERT(mxSwTextDocument); + pIDMA = mxSwTextDocument->GetDocShell()->GetDoc()->getIDocumentMarkAccess(); + // The target document has the duplicated amount of bookmarks + // as the helping uno bookmark from the mail merge is left in the doc + // TODO should be fixed! + CPPUNIT_ASSERT_EQUAL(sal_Int32(20), pIDMA->getAllMarksCount()); + std::set pages; + sal_Int32 countFieldMarks = 0; + for( mark = pIDMA->getAllMarksBegin(); mark != pIDMA->getAllMarksEnd(); ++mark ) + { + IDocumentMarkAccess::MarkType markType = IDocumentMarkAccess::GetType( **mark ); + if( markType == IDocumentMarkAccess::MarkType::TEXT_FIELDMARK ) + { + SwNodeOffset pos = (*mark)->GetMarkPos().GetNodeIndex() - src_pos; + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(0), pos % size); + CPPUNIT_ASSERT(pages.insert(pos).second); + countFieldMarks++; + } + else // see previous TODO + CPPUNIT_ASSERT_EQUAL( sal_Int32(IDocumentMarkAccess::MarkType::UNO_BOOKMARK), sal_Int32(markType) ); + } + CPPUNIT_ASSERT_EQUAL(sal_Int32(10), countFieldMarks); +} + +DECLARE_SHELL_MAILMERGE_TEST(testBookmarkCondition, "bookmarkcondition.fodt", "bookmarkcondition.ods", "data") +{ + executeMailMerge(); + + dumpMMLayout(); + xmlDocUniquePtr pLayout( + xmlParseMemory(reinterpret_cast(xmlBufferContent(mpXmlBuffer)), + xmlBufferLength(mpXmlBuffer))); + + // check that conditions on sections and bookmarks are evaluated the same + assertXPath(pLayout, "/root/page"_ostr, 7); + assertXPath(pLayout, "/root/page[1]/body/section"_ostr, 1); + assertXPath(pLayout, "/root/page[1]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"In den Bergen war es anstrengend."_ustr); + assertXPath(pLayout, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"Mein Urlaub war anstrengend . "_ustr); + assertXPath(pLayout, "/root/page[3]/body/section"_ostr, 1); + assertXPath(pLayout, "/root/page[3]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"In Barcelona war es schön."_ustr); + assertXPath(pLayout, "/root/page[3]/body/txt[5]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"Mein Urlaub war schön . "_ustr); + assertXPath(pLayout, "/root/page[5]/body/section"_ostr, 1); + assertXPath(pLayout, "/root/page[5]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, "In Paris war es erlebnisreich."); + assertXPath(pLayout, "/root/page[5]/body/txt[5]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"Mein Urlaub war erlebnisreich . "_ustr); + assertXPath(pLayout, "/root/page[7]/body/section"_ostr, 3); + assertXPath(pLayout, "/root/page[7]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"In den Bergen war es anstrengend."_ustr); + assertXPath(pLayout, "/root/page[7]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"In Barcelona war es schön."_ustr); + assertXPath(pLayout, "/root/page[7]/body/section[3]/txt[1]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"In Paris war es erlebnisreich."_ustr); + assertXPath(pLayout, "/root/page[7]/body/txt[5]/SwParaPortion/SwLineLayout"_ostr, "portion"_ostr, u"Mein Urlaub war anstrengend schön erlebnisreich . "_ustr); +} + +DECLARE_SHELL_MAILMERGE_TEST_SELECTION(testTdf95292, "linked-labels.odt", "10-testing-addresses.ods", "testing-addresses", 5) +{ + // A document with two labels merged with 5 datasets should result in three pages + executeMailMerge(); + + SwXTextDocument* pTextDoc = dynamic_cast( mxComponent.get() ); + CPPUNIT_ASSERT( pTextDoc ); + SwWrtShell *pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT( pWrtShell->IsLabelDoc() ); + + CPPUNIT_ASSERT( mxSwTextDocument ); + pWrtShell = mxSwTextDocument->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT( !pWrtShell->IsLabelDoc() ); + CPPUNIT_ASSERT_EQUAL( sal_uInt16( 5 ), pWrtShell->GetPhyPageNum() ); +} + +DECLARE_SHELL_MAILMERGE_TEST(test_sections_first_last, "sections_first_last.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // A document with a leading, middle and trailing section + // Originally we were losing the trailing section during merge + executeMailMerge(); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // Get the size of the document in nodes + SwDoc *pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwNodeOffset nSize = pDoc->GetNodes().GetEndOfContent().GetIndex() - pDoc->GetNodes().GetEndOfExtras().GetIndex(); + nSize -= SwNodeOffset(2); // The common start and end node + CPPUNIT_ASSERT_EQUAL( SwNodeOffset(13), nSize ); + + CPPUNIT_ASSERT(mxSwTextDocument); + + SwDoc *pDocMM = mxSwTextDocument->GetDocShell()->GetDoc(); + SwNodeOffset nSizeMM = pDocMM->GetNodes().GetEndOfContent().GetIndex() - pDocMM->GetNodes().GetEndOfExtras().GetIndex(); + nSizeMM -= SwNodeOffset(2); + CPPUNIT_ASSERT_EQUAL( SwNodeOffset(10) * nSize, nSizeMM ); + + CPPUNIT_ASSERT_EQUAL( sal_uInt16(19), pDocMM->GetDocShell()->GetWrtShell()->GetPhyPageNum() ); + + // All even pages should be empty, all sub-documents have two pages + const SwRootFrame* pLayout = pDocMM->getIDocumentLayoutAccess().GetCurrentLayout(); + const SwPageFrame* pPageFrm = static_cast( pLayout->Lower() ); + while ( pPageFrm ) + { + bool bOdd = (1 == (pPageFrm->GetPhyPageNum() % 2)); + CPPUNIT_ASSERT_EQUAL( !bOdd, pPageFrm->IsEmptyPage() ); + CPPUNIT_ASSERT_EQUAL( sal_uInt16( bOdd ? 1 : 2 ), pPageFrm->GetVirtPageNum() ); + pPageFrm = static_cast( pPageFrm->GetNext() ); + } +} + +DECLARE_FILE_MAILMERGE_TEST_COLUMN(testDirMailMerge, "simple-mail-merge.odt", "10-testing-addresses.ods", "testing-addresses", "Filename") +{ + executeMailMerge(); + for( int doc = 1; + doc <= 10; + ++doc ) + { + OUString filename = "sub/lastname" + OUString::number( doc ) + + " firstname" + OUString::number( doc ) + ".odt"; + loadMailMergeDocument( filename ); + CPPUNIT_ASSERT_EQUAL( 1, getPages()); + CPPUNIT_ASSERT_EQUAL( OUString( "Fixed text." ), getRun( getParagraph( 1 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "lastname" + OUString::number( doc )), getRun( getParagraph( 2 ), 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "Another fixed text." ), getRun( getParagraph( 3 ), 1 )->getString()); + } +} + +DECLARE_FILE_MAILMERGE_TEST(testTdf102010, "empty.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // Create "correct" automatic filename for non-user-supplied-prefix + for (auto aNamedValueIter = mMMargs.begin(); aNamedValueIter != mMMargs.end();) + { + if ( aNamedValueIter->Name == UNO_NAME_FILE_NAME_PREFIX ) + aNamedValueIter = mMMargs.erase( aNamedValueIter ); + else + { + std::cout << aNamedValueIter->Name << ": " << aNamedValueIter->Value << std::endl; + ++aNamedValueIter; + } + } + mMMargs.emplace_back( UNO_NAME_SAVE_AS_SINGLE_FILE, uno::Any( true ) ); + + // Generate correct mail merge result filename + executeMailMerge(); + // Don't overwrite previous result + executeMailMerge( true ); + loadMailMergeDocument( 1 ); +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf118113, "tdf118113.odt", "tdf118113.ods", "testing-addresses") +{ + executeMailMerge(); + + // The document contains a text box anchored to the page and a conditionally hidden + // section that is only shown for one of the 4 recipients, namely the 3rd record. + // In case the hidden section is shown, the page count is 3 for a single data entry, otherwise 1. + // Previously, the page number was calculated incorrectly which led to the + // text box being anchored to the wrong page. + + CPPUNIT_ASSERT(mxSwTextDocument); + // 3 documents with 1 page size each + 1 document with 3 pages + // + an additional page after each of the first 3 documents to make + // sure that each document starts on an odd page number + sal_uInt16 nPhysPages = mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(9), nPhysPages); + + // verify that there is a text box for each data record + uno::Reference xDraws = mxSwTextDocument->getDrawPage(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xDraws->getCount()); + + // verify the text box for each data record is anchored to the first page of the given data record's pages + std::vector expectedPageNumbers {1, 3, 5, 9}; + uno::Reference xPropertySet; + for (sal_Int32 i = 0; i < xDraws->getCount(); i++) + { + xPropertySet.set(xDraws->getByIndex(i), uno::UNO_QUERY); + + text::TextContentAnchorType nAnchorType; + CPPUNIT_ASSERT(xPropertySet->getPropertyValue( UNO_NAME_ANCHOR_TYPE ) >>= nAnchorType); + CPPUNIT_ASSERT_EQUAL( text::TextContentAnchorType_AT_PAGE, nAnchorType ); + + sal_uInt16 nAnchorPageNo = {}; + CPPUNIT_ASSERT(xPropertySet->getPropertyValue( UNO_NAME_ANCHOR_PAGE_NO ) >>= nAnchorPageNo); + + CPPUNIT_ASSERT_EQUAL(expectedPageNumbers.at(i), nAnchorPageNo); + } +} + + +namespace +{ +constexpr char const* const EmptyValuesLegacyData[][8] + = { { "Heading", "Title: ", "First Name: firstname1", "Last Name: lastname1", + "Title: First Name: firstname1", "First Name: firstname1 Last Name: lastname1", + "Title: First Name: firstname1 Last Name: lastname1", "Trailing text" }, + { "Heading", "Title: title2", "First Name: ", "Last Name: lastname2", + "Title: title2 First Name: ", "First Name: Last Name: lastname2", + "Title: title2 First Name: Last Name: lastname2", "Trailing text" }, + { "Heading", "Title: title3", "First Name: firstname3", "Last Name: ", + "Title: title3 First Name: firstname3", "First Name: firstname3 Last Name: ", + "Title: title3 First Name: firstname3 Last Name: ", "Trailing text" }, + { "Heading", "Title: ", "First Name: ", "Last Name: lastname4", + "Title: First Name: ", "First Name: Last Name: lastname4", + "Title: First Name: Last Name: lastname4", "Trailing text" }, + { "Heading", "Title: title5", "First Name: ", "Last Name: ", "Title: title5 First Name: ", + "First Name: Last Name: ", "Title: title5 First Name: Last Name: ", "Trailing text" } }; +constexpr char const* const EmptyValuesNewData[][8] + = { { "Heading", "First Name: firstname1", "Last Name: lastname1", + "Title: First Name: firstname1", "First Name: firstname1 Last Name: lastname1", + "Title: First Name: firstname1 Last Name: lastname1", "Trailing text" }, + { "Heading", "Title: title2", "Last Name: lastname2", + "Title: title2 First Name: ", "First Name: Last Name: lastname2", + "Title: title2 First Name: Last Name: lastname2", "Trailing text" }, + { "Heading", "Title: title3", "First Name: firstname3", + "Title: title3 First Name: firstname3", "First Name: firstname3 Last Name: ", + "Title: title3 First Name: firstname3 Last Name: ", "Trailing text" }, + { "Heading", "Last Name: lastname4", "First Name: Last Name: lastname4", + "Title: First Name: Last Name: lastname4", "Trailing text" }, + { "Heading", "Title: title5", "Title: title5 First Name: ", + "Title: title5 First Name: Last Name: ", "Trailing text" } }; +} + +// The following four tests (testEmptyValuesLegacyODT, testEmptyValuesNewODT, (testEmptyValuesLegacyFODT, testEmptyValuesNewFODT) +// check that for native documents without "EmptyDbFieldHidesPara" compatibility option, all paragraphs are exported visible, +// while for documents with the option enabled, the paragraphs with all Database fields having empty values are hidden. + +DECLARE_FILE_MAILMERGE_TEST(testEmptyValuesLegacyODT, "tdf35798-legacy.odt", "5-with-blanks.ods", + "names") +{ + executeMailMerge(); + for (int doc = 0; doc < 5; ++doc) + { + loadMailMergeDocument(doc); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + pDoc->RemoveInvisibleContent(); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + for (int i = 0; i < 8; ++i) + { + auto xPara = getParagraph(i+1); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + OString("in doc " + OString::number(doc) + " paragraph " + OString::number(i + 1)) + .getStr(), + OUString::createFromAscii(EmptyValuesLegacyData[doc][i]), xPara->getString()); + } + CPPUNIT_ASSERT_EQUAL(8, getParagraphs()); + } +} + +DECLARE_FILE_MAILMERGE_TEST(testEmptyValuesNewODT, "tdf35798-new.odt", "5-with-blanks.ods", + "names") +{ + executeMailMerge(); + for (int doc = 0; doc < 5; ++doc) + { + loadMailMergeDocument(doc); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + pDoc->RemoveInvisibleContent(); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + int i; + for (i = 0; i < 8; ++i) + { + const char* pExpected = EmptyValuesNewData[doc][i]; + if (!pExpected) + break; + auto xPara = getParagraph(i + 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + OString("in doc " + OString::number(doc) + " paragraph " + OString::number(i + 1)) + .getStr(), + OUString::createFromAscii(pExpected), xPara->getString()); + } + CPPUNIT_ASSERT_EQUAL(i, getParagraphs()); + } +} + +DECLARE_FILE_MAILMERGE_TEST(testEmptyValuesLegacyFODT, "tdf35798-legacy.fodt", "5-with-blanks.ods", + "names") +{ + executeMailMerge(); + for (int doc = 0; doc < 5; ++doc) + { + loadMailMergeDocument(doc); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + pDoc->RemoveInvisibleContent(); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + for (int i = 0; i < 8; ++i) + { + auto xPara = getParagraph(i + 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + OString("in doc " + OString::number(doc) + " paragraph " + OString::number(i + 1)) + .getStr(), + OUString::createFromAscii(EmptyValuesLegacyData[doc][i]), xPara->getString()); + } + CPPUNIT_ASSERT_EQUAL(8, getParagraphs()); + } +} + +DECLARE_FILE_MAILMERGE_TEST(testEmptyValuesNewFODT, "tdf35798-new.fodt", "5-with-blanks.ods", + "names") +{ + executeMailMerge(); + for (int doc = 0; doc < 5; ++doc) + { + loadMailMergeDocument(doc); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + pDoc->RemoveInvisibleContent(); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + int i; + for (i = 0; i < 8; ++i) + { + const char* pExpected = EmptyValuesNewData[doc][i]; + if (!pExpected) + break; + auto xPara = getParagraph(i + 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + OString("in doc " + OString::number(doc) + " paragraph " + OString::number(i + 1)) + .getStr(), + OUString::createFromAscii(pExpected), xPara->getString()); + } + CPPUNIT_ASSERT_EQUAL(i, getParagraphs()); + } +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf118845, "tdf118845.fodt", "4_v01.ods", "Tabelle1") +{ + executeMailMerge(); + + // Both male and female greetings were shown, thus each page had 3 paragraphs + + CPPUNIT_ASSERT(mxSwTextDocument); + sal_uInt16 nPhysPages = mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(7), nPhysPages); // 4 pages, each odd, and 3 blanks + + CPPUNIT_ASSERT_EQUAL(8, getParagraphs(mxSwTextDocument->getText())); + + uno::Reference xParagraph(getParagraphOrTable(1, mxSwTextDocument->getText()), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Dear Mrs. Mustermann1,"), xParagraph->getString()); + + xParagraph.set(getParagraphOrTable(2, mxSwTextDocument->getText()), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), xParagraph->getString()); + + xParagraph.set(getParagraphOrTable(3, mxSwTextDocument->getText()), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Dear Mr. Mustermann2,"), xParagraph->getString()); + + xParagraph.set(getParagraphOrTable(4, mxSwTextDocument->getText()), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), xParagraph->getString()); + + xParagraph.set(getParagraphOrTable(5, mxSwTextDocument->getText()), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Dear Mrs. Mustermann3,"), xParagraph->getString()); + + xParagraph.set(getParagraphOrTable(6, mxSwTextDocument->getText()), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), xParagraph->getString()); + + xParagraph.set(getParagraphOrTable(7, mxSwTextDocument->getText()), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Dear Mr. Mustermann4,"), xParagraph->getString()); + + xParagraph.set(getParagraphOrTable(8, mxSwTextDocument->getText()), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), xParagraph->getString()); +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf62364, "tdf62364.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // prepare unit test and run + executeMailMerge(); + CPPUNIT_ASSERT(mxSwTextDocument); + CPPUNIT_ASSERT_EQUAL( sal_uInt16( 19 ), mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum()); // 10 pages, but each sub-document starts on odd page number + + // check: each page (one page is one sub doc) has 4 paragraphs: + // - 1st and 2nd are regular paragraphs + // - 3rd and 4th are inside list + const bool nodeInList[4] = { false, false, true, true }; + + const auto & rNodes = mxSwTextDocument->GetDocShell()->GetDoc()->GetNodes(); + for (int pageIndex=0; pageIndex<10; pageIndex++) + { + for (int nodeIndex = 0; nodeIndex<4; nodeIndex++) + { + SwNode* aNode = rNodes[SwNodeOffset(9 + pageIndex * 4 + nodeIndex)]; + CPPUNIT_ASSERT_EQUAL(true, aNode->IsTextNode()); + + const SwTextNode* pTextNode = aNode->GetTextNode(); + CPPUNIT_ASSERT(pTextNode); + CPPUNIT_ASSERT_EQUAL(nodeInList[nodeIndex], pTextNode->GetSwAttrSet().HasItem(RES_PARATR_LIST_ID)); + } + } +} + + +CPPUNIT_PLUGIN_IMPLEMENT(); +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/mailmerge/mailmerge2.cxx b/sw/qa/extras/mailmerge/mailmerge2.cxx new file mode 100644 index 0000000000..4a58d07b4f --- /dev/null +++ b/sw/qa/extras/mailmerge/mailmerge2.cxx @@ -0,0 +1,750 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Maps database URIs to the registered database names for quick lookups + */ +typedef std::map DBuriMap; +static DBuriMap aDBuriMap; + +class MMTest2 : public SwModelTestBase +{ +public: + MMTest2(); + + virtual void tearDown() override + { + if (mxSwTextDocument.is()) + { + if (mnCurOutputType == text::MailMergeType::SHELL) + mxSwTextDocument->GetDocShell()->DoClose(); + else + mxSwTextDocument->dispose(); + } + if (mxCurResultSet.is()) + { + css::uno::Reference( + mxCurResultSet, css::uno::UNO_QUERY_THROW)->dispose(); + } + SwModelTestBase::tearDown(); + } + + /** + * Helper func used by each unit test to test the 'mail merge' code. + * + * Registers the data source, loads the original file as reference, + * initializes the mail merge job and its default argument sequence. + * + * The 'verify' method actually has to execute the mail merge by + * calling executeMailMerge() after modifying the job arguments. + */ + void executeMailMergeTest( const char* filename, const char* datasource, const char* tablename, + char const*const filter, int selection, const char* column ) + { + maMMTest2Filename = filename; + header(); + + utl::TempFileNamed aTempDir(nullptr, true); + aTempDir.EnableKillingFile(); + const OUString aWorkDir = aTempDir.GetURL(); + const OUString aURI( createFileURL(OUString::createFromAscii(datasource)) ); + const OUString aPrefix = column ? OUString::createFromAscii( column ) : "LOMM_"; + const OUString aDBName = registerDBsource( aURI, aWorkDir ); + initMailMergeJobAndArgs( filename, tablename, aDBName, aPrefix, aWorkDir, filter, selection, column != nullptr ); + + verify(); + finish(); + + mnCurOutputType = 0; + } + + OUString registerDBsource( const OUString &aURI, const OUString &aWorkDir ) + { + OUString aDBName; + DBuriMap::const_iterator pos = aDBuriMap.find( aURI ); + if (pos == aDBuriMap.end()) + { + aDBName = SwDBManager::LoadAndRegisterDataSource( aURI, &aWorkDir ); + aDBuriMap.insert( std::pair< OUString, OUString >( aURI, aDBName ) ); + std::cout << "New datasource name: '" << aDBName << "'" << std::endl; + } + else + { + aDBName = pos->second; + std::cout << "Old datasource name: '" << aDBName << "'" << std::endl; + } + CPPUNIT_ASSERT(!aDBName.isEmpty()); + return aDBName; + } + + uno::Reference< sdbc::XRowSet > getXResultFromDataset( const char* tablename, const OUString &aDBName ) + { + uno::Reference< sdbc::XRowSet > xCurResultSet; + uno::Reference< uno::XInterface > xInstance = getMultiServiceFactory()->createInstance( "com.sun.star.sdb.RowSet" ); + uno::Reference< beans::XPropertySet > xRowSetPropSet( xInstance, uno::UNO_QUERY ); + assert( xRowSetPropSet.is() && "failed to get XPropertySet interface from RowSet" ); + if (xRowSetPropSet.is()) + { + xRowSetPropSet->setPropertyValue( "DataSourceName", uno::Any( aDBName ) ); + xRowSetPropSet->setPropertyValue( "Command", uno::Any( OUString::createFromAscii(tablename) ) ); + xRowSetPropSet->setPropertyValue( "CommandType", uno::Any( sdb::CommandType::TABLE ) ); + + uno::Reference< sdbc::XRowSet > xRowSet( xInstance, uno::UNO_QUERY ); + if (xRowSet.is()) + xRowSet->execute(); // build ResultSet from properties + xCurResultSet = xRowSet; + assert( xCurResultSet.is() && "failed to build ResultSet" ); + } + return xCurResultSet; + } + + void initMailMergeJobAndArgs( const char* filename, const char* tablename, const OUString &aDBName, + const OUString &aPrefix, const OUString &aWorkDir, + char const*const filter, int nDataSets, + const bool bPrefixIsColumn ) + { + uno::Reference< task::XJob > xJob( getMultiServiceFactory()->createInstance( "com.sun.star.text.MailMerge" ), uno::UNO_QUERY_THROW ); + mxJob.set( xJob ); + + mMMargs.reserve( 15 ); + + mMMargs.emplace_back( UNO_NAME_OUTPUT_TYPE, uno::Any( filter ? text::MailMergeType::FILE : text::MailMergeType::SHELL ) ); + mMMargs.emplace_back( UNO_NAME_DOCUMENT_URL, uno::Any( + ( createFileURL(OUString::createFromAscii(filename)) ) ) ); + mMMargs.emplace_back( UNO_NAME_DATA_SOURCE_NAME, uno::Any( aDBName ) ); + mMMargs.emplace_back( UNO_NAME_OUTPUT_URL, uno::Any( aWorkDir ) ); + if (filter) + { + mMMargs.emplace_back( UNO_NAME_FILE_NAME_PREFIX, uno::Any( aPrefix ) ); + mMMargs.emplace_back(UNO_NAME_SAVE_FILTER, uno::Any(OUString::createFromAscii(filter))); + } + + if (bPrefixIsColumn) + mMMargs.emplace_back( UNO_NAME_FILE_NAME_FROM_COLUMN, uno::Any( true ) ); + + if (tablename) + { + mMMargs.emplace_back( UNO_NAME_DAD_COMMAND_TYPE, uno::Any( sdb::CommandType::TABLE ) ); + mMMargs.emplace_back( UNO_NAME_DAD_COMMAND, uno::Any( OUString::createFromAscii(tablename) ) ); + } + + if (nDataSets > 0) + { + mxCurResultSet = getXResultFromDataset( tablename, aDBName ); + uno::Reference< sdbcx::XRowLocate > xCurRowLocate( mxCurResultSet, uno::UNO_QUERY ); + mMMargs.emplace_back( UNO_NAME_RESULT_SET, uno::Any( mxCurResultSet ) ); + std::vector< uno::Any > vResult; + vResult.reserve( nDataSets ); + sal_Int32 i; + for (i = 0, mxCurResultSet->first(); i < nDataSets; i++, mxCurResultSet->next()) + { + vResult.emplace_back( xCurRowLocate->getBookmark() ); + } + mMMargs.emplace_back( UNO_NAME_SELECTION, uno::Any( comphelper::containerToSequence(vResult) ) ); + } + + } + + void executeMailMerge( bool bDontLoadResult = false ) + { + const uno::Sequence< beans::NamedValue > aSeqMailMergeArgs = comphelper::containerToSequence( mMMargs ); + uno::Any res = mxJob->execute( aSeqMailMergeArgs ); + + bool bOk = true; + bool bMMFilenameFromColumn = false; + + for (const beans::NamedValue& rArgument : aSeqMailMergeArgs) { + const OUString &rName = rArgument.Name; + const uno::Any &rValue = rArgument.Value; + + // all error checking was already done by the MM job execution + if (rName == UNO_NAME_OUTPUT_URL) + bOk &= rValue >>= msMailMergeOutputURL; + else if (rName == UNO_NAME_FILE_NAME_PREFIX) + bOk &= rValue >>= msMailMergeOutputPrefix; + else if (rName == UNO_NAME_OUTPUT_TYPE) + bOk &= rValue >>= mnCurOutputType; + else if (rName == UNO_NAME_FILE_NAME_FROM_COLUMN) + bOk &= rValue >>= bMMFilenameFromColumn; + else if (rName == UNO_NAME_DOCUMENT_URL) + bOk &= rValue >>= msMailMergeDocumentURL; + } + + CPPUNIT_ASSERT(bOk); + + // MM via UNO just works with file names. If we load the file on + // Windows before MM uses it, MM won't work, as it's already open. + // Don't move the load before the mail merge execution! + // (see gb_CppunitTest_use_instdir_configuration) + createSwDoc(maMMTest2Filename); + + if (mnCurOutputType == text::MailMergeType::SHELL) + { + uno::Reference< lang::XComponent > xTmp; + CPPUNIT_ASSERT(res >>= xTmp); + mxSwTextDocument = dynamic_cast(xTmp.get()); + CPPUNIT_ASSERT(mxSwTextDocument.is()); + } + else + { + CPPUNIT_ASSERT_EQUAL(uno::Any(true), res); + if( !bMMFilenameFromColumn && !bDontLoadResult ) + loadMailMergeDocument( 0 ); + } + } + + void loadMailMergeDocument( const OUString &filename ) + { + assert( mnCurOutputType == text::MailMergeType::FILE ); + if (mxComponent.is()) + mxComponent->dispose(); + // Output name early, so in the case of a hang, the name of the hanging input file is visible. + std::cout << filename << ","; + mnStartTime = osl_getGlobalTimer(); + mxComponent = loadFromDesktop(msMailMergeOutputURL + "/" + filename, "com.sun.star.text.TextDocument"); + discardDumpedLayout(); + calcLayout(); + } + + /** + Loads number-th document from mail merge. Requires file output from mail merge. + */ + void loadMailMergeDocument(int number, char const*const ext = ".odt") + { + OUString name; + if (!msMailMergeOutputPrefix.isEmpty()) + name = msMailMergeOutputPrefix; + else + { + INetURLObject aURLObj; + aURLObj.SetSmartProtocol( INetProtocol::File ); + aURLObj.SetSmartURL( msMailMergeDocumentURL ); + name = aURLObj.GetBase(); + } + name += OUString::number(number) + OStringToOUString(std::string_view(ext, strlen(ext)), RTL_TEXTENCODING_ASCII_US); + loadMailMergeDocument( name ); + } + + /** + Resets currently opened layout of the original template, + and creates the layout of the document with N mails inside + (result run with text::MailMergeType::SHELL) + */ + void dumpMMLayout() + { + mpXmlBuffer = xmlBufferPtr(); + dumpLayout(static_cast(mxSwTextDocument.get())); + } + +protected: + uno::Reference< css::task::XJob > mxJob; + std::vector< beans::NamedValue > mMMargs; + OUString msMailMergeDocumentURL; + OUString msMailMergeOutputURL; + OUString msMailMergeOutputPrefix; + sal_Int16 mnCurOutputType; + rtl::Reference< SwXTextDocument > mxSwTextDocument; + uno::Reference< sdbc::XRowSet > mxCurResultSet; + const char* maMMTest2Filename; +}; + +#define DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, filter, BaseClass, selection, column) \ + class TestName : public BaseClass { \ + public: \ + CPPUNIT_TEST_SUITE(TestName); \ + CPPUNIT_TEST(MailMerge); \ + CPPUNIT_TEST_SUITE_END(); \ + \ + void MailMerge() { \ + executeMailMergeTest(filename, datasource, tablename, filter, selection, column); \ + } \ + void verify() override; \ + }; \ + CPPUNIT_TEST_SUITE_REGISTRATION(TestName); \ + void TestName::verify() + +// Will generate the resulting document in mxMMDocument. +#define DECLARE_SHELL_MAILMERGE_TEST(TestName, filename, datasource, tablename) \ + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, nullptr, MMTest2, 0, nullptr) + +// Will generate documents as files, use loadMailMergeDocument(). +#define DECLARE_FILE_MAILMERGE_TEST(TestName, filename, datasource, tablename) \ + DECLARE_MAILMERGE_TEST(TestName, filename, datasource, tablename, "writer8", MMTest2, 0, nullptr) + +MMTest2::MMTest2() + : SwModelTestBase("/sw/qa/extras/mailmerge/data/", "writer8") + , mnCurOutputType(0) + , maMMTest2Filename(nullptr) +{ +} + +DECLARE_SHELL_MAILMERGE_TEST(tdf125522_shell, "tdf125522.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // prepare unit test and run + executeMailMerge(); + + // reset currently opened layout of the original template, + // and create the layout of the document with 10 mails inside + dumpMMLayout(); + + // there should be no any text frame in output + CPPUNIT_ASSERT(mxSwTextDocument); + + const auto & rNodes = mxSwTextDocument->GetDocShell()->GetDoc()->GetNodes(); + for (SwNodeOffset nodeIndex(0); nodeIndexStartOfSectionNode()) + { + CPPUNIT_ASSERT(!aNode->StartOfSectionNode()->GetFlyFormat()); + } + } +} + +DECLARE_SHELL_MAILMERGE_TEST(testTd78611_shell, "tdf78611.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // prepare unit test and run + executeMailMerge(); + + // reset currently opened layout of the original template, + // and create the layout of the document with 10 mails inside + dumpMMLayout(); + + // check: each page (one page is one sub doc) has different paragraphs and header paragraphs. + // All header paragraphs should have numbering. + + // check first page + CPPUNIT_ASSERT_EQUAL( OUString("1"), parseDump("/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString("1.1"), parseDump("/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString("1.2"), parseDump("/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + + // check some other pages + CPPUNIT_ASSERT_EQUAL( OUString("1"), parseDump("/root/page[3]/body/txt[6]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString("1.1"), parseDump("/root/page[5]/body/txt[8]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString("1.2"), parseDump("/root/page[7]/body/txt[10]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); +} + + +DECLARE_FILE_MAILMERGE_TEST(testTd78611_file, "tdf78611.odt", "10-testing-addresses.ods", "testing-addresses") +{ + executeMailMerge(true); + for (int doc = 0; doc < 10; ++doc) + { + loadMailMergeDocument( doc ); + CPPUNIT_ASSERT_EQUAL( OUString("1"), parseDump("/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString("1.1"), parseDump("/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL( OUString("1.2"), parseDump("/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + } +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf122156_shell, "linked-with-condition.odt", "5-with-blanks.ods", + "names") +{ + // A document with a linked section hidden on an "empty field" condition + // For combined documents, hidden sections are removed completely + executeMailMerge(); + CPPUNIT_ASSERT(mxSwTextDocument); + // 5 documents 1 page each, starting at odd page numbers => 9 + CPPUNIT_ASSERT_EQUAL(sal_uInt16(9), mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum()); + uno::Reference xSections(mxSwTextDocument->getTextSections(), + uno::UNO_QUERY_THROW); + // 2 out of 5 dataset records have empty "Title" field => no sections in respective documents + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xSections->getCount()); +} + +DECLARE_FILE_MAILMERGE_TEST(testTdf122156_file, "linked-with-condition.odt", "5-with-blanks.ods", + "names") +{ + // A document with a linked section hidden on an "empty field" condition + // For separate documents, the sections are removed + executeMailMerge(); + { + loadMailMergeDocument(0); + uno::Reference xSectionsSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xSections(xSectionsSupplier->getTextSections(), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xSections->getCount()); + } + { + loadMailMergeDocument(1); + uno::Reference xSectionsSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xSections(xSectionsSupplier->getTextSections(), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY_THROW); + // Record 2 has non-empty "Title" field => section is shown + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect, "IsVisible")); + } + { + loadMailMergeDocument(2); + uno::Reference xSectionsSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xSections(xSectionsSupplier->getTextSections(), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY_THROW); + // Record 3 has non-empty "Title" field => section is shown + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect, "IsVisible")); + } + { + loadMailMergeDocument(3); + uno::Reference xSectionsSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xSections(xSectionsSupplier->getTextSections(), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xSections->getCount()); + } + { + loadMailMergeDocument(4); + uno::Reference xSectionsSupplier(mxComponent, + uno::UNO_QUERY_THROW); + uno::Reference xSections(xSectionsSupplier->getTextSections(), + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY_THROW); + // Record 5 has non-empty "Title" field => section is shown + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect, "IsVisible")); + } +} + +DECLARE_SHELL_MAILMERGE_TEST(exportDirectToPDF_shell, "linked-with-condition.odt", "5-with-blanks.ods", + "names") +{ + executeMailMerge(); + + CPPUNIT_ASSERT(mxSwTextDocument.is()); + + uno::Reference xController(mxSwTextDocument->getCurrentController()); + CPPUNIT_ASSERT(xController.is()); + + uno::Reference xSupplier(xController, uno::UNO_QUERY); + CPPUNIT_ASSERT(xSupplier.is()); + + uno::Reference xPageCursor(xSupplier->getViewCursor(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPageCursor.is()); + + xPageCursor->jumpToFirstPage(); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), xPageCursor->getPage()); + + uno::Reference xFrame(xController->getFrame()); + CPPUNIT_ASSERT(xFrame.is()); + + uno::Reference xDispatchProvider(xFrame, uno::UNO_QUERY); + CPPUNIT_ASSERT(xDispatchProvider.is()); + + util::URL aURL; + aURL.Complete = ".uno:ExportDirectToPDF"; + { + uno::Reference xParser(css::util::URLTransformer::create( + comphelper::getProcessComponentContext())); + CPPUNIT_ASSERT(xParser.is()); + xParser->parseStrict(aURL); + } + + uno::Reference xDispatch = xDispatchProvider->queryDispatch(aURL, OUString(), 0); + CPPUNIT_ASSERT(xDispatch.is()); + + const OUString sExportTo(msMailMergeOutputURL + "/ExportDirectToPDF.pdf"); + uno::Sequence aArgs { + comphelper::makePropertyValue("SynchronMode", true), + comphelper::makePropertyValue("URL", sExportTo) + }; + + xDispatch->dispatch(aURL, aArgs); + CPPUNIT_ASSERT(comphelper::DirectoryHelper::fileExists(sExportTo)); + + SvFileStream aPDFFile(sExportTo, StreamMode::READ); + SvMemoryStream aMemory; + aMemory.WriteStream(aPDFFile); + std::shared_ptr pPDFium = vcl::pdf::PDFiumLibrary::get(); + if (!pPDFium) + return; + + std::unique_ptr pPdfDocument + = pPDFium->openDocument(aMemory.GetData(), aMemory.GetSize(), OString()); + CPPUNIT_ASSERT(pPdfDocument); + CPPUNIT_ASSERT_EQUAL(5, pPdfDocument->getPageCount()); + + std::unique_ptr pPdfPage = pPdfDocument->openPage(0); + CPPUNIT_ASSERT(pPdfPage); + CPPUNIT_ASSERT_EQUAL(4, pPdfPage->getObjectCount()); +} + +DECLARE_SHELL_MAILMERGE_TEST(testTdf121168, "section_ps.odt", "4_v01.ods", "Tabelle1") +{ + // A document starting with a section on a page with non-default page style with header + executeMailMerge(); + CPPUNIT_ASSERT(mxSwTextDocument); + // 4 documents 1 page each, starting at odd page numbers => 7 + CPPUNIT_ASSERT_EQUAL(sal_uInt16(7), mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum()); + + SwDoc* pDocMM = mxSwTextDocument->GetDocShell()->GetDoc(); + SwNodeOffset nSizeMM = pDocMM->GetNodes().GetEndOfContent().GetIndex() + - pDocMM->GetNodes().GetEndOfExtras().GetIndex() - 2; + CPPUNIT_ASSERT_EQUAL(SwNodeOffset(16), nSizeMM); + + // All even pages should be empty, all sub-documents have one page + const SwRootFrame* pLayout = pDocMM->getIDocumentLayoutAccess().GetCurrentLayout(); + const SwPageFrame* pPageFrm = static_cast(pLayout->Lower()); + while (pPageFrm) + { + sal_uInt16 nPageNum = pPageFrm->GetPhyPageNum(); + bool bOdd = (1 == (nPageNum % 2)); + CPPUNIT_ASSERT_EQUAL(!bOdd, pPageFrm->IsEmptyPage()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(bOdd ? 1 : 2), pPageFrm->GetVirtPageNum()); + if (bOdd) + { + const SwPageDesc* pDesc = pPageFrm->GetPageDesc(); + CPPUNIT_ASSERT_EQUAL(OUString("Teststyle" + OUString::number(nPageNum / 2 + 1)), + pDesc->GetName()); + } + pPageFrm = static_cast(pPageFrm->GetNext()); + } +} + + +DECLARE_FILE_MAILMERGE_TEST(testTdf81782_file, "tdf78611.odt", "10-testing-addresses.ods", "testing-addresses") +{ + executeMailMerge(true); + for (int doc = 0; doc < 10; ++doc) + { + loadMailMergeDocument( doc ); + + // get document properties + uno::Reference xDocumentPropertiesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDocumentProperties(xDocumentPropertiesSupplier->getDocumentProperties()); + + // check if properties were set + uno::Sequence aKeywords(xDocumentProperties->getKeywords()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aKeywords.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("one two"), aKeywords[0]); + + // check title and subject + CPPUNIT_ASSERT_EQUAL(OUString("my title"), xDocumentProperties->getTitle()); + CPPUNIT_ASSERT_EQUAL(OUString("my subject"), xDocumentProperties->getSubject()); + } +} + +// problem was: field content was duplicated & truncated +DECLARE_SHELL_MAILMERGE_TEST(testTdf81750_shell, "tdf81750.odt", "10-testing-addresses.ods", "testing-addresses") +{ + // prepare unit test and run + executeMailMerge(); + + // reset currently opened layout of the original template, + // and create the layout of the document with 10 mails inside + dumpMMLayout(); + + // check several pages page + OUString aExpected("Text: Foo "); + CPPUNIT_ASSERT_EQUAL( aExpected, parseDump("/root/page[1]/body/txt[2]"_ostr, ""_ostr)); + CPPUNIT_ASSERT_EQUAL( aExpected, parseDump("/root/page[3]/body/txt[2]"_ostr, ""_ostr)); + CPPUNIT_ASSERT_EQUAL( aExpected, parseDump("/root/page[5]/body/txt[2]"_ostr, ""_ostr)); + CPPUNIT_ASSERT_EQUAL( aExpected, parseDump("/root/page[7]/body/txt[2]"_ostr, ""_ostr)); + CPPUNIT_ASSERT_EQUAL( aExpected, parseDump("/root/page[9]/body/txt[2]"_ostr, ""_ostr)); +} + + +DECLARE_FILE_MAILMERGE_TEST(testTdf123057_file, "pagecounttest.ott", "db_pagecounttest.ods", "Sheet1") +{ + uno::Reference xSect0, xSect1; + executeMailMerge(true); + + for (int doc = 0; doc < 4; ++doc) + { + loadMailMergeDocument(doc); + + // get document properties + uno::Reference xSectionsSupplier(mxComponent, uno::UNO_QUERY_THROW); + uno::Reference xSections(xSectionsSupplier->getTextSections(), uno::UNO_QUERY_THROW); + + switch (doc) + { + case 0: + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount()); + xSect0.set(xSections->getByIndex(0), uno::UNO_QUERY_THROW); + xSect1.set(xSections->getByIndex(1), uno::UNO_QUERY_THROW); + + // both sections visible, page num is 2 + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect0, "IsVisible")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect1, "IsVisible")); + break; + case 1: + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + xSect0.set(xSections->getByIndex(0), uno::UNO_QUERY_THROW); + + // second section removed, page num is 1 + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect0, "IsVisible")); + break; + case 2: + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + xSect0.set(xSections->getByIndex(0), uno::UNO_QUERY_THROW); + + // first section removed, page num is 1 + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xSect0, "IsVisible")); + break; + case 3: + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xSections->getCount()); + // both sections removed, page num is 1 + CPPUNIT_ASSERT_EQUAL(1, getPages()); + break; + } + } +} + +// The document has a header with page number and total page count on page 2 +// (which uses page style "Default Style") but doesn't have a header set +// for the first page (which uses page style "First Page"). +// Fields in the header hadn't been replaced properly. +DECLARE_SHELL_MAILMERGE_TEST(testTdf128148, "tdf128148.odt", "4_v01.ods", "Tabelle1") +{ + executeMailMerge(); + CPPUNIT_ASSERT(mxSwTextDocument); + + // 4 documents with 2 pages each => 8 pages in total + CPPUNIT_ASSERT_EQUAL(sal_uInt16(8), mxSwTextDocument->GetDocShell()->GetWrtShell()->GetPhyPageNum()); + + SwDoc* pDocMM = mxSwTextDocument->GetDocShell()->GetDoc(); + uno::Reference xModel = mxSwTextDocument->GetDocShell()->GetBaseModel(); + uno::Reference xStyleFamiliesSupplier(xModel, uno::UNO_QUERY); + uno::Reference xStyleFamilies = xStyleFamiliesSupplier->getStyleFamilies(); + uno::Reference xStyleFamily(xStyleFamilies->getByName("PageStyles"), uno::UNO_QUERY); + + // All odd pages have no header, all even pages should have header with text "Page 2 of 2" + const SwRootFrame* pLayout = pDocMM->getIDocumentLayoutAccess().GetCurrentLayout(); + const SwPageFrame* pPageFrm = static_cast(pLayout->Lower()); + while (pPageFrm) + { + const sal_uInt16 nPageNum = pPageFrm->GetPhyPageNum(); + const bool bIsEvenPage = ((nPageNum % 2) == 0); + + const OUString& sPageStyle = pPageFrm->GetPageDesc()->GetName(); + uno::Reference xPageStyle(xStyleFamily->getByName(sPageStyle), uno::UNO_QUERY); + + bool bHeaderIsOn = false; + xPageStyle->getPropertyValue(UNO_NAME_HEADER_IS_ON) >>= bHeaderIsOn; + + // first page for every data record shouldn't have header, second should + CPPUNIT_ASSERT_EQUAL(bIsEvenPage, bHeaderIsOn); + if (bIsEvenPage) + { + // text in header on even pages with correctly replaced fields is "Page 2 of 2" + uno::Reference xHeaderText; + xPageStyle->getPropertyValue(UNO_NAME_HEADER_TEXT) >>= xHeaderText; + const OUString sHeaderText = xHeaderText->getString(); + CPPUNIT_ASSERT_EQUAL(OUString("Page 2 of 2"), sHeaderText); + } + + pPageFrm = static_cast(pPageFrm->GetNext()); + } +} + +DECLARE_MAILMERGE_TEST(testGrabBag, "grabbagtest.docx", "onecell.xlsx", "Sheet1", "MS Word 2007 XML", MMTest2, 0, nullptr) +{ + executeMailMerge(true); + + loadMailMergeDocument(0, ".docx"); + + SwXTextDocument *const pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pTextDoc->GetDocShell()->GetWrtShell()->GetPhyPageNum()); + + // check grabbag + uno::Reference const xModel( + mxComponent, uno::UNO_QUERY_THROW); + uno::Sequence aInteropGrabBag; + pTextDoc->getPropertyValue("InteropGrabBag") >>= aInteropGrabBag; + CPPUNIT_ASSERT_EQUAL(sal_Int32(12), aInteropGrabBag.getLength()); + + // check table border - comes from table style "Tabellenraster" + uno::Reference const xTable(getParagraphOrTable(1, pTextDoc->getText()), uno::UNO_QUERY_THROW); + uno::Reference const xTableProps(xTable, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(table::TableBorder( + table::BorderLine(util::Color(0), 0, 18, 0), true, + table::BorderLine(util::Color(0), 0, 18, 0), true, + table::BorderLine(util::Color(0), 0, 18, 0), true, + table::BorderLine(util::Color(0), 0, 18, 0), true, + table::BorderLine(util::Color(0), 0, 18, 0), true, + table::BorderLine(util::Color(0), 0, 0, 0), true, + sal_Int16(191), true), + getProperty(xTableProps, "TableBorder")); + + // check font is Arial - comes from theme (wrong result was "" - nothing) + uno::Reference const xCell(xTable->getCellByName("A1"), uno::UNO_QUERY_THROW); + uno::Reference const xParaA1(getParagraphOrTable(1, xCell->getText()), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Arial"), getProperty(xParaA1, "CharFontName")); +} + +namespace com::sun::star::table { + +static std::ostream& operator<<(std::ostream& rStream, table::BorderLine const& rLine) +{ + rStream << "BorderLine(" << rLine.Color << "," << rLine.InnerLineWidth << "," << rLine.OuterLineWidth << "," << rLine.LineDistance << ")"; + return rStream; +} + +static std::ostream& operator<<(std::ostream& rStream, table::TableBorder const& rBorder) +{ + rStream << "TableBorder(\n " + << rBorder.TopLine << "," << static_cast(rBorder.IsTopLineValid) << ",\n " + << rBorder.BottomLine << "," << static_cast(rBorder.IsBottomLineValid) << ",\n " + << rBorder.LeftLine << "," << static_cast(rBorder.IsLeftLineValid) << ",\n " + << rBorder.RightLine << "," << static_cast(rBorder.IsRightLineValid) << ",\n " + << rBorder.HorizontalLine << "," << static_cast(rBorder.IsHorizontalLineValid) << ",\n " + << rBorder.VerticalLine << "," << static_cast(rBorder.IsVerticalLineValid) << ",\n " + << rBorder.Distance << "," << static_cast(rBorder.IsDistanceValid) << ")"; + return rStream; +} + +} + +CPPUNIT_PLUGIN_IMPLEMENT(); +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/odfexport/data/2_MathType3.docx b/sw/qa/extras/odfexport/data/2_MathType3.docx new file mode 100644 index 0000000000..0694921b39 Binary files /dev/null and b/sw/qa/extras/odfexport/data/2_MathType3.docx differ diff --git a/sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt b/sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt new file mode 100644 index 0000000000..64d6205372 --- /dev/null +++ b/sw/qa/extras/odfexport/data/CrossRefHeadingBookmark.fodt @@ -0,0 +1,120 @@ + + + + ms 2015-08-24T21:49:45.305718699LibreOfficeDev/4.3.7.2$Linux_X86_64 LibreOffice_project/8a35821d8636a03b8bf4e15b48f59794652c68ba + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + + + cross-reference to 1.1 (Numbered paragraph - Number) and 1.1(Numbered paragraph - no context) + + + + + + + diff --git a/sw/qa/extras/odfexport/data/Custom-Style-TOC.docx b/sw/qa/extras/odfexport/data/Custom-Style-TOC.docx new file mode 100644 index 0000000000..2b4c57054f Binary files /dev/null and b/sw/qa/extras/odfexport/data/Custom-Style-TOC.docx differ diff --git a/sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt b/sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt new file mode 100644 index 0000000000..4b03bd7fd1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/Formcontrol needs high z-index.odt differ diff --git a/sw/qa/extras/odfexport/data/IsLegal.fodt b/sw/qa/extras/odfexport/data/IsLegal.fodt new file mode 100644 index 0000000000..a4af751fb1 --- /dev/null +++ b/sw/qa/extras/odfexport/data/IsLegal.fodt @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + Foo + + Bar + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/MadeByLO7.odt b/sw/qa/extras/odfexport/data/MadeByLO7.odt new file mode 100644 index 0000000000..9587fffe64 Binary files /dev/null and b/sw/qa/extras/odfexport/data/MadeByLO7.odt differ diff --git a/sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt b/sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt new file mode 100644 index 0000000000..c3a21261da --- /dev/null +++ b/sw/qa/extras/odfexport/data/ParagraphMarkerMarkup.fodt @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + text + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/WordTest_edit.odt b/sw/qa/extras/odfexport/data/WordTest_edit.odt new file mode 100644 index 0000000000..4c14295e93 Binary files /dev/null and b/sw/qa/extras/odfexport/data/WordTest_edit.odt differ diff --git a/sw/qa/extras/odfexport/data/allow-overlap.odt b/sw/qa/extras/odfexport/data/allow-overlap.odt new file mode 100644 index 0000000000..b23f5b360b Binary files /dev/null and b/sw/qa/extras/odfexport/data/allow-overlap.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero-numbering.odt new file mode 100644 index 0000000000..2a445b2274 Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt new file mode 100644 index 0000000000..0bdca270ee Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt new file mode 100644 index 0000000000..2eb9b49ced Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero4-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt new file mode 100644 index 0000000000..3526ee8d70 Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero5-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/border_types.odt b/sw/qa/extras/odfexport/data/border_types.odt new file mode 100644 index 0000000000..97b72436f0 Binary files /dev/null and b/sw/qa/extras/odfexport/data/border_types.odt differ diff --git a/sw/qa/extras/odfexport/data/btlr-cell.odt b/sw/qa/extras/odfexport/data/btlr-cell.odt new file mode 100644 index 0000000000..c010fa9f51 Binary files /dev/null and b/sw/qa/extras/odfexport/data/btlr-cell.odt differ diff --git a/sw/qa/extras/odfexport/data/btlr-frame.odt b/sw/qa/extras/odfexport/data/btlr-frame.odt new file mode 100644 index 0000000000..31cb03849c Binary files /dev/null and b/sw/qa/extras/odfexport/data/btlr-frame.odt differ diff --git a/sw/qa/extras/odfexport/data/chapter-number-new-line.odt b/sw/qa/extras/odfexport/data/chapter-number-new-line.odt new file mode 100644 index 0000000000..68a427f72e Binary files /dev/null and b/sw/qa/extras/odfexport/data/chapter-number-new-line.odt differ diff --git a/sw/qa/extras/odfexport/data/charborder.odt b/sw/qa/extras/odfexport/data/charborder.odt new file mode 100644 index 0000000000..0d4d50691a Binary files /dev/null and b/sw/qa/extras/odfexport/data/charborder.odt differ diff --git a/sw/qa/extras/odfexport/data/embedded-font-props.odt b/sw/qa/extras/odfexport/data/embedded-font-props.odt new file mode 100644 index 0000000000..6eb073e29f Binary files /dev/null and b/sw/qa/extras/odfexport/data/embedded-font-props.odt differ diff --git a/sw/qa/extras/odfexport/data/embedded-pdf.odt b/sw/qa/extras/odfexport/data/embedded-pdf.odt new file mode 100644 index 0000000000..3adb4cf11d Binary files /dev/null and b/sw/qa/extras/odfexport/data/embedded-pdf.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo38244.odt b/sw/qa/extras/odfexport/data/fdo38244.odt new file mode 100644 index 0000000000..0fcc168a8b Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo38244.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo43807.odt b/sw/qa/extras/odfexport/data/fdo43807.odt new file mode 100644 index 0000000000..ae03c59043 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo43807.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo58949.docx b/sw/qa/extras/odfexport/data/fdo58949.docx new file mode 100644 index 0000000000..d8f568b16c Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo58949.docx differ diff --git a/sw/qa/extras/odfexport/data/fdo60769.odt b/sw/qa/extras/odfexport/data/fdo60769.odt new file mode 100644 index 0000000000..b3c39376b8 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo60769.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo79358.odt b/sw/qa/extras/odfexport/data/fdo79358.odt new file mode 100644 index 0000000000..a1d2572a6d Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo79358.odt differ diff --git a/sw/qa/extras/odfexport/data/fdo86963.odt b/sw/qa/extras/odfexport/data/fdo86963.odt new file mode 100644 index 0000000000..72896e1399 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fdo86963.odt differ diff --git a/sw/qa/extras/odfexport/data/fillbitmap3.odt b/sw/qa/extras/odfexport/data/fillbitmap3.odt new file mode 100644 index 0000000000..90308a5ec4 Binary files /dev/null and b/sw/qa/extras/odfexport/data/fillbitmap3.odt differ diff --git a/sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt b/sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt new file mode 100644 index 0000000000..b991033485 --- /dev/null +++ b/sw/qa/extras/odfexport/data/footnote-collect-at-end-of-section.fodt @@ -0,0 +1,192 @@ + + + + 2019-10-21T13:59:35.8473398492019-10-21T14:28:45.221080424PT23M48S2LibreOffice_powered_by_CIBDev/6.1.7.5$Linux_X86_64 LibreOffice_project/3ab5486449d1f3ca0247a9c133da746401c57e28 + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2019-10-21T14:28:28 + + 2 + two3 + three + + + + + 1 + one2 + two + + + 1 + one2 + four + + + + + diff --git a/sw/qa/extras/odfexport/data/framebackgrounds.odt b/sw/qa/extras/odfexport/data/framebackgrounds.odt new file mode 100644 index 0000000000..9ad338c2d1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/framebackgrounds.odt differ diff --git a/sw/qa/extras/odfexport/data/gerrit13858.odt b/sw/qa/extras/odfexport/data/gerrit13858.odt new file mode 100644 index 0000000000..9b3dd37ff1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/gerrit13858.odt differ diff --git a/sw/qa/extras/odfexport/data/gutter-left.odt b/sw/qa/extras/odfexport/data/gutter-left.odt new file mode 100644 index 0000000000..a047ecaa33 Binary files /dev/null and b/sw/qa/extras/odfexport/data/gutter-left.odt differ diff --git a/sw/qa/extras/odfexport/data/image-mimetype.odt b/sw/qa/extras/odfexport/data/image-mimetype.odt new file mode 100644 index 0000000000..4c4924a1b2 Binary files /dev/null and b/sw/qa/extras/odfexport/data/image-mimetype.odt differ diff --git a/sw/qa/extras/odfexport/data/listformat.docx b/sw/qa/extras/odfexport/data/listformat.docx new file mode 100644 index 0000000000..338678d82d Binary files /dev/null and b/sw/qa/extras/odfexport/data/listformat.docx differ diff --git a/sw/qa/extras/odfexport/data/listformat.odt b/sw/qa/extras/odfexport/data/listformat.odt new file mode 100644 index 0000000000..ec3992c8fd Binary files /dev/null and b/sw/qa/extras/odfexport/data/listformat.odt differ diff --git a/sw/qa/extras/odfexport/data/nestedTableInFooter.odt b/sw/qa/extras/odfexport/data/nestedTableInFooter.odt new file mode 100644 index 0000000000..0356f04ee1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/nestedTableInFooter.odt differ diff --git a/sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt b/sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt new file mode 100644 index 0000000000..aae70e1063 Binary files /dev/null and b/sw/qa/extras/odfexport/data/ooo321_stylepagenumber.odt differ diff --git a/sw/qa/extras/odfexport/data/oooxml_embedded.sxw b/sw/qa/extras/odfexport/data/oooxml_embedded.sxw new file mode 100644 index 0000000000..e4fe14aef5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/oooxml_embedded.sxw differ diff --git a/sw/qa/extras/odfexport/data/page-content-bottom.odt b/sw/qa/extras/odfexport/data/page-content-bottom.odt new file mode 100644 index 0000000000..263ca7df40 Binary files /dev/null and b/sw/qa/extras/odfexport/data/page-content-bottom.odt differ diff --git a/sw/qa/extras/odfexport/data/page-content-top.odt b/sw/qa/extras/odfexport/data/page-content-top.odt new file mode 100644 index 0000000000..755d50242e Binary files /dev/null and b/sw/qa/extras/odfexport/data/page-content-top.odt differ diff --git a/sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt b/sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt new file mode 100644 index 0000000000..c8b3c3fdd0 Binary files /dev/null and b/sw/qa/extras/odfexport/data/pagestyle_background_lo64.odt differ diff --git a/sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt b/sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt new file mode 100644 index 0000000000..eb8b4a0e72 Binary files /dev/null and b/sw/qa/extras/odfexport/data/pagestyle_background_lo70.odt differ diff --git a/sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt b/sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt new file mode 100644 index 0000000000..92098d0bcf Binary files /dev/null and b/sw/qa/extras/odfexport/data/pagestyle_background_ooo33.odt differ diff --git a/sw/qa/extras/odfexport/data/protection-key.fodt b/sw/qa/extras/odfexport/data/protection-key.fodt new file mode 100644 index 0000000000..cd4cde9623 --- /dev/null +++ b/sw/qa/extras/odfexport/data/protection-key.fodt @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/qrcode-properties.odt b/sw/qa/extras/odfexport/data/qrcode-properties.odt new file mode 100644 index 0000000000..2de59b0414 Binary files /dev/null and b/sw/qa/extras/odfexport/data/qrcode-properties.odt differ diff --git a/sw/qa/extras/odfexport/data/redlineTextFrame.odt b/sw/qa/extras/odfexport/data/redlineTextFrame.odt new file mode 100644 index 0000000000..0986c3792f Binary files /dev/null and b/sw/qa/extras/odfexport/data/redlineTextFrame.odt differ diff --git a/sw/qa/extras/odfexport/data/referencelanguage.odt b/sw/qa/extras/odfexport/data/referencelanguage.odt new file mode 100644 index 0000000000..9614bb3e31 Binary files /dev/null and b/sw/qa/extras/odfexport/data/referencelanguage.odt differ diff --git a/sw/qa/extras/odfexport/data/relh-page-tdf80282.odt b/sw/qa/extras/odfexport/data/relh-page-tdf80282.odt new file mode 100644 index 0000000000..6b3c583d36 Binary files /dev/null and b/sw/qa/extras/odfexport/data/relh-page-tdf80282.odt differ diff --git a/sw/qa/extras/odfexport/data/relh-page.odt b/sw/qa/extras/odfexport/data/relh-page.odt new file mode 100644 index 0000000000..2dcf641243 Binary files /dev/null and b/sw/qa/extras/odfexport/data/relh-page.odt differ diff --git a/sw/qa/extras/odfexport/data/relw-page.odt b/sw/qa/extras/odfexport/data/relw-page.odt new file mode 100644 index 0000000000..047d91e876 Binary files /dev/null and b/sw/qa/extras/odfexport/data/relw-page.odt differ diff --git a/sw/qa/extras/odfexport/data/resolved-comment.odt b/sw/qa/extras/odfexport/data/resolved-comment.odt new file mode 100644 index 0000000000..e136cac3d8 Binary files /dev/null and b/sw/qa/extras/odfexport/data/resolved-comment.odt differ diff --git a/sw/qa/extras/odfexport/data/rovas-numbering.odt b/sw/qa/extras/odfexport/data/rovas-numbering.odt new file mode 100644 index 0000000000..72cb8895a9 Binary files /dev/null and b/sw/qa/extras/odfexport/data/rovas-numbering.odt differ diff --git a/sw/qa/extras/odfexport/data/ruby-position.odt b/sw/qa/extras/odfexport/data/ruby-position.odt new file mode 100644 index 0000000000..7086144bf1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/ruby-position.odt differ diff --git a/sw/qa/extras/odfexport/data/section-columns-separator.fodt b/sw/qa/extras/odfexport/data/section-columns-separator.fodt new file mode 100644 index 0000000000..b9c97eb9e3 --- /dev/null +++ b/sw/qa/extras/odfexport/data/section-columns-separator.fodt @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum consequat mi quis pretium semper. Proin luctus orci ac neque venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cursus egestas. Donec blandit auctor arcu, nec pellentesque eros molestie eget. In consectetur aliquam hendrerit. Sed cursus mauris vitae ligula pellentesque, non pellentesque urna aliquet. Fusce placerat mauris enim, nec rutrum purus semper vel. Praesent tincidunt neque eu pellentesque pharetra. Fusce pellentesque est orci. + Integer sodales tincidunt tristique. Sed a metus posuere, adipiscing nunc et, viverra odio. Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. Cras sodales nisl sed orci mattis iaculis. Nunc eget dolor accumsan, pharetra risus a, vestibulum mauris. Nunc vulputate lobortis mollis. Vivamus nec tellus faucibus, tempor magna nec, facilisis felis. Donec commodo enim a vehicula pellentesque. Nullam vehicula vestibulum est vel ultricies. + Aliquam velit massa, laoreet vel leo nec, volutpat facilisis eros. Donec consequat arcu ut diam tempor luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent vitae lacus vel leo sodales pharetra a a nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam luctus tempus nibh, fringilla dictum augue consectetur eget. Curabitur at ante sit amet tortor pharetra molestie eu nec ante. Mauris tincidunt, nibh eu sollicitudin molestie, dolor sapien congue tortor, a pulvinar sapien turpis sed ante. Donec nec est elementum, euismod nulla in, mollis nunc. + + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/sender-initials.fodt b/sw/qa/extras/odfexport/data/sender-initials.fodt new file mode 100644 index 0000000000..b8a5c1e670 --- /dev/null +++ b/sw/qa/extras/odfexport/data/sender-initials.fodt @@ -0,0 +1,71 @@ + + + + ms 2015-08-24T21:49:45.305718699LibreOfficeDev/4.3.7.2$Linux_X86_64 LibreOffice_project/8a35821d8636a03b8bf4e15b48f59794652c68ba + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + I2018-05-08T11:09:30.015915376barFoo + + I2018-05-08T11:09:30.015915376barFoo + + I2018-05-08T11:09:30.015915376barFoo + + + I + + + + I + + + + + diff --git a/sw/qa/extras/odfexport/data/sha1_correct.odt b/sw/qa/extras/odfexport/data/sha1_correct.odt new file mode 100644 index 0000000000..01cbb0a073 Binary files /dev/null and b/sw/qa/extras/odfexport/data/sha1_correct.odt differ diff --git a/sw/qa/extras/odfexport/data/sha1_wrong.odt b/sw/qa/extras/odfexport/data/sha1_wrong.odt new file mode 100644 index 0000000000..94032025b3 Binary files /dev/null and b/sw/qa/extras/odfexport/data/sha1_wrong.odt differ diff --git a/sw/qa/extras/odfexport/data/shape-relsize.odt b/sw/qa/extras/odfexport/data/shape-relsize.odt new file mode 100644 index 0000000000..05a3ffa591 Binary files /dev/null and b/sw/qa/extras/odfexport/data/shape-relsize.odt differ diff --git a/sw/qa/extras/odfexport/data/shape-with-hyperlink.odt b/sw/qa/extras/odfexport/data/shape-with-hyperlink.odt new file mode 100644 index 0000000000..7b11278284 Binary files /dev/null and b/sw/qa/extras/odfexport/data/shape-with-hyperlink.odt differ diff --git a/sw/qa/extras/odfexport/data/shapes-hyperlink.odt b/sw/qa/extras/odfexport/data/shapes-hyperlink.odt new file mode 100644 index 0000000000..f8f4e15565 Binary files /dev/null and b/sw/qa/extras/odfexport/data/shapes-hyperlink.odt differ diff --git a/sw/qa/extras/odfexport/data/signatureline-properties.fodt b/sw/qa/extras/odfexport/data/signatureline-properties.fodt new file mode 100644 index 0000000000..ddceff9f35 --- /dev/null +++ b/sw/qa/extras/odfexport/data/signatureline-properties.fodt @@ -0,0 +1,596 @@ + + + + 2017-12-11T16:12:21.9478635282017-12-11T16:12:44.952307632PT27S1LibreOfficeDev/6.1.0.0.alpha0$Linux_X86_64 LibreOffice_project/f694d0c29b4f38b6c40850c61ec6aeac3969fd88 + + + 0 + 0 + 47891 + 23206 + true + false + + + view2 + 21447 + 2501 + 0 + 0 + 47890 + 23204 + 0 + 1 + false + 100 + false + false + + + + + false + + false + false + false + false + false + true + true + false + true + true + false + + true + + false + false + true + false + false + 855097 + false + false + true + true + false + false + true + true + true + true + true + true + false + false + 1 + true + false + + false + false + + false + false + false + + false + 0 + 0 + false + + false + true + false + false + false + false + false + true + false + false + false + true + 1224071 + true + false + false + false + false + high-resolution + true + true + true + false + false + false + false + false + false + false + false + false + true + false + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+ + PHN2ZyB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5z + OmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnJkZj0iaHR0cDov + L3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c3ZnPSJodHRw + Oi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAv + c3ZnIiB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9E + VEQvc29kaXBvZGktMC5kdGQiIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBl + Lm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIiB2ZXJzaW9uPSIxLjIiIHdpZHRoPSI5MG1tIiBo + ZWlnaHQ9IjQ1bW0iIHZpZXdCb3g9IjAgMCA5MDAwIDQ1MDAiIHByZXNlcnZlQXNwZWN0UmF0 + aW89InhNaWRZTWlkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS13aWR0aD0iMjguMjIy + IiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB4bWw6c3BhY2U9InByZXNlcnZlIiBpZD0ic3Zn + NTc3IiBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjIgKDVjM2U4MGQsIDIwMTctMDgtMDYpIj48 + bWV0YWRhdGEgaWQ9Im1ldGFkYXRhNTgxIj48cmRmOlJERj48Y2M6V29yayByZGY6YWJvdXQ9 + IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUgcmRmOnJl + c291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIvPjxkYzp0 + aXRsZS8+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxzb2RpcG9kaTpuYW1lZHZp + ZXcgcGFnZWNvbG9yPSIjZmZmZmZmIiBib3JkZXJjb2xvcj0iIzY2NjY2NiIgYm9yZGVyb3Bh + Y2l0eT0iMSIgb2JqZWN0dG9sZXJhbmNlPSIxMCIgZ3JpZHRvbGVyYW5jZT0iMTAiIGd1aWRl + dG9sZXJhbmNlPSIxMCIgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiIGlua3NjYXBlOnBhZ2Vz + aGFkb3c9IjIiIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTg2MyIgaW5rc2NhcGU6d2luZG93 + LWhlaWdodD0iMTA1NiIgaWQ9Im5hbWVkdmlldzU3OSIgc2hvd2dyaWQ9ImZhbHNlIiBpbmtz + Y2FwZTp6b29tPSIwLjkwMjUyMzE1IiBpbmtzY2FwZTpjeD0iMTcwLjA3ODc0IiBpbmtzY2Fw + ZTpjeT0iODUuMDM5MzciIGlua3NjYXBlOndpbmRvdy14PSI1NyIgaW5rc2NhcGU6d2luZG93 + LXk9IjI0IiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjdXJyZW50 + LWxheWVyPSJzdmc1NzciIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9ImZhbHNlIi8+PGRl + ZnMgY2xhc3M9IkNsaXBQYXRoR3JvdXAiIGlkPSJkZWZzOCI+PGNsaXBQYXRoIGlkPSJwcmVz + ZW50YXRpb25fY2xpcF9wYXRoIiBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHJl + Y3QgeD0iMCIgeT0iMCIgd2lkdGg9IjkwMDAiIGhlaWdodD0iNDUwMCIgaWQ9InJlY3QyIi8+ + PC9jbGlwUGF0aD48L2RlZnM+PGRlZnMgaWQ9ImRlZnM0OSIvPjxkZWZzIGlkPSJkZWZzODYi + Lz48ZGVmcyBjbGFzcz0iVGV4dFNoYXBlSW5kZXgiIGlkPSJkZWZzOTAiLz48ZGVmcyBjbGFz + cz0iRW1iZWRkZWRCdWxsZXRDaGFycyIgaWQ9ImRlZnMxMjIiLz48ZGVmcyBjbGFzcz0iVGV4 + dEVtYmVkZGVkQml0bWFwcyIgaWQ9ImRlZnMxMjQiLz48ZyBpZD0iZzEyOSI+PGcgaWQ9Imlk + MiIgY2xhc3M9Ik1hc3Rlcl9TbGlkZSI+PGcgaWQ9ImJnLWlkMiIgY2xhc3M9IkJhY2tncm91 + bmQiLz48ZyBpZD0iYm8taWQyIiBjbGFzcz0iQmFja2dyb3VuZE9iamVjdHMiLz48L2c+PC9n + PjxnIGNsYXNzPSJTbGlkZUdyb3VwIiBpZD0iZzU3NSI+PGcgaWQ9Imc1NzMiPjxnIGlkPSJj + b250YWluZXItaWQxIj48ZyBpZD0iaWQxIiBjbGFzcz0iU2xpZGUiIGNsaXAtcGF0aD0idXJs + KCNwcmVzZW50YXRpb25fY2xpcF9wYXRoKSI+PGcgY2xhc3M9IlBhZ2UiIGlkPSJnNTY5Ij48 + ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcuTGluZVNoYXBlIiBpZD0iZzE1NCI+PGcg + aWQ9ImlkMyI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBzdHJva2U9Im5vbmUiIGZpbGw9 + Im5vbmUiIHg9Ii0yNyIgeT0iMjM3MyIgd2lkdGg9IjkwNTUiIGhlaWdodD0iNTUiIGlkPSJy + ZWN0MTMxIi8+PGRlc2MgaWQ9ImRlc2MxMzMiPjE1MDwvZGVzYz48ZGVzYyBpZD0iZGVzYzEz + NSI+MTM5PC9kZXNjPjxkZXNjIGlkPSJkZXNjMTM3Ij4xMzI8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MxMzkiPjUxMjogWFBBVEhTVFJPS0VfU0VRX0JFR0lOPC9kZXNjPjxkZXNjIGlkPSJkZXNj + MTQxIj4xMzI8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MxNDMiPjEzMzwvZGVzYz48ZGVzYyBpZD0i + ZGVzYzE0NSI+MTA5PC9kZXNjPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0icmdiKDAsMCww + KSIgc3Ryb2tlLXdpZHRoPSI1MyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTSAwLDI0 + MDAgTCA5MDAwLDI0MDAiIGlkPSJwYXRoMTQ3Ii8+PGRlc2MgaWQ9ImRlc2MxNDkiPjUxMjog + WFBBVEhTVFJPS0VfU0VRX0VORDwvZGVzYz48ZGVzYyBpZD0iZGVzYzE1MSI+MTQwPC9kZXNj + PjwvZz48L2c+PGcgY2xhc3M9ImNvbS5zdW4uc3Rhci5kcmF3aW5nLkNsb3NlZEJlemllclNo + YXBlIiBpZD0iZzE3MyI+PGcgaWQ9ImlkNCI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBz + dHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjMwMSIgeT0iMTQwMCIgd2lkdGg9IjgwMSIg + aGVpZ2h0PSI4MDEiIGlkPSJyZWN0MTU2Ii8+PGRlc2MgaWQ9ImRlc2MxNTgiPjE1MDwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzE2MCI+MTM5PC9kZXNjPjxkZXNjIGlkPSJkZXNjMTYyIj4xMzM8 + L2Rlc2M+PGRlc2MgaWQ9ImRlc2MxNjQiPjEzMjwvZGVzYz48ZGVzYyBpZD0iZGVzYzE2NiI+ + MTExPC9kZXNjPjxwYXRoIGZpbGw9InJnYigwLDAsMCkiIHN0cm9rZT0ibm9uZSIgZD0iTSA5 + NjksMjIwMCBDIDg4MCwyMDgzIDc5MiwxOTY3IDcwNCwxODUwIDYxNCwxOTY3IDUyMywyMDgz + IDQzMywyMjAwIDM4OSwyMjAwIDM0NSwyMjAwIDMwMSwyMjAwIDQxMywyMDYxIDUyNSwxOTIz + IDYzNywxNzg0IDUzMywxNjU2IDQzMCwxNTI4IDMyNywxNDAwIDM3MSwxNDAwIDQxNSwxNDAw + IDQ1OSwxNDAwIDU0MSwxNTA1IDYyMywxNjA5IDcwNCwxNzE0IDc4NCwxNjA5IDg2MywxNTA1 + IDk0MywxNDAwIDk4NywxNDAwIDEwMzEsMTQwMCAxMDc1LDE0MDAgOTc1LDE1MjcgODc0LDE2 + NTMgNzczLDE3ODAgODgyLDE5MjAgOTkyLDIwNjAgMTEwMSwyMjAwIDEwNTcsMjIwMCAxMDEz + LDIyMDAgOTY5LDIyMDAgWiIgaWQ9InBhdGgxNjgiLz48ZGVzYyBpZD0iZGVzYzE3MCI+MTQw + PC9kZXNjPjwvZz48L2c+PGcgY2xhc3M9ImNvbS5zdW4uc3Rhci5kcmF3aW5nLlRleHRTaGFw + ZSIgaWQ9ImcyMzYiPjxnIGlkPSJpZDUiPjxyZWN0IGNsYXNzPSJCb3VuZGluZ0JveCIgc3Ry + b2tlPSJub25lIiBmaWxsPSJub25lIiB4PSIxMzAwIiB5PSIxNTAwIiB3aWR0aD0iODAwMSIg + aGVpZ2h0PSI5MjUiIGlkPSJyZWN0MTc1Ii8+PGRlc2MgaWQ9ImRlc2MxNzciPjE1MDwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzE3OSI+NTEyOiBYVEVYVF9QQUlOVFNIQVBFX0JFR0lOPC9kZXNj + Pjx0ZXh0IGNsYXNzPSJUZXh0U2hhcGUiIGlkPSJ0ZXh0MjMzIj48ZGVzYyBjbGFzcz0iUGFy + YWdyYXBoIiBpZD0iZGVzYzE4MSIvPjx0c3BhbiBjbGFzcz0iVGV4dFBhcmFncmFwaCIgZm9u + dC1mYW1pbHk9IkxpYmVyYXRpb24gU2Fucywgc2Fucy1zZXJpZiIgZm9udC1zaXplPSI2MDBw + eCIgZm9udC13ZWlnaHQ9IjQwMCIgaWQ9InRzcGFuMjMxIj48ZGVzYyBpZD0iZGVzYzE4MyI+ + MTM4PC9kZXNjPjxkZXNjIGlkPSJkZXNjMTg1Ij4xMzY8L2Rlc2M+PGRlc2MgaWQ9ImRlc2Mx + ODciPjEzNTwvZGVzYz48ZGVzYyBpZD0iZGVzYzE4OSI+MTM0PC9kZXNjPjxkZXNjIGlkPSJk + ZXNjMTkxIj4xMTM8L2Rlc2M+PGRlc2MgY2xhc3M9IlRleHRQb3J0aW9uIiBpZD0iZGVzYzE5 + MyI+dHlwZTogVGV4dDsgY29udGVudDogOyA8L2Rlc2M+PHRzcGFuIGNsYXNzPSJUZXh0UG9z + aXRpb24iIHg9IjE1NTAiIHk9IjIxNzEiIGlkPSJ0c3BhbjIyOSI+PHRzcGFuIGZpbGw9InJn + YigwLDAsMCkiIHN0cm9rZT0ibm9uZSIgaWQ9InRzcGFuMTk1Ij48L3RzcGFuPjxkZXNjIGlk + PSJkZXNjMTk3Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzE5OSI+NTEy + OiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyMDEiPjUxMjogWFRFWFRfRU9XPC9k + ZXNjPjxkZXNjIGlkPSJkZXNjMjAzIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0i + ZGVzYzIwNSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyMDciPjUxMjog + WFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjA5Ij41MTI6IFhURVhUX0VPQzwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzIxMSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MyMTMiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjE1Ij41MTI6IFhU + RVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzIxNyI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+ + PGRlc2MgaWQ9ImRlc2MyMTkiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNj + MjIxIj41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzIyMyI+NTEyOiBYVEVY + VF9FT0w8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyMjUiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxk + ZXNjIGlkPSJkZXNjMjI3Ij41MTI6IFhURVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNw + YW4+PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdp + bmcuVGV4dFNoYXBlIiBpZD0iZzMwMyI+PGcgaWQ9ImlkNiI+PHJlY3QgY2xhc3M9IkJvdW5k + aW5nQm94IiBzdHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjEwMCIgeT0iMjUwMCIgd2lk + dGg9Ijg5MDEiIGhlaWdodD0iNzI2IiBpZD0icmVjdDIzOCIvPjxkZXNjIGlkPSJkZXNjMjQw + Ij4xNTA8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNDIiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9C + RUdJTjwvZGVzYz48dGV4dCBjbGFzcz0iVGV4dFNoYXBlIiBpZD0idGV4dDMwMCI+PGRlc2Mg + Y2xhc3M9IlBhcmFncmFwaCIgaWQ9ImRlc2MyNDQiLz48dHNwYW4gY2xhc3M9IlRleHRQYXJh + Z3JhcGgiIGZvbnQtZmFtaWx5PSJMaWJlcmF0aW9uIFNhbnMsIHNhbnMtc2VyaWYiIGZvbnQt + c2l6ZT0iNDIzcHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGlkPSJ0c3BhbjI5OCI+PGRlc2MgaWQ9 + ImRlc2MyNDYiPjEzODwvZGVzYz48ZGVzYyBpZD0iZGVzYzI0OCI+MTM2PC9kZXNjPjxkZXNj + IGlkPSJkZXNjMjUwIj4xMzU8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNTIiPjEzNDwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzI1NCI+MTEzPC9kZXNjPjxkZXNjIGNsYXNzPSJUZXh0UG9ydGlvbiIg + aWQ9ImRlc2MyNTYiPnR5cGU6IFRleHQ7IGNvbnRlbnQ6IEpvaG4gRG9lOyA8L2Rlc2M+PHRz + cGFuIGNsYXNzPSJUZXh0UG9zaXRpb24iIHg9IjM1MCIgeT0iMzAxMCIgaWQ9InRzcGFuMjk2 + Ij48dHNwYW4gZmlsbD0icmdiKDAsMCwwKSIgc3Ryb2tlPSJub25lIiBpZD0idHNwYW4yNTgi + PkpvaG4gRG9lPC90c3Bhbj48ZGVzYyBpZD0iZGVzYzI2MCI+NTEyOiBYVEVYVF9FT0M8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2MyNjIiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJk + ZXNjMjY0Ij41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzI2NiI+NTEyOiBY + VEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNjgiPjUxMjogWFRFWFRfRU9DPC9kZXNj + PjxkZXNjIGlkPSJkZXNjMjcwIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVz + YzI3MiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyNzQiPjUxMjogWFRF + WFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjc2Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzI3OCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2My + ODAiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjgyIj41MTI6IFhURVhU + X0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzI4NCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRl + c2MgaWQ9ImRlc2MyODYiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMjg4 + Ij41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzI5MCI+NTEyOiBYVEVYVF9F + T0w8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MyOTIiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxkZXNj + IGlkPSJkZXNjMjk0Ij41MTI6IFhURVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNwYW4+ + PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcu + VGV4dFNoYXBlIiBpZD0iZzM3MiI+PGcgaWQ9ImlkNyI+PHJlY3QgY2xhc3M9IkJvdW5kaW5n + Qm94IiBzdHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjEwMCIgeT0iMzA3NSIgd2lkdGg9 + Ijg5MDEiIGhlaWdodD0iNzI2IiBpZD0icmVjdDMwNSIvPjxkZXNjIGlkPSJkZXNjMzA3Ij4x + NTA8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzMDkiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9CRUdJ + TjwvZGVzYz48dGV4dCBjbGFzcz0iVGV4dFNoYXBlIiBpZD0idGV4dDM2OSI+PGRlc2MgY2xh + c3M9IlBhcmFncmFwaCIgaWQ9ImRlc2MzMTEiLz48dHNwYW4gY2xhc3M9IlRleHRQYXJhZ3Jh + cGgiIGZvbnQtZmFtaWx5PSJMaWJlcmF0aW9uIFNhbnMsIHNhbnMtc2VyaWYiIGZvbnQtc2l6 + ZT0iNDIzcHgiIGZvbnQtd2VpZ2h0PSI0MDAiIGlkPSJ0c3BhbjM2NyI+PGRlc2MgaWQ9ImRl + c2MzMTMiPjEzODwvZGVzYz48ZGVzYyBpZD0iZGVzYzMxNSI+MTM2PC9kZXNjPjxkZXNjIGlk + PSJkZXNjMzE3Ij4xMzU8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzMTkiPjEzNDwvZGVzYz48ZGVz + YyBpZD0iZGVzYzMyMSI+MTEzPC9kZXNjPjxkZXNjIGNsYXNzPSJUZXh0UG9ydGlvbiIgaWQ9 + ImRlc2MzMjMiPnR5cGU6IFRleHQ7IGNvbnRlbnQ6IEZhcm1lcjsgPC9kZXNjPjx0c3BhbiBj + bGFzcz0iVGV4dFBvc2l0aW9uIiB4PSIzNTAiIHk9IjM1ODUiIGlkPSJ0c3BhbjM2NSI+PHRz + cGFuIGZpbGw9InJnYigwLDAsMCkiIHN0cm9rZT0ibm9uZSIgaWQ9InRzcGFuMzI1Ij5GYXJt + ZXI8L3RzcGFuPjxkZXNjIGlkPSJkZXNjMzI3Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVz + YyBpZD0iZGVzYzMyOSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzMzEi + PjUxMjogWFRFWFRfRU9XPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzMzIj41MTI6IFhURVhUX0VP + QzwvZGVzYz48ZGVzYyBpZD0iZGVzYzMzNSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2Mg + aWQ9ImRlc2MzMzciPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzM5Ij41 + MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzM0MSI+NTEyOiBYVEVYVF9FT0M8 + L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzNDMiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlk + PSJkZXNjMzQ1Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzM0NyI+NTEy + OiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzNDkiPjUxMjogWFRFWFRfRU9DPC9k + ZXNjPjxkZXNjIGlkPSJkZXNjMzUxIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0i + ZGVzYzM1MyI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2MzNTUiPjUxMjog + WFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzU3Ij41MTI6IFhURVhUX0VPVzwvZGVz + Yz48ZGVzYyBpZD0iZGVzYzM1OSI+NTEyOiBYVEVYVF9FT0w8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MzNjEiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxkZXNjIGlkPSJkZXNjMzYzIj41MTI6IFhU + RVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNwYW4+PC90c3Bhbj48L3RleHQ+PC9nPjwv + Zz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcuVGV4dFNoYXBlIiBpZD0iZzQzNSI+ + PGcgaWQ9ImlkOCI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBzdHJva2U9Im5vbmUiIGZp + bGw9Im5vbmUiIHg9IjEwMCIgeT0iMzY2MCIgd2lkdGg9Ijg5MDEiIGhlaWdodD0iNzI2IiBp + ZD0icmVjdDM3NCIvPjxkZXNjIGlkPSJkZXNjMzc2Ij4xNTA8L2Rlc2M+PGRlc2MgaWQ9ImRl + c2MzNzgiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9CRUdJTjwvZGVzYz48dGV4dCBjbGFzcz0i + VGV4dFNoYXBlIiBpZD0idGV4dDQzMiI+PGRlc2MgY2xhc3M9IlBhcmFncmFwaCIgaWQ9ImRl + c2MzODAiLz48dHNwYW4gY2xhc3M9IlRleHRQYXJhZ3JhcGgiIGZvbnQtZmFtaWx5PSJMaWJl + cmF0aW9uIFNhbnMsIHNhbnMtc2VyaWYiIGZvbnQtc2l6ZT0iNDIzcHgiIGZvbnQtd2VpZ2h0 + PSI0MDAiIGlkPSJ0c3BhbjQzMCI+PGRlc2MgaWQ9ImRlc2MzODIiPjEzODwvZGVzYz48ZGVz + YyBpZD0iZGVzYzM4NCI+MTM2PC9kZXNjPjxkZXNjIGlkPSJkZXNjMzg2Ij4xMzU8L2Rlc2M+ + PGRlc2MgaWQ9ImRlc2MzODgiPjEzNDwvZGVzYz48ZGVzYyBpZD0iZGVzYzM5MCI+MTEzPC9k + ZXNjPjxkZXNjIGNsYXNzPSJUZXh0UG9ydGlvbiIgaWQ9ImRlc2MzOTIiPnR5cGU6IFRleHQ7 + IGNvbnRlbnQ6IDsgPC9kZXNjPjx0c3BhbiBjbGFzcz0iVGV4dFBvc2l0aW9uIiB4PSIzNTAi + IHk9IjQxNzAiIGlkPSJ0c3BhbjQyOCI+PHRzcGFuIGZpbGw9InJnYigwLDAsMCkiIHN0cm9r + ZT0ibm9uZSIgaWQ9InRzcGFuMzk0Ij48L3RzcGFuPjxkZXNjIGlkPSJkZXNjMzk2Ij41MTI6 + IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzM5OCI+NTEyOiBYVEVYVF9FT0M8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M0MDAiPjUxMjogWFRFWFRfRU9XPC9kZXNjPjxkZXNjIGlkPSJk + ZXNjNDAyIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzQwNCI+NTEyOiBY + VEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0MDYiPjUxMjogWFRFWFRfRU9DPC9kZXNj + PjxkZXNjIGlkPSJkZXNjNDA4Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVz + YzQxMCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0MTIiPjUxMjogWFRF + WFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDE0Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzQxNiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0 + MTgiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDIwIj41MTI6IFhURVhU + X0VPVzwvZGVzYz48ZGVzYyBpZD0iZGVzYzQyMiI+NTEyOiBYVEVYVF9FT0w8L2Rlc2M+PGRl + c2MgaWQ9ImRlc2M0MjQiPjUxMjogWFRFWFRfRU9QPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDI2 + Ij41MTI6IFhURVhUX1BBSU5UU0hBUEVfRU5EPC9kZXNjPjwvdHNwYW4+PC90c3Bhbj48L3Rl + eHQ+PC9nPjwvZz48ZyBjbGFzcz0iY29tLnN1bi5zdGFyLmRyYXdpbmcuVGV4dFNoYXBlIiBp + ZD0iZzQ4OCI+PGcgaWQ9ImlkOSI+PHJlY3QgY2xhc3M9IkJvdW5kaW5nQm94IiBzdHJva2U9 + Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjQ4MDAiIHk9IjAiIHdpZHRoPSI0MjAxIiBoZWlnaHQ9 + IjcyNiIgaWQ9InJlY3Q0MzciLz48ZGVzYyBpZD0iZGVzYzQzOSI+MTUwPC9kZXNjPjxkZXNj + IGlkPSJkZXNjNDQxIj41MTI6IFhURVhUX1BBSU5UU0hBUEVfQkVHSU48L2Rlc2M+PHRleHQg + Y2xhc3M9IlRleHRTaGFwZSIgaWQ9InRleHQ0ODUiPjxkZXNjIGNsYXNzPSJQYXJhZ3JhcGgi + IGlkPSJkZXNjNDQzIi8+PHRzcGFuIGNsYXNzPSJUZXh0UGFyYWdyYXBoIiBmb250LWZhbWls + eT0iTGliZXJhdGlvbiBTYW5zLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjQyM3B4IiBmb250 + LXdlaWdodD0iNDAwIiBpZD0idHNwYW40ODMiPjxkZXNjIGlkPSJkZXNjNDQ1Ij4xMzg8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M0NDciPjEzNjwvZGVzYz48ZGVzYyBpZD0iZGVzYzQ0OSI+MTM1 + PC9kZXNjPjxkZXNjIGlkPSJkZXNjNDUxIj4xMzQ8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0NTMi + PjExMzwvZGVzYz48ZGVzYyBjbGFzcz0iVGV4dFBvcnRpb24iIGlkPSJkZXNjNDU1Ij50eXBl + OiBUZXh0OyBjb250ZW50OiA7IDwvZGVzYz48dHNwYW4gY2xhc3M9IlRleHRQb3NpdGlvbiIg + eD0iNzQxNyIgeT0iNTEwIiBpZD0idHNwYW40ODEiPjx0c3BhbiBmaWxsPSJyZ2IoMCwwLDAp + IiBzdHJva2U9Im5vbmUiIGlkPSJ0c3BhbjQ1NyI+PC90c3Bhbj48ZGVzYyBpZD0iZGVzYzQ1 + OSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0NjEiPjUxMjogWFRFWFRf + RU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDYzIj41MTI6IFhURVhUX0VPVzwvZGVzYz48ZGVz + YyBpZD0iZGVzYzQ2NSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0Njci + PjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDY5Ij41MTI6IFhURVhUX0VP + QzwvZGVzYz48ZGVzYyBpZD0iZGVzYzQ3MSI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2Mg + aWQ9ImRlc2M0NzMiPjUxMjogWFRFWFRfRU9XPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDc1Ij41 + MTI6IFhURVhUX0VPTDwvZGVzYz48ZGVzYyBpZD0iZGVzYzQ3NyI+NTEyOiBYVEVYVF9FT1A8 + L2Rlc2M+PGRlc2MgaWQ9ImRlc2M0NzkiPjUxMjogWFRFWFRfUEFJTlRTSEFQRV9FTkQ8L2Rl + c2M+PC90c3Bhbj48L3RzcGFuPjwvdGV4dD48L2c+PC9nPjxnIGNsYXNzPSJjb20uc3VuLnN0 + YXIuZHJhd2luZy5UZXh0U2hhcGUiIGlkPSJnNTY3Ij48ZyBpZD0iaWQxMCI+PHJlY3QgY2xh + c3M9IkJvdW5kaW5nQm94IiBzdHJva2U9Im5vbmUiIGZpbGw9Im5vbmUiIHg9IjAiIHk9IjEi + IHdpZHRoPSI5MDAxIiBoZWlnaHQ9IjcyNiIgaWQ9InJlY3Q0OTAiLz48ZGVzYyBpZD0iZGVz + YzQ5MiI+MTUwPC9kZXNjPjxkZXNjIGlkPSJkZXNjNDk0Ij41MTI6IFhURVhUX1BBSU5UU0hB + UEVfQkVHSU48L2Rlc2M+PHRleHQgY2xhc3M9IlRleHRTaGFwZSIgaWQ9InRleHQ1NjQiPjxk + ZXNjIGNsYXNzPSJQYXJhZ3JhcGgiIGlkPSJkZXNjNDk2Ii8+PHRzcGFuIGNsYXNzPSJUZXh0 + UGFyYWdyYXBoIiBmb250LWZhbWlseT0iTGliZXJhdGlvbiBTYW5zLCBzYW5zLXNlcmlmIiBm + b250LXNpemU9IjQyM3B4IiBmb250LXdlaWdodD0iNzAwIiBpZD0idHNwYW41NjIiPjxkZXNj + IGlkPSJkZXNjNDk4Ij4xMzg8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1MDAiPjEzNjwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzUwMiI+MTM1PC9kZXNjPjxkZXNjIGlkPSJkZXNjNTA0Ij4xMzQ8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M1MDYiPjExMzwvZGVzYz48ZGVzYyBjbGFzcz0iVGV4dFBvcnRp + b24iIGlkPSJkZXNjNTA4Ij50eXBlOiBUZXh0OyBjb250ZW50OiA7IDwvZGVzYz48dHNwYW4g + Y2xhc3M9IlRleHRQb3NpdGlvbiIgeD0iMjE4MCIgeT0iNTExIiBpZD0idHNwYW41NjAiPjx0 + c3BhbiBmaWxsPSJyZ2IoMjM5LDY1LDYxKSIgc3Ryb2tlPSJub25lIiBpZD0idHNwYW41MTAi + PjwvdHNwYW4+PGRlc2MgaWQ9ImRlc2M1MTIiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNj + IGlkPSJkZXNjNTE0Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzUxNiI+ + NTEyOiBYVEVYVF9FT1c8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1MTgiPjUxMjogWFRFWFRfRU9D + PC9kZXNjPjxkZXNjIGlkPSJkZXNjNTIwIj41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBp + ZD0iZGVzYzUyMiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1MjQiPjUx + MjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTI2Ij41MTI6IFhURVhUX0VPQzwv + ZGVzYz48ZGVzYyBpZD0iZGVzYzUyOCI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9 + ImRlc2M1MzAiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTMyIj41MTI6 + IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzUzNCI+NTEyOiBYVEVYVF9FT0M8L2Rl + c2M+PGRlc2MgaWQ9ImRlc2M1MzYiPjUxMjogWFRFWFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJk + ZXNjNTM4Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVzYzU0MCI+NTEyOiBY + VEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1NDIiPjUxMjogWFRFWFRfRU9DPC9kZXNj + PjxkZXNjIGlkPSJkZXNjNTQ0Ij41MTI6IFhURVhUX0VPQzwvZGVzYz48ZGVzYyBpZD0iZGVz + YzU0NiI+NTEyOiBYVEVYVF9FT0M8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1NDgiPjUxMjogWFRF + WFRfRU9DPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTUwIj41MTI6IFhURVhUX0VPQzwvZGVzYz48 + ZGVzYyBpZD0iZGVzYzU1MiI+NTEyOiBYVEVYVF9FT1c8L2Rlc2M+PGRlc2MgaWQ9ImRlc2M1 + NTQiPjUxMjogWFRFWFRfRU9MPC9kZXNjPjxkZXNjIGlkPSJkZXNjNTU2Ij41MTI6IFhURVhU + X0VPUDwvZGVzYz48ZGVzYyBpZD0iZGVzYzU1OCI+NTEyOiBYVEVYVF9QQUlOVFNIQVBFX0VO + RDwvZGVzYz48L3RzcGFuPjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjwvZz48L2c+PC9n + PjwvZz48L3N2Zz4= + + + + + iVBORw0KGgoAAAANSUhEUgAAAVQAAACqCAYAAADyfbdoAAAACXBIWXMAAA7CAAAOwgEVKEqA + AAATfklEQVR4nO3dd1hUV/7H8Xun0Is9FgSUJKi4dsS+saxGFE2iRMWOXTcq9hQ7KIFYWVEi + UWOJJWpcNRpr/MWusZfVxACajS122kiZ+Xl0xxCWLGXOiJr363nmeZzDnXu/4x+f58y9p+hM + JpMCALCcrrALAICXBYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQqAAgCYEKAJIQ + qAAgCYEKAJIQqAAgCYEKAJIQqAAgSb4D1Wg0asQra5tWq81UVdVkaTE5nVuj0RjFy9JzA4C1 + 5TtQz5w585cGDRocSElJcTC31a1b98h3333XxNbW9mFBCzEYDHYNGzbcf/z48VrmNicnp6SD + Bw/Wr1q16tmCnhcAnpV8B2r16tVPLV26tEdgYOCXJpNJFW1HjhypO2zYsDkLFiwYWNBChg4d + OjdrmIoe72effdaHMAXwoijQPdQOHTqsGzVq1CeRkZGjzW0xMTEDRE81ODh4UX7Pt3Llyi4L + Fy7sl7VtzJgxEe++++6agtQHAIWhwA+lwsPDx507d85ny5Yt/ua2IUOGzBM92Nq1ax/L63ku + XrzoPWDAgJisbc2bN98VFhb2YUFrA4DCUOBAFQ+Kli9f3k30Si9duvSqaBP3QUXv9fvvv69T + okSJW7mdIzk52fGdd95Zn5iY6Gxu8/DwuLxq1arO4kFXQWsDgMJg0bCpokWL3t20aVNAvXr1 + Dt2/f99VtF2+fNkjKCjoi61bt7bOLRQHDRo0//z581XM7+3s7Azr1q3rkJcwBoDnjcXjUCtV + qnTh888/7yl6muYhTzt27PhbaGjoRxMnTpz8R5+bP3/+oGXLlnXP3paf2wUA8DyRMrC/ffv2 + /xw/fvzUyZMnTzS3TZkyZYKvr+9Rf3//LdmPP3XqVPWRI0fOyNoWEhIyq1evXktk1AMAhUHa + TCnRGxUPqdauXdtRvBe91W7dui0X91MrVqwYZz7u3r17RURvNjU11d7cJsaffvzxx2Nl1QIA + hUFaoIpxo4sXL+594cKFSmfPnq0q2u7evVtUhOeBAwcaODg4pIhxq3369PksLi6uovlz5cuX + /3n9+vXv6PX6dFm1AEBhkDqXX8xs2rhxYzvxU//27dvFRZv4eS+GRYn7pTNmzBgpwtN8vHgI + JXq0pUqVuimzDgAoDNIXR6lQoUK8CM+AgIBNmZmZWtEmhle5uLg8yD54f968eUPEsCvZNQBA + YbDKalOtW7feKgbmjxs3LtzcFh0dPTjrMYMHD44uyKwqAHheWW35PjF19OTJkzXEIP3sf6tf + v/7BWbNmhVjr2gBQGKwWqOIh1aRHVq9e3cm8iIpZx44d19rY2KRZ69oAUBisFqhiGmr37t2X + ZQ9TQdwK8PPzOyyGS1nr+gDwrFktUPv37//p0aNHfc3vxdx/80yq9PR0vZieeuzYsdpMMwXw + srBKoIrhUVmnlTo6OiZv27atleixxsfHVxBtV65cce/UqdPq7du3t2QhFAAvA+mBumvXruZZ + n+4LYo6++Hkv7qc2atRoX1pamo1o3717dzMxZXXatGkfyK4DAJ41qYGakJDg2blz51UZGRlP + zytW4hc9U/FvMeA/IiJizPDhw2eb/y7WVRULoohl/2TWAgDPmrRATUpKcmrXrt3GW7dulTC3 + iQdPWVf1F8RWKfv27WtknvMvHlr17t17cZUqVc5Xrlz5X7LqAYBnTUqgmufoiw38zG1iOqkI + zZyGRy1atChYHCtW6xfvxQLTYs6/2JvK2dk5UUZNAPCsSQlUMStqzZo175rfiyf64qGUm5vb + v3M6XoSmOF4sTG1edUosqiJGBoj9pWTUBADPmsWBKp7eiwH8WdvE4tItW7bc/r8+V61atdNi + ttTAgQMXmNvErCoxi0rcd7W0LgB41iwKVPGTXQx9Mi+CIrRt23Zz9qf8f0SsQiWW9hPbUpvb + xG6qNWvWPNG4ceO9ltQGAM9agQPVfN/TvJeU4OnpmbBkyZJeYtppXs8jFk0Ri1Cb95YSg/7F + 9tFi0H/ZsmWvFrQ+AHjWChSoYsaTmOmU0wZ7xYsXv52fc4lB/+J+qhgRIHZBFW3Xr18vHRgY + +OW3337blDn/AF4UBQrUjz76KHTz5s1ts7aJnmatWrWOF+R8Pj4+58RaqSKkzW3iVsD7778/ + Xcy6Ksg5AeBZy3egihX3xWD8rG3i6bwYS2pJIV26dFm5c+fOFmJIlblt5syZI2rUqHHSPDEA + AJ5n+QrU06dPV+vRo8fSrCtIVa9e/dTs2bOHyyhGrOB/4sSJmuJlbhMLUYuer+jFyrgGAFhL + vgJVPCQSoZq1rWTJkr/a29unyihG3IcV903N+1GZubq63pdxfgCwpnwFqlhqz9rL7YnwJEAB + vIisth4qAPzZEKgAIAmBCgCSEKgAIAmBCgCS6D799NP+4lXYhQDAi0539erVsmIhksIuBABe + dDoxbTQgIGBTYRcCAC86nZj9xDJ5AGA5HkoBgCQEKgBIQqACgCQEKgBIQqACgCQEKgBIQqAC + gCQEKgBIYlmgGuP0M5tUXjdyf1qAeKuvHXb61OEPmlTWKrmvuJ++32GEd/Nvt3c9cOTk1FrD + HhVitKiWp5I0X7xdMrbrBkPvx29VjaJ3cE0t5VH1Sv1WnXcMCQmOeqO83Q9yrgUAv7EsUDVl + MjrO3jq+2j1D1HdT3x4enqy4SarLYjrvvj/FRncd5qExpaQn33JIOLW76prY0T1bLF0eNHbN + xn6hzUp8pSqKqbDrBPDysPAnv73JvU6zU+5KqnonRhOoxD8/gao6VUiu+9c39j3tLbcJ/Lrv + kF4xoW1bLZvcdei8GqdWnAsspV4s5DIBvESsdw/V8IP92kljRk37Yk/vf914WM6+TNUbTbuP + XxU5vl1oRRvlgfkwrXpb3T21fUhI1I4RPyY6FKvQOPjQJ4umDw5w0/5LSd/j8J6X/95zI3dt + Hn4z7OEHi/5v0KV7NiXcG/c9NHPR9EFt3TQX8lOS6up37/3okWO/qh22d+6K+K4dQipO1Ihe + al5qTbts+/W00UMnL9nZ/8y1h+WdPHx/aT/s4wURg/3mFlOVh5L/9wC8gKwTqKY72i3vtZoS + tLFiz3Exu0d8Wct1/90jMTWGD3h3TpuUHUW/n9F4kOOTA5Vba8f/bbb/eztidk0LsI3/suz7 + fcKi+k98Y8qlz/y7OD4qT6fLyDwfNbbbujGzovdcqentcGVl6X7Nem/oN+mNKT/Ftg5yUJSM + fH3hym3j2nhPOTNr3+F6SSEVdS6mO8bca000fjum1QcdlrgMHTD/m3ErGxTZfn1XRKNBQ/1n + dNUf03zd3zNCw+0D4E/PKoFqurH+lagvrnX2nbozZtJbXiseh417WMKck1terT8/ZtSOyY3D + 3rJVbipKpnqnVNDd6IiuYz01SrLyl1dPjAiY1+ztkydaJGT6O/ooarqqGJWk13v9HNGv9rwS + qmJQvALje7QcsW3t8eOt4jNbO/rk5QFYVtpy6R7ltFfTb1x/7ZZRsXW+ud4lt1rbGzakzl4U + 19NnzPHPZnSpulA8QPMKjkqYc3yX95tzYnudDA5dWEun3LHG/yWAF4dVAjX93DHP0+nlXDr7 + uR/9reemN/n41jjuEHHG4WRchtdblUWgak3ufn6n3DRK6pNjNEqRYq531dRkm1STohWnEse4 + Vat6obiqpD05RlVcXF3uZzkmn4yq0fjoQjqd8dGXN+Wl1jZ3jySdMLgV6fCG997fRiPYm+r+ + te4+m9jDfz/6q8mtVhmVQAX+5KzTQ0184JCoOGtcnDVJWds1js4GByXJmJhkevKL/1E46m30 + aVmPUVU1209nVdHpdenZmgouI87mYlymp2MDj2slNYohL7UaEx8YEzMuO/yjufOX89Usw7uM + GZo05S+ZN24ZiytlCpDtAF4qBQhUo5r48+myJ68XKVfH1/OY/aPf7U97fXp9pujBqS6uKc5K + ovFBotFJydKJzEx6YJ+suGhcnTWJEr9DvhiOrPPZdNm+cqPx9VbZPao1PQ+1ajKKJLvoKyZ3 + Xrlh1LAq2v2/O6Fqayrhqf33s/4eAJ4/BQjUNOVgqP/QNpve7PbVhUUN27ooCUrGDzbnf8j0 + sq/ieb20VknV+/jG17BZdP/wkZ/rGBtW3PTkp3S6eubQ8TqpResl1fbSXpL/VXJnuru36KRh + C8ITPIJvL3in1FoxDjUvtepSfR/Wslt0N+FOsWLelcpcNI9fNd5OKBKvlLUtYaskF8b3AfB8 + KUCg2pmaBPdeXfnzyL5DgsrH3ulXY0HK9vAGURfK1u0U2bK/k3jSVOrtm0O7h65oFzG4//TK + M870rOZw8Pq+qLrDYq78verQZaubOyhXlXTFVv7X+Y0pKd7xyP/taXRDoyQbDXfsrpze5bN8 + /pK+e+7XeGXC5rBuTZ2VX8RxealVdWhvGto7dJn/hF4jppScfrV77RL70uJ3uc0NCQlbU3pm + xvGNwe3dNYQq8GdXoHuodn4TTny1Iq3H3yfMDx0Y+GCFXfl6VzvFbBz3yZuuqx/33tQima1m + fTPlC9dRKaF960dOuZle1ql8rautx26MjRhdJ8Lu8W0C68q4GOvVq3nsZnHDVdXojc6lX79Z + 980JOzZ+ODTCv6L92acH5qlWZ6VpxDfTvywyJmnKsOaTw39JdtcWf/Vevbemb94yvfd4whSA + UMCHUrYmrw6RX2999PrDQ+xeS+0Q/s+pHcKVqTn+Xd8wZWacwS9bo6l+5I+hhkgl9Mn7hkru + x2TnZAz6KjU4SFGC8/ptcq1VsPE0tJ20JrLtJCUyz+cF8KfCalMAIAmBCgCSEKgAIAmBCgCS + EKgAIAmBCgCSEKgAIAmBCgCSFDBQs22El53e1zD99MGW4ypp91pQGwC8UCzqoepeD46Lieoy + 4r+mXmpcja+5a89YVBkAvGAsClTV2SupfvMWe/K0bXReZWZoMzQ6k06Vta30c3ItAC89q99D + zfj3trLhoyeHLtl52v/KvYzijuWqX3tzYPjiOWOaTi+lUQxK2k7HQZ4BB34cvX5Tm91DPCfs + ft1/1g9j3zxVv838cyFbtvT9aYL+oxVH+1w1lbFp0G/usqWjnD5eNnh4WNT2i+3uO1ZKaz9p + SWTswOqzHu8tldtGejldK35rk76l1LO5fxMA+N+sG6jGK/rY4MCZYdc614jZsLBbg9KahJsH + 5/oOHhA4e5D7+V/XBpWap6o2Jhu9MT3h80/a7es4a/O2id6tvIreij8nNueLntbl8MeLQ8/M + fsXtckynLk2G9533t70N6naL3DYlYZWu3/eTWw9rMWrc+83f2vJNn9JJ53LdSC/Ha6lxVv0/ + APCnYVmgGtM0KUlJjkna3y/Hp6p6k52jbYpWUyaj67Kz7/lrSmrcS9rfEH97tcKoK92jFwdN + 33msaXpQ62gbRatotZnGn50DHu74oP20CholSUnf76AqJiXZp0f8hLe9Vjo+6l1W7txxa92R + 2+5dqB9ydnTjV7bYPLq6X+eATd6fLBx18kLG6ybdhpu5bqSnaA3/dS0AkMSiQE0/MblqnSKT + f8nerine++amq4tq+tvorqk395SYOW5W6PoDF/567f7DYhkmkyrWKHX0SN1iero7lMZUtnbt + c24aJSXLWUzlKntfclWVx/tJqY5OBidVl+5V6bUf9P9ZMf9xm5KamWow2WWcO+KZ60Z6JZRL + OV8LACxn2VP+Sv1/WhLTfYhHtqf8qv6V9Cp65ZaSuMN1VEDfFWsrjDMsPbSrRbPXip21U66o + c5u+tuYDRbH57RMaxdHJMfn3e++pik6nzfjt7ZPN+37X9p88Fn8wis32cttI70mg5nAtALCc + ZU/5HT2SazVsdOiPnvKnf7+x9tdXy1fssWJ8T39v/cnHjRm37X69YyyqlM021EpVTDmcIs80 + LvnYSM/CawFATqz6UMpkSLUxqK5qUVfN08BNOby82toLmTVNPqb9/+uz+aXz8U3IdSO9dMVB + 5jUBICurBqqumt9PtWxWPFgdvSG4w4d+CZmnlnlPiLgX0qSF077FP55wP3a9pUed4spNGddS + i7e/letGego9UwDWY9VA1ZTr+cucfxwZ2evDnuE1l9ied/frfGxC9NyR/pcdHPd3mbmq3Vu2 + q7/5ttnbcq7mbMx1I71MeqgArKeAgfp0I7xc2Joq9Yxdc+jR63fNVaKUs/eiXjG/rZN9I76c + NvCz7fhgTWpHz6xNmgrD4/cahpd52pDbRno5bgwIAHKw2hQASEKgAoAkBCoASEKgAoAkBCoA + SEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoA + SEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoASEKgAoAkBCoA + SEKgAoAkBCoASEKgAoAkBCoASEKgAoAk/w/xJdzkzVWshgAAAABJRU5ErkJggg== + + + 140 + + + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt b/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt new file mode 100644 index 0000000000..0f07d93f24 Binary files /dev/null and b/sw/qa/extras/odfexport/data/spellout-numberingtypes.odt differ diff --git a/sw/qa/extras/odfexport/data/style-link.fodt b/sw/qa/extras/odfexport/data/style-link.fodt new file mode 100644 index 0000000000..76c36c6988 --- /dev/null +++ b/sw/qa/extras/odfexport/data/style-link.fodt @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/sw_hatch.odt b/sw/qa/extras/odfexport/data/sw_hatch.odt new file mode 100644 index 0000000000..45e36c6ecc Binary files /dev/null and b/sw/qa/extras/odfexport/data/sw_hatch.odt differ diff --git a/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt b/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt new file mode 100644 index 0000000000..44dbf0bdec Binary files /dev/null and b/sw/qa/extras/odfexport/data/table-in-frame-in-table-in-header-base.odt differ diff --git a/sw/qa/extras/odfexport/data/table_number_format_3.docx b/sw/qa/extras/odfexport/data/table_number_format_3.docx new file mode 100644 index 0000000000..1bb423e455 Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_number_format_3.docx differ diff --git a/sw/qa/extras/odfexport/data/table_styles_1.odt b/sw/qa/extras/odfexport/data/table_styles_1.odt new file mode 100644 index 0000000000..701fd92c2a Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_1.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_2.odt b/sw/qa/extras/odfexport/data/table_styles_2.odt new file mode 100644 index 0000000000..735ea44319 Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_2.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_3.odt b/sw/qa/extras/odfexport/data/table_styles_3.odt new file mode 100644 index 0000000000..7367864890 Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_3.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_4.odt b/sw/qa/extras/odfexport/data/table_styles_4.odt new file mode 100644 index 0000000000..0d96127e3b Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_4.odt differ diff --git a/sw/qa/extras/odfexport/data/table_styles_5.odt b/sw/qa/extras/odfexport/data/table_styles_5.odt new file mode 100644 index 0000000000..c90958322a Binary files /dev/null and b/sw/qa/extras/odfexport/data/table_styles_5.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf100492.odt b/sw/qa/extras/odfexport/data/tdf100492.odt new file mode 100644 index 0000000000..e17bd67c50 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf100492.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf101710.odt b/sw/qa/extras/odfexport/data/tdf101710.odt new file mode 100644 index 0000000000..50ab736070 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf101710.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf101856.odt b/sw/qa/extras/odfexport/data/tdf101856.odt new file mode 100644 index 0000000000..bddd150228 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf101856.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf101856_overlapped.odt b/sw/qa/extras/odfexport/data/tdf101856_overlapped.odt new file mode 100644 index 0000000000..c05df538da Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf101856_overlapped.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf103091.fodt b/sw/qa/extras/odfexport/data/tdf103091.fodt new file mode 100644 index 0000000000..7b7d35cd46 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf103091.fodt @@ -0,0 +1,307 @@ + + + + ms 2017-06-15T21:56:462017-06-15T21:59:44ms P0D1LibreOffice/3.5$Linux_X86_64 LibreOffice_project/3215f89-f603614-ab984f2-7348103-1225a5b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf103567.odt b/sw/qa/extras/odfexport/data/tdf103567.odt new file mode 100644 index 0000000000..cbd29bd298 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf103567.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt b/sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt new file mode 100644 index 0000000000..06dde4802b Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf104254_noHeaderWrapping.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf107292.odt b/sw/qa/extras/odfexport/data/tdf107292.odt new file mode 100644 index 0000000000..f35da387f9 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf107292.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf107696.odt b/sw/qa/extras/odfexport/data/tdf107696.odt new file mode 100644 index 0000000000..c24100bbdf Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf107696.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt b/sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt new file mode 100644 index 0000000000..8fcf98a627 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf111891_frameVertStyle.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf114287.odt b/sw/qa/extras/odfexport/data/tdf114287.odt new file mode 100644 index 0000000000..a9e9d38e29 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf114287.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf115815.odt b/sw/qa/extras/odfexport/data/tdf115815.odt new file mode 100644 index 0000000000..7c2aad0da6 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf115815.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf118502.odt b/sw/qa/extras/odfexport/data/tdf118502.odt new file mode 100644 index 0000000000..f006d607ac Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf118502.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf118637.odt b/sw/qa/extras/odfexport/data/tdf118637.odt new file mode 100644 index 0000000000..c2a8b4f530 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf118637.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf121658.odt b/sw/qa/extras/odfexport/data/tdf121658.odt new file mode 100644 index 0000000000..1ab6f75c8d Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf121658.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt b/sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt new file mode 100644 index 0000000000..21969e9e54 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf124470TableAndEmbeddedUsedFonts.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf128504.docx b/sw/qa/extras/odfexport/data/tdf128504.docx new file mode 100644 index 0000000000..2e6e5225b8 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf128504.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf129520.docx b/sw/qa/extras/odfexport/data/tdf129520.docx new file mode 100644 index 0000000000..4f74826ada Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf129520.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf129568-ui.fodt b/sw/qa/extras/odfexport/data/tdf129568-ui.fodt new file mode 100644 index 0000000000..8958bd6853 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf129568-ui.fodt @@ -0,0 +1,368 @@ + + + + 2020-02-03T11:01:15.2025491202020-02-03T11:02:08.562696933PT55S2LibreOffice/6.3.4.2.0$Linux_X86_64 LibreOffice_project/30$Build-2 + + + 0 + 0 + 25137 + 13522 + true + false + + + view2 + 4165 + 2616 + 0 + 0 + 25135 + 13520 + 0 + 1 + false + 100 + false + false + + + + + false + true + true + true + 0 + true + true + + false + false + true + false + false + false + true + true + false + false + false + false + false + false + false + false + false + true + true + false + false + true + 1284982 + false + + false + true + false + false + false + true + false + false + false + true + 1284982 + + true + false + false + true + false + true + true + false + true + false + false + false + 0 + false + true + high-resolution + false + false + false + true + false + false + false + true + true + + true + false + false + true + false + false + false + + true + false + false + 1 + true + false + false + 0 + false + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf129568.fodt b/sw/qa/extras/odfexport/data/tdf129568.fodt new file mode 100644 index 0000000000..30256a6cd5 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf129568.fodt @@ -0,0 +1,368 @@ + + + + 2020-02-03T11:01:15.2025491202020-02-03T11:02:08.562696933PT55S2LibreOffice/6.3.4.2.0$Linux_X86_64 LibreOffice_project/30$Build-2 + + + 0 + 0 + 25137 + 13522 + true + false + + + view2 + 4165 + 2616 + 0 + 0 + 25135 + 13520 + 0 + 1 + false + 100 + false + false + + + + + false + true + true + true + 0 + true + true + + false + false + true + false + false + false + true + true + false + false + false + false + false + false + false + false + false + true + true + false + false + true + 1284982 + false + + false + true + false + false + false + true + false + false + false + true + 1284982 + + true + false + false + true + false + true + true + false + true + false + false + false + 0 + false + true + high-resolution + false + false + false + true + false + false + false + true + true + + true + false + false + true + false + false + false + + true + false + false + 1 + true + false + false + 0 + false + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf130314.docx b/sw/qa/extras/odfexport/data/tdf130314.docx new file mode 100644 index 0000000000..592ffbf5b3 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf130314.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf130950.odt b/sw/qa/extras/odfexport/data/tdf130950.odt new file mode 100644 index 0000000000..a669cb87b5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf130950.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt b/sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt new file mode 100644 index 0000000000..f2bffb050a Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf131025_noZerosInTable.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf131621.ott b/sw/qa/extras/odfexport/data/tdf131621.ott new file mode 100644 index 0000000000..8590c16ae1 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf131621.ott differ diff --git a/sw/qa/extras/odfexport/data/tdf131812.odt b/sw/qa/extras/odfexport/data/tdf131812.odt new file mode 100644 index 0000000000..c2833ff25d Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf131812.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt b/sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt new file mode 100644 index 0000000000..739cd0078a Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf132642_keepWithNextTable.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt b/sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt new file mode 100644 index 0000000000..efc1c3f592 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf133507_contextualSpacingSection.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf134987.docx b/sw/qa/extras/odfexport/data/tdf134987.docx new file mode 100644 index 0000000000..c828bf442e Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf134987.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf135144.docx b/sw/qa/extras/odfexport/data/tdf135144.docx new file mode 100644 index 0000000000..012c40432b Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf135144.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt b/sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt new file mode 100644 index 0000000000..4f98088758 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf135338_firstLeftPageFooter.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf136645.odt b/sw/qa/extras/odfexport/data/tdf136645.odt new file mode 100644 index 0000000000..a8487c3173 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf136645.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf137199.docx b/sw/qa/extras/odfexport/data/tdf137199.docx new file mode 100644 index 0000000000..25b52977be Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf137199.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf139126.odt b/sw/qa/extras/odfexport/data/tdf139126.odt new file mode 100644 index 0000000000..0648f0abed Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf139126.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf140437.odt b/sw/qa/extras/odfexport/data/tdf140437.odt new file mode 100644 index 0000000000..8ed9ee77ce Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf140437.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf142483.odt b/sw/qa/extras/odfexport/data/tdf142483.odt new file mode 100644 index 0000000000..d6aba2bbd9 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf142483.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf143605.odt b/sw/qa/extras/odfexport/data/tdf143605.odt new file mode 100644 index 0000000000..7fb597e6d7 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf143605.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt b/sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt new file mode 100644 index 0000000000..c2de181f11 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf143793_noBodyWrapping.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf144319.odt b/sw/qa/extras/odfexport/data/tdf144319.odt new file mode 100644 index 0000000000..937482c34f Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf144319.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf145226.fodt b/sw/qa/extras/odfexport/data/tdf145226.fodt new file mode 100644 index 0000000000..426f2621f1 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf145226.fodt @@ -0,0 +1,188 @@ + + + 2022-08-09T14:29:03.6767505862022-08-09T14:29:17.977094506PT14S1LibreOfficeDev/7.5.0.0.alpha0$Linux_X86_64 LibreOffice_project/e77bfe281403e49c58730489e94b62032c296e75 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/odfexport/data/tdf145361.odt b/sw/qa/extras/odfexport/data/tdf145361.odt new file mode 100644 index 0000000000..e5a6a03c9c Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf145361.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf145871.odt b/sw/qa/extras/odfexport/data/tdf145871.odt new file mode 100644 index 0000000000..78677452f5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf145871.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf146264.odt b/sw/qa/extras/odfexport/data/tdf146264.odt new file mode 100644 index 0000000000..941c7db74f Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf146264.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf149248.odt b/sw/qa/extras/odfexport/data/tdf149248.odt new file mode 100644 index 0000000000..18685bd0a5 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf149248.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf149324.odt b/sw/qa/extras/odfexport/data/tdf149324.odt new file mode 100644 index 0000000000..da4b87d89e Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf149324.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf149420.odt b/sw/qa/extras/odfexport/data/tdf149420.odt new file mode 100644 index 0000000000..249d7267eb Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf149420.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf150149.fodt b/sw/qa/extras/odfexport/data/tdf150149.fodt new file mode 100644 index 0000000000..51aea046a2 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf150149.fodt @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + A + + + B + + + C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf150394.odt b/sw/qa/extras/odfexport/data/tdf150394.odt new file mode 100644 index 0000000000..e514f405bc Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf150394.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf151100.docx b/sw/qa/extras/odfexport/data/tdf151100.docx new file mode 100644 index 0000000000..e0341bdb9c Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf151100.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf152710.odt b/sw/qa/extras/odfexport/data/tdf152710.odt new file mode 100644 index 0000000000..9fadf26458 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf152710.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf156905.odt b/sw/qa/extras/odfexport/data/tdf156905.odt new file mode 100644 index 0000000000..41fe7a1d8c Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf156905.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc b/sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc new file mode 100644 index 0000000000..456a6ed833 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf43569_conditionalfield.doc differ diff --git a/sw/qa/extras/odfexport/data/tdf57317_autoListName.odt b/sw/qa/extras/odfexport/data/tdf57317_autoListName.odt new file mode 100644 index 0000000000..3aafbc5193 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf57317_autoListName.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf66305.odt b/sw/qa/extras/odfexport/data/tdf66305.odt new file mode 100644 index 0000000000..4a310a83d4 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf66305.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf77961.odt b/sw/qa/extras/odfexport/data/tdf77961.odt new file mode 100644 index 0000000000..a6205e018d Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf77961.odt differ diff --git a/sw/qa/extras/odfexport/data/tdf92379.fodt b/sw/qa/extras/odfexport/data/tdf92379.fodt new file mode 100644 index 0000000000..762a04d577 --- /dev/null +++ b/sw/qa/extras/odfexport/data/tdf92379.fodt @@ -0,0 +1,89 @@ + + + + ms 2015-08-24T21:49:45.305718699LibreOfficeDev/4.3.7.2$Linux_X86_64 LibreOffice_project/8a35821d8636a03b8bf4e15b48f59794652c68ba + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfexport/data/tdf95806.docx b/sw/qa/extras/odfexport/data/tdf95806.docx new file mode 100644 index 0000000000..65bfaae3e4 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf95806.docx differ diff --git a/sw/qa/extras/odfexport/data/tdf99631.docx b/sw/qa/extras/odfexport/data/tdf99631.docx new file mode 100644 index 0000000000..c72950b724 Binary files /dev/null and b/sw/qa/extras/odfexport/data/tdf99631.docx differ diff --git a/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt b/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt new file mode 100644 index 0000000000..8cdaf3eb9f Binary files /dev/null and b/sw/qa/extras/odfexport/data/testTdf52065_centerTabs.odt differ diff --git a/sw/qa/extras/odfexport/data/textbox-rounded-corners.odt b/sw/qa/extras/odfexport/data/textbox-rounded-corners.odt new file mode 100644 index 0000000000..add7512c6c Binary files /dev/null and b/sw/qa/extras/odfexport/data/textbox-rounded-corners.odt differ diff --git a/sw/qa/extras/odfexport/data/textframe-gradient.odt b/sw/qa/extras/odfexport/data/textframe-gradient.odt new file mode 100644 index 0000000000..cdcae4fff6 Binary files /dev/null and b/sw/qa/extras/odfexport/data/textframe-gradient.odt differ diff --git a/sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt b/sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt new file mode 100644 index 0000000000..508e853c9d Binary files /dev/null and b/sw/qa/extras/odfexport/data/textframe-transparent-shadow.odt differ diff --git a/sw/qa/extras/odfexport/data/textframe-vertadjust.odt b/sw/qa/extras/odfexport/data/textframe-vertadjust.odt new file mode 100644 index 0000000000..bbf3416c09 Binary files /dev/null and b/sw/qa/extras/odfexport/data/textframe-vertadjust.odt differ diff --git a/sw/qa/extras/odfexport/data/user-field-decl-fly.odt b/sw/qa/extras/odfexport/data/user-field-decl-fly.odt new file mode 100644 index 0000000000..2ffe3ae555 Binary files /dev/null and b/sw/qa/extras/odfexport/data/user-field-decl-fly.odt differ diff --git a/sw/qa/extras/odfexport/data/user-field-decl.odt b/sw/qa/extras/odfexport/data/user-field-decl.odt new file mode 100644 index 0000000000..f037f403ec Binary files /dev/null and b/sw/qa/extras/odfexport/data/user-field-decl.odt differ diff --git a/sw/qa/extras/odfexport/data/userdefattr-tablecell.odt b/sw/qa/extras/odfexport/data/userdefattr-tablecell.odt new file mode 100644 index 0000000000..c8f6dcca5f Binary files /dev/null and b/sw/qa/extras/odfexport/data/userdefattr-tablecell.odt differ diff --git a/sw/qa/extras/odfexport/data/whitespace.odt b/sw/qa/extras/odfexport/data/whitespace.odt new file mode 100644 index 0000000000..fe2b3dd574 Binary files /dev/null and b/sw/qa/extras/odfexport/data/whitespace.odt differ diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx new file mode 100644 index 0000000000..51cfa15b7b --- /dev/null +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -0,0 +1,2708 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include // for SwHiddenTextField::ParseIfFieldDefinition() method call +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/odfexport/data/", "writer8") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testMathObjectFlatExport) +{ + comphelper::ScopeGuard g([this]() { + mpFilter = "writer8"; + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Cache::Writer::OLE_Objects::set(20, pBatch); + return pBatch->commit(); + }); + mpFilter = "OpenDocument Text Flat XML"; // doesn't happen with ODF package + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Cache::Writer::OLE_Objects::set(1, pBatch); + pBatch->commit(); + loadAndReload("2_MathType3.docx"); + + uno::Reference xModifiable(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(!xModifiable->isModified()); + // see above, set the OLE cache to 1 for this test + // and the problem was that the formulas that were in the cache + // (the second one) were lost + OUString formula1(getFormula(getRun(getParagraph(1), 1))); + CPPUNIT_ASSERT_EQUAL(OUString(" size 12{1+1=2} {}"), formula1); + OUString formula2(getFormula(getRun(getParagraph(2), 1))); + CPPUNIT_ASSERT_EQUAL(OUString(" size 12{2+2=4} {}"), formula2); +} + +DECLARE_ODFEXPORT_TEST(testTdf144319, "tdf144319.odt") +{ + CPPUNIT_ASSERT_EQUAL(7, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + OUString formula1(getFormula(getRun(getParagraph(3), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ x = frac { { - b +- sqrt { b ^ 2 - 4 a c } } } { { 2 a } } }"), formula1); + OUString formula2(getFormula(getRun(getParagraph(4), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ sum csup n csub { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"), formula2); + OUString formula3(getFormula(getRun(getParagraph(5), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ sum ^ n _ { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"), formula3); + OUString formula4(getFormula(getRun(getParagraph(6), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ sum ^ n _ { i = 1 } i ^ 3 = left ( frac { { n left ( { n + 1 } right ) } } { 2 } right ) ^ 2 }"), formula4); + + // Without the fix in place, this test would have failed with + // - the property is of unexpected type or void: Model + OUString formula5(getFormula(getRun(getParagraph(7), 1))); + CPPUNIT_ASSERT_EQUAL(OUString("{ y ^ 2 { nitalic m p } = left ( { x ^ 3 + 7 } right ) { nitalic m p } }"), formula5); +} + +static void testTdf43569_CheckIfFieldParse() +{ + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u"IF A B C", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("A"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("B"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("C"), paramFalse); + } + + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u" IF AAA BBB CCC ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("AAA"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("BBB"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("CCC"), paramFalse); + } + + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u" IF AAA \"BBB\" \"CCC\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("AAA"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("BBB"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("CCC"), paramFalse); + } + + // true-case and false-case have spaces inside + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u" IF A A A \"B B B\" \"C C C\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("A A A"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("B B B"), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString("C C C"), paramFalse); + } + + // true-case and false-case have leading/trailing space + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u"IF A1 A2 A3 \"B1 B2 \" \" C1 C2\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("A1 A2 A3"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString("B1 B2 "), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString(" C1 C2"), paramFalse); + } + + // true-case and false-case are empty + { + OUString paramCondition; + OUString paramTrue; + OUString paramFalse; + + SwHiddenTextField::ParseIfFieldDefinition(u"IF condition \"\" \"\" ", paramCondition, paramTrue, paramFalse); + + CPPUNIT_ASSERT_EQUAL(OUString("condition"), paramCondition); + CPPUNIT_ASSERT_EQUAL(OUString(""), paramTrue); + CPPUNIT_ASSERT_EQUAL(OUString(""), paramFalse); + } +} + +// Input document contains only one IF-field, +// and it should be imported as com.sun.star.text.TextField.ConditionalText in any case, +// instead of insertion of the pair of two field-marks: + . +CPPUNIT_TEST_FIXTURE(Test, testTdf43569) +{ + loadAndReload("tdf43569_conditionalfield.doc"); + // check if our parser is valid + testTdf43569_CheckIfFieldParse(); + + // now check field creation during import + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // at least one field should be detected + CPPUNIT_ASSERT(xFields->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf130314) +{ + loadAndReload("tdf130314.docx"); + // Without the fix in place, this test would have hung + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133487) +{ + loadAndReload("MadeByLO7.odt"); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // shape in background has lowest index + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:custom-shape"_ostr, "z-index"_ostr, "0"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:custom-shape[@draw:z-index = '0']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "background"); + // shape in foreground, previously index 1 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[1]/draw:custom-shape"_ostr, "z-index"_ostr, "2"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[1]/draw:custom-shape[@draw:z-index = '2']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "foreground"); + // shape in foreground, previously index 0 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[3]/draw:custom-shape"_ostr, "z-index"_ostr, "1"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[3]/draw:custom-shape[@draw:z-index = '1']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "foreground"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141467) +{ + loadAndReload("Formcontrol needs high z-index.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // shape in foreground has lowest index + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:custom-shape"_ostr, "z-index"_ostr, "0"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:custom-shape[@draw:z-index = '0']/attribute::draw:style-name]/style:graphic-properties"_ostr, "run-through"_ostr, "foreground"); + // form control, previously index 0 + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p[2]/draw:control"_ostr, "z-index"_ostr, "1"); + // no run-through on form's style + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name = /office:document-content/office:body/office:text/text:p[2]/draw:control[@draw:z-index = '1']/attribute::draw:style-name]/style:graphic-properties/attribute::run-through"_ostr, 0); +} + +DECLARE_ODFEXPORT_TEST(testTdf139126, "tdf139126.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables = xSupplier->getTextTables(); + uno::Reference xTable(xTables->getByName("Table1"), uno::UNO_QUERY); + + uno::Reference xD2(xTable->getCellByName("D2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("4.0"), xD2->getString()); + + // Without the fix in place, this test would have failed with + // - Expected: ** Expression is faulty ** + // - Actual : 17976931348623200... + uno::Reference xE2(xTable->getCellByName("E2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("** Expression is faulty **"), xE2->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125877) +{ + loadAndReload("tdf95806.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xSupplier->getTextTables(), uno::UNO_QUERY); + + // This was 0 (lost table during ODT export in footnotes) + // Note: fix also tdf#95806: painting table layout is correct + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + // floating table: there is a frame now + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf150149) +{ + loadAndReload("tdf150149.fodt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // This was 0 (lost table header in multi-column section) + assertXPath(pXmlDoc, "//table:table-header-rows"_ostr, 1); + assertXPath(pXmlDoc, "//table:table-header-rows/table:table-row/table:table-cell"_ostr, 3); +} + +DECLARE_ODFEXPORT_TEST(testTdf103567, "tdf103567.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference const xShape(getShape(1)); + + // contour wrap polygon + css::drawing::PointSequenceSequence const pointss( + getProperty(xShape, "ContourPolyPolygon")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pointss.getLength()); + // for some reason this property exists with 199 points if it wasn't + // imported, that would be a fail + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pointss[0].getLength()); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][0].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][0].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][1].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1111), pointss[0][1].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][2].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1111), pointss[0][2].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][3].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][3].Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 0), pointss[0][4].X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2672), pointss[0][4].Y); + + // image map, one rectangle + uno::Reference const xImageMap( + getProperty>(xShape, "ImageMap")); + + uno::Reference const xEntry(xImageMap->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), getProperty(xEntry, "URL")); + awt::Rectangle const rect(getProperty(xEntry, "Boundary")); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 726), rect.X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1718), rect.Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1347), rect.Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32( 408), rect.Height); +} + +CPPUNIT_TEST_FIXTURE(Test, testUserFieldDecl) +{ + loadAndReload("user-field-decl.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Without the accompanying fix in place, this test would have failed with 'Expected: 2; + // Actual: 1', i.e. the in-table field had no declaration (in the header), while the + // outside-table one had the declaration. + assertXPath(pXmlDoc, "//style:header/text:user-field-decls/text:user-field-decl"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testUserFieldDeclFly) +{ + loadAndReload("user-field-decl-fly.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Without the accompanying fix in place, this test would have failed with 'Expected: 2; + // Actual: 1', i.e. the in-textframe field had no declaration (in the header), while the + // outside-textframe one had the declaration. + assertXPath(pXmlDoc, "//style:header/text:user-field-decls/text:user-field-decl"_ostr, 2); +} + +DECLARE_ODFEXPORT_TEST(testFramebackgrounds, "framebackgrounds.odt") +{ + CPPUNIT_ASSERT_EQUAL(16, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //Counting the Number of Frames and checking with the expected count + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(16), xIndexAccess->getCount()); + uno::Reference xTextFrame; + awt::Gradient aGradientxTextFrame; + //Frame 1 + xTextFrame = getShape(1); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 2 + xTextFrame = getShape(2); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x006600), getProperty(xTextFrame, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 3 + xTextFrame = getShape(3); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x006600), getProperty(xTextFrame, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 4 + xTextFrame = getShape(4); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x579D1C), getProperty(xTextFrame, "FillColor")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 5 + xTextFrame = getShape(5); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(OUString("Subtle Tango Green"), getProperty(xTextFrame, "FillGradientName")); + //Frame 6 + xTextFrame = getShape(6); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Subtle Tango Green"), getProperty(xTextFrame, "FillGradientName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 7 + xTextFrame = getShape(7); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Subtle Tango Green"), getProperty(xTextFrame, "FillGradientName")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 8 + xTextFrame = getShape(8); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 9 + xTextFrame = getShape(9); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + //Frame 10 + xTextFrame = getShape(10); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 11 + xTextFrame = getShape(11); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + //Frame 12 + xTextFrame = getShape(12); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTextFrame, "FillBackground")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 13 + xTextFrame = getShape(13); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Black 0 Degrees"), getProperty(xTextFrame, "FillHatchName")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBackground")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + //Frame 14 + xTextFrame = getShape(14); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xTextFrame, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetY")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetY")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBitmapTile")); + //Frame 15 + xTextFrame = getShape(15); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xTextFrame, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(45), getProperty(xTextFrame, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetY")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetY")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBitmapTile")); + //Frame 16 + xTextFrame = getShape(16); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xTextFrame, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xTextFrame, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapPositionOffsetY")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetX")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xTextFrame, "FillBitmapOffsetY")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTextFrame, "FillBitmapTile")); + aGradientxTextFrame = getProperty(xTextFrame, "FillTransparenceGradient"); + CPPUNIT_ASSERT_EQUAL(css::awt::GradientStyle_LINEAR, aGradientxTextFrame.Style); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // check that there are 3 background-image elements + assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap']/style:background-image[@style:repeat='stretch']"_ostr, 3); + // tdf#90640: check that one of them is 55% opaque + assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap' and @fo:background-color='transparent' and @draw:opacity='55%']/style:background-image[@style:repeat='stretch' and @draw:opacity='55%']"_ostr, 1); + // tdf#90640: check that one of them is 43% opaque + // (emulated - hopefully not with rounding errors) + assertXPath(pXmlDoc, "//style:style[@style:parent-style-name='Frame' and @style:family='graphic']/style:graphic-properties[@draw:fill='bitmap' and @fo:background-color='transparent' and @draw:opacity-name='Transparency_20_1']/style:background-image[@style:repeat='stretch' and @draw:opacity='43%']"_ostr, 1); + } +} + +DECLARE_SW_ROUNDTRIP_TEST(testSHA1Correct, "sha1_correct.odt", "1012345678901234567890123456789012345678901234567890", Test) +{ // tdf#114939 this has both an affected password as well as content.xml + CPPUNIT_ASSERT_EQUAL(1, getPages()); + getParagraph(1, "012"); +} + +DECLARE_SW_ROUNDTRIP_TEST(testSHA1Wrong, "sha1_wrong.odt", "1012345678901234567890123456789012345678901234567890", Test) +{ // tdf#114939 this has both an affected password as well as content.xml + CPPUNIT_ASSERT_EQUAL(1, getPages()); + getParagraph(1, "012"); +} + +CPPUNIT_TEST_FIXTURE(Test, testOOoxmlEmbedded) +{ + loadAndReload("oooxml_embedded.sxw"); + uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects()); + uno::Sequence aSeq(xAccess->getElementNames()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), aSeq.getLength()); + uno::Reference xEOSupplier1(xAccess->getByName("Object1"), uno::UNO_QUERY); + uno::Reference xObj1(xEOSupplier1->getEmbeddedObject()); + uno::Reference xEOSupplier2(xAccess->getByName("Object2"), uno::UNO_QUERY); + uno::Reference xObj2(xEOSupplier2->getEmbeddedObject()); + uno::Reference xEOSupplier3(xAccess->getByName("Object3"), uno::UNO_QUERY); + uno::Reference xObj3(xEOSupplier3->getEmbeddedObject()); + uno::Reference xEOSupplier4(xAccess->getByName("Object4"), uno::UNO_QUERY); + uno::Reference xObj4(xEOSupplier4->getEmbeddedObject()); + //checking first object + uno::Reference xSBDoc1(xObj1, uno::UNO_QUERY); + uno::Reference xStorage1(xSBDoc1->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage1)); + //checking second object + uno::Reference xSBDoc2(xObj2, uno::UNO_QUERY); + uno::Reference xStorage2(xSBDoc2->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage2)); + //checking third object + uno::Reference xSBDoc3(xObj3, uno::UNO_QUERY); + uno::Reference xStorage3(xSBDoc3->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage3)); + //checking fourth object + uno::Reference xSBDoc4(xObj4, uno::UNO_QUERY); + uno::Reference xStorage4(xSBDoc4->getDocumentStorage()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(SOFFICE_FILEFORMAT_8), comphelper::OStorageHelper::GetXStorageFormat(xStorage4)); +} + +DECLARE_ODFEXPORT_TEST(testTdf152710, "tdf152710.odt") +{ + // Without this fix in place, this test would have crash at import time + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_ODFEXPORT_TEST(testredlineTextFrame, "redlineTextFrame.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //Note this is for a crash test + //Counting the Number of Frames and checking with the expected count + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); +} + +DECLARE_ODFEXPORT_TEST(testTdf107292, "tdf107292.odt") +{ + // tracked deletions at the same position were loaded in reverse order + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // Without this fix in place, this test would have failed with + // - Expected: Lorem ipsum dolor sit... + // - Actual : dolor ipsumLorem sit... + CPPUNIT_ASSERT_EQUAL(OUString("Lorem ipsum dolor sit..."), getParagraph(1)->getString()); +} + +DECLARE_ODFEXPORT_TEST(testTdf140437, "tdf140437.odt") +{ + // Without the fix in place, the document would have failed to load + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // at least one field should be detected + CPPUNIT_ASSERT(xFields->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf131621) +{ + loadAndReload("tdf131621.ott"); + CPPUNIT_ASSERT_EQUAL(12, getShapes()); + //Crash test, Check number of pages + CPPUNIT_ASSERT_EQUAL( 1, getPages() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135144) +{ + loadAndReload("tdf135144.docx"); + //Crashes at import time after roundtrip + CPPUNIT_ASSERT_EQUAL(3, getPages()); + CPPUNIT_ASSERT_EQUAL(4, getShapes()); +} + +DECLARE_ODFEXPORT_TEST(testTdf130950, "tdf130950.odt") +{ + //Crashes at import time + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); +} + +DECLARE_ODFEXPORT_TEST(testFdo38244, "fdo38244.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // See ooxmlexport's testFdo38244(). + + // Test comment range feature. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty(xPropertySet, "TextPortionType")); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty(xPropertySet, "TextPortionType")); + + // Test properties + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("__Fieldmark__4_1833023242"), getProperty(xPropertySet, "Name")); + CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty(xPropertySet, "Initials")); +} + +CPPUNIT_TEST_FIXTURE(Test, testSenderInitials) +{ + loadAndReload("sender-initials.fodt"); + // Test sender-initial properties (both annotation metadata and text field) + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + // first 3 are annotations, last 2 are text fields + for (unsigned i = 0; i < 3; ++i) + { + uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("I"), getProperty(xPropertySet, "Initials")); + } + for (unsigned i = 0; i < 2; ++i) + { + uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPropertySet, "IsFixed")); + CPPUNIT_ASSERT_EQUAL(OUString("I"), getProperty(xPropertySet, "Content")); + } +} + +DECLARE_ODFEXPORT_TEST(testResolvedComment, "resolved-comment.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xPropertySet(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPropertySet, "Resolved")); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xPropertySet, "Resolved")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf92379) +{ + loadAndReload("tdf92379.fodt"); + // frame style fo:background-color was not imported + uno::Reference xStyles(getStyles("FrameStyles")); + uno::Reference xStyle(xStyles->getByName("encarts"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xffcc99), getProperty(xStyle, "BackColorRGB")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xStyle, "BackColorTransparency")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0xffcc99), getProperty(xStyle, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle, "FillTransparence")); + + uno::Reference xFrameStyle2(xStyles->getByName("Untitled1"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xFrameStyle2, "BackColorRGB")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xFrameStyle2, "BackTransparent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty(xFrameStyle2, "BackColorTransparency")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xFrameStyle2, "FillStyle")); +// unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE +// CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xFrameStyle2, "FillColor")); +// CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xFrameStyle2, "FillTransparence")); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // check that fo:background-color attribute is exported properly + assertXPath(pXmlDoc, "//style:style[@style:family='graphic' and @style:name='encarts']/style:graphic-properties[@fo:background-color='#ffcc99']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='graphic' and @style:name='Untitled1']/style:graphic-properties[@fo:background-color='transparent']"_ostr, 1); + } + + // paragraph style fo:background-color was wrongly inherited despite being + // overridden in derived style + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle1(xParaStyles->getByName( + "Titre Avis expert"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle1, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle1, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle1, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle1, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle1, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xStyle1, "CharColor")); + + uno::Reference xStyle2(xParaStyles->getByName( + "Avis expert questions"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xStyle2, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle2, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xStyle2, "FillStyle")); +// unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE +// CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xStyle2, "FillColor")); +// CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xStyle2, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle2, "CharColor")); + + uno::Reference xStyle31(xParaStyles->getByName( + "avis expert questions non cadres"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x801900), getProperty(xStyle31, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle31, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle31, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0x801900), getProperty(xStyle31, "FillColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle31, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(Color(0x661900), getProperty(xStyle31, "CharColor")); + + uno::Reference xStyle32(xParaStyles->getByName( + "Avis expert rXponses"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xStyle32, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle32, "ParaBackTransparent")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xStyle32, "FillStyle")); +// unfortunately this is actually the pool default value, which would be hard to fix - but it isn't a problem because style is NONE +// CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty(xStyle32, "FillColor")); +// CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xStyle32, "FillTransparence")); + CPPUNIT_ASSERT_EQUAL(Color(0x461900), getProperty(xStyle32, "CharColor")); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // check that fo:background-color attribute is exported properly + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Titre Avis expert']/style:paragraph-properties[@fo:background-color='#661900']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Avis expert questions']/style:paragraph-properties[@fo:background-color='transparent']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='avis expert questions non cadres']/style:paragraph-properties[@fo:background-color='#801900']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='paragraph' and @style:display-name='Avis expert rXponses']/style:paragraph-properties[@fo:background-color='transparent']"_ostr, 1); + } +} + +DECLARE_ODFEXPORT_TEST(testFdo79358, "fdo79358.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // the boolean properties of the index were not exported properly + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes(); + uno::Reference xTOCIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTOCProps(xTOCIndex, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTOCProps, "CreateFromOutline")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTOCProps, "CreateFromMarks")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTOCProps, "CreateFromLevelParagraphStyles")); + // check that the source styles are preserved too while at it + uno::Reference xLevels( + getProperty< uno::Reference >(xTOCProps, + "LevelParagraphStyles")); + uno::Sequence seq { "Heading" }; + CPPUNIT_ASSERT_EQUAL(uno::Any(seq), xLevels->getByIndex(1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(uno::Sequence()), xLevels->getByIndex(2)); +} + +DECLARE_ODFEXPORT_TEST(testTextframeGradient, "textframe-gradient.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); + + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, "FillStyle")); + awt::Gradient2 aGradient = getProperty(xFrame, "FillGradient"); + + // MCGR: Use the completely imported gradient to check for correctness + basegfx::BColorStops aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xc0504d), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xd99594), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aGradient.Style); + + xFrame.set(xIndexAccess->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, "FillStyle")); + aGradient = getProperty(xFrame, "FillGradient"); + + // MCGR: Use the completely imported gradient to check for correctness + aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(2), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x666666), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_AXIAL, aGradient.Style); +} + +CPPUNIT_TEST_FIXTURE(Test, testDuplicateCrossRefHeadingBookmark) +{ + loadAndReload("CrossRefHeadingBookmark.fodt"); + // the file contains invalid duplicate heading cross reference bookmarks + // but we have to round trip them, tdf#94804 + + uno::Reference xBookmarksSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xBookmarks = + xBookmarksSupplier->getBookmarks(); + uno::Reference xBookmark1( + xBookmarks->getByName("__RefHeading__8284_1826734303"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xBookmark1.is()); + CPPUNIT_ASSERT_THROW(xBookmarks->getByName("__RefHeading__1673_25705824"), container::NoSuchElementException); + + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); + + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Any aField1 = xFields->nextElement(); + uno::Reference xField1(aField1, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), xField1->getPresentation(false)); + uno::Any aField2 = xFields->nextElement(); + uno::Reference xField2(aField2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), xField2->getPresentation(false)); +} + +DECLARE_ODFEXPORT_TEST(testFdo60769, "fdo60769.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test multi-paragraph comment range feature. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + while (xRunEnum->hasMoreElements()) + { + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + OUString aType = getProperty(xPropertySet, "TextPortionType"); + // First paragraph: no field end, no anchor + CPPUNIT_ASSERT(aType == "Text" || aType == "Annotation"); + } + + xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY); + while (xRunEnum->hasMoreElements()) + { + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + OUString aType = getProperty(xPropertySet, "TextPortionType"); + // Second paragraph: no field start + CPPUNIT_ASSERT(aType == "Text" || aType == "AnnotationEnd"); + } +} + +DECLARE_ODFEXPORT_TEST(testTdf115815, "tdf115815.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test comment range feature on tracked deletion. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + bool bAnnotationStart = false; + bool bBeforeAnnotation = true; + OUString sTextBeforeAnnotation; + while (xRunEnum->hasMoreElements()) + { + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + OUString aType = getProperty(xPropertySet, "TextPortionType"); + // there is no AnnotationEnd with preceding AnnotationStart, + // i.e. annotation with lost range + CPPUNIT_ASSERT(aType != "AnnotationEnd" || !bAnnotationStart); + + bAnnotationStart = (aType == "Annotation"); + + // collect paragraph text before the first annotation + if (bBeforeAnnotation) + { + if (bAnnotationStart) + bBeforeAnnotation = false; + else if (aType == "Text") + { + uno::Reference xRun(xPropertySet, uno::UNO_QUERY); + sTextBeforeAnnotation += xRun->getString(); + } + } + } + + // This was "Lorem ipsum" (collapsed annotation range) + CPPUNIT_ASSERT_EQUAL(OUString("Lorem "), sTextBeforeAnnotation); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo58949) +{ + comphelper::ScopeGuard g([]() { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::MathTypeToMath::set(true, pBatch); + pBatch->commit(); + }); + + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Filter::Microsoft::Import::MathTypeToMath::set(false, pBatch); + pBatch->commit(); + loadAndReload("fdo58949.docx"); + + /* + * The problem was that the exporter didn't insert "Obj102" to the + * resulting zip file. No idea how to check for "broken" (missing OLE data + * and replacement image) OLE objects using UNO, so we'll check the zip file directly. + */ + + save("writer8"); + + uno::Sequence aArgs{ uno::Any(maTempFile.GetURL()) }; + uno::Reference xNameAccess(m_xSFactory->createInstanceWithArguments("com.sun.star.packages.zip.ZipFileAccess", aArgs), uno::UNO_QUERY); + const css::uno::Sequence aNames(xNameAccess->getElementNames()); + // The exported document must have three objects named ObjNNN. The names are assigned in + // OLEHandler::copyOLEOStream using a static counter, and actual numbers depend on previous + // tests; so just count the matching names here. + int nMatches = 0; + for (const OUString& sName : aNames) + { + OUString sRest; + if (sName.startsWith("Obj", &sRest)) + { + // all following characters must be decimal digits; minimal value is 100 + bool bMatch = sRest.getLength() >= 3 + && std::all_of(sRest.getStr(), sRest.getStr() + sRest.getLength(), + [](sal_Unicode ch) { return ch >= '0' && ch <= '9'; }); + if (bMatch) + ++nMatches; + } + } + CPPUNIT_ASSERT_EQUAL(3, nMatches); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134987) +{ + loadAndReload("tdf134987.docx"); + uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects()); + uno::Sequence aSeq(xAccess->getElementNames()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), aSeq.getLength()); + + OUString aMediaType; + // checking first object (formula) + { + uno::Reference xEOSupplier(xAccess->getByName("Object1"), uno::UNO_QUERY); + uno::Reference xObj(xEOSupplier->getEmbeddedObject()); + CPPUNIT_ASSERT(xObj.is()); + + uno::Reference xSBDoc(xObj, uno::UNO_QUERY); + uno::Reference xStorage(xSBDoc->getDocumentStorage()); + CPPUNIT_ASSERT(xStorage.is()); + + uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xStorProps->getPropertyValue("MediaType") >>= aMediaType); + CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_FORMULA_ASCII)); + } + // checking second object (chart) + { + uno::Reference xEOSupplier(xAccess->getByName("Diagram 1"), uno::UNO_QUERY); + uno::Reference xObj(xEOSupplier->getEmbeddedObject()); + CPPUNIT_ASSERT(xObj.is()); + + uno::Reference xSBDoc(xObj, uno::UNO_QUERY); + uno::Reference xStorage(xSBDoc->getDocumentStorage()); + CPPUNIT_ASSERT(xStorage.is()); + + uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xStorProps->getPropertyValue("MediaType") >>= aMediaType); + CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII)); + } + // checking third object (chart) + { + uno::Reference xEOSupplier(xAccess->getByName("Diagram 2"), uno::UNO_QUERY); + uno::Reference xObj(xEOSupplier->getEmbeddedObject()); + CPPUNIT_ASSERT(xObj.is()); + + uno::Reference xSBDoc(xObj, uno::UNO_QUERY); + uno::Reference xStorage(xSBDoc->getDocumentStorage()); + CPPUNIT_ASSERT(xStorage.is()); + + uno::Reference< beans::XPropertySet > xStorProps(xStorage, uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xStorProps->getPropertyValue("MediaType") >>= aMediaType); + CPPUNIT_ASSERT(aMediaType.equalsIgnoreAsciiCase(MIMETYPE_OASIS_OPENDOCUMENT_CHART_ASCII)); + } +} + +DECLARE_ODFEXPORT_TEST(testStylePageNumber, "ooo321_stylepagenumber.odt") +{ + CPPUNIT_ASSERT_EQUAL(5, getPages()); + uno::Reference xTable1(getParagraphOrTable(1)); +// actually no break attribute is written in this case +// CPPUNIT_ASSERT_EQUAL(style::BreakType_PAGE_BEFORE, getProperty(xTable1, "BreakType")); + CPPUNIT_ASSERT_EQUAL(OUString("Left Page"), getProperty(xTable1, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xTable1, "PageNumberOffset")); + + uno::Reference xPara1(getParagraphOrTable(2)); + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), getProperty(xPara1, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara1, "PageNumberOffset")); + + // i#114163 tdf#77111: OOo < 3.3 bug, it wrote "auto" as "0" for tables + uno::Reference xTable0(getParagraphOrTable(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Left Page"), getProperty(xTable0, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xTable0->getPropertyValue("PageNumberOffset")); + + uno::Reference xPara0(getParagraphOrTable(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), getProperty(xPara0, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xPara0->getPropertyValue("PageNumberOffset")); + + uno::Reference xParaStyles = getStyles("ParagraphStyles"); + uno::Reference xStyle1(xParaStyles->getByName("stylewithbreak1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), getProperty(xStyle1, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xStyle1, "PageNumberOffset")); + + uno::Reference xStyle0(xParaStyles->getByName("stylewithbreak0"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("First Page"), getProperty(xStyle0, "PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xStyle0->getPropertyValue("PageNumberOffset")); +} + +DECLARE_ODFEXPORT_TEST(testCharacterBorder, "charborder.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Make sure paragraph and character attributes don't interfere + // First paragraph has a paragraph border and a character border included by the paragraph style + + // Paragraph border of first paragraph + { + const table::BorderLine2 aFirstParTopBorder(0x6666FF,2,26,26,7,55); + const sal_Int32 aFirstParTopPadding(150); + uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"TopBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"TopBorderDistance")); + + // Bottom border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"BottomBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"BottomBorderDistance")); + + // Left border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"LeftBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"LeftBorderDistance")); + + // Right border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParTopBorder, getProperty(xSet,"RightBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParTopPadding, getProperty(xSet,"RightBorderDistance")); + + // Shadow + const table::ShadowFormat aShadow = getProperty(xSet,"ParaShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(0), aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), aShadow.ShadowWidth); + } + + // Character border for first paragraph + { + const table::BorderLine2 aFirstParCharTopBorder(0xFF3333,0,37,0,2,37); + const sal_Int32 aFirstParCharTopPadding(450); + uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharTopBorderDistance")); + + // Bottom border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharBottomBorderDistance")); + + // Left border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharLeftBorderDistance")); + + // Right border (same as top border) + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharRightBorderDistance")); + + // Shadow + const table::ShadowFormat aShadow = getProperty(xSet,"CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(Color(0xFF3333), Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(2), aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(280), aShadow.ShadowWidth); + + // Check autostyle + { + uno::Reference< style::XAutoStyleFamily > xAutoStyleFamily(getAutoStyles("ParagraphStyles")); + uno::Reference < container::XEnumeration > xAutoStylesEnum( xAutoStyleFamily->createEnumeration() ); + CPPUNIT_ASSERT_EQUAL(true, static_cast(xAutoStylesEnum->hasMoreElements())); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharTopBorderDistance")); + + // Bottom border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharBottomBorderDistance")); + + // Left border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharLeftBorderDistance")); + + // Right border + CPPUNIT_ASSERT_BORDER_EQUAL(aFirstParCharTopBorder, getProperty(xSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aFirstParCharTopPadding, getProperty(xSet,"CharRightBorderDistance")); + } + } + + // Second paragraph's second text portion has a character style named CharDiffBor + // This style includes border with different sides + { + + table::BorderLine2 aBorderArray[4] = + { + table::BorderLine2(0xFF3333,0,37,0,14,37), // Top (fine dashed line) + table::BorderLine2(0x99FF66,26,26,53,11,106), // Bottom + table::BorderLine2(0x6666FF,9,26,9,12,71), // Left + table::BorderLine2(0,0,0,0,table::BorderLineStyle::NONE,0) // Right + }; + + sal_Int32 aDistances[4] = { 400 /*Top*/, 300 /*Bottom*/, 250 /*Left*/, 0 /*Right*/ }; + + // Get second text portion of second paragraph + uno::Reference < beans::XPropertySet > xSet( getRun(getParagraph(2),2), uno::UNO_QUERY ); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[0], getProperty(xSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[0], getProperty(xSet,"CharTopBorderDistance")); + + // Bottom border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[1], getProperty(xSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[1], getProperty(xSet,"CharBottomBorderDistance")); + + // Left border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[2], getProperty(xSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[2], getProperty(xSet,"CharLeftBorderDistance")); + + // Right border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[3], getProperty(xSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[3], getProperty(xSet,"CharRightBorderDistance")); + + // Shadow + const table::ShadowFormat aShadow = getProperty(xSet,"CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(false, static_cast(aShadow.IsTransparent)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation(3), aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(79), aShadow.ShadowWidth); + + // Check character style + { + uno::Reference< container::XNameAccess > xStyleFamily = getStyles("CharacterStyles"); + uno::Reference < beans::XPropertySet > xStyleSet(xStyleFamily->getByName("CharDiffBor"), uno::UNO_QUERY); + + // Top border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[0], getProperty(xStyleSet,"CharTopBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[0], getProperty(xStyleSet,"CharTopBorderDistance")); + + // Bottom border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[1], getProperty(xStyleSet,"CharBottomBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[1], getProperty(xStyleSet,"CharBottomBorderDistance")); + + // Left border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[2], getProperty(xStyleSet,"CharLeftBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[2], getProperty(xStyleSet,"CharLeftBorderDistance")); + + // Right border + CPPUNIT_ASSERT_BORDER_EQUAL(aBorderArray[3], getProperty(xStyleSet,"CharRightBorder")); + CPPUNIT_ASSERT_EQUAL(aDistances[3], getProperty(xStyleSet,"CharRightBorderDistance")); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testProtectionKey) +{ + loadAndReload("protection-key.fodt"); + OUString constexpr password(u"1012345678901234567890123456789012345678901234567890"_ustr); + + // check 1 invalid OOo legacy password and 3 valid ODF 1.2 passwords + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + uno::Reference xSect0(xSections->getByIndex(0), uno::UNO_QUERY); + uno::Sequence const key0(getProperty>(xSect0, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key0, password)); + uno::Reference xSect1(xSections->getByIndex(1), uno::UNO_QUERY); + uno::Sequence const key1(getProperty>(xSect1, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key1, password)); + uno::Reference xSect2(xSections->getByIndex(2), uno::UNO_QUERY); + uno::Sequence const key2(getProperty>(xSect2, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key2, password)); + uno::Reference xSect3(xSections->getByIndex(3), uno::UNO_QUERY); + uno::Sequence const key3(getProperty>(xSect3, "ProtectionKey")); + CPPUNIT_ASSERT(SvPasswordHelper::CompareHashPassword(key3, password)); + + // we can't assume that the user entered the password; check that we + // round-trip the password as-is + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "//text:section[@text:name='Section0' and @text:protected='true' and @text:protection-key='vbnhxyBKtPHCA1wB21zG1Oha8ZA=']"_ostr); + assertXPath(pXmlDoc, "//text:section[@text:name='Section1' and @text:protected='true' and @text:protection-key='nLHas0RIwepGDaH4c2hpyIUvIS8=']"_ostr); + assertXPath(pXmlDoc, "//text:section[@text:name='Section2' and @text:protected='true' and @text:protection-key-digest-algorithm='http://www.w3.org/2000/09/xmldsig#sha256' and @text:protection-key='1tnJohagR2T0yF/v69hLPuumSTsj32CumW97nkKGuSQ=']"_ostr); + assertXPath(pXmlDoc, "//text:section[@text:name='Section3' and @text:protected='true' and @text:protection-key-digest-algorithm='http://www.w3.org/2000/09/xmldsig#sha256' and @text:protection-key='1tnJohagR2T0yF/v69hLPuumSTsj32CumW97nkKGuSQ=']"_ostr); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128188) +{ + loadAndReload("footnote-collect-at-end-of-section.fodt"); + SwDoc *const pDoc = dynamic_cast(*mxComponent).GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + SwFootnoteIdxs const& rFootnotes(pDoc->GetFootnoteIdxs()); + // Section1 + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[0]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[0]->GetFootnote().GetNumberRLHidden()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[1]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[1]->GetFootnote().GetNumberRLHidden()); + // Section2 + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[2]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[2]->GetFootnote().GetNumberRLHidden()); + // deleted + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[3]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[3]->GetFootnote().GetNumberRLHidden()); + // deleted + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnotes[4]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnotes[4]->GetFootnote().GetNumberRLHidden()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnotes[5]->GetFootnote().GetNumber()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnotes[5]->GetFootnote().GetNumberRLHidden()); +} + +DECLARE_ODFEXPORT_TEST(testFdo43807, "fdo43807.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xSet(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Drop Caps"),getProperty(xSet,"DropCapCharStyleName")); + + xSet.set(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("User Defined Drop Caps"),getProperty(xSet,"DropCapCharStyleName")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf103091) +{ + loadAndReload("tdf103091.fodt"); + // check that all conditional paragraph style conditions are imported + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle1(xParaStyles->getByName( + "Text body"), uno::UNO_QUERY); + auto conditions(getProperty>(xStyle1, "ParaStyleConditions")); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(28), conditions.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("TableHeader"), conditions[0].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Addressee")), conditions[0].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Table"), conditions[1].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Bibliography 1")), conditions[1].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), conditions[2].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Bibliography Heading")), conditions[2].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Section"), conditions[3].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Caption")), conditions[3].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Footnote"), conditions[4].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Salutation")), conditions[4].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Endnote"), conditions[5].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 1")), conditions[5].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Header"), conditions[6].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 2")), conditions[6].Value); + CPPUNIT_ASSERT_EQUAL(OUString("Footer"), conditions[7].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 3")), conditions[7].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel1"), conditions[8].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 4")), conditions[8].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel2"), conditions[9].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 5")), conditions[9].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel3"), conditions[10].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 6")), conditions[10].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel4"), conditions[11].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 7")), conditions[11].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel5"), conditions[12].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 8")), conditions[12].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel6"), conditions[13].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 9")), conditions[13].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel7"), conditions[14].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents 10")), conditions[14].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel8"), conditions[15].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Contents Heading")), conditions[15].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel9"), conditions[16].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Standard")), conditions[16].Value); + CPPUNIT_ASSERT_EQUAL(OUString("OutlineLevel10"), conditions[17].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Drawing")), conditions[17].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel1"), conditions[18].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Endnote")), conditions[18].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel2"), conditions[19].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("First line indent")), conditions[19].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel3"), conditions[20].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footer")), conditions[20].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel4"), conditions[21].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footer left")), conditions[21].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel5"), conditions[22].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footer right")), conditions[22].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel6"), conditions[23].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Footnote")), conditions[23].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel7"), conditions[24].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Frame contents")), conditions[24].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel8"), conditions[25].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Hanging indent")), conditions[25].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel9"), conditions[26].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Header")), conditions[26].Value); + CPPUNIT_ASSERT_EQUAL(OUString("NumberingLevel10"), conditions[27].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Header left")), conditions[27].Value); +} + +DECLARE_ODFEXPORT_TEST(testTextframeTransparentShadow, "textframe-transparent-shadow.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPicture = getShape(1); + // ODF stores opacity of 75%, that means 25% transparency. + CPPUNIT_ASSERT_EQUAL(sal_Int32(25), getProperty(xPicture, "ShadowTransparence")); +} + +DECLARE_ODFEXPORT_TEST(testRelhPage, "relh-page.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFrame = getShape(1); + // This was text::RelOrientation::FRAME (the default), RelativeHeightRelation was not handled in xmloff. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xTextFrame, "RelativeHeightRelation")); + // Make sure rel-height-rel doesn't affect width. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xTextFrame, "RelativeWidthRelation")); + + // This was 2601, 20% height was relative from margin, not page. + CPPUNIT_ASSERT_EQUAL(sal_Int32(3168), parseDump("/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "height"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testRelhPageTdf80282, "relh-page-tdf80282.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFrame = getShape(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Height", sal_Int32(8391), parseDump("//anchored/fly/infos/bounds"_ostr, "height"_ostr).toInt32()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Width", sal_Int32(5953), parseDump("//anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testRelwPage, "relw-page.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextFrame = getShape(1); + // This was text::RelOrientation::FRAME (the default), RelativeWidthRelation was not handled in xmloff. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xTextFrame, "RelativeWidthRelation")); + // Make sure rel-width-rel doesn't affect height. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xTextFrame, "RelativeHeightRelation")); + + // This was 3762, 40% width was relative from margin, not page. + CPPUNIT_ASSERT_EQUAL(sal_Int32(4896), parseDump("/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testTextFrameVertAdjust, "textframe-vertadjust.odt") +{ + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test import/export of new frame attribute called TextVerticalAdjust + + // 1st frame's context is adjusted to the top + uno::Reference xFrame(getTextFrameByName("Rectangle 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_TOP, getProperty(xFrame, "TextVerticalAdjust")); + // 2nd frame's context is adjusted to the center + xFrame.set(getTextFrameByName("Rectangle 2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_CENTER, getProperty(xFrame, "TextVerticalAdjust")); + // 3rd frame's context is adjusted to the bottom + xFrame.set(getTextFrameByName("Rectangle 3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_BOTTOM, getProperty(xFrame, "TextVerticalAdjust")); +} + +DECLARE_ODFEXPORT_TEST(testTdf111891_frameVertStyle, "tdf111891_frameVertStyle.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_BOTTOM, getProperty(xFrame, "TextVerticalAdjust")); +} + +DECLARE_ODFEXPORT_TEST(testShapeRelsize, "shape-relsize.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // These were all 0, as style:rel-width/height was ignored on import for shapes. + CPPUNIT_ASSERT_EQUAL(sal_Int16(40), getProperty(xShape, "RelativeWidth")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(20), getProperty(xShape, "RelativeHeight")); + + // Relation was "page" for both width and height, should be "paragraph" for width. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xShape, "RelativeWidthRelation")); + // And make sure that height stays "page". + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, "RelativeHeightRelation")); +} + +DECLARE_ODFEXPORT_TEST(testTextboxRoundedCorners, "textbox-rounded-corners.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + comphelper::SequenceAsHashMap aCustomShapeGeometry(getProperty< uno::Sequence >(xShape, "CustomShapeGeometry")); + + // Test that the shape is a rounded rectangle. + CPPUNIT_ASSERT_EQUAL(OUString("round-rectangle"), aCustomShapeGeometry["Type"].get()); + + // The shape text should start with a table, with "a" in its A1 cell. + uno::Reference xText = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + uno::Reference xTable(getParagraphOrTable(1, xText), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("a"), xCell->getString()); + + // Table inside a textbox should be in the extension namespace. + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // This failed, as draw:custom-shape had a table:table child. + assertXPath(pXmlDoc, "//draw:custom-shape/loext:table"_ostr, "name"_ostr, "Table1"); + } +} + +// test that import whitespace collapsing is compatible with old docs +DECLARE_ODFEXPORT_TEST(testWhitespace, "whitespace.odt") +{ + CPPUNIT_ASSERT_EQUAL(4, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPara; + uno::Reference xPortions; + uno::Reference xPortion; + xPara.set(getParagraphOrTable(1), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(2), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), getProperty(xPortion, "HyperLinkURL")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(3), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Ruby"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(), xPortion->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("foo"), getProperty(xPortion, "RubyText")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Ruby"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(4), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("InContentMetadata"), getProperty(xPortion, "TextPortionType")); + { + // what a stupid idea to require recursively enumerating this + uno::Reference xMeta( + getProperty>(xPortion, "InContentMetadata"), uno::UNO_QUERY); + uno::Reference xMetaPortions = + xMeta->createEnumeration(); + uno::Reference xMP(xMetaPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xMP, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xMP->getString()); + CPPUNIT_ASSERT(!xMetaPortions->hasMoreElements()); + } + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(5), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xPortion, "TextPortionType")); + { + // what a stupid idea to require recursively enumerating this + uno::Reference xMeta( + getProperty>(xPortion, "TextField"), uno::UNO_QUERY); + uno::Reference xMetaPortions = + xMeta->createEnumeration(); + uno::Reference xMP(xMetaPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xMP, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xMP->getString()); + CPPUNIT_ASSERT(!xMetaPortions->hasMoreElements()); + } + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(7), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(8), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(9), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(10), uno::UNO_QUERY); + uno::Reference xCEA(xPara, uno::UNO_QUERY); + uno::Reference xFrames( + xCEA->createContentEnumeration("com.sun.star.text.TextContent")); + xFrames->nextElement(); // one at-paragraph frame + CPPUNIT_ASSERT(!xFrames->hasMoreElements()); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(11), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Footnote"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(12), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(13), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty(xPortion, "TextPortionType")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(15), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(16), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(17), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(18), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Redline"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(19), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ReferenceMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(20), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ReferenceMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ReferenceMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(21), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("DocumentIndexMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); + + xPara.set(getParagraphOrTable(22), uno::UNO_QUERY); + xPortions.set(xPara->createEnumeration()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("X "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("DocumentIndexMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" "), xPortion->getString()); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("DocumentIndexMark"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT(!getProperty(xPortion, "IsCollapsed")); + xPortion.set(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xPortion, "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString(" X"), xPortion->getString()); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); +} + +DECLARE_ODFEXPORT_TEST(testTdf136645, "tdf136645.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // Without the fix in place, this would have failed with + //- Expected: 2640 + //- Actual : 3000 + CPPUNIT_ASSERT_EQUAL(sal_Int32(2640), parseDump("/root/page/body/section/column[1]/body/infos/bounds"_ostr, "width"_ostr).toInt32()); + + //- Expected: 6000 + //- Actual : 6360 + CPPUNIT_ASSERT_EQUAL(sal_Int32(6000), parseDump("/root/page/body/section/column[2]/body/infos/bounds"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_ODFEXPORT_TEST(testBtlrCell, "btlr-cell.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Without the accompanying fix in place, this test would have failed, as + // the btlr text direction in the A1 cell was lost on ODF import and + // export. + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables = xSupplier->getTextTables(); + uno::Reference xTable(xTables->getByName("Table1"), uno::UNO_QUERY); + uno::Reference xA1(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, getProperty(xA1, "WritingMode")); + + uno::Reference xB1(xTable->getCellByName("B1"), uno::UNO_QUERY); + auto nActual = getProperty(xB1, "WritingMode"); + CPPUNIT_ASSERT(nActual == text::WritingMode2::LR_TB || nActual == text::WritingMode2::CONTEXT); + + uno::Reference xC1(xTable->getCellByName("C1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL, getProperty(xC1, "WritingMode")); +} + +DECLARE_ODFEXPORT_TEST(testBtlrFrame, "btlr-frame.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Without the accompanying fix in place, this test would have failed, as + // the btlr text direction in the text frame was lost on ODF import and + // export. + uno::Reference xTextFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xTextFrame.is()); + + auto nActual = getProperty(xTextFrame, "WritingMode"); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, nActual); + + // Without the accompanying fix in place, this test would have failed, as the fly frame had + // mbVertical==true, but mbVertLRBT==false, even if the writing direction in the doc model was + // btlr. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + CPPUNIT_ASSERT(pLayout); + + SwFrame* pPageFrame = pLayout->GetLower(); + CPPUNIT_ASSERT(pPageFrame); + CPPUNIT_ASSERT(pPageFrame->IsPageFrame()); + + SwFrame* pBodyFrame = pPageFrame->GetLower(); + CPPUNIT_ASSERT(pBodyFrame); + CPPUNIT_ASSERT(pBodyFrame->IsBodyFrame()); + + SwFrame* pBodyTextFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pBodyTextFrame); + CPPUNIT_ASSERT(pBodyTextFrame->IsTextFrame()); + + CPPUNIT_ASSERT(pBodyTextFrame->GetDrawObjs()); + const SwSortedObjs& rAnchored = *pBodyTextFrame->GetDrawObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), rAnchored.size()); + + auto* pFlyFrame = dynamic_cast(rAnchored[0]); + CPPUNIT_ASSERT(pFlyFrame); + CPPUNIT_ASSERT(pFlyFrame->IsVertLRBT()); + + if (!isExported()) + // Not yet exported, don't modify the doc model for test purposes. + return; + + // Make sure that btlr -> tbrl transition clears the "BT" flag. + xTextFrame->setPropertyValue("WritingMode", uno::Any(text::WritingMode2::TB_LR)); + pFlyFrame = dynamic_cast(rAnchored[0]); + CPPUNIT_ASSERT(pFlyFrame); + CPPUNIT_ASSERT(!pFlyFrame->IsVertLRBT()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129520) +{ + loadAndReload("tdf129520.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(OUString("M"), getParagraph(1)->getString()); + + // Without this fix in place, this test would have failed with + // - Expected: Ma + // - Actual : + CPPUNIT_ASSERT_EQUAL(OUString("Ma"), getParagraph(2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("1815"), getParagraph(3)->getString()); +} + +DECLARE_ODFEXPORT_TEST(testFdo86963, "fdo86963.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Export of this document failed with beans::UnknownPropertyException. + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +DECLARE_ODFEXPORT_TEST(testTdf135338_firstLeftPageFooter, "tdf135338_firstLeftPageFooter.odt") +{ + CPPUNIT_ASSERT_EQUAL(6, getPages()); + // The first page is a left page only style, but it should still show the first page footer + // instead of the left footer text "EVEN/LEFT (Left page only)" + CPPUNIT_ASSERT_EQUAL(OUString("First (Left page only)"), parseDump("/root/page[2]/footer/txt/text()"_ostr)); +} + +DECLARE_ODFEXPORT_TEST(testGerrit13858, "gerrit13858.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Just make sure the output is valid. +} +DECLARE_ODFEXPORT_TEST(testOdtBorderTypes, "border_types.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + static const sal_Int32 lineStyles[] = { 0, 1, 2, 14, 16, 17, 3, 15 }; + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(textDocument->getText(), uno::UNO_QUERY); + // list of paragraphs + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + do + { + uno::Reference xServiceInfo; + if (xParaEnum->nextElement() >>= xServiceInfo) + { + if (xServiceInfo->supportsService("com.sun.star.text.TextTable")) + { + uno::Reference const xCellRange(xServiceInfo, uno::UNO_QUERY_THROW); + + for (sal_Int32 row = 0; row < 15; row += 2) + { + uno::Reference xCell = xCellRange->getCellByPosition(1, row); + uno::Reference< beans::XPropertySet > xPropSet(xCell, uno::UNO_QUERY_THROW); + + uno::Any aTopBorder = xPropSet->getPropertyValue("TopBorder"); + table::BorderLine2 aTopBorderLine; + if (aTopBorder >>= aTopBorderLine) + { + sal_Int32 lineStyle = aTopBorderLine.LineStyle; + CPPUNIT_ASSERT_EQUAL(lineStyles[row / 2], lineStyle); + } + } //end of the 'for' loop + } + } + } while (xParaEnum->hasMoreElements()); +} + +DECLARE_ODFEXPORT_TEST(testMasterPageWithDrawingPage, "sw_hatch.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xStyles(getStyles("PageStyles")); + uno::Reference xStyle(xStyles->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_HATCH, getProperty(xStyle, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Blue -45 Degrees"), getProperty(xStyle, "FillHatchName")); + CPPUNIT_ASSERT(!getProperty(xStyle, "FillBackground")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xStyle, "FillTransparence")); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeOOo) +{ + loadAndReload("pagestyle_background_ooo33.odt"); + CPPUNIT_ASSERT_EQUAL(3, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Standard + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#99ccff"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // Endnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Footnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "stretch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeLO64) +{ + loadAndReload("pagestyle_background_lo64.odt"); + CPPUNIT_ASSERT_EQUAL(6, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Standard + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#99ccff"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // Endnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Footnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "stretch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Landscape + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "no-repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Index + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "gradient"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "gradient-step-count"_ostr, "0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // First Page + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "hatch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-hatch-solid"_ostr, "false"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleBackgroundFullSizeLO70) +{ + loadAndReload("pagestyle_background_lo70.odt"); + CPPUNIT_ASSERT_EQUAL(6, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + // Standard + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#99ccff"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Standard']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // Endnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Endnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Footnote + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "stretch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Footnote']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Landscape + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "border"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "repeat"_ostr, "no-repeat"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Landscape']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-image-ref-point"_ostr, "top-left"); + // Index + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "gradient"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "gradient-step-count"_ostr, "0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='Index']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); + // First Page + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "background-size"_ostr, "full"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill"_ostr, "hatch"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "fill-hatch-solid"_ostr, "false"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:family='drawing-page' and @style:name = " + "/office:document-styles/office:master-styles/style:master-page[@style:name='First_20_Page']/attribute::draw:style-name" + "]/style:drawing-page-properties"_ostr, "opacity"_ostr, "100%"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFillBitmapUnused) +{ + loadAndReload("fillbitmap3.odt"); + CPPUNIT_ASSERT_EQUAL(4, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // nav_5f_home and all its references are completely gone + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + // paragraph style + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties"_ostr, "fill-color"_ostr, "#c0c0c0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/style:style[@style:name='Text_20_body']/loext:graphic-properties[@draw:fill-image-name]"_ostr, 0); + + // page style page-layout + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:page-layout-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:page-layout-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:header-style/style:header-footer-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:header-style/style:header-footer-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:footer-style/style:header-footer-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm1']/style:footer-style/style:header-footer-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:page-layout-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:page-layout-properties[@draw:fill-image-name]"_ostr, 0); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:header-style/style:header-footer-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:header-style/style:header-footer-properties[@draw:fill-image-name]"_ostr, 0); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:footer-style/style:header-footer-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:page-layout[@style:name='Mpm2']/style:footer-style/style:header-footer-properties[@draw:fill-image-name]"_ostr, 0); + + // page style drawing-page + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties"_ostr, "fill"_ostr, "bitmap"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp1']/style:drawing-page-properties"_ostr, "fill-image-name"_ostr, "nav_5f_up"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties"_ostr, "fill"_ostr, "solid"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties"_ostr, "fill-color"_ostr, "#c0c0c0"); + assertXPath(pXmlDoc, + "/office:document-styles/office:automatic-styles/style:style[@style:name='Mdp2']/style:drawing-page-properties[@draw:fill-image-name]"_ostr, 0); + + // the named items + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/draw:fill-image"_ostr, 1); + assertXPath(pXmlDoc, + "/office:document-styles/office:styles/draw:fill-image"_ostr, "name"_ostr, "nav_5f_up"); +} + +DECLARE_ODFEXPORT_TEST(testCellUserDefineAttr, "userdefattr-tablecell.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference const xCellA1(xTable->getCellByName("A1"), uno::UNO_SET_THROW); + uno::Reference const xCellB1(xTable->getCellByName("B1"), uno::UNO_SET_THROW); + uno::Reference const xCellC1(xTable->getCellByName("C1"), uno::UNO_SET_THROW); + getUserDefineAttribute(uno::Any(xCellA1), "proName", "v1"); + getUserDefineAttribute(uno::Any(xCellB1), "proName", "v2"); + getUserDefineAttribute(uno::Any(xCellC1), "proName", "v3"); +} + +DECLARE_ODFEXPORT_TEST(testEmbeddedPdf, "embedded-pdf.odt") +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // This failed, pdf+png replacement graphics pair didn't survive an ODT roundtrip. + auto xReplacementGraphic = getProperty>(xShape, "ReplacementGraphic"); + CPPUNIT_ASSERT(xReplacementGraphic.is()); + + auto xGraphic = getProperty>(xShape, "Graphic"); + CPPUNIT_ASSERT(xGraphic.is()); + // This was image/x-vclgraphic, not exposing the info that the image is a PDF one. + CPPUNIT_ASSERT_EQUAL(OUString("application/pdf"), getProperty(xGraphic, "MimeType")); + + if (isExported()) + { + uno::Sequence aArgs{ uno::Any(maTempFile.GetURL()) }; + uno::Reference xNameAccess(m_xSFactory->createInstanceWithArguments("com.sun.star.packages.zip.ZipFileAccess", aArgs), uno::UNO_QUERY); + bool bHasBitmap = false; + const uno::Sequence aNames = xNameAccess->getElementNames(); + for (const auto& rElementName : aNames) + { + if (rElementName.startsWith("Pictures") && rElementName.endsWith("png")) + { + bHasBitmap = true; + break; + } + } + // This failed, replacement was an svm file. + CPPUNIT_ASSERT(bHasBitmap); + } +} + +DECLARE_ODFEXPORT_TEST(testTableStyles1, "table_styles_1.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Table styles basic graphic test. + // Doesn't cover all attributes. + uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); + uno::Reference xCellFamily(xFamilies->getByName("CellStyles"), uno::UNO_QUERY); + uno::Reference xCell1Style; + xCellFamily->getByName("Test style.1") >>= xCell1Style; + + sal_Int32 nInt32 = 0xF0F0F0; + table::BorderLine2 oBorder; + + CPPUNIT_ASSERT_EQUAL(Color(0xCC0000), getProperty(xCell1Style, "BackColor")); + xCell1Style->getPropertyValue("WritingMode") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), nInt32); + xCell1Style->getPropertyValue("VertOrient") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + xCell1Style->getPropertyValue("BorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("LeftBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("RightBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("TopBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("BottomBorderDistance") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(97), nInt32); + xCell1Style->getPropertyValue("RightBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), oBorder.Color); + xCell1Style->getPropertyValue("LeftBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); + xCell1Style->getPropertyValue("TopBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); + xCell1Style->getPropertyValue("BottomBorder") >>= oBorder; + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, oBorder.Color)); +} + +DECLARE_ODFEXPORT_TEST(testTableStyles2, "table_styles_2.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Table styles paragraph and char tests + // Doesn't cover all attributes. + // Problem: underline for table autoformat doesn't work. + uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); + uno::Reference xTableFamily(xFamilies->getByName("TableStyles"), uno::UNO_QUERY); + uno::Reference xTableStyle(xTableFamily->getByName("Test style2"), uno::UNO_QUERY); + uno::Reference xCell1Style; + + float fFloat = 0.; + bool bBool = true; + sal_Int16 nInt16 = 0xF0; + sal_Int32 nInt32 = 0xF0F0F0; + OUString sString; + awt::FontSlant eCharPosture; + + // cell 1 + xTableStyle->getByName("first-row-start-column") >>= xCell1Style; + xCell1Style->getPropertyValue("ParaAdjust") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + CPPUNIT_ASSERT_EQUAL(Color(0xFF6600), getProperty(xCell1Style, "CharColor")); + xCell1Style->getPropertyValue("CharContoured") >>= bBool; + CPPUNIT_ASSERT_EQUAL(false, bBool); + xCell1Style->getPropertyValue("CharShadowed") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharStrikeout") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nInt32); + xCell1Style->getPropertyValue("CharUnderline") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + // underline color is not working for table autoformats + // xCell1Style->getPropertyValue("CharUnderlineHasColor") >>= bBool; + // CPPUNIT_ASSERT_EQUAL(bool(false), bBool); + // xCell1Style->getPropertyValue("CharUnderlineColor") >>= nInt64; + // CPPUNIT_ASSERT_EQUAL(sal_Int64(-1), nInt64); + // standard font + xCell1Style->getPropertyValue("CharHeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); + xCell1Style->getPropertyValue("CharWeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPosture") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Courier"), sString); + xCell1Style->getPropertyValue("CharFontStyleName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString(), sString); + xCell1Style->getPropertyValue("CharFontFamily") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + xCell1Style->getPropertyValue("CharFontPitch") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); + // cjk font + xCell1Style->getPropertyValue("CharHeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); + xCell1Style->getPropertyValue("CharWeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureAsian") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Courier"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Regularna"), sString); + xCell1Style->getPropertyValue("CharFontFamilyAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + xCell1Style->getPropertyValue("CharFontPitchAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); + // ctl font + xCell1Style->getPropertyValue("CharHeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(18.), fFloat); + xCell1Style->getPropertyValue("CharWeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureComplex") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Courier"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Regularna"), sString); + xCell1Style->getPropertyValue("CharFontFamilyComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + xCell1Style->getPropertyValue("CharFontPitchComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), nInt16); + + // cell 2 + xTableStyle->getByName("first-row") >>= xCell1Style; + xCell1Style->getPropertyValue("ParaAdjust") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nInt32); + CPPUNIT_ASSERT_EQUAL(Color(0x9900FF), getProperty(xCell1Style, "CharColor")); + xCell1Style->getPropertyValue("CharContoured") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharShadowed") >>= bBool; + CPPUNIT_ASSERT_EQUAL(false, bBool); + xCell1Style->getPropertyValue("CharStrikeout") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + xCell1Style->getPropertyValue("CharUnderline") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), nInt32); + // underline color test place + // standard font + xCell1Style->getPropertyValue("CharHeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); + xCell1Style->getPropertyValue("CharPosture") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), sString); + xCell1Style->getPropertyValue("CharFontStyleName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString(), sString); + xCell1Style->getPropertyValue("CharFontFamily") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); + xCell1Style->getPropertyValue("CharFontPitch") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // cjk font + xCell1Style->getPropertyValue("CharHeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); + xCell1Style->getPropertyValue("CharPostureAsian") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Pogrubiona"), sString); + xCell1Style->getPropertyValue("CharFontFamilyAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); + xCell1Style->getPropertyValue("CharFontPitchAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // ctl font + xCell1Style->getPropertyValue("CharHeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(150.), fFloat); + xCell1Style->getPropertyValue("CharPostureComplex") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Liberation Serif"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Pogrubiona"), sString); + xCell1Style->getPropertyValue("CharFontFamilyComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), nInt16); + xCell1Style->getPropertyValue("CharFontPitchComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + + // cell 3 + xTableStyle->getByName("first-row-even-column") >>= xCell1Style; + xCell1Style->getPropertyValue("ParaAdjust") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), nInt32); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, getProperty(xCell1Style, "CharColor")); + xCell1Style->getPropertyValue("CharContoured") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharShadowed") >>= bBool; + CPPUNIT_ASSERT_EQUAL(true, bBool); + xCell1Style->getPropertyValue("CharStrikeout") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nInt32); + xCell1Style->getPropertyValue("CharUnderline") >>= nInt32; + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), nInt32); + // underline color test place + // standard font + xCell1Style->getPropertyValue("CharHeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeight") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPosture") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); + xCell1Style->getPropertyValue("CharFontName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Open Sans"), sString); + xCell1Style->getPropertyValue("CharFontStyleName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString(), sString); + xCell1Style->getPropertyValue("CharFontFamily") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); + xCell1Style->getPropertyValue("CharFontPitch") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // cjk font + xCell1Style->getPropertyValue("CharHeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightAsian") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureAsian") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Open Sans"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameAsian") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Kursywa"), sString); + xCell1Style->getPropertyValue("CharFontFamilyAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); + xCell1Style->getPropertyValue("CharFontPitchAsian") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); + // ctl font + xCell1Style->getPropertyValue("CharHeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(12.), fFloat); + xCell1Style->getPropertyValue("CharWeightComplex") >>= fFloat; + CPPUNIT_ASSERT_EQUAL(float(100.), fFloat); + xCell1Style->getPropertyValue("CharPostureComplex") >>= eCharPosture; + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, eCharPosture); + xCell1Style->getPropertyValue("CharFontNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Open Sans"), sString); + xCell1Style->getPropertyValue("CharFontStyleNameComplex") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Kursywa"), sString); + xCell1Style->getPropertyValue("CharFontFamilyComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nInt16); + xCell1Style->getPropertyValue("CharFontPitchComplex") >>= nInt16; + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), nInt16); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableStyles3) +{ + loadAndReload("table_styles_3.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // This test checks if default valued attributes aren't exported. + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + // + // For this element the only exported attributes are: "border-left", "border-bottom" + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "background-color"_ostr); + // border-left place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "border-right"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "border-top"_ostr); + // border-bottom place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-left"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-right"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-top"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "padding-bottom"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:table-cell-properties"_ostr, "writing-mode"_ostr); + + // should be absent, because it has only "text-align" attribute, which shouldn't be exported. + // Assume that style:paragraph-properties and style:text-properties exists. + assertXPathChildren(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']"_ostr, 2); + + // + // For this element the only exported attributes are: "use-window-font-color place", "font-size-asian", "font-name-asian", "font-family-asian", "font-name-complex", "font-family-complex" + // use-window-font-color place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-shadow"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-outline"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-line-through-style"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-line-through-type"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-underline-style"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "text-underline-color"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-size"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-weight"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family-generic"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-pitch"_ostr); + // font-size-asian place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-weight-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-asian"_ostr); + // font-name-asian place + // font-family-asian place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-name-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family-generic-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-pitch-asian"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-size-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-weight-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-complex"_ostr); + // font-name-complex place + // font-family-complex place + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-style-name-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-family-generic-complex"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style3.2']/style:text-properties"_ostr, "font-pitch-complex"_ostr); + +} + +CPPUNIT_TEST_FIXTURE(Test, testTableStyles4) +{ + createSwDoc("table_styles_4.odt"); + // Test if loaded styles overwrite existing styles + uno::Reference XFamiliesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFamilies(XFamiliesSupplier->getStyleFamilies()); + uno::Reference xTableFamily(xFamilies->getByName("TableStyles"), uno::UNO_QUERY); + uno::Reference xTableStyle(xTableFamily->getByName("Green"), uno::UNO_QUERY); + uno::Reference xCell1Style; + + xTableStyle->getByName("first-row-start-column") >>= xCell1Style; + CPPUNIT_ASSERT_EQUAL(Color(0x00ff00), getProperty(xCell1Style, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableStyles5) +{ + loadAndReload("table_styles_5.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test if cell styles doesn't have a style:parent-style-name attribute. + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.1']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.2']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.3']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.4']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.5']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.6']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.7']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.8']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.9']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.10']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.11']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.12']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.13']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.14']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.15']"_ostr, "parent-style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-styles/office:styles/style:style[@style:display-name='Test style.16']"_ostr, "parent-style-name"_ostr); + +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf145226) +{ + loadAndReload("tdf145226.fodt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[1]"_ostr, "style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[2]"_ostr, "style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[3]"_ostr, "style-name"_ostr); + assertXPathNoAttribute(pXmlDoc, "/office:document-content/office:body/office:text/table:table/table:table-row[4]"_ostr, "style-name"_ostr); +} + +DECLARE_ODFEXPORT_TEST(testTdf101710, "tdf101710.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test that number format of cell styles can be imported and exported. + uno::Reference xStyle(getStyles("CellStyles")->getByName("Test Style.11"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(10104), getProperty(xStyle, "NumberFormat")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129568) +{ + loadAndReload("tdf129568.fodt"); + // Test that export doesn't fail, and that style is imported and in use. + uno::Reference xStyle(getStyles("CellStyles")->getByName("Default Style.1"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xStyle->isInUse()); + CPPUNIT_ASSERT_EQUAL(Color(0xffff00), getProperty(xStyle, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129568ui) +{ + loadAndReload("tdf129568-ui.fodt"); + // Same as above, but styles referenced by UI name. + uno::Reference xStyle(getStyles("CellStyles")->getByName("Default Style.1"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xStyle->isInUse()); + CPPUNIT_ASSERT_EQUAL(Color(0xffff00), getProperty(xStyle, "BackColor")); +} + +DECLARE_ODFEXPORT_TEST(testTdf132642_keepWithNextTable, "tdf132642_keepWithNextTable.odt") +{ + // Since the row is very big, it should split over two pages. + // Since up to this point we haven't tried to make it match MS formats, it should start on page 1. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Row splits over 2 pages", 2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testImageMimetype) +{ + loadAndReload("image-mimetype.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Test that the loext:mimetype attribute is written for exported images, tdf#109202 + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // Original image (svg) + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p/draw:frame/draw:image[@draw:mime-type='image/svg+xml']"_ostr); +} + + +CPPUNIT_PLUGIN_IMPLEMENT(); +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/odfexport/odfexport2.cxx b/sw/qa/extras/odfexport/odfexport2.cxx new file mode 100644 index 0000000000..6db396c40d --- /dev/null +++ b/sw/qa/extras/odfexport/odfexport2.cxx @@ -0,0 +1,1133 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/odfexport/data/", "writer8") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testEmbeddedFontProps) +{ + loadAndReload("embedded-font-props.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); +#if !defined(MACOSX) + // Test that font style/weight of embedded fonts is exposed. + // Test file is a normal ODT, except EmbedFonts is set to true in settings.xml. + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // These failed, the attributes were missing. + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[1]"_ostr, "font-style"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[1]"_ostr, "font-weight"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[2]"_ostr, "font-style"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[2]"_ostr, "font-weight"_ostr, "bold"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[3]"_ostr, "font-style"_ostr, "italic"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[3]"_ostr, "font-weight"_ostr, "normal"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[4]"_ostr, "font-style"_ostr, "italic"); + assertXPath(pXmlDoc, "//style:font-face[@style:name='Liberation Serif']/svg:font-face-src/svg:font-face-uri[4]"_ostr, "font-weight"_ostr, "bold"); +#endif +} + +DECLARE_ODFEXPORT_TEST(testTdf100492, "tdf100492.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT(xShape.is()); + + // Save the first shape to a SVG + uno::Reference xGraphicExporter = drawing::GraphicExportFilter::create(comphelper::getProcessComponentContext()); + uno::Reference xSourceDoc(xShape, uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xSourceDoc); + + SvMemoryStream aStream; + uno::Reference xOutputStream(new utl::OStreamWrapper(aStream)); + uno::Sequence aDescriptor( comphelper::InitPropertySequence({ + { "OutputStream", uno::Any(xOutputStream) }, + { "FilterName", uno::Any(OUString("SVG")) } + })); + xGraphicExporter->filter(aDescriptor); + aStream.Seek(STREAM_SEEK_TO_BEGIN); + + // TODO: Disabled. Parsing of SVG gives just root node without any children. + // Reason of such behavior unclear. So XPATH assert fails. + + // Parse resulting SVG as XML file. + // xmlDocUniquePtr pXmlDoc = parseXmlStream(&aStream); + + // Check amount of paths required to draw an arrow. + // Since there are still some empty paths in output test can fail later. There are just two + // really used and visible paths. + //assertXPath(pXmlDoc, "/svg/path", 4); +} + +DECLARE_ODFEXPORT_TEST(testTdf77961, "tdf77961.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xStyles(getStyles("PageStyles")); + uno::Reference xStyle(xStyles->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( false , getProperty(xStyle, "GridDisplay")); + CPPUNIT_ASSERT_EQUAL( false , getProperty(xStyle, "GridPrint")); +} + +DECLARE_ODFEXPORT_TEST(testReferenceLanguage, "referencelanguage.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); + // Test loext:reference-language attribute of reference fields + // (used from LibreOffice 6.1, and proposed for next ODF) + OUString const aFieldTexts[] = { "A 2", "Az Isten", "Az 50-esek", + "A 2018-asok", "Az egyebek", "A fejezetek", + u"Az „Őseinket...”"_ustr, "a 2", + "Az v", "az 1", "Az e)", "az 1", + "Az (5)", "az 1", "A 2", "az 1" }; + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + // update "A (4)" to "Az (5)" + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); + + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + uno::Any aHu(OUString("Hu")); + uno::Any ahu(OUString("hu")); + for (auto const& sFieldText : aFieldTexts) + { + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + if (xServiceInfo->supportsService("com.sun.star.text.textfield.GetReference")) + { + uno::Reference xPropertySet(aField, uno::UNO_QUERY); + uno::Any aLang = xPropertySet->getPropertyValue("ReferenceFieldLanguage"); + CPPUNIT_ASSERT_EQUAL(true, aLang == aHu || aLang == ahu); + uno::Reference xField(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sFieldText, xField->getAnchor()->getString()); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testRubyPosition) +{ + loadAndReload("ruby-position.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + assertXPath(pXmlDoc, "//style:style[@style:family='ruby']/style:ruby-properties[@loext:ruby-position='inter-character']"_ostr, 1); + assertXPath(pXmlDoc, "//style:style[@style:family='ruby']/style:ruby-properties[@style:ruby-position='below']"_ostr, 1); +} + +DECLARE_ODFEXPORT_TEST(testAllowOverlap, "allow-overlap.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // Without the accompanying fix in place, this test would have failed with: + // - Expression: !getProperty(xShape, "AllowOverlap") + // i.e. the custom AllowOverlap=false shape property was lost on import/export. + CPPUNIT_ASSERT(!getProperty(xShape, "AllowOverlap")); + xShape = getShape(2); + CPPUNIT_ASSERT(!getProperty(xShape, "AllowOverlap")); +} + +CPPUNIT_TEST_FIXTURE(Test, testSignatureLineProperties) +{ + loadAndReload("signatureline-properties.fodt"); + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT(xShape.is()); + + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "IsSignatureLine")); + CPPUNIT_ASSERT_EQUAL(OUString("{3C24159B-3B98-4F60-AB52-00E7721758E9}"), + getProperty(xShape, "SignatureLineId")); + CPPUNIT_ASSERT_EQUAL(OUString("John Doe"), + getProperty(xShape, "SignatureLineSuggestedSignerName")); + CPPUNIT_ASSERT_EQUAL(OUString("Farmer"), + getProperty(xShape, "SignatureLineSuggestedSignerTitle")); + CPPUNIT_ASSERT_EQUAL(OUString("john@farmers.org"), + getProperty(xShape, "SignatureLineSuggestedSignerEmail")); + CPPUNIT_ASSERT_EQUAL(OUString("Please farm here."), + getProperty(xShape, "SignatureLineSigningInstructions")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "SignatureLineCanAddComment")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "SignatureLineShowSignDate")); + + // tdf#130917 This needs to be always set when importing a doc, ooxml export expects it. + uno::Reference xUnsignedGraphic; + uno::Reference xProps(xShape, uno::UNO_QUERY); + xProps->getPropertyValue("SignatureLineUnsignedImage") >>= xUnsignedGraphic; + CPPUNIT_ASSERT_EQUAL(true, xUnsignedGraphic.is()); +} + +DECLARE_ODFEXPORT_TEST(testQrCodeGenProperties, "qrcode-properties.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT(xShape.is()); + + css::drawing::BarCode aBarCode = getProperty(xShape, "BarCodeProperties"); + + CPPUNIT_ASSERT_EQUAL(OUString("www.libreoffice.org"), + aBarCode.Payload); + CPPUNIT_ASSERT_EQUAL(css::drawing::BarCodeErrorCorrection::LOW, + aBarCode.ErrorCorrection); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), + aBarCode.Border); +} + +DECLARE_ODFEXPORT_TEST(testChapterNumberingNewLine, "chapter-number-new-line.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xNumberingSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xNumberingRules = xNumberingSupplier->getChapterNumberingRules(); + comphelper::SequenceAsHashMap hashMap(xNumberingRules->getByIndex(0)); + + //This failed Actual Value was LISTTAB instead of NEWLINE + CPPUNIT_ASSERT_EQUAL( + sal_Int16(SvxNumberFormat::NEWLINE), hashMap["LabelFollowedBy"].get()); +} + +DECLARE_ODFEXPORT_TEST(testSpellOutNumberingTypes, "spellout-numberingtypes.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // ordinal indicator, ordinal and cardinal number numbering styles (from LibreOffice 6.1) + OUString const aFieldTexts[] = { "1st", "Erste", "Eins", "1.", "Premier", "Un", u"1ᵉʳ"_ustr, "First", "One" }; + // fallback for old platforms without std::codecvt and std::regex supports + OUString const aFieldTextFallbacks[] = { "Ordinal-number 1", "Ordinal 1", "1" }; + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + // update text field content + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); + + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + for (size_t i = 0; i < SAL_N_ELEMENTS(aFieldTexts); i++) + { + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + if (xServiceInfo->supportsService("com.sun.star.text.textfield.PageNumber")) + { + uno::Reference xField(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, aFieldTexts[i].equals(xField->getAnchor()->getString()) || + aFieldTextFallbacks[i%3].equals(xField->getAnchor()->getString())); + } + } +} + +DECLARE_ODFEXPORT_TEST(tdf133507_contextualSpacingSection, "tdf133507_contextualSpacingSection.odt") +{ + // Previously this was one page (no UL spacing) or three pages (every para had spacing) + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +// MAILMERGE Add conditional to expand / collapse bookmarks +DECLARE_ODFEXPORT_TEST(tdf101856_overlapped, "tdf101856_overlapped.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // get bookmark interface + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + // check: we have 2 bookmarks + CPPUNIT_ASSERT_EQUAL(static_cast(2), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkNonHidden")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkHidden")); + + // + uno::Reference xBookmark1(xBookmarksByName->getByName("BookmarkNonHidden"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark1, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xBookmark1, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark2(xBookmarksByName->getByName("BookmarkHidden"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark2, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark2, UNO_NAME_BOOKMARK_HIDDEN)); +} + +// MAILMERGE Add conditional to expand / collapse bookmarks +DECLARE_ODFEXPORT_TEST(tdf101856, "tdf101856.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // get bookmark interface + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + // check: we have 2 bookmarks + CPPUNIT_ASSERT_EQUAL(static_cast(5), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkVisible")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkHidden")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkVisibleWithCondition")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkNotHiddenWithCondition")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("BookmarkHiddenWithCondition")); + + // + uno::Reference xBookmark1(xBookmarksByName->getByName("BookmarkVisible"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark1, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xBookmark1, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark2(xBookmarksByName->getByName("BookmarkHidden"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xBookmark2, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark2, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark3(xBookmarksByName->getByName("BookmarkVisibleWithCondition"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("0==1"), getProperty(xBookmark3, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark3, UNO_NAME_BOOKMARK_HIDDEN)); + + // + // + // The following test doesn't work, while during output in the case of loext:hidden="false". + // no additional parameters are written. Implementation should be reviewed. + // +// uno::Reference xBookmark4(xBookmarksByName->getByName("BookmarkNotHiddenWithCondition"), uno::UNO_QUERY); +// CPPUNIT_ASSERT_EQUAL(OUString("1==1"), getProperty(xBookmark4, UNO_NAME_BOOKMARK_CONDITION)); +// CPPUNIT_ASSERT_EQUAL(false, getProperty(xBookmark4, UNO_NAME_BOOKMARK_HIDDEN)); + + // + uno::Reference xBookmark5(xBookmarksByName->getByName("BookmarkHiddenWithCondition"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1==1"), getProperty(xBookmark5, UNO_NAME_BOOKMARK_CONDITION)); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xBookmark5, UNO_NAME_BOOKMARK_HIDDEN)); +} + +DECLARE_ODFEXPORT_TEST(tdf118502, "tdf118502.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape = getShape(1); + // Make sure the replacement graphic is still there + // (was gone because the original graphic was not recognized during load) + auto xReplacementGraphic + = getProperty>(xShape, "ReplacementGraphic"); + CPPUNIT_ASSERT(xReplacementGraphic.is()); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf99631) +{ + loadAndReload("tdf99631.docx"); + // check import of VisualArea settings of the embedded XLSX OLE objects + xmlDocUniquePtr pXmlDoc = parseExport("Object 1/settings.xml"); + assertXPathContent(pXmlDoc, "//config:config-item[@config:name='VisibleAreaWidth']"_ostr, "4516"); + assertXPathContent(pXmlDoc, "//config:config-item[@config:name='VisibleAreaHeight']"_ostr, "903"); + + xmlDocUniquePtr pXmlDoc2 = parseExport("Object 2/settings.xml"); + assertXPathContent(pXmlDoc2, "//config:config-item[@config:name='VisibleAreaWidth']"_ostr, "4516"); + assertXPathContent(pXmlDoc2, "//config:config-item[@config:name='VisibleAreaHeight']"_ostr, "1355"); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf145871) +{ + loadAndReload("tdf145871.odt"); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + + // Without the fix in place, this test would have failed with + // - Expected: 3150 + // - Actual : 5851 + CPPUNIT_ASSERT_EQUAL(sal_Int64(3150) , getProperty(xTableRows->getByIndex(0), "Height")); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf128504) +{ + loadAndReload("tdf128504.docx"); + uno::Reference xPara = getParagraph(6); + uno::Reference xRun(getRun(xPara,1), uno::UNO_QUERY); + OUString unVisitedStyleName = getProperty(xRun, "UnvisitedCharStyleName"); + CPPUNIT_ASSERT(!unVisitedStyleName.equalsIgnoreAsciiCase("Internet Link")); + OUString visitedStyleName = getProperty(xRun, "VisitedCharStyleName"); + CPPUNIT_ASSERT(!visitedStyleName.equalsIgnoreAsciiCase("Visited Internet Link")); +} + +DECLARE_ODFEXPORT_TEST(tdf121658, "tdf121658.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle1(xParaStyles->getByName( + "Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xStyle1, "ParaHyphenationNoCaps")); +} + +DECLARE_ODFEXPORT_TEST(tdf149248, "tdf149248.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(false, getProperty(getParagraph(2), "ParaHyphenationNoLastWord")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getParagraph(4), "ParaHyphenationNoLastWord")); +} + +DECLARE_ODFEXPORT_TEST(testThemeCrash, "tdf156905.odt") +{ + // first it started to crash at import time, later at export time + CPPUNIT_ASSERT_EQUAL(4, getPages()); +} + +DECLARE_ODFEXPORT_TEST(testTdf150394, "tdf150394.odt") +{ + // crashes at import time + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_ODFEXPORT_TEST(tdf149324, "tdf149324.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), getProperty(getParagraph(2), "ParaHyphenationMinWordLength")); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(7), getProperty(getParagraph(4), "ParaHyphenationMinWordLength")); +} + +DECLARE_ODFEXPORT_TEST(tdf149420, "tdf149420.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), getProperty(getParagraph(2), "ParaHyphenationZone")); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(567), getProperty(getParagraph(4), "ParaHyphenationZone")); +} + +DECLARE_ODFEXPORT_TEST(testArabicZeroNumbering, "arabic-zero-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 64 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero3Numbering, "arabic-zero3-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 65 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO3. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO3), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero4Numbering, "arabic-zero4-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 66 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO4. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO4), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero5Numbering, "arabic-zero5-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 67 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO5. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO5), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testRovasNumbering, "rovas-numbering.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 68 + // - Actual : 4 + // i.e. numbering type was ARABIC, not SZEKELY_ROVAS. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::SZEKELY_ROVAS), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testPageContentTop, "page-content-top.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + sal_Int16 nExpected = text::RelOrientation::PAGE_PRINT_AREA_TOP; + CPPUNIT_ASSERT_EQUAL(nExpected, getProperty(xShape, "VertOrientRelation")); +} + +DECLARE_ODFEXPORT_TEST(testPageContentBottom, "page-content-bottom.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + sal_Int16 nExpected = text::RelOrientation::PAGE_PRINT_AREA_BOTTOM; + CPPUNIT_ASSERT_EQUAL(nExpected, getProperty(xShape, "VertOrientRelation")); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf124470) +{ + loadAndReload("tdf124470TableAndEmbeddedUsedFonts.odt"); + // Table styles were exported out of place, inside font-face-decls. + // Without the fix in place, this will fail already in ODF validation: + // "content.xml[2,2150]: Error: tag name "style:style" is not allowed. Possible tag names are: " + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + + assertXPath(pXmlDoc, "/office:document-content/office:font-face-decls/style:style"_ostr, 0); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:family='table']"_ostr, 1); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:family='table-column']"_ostr, 2); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:family='paragraph']"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf135942) +{ + loadAndReload("nestedTableInFooter.odt"); + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf150927) +{ + // Similar to tdf135942 + + loadAndReload("table-in-frame-in-table-in-header-base.odt"); + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf151100) +{ + // Similar to tdf135942 + + loadAndReload("tdf151100.docx"); + // All table autostyles should be collected, including nested, and must not crash. + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + + assertXPath(pXmlDoc, "/office:document-styles/office:automatic-styles/style:style[@style:family='table']"_ostr, 1); +} + +DECLARE_ODFEXPORT_TEST(testGutterLeft, "gutter-left.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPageStyle; + getStyles("PageStyles")->getByName("Standard") >>= xPageStyle; + sal_Int32 nGutterMargin{}; + xPageStyle->getPropertyValue("GutterMargin") >>= nGutterMargin; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1270 + // - Actual : 0 + // i.e. gutter margin was lost. + CPPUNIT_ASSERT_EQUAL(static_cast(1270), nGutterMargin); +} + +DECLARE_ODFEXPORT_TEST(testTdf52065_centerTabs, "testTdf52065_centerTabs.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + sal_Int32 nTabStop = parseDump("//body/txt[4]/SwParaPortion/SwLineLayout/child::*[3]"_ostr, "width"_ostr).toInt32(); + // Without the fix, the text was unseen, with a tabstop width of 64057. It should be 3057 + CPPUNIT_ASSERT(nTabStop < 4000); + CPPUNIT_ASSERT(3000 < nTabStop); + CPPUNIT_ASSERT_EQUAL(u"Pečiatka zamestnávateľa"_ustr, parseDump("//body/txt[4]/SwParaPortion/SwLineLayout/child::*[4]"_ostr, "portion"_ostr)); + + // tdf#149547: __XXX___invalid CharacterStyles should not be imported/exported + CPPUNIT_ASSERT(!getStyles("CharacterStyles")->hasByName("__XXX___invalid")); +} + +DECLARE_ODFEXPORT_TEST(testTdf104254_noHeaderWrapping, "tdf104254_noHeaderWrapping.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nParaHeight = getXPath(pXmlDoc, "//header/txt[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + // The wrapping on header images is supposed to be ignored (since OOo for MS compat reasons), + // thus making the text run underneath the image. Before, height was 1104. Now it is 552. + CPPUNIT_ASSERT_MESSAGE("Paragraph should fit on a single line", nParaHeight < 600); +} + +DECLARE_ODFEXPORT_TEST(testTdf131025_noZerosInTable, "tdf131025_noZerosInTable.odt") +{ + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables = xSupplier->getTextTables(); + uno::Reference xTable(xTables->getByName("Table1"), uno::UNO_QUERY); + + uno::Reference xCell(xTable->getCellByName("C3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("5 gp"), xCell->getString()); +} + +DECLARE_ODFEXPORT_TEST(testTdf153090, "Custom-Style-TOC.docx") +{ + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes(xIndexSupplier->getDocumentIndexes()); + uno::Reference xTOC(xIndexes->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("_CustomImageCaption"), getProperty(xTOC, "CreateFromParagraphStyle")); + // tdf#153659 this was imported as "table of figures" instead of "Figure Index 1" + // thus custom settings were not retained after ToF update + CPPUNIT_ASSERT_EQUAL(OUString("Figure Index 1"), getProperty(getParagraph(1), "ParaStyleName")); + + xTOC->update(); + OUString const tocContent(xTOC->getAnchor()->getString()); + CPPUNIT_ASSERT(tocContent.indexOf("1. Abb. Ein Haus") != -1); + CPPUNIT_ASSERT(tocContent.indexOf("2. Abb.Ein Schiff!") != -1); + CPPUNIT_ASSERT(tocContent.indexOf(u"1. ábra Small house with Hungarian description category") != -1); +} + +DECLARE_ODFEXPORT_TEST(testTdf143793_noBodyWrapping, "tdf143793_noBodyWrapping.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + // Preserve old document wrapping. Compat "Use OOo 1.1 text wrapping around objects" + // Originally, the body text did not wrap around spill-over header images + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Fits on one page", 1, getPages() ); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nParaHeight = getXPath(pXmlDoc, "//page[1]/header/txt[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + // The header text should wrap around the header image in OOo 1.1 and prior, + // thus taking up two lines instead of one. One line is 276. It should be 552. + CPPUNIT_ASSERT_MESSAGE("Header text should fill two lines", nParaHeight > 400); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf137199) +{ + loadAndReload("tdf137199.docx"); + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(getParagraph(1), "ListLabelString")); + + CPPUNIT_ASSERT_EQUAL(OUString("1)"), getProperty(getParagraph(2), "ListLabelString")); + + CPPUNIT_ASSERT_EQUAL(OUString("HELLO1WORLD!"), getProperty(getParagraph(3), "ListLabelString")); + + CPPUNIT_ASSERT_EQUAL(OUString("HELLO2WORLD!"), getProperty(getParagraph(4), "ListLabelString")); +} + +DECLARE_ODFEXPORT_TEST(testTdf143605, "tdf143605.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // With numbering type "none" there should be just prefix & suffix + CPPUNIT_ASSERT_EQUAL(OUString("."), getProperty(getParagraph(1), "ListLabelString")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf57317_autoListName) +{ + createSwDoc("tdf57317_autoListName.odt"); + // The list style (from styles.xml) overrides a duplicate named auto-style + //uno::Any aNumStyle = getStyles("NumberingStyles")->getByName("L1"); + //CPPUNIT_ASSERT(aNumStyle.hasValue()); + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString("L1"), getProperty(xPara, "NumberingStyleName")); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:DefaultBullet", {}); + + // This was failing with a duplicate auto numbering style name of L1 instead of a unique name, + // thus it was showing the same info as before the bullet modification. + saveAndReload("writer8"); + xPara.set(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + uno::Reference xLevels(xPara->getPropertyValue("NumberingRules"), + uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; + for (beans::PropertyValue const& rProp : std::as_const(aProps)) + { + if (rProp.Name == "BulletChar") + return; + } + CPPUNIT_FAIL("no BulletChar property"); +} + +CPPUNIT_TEST_FIXTURE(Test, testListFormatDocx) +{ + loadAndReload("listformat.docx"); + // Ensure in resulting ODT we also have not just prefix/suffix, but custom delimiters + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(getParagraph(1), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1/1<<"), getProperty(getParagraph(2), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1/1/1<<"), getProperty(getParagraph(3), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1/1/2<<"), getProperty(getParagraph(4), "ListLabelString")); + + // Check also that in numbering styles we have num-list-format defined + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-list-format"_ostr, ">%1%<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-list-format"_ostr, ">>%1%/%2%<<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-list-format"_ostr, ">>%1%/%2%/%3%<<"); + + // But for compatibility there are still prefix/suffix + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-prefix"_ostr, ">"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-suffix"_ostr, "<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-suffix"_ostr, "<<"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-styles/office:styles/text:list-style[@style:name='WWNum1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-suffix"_ostr, "<<"); +} + +DECLARE_ODFEXPORT_TEST(testShapeWithHyperlink, "shape-with-hyperlink.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // Check how conversion from prefix/suffix to list format did work + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p/draw:a"_ostr, + "href"_ostr, "http://shape.com/"); + } +} + +DECLARE_ODFEXPORT_TEST(testShapesHyperlink, "shapes-hyperlink.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(5, getShapes()); + uno::Reference const xPropSet1(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice.org/"), getProperty(xPropSet1, "Hyperlink")); + + uno::Reference const xPropSet2(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice2.org/"), getProperty(xPropSet2, "Hyperlink")); + + uno::Reference const xPropSet3(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice3.org/"), getProperty(xPropSet3, "Hyperlink")); + + uno::Reference const xPropSet4(getShape(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice4.org/"), getProperty(xPropSet4, "Hyperlink")); + + uno::Reference const xPropSet5(getShape(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("http://libreoffice5.org/"), getProperty(xPropSet5, "Hyperlink")); +} + +DECLARE_ODFEXPORT_TEST(testListFormatOdt, "listformat.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Ensure in resulting ODT we also have not just prefix/suffix, but custom delimiters + CPPUNIT_ASSERT_EQUAL(OUString(">1<"), getProperty(getParagraph(1), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1.1<<"), getProperty(getParagraph(2), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1.1.1<<"), getProperty(getParagraph(3), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString(">>1.1.2<<"), getProperty(getParagraph(4), "ListLabelString")); + + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + // Check how conversion from prefix/suffix to list format did work + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-list-format"_ostr, ">%1%<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-list-format"_ostr, ">>%1%.%2%<<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-list-format"_ostr, ">>%1%.%2%.%3%<<"); + + // But for compatibility there are still prefix/suffix as they were before + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-prefix"_ostr, ">"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='1']"_ostr, "num-suffix"_ostr, "<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='2']"_ostr, "num-suffix"_ostr, "<<"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-prefix"_ostr, ">>"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/text:list-style[@style:name='L1']/" + "text:list-level-style-number[@text:level='3']"_ostr, "num-suffix"_ostr, "<<"); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testStyleLink) +{ + // Given a document with a para and a char style that links each other, when loading that + // document: + createSwDoc("style-link.fodt"); + + // Then make sure the char style links the para one: + uno::Any aCharStyle = getStyles("CharacterStyles")->getByName("List Paragraph Char"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: List Paragraph + // - Actual : + // i.e. the linked style was lost on import. + CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph"), getProperty(aCharStyle, "LinkStyle")); + uno::Any aParaStyle = getStyles("ParagraphStyles")->getByName("List Paragraph"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: List Paragraph Char + // - Actual : + // i.e. the linked style was lost on import. + CPPUNIT_ASSERT_EQUAL(OUString("List Paragraph Char"), getProperty(aParaStyle, "LinkStyle")); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf120972) +{ + loadAndReload("table_number_format_3.docx"); + + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + OUString cDecimal(SvtSysLocale().GetLocaleData().getNumDecimalSep()[0]); + assertXPath( + pXmlDoc, + "//style:style[@style:name='P1']/style:paragraph-properties/style:tab-stops/style:tab-stop"_ostr, + "char"_ostr, cDecimal); + assertXPath( + pXmlDoc, + "//style:style[@style:name='P2']/style:paragraph-properties/style:tab-stops/style:tab-stop"_ostr, + "char"_ostr, cDecimal); +} + +DECLARE_ODFEXPORT_TEST(testTdf114287, "tdf114287.odt") +{ + uno::Reference const xLevels1( + getProperty>(getParagraph(2), "NumberingRules")); + uno::Reference const xNum1(xLevels1, uno::UNO_QUERY); + ::comphelper::SequenceAsHashMap props1(xLevels1->getByIndex(0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-700), props1["FirstLineIndent"].get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1330), props1["IndentAt"].get()); + + // 1: automatic style applies list-style-name and margin-left + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), getProperty(getParagraph(2), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5001), getProperty(getParagraph(2), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(2), "ParaRightMargin")); + + // list is continued + uno::Reference const xNum2( + getProperty>(getParagraph(9), "NumberingRules")); + CPPUNIT_ASSERT_EQUAL(xNum1->getName(), xNum2->getName()); + + // 2: style applies list-style-name and margin-left, list applies list-style-name + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), getProperty(getParagraph(9), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5001), getProperty(getParagraph(9), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(9), "ParaRightMargin")); + + // list is continued + uno::Reference const xNum3( + getProperty>(getParagraph(16), "NumberingRules")); + CPPUNIT_ASSERT_EQUAL(xNum1->getName(), xNum3->getName()); + + // 3: style applies margin-left, automatic style applies list-style-name + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), getProperty(getParagraph(16), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5001), getProperty(getParagraph(16), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(16), "ParaRightMargin")); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "left"_ostr, "2268"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "right"_ostr, "11339"); + // the problem was that the list style name of the list must override the + // paragraph style even though it's the same list style + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "left"_ostr, "357"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "right"_ostr, "11339"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[16]/infos/prtBounds"_ostr, "left"_ostr, "357"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[16]/infos/prtBounds"_ostr, "right"_ostr, "11339"); +} + +DECLARE_ODFEXPORT_TEST(testSectionColumnSeparator, "section-columns-separator.fodt") +{ + // tdf#150235: due to wrong types used in column export, 'style:height' and 'style:style' + // attributes were exported incorrectly for 'style:column-sep' element + auto xSection = getProperty>(getParagraph(1), "TextSection"); + auto xColumns = getProperty>(xSection, "TextColumns"); + CPPUNIT_ASSERT(xColumns); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xColumns->getColumnCount()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 50 + // - Actual : 100 + CPPUNIT_ASSERT_EQUAL(static_cast(50), + getProperty(xColumns, "SeparatorLineRelativeHeight")); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 0 + CPPUNIT_ASSERT_EQUAL(css::text::ColumnSeparatorStyle::DOTTED, + getProperty(xColumns, "SeparatorLineStyle")); + + // Check the rest of the properties, too + CPPUNIT_ASSERT_EQUAL(true, getProperty(xColumns, "IsAutomatic")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(600), getProperty(xColumns, "AutomaticDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(9), getProperty(xColumns, "SeparatorLineWidth")); + CPPUNIT_ASSERT_EQUAL(Color(0x99, 0xAA, 0xBB), + getProperty(xColumns, "SeparatorLineColor")); + CPPUNIT_ASSERT_EQUAL( + css::style::VerticalAlignment_BOTTOM, + getProperty(xColumns, "SeparatorLineVerticalAlignment")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xColumns, "SeparatorLineIsOn")); +} + +DECLARE_ODFEXPORT_TEST(testTdf78510, "WordTest_edit.odt") +{ + uno::Reference const xLevels1( + getProperty>(getParagraph(1), "NumberingRules")); + ::comphelper::SequenceAsHashMap props1(xLevels1->getByIndex(0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1000), props1["FirstLineIndent"].get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), props1["IndentAt"].get()); + + // 1: inherited from paragraph style and overridden by list + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(1), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(1), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(1), "ParaRightMargin")); + // 2: as 1 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty(getParagraph(2), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(2), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(2), "ParaRightMargin")); + // 3: as 1 + paragraph sets textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(3), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(3), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(3), "ParaRightMargin")); + // 4: as 1 + paragraph sets firstline, textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(4), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(4), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(4), "ParaRightMargin")); + // 5: as 1 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(5), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(5), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(5), "ParaRightMargin")); + // 6: as 1 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(6), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(6), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(6), "ParaRightMargin")); + + uno::Reference const xLevels8( + getProperty>(getParagraph(8), "NumberingRules")); + ::comphelper::SequenceAsHashMap props8(xLevels8->getByIndex(0)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), props8["FirstLineIndent"].get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), props8["IndentAt"].get()); + + // 8: inherited from paragraph style and overridden by list + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(8), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(8), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(8), "ParaRightMargin")); + // 9: as 8 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty(getParagraph(9), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(9), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(9), "ParaRightMargin")); + // 10: as 8 + paragraph sets textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(10), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(10), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(10), "ParaRightMargin")); + // 11: as 8 + paragraph sets firstline, textleft + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(11), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3000), getProperty(getParagraph(11), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(11), "ParaRightMargin")); + // 12: as 8 + paragraph sets firstline + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2000), getProperty(getParagraph(12), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(12), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(12), "ParaRightMargin")); + // 13: as 8 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(13), "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1270), getProperty(getParagraph(13), "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(13), "ParaRightMargin")); + + // unfortunately it appears that the portions don't have a position + // so it's not possible to check the first-line-offset that's applied + // (the first-line-indent is computed on the fly in SwTextMargin when + // painting) + { + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "left"_ostr, "1134"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/prtBounds"_ostr, "left"_ostr, "1134"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/infos/prtBounds"_ostr, "left"_ostr, "0"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + + assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/infos/prtBounds"_ostr, "left"_ostr, "1701"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[12]/infos/prtBounds"_ostr, "left"_ostr, "-567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[12]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[13]/infos/prtBounds"_ostr, "left"_ostr, "567"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[13]/infos/prtBounds"_ostr, "right"_ostr, "9359"); + } + + // now check the positions where text is actually painted - + // wonder how fragile this is... + // FIXME some platform difference, 1st one is 2306 on Linux, 3087 on WNT ? + // some Mac has 3110 +#if !defined(_WIN32) && !defined(MACOSX) + { + SwDocShell *const pShell(dynamic_cast(*mxComponent).GetDocShell()); + std::shared_ptr pMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump aDumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(aDumper, *pMetaFile); + + // 1: inherited from paragraph style and overridden by list + // bullet char is extra + + assertXPath(pXmlDoc, "//textarray[1]"_ostr, "x"_ostr, "2306"); + // text is after a tab from list - haven't checked if that is correct? + assertXPath(pXmlDoc, "//textarray[2]"_ostr, "x"_ostr, "2873"); + // second line + assertXPath(pXmlDoc, "//textarray[3]"_ostr, "x"_ostr, "2873"); + // 2: as 1 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[4]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[5]"_ostr, "x"_ostr, "3593"); + assertXPath(pXmlDoc, "//textarray[6]"_ostr, "x"_ostr, "2873"); + // 3: as 1 + paragraph sets textleft + assertXPath(pXmlDoc, "//textarray[7]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[8]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[9]"_ostr, "x"_ostr, "3440"); + // 4: as 1 + paragraph sets firstline, textleft + assertXPath(pXmlDoc, "//textarray[10]"_ostr, "x"_ostr, "2306"); + assertXPath(pXmlDoc, "//textarray[11]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[12]"_ostr, "x"_ostr, "3440"); + // 5: as 1 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[13]"_ostr, "x"_ostr, "1739"); + assertXPath(pXmlDoc, "//textarray[14]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[15]"_ostr, "x"_ostr, "2873"); + // 6: as 1 + assertXPath(pXmlDoc, "//textarray[16]"_ostr, "x"_ostr, "2306"); + assertXPath(pXmlDoc, "//textarray[17]"_ostr, "x"_ostr, "2873"); + + // 8: inherited from paragraph style and overridden by list + assertXPath(pXmlDoc, "//textarray[18]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[19]"_ostr, "x"_ostr, "3746"); + assertXPath(pXmlDoc, "//textarray[20]"_ostr, "x"_ostr, "2306"); + // 9: as 8 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[21]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[22]"_ostr, "x"_ostr, "3746"); + assertXPath(pXmlDoc, "//textarray[23]"_ostr, "x"_ostr, "2306"); + // 10: as 8 + paragraph sets textleft + assertXPath(pXmlDoc, "//textarray[24]"_ostr, "x"_ostr, "4007"); + assertXPath(pXmlDoc, "//textarray[25]"_ostr, "x"_ostr, "4880"); + assertXPath(pXmlDoc, "//textarray[26]"_ostr, "x"_ostr, "3440"); + // 11: as 8 + paragraph sets firstline, textleft + assertXPath(pXmlDoc, "//textarray[27]"_ostr, "x"_ostr, "2306"); + assertXPath(pXmlDoc, "//textarray[28]"_ostr, "x"_ostr, "3440"); + assertXPath(pXmlDoc, "//textarray[29]"_ostr, "x"_ostr, "3440"); + // 12: as 8 + paragraph sets firstline + assertXPath(pXmlDoc, "//textarray[30]"_ostr, "x"_ostr, "1172"); + assertXPath(pXmlDoc, "//textarray[31]"_ostr, "x"_ostr, "1739"); + assertXPath(pXmlDoc, "//textarray[32]"_ostr, "x"_ostr, "2306"); + // 13: as 8 + assertXPath(pXmlDoc, "//textarray[33]"_ostr, "x"_ostr, "2873"); + assertXPath(pXmlDoc, "//textarray[34]"_ostr, "x"_ostr, "3746"); + } +#endif +} + +CPPUNIT_TEST_FIXTURE(Test, testParagraphMarkerMarkupRoundtrip) +{ + loadAndReload("ParagraphMarkerMarkup.fodt"); + // Test that the markup stays at save-and-reload + xmlDocUniquePtr pXmlDoc = parseExport("content.xml"); + assertXPath(pXmlDoc, "/office:document-content/office:body/office:text/text:p"_ostr, "marker-style-name"_ostr, "T2"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name='T2']/style:text-properties"_ostr, "font-size"_ostr, "9pt"); + assertXPath(pXmlDoc, "/office:document-content/office:automatic-styles/style:style[@style:name='T2']/style:text-properties"_ostr, "color"_ostr, "#ff0000"); +} + +CPPUNIT_TEST_FIXTURE(Test, testCommentStyles) +{ + createSwDoc(); + + auto xFactory(mxComponent.queryThrow()); + auto xComment(xFactory->createInstance("com.sun.star.text.textfield.Annotation").queryThrow()); + auto xCommentText(getProperty>(xComment, "TextRange")); + xCommentText->setString("Hello World"); + xCommentText.queryThrow()->setPropertyValue("ParaStyleName", uno::Any(OUString("Heading"))); + + xComment->attach(getParagraph(1)->getEnd()); + + saveAndReload("writer8"); + + auto xFields(mxComponent.queryThrow()->getTextFields()->createEnumeration()); + xComment.set(xFields->nextElement().queryThrow()); + CPPUNIT_ASSERT(xComment.queryThrow()->supportsService("com.sun.star.text.textfield.Annotation")); + + xCommentText.set(getProperty>(xComment, "TextRange")); + CPPUNIT_ASSERT_EQUAL(OUString("Heading"), getProperty(xCommentText, "ParaStyleName")); + + auto xStyleFamilies(mxComponent.queryThrow()->getStyleFamilies()); + auto xParaStyles(xStyleFamilies->getByName("ParagraphStyles")); + auto xStyle(xParaStyles.queryThrow()->getByName("Heading")); + CPPUNIT_ASSERT_EQUAL(getProperty(xStyle, "CharHeight"), getProperty(xCommentText, "CharHeight")); + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, + xCommentText.queryThrow()->getPropertyState("CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf150408_IsLegal) +{ + loadAndReload("IsLegal.fodt"); + + // Second level's numbering should use Arabic numbers for first level reference + auto xPara = getParagraph(1); + CPPUNIT_ASSERT_EQUAL(OUString("CH I"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(2); + CPPUNIT_ASSERT_EQUAL(OUString("Sect 1.01"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(3); + CPPUNIT_ASSERT_EQUAL(OUString("CH II"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(4); + CPPUNIT_ASSERT_EQUAL(OUString("Sect 2.01"), getProperty(xPara, "ListLabelString")); + + // Test that the markup stays at save-and-reload + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + assertXPath( + pXmlDoc, + "/office:document-styles/office:styles/text:outline-style/text:outline-level-style[2]"_ostr, + "is-legal"_ostr, "true"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/odfimport/data/BibliographyEntryField.odt b/sw/qa/extras/odfimport/data/BibliographyEntryField.odt new file mode 100644 index 0000000000..067827bb51 Binary files /dev/null and b/sw/qa/extras/odfimport/data/BibliographyEntryField.odt differ diff --git a/sw/qa/extras/odfimport/data/PageAnchorZIndexFirstPage.fodt b/sw/qa/extras/odfimport/data/PageAnchorZIndexFirstPage.fodt new file mode 100644 index 0000000000..6acb5e6d82 --- /dev/null +++ b/sw/qa/extras/odfimport/data/PageAnchorZIndexFirstPage.fodt @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /9j/4AAQSkZJRgABAQEASABIAAD/2wBDABcQERQRDhcUEhQaGBcbIjklIh8fIkYyNSk5UkhX + VVFIUE5bZoNvW2F8Yk5QcptzfIeLkpSSWG2grJ+OqoOPko3/2wBDARgaGiIeIkMlJUONXlBe + jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY3/wAAR + CAARABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA + AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK + FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG + h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl + 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA + AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk + NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE + hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk + 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDmbO2a6uBEpx3J9BU2oWBsypDbkbuR0NJp + lyttdhpOFYbSfSrGsXkU4SOJg2DkkdKxcp+0SWxulD2bb3MyiiitjA//2Q== + + + + + /9j/4AAQSkZJRgABAQEARwBHAAD/2wBDABMNDhAODBMQDxAVFBMWHC4eHBoaHDkpKyIuQztH + RkI7QUBKVGtaSk9lUEBBXX5eZW5yd3l3SFmDjIJ0i2t1d3P/2wBDARQVFRwYHDceHjdzTUFN + c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3P/wAAR + CAANABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA + AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK + FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG + h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl + 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA + AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk + NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE + hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk + 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDjYImnnSJerkAZre/4R6ARf62Tfj73GPyr + nkZkcOpIZTkEdq1P7fu/L27Y9397Fc9aNVtezZ0UZUknzozp4mgmeJiCUODiimu7O5ZjlmOS + T3oroW2pg7X0P//Z + + + + + 2 + + + + + + 1 + + + + + + + diff --git a/sw/qa/extras/odfimport/data/PageAnchorZIndexSecondPage.fodt b/sw/qa/extras/odfimport/data/PageAnchorZIndexSecondPage.fodt new file mode 100644 index 0000000000..e335eee449 --- /dev/null +++ b/sw/qa/extras/odfimport/data/PageAnchorZIndexSecondPage.fodt @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /9j/4AAQSkZJRgABAQEASABIAAD/2wBDABcQERQRDhcUEhQaGBcbIjklIh8fIkYyNSk5UkhX + VVFIUE5bZoNvW2F8Yk5QcptzfIeLkpSSWG2grJ+OqoOPko3/2wBDARgaGiIeIkMlJUONXlBe + jY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY3/wAAR + CAARABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA + AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK + FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG + h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl + 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA + AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk + NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE + hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk + 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDmbO2a6uBEpx3J9BU2oWBsypDbkbuR0NJp + lyttdhpOFYbSfSrGsXkU4SOJg2DkkdKxcp+0SWxulD2bb3MyiiitjA//2Q== + + + + + /9j/4AAQSkZJRgABAQEARwBHAAD/2wBDABMNDhAODBMQDxAVFBMWHC4eHBoaHDkpKyIuQztH + RkI7QUBKVGtaSk9lUEBBXX5eZW5yd3l3SFmDjIJ0i2t1d3P/2wBDARQVFRwYHDceHjdzTUFN + c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3P/wAAR + CAANABYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA + AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK + FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG + h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl + 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA + AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk + NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE + hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk + 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDjYImnnSJerkAZre/4R6ARf62Tfj73GPyr + nkZkcOpIZTkEdq1P7fu/L27Y9397Fc9aNVtezZ0UZUknzozp4mgmeJiCUODiimu7O5ZjlmOS + T3oroW2pg7X0P//Z + + + + + 2 + + + + + + 1 + + + + + + + diff --git a/sw/qa/extras/odfimport/data/PageBackground.odt b/sw/qa/extras/odfimport/data/PageBackground.odt new file mode 100644 index 0000000000..3733d5baed Binary files /dev/null and b/sw/qa/extras/odfimport/data/PageBackground.odt differ diff --git a/sw/qa/extras/odfimport/data/Word2010AsCharShape.odt b/sw/qa/extras/odfimport/data/Word2010AsCharShape.odt new file mode 100644 index 0000000000..06c917f6a8 Binary files /dev/null and b/sw/qa/extras/odfimport/data/Word2010AsCharShape.odt differ diff --git a/sw/qa/extras/odfimport/data/ZoneMacroTest.odt b/sw/qa/extras/odfimport/data/ZoneMacroTest.odt new file mode 100644 index 0000000000..01847632c6 Binary files /dev/null and b/sw/qa/extras/odfimport/data/ZoneMacroTest.odt differ diff --git a/sw/qa/extras/odfimport/data/annotation-formatting.odt b/sw/qa/extras/odfimport/data/annotation-formatting.odt new file mode 100644 index 0000000000..ce8d98f40c Binary files /dev/null and b/sw/qa/extras/odfimport/data/annotation-formatting.odt differ diff --git a/sw/qa/extras/odfimport/data/bnc800714.fodt b/sw/qa/extras/odfimport/data/bnc800714.fodt new file mode 100644 index 0000000000..a759b7c843 --- /dev/null +++ b/sw/qa/extras/odfimport/data/bnc800714.fodt @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + Before. + + + + + + + Frame. + + After. + + + diff --git a/sw/qa/extras/odfimport/data/borders_ooo33.odt b/sw/qa/extras/odfimport/data/borders_ooo33.odt new file mode 100644 index 0000000000..b4ba91658b Binary files /dev/null and b/sw/qa/extras/odfimport/data/borders_ooo33.odt differ diff --git a/sw/qa/extras/odfimport/data/dateFormFormats.odt b/sw/qa/extras/odfimport/data/dateFormFormats.odt new file mode 100644 index 0000000000..ef99e70f41 Binary files /dev/null and b/sw/qa/extras/odfimport/data/dateFormFormats.odt differ diff --git a/sw/qa/extras/odfimport/data/empty-svg-family-name.odt b/sw/qa/extras/odfimport/data/empty-svg-family-name.odt new file mode 100644 index 0000000000..b4b5516e92 Binary files /dev/null and b/sw/qa/extras/odfimport/data/empty-svg-family-name.odt differ diff --git a/sw/qa/extras/odfimport/data/emptyParagraphLoosesFontHeight.fodt b/sw/qa/extras/odfimport/data/emptyParagraphLoosesFontHeight.fodt new file mode 100644 index 0000000000..7843d7e00f --- /dev/null +++ b/sw/qa/extras/odfimport/data/emptyParagraphLoosesFontHeight.fodt @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + value1 + + value2 + + + \ No newline at end of file diff --git a/sw/qa/extras/odfimport/data/fdo37606.odt b/sw/qa/extras/odfimport/data/fdo37606.odt new file mode 100644 index 0000000000..462984f113 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo37606.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo47267-3.odt b/sw/qa/extras/odfimport/data/fdo47267-3.odt new file mode 100644 index 0000000000..a30fbc6eb2 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo47267-3.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo53210.odt b/sw/qa/extras/odfimport/data/fdo53210.odt new file mode 100644 index 0000000000..cfa5044093 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo53210.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo55814.odt b/sw/qa/extras/odfimport/data/fdo55814.odt new file mode 100644 index 0000000000..890fa4b9fd Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo55814.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo56272.odt b/sw/qa/extras/odfimport/data/fdo56272.odt new file mode 100644 index 0000000000..57241d3a78 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo56272.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo60842.odt b/sw/qa/extras/odfimport/data/fdo60842.odt new file mode 100644 index 0000000000..dc2bfbeef1 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo60842.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo68839.odt b/sw/qa/extras/odfimport/data/fdo68839.odt new file mode 100644 index 0000000000..92a25b8f7e Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo68839.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo69862.odt b/sw/qa/extras/odfimport/data/fdo69862.odt new file mode 100644 index 0000000000..aec48fd139 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo69862.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo69979.odt b/sw/qa/extras/odfimport/data/fdo69979.odt new file mode 100644 index 0000000000..8f7d77ec62 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo69979.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo75872_aoo40.odt b/sw/qa/extras/odfimport/data/fdo75872_aoo40.odt new file mode 100644 index 0000000000..549a56706d Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo75872_aoo40.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo75872_ooo33.odt b/sw/qa/extras/odfimport/data/fdo75872_ooo33.odt new file mode 100644 index 0000000000..4cc3de7cc9 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo75872_ooo33.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo79269.odt b/sw/qa/extras/odfimport/data/fdo79269.odt new file mode 100644 index 0000000000..6382936000 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo79269.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo79269_header.odt b/sw/qa/extras/odfimport/data/fdo79269_header.odt new file mode 100644 index 0000000000..8a9702d7fc Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo79269_header.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo81223.odt b/sw/qa/extras/odfimport/data/fdo81223.odt new file mode 100644 index 0000000000..21343d3dd9 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo81223.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo82165.odt b/sw/qa/extras/odfimport/data/fdo82165.odt new file mode 100644 index 0000000000..65a4084b70 Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo82165.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo90130-1.odt b/sw/qa/extras/odfimport/data/fdo90130-1.odt new file mode 100644 index 0000000000..6839b3635b Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo90130-1.odt differ diff --git a/sw/qa/extras/odfimport/data/fdo90130-2.odt b/sw/qa/extras/odfimport/data/fdo90130-2.odt new file mode 100644 index 0000000000..6cf089505e Binary files /dev/null and b/sw/qa/extras/odfimport/data/fdo90130-2.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_image_jpg.odt b/sw/qa/extras/odfimport/data/feature_image_jpg.odt new file mode 100644 index 0000000000..79294a27a7 Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_image_jpg.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_table.odt b/sw/qa/extras/odfimport/data/feature_table.odt new file mode 100644 index 0000000000..5c0bb843fe Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_table.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_table_merged-cells.odt b/sw/qa/extras/odfimport/data/feature_table_merged-cells.odt new file mode 100644 index 0000000000..ef1c99b7db Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_table_merged-cells.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_table_merged-cells_all.odt b/sw/qa/extras/odfimport/data/feature_table_merged-cells_all.odt new file mode 100644 index 0000000000..4608c4db56 Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_table_merged-cells_all.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_table_text.odt b/sw/qa/extras/odfimport/data/feature_table_text.odt new file mode 100644 index 0000000000..ac7e4475fe Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_table_text.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_text.odt b/sw/qa/extras/odfimport/data/feature_text.odt new file mode 100644 index 0000000000..fa55c4c452 Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_text.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_text_background-color.odt b/sw/qa/extras/odfimport/data/feature_text_background-color.odt new file mode 100644 index 0000000000..22dca8b136 Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_text_background-color.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_text_bold.odt b/sw/qa/extras/odfimport/data/feature_text_bold.odt new file mode 100644 index 0000000000..d899017328 Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_text_bold.odt differ diff --git a/sw/qa/extras/odfimport/data/feature_text_italic.odt b/sw/qa/extras/odfimport/data/feature_text_italic.odt new file mode 100644 index 0000000000..560da0922f Binary files /dev/null and b/sw/qa/extras/odfimport/data/feature_text_italic.odt differ diff --git a/sw/qa/extras/odfimport/data/forcepoint101.fodt b/sw/qa/extras/odfimport/data/forcepoint101.fodt new file mode 100644 index 0000000000..7210888262 --- /dev/null +++ b/sw/qa/extras/odfimport/data/forcepoint101.fodt @@ -0,0 +1,13 @@ + + + + + + + + + + foobar + + + diff --git a/sw/qa/extras/odfimport/data/forcepoint108.fodt b/sw/qa/extras/odfimport/data/forcepoint108.fodt new file mode 100644 index 0000000000..4328ea65f6 --- /dev/null +++ b/sw/qa/extras/odfimport/data/forcepoint108.fodt @@ -0,0 +1,67 @@ + + + + ms 2015-08-24T21:49:45.305718699LibreOfficeDev/4.3.7.2$Linux_X86_64 LibreOffice_project/8a35821d8636a03b8bf4e15b48f59794652c68ba + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ms + 2015-09-10T15:36:00 + + foo + + + diff --git a/sw/qa/extras/odfimport/data/hello.odt b/sw/qa/extras/odfimport/data/hello.odt new file mode 100644 index 0000000000..23ce6a4db9 Binary files /dev/null and b/sw/qa/extras/odfimport/data/hello.odt differ diff --git a/sw/qa/extras/odfimport/data/i61225.sxw b/sw/qa/extras/odfimport/data/i61225.sxw new file mode 100644 index 0000000000..4f43541995 Binary files /dev/null and b/sw/qa/extras/odfimport/data/i61225.sxw differ diff --git a/sw/qa/extras/odfimport/data/incorrectsum.odt b/sw/qa/extras/odfimport/data/incorrectsum.odt new file mode 100644 index 0000000000..0e1e99b0d6 Binary files /dev/null and b/sw/qa/extras/odfimport/data/incorrectsum.odt differ diff --git a/sw/qa/extras/odfimport/data/ooo32780-1.odt b/sw/qa/extras/odfimport/data/ooo32780-1.odt new file mode 100644 index 0000000000..e7185b6695 Binary files /dev/null and b/sw/qa/extras/odfimport/data/ooo32780-1.odt differ diff --git a/sw/qa/extras/odfimport/data/ooo77837-1.odt b/sw/qa/extras/odfimport/data/ooo77837-1.odt new file mode 100644 index 0000000000..7be4f2b3e3 Binary files /dev/null and b/sw/qa/extras/odfimport/data/ooo77837-1.odt differ diff --git a/sw/qa/extras/odfimport/data/paste-first-para-direct-format.odt b/sw/qa/extras/odfimport/data/paste-first-para-direct-format.odt new file mode 100644 index 0000000000..866d29c5ff Binary files /dev/null and b/sw/qa/extras/odfimport/data/paste-first-para-direct-format.odt differ diff --git a/sw/qa/extras/odfimport/data/space.odt b/sw/qa/extras/odfimport/data/space.odt new file mode 100644 index 0000000000..66b5109efc Binary files /dev/null and b/sw/qa/extras/odfimport/data/space.odt differ diff --git a/sw/qa/extras/odfimport/data/spellmenu-redline.odt b/sw/qa/extras/odfimport/data/spellmenu-redline.odt new file mode 100644 index 0000000000..268d15c2cc Binary files /dev/null and b/sw/qa/extras/odfimport/data/spellmenu-redline.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf100033_1.odt b/sw/qa/extras/odfimport/data/tdf100033_1.odt new file mode 100644 index 0000000000..b7f3ae7aae Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf100033_1.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf100033_2.odt b/sw/qa/extras/odfimport/data/tdf100033_2.odt new file mode 100644 index 0000000000..98ae7bd6b3 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf100033_2.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf101729.odt b/sw/qa/extras/odfimport/data/tdf101729.odt new file mode 100644 index 0000000000..3afd2d001a Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf101729.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf103025.odt b/sw/qa/extras/odfimport/data/tdf103025.odt new file mode 100644 index 0000000000..bd1e57314d Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf103025.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf107392.odt b/sw/qa/extras/odfimport/data/tdf107392.odt new file mode 100644 index 0000000000..c8a05a9eef Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf107392.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf107776.fodt b/sw/qa/extras/odfimport/data/tdf107776.fodt new file mode 100644 index 0000000000..b59f126177 --- /dev/null +++ b/sw/qa/extras/odfimport/data/tdf107776.fodt @@ -0,0 +1,29 @@ + + + + + + + + + + + Simple content. + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/odfimport/data/tdf108482.odt b/sw/qa/extras/odfimport/data/tdf108482.odt new file mode 100644 index 0000000000..c3ce2fc427 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf108482.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf109080_loext_ns.odt b/sw/qa/extras/odfimport/data/tdf109080_loext_ns.odt new file mode 100644 index 0000000000..ac7b3e272a Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf109080_loext_ns.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf109080_style_ns.odt b/sw/qa/extras/odfimport/data/tdf109080_style_ns.odt new file mode 100644 index 0000000000..ada290dc5f Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf109080_style_ns.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf109228.odt b/sw/qa/extras/odfimport/data/tdf109228.odt new file mode 100644 index 0000000000..0f3368e1b2 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf109228.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf113289.odt b/sw/qa/extras/odfimport/data/tdf113289.odt new file mode 100644 index 0000000000..01aa5700c6 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf113289.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf115079.odt b/sw/qa/extras/odfimport/data/tdf115079.odt new file mode 100644 index 0000000000..6c1039e71c Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf115079.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf116195.odt b/sw/qa/extras/odfimport/data/tdf116195.odt new file mode 100644 index 0000000000..21a601f69d Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf116195.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf120677.fodt b/sw/qa/extras/odfimport/data/tdf120677.fodt new file mode 100644 index 0000000000..b2006828fb --- /dev/null +++ b/sw/qa/extras/odfimport/data/tdf120677.fodt @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/odfimport/data/tdf123829.odt b/sw/qa/extras/odfimport/data/tdf123829.odt new file mode 100644 index 0000000000..3219b41561 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf123829.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf123968.odt b/sw/qa/extras/odfimport/data/tdf123968.odt new file mode 100644 index 0000000000..1c081619ea Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf123968.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf128737.odt b/sw/qa/extras/odfimport/data/tdf128737.odt new file mode 100644 index 0000000000..85f2c32c60 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf128737.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf133459.odt b/sw/qa/extras/odfimport/data/tdf133459.odt new file mode 100644 index 0000000000..9468d7918a Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf133459.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf134971a.odt b/sw/qa/extras/odfimport/data/tdf134971a.odt new file mode 100644 index 0000000000..ee9fa68236 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf134971a.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf134971b.odt b/sw/qa/extras/odfimport/data/tdf134971b.odt new file mode 100644 index 0000000000..9bfadda694 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf134971b.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf138879.odt b/sw/qa/extras/odfimport/data/tdf138879.odt new file mode 100644 index 0000000000..801fe32a22 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf138879.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf146257.odt b/sw/qa/extras/odfimport/data/tdf146257.odt new file mode 100644 index 0000000000..2431fc0a8f Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf146257.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf146597.odt b/sw/qa/extras/odfimport/data/tdf146597.odt new file mode 100644 index 0000000000..6dcc379cef Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf146597.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf149978.fodt b/sw/qa/extras/odfimport/data/tdf149978.fodt new file mode 100644 index 0000000000..5c4840c258 --- /dev/null +++ b/sw/qa/extras/odfimport/data/tdf149978.fodt @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foo bar baz + foo bar baz + foo bar baz + foo bar baz + foo bar baz + foo bar baz + foo bar baz + foo bar baz + foo bar baz + foo bar baz + + + + diff --git a/sw/qa/extras/odfimport/data/tdf151375.ott b/sw/qa/extras/odfimport/data/tdf151375.ott new file mode 100644 index 0000000000..1215cc7722 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf151375.ott differ diff --git a/sw/qa/extras/odfimport/data/tdf152015.odt b/sw/qa/extras/odfimport/data/tdf152015.odt new file mode 100644 index 0000000000..000bba2077 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf152015.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf41542_borderlessPadding.odt b/sw/qa/extras/odfimport/data/tdf41542_borderlessPadding.odt new file mode 100644 index 0000000000..9585041de3 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf41542_borderlessPadding.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf74524.odt b/sw/qa/extras/odfimport/data/tdf74524.odt new file mode 100644 index 0000000000..df6f2e8fe7 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf74524.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf75221.odt b/sw/qa/extras/odfimport/data/tdf75221.odt new file mode 100644 index 0000000000..6ef117c24e Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf75221.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf76322_columnBreakInHeader.docx b/sw/qa/extras/odfimport/data/tdf76322_columnBreakInHeader.docx new file mode 100644 index 0000000000..6c050ae80b Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf76322_columnBreakInHeader.docx differ diff --git a/sw/qa/extras/odfimport/data/tdf76349_1columnBreak.odt b/sw/qa/extras/odfimport/data/tdf76349_1columnBreak.odt new file mode 100644 index 0000000000..0ec4060520 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf76349_1columnBreak.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf89802.fodt b/sw/qa/extras/odfimport/data/tdf89802.fodt new file mode 100644 index 0000000000..3d8601b5ae --- /dev/null +++ b/sw/qa/extras/odfimport/data/tdf89802.fodt @@ -0,0 +1,56 @@ + + + + ms 2015-04-07T22:24:25.3740120802015-04-07T22:25:28.460806924ms PT1M3S1LibreOfficeDev/4.5.0.0.alpha0$Linux_X86_64 LibreOffice_project/52ae345470d8fa657817cf87b3e8e8c1b51bd7da + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foo + + + + + diff --git a/sw/qa/extras/odfimport/data/tdf92586.odt b/sw/qa/extras/odfimport/data/tdf92586.odt new file mode 100644 index 0000000000..894571b628 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf92586.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf94882.odt b/sw/qa/extras/odfimport/data/tdf94882.odt new file mode 100644 index 0000000000..2aacb9836d Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf94882.odt differ diff --git a/sw/qa/extras/odfimport/data/tdf96113.odt b/sw/qa/extras/odfimport/data/tdf96113.odt new file mode 100644 index 0000000000..ede7b07817 Binary files /dev/null and b/sw/qa/extras/odfimport/data/tdf96113.odt differ diff --git a/sw/qa/extras/odfimport/data/timeFormFormats.odt b/sw/qa/extras/odfimport/data/timeFormFormats.odt new file mode 100644 index 0000000000..9b39aec579 Binary files /dev/null and b/sw/qa/extras/odfimport/data/timeFormFormats.odt differ diff --git a/sw/qa/extras/odfimport/data/vmerge-cell-border.odt b/sw/qa/extras/odfimport/data/vmerge-cell-border.odt new file mode 100644 index 0000000000..bf387bcb18 Binary files /dev/null and b/sw/qa/extras/odfimport/data/vmerge-cell-border.odt differ diff --git a/sw/qa/extras/odfimport/odffeatures.cxx b/sw/qa/extras/odfimport/odffeatures.cxx new file mode 100644 index 0000000000..22a11b4176 --- /dev/null +++ b/sw/qa/extras/odfimport/odffeatures.cxx @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/odfimport/data/", "writer8") + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testFeatureText) { createSwDoc("feature_text.odt"); } + +CPPUNIT_TEST_FIXTURE(Test, testFeatureTextBold) { createSwDoc("feature_text_bold.odt"); } + +CPPUNIT_TEST_FIXTURE(Test, testFeatureTextItalic) { createSwDoc("feature_text_italic.odt"); } + +CPPUNIT_PLUGIN_IMPLEMENT(); +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/odfimport/odfimport.cxx b/sw/qa/extras/odfimport/odfimport.cxx new file mode 100644 index 0000000000..6ccc8cce3b --- /dev/null +++ b/sw/qa/extras/odfimport/odfimport.cxx @@ -0,0 +1,1538 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(_WIN32) +#include +#include +#include +#include +#endif + +typedef std::map > AllBordersMap; +typedef std::pair > StringSequencePair; + +class Test : public SwModelTestBase +{ + public: + Test() : SwModelTestBase("/sw/qa/extras/odfimport/data/", "writer8") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testEmptySvgFamilyName) +{ + createSwDoc("empty-svg-family-name.odt"); + // .odt import did crash on the empty font list (which I think is valid according SVG spec) +} + +CPPUNIT_TEST_FIXTURE(Test, testHideAllSections) +{ + createSwDoc("fdo53210.odt"); + // This document has a section that is conditionally hidden, but has no empty paragraph after it. + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xMasters = xTextFieldsSupplier->getTextFieldMasters(); + // Set _CS_Allgemein to 0 + uno::Reference xMaster(xMasters->getByName("com.sun.star.text.fieldmaster.User._CS_Allgemein"), uno::UNO_QUERY); + xMaster->setPropertyValue("Content", uno::Any(OUString("0"))); + // This used to crash + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); +} + +CPPUNIT_TEST_FIXTURE(Test, testOdtBorders) +{ + createSwDoc("borders_ooo33.odt"); + AllBordersMap map; + + map.insert(StringSequencePair(OUString("B2"), { table::BorderLine(0, 2, 2, 35), // left + table::BorderLine(0, 2, 2, 35), // right + table::BorderLine(0, 2, 2, 35), // top + table::BorderLine(0, 2, 2, 35) })); // bottom + + map.insert(StringSequencePair(OUString("D2"), { table::BorderLine(0, 0, 2, 0), + table::BorderLine(0, 0, 2, 0), + table::BorderLine(0, 0, 2, 0), + table::BorderLine(0, 0, 2, 0) })); + + map.insert(StringSequencePair(OUString("B4"), { table::BorderLine(0, 2, 2, 88), + table::BorderLine(0, 2, 2, 88), + table::BorderLine(0, 2, 2, 88), + table::BorderLine(0, 2, 2, 88) })); + + map.insert(StringSequencePair(OUString("D4"), { table::BorderLine(0, 0, 18, 0), + table::BorderLine(0, 0, 18, 0), + table::BorderLine(0, 0, 18, 0), + table::BorderLine(0, 0, 18, 0) })); + + map.insert(StringSequencePair(OUString("B6"), { table::BorderLine(0, 35, 35, 35), + table::BorderLine(0, 35, 35, 35), + table::BorderLine(0, 35, 35, 35), + table::BorderLine(0, 35, 35, 35) })); + + map.insert(StringSequencePair(OUString("D6"), { table::BorderLine(0, 0, 35, 0), + table::BorderLine(0, 0, 35, 0), + table::BorderLine(0, 0, 35, 0), + table::BorderLine(0, 0, 35, 0) })); + + map.insert(StringSequencePair(OUString("B8"), { table::BorderLine(0, 88, 88, 88), + table::BorderLine(0, 88, 88, 88), + table::BorderLine(0, 88, 88, 88), + table::BorderLine(0, 88, 88, 88) })); + + map.insert(StringSequencePair(OUString("D8"), { table::BorderLine(0, 0, 88, 0), + table::BorderLine(0, 0, 88, 0), + table::BorderLine(0, 0, 88, 0), + table::BorderLine(0, 0, 88, 0) })); + + map.insert(StringSequencePair(OUString("B10"), { table::BorderLine(0, 2, 35, 88), + table::BorderLine(0, 2, 35, 88), + table::BorderLine(0, 2, 35, 88), + table::BorderLine(0, 2, 35, 88) })); + + map.insert(StringSequencePair(OUString("D10"), { table::BorderLine(0, 0, 141, 0), + table::BorderLine(0, 0, 141, 0), + table::BorderLine(0, 0, 141, 0), + table::BorderLine(0, 0, 141, 0) })); + + map.insert(StringSequencePair(OUString("B12"), { table::BorderLine(0, 2, 88, 88), + table::BorderLine(0, 2, 88, 88), + table::BorderLine(0, 2, 88, 88), + table::BorderLine(0, 2, 88, 88) })); + + map.insert(StringSequencePair(OUString("D12"), { table::BorderLine(0, 0, 176, 0), + table::BorderLine(0, 0, 176, 0), + table::BorderLine(0, 0, 176, 0), + table::BorderLine(0, 0, 176, 0) })); + + map.insert(StringSequencePair(OUString("B14"), { table::BorderLine(0, 2, 141, 88), + table::BorderLine(0, 2, 141, 88), + table::BorderLine(0, 2, 141, 88), + table::BorderLine(0, 2, 141, 88) })); + + map.insert(StringSequencePair(OUString("B16"), { table::BorderLine(0, 35, 88, 88), + table::BorderLine(0, 35, 88, 88), + table::BorderLine(0, 35, 88, 88), + table::BorderLine(0, 35, 88, 88) })); + + map.insert(StringSequencePair(OUString("B18"), { table::BorderLine(0, 88, 35, 35), + table::BorderLine(0, 88, 35, 35), + table::BorderLine(0, 88, 35, 35), + table::BorderLine(0, 88, 35, 35) })); + + map.insert(StringSequencePair(OUString("B20"), { table::BorderLine(0, 88, 141, 88), + table::BorderLine(0, 88, 141, 88), + table::BorderLine(0, 88, 141, 88), + table::BorderLine(0, 88, 141, 88) })); + + map.insert(StringSequencePair(OUString("B22"), { table::BorderLine(0, 141, 88, 88), + table::BorderLine(0, 141, 88, 88), + table::BorderLine(0, 141, 88, 88), + table::BorderLine(0, 141, 88, 88) })); + + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(textDocument->getText(), uno::UNO_QUERY); + // list of paragraphs + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + do + { + uno::Reference xServiceInfo; + if (xParaEnum->nextElement() >>= xServiceInfo) + { + if (xServiceInfo->supportsService("com.sun.star.text.TextTable")) + { + uno::Reference const xTextTable(xServiceInfo, uno::UNO_QUERY_THROW); + uno::Sequence const cells = xTextTable->getCellNames(); + sal_Int32 nLength = cells.getLength(); + + AllBordersMap::iterator it = map.begin(); + + for (sal_Int32 i = 0; i < nLength; ++i) + { + if(i%10==6 || (i%10==8 && i<60)) // only B and D cells have borders, every 2 rows + { + uno::Reference xCell = xTextTable->getCellByName(cells[i]); + uno::Reference< beans::XPropertySet > xPropSet(xCell, uno::UNO_QUERY_THROW); + it = map.find(cells[i]); + + uno::Any aLeftBorder = xPropSet->getPropertyValue("LeftBorder"); + table::BorderLine aLeftBorderLine; + if (aLeftBorder >>= aLeftBorderLine) + { + sal_Int32 innerLineWidth = aLeftBorderLine.InnerLineWidth; + sal_Int32 outerLineWidth = aLeftBorderLine.OuterLineWidth; + sal_Int32 lineDistance = aLeftBorderLine.LineDistance; + + sal_Int32 perfectInner = it->second[0].InnerLineWidth; + sal_Int32 perfectOuter = it->second[0].OuterLineWidth; + sal_Int32 perfectDistance = it->second[0].LineDistance; + CPPUNIT_ASSERT_EQUAL(perfectInner, innerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectOuter, outerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectDistance, lineDistance); + } + + uno::Any aRightBorder = xPropSet->getPropertyValue("RightBorder"); + table::BorderLine aRightBorderLine; + if (aRightBorder >>= aRightBorderLine) + { + sal_Int32 innerLineWidth = aRightBorderLine.InnerLineWidth; + sal_Int32 outerLineWidth = aRightBorderLine.OuterLineWidth; + sal_Int32 lineDistance = aRightBorderLine.LineDistance; + + sal_Int32 perfectInner = it->second[1].InnerLineWidth; + sal_Int32 perfectOuter = it->second[1].OuterLineWidth; + sal_Int32 perfectDistance = it->second[1].LineDistance; + CPPUNIT_ASSERT_EQUAL(perfectInner, innerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectOuter, outerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectDistance, lineDistance); + } + + uno::Any aTopBorder = xPropSet->getPropertyValue("TopBorder"); + table::BorderLine aTopBorderLine; + if (aTopBorder >>= aTopBorderLine) + { + sal_Int32 innerLineWidth = aTopBorderLine.InnerLineWidth; + sal_Int32 outerLineWidth = aTopBorderLine.OuterLineWidth; + sal_Int32 lineDistance = aTopBorderLine.LineDistance; + + sal_Int32 perfectInner = it->second[2].InnerLineWidth; + sal_Int32 perfectOuter = it->second[2].OuterLineWidth; + sal_Int32 perfectDistance = it->second[2].LineDistance; + CPPUNIT_ASSERT_EQUAL(perfectInner, innerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectOuter, outerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectDistance, lineDistance); + } + + uno::Any aBottomBorder = xPropSet->getPropertyValue("BottomBorder"); + table::BorderLine aBottomBorderLine; + if (aBottomBorder >>= aBottomBorderLine) + { + sal_Int32 innerLineWidth = aBottomBorderLine.InnerLineWidth; + sal_Int32 outerLineWidth = aBottomBorderLine.OuterLineWidth; + sal_Int32 lineDistance = aBottomBorderLine.LineDistance; + + sal_Int32 perfectInner = it->second[3].InnerLineWidth; + sal_Int32 perfectOuter = it->second[3].OuterLineWidth; + sal_Int32 perfectDistance = it->second[3].LineDistance; + CPPUNIT_ASSERT_EQUAL(perfectInner, innerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectOuter, outerLineWidth); + CPPUNIT_ASSERT_EQUAL(perfectDistance, lineDistance); + } + } + } //end of the 'for' loop + } + } + } while(xParaEnum->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf41542_borderlessPadding) +{ + createSwDoc("tdf41542_borderlessPadding.odt"); + // the page style's borderless padding should force this to 3 pages, not 1 + CPPUNIT_ASSERT_EQUAL( 3, getPages() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleLayoutDefault) +{ + createSwDoc("hello.odt"); + uno::Reference xPropertySet(getStyles("PageStyles")->getByName("Default Page Style"), uno::UNO_QUERY); + // This was style::PageStyleLayout_MIRRORED. + CPPUNIT_ASSERT_EQUAL(style::PageStyleLayout_ALL, getProperty(xPropertySet, "PageStyleLayout")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTimeFormFormats) +{ + createSwDoc("timeFormFormats.odt"); + //FIXME: make it an ODFEXPORT_TEST. Validator fails with + //attribute "form:current-value" has a bad value: "PT12H12M" does not satisfy the "time" type + //See tdf#131127 + + uno::Reference const xModel(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xModel.is()); + uno::Reference const xDPS(xModel, uno::UNO_QUERY); + uno::Reference const xDP = xDPS->getDrawPage(); + CPPUNIT_ASSERT(xDP.is()); + uno::Reference const xFS(xDP, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFS.is()); + uno::Reference const xForms(xFS->getForms(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xForms.is()); + uno::Reference xForm(xForms->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xForm.is()); + uno::Reference xFormNC(xForm, uno::UNO_QUERY); + + uno::Any aAny; + uno::Reference xControlModel; + uno::Reference xController; + uno::Reference xControl; + uno::Reference xWindowPeer; + uno::Reference xTextComponent; + OUString aName = "Time Field "; + + static const char* const aExpectedResults[] = { "12:12", "12:12:00", "12:12PM", "06:00:00AM"}; + + for (size_t i = 1; i <= 4; ++i) + { + aAny = xFormNC->getByName(aName + OUString::number(i)); + xControlModel.set(aAny, uno::UNO_QUERY); + xController.set(xModel->getCurrentController(), uno::UNO_QUERY_THROW); + xControl = xController->getControl(xControlModel); + xWindowPeer = xControl->getPeer(); + xTextComponent.set(xWindowPeer, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString::fromUtf8(aExpectedResults[i - 1]), xTextComponent->getText()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testDateFormFormats) +{ + createSwDoc("dateFormFormats.odt"); + //FIXME: make it an ODFEXPORT_TEST. Validator fails with + //unexpected attribute "form:input-required" + //See tdf#131148 + + uno::Reference const xModel(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xModel.is()); + uno::Reference const xDPS(xModel, uno::UNO_QUERY); + uno::Reference const xDP = xDPS->getDrawPage(); + CPPUNIT_ASSERT(xDP.is()); + uno::Reference const xFS(xDP, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFS.is()); + uno::Reference const xForms(xFS->getForms(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xForms.is()); + uno::Reference xForm(xForms->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(xForm.is()); + uno::Reference xFormNC(xForm, uno::UNO_QUERY); + + uno::Any aAny; + uno::Reference xControlModel; + uno::Reference xController; + uno::Reference xControl; + uno::Reference xWindowPeer; + uno::Reference xTextComponent; + OUString aName = "Date Field "; + + static const char* const aExpectedResults[] = { "03/04/20", "03/04/20", "03/04/2020", + "Wednesday, March 4, 2020", "04/03/20", "03/04/20", "20/03/04", "04/03/2020", "03/04/2020", + "2020/03/04", "20-03-04", "2020-03-04"}; + + for (size_t i = 1; i <= 12; ++i) + { + aAny = xFormNC->getByName(aName + OUString::number(i)); + xControlModel.set(aAny, uno::UNO_QUERY); + xController.set(xModel->getCurrentController(), uno::UNO_QUERY_THROW); + xControl = xController->getControl(xControlModel); + xWindowPeer = xControl->getPeer(); + xTextComponent.set(xWindowPeer, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString::fromUtf8(aExpectedResults[i - 1]), xTextComponent->getText()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf149978) +{ + createSwDoc("tdf149978.fodt"); + // on Linux the bug only reproduces if a document has been loaded previously + createSwDoc("tdf149978.fodt"); + // this was nondeterministic so try 10 times + for (int i = 1; i <= 10; ++i) + { + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(getRun(getParagraph(i), 2, "bar"), "CharBackColor")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf64038) +{ + createSwDoc("space.odt"); + // no space + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(4), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(4), 2)->getString()); + // one space + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(6), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(6), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(7), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(7), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(7), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(8), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" b"), getRun(getParagraph(8), 2)->getString()); + // two spaces + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(10), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(10), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(10), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(11), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(11), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(12), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(12), 2)->getString()); + // three spaces + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(14), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(14), 2)->getString()); + // no space + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(17), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(17), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(17), 3)->getString()); + // one space + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(19), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(19), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(19), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(20), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(20), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(20), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(21), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(21), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(21), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(22), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(22), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" b"), getRun(getParagraph(22), 3)->getString()); + // two spaces + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(24), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(24), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(24), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(25), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(25), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(25), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(26), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(26), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" b"), getRun(getParagraph(26), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(27), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(27), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(27), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(28), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(28), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" b"), getRun(getParagraph(28), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(29), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(29), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(29), 3)->getString()); + // three spaces + CPPUNIT_ASSERT_EQUAL(OUString("a"), getRun(getParagraph(31), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(31), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(31), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(32), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(32), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(32), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(33), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(33), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" b"), getRun(getParagraph(33), 3)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(34), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(34), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(34), 3)->getString()); + // four spaces + CPPUNIT_ASSERT_EQUAL(OUString("a "), getRun(getParagraph(36), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(36), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("b"), getRun(getParagraph(36), 3)->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf74524) +{ + createSwDoc("tdf74524.odt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Any aField1 = xFields->nextElement(); + uno::Reference xServiceInfo1(aField1, uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo1->supportsService("com.sun.star.text.textfield.PageNumber")); + uno::Reference xPropertySet(aField1, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(style::NumberingType::PAGE_DESCRIPTOR)), xPropertySet->getPropertyValue("NumberingType")); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(0)), xPropertySet->getPropertyValue("Offset")); + CPPUNIT_ASSERT_EQUAL(uno::Any(text::PageNumberType_CURRENT), xPropertySet->getPropertyValue("SubType")); + uno::Reference xField1(aField1, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xField1->getAnchor()->getString()); + uno::Any aField2 = xFields->nextElement(); + uno::Reference xServiceInfo2(aField2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo2->supportsService("com.sun.star.text.textfield.Annotation")); + uno::Reference xPropertySet2(aField2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Comment 1")), xPropertySet2->getPropertyValue("Content")); + uno::Reference xField2(aField2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Hello 1World"), xField2->getAnchor()->getString()); + CPPUNIT_ASSERT(!xFields->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageStyleLayoutRight) +{ + createSwDoc("hello.odt"); + uno::Reference xPropertySet(getStyles("PageStyles")->getByName("Default Page Style"), uno::UNO_QUERY); + // This caused a crash. + xPropertySet->setPropertyValue("PageStyleLayout", uno::Any(style::PageStyleLayout_RIGHT)); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo61952) +{ + createSwDoc("hello.odt"); + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + xPara->setPropertyValue("PageDescName", uno::Any(OUString("Left Page"))); + xPara->setPropertyValue("PageDescName", uno::Any(OUString("Right Page"))); + xPara->setPropertyValue("PageDescName", uno::Any(OUString("Left Page"))); + xPara->setPropertyValue("PageDescName", uno::Any(OUString("Right Page"))); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo60842) +{ + createSwDoc("fdo60842.odt"); + uno::Reference const xTable(getParagraphOrTable(1)); + getCell(xTable, "A1", ""); + getCell(xTable, "B1", "18/02/2012"); + getCell(xTable, "C1", "USD"); // this is the cell with office:string-value + getCell(xTable, "D1", ""); + getCell(xTable, "E1", "01/04/2012"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo79269) +{ + createSwDoc("fdo79269.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + // The problem was that the first-footer was shared. + uno::Reference xPropSet(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xPropSet, "FirstIsShared")); + + uno::Reference xFooter1 = getProperty< uno::Reference >(xPropSet, "FooterTextFirst"); + CPPUNIT_ASSERT_EQUAL(OUString("first"), xFooter1->getString()); + uno::Reference xFooter = getProperty< uno::Reference >(xPropSet, "FooterText"); + CPPUNIT_ASSERT_EQUAL(OUString("second"), xFooter->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo79269_header) +{ + createSwDoc("fdo79269_header.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + uno::Reference xPropSet(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xPropSet, "FirstIsShared")); + + uno::Reference xFooter1 = getProperty< uno::Reference >(xPropSet, "HeaderTextFirst"); + CPPUNIT_ASSERT_EQUAL(OUString("first"), xFooter1->getString()); + uno::Reference xFooter = getProperty< uno::Reference >(xPropSet, "HeaderText"); + CPPUNIT_ASSERT_EQUAL(OUString("second"), xFooter->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageBackground) +{ + createSwDoc("PageBackground.odt"); + uno::Reference xPropertySet(getStyles("PageStyles")->getByName("Default Page Style"), uno::UNO_QUERY); + // The background image was lost + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xPropertySet, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xPropertySet, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_REPEAT, getProperty(xPropertySet, "FillBitmapMode")); + + uno::Reference xPropertySetOld(getStyles("PageStyles")->getByName("OldStandard"), uno::UNO_QUERY); + // The background image was overridden by color + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xPropertySetOld, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(OUString("Sky"), getProperty(xPropertySetOld, "FillBitmapName")); + CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_REPEAT, getProperty(xPropertySetOld, "FillBitmapMode")); +} + +CPPUNIT_TEST_FIXTURE(Test, testBibliographyEntryField) +{ + createSwDoc("BibliographyEntryField.odt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + if( !xFields->hasMoreElements() ) { + CPPUNIT_ASSERT(false); + return; + } + + uno::Reference xEnumerationAccess(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bibliography entry"), xEnumerationAccess->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("[ABC]"), xEnumerationAccess->getPresentation(false).trim()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo56272) +{ + createSwDoc("fdo56272.odt"); + uno::Reference xShape = getShape(1); + // Vertical position was incorrect. + CPPUNIT_ASSERT_EQUAL(sal_Int32(422), xShape->getPosition().Y); // Was -2371 +} + +CPPUNIT_TEST_FIXTURE(Test, testIncorrectSum) +{ + createSwDoc("incorrectsum.odt"); + Scheduler::ProcessEventsToIdle(); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTextTable->getCellByName("C3"), uno::UNO_QUERY); + // Use indexOf instead of exact match since the result contains an Euro sign which OUString doesn't like + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xCell->getString().indexOf("1,278")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128737) +{ + createSwDoc("tdf128737.odt"); + // Without the fix in place, this test would have crashed + CPPUNIT_ASSERT_EQUAL(4, getPages()); + CPPUNIT_ASSERT_EQUAL(8, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(Test, testCalcFootnoteContent) +{ + createSwDoc("ooo32780-1.odt"); + //this was a CalcFootnoteContent crash +} + +CPPUNIT_TEST_FIXTURE(Test, testMoveSubTree) +{ + createSwDoc("ooo77837-1.odt"); + //this was a MoveSubTree crash +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo75872_ooo33) +{ + createSwDoc("fdo75872_ooo33.odt"); + // graphics default style: line color and fill color changed + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, + getProperty(xShape, "LineColor")); + CPPUNIT_ASSERT_EQUAL(Color(0x99ccff), + getProperty(xShape, "FillColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo75872_aoo40) +{ + createSwDoc("fdo75872_aoo40.odt"); + // graphics default style: line color and fill color changed + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(Color(0x808080), + getProperty(xShape, "LineColor")); + CPPUNIT_ASSERT_EQUAL(Color(0xcfe7f5), + getProperty(xShape, "FillColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo55814) +{ + createSwDoc("fdo55814.odt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + xField->setPropertyValue("Content", uno::Any(OUString("Yes"))); + uno::Reference(xTextFieldsSupplier->getTextFields(), uno::UNO_QUERY_THROW)->refresh(); + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + // This was "0". + CPPUNIT_ASSERT_EQUAL(OUString("Hide==\"Yes\""), getProperty(xSections->getByIndex(0), "Condition")); +} + +static void lcl_CheckShape( + uno::Reference const& xShape, OUString const& rExpected) +{ + uno::Reference const xNamed(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT(xNamed.is()); + CPPUNIT_ASSERT_EQUAL(rExpected, xNamed->getName()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo68839) +{ + createSwDoc("fdo68839.odt"); + CPPUNIT_ASSERT_EQUAL(4, getShapes()); + // check names + lcl_CheckShape(getShape(1), "FrameXXX"); + lcl_CheckShape(getShape(2), "ObjectXXX"); + lcl_CheckShape(getShape(3), "FrameY"); + lcl_CheckShape(getShape(4), "graphicsXXX"); + // check prev/next chain + uno::Reference xFrame1(getShape(1), uno::UNO_QUERY); + uno::Reference xFrame2(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(), + getProperty(xFrame1, "ChainPrevName")); + CPPUNIT_ASSERT_EQUAL(OUString("FrameY"), + getProperty(xFrame1, "ChainNextName")); + CPPUNIT_ASSERT_EQUAL(OUString("FrameXXX"), + getProperty(xFrame2, "ChainPrevName")); + CPPUNIT_ASSERT_EQUAL(OUString(), + getProperty(xFrame2, "ChainNextName")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo82165) +{ + createSwDoc("fdo82165.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + // there was a duplicate shape in the left header + lcl_CheckShape(getShape(1), "Picture 9"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf89802) +{ + createSwDoc("tdf89802.fodt"); + // the text frame was dropped during import + uno::Reference const xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference const xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + uno::Reference const xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(ColorTransparency, 0x3f004586), getProperty(xFrame, "BackColor")); + +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo37606) +{ + createSwDoc("fdo37606.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false); + + { + pWrtShell->SelAll(); // Selects A1. + SwTextNode& rCellEnd = dynamic_cast(pShellCursor->End()->GetNode()); + // fdo#72486 This was "Hello.", i.e. a single select-all selected the whole document, not just the cell only. + CPPUNIT_ASSERT_EQUAL(OUString("A1"), rCellEnd.GetText()); + + pWrtShell->SelAll(); // Selects the whole table. + pWrtShell->SelAll(); // Selects the whole document. + pShellCursor = pWrtShell->getShellCursor(false); + + SwTextNode& rStart = dynamic_cast(pShellCursor->Start()->GetNode()); + CPPUNIT_ASSERT_EQUAL(OUString("A1"), rStart.GetText()); + + SwTextNode& rEnd = dynamic_cast(pShellCursor->End()->GetNode()); + // This was "A1", i.e. Ctrl-A only selected the A1 cell of the table, not the whole document. + CPPUNIT_ASSERT_EQUAL(OUString("Hello."), rEnd.GetText()); + } + + { + pWrtShell->SttEndDoc(false); // Go to the end of the doc. + pWrtShell->SelAll(); // And now that we're outside of the table, try Ctrl-A again. + SwTextNode& rStart = dynamic_cast(pShellCursor->Start()->GetNode()); + // This was "Hello", i.e. Ctrl-A did not select the starting table. + CPPUNIT_ASSERT_EQUAL(OUString("A1"), rStart.GetText()); + + SwTextNode& rEnd = dynamic_cast(pShellCursor->End()->GetNode()); + CPPUNIT_ASSERT_EQUAL(OUString("Hello."), rEnd.GetText()); + } + + { + pWrtShell->Delete(); // Delete the selection + // And make sure the table got deleted as well. + SwNodes& rNodes = pWrtShell->GetDoc()->GetNodes(); + SwNodeIndex nNode(rNodes.GetEndOfExtras()); + SwContentNode* pContentNode = rNodes.GoNext(&nNode); + // First content node was in a table -> table wasn't deleted. + CPPUNIT_ASSERT(!pContentNode->FindTableNode()); + } +} + +#if HAVE_FEATURE_UI +CPPUNIT_TEST_FIXTURE(Test, testFdo37606Copy) +{ + createSwDoc("fdo37606.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + // Ctrl-A + pWrtShell->SelAll(); // Selects A1. + pWrtShell->SelAll(); // Selects the whole table. + pWrtShell->SelAll(); // Selects the whole document. + + // Ctrl-C + rtl::Reference xTransferable(new SwTransferable(*pWrtShell)); + xTransferable->Copy(); + + pWrtShell->SttEndDoc(false); // Go to the end of the doc. + + // Ctrl-V + TransferableDataHelper aDataHelper(TransferableDataHelper::CreateFromSystemClipboard(&pWrtShell->GetView().GetEditWin())); + SwTransferable::Paste( *pWrtShell, aDataHelper ); + + // Previously copy&paste failed to copy the table in case it was the document-starting one. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount()); +} +#endif + +CPPUNIT_TEST_FIXTURE(Test, testFdo69862) +{ + createSwDoc("fdo69862.odt"); + // The test doc is special in that it starts with a table and it also has a footnote. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + + pWrtShell->SelAll(); // Selects A1. + pWrtShell->SelAll(); // Selects the whole table. + pWrtShell->SelAll(); // Selects the whole document. + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false); + SwTextNode& rStart = dynamic_cast(pShellCursor->Start()->GetNode()); + // This was "Footnote.", as Ctrl-A also selected footnotes, but it should not. + CPPUNIT_ASSERT_EQUAL(OUString("A1"), rStart.GetText()); + + SwTextNode& rEnd = dynamic_cast(pShellCursor->End()->GetNode()); + CPPUNIT_ASSERT_EQUAL(OUString("H" "\x01" "ello."), rEnd.GetText()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo69979) +{ + createSwDoc("fdo69979.odt"); + // The test doc is special in that it starts with a table and it also has a header. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false); + + pWrtShell->SelAll(); // Selects A1. + pWrtShell->SelAll(); // Selects the whole table. + pWrtShell->SelAll(); // Selects the whole document. + SwTextNode& rStart = dynamic_cast(pShellCursor->Start()->GetNode()); + // This was "", as Ctrl-A also selected headers, but it should not. + CPPUNIT_ASSERT_EQUAL(OUString("A1"), rStart.GetText()); + + SwTextNode& rEnd = dynamic_cast(pShellCursor->End()->GetNode()); + CPPUNIT_ASSERT_EQUAL(OUString("Hello."), rEnd.GetText()); +} + +CPPUNIT_TEST_FIXTURE(Test, testSpellmenuRedline) +{ + createSwDoc("spellmenu-redline.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + uno::Reference xAlt; + SwSpellPopup aPopup(pWrtShell, xAlt, OUString()); + Menu& rMenu = aPopup.GetMenu(); + // Make sure that if we show the spellcheck popup menu (for the current + // document, which contains redlines), then the last two entries will be + // always 'go to next/previous change'. + CPPUNIT_ASSERT_EQUAL(OUString("next"), rMenu.GetItemIdent(rMenu.GetItemId(rMenu.GetItemCount() - 2))); + CPPUNIT_ASSERT_EQUAL(OUString("prev"), rMenu.GetItemIdent(rMenu.GetItemId(rMenu.GetItemCount() - 1))); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf107776) +{ + createSwDoc("tdf107776.fodt"); + // Shape with a Graphics parent style name was imported as textbox. + CPPUNIT_ASSERT(!getProperty(getShape(1), "TextBox")); +} + +CPPUNIT_TEST_FIXTURE(Test, testAnnotationFormatting) +{ + createSwDoc("annotation-formatting.odt"); + uno::Reference xTextField = getProperty< uno::Reference >(getRun(getParagraph(1), 1), "TextField"); + uno::Reference xText = getProperty< uno::Reference >(xTextField, "TextRange"); + // Make sure we test the right annotation. + uno::Reference xParagraph = getParagraphOfText(1, xText, "Looses: bold"); + // Formatting was lost: the second text portion was NORMAL, not BOLD. + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(getRun(xParagraph, 2), "CharWeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, fdo81223) +{ + createSwDoc("fdo81223.odt"); + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xFrame, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, fdo90130_1) +{ + createSwDoc("fdo90130-1.odt"); + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xff3333), getProperty(xFrame, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, fdo90130_2) +{ + createSwDoc("fdo90130-2.odt"); + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nValue(0); + xFrame->getPropertyValue("BackColorTransparency") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int32(50), nValue); +} + +CPPUNIT_TEST_FIXTURE(Test, testBnc800714) +{ + createSwDoc("bnc800714.fodt"); + // Document's second paragraph wants to be together with the third one, but: + // - it's in a section with multiple columns + // - contains a single as-char anchored frame + // This was a layout loop. + CPPUNIT_ASSERT(getProperty< uno::Reference >(getParagraph(2), "TextSection").is()); + CPPUNIT_ASSERT(getProperty(getParagraph(2), "ParaKeepTogether")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf92586) +{ + createSwDoc("tdf92586.odt"); + uno::Any aPageStyle = getStyles("PageStyles")->getByName("Standard"); + // This was BitmapMode_NO_REPEAT. + CPPUNIT_ASSERT_EQUAL(drawing::BitmapMode_STRETCH, getProperty(aPageStyle, "FillBitmapMode")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf103025) +{ + createSwDoc("tdf103025.odt"); + CPPUNIT_ASSERT_EQUAL(OUString("2014-01"), parseDump("/root/page[1]/header/tab[2]/row[2]/cell[3]/txt/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("2014-01"), parseDump("/root/page[2]/header/tab[2]/row[2]/cell[3]/txt/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("2014-02"), parseDump("/root/page[3]/header/tab[2]/row[2]/cell[3]/txt/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("2014-03"), parseDump("/root/page[4]/header/tab[2]/row[2]/cell[3]/txt/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("2014-03"), parseDump("/root/page[5]/header/tab[2]/row[2]/cell[3]/txt/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf76322_columnBreakInHeader) +{ + createSwDoc("tdf76322_columnBreakInHeader.docx"); +// column breaks were ignored. First line should start in column 2 + CPPUNIT_ASSERT_EQUAL( OUString("Test1"), parseDump("/root/page[1]/header/section/column[2]/body/txt/text()"_ostr) ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf76349_1columnBreak) +{ + createSwDoc("tdf76349_1columnBreak.odt"); + //single-column breaks should only be treated as page breaks for MS formats - should be only one page here. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf96113) +{ + createSwDoc("tdf96113.odt"); + // Background of the formula frame was white (0xffffff), not green. + CPPUNIT_ASSERT_EQUAL(Color(0x00ff00), getProperty(getShape(1), "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo47267) +{ + createSwDoc("fdo47267-3.odt"); + // This was a Style Families getByName() crash +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf75221) +{ + createSwDoc("tdf75221.odt"); + // When "Don't add space between paragraphs of the same style" setting set, + // spacing between same-style paragraphs must be equal to their line spacing. + // It used to be 0. + OUString top = parseDump("/root/page/body/txt[2]/infos/prtBounds"_ostr, "top"_ostr); + CPPUNIT_ASSERT(top.toInt32() > 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf101729) +{ + createSwDoc("tdf101729.odt"); + sal_Int32 l = parseDump("/root/page/body/tab/row/cell[1]/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 w = parseDump("/root/page/body/tab/row/cell[1]/infos/bounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 x = parseDump("/root/page/body/tab/row/cell[1]/txt/infos/bounds"_ostr, "left"_ostr).toInt32(); + // Make sure the text does not go outside and verify it is centered roughly + CPPUNIT_ASSERT( l + w / 4 < x ); + CPPUNIT_ASSERT( x < l + 3 * w / 4); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf107392) +{ + createSwDoc("tdf107392.odt"); + // Shapes from bottom to top were Frame, SVG, Bitmap, i.e. in the order as + // they appeared in the document, not according to their requested z-index, + // as sorting failed. + // So instead of 0, 1, 2 these were 2, 0, 1. + + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getShapeByName(u"Bitmap"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getProperty(getShapeByName(u"Frame"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), getProperty(getShapeByName(u"SVG"), "ZOrder")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf100033_1) +{ + createSwDoc("tdf100033_1.odt"); + // Test document have three duplicated frames with the same name and position/size -> import one frame + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testWordAsCharShape) +{ + createSwDoc("Word2010AsCharShape.odt"); + // As-char shape had VertOrient "from-top"/NONE default from GetVOrient() + uno::Reference const xShape(getShape(1)); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, getProperty(xShape, "AnchorType")); + CPPUNIT_ASSERT_EQUAL(text::VertOrientation::TOP, getProperty(xShape, "VertOrient")); + // also, the paragraph default fo:bottom-margin was wrongly applied to + // the shape + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xShape, "BottomMargin")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf100033_2) +{ + createSwDoc("tdf100033_2.odt"); + // Test document have three different frames anchored to different paragraphs -> import all frames + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndexAccess->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testI61225) +{ + createSwDoc("i61225.sxw"); + // Part of ooo61225-1.sxw from crashtesting. + + // This never returned. + calcLayout(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf109080_loext_ns) +{ + createSwDoc("tdf109080_loext_ns.odt"); + // Test we can import and + + CPPUNIT_ASSERT_EQUAL(OUString("This is the first page header"), + parseDump("/root/page[1]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("This is the non-first-page header"), + parseDump("/root/page[2]/header/txt/text()"_ostr)); + + CPPUNIT_ASSERT_EQUAL(OUString("This is the first page footer"), + parseDump("/root/page[1]/footer/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("This is the non-first-page footer"), + parseDump("/root/page[2]/footer/txt/text()"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf109080_style_ns) +{ + createSwDoc("tdf109080_style_ns.odt"); + // Test we can import and + // (produced by LibreOffice 4.0 - 5.x) + + CPPUNIT_ASSERT_EQUAL(OUString("This is the first page header"), + parseDump("/root/page[1]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("This is the non-first-page header"), + parseDump("/root/page[2]/header/txt/text()"_ostr)); + + CPPUNIT_ASSERT_EQUAL(OUString("This is the first page footer"), + parseDump("/root/page[1]/footer/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("This is the non-first-page footer"), + parseDump("/root/page[2]/footer/txt/text()"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf109228) +{ + createSwDoc("tdf109228.odt"); + // Embedded object with no frame name was imported incorrectly, it was anchored 'to character' instead of 'as character' + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, getProperty(getShape(1), "AnchorType")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf94882) +{ + createSwDoc("tdf94882.odt"); + // Get the header of the page containing our content + // (done this way to skip past any blank page inserted before it + // due to the page number being even) + OUString headertext = parseDump( + "/root/page[starts-with(body/txt/text(),'The paragraph style on this')]" + "/header/txt/text()"_ostr + ); + // This header should be the first page header + CPPUNIT_ASSERT_EQUAL(OUString("This is the first page header"), headertext); +} + +CPPUNIT_TEST_FIXTURE(Test, testBlankBeforeFirstPage) +{ + createSwDoc("tdf94882.odt"); + // This document starts on page 50, which is even, but it should not have a + // blank page inserted before it to make it a left page + + CPPUNIT_ASSERT_EQUAL_MESSAGE("There should be 1 pages output", + OUString("1"), parseDump("count(/root/page)"_ostr) + ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf115079) +{ + createSwDoc("tdf115079.odt"); + // This document caused segfault when layouting +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf108482) +{ + createSwDoc("tdf108482.odt"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The table on second page must have two rows", + OUString("2"), parseDump("count(/root/page[2]/body/tab/row)"_ostr) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The second page table's first row must be the repeated headline", + OUString("Header"), parseDump("/root/page[2]/body/tab/row[1]/cell/txt"_ostr) + ); + // The first (repeated headline) row with vertical text orientation must have non-zero height + // (in my tests, it was 1135) + CPPUNIT_ASSERT_GREATER( + sal_Int32(1000), parseDump("/root/page[2]/body/tab/row[1]/infos/bounds"_ostr, "height"_ostr).toInt32() + ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf116195) +{ + createSwDoc("tdf116195.odt"); + // The image was set to zero height due to a regression + CPPUNIT_ASSERT_EQUAL( + sal_Int32(12960), parseDump("/root/page/anchored/fly/notxt/infos/bounds"_ostr, "height"_ostr).toInt32() + ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf120677) +{ + createSwDoc("tdf120677.fodt"); + // The document used to hang the layout, consuming memory until OOM +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152015) +{ + // it hangs at import time + createSwDoc("tdf152015.odt"); + + CPPUNIT_ASSERT_EQUAL( 1, getPages() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123829) +{ + createSwDoc("tdf123829.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Compatibility: collapse cell paras should not be set", false, + pDoc->getIDocumentSettingAccess().get(DocumentSettingId::COLLAPSE_EMPTY_CELL_PARA)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf113289) +{ + createSwDoc("tdf113289.odt"); + uno::Any aPageStyle = getStyles("PageStyles")->getByName("Standard"); + CPPUNIT_ASSERT_EQUAL(static_cast(style::FootnoteLineStyle::SOLID), + getProperty(aPageStyle, "FootnoteLineStyle")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123968) +{ + createSwDoc("tdf123968.odt"); + // The test doc is special in that it starts with a table and it also has a header. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false); + + pWrtShell->SelAll(); + SwTextNode& rStart = dynamic_cast(pShellCursor->Start()->GetNode()); + + // The field is now editable like any text, thus the field content "New value" shows up for the cursor. + CPPUNIT_ASSERT_EQUAL(OUString("inputfield: " + OUStringChar(CH_TXT_ATR_INPUTFIELDSTART) + + "New value" + OUStringChar(CH_TXT_ATR_INPUTFIELDEND)), + rStart.GetText()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133459) +{ + createSwDoc("tdf133459.odt"); + // Test that the number format was correctly imported, and used by both fields. + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFields(xTextFieldsSupplier->getTextFields()->createEnumeration()); + + // First Field + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + const OUString sPresentation(xField->getPresentation(false)); + const sal_Int32 nFormat(getProperty(xField, "NumberFormat")); + CPPUNIT_ASSERT_EQUAL(sal_True, getProperty(xField, "IsFixedLanguage")); + + // Second field + xField.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sPresentation, xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(nFormat, getProperty(xField, "NumberFormat")); + CPPUNIT_ASSERT_EQUAL(sal_True, getProperty(xField, "IsFixedLanguage")); + + // Test the number format itself + uno::Reference xNumberFormatsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFormat(xNumberFormatsSupplier->getNumberFormats()->getByKey(nFormat)); + lang::Locale aLocale(getProperty(xFormat, "Locale")); + CPPUNIT_ASSERT_EQUAL(OUString("ru"), aLocale.Language); + CPPUNIT_ASSERT_EQUAL(OUString("RU"), aLocale.Country); + CPPUNIT_ASSERT_EQUAL(OUString("QQ YYYY"), getProperty(xFormat, "FormatString")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134971) +{ + createSwDoc("tdf134971a.odt"); + // now insert 2nd file somewhere - insertDocumentFromURL should + // _not_ touch pool defaults + uno::Sequence aPropertyValues = comphelper::InitPropertySequence( + { + {"Name", uno::Any(createFileURL(u"tdf134971b.odt"))}, + {"Filter", uno::Any(OUString("writer8"))}, + }); + dispatchCommand(mxComponent, ".uno:InsertDoc", aPropertyValues); + + // tdf134971b re-defines default font as "Liberation Sans" - make sure this stays + // Arial in final doc: + OUString sString; + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle1(xParaStyles->getByName( + "Standard"), uno::UNO_QUERY); + xStyle1->getPropertyValue("CharFontName") >>= sString; + CPPUNIT_ASSERT_EQUAL(OUString("Arial"), sString); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf151375) +{ + createSwDoc(); + + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor(xText->createTextCursorByRange(xText->getStart()), uno::UNO_QUERY); + + // Without the fix in place, this test would have crashed here + xCursor->insertDocumentFromURL(createFileURL(u"tdf151375.ott"), {}); + + uno::Reference const xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference const xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7), xIndexAccess->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138879) +{ + createSwDoc(); + + uno::Sequence aPropertyValues = comphelper::InitPropertySequence( + { + {"Name", uno::Any(createFileURL(u"tdf138879.odt"))}, + {"Filter", uno::Any(OUString("writer8"))}, + }); + dispatchCommand(mxComponent, ".uno:InsertDoc", aPropertyValues); + + // Without the fix in place, this test would have failed with + // - Expected: Heading 1 + // - Actual : Standard + CPPUNIT_ASSERT_EQUAL(OUString("Heading 1"), + getProperty(getParagraph(1), "ParaStyleName")); +} + +CPPUNIT_TEST_FIXTURE(Test, testPasteFirstParaDirectFormat) +{ + createSwDoc(); + { + // Set some direct formatting on the first paragraph, but leave paragraph adjust at its + // default (left). + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + xParagraph->setPropertyValue("PageNumberOffset", uno::Any(static_cast(0))); + } + + // Paste from ODT. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor(xText->createTextCursorByRange(xText->getStart()), uno::UNO_QUERY); + xCursor->insertDocumentFromURL(createFileURL(u"paste-first-para-direct-format.odt"), {}); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 3 (center) + // - Actual : 0 (left) + // i.e. the inserted document's first paragraph's paragraph formatting was lost. + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(style::ParagraphAdjust_CENTER), + getProperty(xParagraph, "ParaAdjust")); +} + +CPPUNIT_TEST_FIXTURE(Test, testVerticallyMergedCellBorder) +{ + // Given a document with two cells, vertically merged, when loading the document: + createSwDoc("vmerge-cell-border.odt"); + SwDoc* pDoc = getSwDoc(); + + // Then make sure that the first cell has a right border while the second has no right border: + SwDocShell* pDocShell = pDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(/*bBlock=*/false); + SwStartNode* pA1 = pShellCursor->Start()->GetNode().StartOfSectionNode(); + const SwAttrSet& rA1Set = pA1->GetTableBox()->GetFrameFormat()->GetAttrSet(); + CPPUNIT_ASSERT(rA1Set.GetBox().GetRight()); + SwNodeIndex aA2(*pA1->EndOfSectionNode(), 1); + const SwAttrSet& rA2Set = aA2.GetNode().GetTableBox()->GetFrameFormat()->GetAttrSet(); + + // Without the accompanying fix in place, this test would have failed, as the A2 cell also had a + // right border, even if explicitly disabled + // it. + CPPUNIT_ASSERT(!rA2Set.GetBox().GetRight()); + + // Given this document model, when exporting to ODT: + save("writer8"); + + // Then make sure the covered cell has a style. + xmlDocUniquePtr pXmlSettings = parseExport("content.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - In <...>, XPath '//table:covered-table-cell' no attribute 'style-name' exist + assertXPath(pXmlSettings, "//table:covered-table-cell"_ostr, "style-name"_ostr, "Table1.A2"); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageAnchorZIndexFirstPage) +{ + createSwDoc("PageAnchorZIndexFirstPage.fodt"); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Image1 index not 0", + sal_Int32(0), getProperty(getShapeByName(u"Image1"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Image2 index not 1", + sal_Int32(1), getProperty(getShapeByName(u"Image2"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape1 index not 2", + sal_Int32(2), getProperty(getShapeByName(u"Shape1"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape2 index not 3", + sal_Int32(3), getProperty(getShapeByName(u"Shape2"), "ZOrder")); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageAnchorZIndexSecondPage) +{ + createSwDoc("PageAnchorZIndexSecondPage.fodt"); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Image1 index not 0", + sal_Int32(0), getProperty(getShapeByName(u"Image1"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Image2 index not 1", + sal_Int32(1), getProperty(getShapeByName(u"Image2"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape1 index not 2", + sal_Int32(2), getProperty(getShapeByName(u"Shape1"), "ZOrder")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape2 index not 3", + sal_Int32(3), getProperty(getShapeByName(u"Shape2"), "ZOrder")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf146257) +{ + createSwDoc("tdf146257.odt"); + + // First list should contain no labels + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + } + // For second list ensure second level empty and third level should not contain extra dots + { + uno::Reference xPara(getParagraph(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(7), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(8), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty(xPara, "ListLabelString")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf146597) +{ + createSwDoc("tdf146597.odt"); + // This was crashed before. +} + +// just care that it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(Test, testForcepoint101) +{ + createSwDoc("forcepoint101.fodt"); +} + +// just care that it doesn't crash/assert +CPPUNIT_TEST_FIXTURE(Test, testForcepoint108) +{ + //load would assert because it fails to load entirely, like testMathMalformedXml + mxComponent = mxDesktop->loadComponentFromURL(createFileURL(u"forcepoint108.fodt"), "_default", 0, {}); +} + +#ifdef _WIN32 +template +static void runWindowsFileZoneTests(css::uno::Reference const & aDesktop, + const OUString& sFileName, sal_Int32 configValue, sal_Int32 zoneId, + bool expectedResult) +{ + // Set desired configuration params + auto xChanges = comphelper::ConfigurationChanges::create(); + T::set(configValue, xChanges); + xChanges->commit(); + + // Set Windows Security Zone for temp file + sal::systools::COMReference pZoneId; + pZoneId.CoCreateInstance(CLSID_PersistentZoneIdentifier); + + // ignore setting of Zone 0, since at least for Windows Server + // setups, that always leads to E_ACCESSDENIED - presumably since + // the file is already local? + // + // See below for the workaround (calling tests for ZONE_LOCAL + // first) + if( zoneId != 0 ) + { + CPPUNIT_ASSERT(SUCCEEDED(pZoneId->SetId(zoneId))); + sal::systools::COMReference pPersist(pZoneId, sal::systools::COM_QUERY_THROW); + OUString sTempFileWinPath; + osl::FileBase::getSystemPathFromFileURL(sFileName, sTempFileWinPath); + CPPUNIT_ASSERT( + SUCCEEDED(pPersist->Save(reinterpret_cast(sTempFileWinPath.getStr()), TRUE))); + } + + // Load doc with default for UI settings: do not suppress macro + uno::Sequence aLoadArgs{ comphelper::makePropertyValue( + "MacroExecutionMode", css::document::MacroExecMode::USE_CONFIG) }; + auto aComponent = aDesktop->loadComponentFromURL(sFileName, "_default", 0, aLoadArgs); + + // Are macro enabled in doc? + SwXTextDocument* pTextDoc = dynamic_cast(aComponent.get()); + CPPUNIT_ASSERT_EQUAL(expectedResult, bool(pTextDoc->getAllowMacroExecution())); + + aComponent->dispose(); +} +#endif + +CPPUNIT_TEST_FIXTURE(Test, testWindowsFileZone) +{ +// This makes sense only for Windows +#ifdef _WIN32 + // Create a temp copy of zone test file + utl::TempFileNamed aTempFile; + aTempFile.EnableKillingFile(); + SvStream& aStreamDst = *aTempFile.GetStream(StreamMode::WRITE); + SvFileStream aStreamSrc(createFileURL(u"ZoneMacroTest.odt"), StreamMode::READ); + aStreamDst.WriteStream(aStreamSrc); + aTempFile.CloseStream(); + + // Tweak macro security to 1 + SvtSecurityOptions::SetMacroSecurityLevel(1); + + // Run all tests: set for temp file security zone and then check if macro are enabled + // depending on configuration values for given zone + // There is no easy way to check default (0) variant, so macro are disabled by default in these tests. + + // run tests for ZoneLocal first, since runWindowsFileZoneTests + // ignores Zone 0 (see above) - assuming the initial file state is + // local after a copy, we're still triggering the expected + // behaviour + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneLocal>( + mxDesktop, aTempFile.GetURL(), 0, 0, false); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneLocal>( + mxDesktop, aTempFile.GetURL(), 1, 0, true); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneLocal>( + mxDesktop, aTempFile.GetURL(), 2, 0, false); + + // run tests for other zones (these actually set the Windows + // Security Zone at the file) + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneUntrusted>( + mxDesktop, aTempFile.GetURL(), 0, 4, false); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneUntrusted>( + mxDesktop, aTempFile.GetURL(), 1, 4, true); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneUntrusted>( + mxDesktop, aTempFile.GetURL(), 2, 4, false); + + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneInternet>( + mxDesktop, aTempFile.GetURL(), 0, 3, false); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneInternet>( + mxDesktop, aTempFile.GetURL(), 1, 3, true); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneInternet>( + mxDesktop, aTempFile.GetURL(), 2, 3, false); + + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneTrusted>( + mxDesktop, aTempFile.GetURL(), 0, 2, false); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneTrusted>( + mxDesktop, aTempFile.GetURL(), 1, 2, true); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneTrusted>( + mxDesktop, aTempFile.GetURL(), 2, 2, false); + + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneIntranet>( + mxDesktop, aTempFile.GetURL(), 0, 1, false); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneIntranet>( + mxDesktop, aTempFile.GetURL(), 1, 1, true); + runWindowsFileZoneTests< + officecfg::Office::Common::Security::Scripting::WindowsSecurityZone::ZoneIntranet>( + mxDesktop, aTempFile.GetURL(), 2, 1, false); +#endif +} + +CPPUNIT_TEST_FIXTURE(Test, testEmptyTrailingSpans) +{ + createSwDoc("emptyParagraphLoosesFontHeight.fodt"); + + CPPUNIT_ASSERT_EQUAL(3, getParagraphs()); + + auto xPara2 = getParagraph(2); + CPPUNIT_ASSERT_EQUAL(float(11), getProperty(xPara2, "CharHeight")); + auto xRun = getRun(xPara2, 1); + CPPUNIT_ASSERT_EQUAL(float(8), getProperty(xRun, "CharHeight")); + // Both empty spans merge -> no more runs + CPPUNIT_ASSERT_THROW(getRun(xPara2, 2), css::container::NoSuchElementException); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + auto height1 = getXPath(pXmlDoc, "/root/page/body/txt[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + auto height2 = getXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(height1, height2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(184, height2, 1); // allow a bit of room for rounding just in case +} + +CPPUNIT_PLUGIN_IMPLEMENT(); +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/data/090716_Studentische_Arbeit_VWS.docx b/sw/qa/extras/ooxmlexport/data/090716_Studentische_Arbeit_VWS.docx new file mode 100644 index 0000000000..bfed379195 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/090716_Studentische_Arbeit_VWS.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/1-table-1-page.docx b/sw/qa/extras/ooxmlexport/data/1-table-1-page.docx new file mode 100644 index 0000000000..d821c6698f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/1-table-1-page.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/128197_compat14.docx b/sw/qa/extras/ooxmlexport/data/128197_compat14.docx new file mode 100644 index 0000000000..507e283960 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/128197_compat14.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/128197_compat15.docx b/sw/qa/extras/ooxmlexport/data/128197_compat15.docx new file mode 100644 index 0000000000..d618b117cf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/128197_compat15.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/151384Hyperlink.odt b/sw/qa/extras/ooxmlexport/data/151384Hyperlink.odt new file mode 100644 index 0000000000..223fda16df Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/151384Hyperlink.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/1_page.docx b/sw/qa/extras/ooxmlexport/data/1_page.docx new file mode 100644 index 0000000000..9b8638dd3f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/1_page.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/2-id.docx b/sw/qa/extras/ooxmlexport/data/2-id.docx new file mode 100644 index 0000000000..6d05e68a6c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/2-id.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/2120112713.docx b/sw/qa/extras/ooxmlexport/data/2120112713.docx new file mode 100644 index 0000000000..5de6378b77 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/2120112713.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/2120112713_OpenBrace.docx b/sw/qa/extras/ooxmlexport/data/2120112713_OpenBrace.docx new file mode 100644 index 0000000000..10dfd31ab2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/2120112713_OpenBrace.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/2129393649.docx b/sw/qa/extras/ooxmlexport/data/2129393649.docx new file mode 100644 index 0000000000..e1fd7581f0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/2129393649.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/2_table_doc.docx b/sw/qa/extras/ooxmlexport/data/2_table_doc.docx new file mode 100644 index 0000000000..21513ec2cc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/2_table_doc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/2col-header.docx b/sw/qa/extras/ooxmlexport/data/2col-header.docx new file mode 100644 index 0000000000..3e8f2c459d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/2col-header.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/99_Fields.docx b/sw/qa/extras/ooxmlexport/data/99_Fields.docx new file mode 100644 index 0000000000..e0ee431e33 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/99_Fields.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/AnchorId.docx b/sw/qa/extras/ooxmlexport/data/AnchorId.docx new file mode 100644 index 0000000000..b1b66684d3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/AnchorId.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Chart_BorderLine_Style.docx b/sw/qa/extras/ooxmlexport/data/Chart_BorderLine_Style.docx new file mode 100644 index 0000000000..0d3b74b77c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Chart_BorderLine_Style.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Chart_Plot_BorderLine_Style.docx b/sw/qa/extras/ooxmlexport/data/Chart_Plot_BorderLine_Style.docx new file mode 100644 index 0000000000..d1f0f97f10 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Chart_Plot_BorderLine_Style.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/ColorOverwritten.docx b/sw/qa/extras/ooxmlexport/data/ColorOverwritten.docx new file mode 100644 index 0000000000..f1c8e527df Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ColorOverwritten.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/CommentDone.docx b/sw/qa/extras/ooxmlexport/data/CommentDone.docx new file mode 100644 index 0000000000..1ce5993d44 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/CommentDone.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/CommentReply.docx b/sw/qa/extras/ooxmlexport/data/CommentReply.docx new file mode 100644 index 0000000000..e3a648aa43 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/CommentReply.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/EmbeddedExcelChart.docx b/sw/qa/extras/ooxmlexport/data/EmbeddedExcelChart.docx new file mode 100644 index 0000000000..567660b8e1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/EmbeddedExcelChart.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Encrypted_LO_Standard_abc.docx b/sw/qa/extras/ooxmlexport/data/Encrypted_LO_Standard_abc.docx new file mode 100644 index 0000000000..c35aaf12ad Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Encrypted_LO_Standard_abc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2007_abc.docx b/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2007_abc.docx new file mode 100644 index 0000000000..27566d4a73 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2007_abc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2010_abc.docx b/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2010_abc.docx new file mode 100644 index 0000000000..4881e351db Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2010_abc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2013_abc.docx b/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2013_abc.docx new file mode 100644 index 0000000000..28fa85c261 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Encrypted_MSO2013_abc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/EquationAsScientificNumbering.docx b/sw/qa/extras/ooxmlexport/data/EquationAsScientificNumbering.docx new file mode 100644 index 0000000000..e6d6bdf448 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/EquationAsScientificNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/EquationWithAboveAndBelowCaption.docx b/sw/qa/extras/ooxmlexport/data/EquationWithAboveAndBelowCaption.docx new file mode 100644 index 0000000000..7657d05078 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/EquationWithAboveAndBelowCaption.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO73034.docx b/sw/qa/extras/ooxmlexport/data/FDO73034.docx new file mode 100644 index 0000000000..c3f8c926ea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO73034.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO73546.docx b/sw/qa/extras/ooxmlexport/data/FDO73546.docx new file mode 100644 index 0000000000..4682971968 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO73546.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO74105.docx b/sw/qa/extras/ooxmlexport/data/FDO74105.docx new file mode 100644 index 0000000000..4299cf9c21 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO74105.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO74106.docx b/sw/qa/extras/ooxmlexport/data/FDO74106.docx new file mode 100644 index 0000000000..3b62573253 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO74106.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO74215.docx b/sw/qa/extras/ooxmlexport/data/FDO74215.docx new file mode 100644 index 0000000000..fd2cc552ef Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO74215.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO74774.docx b/sw/qa/extras/ooxmlexport/data/FDO74774.docx new file mode 100644 index 0000000000..11242475fa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO74774.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO74775.docx b/sw/qa/extras/ooxmlexport/data/FDO74775.docx new file mode 100644 index 0000000000..a8ee58895c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO74775.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO75133.docx b/sw/qa/extras/ooxmlexport/data/FDO75133.docx new file mode 100644 index 0000000000..93170ddc6d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO75133.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO76248.docx b/sw/qa/extras/ooxmlexport/data/FDO76248.docx new file mode 100644 index 0000000000..c7b868e3f6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO76248.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO76312.docx b/sw/qa/extras/ooxmlexport/data/FDO76312.docx new file mode 100644 index 0000000000..b41ae7a720 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO76312.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO77715.docx b/sw/qa/extras/ooxmlexport/data/FDO77715.docx new file mode 100644 index 0000000000..f93a46e0f3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO77715.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO78292.docx b/sw/qa/extras/ooxmlexport/data/FDO78292.docx new file mode 100644 index 0000000000..0388c0a5df Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO78292.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FDO78590.docx b/sw/qa/extras/ooxmlexport/data/FDO78590.docx new file mode 100644 index 0000000000..c32b0276b9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FDO78590.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FigureAsLabelPicture.docx b/sw/qa/extras/ooxmlexport/data/FigureAsLabelPicture.docx new file mode 100644 index 0000000000..50415bc1c9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FigureAsLabelPicture.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/FileWithInvalidImageLink.docx b/sw/qa/extras/ooxmlexport/data/FileWithInvalidImageLink.docx new file mode 100644 index 0000000000..6ad5cac388 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/FileWithInvalidImageLink.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Hau_min_list2.fodt b/sw/qa/extras/ooxmlexport/data/Hau_min_list2.fodt new file mode 100644 index 0000000000..715fbcde8b --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/Hau_min_list2.fodt @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + III.Level 1 + + + level 2 has width + + + level 3 has indent + + + level 4 has width + indent + + + + + + + + + level 1 with positive on para + + + level 2 + + + level 3 + + + level 4 + + + III.Level 5 + + + level 6 has width + + + level 7 has indent + + + level 8 has width + indent + + + + + + + + + level 5 with positive on para + + + level 6 + + + level 7 + + + level 8 + + + + + + + + + + + + + + + + + + + + III.Level 1 + + + level 2 has width + + + level 3 has indent + + + level 4 has width + indent + + + + + + + + + level 1 with positive on para + + + level 2 + + + level 3 + + + level 4 + + + III.Level 5 + + + level 6 has width + + + level 7 has indent + + + level 8 has width + indent + + + + + + + + + level 5 with positive on para + + + level 6 + + + level 7 + + + level 8 + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/ImageCrop.docx b/sw/qa/extras/ooxmlexport/data/ImageCrop.docx new file mode 100644 index 0000000000..120ce78eb7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ImageCrop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/IndexFieldFlagF.docx b/sw/qa/extras/ooxmlexport/data/IndexFieldFlagF.docx new file mode 100644 index 0000000000..2c7d365271 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/IndexFieldFlagF.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/LineStyle_DashType.docx b/sw/qa/extras/ooxmlexport/data/LineStyle_DashType.docx new file mode 100644 index 0000000000..b8eceb92de Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/LineStyle_DashType.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/LineStyle_DashType_VML.docx b/sw/qa/extras/ooxmlexport/data/LineStyle_DashType_VML.docx new file mode 100644 index 0000000000..8b95672318 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/LineStyle_DashType_VML.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/LinkedTextBoxes.docx b/sw/qa/extras/ooxmlexport/data/LinkedTextBoxes.docx new file mode 100644 index 0000000000..48a5f64e38 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/LinkedTextBoxes.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/NoFillAttrInImagedata.docx b/sw/qa/extras/ooxmlexport/data/NoFillAttrInImagedata.docx new file mode 100644 index 0000000000..3819e7931a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/NoFillAttrInImagedata.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/NumberedList.docx b/sw/qa/extras/ooxmlexport/data/NumberedList.docx new file mode 100644 index 0000000000..53f4490d40 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/NumberedList.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/PreserveWfieldTOC.docx b/sw/qa/extras/ooxmlexport/data/PreserveWfieldTOC.docx new file mode 100644 index 0000000000..ac294fd0fe Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/PreserveWfieldTOC.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/PreserveXfieldTOC.docx b/sw/qa/extras/ooxmlexport/data/PreserveXfieldTOC.docx new file mode 100644 index 0000000000..adf7fd9249 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/PreserveXfieldTOC.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/SdtContent.docx b/sw/qa/extras/ooxmlexport/data/SdtContent.docx new file mode 100644 index 0000000000..91e0ef0e44 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/SdtContent.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Shape.docx b/sw/qa/extras/ooxmlexport/data/Shape.docx new file mode 100644 index 0000000000..474e6ffc2b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Shape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/ShapeOverlappingWithSdt.docx b/sw/qa/extras/ooxmlexport/data/ShapeOverlappingWithSdt.docx new file mode 100644 index 0000000000..e1ec07489e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ShapeOverlappingWithSdt.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Simple-TOC.odt b/sw/qa/extras/ooxmlexport/data/Simple-TOC.odt new file mode 100644 index 0000000000..475f59e051 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Simple-TOC.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/SvgImageTest.odt b/sw/qa/extras/ooxmlexport/data/SvgImageTest.odt new file mode 100644 index 0000000000..3b37fe7998 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/SvgImageTest.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/TC-table-DnD-move.docx b/sw/qa/extras/ooxmlexport/data/TC-table-DnD-move.docx new file mode 100644 index 0000000000..f231d6f842 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TC-table-DnD-move.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TC-table-Separate-Move.docx b/sw/qa/extras/ooxmlexport/data/TC-table-Separate-Move.docx new file mode 100644 index 0000000000..227f2862c6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TC-table-Separate-Move.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TC-table-rowDND-front.docx b/sw/qa/extras/ooxmlexport/data/TC-table-rowDND-front.docx new file mode 100644 index 0000000000..17d3feeb34 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TC-table-rowDND-front.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TC-table-rowDND.docx b/sw/qa/extras/ooxmlexport/data/TC-table-rowDND.docx new file mode 100644 index 0000000000..9608736cf2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TC-table-rowDND.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TCTagMisMatch.docx b/sw/qa/extras/ooxmlexport/data/TCTagMisMatch.docx new file mode 100644 index 0000000000..6d890acdb5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TCTagMisMatch.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TOC_field_b.docx b/sw/qa/extras/ooxmlexport/data/TOC_field_b.docx new file mode 100644 index 0000000000..b8ff32b3bb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TOC_field_b.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TOC_field_f.docx b/sw/qa/extras/ooxmlexport/data/TOC_field_f.docx new file mode 100644 index 0000000000..ea0958a218 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TOC_field_f.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Table-of-Figures.odt b/sw/qa/extras/ooxmlexport/data/Table-of-Figures.odt new file mode 100644 index 0000000000..cd1502cf86 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Table-of-Figures.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/TableWithAboveCaptions.docx b/sw/qa/extras/ooxmlexport/data/TableWithAboveCaptions.docx new file mode 100644 index 0000000000..f445ab6b15 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TableWithAboveCaptions.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Table_cell_auto_width_fdo69656.docx b/sw/qa/extras/ooxmlexport/data/Table_cell_auto_width_fdo69656.docx new file mode 100644 index 0000000000..10b8f9de21 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Table_cell_auto_width_fdo69656.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Tdf147485.docx b/sw/qa/extras/ooxmlexport/data/Tdf147485.docx new file mode 100644 index 0000000000..cb630efb87 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Tdf147485.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt b/sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt new file mode 100644 index 0000000000..6f7a62deec Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/TestVMLData.docx b/sw/qa/extras/ooxmlexport/data/TestVMLData.docx new file mode 100644 index 0000000000..a2f89b146c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TestVMLData.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Test_CharUnderlineThemeColor.docx b/sw/qa/extras/ooxmlexport/data/Test_CharUnderlineThemeColor.docx new file mode 100644 index 0000000000..3ee3cdf457 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Test_CharUnderlineThemeColor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Test_ThemeBorderColor.docx b/sw/qa/extras/ooxmlexport/data/Test_ThemeBorderColor.docx new file mode 100644 index 0000000000..fe1b188580 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Test_ThemeBorderColor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.docx b/sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.docx new file mode 100644 index 0000000000..c644ed2d7f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.fodt b/sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.fodt new file mode 100644 index 0000000000..afa565250e --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/Test_ThemePortionLevel_CharColor.fodt @@ -0,0 +1,420 @@ + + + + quikeequikee22023-06-06T13:26:002023-06-06T13:32:00PT6MLibreOfficeDev/7.6.0.0.alpha1$Linux_X86_64 LibreOffice_project/5a25d9252791409f5e73616ff752a9ae8227aaf716.0000 + + + 0 + 0 + 39848 + 8945 + true + false + + + view2 + 11963 + 3041 + 0 + 0 + 39846 + 8943 + 0 + 1 + false + 100 + false + false + false + false + false + false + + + + + true + false + true + false + true + false + false + true + false + 0 + true + true + true + false + false + true + true + false + true + + true + true + true + true + false + true + true + false + false + true + true + true + true + true + false + false + false + 1874693 + false + + true + false + false + 1874693 + true + false + false + false + 1 + true + true + false + false + true + false + false + true + false + true + false + true + 0 + + false + true + true + true + + 0 + false + false + false + false + high-resolution + true + true + true + true + true + false + false + false + false + true + + true + true + true + true + + false + false + true + true + true + true + true + true + true + false + false + false + false + false + 0 + true + false + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sample Text + + + diff --git a/sw/qa/extras/ooxmlexport/data/Test_ThemeTextParaBackgroundColor.docx b/sw/qa/extras/ooxmlexport/data/Test_ThemeTextParaBackgroundColor.docx new file mode 100644 index 0000000000..5b012f0133 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Test_ThemeTextParaBackgroundColor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextEffects_Glow_Shadow_Reflection.docx b/sw/qa/extras/ooxmlexport/data/TextEffects_Glow_Shadow_Reflection.docx new file mode 100644 index 0000000000..e7412077cc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextEffects_Glow_Shadow_Reflection.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextEffects_Groupshapes.docx b/sw/qa/extras/ooxmlexport/data/TextEffects_Groupshapes.docx new file mode 100644 index 0000000000..85f7a55ae9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextEffects_Groupshapes.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextEffects_InStyle.docx b/sw/qa/extras/ooxmlexport/data/TextEffects_InStyle.docx new file mode 100644 index 0000000000..5be6d9c5f9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextEffects_InStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextEffects_Props3d_Ligatures_NumForm_NumSpacing.docx b/sw/qa/extras/ooxmlexport/data/TextEffects_Props3d_Ligatures_NumForm_NumSpacing.docx new file mode 100644 index 0000000000..e8636ec1e9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextEffects_Props3d_Ligatures_NumForm_NumSpacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextEffects_StylisticSets_CntxtAlts.docx b/sw/qa/extras/ooxmlexport/data/TextEffects_StylisticSets_CntxtAlts.docx new file mode 100644 index 0000000000..7233104764 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextEffects_StylisticSets_CntxtAlts.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextEffects_TextFill.docx b/sw/qa/extras/ooxmlexport/data/TextEffects_TextFill.docx new file mode 100644 index 0000000000..383d0a0215 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextEffects_TextFill.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextEffects_TextOutline.docx b/sw/qa/extras/ooxmlexport/data/TextEffects_TextOutline.docx new file mode 100644 index 0000000000..4ceb40c0e3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextEffects_TextOutline.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/TextFrameRotation.docx b/sw/qa/extras/ooxmlexport/data/TextFrameRotation.docx new file mode 100644 index 0000000000..ac7c2236bf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TextFrameRotation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/UnknownStyleInRedline.docx b/sw/qa/extras/ooxmlexport/data/UnknownStyleInRedline.docx new file mode 100644 index 0000000000..37457fe1e8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/UnknownStyleInRedline.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/Unsupportedtextfields.docx b/sw/qa/extras/ooxmlexport/data/Unsupportedtextfields.docx new file mode 100644 index 0000000000..698142effe Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/Unsupportedtextfields.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/WPGbodyPr.docx b/sw/qa/extras/ooxmlexport/data/WPGbodyPr.docx new file mode 100644 index 0000000000..a0a9ae764b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/WPGbodyPr.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/a4andborders.docx b/sw/qa/extras/ooxmlexport/data/a4andborders.docx new file mode 100644 index 0000000000..afeb91cda7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/a4andborders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/abi11739.docx b/sw/qa/extras/ooxmlexport/data/abi11739.docx new file mode 100644 index 0000000000..8eb6999da2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/abi11739.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/absolute-link.docx b/sw/qa/extras/ooxmlexport/data/absolute-link.docx new file mode 100644 index 0000000000..db36a6f32a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/absolute-link.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/activex_checkbox.docx b/sw/qa/extras/ooxmlexport/data/activex_checkbox.docx new file mode 100644 index 0000000000..d7415ef5a5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/activex_checkbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/activex_control_align.odt b/sw/qa/extras/ooxmlexport/data/activex_control_align.odt new file mode 100644 index 0000000000..b9944c7e5a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/activex_control_align.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/activex_control_at_run_end.odt b/sw/qa/extras/ooxmlexport/data/activex_control_at_run_end.odt new file mode 100644 index 0000000000..9008cb90a5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/activex_control_at_run_end.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/activex_option_button_group.docx b/sw/qa/extras/ooxmlexport/data/activex_option_button_group.docx new file mode 100644 index 0000000000..9da266a927 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/activex_option_button_group.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/activex_textbox.docx b/sw/qa/extras/ooxmlexport/data/activex_textbox.docx new file mode 100644 index 0000000000..6f137008ce Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/activex_textbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/afterlines.docx b/sw/qa/extras/ooxmlexport/data/afterlines.docx new file mode 100644 index 0000000000..296f91e2e6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/afterlines.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/all_gaps_word.docx b/sw/qa/extras/ooxmlexport/data/all_gaps_word.docx new file mode 100644 index 0000000000..fc52281a25 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/all_gaps_word.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/alphabeticalIndex_AutoColumn.docx b/sw/qa/extras/ooxmlexport/data/alphabeticalIndex_AutoColumn.docx new file mode 100644 index 0000000000..e08e943ac2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/alphabeticalIndex_AutoColumn.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/alphabeticalIndex_MultipleColumns.docx b/sw/qa/extras/ooxmlexport/data/alphabeticalIndex_MultipleColumns.docx new file mode 100644 index 0000000000..970166ad48 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/alphabeticalIndex_MultipleColumns.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/anchor-position.docx b/sw/qa/extras/ooxmlexport/data/anchor-position.docx new file mode 100644 index 0000000000..b210ee930e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/anchor-position.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/annotation-formatting.docx b/sw/qa/extras/ooxmlexport/data/annotation-formatting.docx new file mode 100644 index 0000000000..87af02b780 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/annotation-formatting.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/arabic-zero-numbering.docx b/sw/qa/extras/ooxmlexport/data/arabic-zero-numbering.docx new file mode 100644 index 0000000000..f87dce364c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/arabic-zero-numbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx b/sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx new file mode 100644 index 0000000000..bd95186a60 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/arabic-zero4-numbering.docx b/sw/qa/extras/ooxmlexport/data/arabic-zero4-numbering.docx new file mode 100644 index 0000000000..6779d85989 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/arabic-zero4-numbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/arabic-zero5-numbering.docx b/sw/qa/extras/ooxmlexport/data/arabic-zero5-numbering.docx new file mode 100644 index 0000000000..f7df2c5267 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/arabic-zero5-numbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/artistic_effects.docx b/sw/qa/extras/ooxmlexport/data/artistic_effects.docx new file mode 100644 index 0000000000..7bfb4b9d14 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/artistic_effects.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/author-property.docx b/sw/qa/extras/ooxmlexport/data/author-property.docx new file mode 100644 index 0000000000..474bb7933d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/author-property.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/autofit.docx b/sw/qa/extras/ooxmlexport/data/autofit.docx new file mode 100644 index 0000000000..8932edfc7b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/autofit.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/bad.docm b/sw/qa/extras/ooxmlexport/data/bad.docm new file mode 100644 index 0000000000..b1e83220aa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bad.docm differ diff --git a/sw/qa/extras/ooxmlexport/data/behinddoc.docx b/sw/qa/extras/ooxmlexport/data/behinddoc.docx new file mode 100644 index 0000000000..f859d2e90a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/behinddoc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/bezier.odt b/sw/qa/extras/ooxmlexport/data/bezier.odt new file mode 100644 index 0000000000..c73ed3e98f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bezier.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc581614.doc b/sw/qa/extras/ooxmlexport/data/bnc581614.doc new file mode 100644 index 0000000000..f56525e87d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc581614.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc637947.odt b/sw/qa/extras/ooxmlexport/data/bnc637947.odt new file mode 100644 index 0000000000..db5c878c9f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc637947.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc780044_spacing.docx b/sw/qa/extras/ooxmlexport/data/bnc780044_spacing.docx new file mode 100644 index 0000000000..927d4d3767 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc780044_spacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc834035.odt b/sw/qa/extras/ooxmlexport/data/bnc834035.odt new file mode 100644 index 0000000000..393c960dea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc834035.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc837302.docx b/sw/qa/extras/ooxmlexport/data/bnc837302.docx new file mode 100644 index 0000000000..9d0c0af68b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc837302.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc865381.docx b/sw/qa/extras/ooxmlexport/data/bnc865381.docx new file mode 100644 index 0000000000..bb125cc730 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc865381.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc884615.docx b/sw/qa/extras/ooxmlexport/data/bnc884615.docx new file mode 100644 index 0000000000..51ee5ca0c5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc884615.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/bnc891663.docx b/sw/qa/extras/ooxmlexport/data/bnc891663.docx new file mode 100644 index 0000000000..d5f057e66f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/bnc891663.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/btlr-frame.odt b/sw/qa/extras/ooxmlexport/data/btlr-frame.odt new file mode 100644 index 0000000000..31cb03849c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/btlr-frame.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/btlr-textbox.docx b/sw/qa/extras/ooxmlexport/data/btlr-textbox.docx new file mode 100644 index 0000000000..181d305eac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/btlr-textbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/calendar1.docx b/sw/qa/extras/ooxmlexport/data/calendar1.docx new file mode 100644 index 0000000000..81a5046171 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/calendar1.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/calendar2.docx b/sw/qa/extras/ooxmlexport/data/calendar2.docx new file mode 100644 index 0000000000..4e7d4ed3c0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/calendar2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/calendar3.docx b/sw/qa/extras/ooxmlexport/data/calendar3.docx new file mode 100644 index 0000000000..6c720aff9c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/calendar3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/calendar4.docx b/sw/qa/extras/ooxmlexport/data/calendar4.docx new file mode 100644 index 0000000000..ecf71d8a34 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/calendar4.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/calendar5.docx b/sw/qa/extras/ooxmlexport/data/calendar5.docx new file mode 100644 index 0000000000..a27634673e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/calendar5.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/caption.docx b/sw/qa/extras/ooxmlexport/data/caption.docx new file mode 100644 index 0000000000..301472cbc7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/caption.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cell-btlr.docx b/sw/qa/extras/ooxmlexport/data/cell-btlr.docx new file mode 100644 index 0000000000..f05f114da0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cell-btlr.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cell-grid-span.docx b/sw/qa/extras/ooxmlexport/data/cell-grid-span.docx new file mode 100644 index 0000000000..de71d48188 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cell-grid-span.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cell-sdt-redline.docx b/sw/qa/extras/ooxmlexport/data/cell-sdt-redline.docx new file mode 100644 index 0000000000..41d7222990 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cell-sdt-redline.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/charborder.odt b/sw/qa/extras/ooxmlexport/data/charborder.odt new file mode 100644 index 0000000000..67dd89b099 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/charborder.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/chart-dupe.docx b/sw/qa/extras/ooxmlexport/data/chart-dupe.docx new file mode 100644 index 0000000000..545f9665f7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/chart-dupe.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/chart-in-footer.docx b/sw/qa/extras/ooxmlexport/data/chart-in-footer.docx new file mode 100644 index 0000000000..293ee076bc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/chart-in-footer.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/chart-prop.docx b/sw/qa/extras/ooxmlexport/data/chart-prop.docx new file mode 100644 index 0000000000..f9cddd4949 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/chart-prop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/chart-size.docx b/sw/qa/extras/ooxmlexport/data/chart-size.docx new file mode 100644 index 0000000000..da5d144438 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/chart-size.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/chart.docx b/sw/qa/extras/ooxmlexport/data/chart.docx new file mode 100644 index 0000000000..f984f0b17e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/chart.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/checkbox-control.docx b/sw/qa/extras/ooxmlexport/data/checkbox-control.docx new file mode 100644 index 0000000000..905d29a966 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/checkbox-control.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/chtoutline.docx b/sw/qa/extras/ooxmlexport/data/chtoutline.docx new file mode 100644 index 0000000000..92fdaf71e7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/chtoutline.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cjklist30.docx b/sw/qa/extras/ooxmlexport/data/cjklist30.docx new file mode 100644 index 0000000000..b2efbb995d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cjklist30.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cjklist31.docx b/sw/qa/extras/ooxmlexport/data/cjklist31.docx new file mode 100644 index 0000000000..95d4c9aeba Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cjklist31.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cjklist34.docx b/sw/qa/extras/ooxmlexport/data/cjklist34.docx new file mode 100644 index 0000000000..c09615aa2b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cjklist34.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cjklist35.docx b/sw/qa/extras/ooxmlexport/data/cjklist35.docx new file mode 100644 index 0000000000..85aa24fc20 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cjklist35.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/cjklist44.docx b/sw/qa/extras/ooxmlexport/data/cjklist44.docx new file mode 100644 index 0000000000..98538e931b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cjklist44.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/clearing-break.docx b/sw/qa/extras/ooxmlexport/data/clearing-break.docx new file mode 100644 index 0000000000..453a4c2b83 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/clearing-break.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/columnbreak.docx b/sw/qa/extras/ooxmlexport/data/columnbreak.docx new file mode 100644 index 0000000000..f55780e896 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/columnbreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/combobox-control.docx b/sw/qa/extras/ooxmlexport/data/combobox-control.docx new file mode 100644 index 0000000000..180aacab9e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/combobox-control.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/comment_initials.odt b/sw/qa/extras/ooxmlexport/data/comment_initials.odt new file mode 100644 index 0000000000..9b84ed8592 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/comment_initials.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/comments-nested.odt b/sw/qa/extras/ooxmlexport/data/comments-nested.odt new file mode 100644 index 0000000000..e7686058dd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/comments-nested.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/conditional-text.fodt b/sw/qa/extras/ooxmlexport/data/conditional-text.fodt new file mode 100644 index 0000000000..2486d0f6aa --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/conditional-text.fodt @@ -0,0 +1,8 @@ + + + + + True + + + diff --git a/sw/qa/extras/ooxmlexport/data/conditionalstyles-tbllook.docx b/sw/qa/extras/ooxmlexport/data/conditionalstyles-tbllook.docx new file mode 100644 index 0000000000..4222d63767 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/conditionalstyles-tbllook.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/content-control-grab-bag.docx b/sw/qa/extras/ooxmlexport/data/content-control-grab-bag.docx new file mode 100644 index 0000000000..33c01f08fd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/content-control-grab-bag.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/content-control-shape.docx b/sw/qa/extras/ooxmlexport/data/content-control-shape.docx new file mode 100644 index 0000000000..ab5be6cb69 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/content-control-shape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/controlshape.fodt b/sw/qa/extras/ooxmlexport/data/controlshape.fodt new file mode 100644 index 0000000000..81a7109240 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/controlshape.fodt @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/cp1000015.odt b/sw/qa/extras/ooxmlexport/data/cp1000015.odt new file mode 100644 index 0000000000..7d8dc9f107 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/cp1000015.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/crop-pixel.docx b/sw/qa/extras/ooxmlexport/data/crop-pixel.docx new file mode 100644 index 0000000000..1ddb2efb93 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/crop-pixel.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/crop-roundtrip.docx b/sw/qa/extras/ooxmlexport/data/crop-roundtrip.docx new file mode 100644 index 0000000000..6db60d0e8c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/crop-roundtrip.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt b/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt new file mode 100644 index 0000000000..825db09da8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/custom-properties.docx b/sw/qa/extras/ooxmlexport/data/custom-properties.docx new file mode 100644 index 0000000000..01db34977b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/custom-properties.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/custom-styles-TOC-comma.docx b/sw/qa/extras/ooxmlexport/data/custom-styles-TOC-comma.docx new file mode 100644 index 0000000000..1b013086dc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/custom-styles-TOC-comma.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/custom-styles-TOC-semicolon.docx b/sw/qa/extras/ooxmlexport/data/custom-styles-TOC-semicolon.docx new file mode 100644 index 0000000000..bef835c9bb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/custom-styles-TOC-semicolon.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/customxml.docx b/sw/qa/extras/ooxmlexport/data/customxml.docx new file mode 100644 index 0000000000..bfdf8ece68 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/customxml.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dashed_line_custdash_1000th_of_percent.docx b/sw/qa/extras/ooxmlexport/data/dashed_line_custdash_1000th_of_percent.docx new file mode 100644 index 0000000000..643ec08ea4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dashed_line_custdash_1000th_of_percent.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dashed_line_custdash_percentage.docx b/sw/qa/extras/ooxmlexport/data/dashed_line_custdash_percentage.docx new file mode 100644 index 0000000000..643ec08ea4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dashed_line_custdash_percentage.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/date-control.docx b/sw/qa/extras/ooxmlexport/data/date-control.docx new file mode 100644 index 0000000000..fdf2299137 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/date-control.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx b/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx new file mode 100644 index 0000000000..6514b2a530 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/date_field_at_end_of_paragraph.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/date_field_in_shape.docx b/sw/qa/extras/ooxmlexport/data/date_field_in_shape.docx new file mode 100644 index 0000000000..ff3c637c34 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/date_field_in_shape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx b/sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx new file mode 100644 index 0000000000..d7ec479976 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/default-sect-break-cols.docx b/sw/qa/extras/ooxmlexport/data/default-sect-break-cols.docx new file mode 100644 index 0000000000..b66b844f16 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/default-sect-break-cols.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/defaultStyle.docx b/sw/qa/extras/ooxmlexport/data/defaultStyle.docx new file mode 100644 index 0000000000..8e3faa70da Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/defaultStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dkvert.docx b/sw/qa/extras/ooxmlexport/data/dkvert.docx new file mode 100644 index 0000000000..bc1ee78813 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dkvert.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-charheight-default.docx b/sw/qa/extras/ooxmlexport/data/dml-charheight-default.docx new file mode 100644 index 0000000000..0f22a87f0e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-charheight-default.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-customgeometry-cubicbezier.docx b/sw/qa/extras/ooxmlexport/data/dml-customgeometry-cubicbezier.docx new file mode 100644 index 0000000000..9cc84a9271 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-customgeometry-cubicbezier.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-gradientfill-theme.docx b/sw/qa/extras/ooxmlexport/data/dml-gradientfill-theme.docx new file mode 100644 index 0000000000..3311ce8a04 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-gradientfill-theme.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-groupshape-capitalization.docx b/sw/qa/extras/ooxmlexport/data/dml-groupshape-capitalization.docx new file mode 100644 index 0000000000..67fd21f64d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-groupshape-capitalization.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-groupshape-childposition.docx b/sw/qa/extras/ooxmlexport/data/dml-groupshape-childposition.docx new file mode 100644 index 0000000000..a5c6bf99a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-groupshape-childposition.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-groupshape-paraspacing.docx b/sw/qa/extras/ooxmlexport/data/dml-groupshape-paraspacing.docx new file mode 100644 index 0000000000..a8fc82bd56 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-groupshape-paraspacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-groupshape-relsize.docx b/sw/qa/extras/ooxmlexport/data/dml-groupshape-relsize.docx new file mode 100644 index 0000000000..6be137b287 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-groupshape-relsize.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-groupshape-runfonts.docx b/sw/qa/extras/ooxmlexport/data/dml-groupshape-runfonts.docx new file mode 100644 index 0000000000..e4c8c6cb57 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-groupshape-runfonts.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-groupshape-sdt.docx b/sw/qa/extras/ooxmlexport/data/dml-groupshape-sdt.docx new file mode 100644 index 0000000000..7314d876a4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-groupshape-sdt.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx b/sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx new file mode 100644 index 0000000000..7d5876108d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-rectangle-relsize.docx b/sw/qa/extras/ooxmlexport/data/dml-rectangle-relsize.docx new file mode 100644 index 0000000000..265dcbb4ee Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-rectangle-relsize.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-shape-fillbitmapcrop.docx b/sw/qa/extras/ooxmlexport/data/dml-shape-fillbitmapcrop.docx new file mode 100644 index 0000000000..6c401bae93 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-shape-fillbitmapcrop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-shape-fillpattern.docx b/sw/qa/extras/ooxmlexport/data/dml-shape-fillpattern.docx new file mode 100644 index 0000000000..9878c99641 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-shape-fillpattern.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-shape-relsize.docx b/sw/qa/extras/ooxmlexport/data/dml-shape-relsize.docx new file mode 100644 index 0000000000..80ae02e026 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-shape-relsize.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-shape-title.docx b/sw/qa/extras/ooxmlexport/data/dml-shape-title.docx new file mode 100644 index 0000000000..d354806f90 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-shape-title.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx b/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx new file mode 100644 index 0000000000..9f2c46d2e8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-solidfill-alpha.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-textframe-vertadjust.docx b/sw/qa/extras/ooxmlexport/data/dml-textframe-vertadjust.docx new file mode 100644 index 0000000000..bf5dcdde43 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-textframe-vertadjust.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-textshape.docx b/sw/qa/extras/ooxmlexport/data/dml-textshape.docx new file mode 100644 index 0000000000..28e39c29a9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-textshape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-textshapeB.docx b/sw/qa/extras/ooxmlexport/data/dml-textshapeB.docx new file mode 100644 index 0000000000..ab790a896f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-textshapeB.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dml-zorder.odt b/sw/qa/extras/ooxmlexport/data/dml-zorder.odt new file mode 100644 index 0000000000..ba799a547e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dml-zorder.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/docxopenhyperlinkbox.docx b/sw/qa/extras/ooxmlexport/data/docxopenhyperlinkbox.docx new file mode 100644 index 0000000000..2653e62020 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/docxopenhyperlinkbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dont-add-new-styles.docx b/sw/qa/extras/ooxmlexport/data/dont-add-new-styles.docx new file mode 100644 index 0000000000..1ee154a818 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dont-add-new-styles.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/drawinglayer-pic-pos.docx b/sw/qa/extras/ooxmlexport/data/drawinglayer-pic-pos.docx new file mode 100644 index 0000000000..bb18ab38b3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/drawinglayer-pic-pos.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/drawingml-flipv.docx b/sw/qa/extras/ooxmlexport/data/drawingml-flipv.docx new file mode 100644 index 0000000000..f10a83fac2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/drawingml-flipv.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/dropdown-in-cell.docx b/sw/qa/extras/ooxmlexport/data/dropdown-in-cell.docx new file mode 100644 index 0000000000..8abe25f82e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/dropdown-in-cell.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt b/sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt new file mode 100644 index 0000000000..22b8a554f8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/duplicate-east-asia.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/effect-extent-inline.docx b/sw/qa/extras/ooxmlexport/data/effect-extent-inline.docx new file mode 100644 index 0000000000..bb7db129aa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/effect-extent-inline.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/effect-extent-line-width.docx b/sw/qa/extras/ooxmlexport/data/effect-extent-line-width.docx new file mode 100644 index 0000000000..5cc4d4e374 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/effect-extent-line-width.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/effect-extent.docx b/sw/qa/extras/ooxmlexport/data/effect-extent.docx new file mode 100644 index 0000000000..f35fc3a4ab Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/effect-extent.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/effectextent-margin.docx b/sw/qa/extras/ooxmlexport/data/effectextent-margin.docx new file mode 100644 index 0000000000..5dccf967fe Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/effectextent-margin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/em.docx b/sw/qa/extras/ooxmlexport/data/em.docx new file mode 100644 index 0000000000..ee3137e70c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/em.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/embedded-xlsx.docx b/sw/qa/extras/ooxmlexport/data/embedded-xlsx.docx new file mode 100644 index 0000000000..3b9dd2a684 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/embedded-xlsx.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/embedded_chart.odt b/sw/qa/extras/ooxmlexport/data/embedded_chart.odt new file mode 100644 index 0000000000..820e9a3b2e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/embedded_chart.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/embedded_images.odt b/sw/qa/extras/ooxmlexport/data/embedded_images.odt new file mode 100644 index 0000000000..26166fac34 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/embedded_images.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/empty-annotation-mark.docx b/sw/qa/extras/ooxmlexport/data/empty-annotation-mark.docx new file mode 100644 index 0000000000..854b6d7261 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/empty-annotation-mark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/empty-date-control.odt b/sw/qa/extras/ooxmlexport/data/empty-date-control.odt new file mode 100644 index 0000000000..acd5b8b94e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/empty-date-control.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/empty.odt b/sw/qa/extras/ooxmlexport/data/empty.odt new file mode 100644 index 0000000000..ba6886080e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/empty.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/endingSectionProps.docx b/sw/qa/extras/ooxmlexport/data/endingSectionProps.docx new file mode 100644 index 0000000000..e5dee2f60d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/endingSectionProps.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fail_bracePair.odt b/sw/qa/extras/ooxmlexport/data/fail_bracePair.odt new file mode 100644 index 0000000000..adab115eb0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fail_bracePair.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo106029.docx b/sw/qa/extras/ooxmlexport/data/fdo106029.docx new file mode 100644 index 0000000000..b19d63d4c2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo106029.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo38244.docx b/sw/qa/extras/ooxmlexport/data/fdo38244.docx new file mode 100644 index 0000000000..2551f0c64d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo38244.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo38414.docx b/sw/qa/extras/ooxmlexport/data/fdo38414.docx new file mode 100644 index 0000000000..135cd32c98 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo38414.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo43093.docx b/sw/qa/extras/ooxmlexport/data/fdo43093.docx new file mode 100644 index 0000000000..9d5de58b5f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo43093.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo43093b.docx b/sw/qa/extras/ooxmlexport/data/fdo43093b.docx new file mode 100644 index 0000000000..3e5a910e20 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo43093b.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo44689_start_page_0.docx b/sw/qa/extras/ooxmlexport/data/fdo44689_start_page_0.docx new file mode 100644 index 0000000000..f7e9331bef Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo44689_start_page_0.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo44689_start_page_7.docx b/sw/qa/extras/ooxmlexport/data/fdo44689_start_page_7.docx new file mode 100644 index 0000000000..25e58d3952 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo44689_start_page_7.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo46361.docx b/sw/qa/extras/ooxmlexport/data/fdo46361.docx new file mode 100644 index 0000000000..2f894e4b3c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo46361.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo47669.docx b/sw/qa/extras/ooxmlexport/data/fdo47669.docx new file mode 100644 index 0000000000..9c5ef68790 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo47669.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo48557.odt b/sw/qa/extras/ooxmlexport/data/fdo48557.odt new file mode 100644 index 0000000000..35353baace Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo48557.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo51034.odt b/sw/qa/extras/ooxmlexport/data/fdo51034.odt new file mode 100644 index 0000000000..9720cfb65b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo51034.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo51550.odt b/sw/qa/extras/ooxmlexport/data/fdo51550.odt new file mode 100644 index 0000000000..4cade5b21b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo51550.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo52208.docx b/sw/qa/extras/ooxmlexport/data/fdo52208.docx new file mode 100644 index 0000000000..be842ad2ac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo52208.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo53985.docx b/sw/qa/extras/ooxmlexport/data/fdo53985.docx new file mode 100644 index 0000000000..0c8b32fb67 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo53985.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo55187.docx b/sw/qa/extras/ooxmlexport/data/fdo55187.docx new file mode 100644 index 0000000000..59cd0a8062 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo55187.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo55381.docx b/sw/qa/extras/ooxmlexport/data/fdo55381.docx new file mode 100644 index 0000000000..ffeae1f874 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo55381.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo56679.docx b/sw/qa/extras/ooxmlexport/data/fdo56679.docx new file mode 100644 index 0000000000..8ea689c3c5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo56679.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo58577.odt b/sw/qa/extras/ooxmlexport/data/fdo58577.odt new file mode 100644 index 0000000000..4c8656d7eb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo58577.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo59273.docx b/sw/qa/extras/ooxmlexport/data/fdo59273.docx new file mode 100644 index 0000000000..fcdfd77344 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo59273.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo59638.docx b/sw/qa/extras/ooxmlexport/data/fdo59638.docx new file mode 100644 index 0000000000..d33e7cc0a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo59638.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo60922.docx b/sw/qa/extras/ooxmlexport/data/fdo60922.docx new file mode 100644 index 0000000000..0d1ff2613e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo60922.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo60957-2.docx b/sw/qa/extras/ooxmlexport/data/fdo60957-2.docx new file mode 100644 index 0000000000..3819aafd8f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo60957-2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo60990.odt b/sw/qa/extras/ooxmlexport/data/fdo60990.odt new file mode 100644 index 0000000000..c855f327a9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo60990.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo61343.docx b/sw/qa/extras/ooxmlexport/data/fdo61343.docx new file mode 100644 index 0000000000..9ab99739b7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo61343.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo63053.docx b/sw/qa/extras/ooxmlexport/data/fdo63053.docx new file mode 100644 index 0000000000..43282b0df7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo63053.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo63685.docx b/sw/qa/extras/ooxmlexport/data/fdo63685.docx new file mode 100644 index 0000000000..a1348fcff3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo63685.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo64350.docx b/sw/qa/extras/ooxmlexport/data/fdo64350.docx new file mode 100644 index 0000000000..6f41b66647 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo64350.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo64826.docx b/sw/qa/extras/ooxmlexport/data/fdo64826.docx new file mode 100644 index 0000000000..ce4287cea5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo64826.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo65090.docx b/sw/qa/extras/ooxmlexport/data/fdo65090.docx new file mode 100644 index 0000000000..4d45737ddc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65090.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo65265.docx b/sw/qa/extras/ooxmlexport/data/fdo65265.docx new file mode 100644 index 0000000000..6267085fa2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65265.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo65295.docx b/sw/qa/extras/ooxmlexport/data/fdo65295.docx new file mode 100644 index 0000000000..52a231afa0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65295.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo65400.docx b/sw/qa/extras/ooxmlexport/data/fdo65400.docx new file mode 100644 index 0000000000..c247e9fff8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65400.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo65632.docx b/sw/qa/extras/ooxmlexport/data/fdo65632.docx new file mode 100644 index 0000000000..8c336c20fd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65632.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo65718.docx b/sw/qa/extras/ooxmlexport/data/fdo65718.docx new file mode 100644 index 0000000000..0af4f90025 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65718.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo65833.docx b/sw/qa/extras/ooxmlexport/data/fdo65833.docx new file mode 100644 index 0000000000..097015eed1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo65833.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo66474.docx b/sw/qa/extras/ooxmlexport/data/fdo66474.docx new file mode 100644 index 0000000000..0252746f5b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo66474.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo66543.docx b/sw/qa/extras/ooxmlexport/data/fdo66543.docx new file mode 100644 index 0000000000..585eb41e42 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo66543.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo66688.docx b/sw/qa/extras/ooxmlexport/data/fdo66688.docx new file mode 100644 index 0000000000..300b915044 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo66688.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo66773.docx b/sw/qa/extras/ooxmlexport/data/fdo66773.docx new file mode 100644 index 0000000000..41f0abee7b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo66773.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo66781.docx b/sw/qa/extras/ooxmlexport/data/fdo66781.docx new file mode 100644 index 0000000000..13e5423f4d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo66781.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo66929.docx b/sw/qa/extras/ooxmlexport/data/fdo66929.docx new file mode 100644 index 0000000000..7f0afac3cb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo66929.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo67013.docx b/sw/qa/extras/ooxmlexport/data/fdo67013.docx new file mode 100644 index 0000000000..5512550ead Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo67013.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo67737.docx b/sw/qa/extras/ooxmlexport/data/fdo67737.docx new file mode 100644 index 0000000000..8be34ec711 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo67737.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo68418.docx b/sw/qa/extras/ooxmlexport/data/fdo68418.docx new file mode 100644 index 0000000000..10b7c009c2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo68418.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo68607.docx b/sw/qa/extras/ooxmlexport/data/fdo68607.docx new file mode 100644 index 0000000000..11f57064ce Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo68607.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo68787.docx b/sw/qa/extras/ooxmlexport/data/fdo68787.docx new file mode 100644 index 0000000000..c47b809958 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo68787.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo69548.docx b/sw/qa/extras/ooxmlexport/data/fdo69548.docx new file mode 100644 index 0000000000..6799f5ef26 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo69548.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo69616.docx b/sw/qa/extras/ooxmlexport/data/fdo69616.docx new file mode 100644 index 0000000000..7c7f52e168 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo69616.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo69636.docx b/sw/qa/extras/ooxmlexport/data/fdo69636.docx new file mode 100644 index 0000000000..b2f3069b50 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo69636.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo69644.docx b/sw/qa/extras/ooxmlexport/data/fdo69644.docx new file mode 100644 index 0000000000..1a254db3b4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo69644.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo69649.docx b/sw/qa/extras/ooxmlexport/data/fdo69649.docx new file mode 100644 index 0000000000..cb0f789998 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo69649.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo70457.docx b/sw/qa/extras/ooxmlexport/data/fdo70457.docx new file mode 100644 index 0000000000..b9cabb1190 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo70457.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo70812.docx b/sw/qa/extras/ooxmlexport/data/fdo70812.docx new file mode 100644 index 0000000000..b9b5d52c20 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo70812.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo70838.docx b/sw/qa/extras/ooxmlexport/data/fdo70838.docx new file mode 100644 index 0000000000..ede97f7eac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo70838.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo70942.docx b/sw/qa/extras/ooxmlexport/data/fdo70942.docx new file mode 100644 index 0000000000..a04a78437c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo70942.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo71302.docx b/sw/qa/extras/ooxmlexport/data/fdo71302.docx new file mode 100644 index 0000000000..1f62e87c5d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo71302.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo71646.docx b/sw/qa/extras/ooxmlexport/data/fdo71646.docx new file mode 100644 index 0000000000..d49d88b67c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo71646.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo71785.docx b/sw/qa/extras/ooxmlexport/data/fdo71785.docx new file mode 100644 index 0000000000..e155e831fa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo71785.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo71834.docx b/sw/qa/extras/ooxmlexport/data/fdo71834.docx new file mode 100644 index 0000000000..1545334507 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo71834.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo72560.docx b/sw/qa/extras/ooxmlexport/data/fdo72560.docx new file mode 100644 index 0000000000..b21535bfd4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo72560.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo72560b.docx b/sw/qa/extras/ooxmlexport/data/fdo72560b.docx new file mode 100644 index 0000000000..dfe5176f3a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo72560b.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo72560c.docx b/sw/qa/extras/ooxmlexport/data/fdo72560c.docx new file mode 100644 index 0000000000..ed0b888220 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo72560c.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo72560d.docx b/sw/qa/extras/ooxmlexport/data/fdo72560d.docx new file mode 100644 index 0000000000..000ae73d8a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo72560d.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo72560e.docx b/sw/qa/extras/ooxmlexport/data/fdo72560e.docx new file mode 100644 index 0000000000..7c3e89fb33 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo72560e.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73215.docx b/sw/qa/extras/ooxmlexport/data/fdo73215.docx new file mode 100644 index 0000000000..9b2c05b720 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73215.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73227.docx b/sw/qa/extras/ooxmlexport/data/fdo73227.docx new file mode 100644 index 0000000000..015beb9d69 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73227.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73247.docx b/sw/qa/extras/ooxmlexport/data/fdo73247.docx new file mode 100644 index 0000000000..63ad782f60 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73247.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73389.docx b/sw/qa/extras/ooxmlexport/data/fdo73389.docx new file mode 100644 index 0000000000..02b55f74e2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73389.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73541.docx b/sw/qa/extras/ooxmlexport/data/fdo73541.docx new file mode 100644 index 0000000000..469d025209 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73541.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73550.docx b/sw/qa/extras/ooxmlexport/data/fdo73550.docx new file mode 100644 index 0000000000..c6b7f15d9f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73550.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73556.docx b/sw/qa/extras/ooxmlexport/data/fdo73556.docx new file mode 100644 index 0000000000..50354076d3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73556.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73596_AlphaSeparator.docx b/sw/qa/extras/ooxmlexport/data/fdo73596_AlphaSeparator.docx new file mode 100644 index 0000000000..892bc553b3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73596_AlphaSeparator.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo73596_RunInStyle.docx b/sw/qa/extras/ooxmlexport/data/fdo73596_RunInStyle.docx new file mode 100644 index 0000000000..8f1863b467 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo73596_RunInStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74110.docx b/sw/qa/extras/ooxmlexport/data/fdo74110.docx new file mode 100644 index 0000000000..6b7ab0e415 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74110.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74153.docx b/sw/qa/extras/ooxmlexport/data/fdo74153.docx new file mode 100644 index 0000000000..4cbdd7bba9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74153.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74357.docx b/sw/qa/extras/ooxmlexport/data/fdo74357.docx new file mode 100644 index 0000000000..970372906e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74357.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74401.docx b/sw/qa/extras/ooxmlexport/data/fdo74401.docx new file mode 100644 index 0000000000..fd3cbabdd9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74401.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74566.docx b/sw/qa/extras/ooxmlexport/data/fdo74566.docx new file mode 100644 index 0000000000..b197b946a4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74566.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74605.docx b/sw/qa/extras/ooxmlexport/data/fdo74605.docx new file mode 100644 index 0000000000..85231f151f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74605.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74745.docx b/sw/qa/extras/ooxmlexport/data/fdo74745.docx new file mode 100644 index 0000000000..773567756a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74745.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo74792.docx b/sw/qa/extras/ooxmlexport/data/fdo74792.docx new file mode 100644 index 0000000000..3d00009a03 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo74792.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo75431.docx b/sw/qa/extras/ooxmlexport/data/fdo75431.docx new file mode 100644 index 0000000000..4922784036 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo75431.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76016.docx b/sw/qa/extras/ooxmlexport/data/fdo76016.docx new file mode 100644 index 0000000000..79fa6b9a42 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76016.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76098.docx b/sw/qa/extras/ooxmlexport/data/fdo76098.docx new file mode 100644 index 0000000000..8a616e9b73 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76098.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76101.docx b/sw/qa/extras/ooxmlexport/data/fdo76101.docx new file mode 100644 index 0000000000..d2264f3f88 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76101.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76163.docx b/sw/qa/extras/ooxmlexport/data/fdo76163.docx new file mode 100644 index 0000000000..0c7cc7027c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76163.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76249.docx b/sw/qa/extras/ooxmlexport/data/fdo76249.docx new file mode 100644 index 0000000000..9b50f5de65 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76249.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76316.docx b/sw/qa/extras/ooxmlexport/data/fdo76316.docx new file mode 100644 index 0000000000..5cfd9d937b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76316.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76586.docx b/sw/qa/extras/ooxmlexport/data/fdo76586.docx new file mode 100644 index 0000000000..28ae05ee72 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76586.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76587.docx b/sw/qa/extras/ooxmlexport/data/fdo76587.docx new file mode 100644 index 0000000000..84c23adc77 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76587.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76589.docx b/sw/qa/extras/ooxmlexport/data/fdo76589.docx new file mode 100644 index 0000000000..d501b1b594 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76589.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76591.docx b/sw/qa/extras/ooxmlexport/data/fdo76591.docx new file mode 100644 index 0000000000..8ca43879ca Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76591.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76597.docx b/sw/qa/extras/ooxmlexport/data/fdo76597.docx new file mode 100644 index 0000000000..a970136b8f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76597.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76741.docx b/sw/qa/extras/ooxmlexport/data/fdo76741.docx new file mode 100644 index 0000000000..abe9985a14 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76741.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76803.docx b/sw/qa/extras/ooxmlexport/data/fdo76803.docx new file mode 100644 index 0000000000..65fad065a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76803.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76934.docx b/sw/qa/extras/ooxmlexport/data/fdo76934.docx new file mode 100644 index 0000000000..0515cf2bf2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76934.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo76979.docx b/sw/qa/extras/ooxmlexport/data/fdo76979.docx new file mode 100644 index 0000000000..f8ee995200 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo76979.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77117.docx b/sw/qa/extras/ooxmlexport/data/fdo77117.docx new file mode 100644 index 0000000000..f2a1d447e7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77117.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77129.docx b/sw/qa/extras/ooxmlexport/data/fdo77129.docx new file mode 100644 index 0000000000..b0661e9362 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77129.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77476.docx b/sw/qa/extras/ooxmlexport/data/fdo77476.docx new file mode 100644 index 0000000000..08c38b066b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77476.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77716.docx b/sw/qa/extras/ooxmlexport/data/fdo77716.docx new file mode 100644 index 0000000000..f706791004 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77716.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77718.docx b/sw/qa/extras/ooxmlexport/data/fdo77718.docx new file mode 100644 index 0000000000..7a22485f76 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77718.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77719.docx b/sw/qa/extras/ooxmlexport/data/fdo77719.docx new file mode 100644 index 0000000000..e671b33f4e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77719.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77725.docx b/sw/qa/extras/ooxmlexport/data/fdo77725.docx new file mode 100644 index 0000000000..b06a4b4eea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77725.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77727.docx b/sw/qa/extras/ooxmlexport/data/fdo77727.docx new file mode 100644 index 0000000000..9f553e210d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77727.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77759.docx b/sw/qa/extras/ooxmlexport/data/fdo77759.docx new file mode 100644 index 0000000000..6558690690 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77759.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77812.docx b/sw/qa/extras/ooxmlexport/data/fdo77812.docx new file mode 100644 index 0000000000..48fb498887 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77812.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77887.docx b/sw/qa/extras/ooxmlexport/data/fdo77887.docx new file mode 100644 index 0000000000..cb3f4537dd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77887.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo77890.docx b/sw/qa/extras/ooxmlexport/data/fdo77890.docx new file mode 100644 index 0000000000..ac90174fff Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo77890.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78284.docx b/sw/qa/extras/ooxmlexport/data/fdo78284.docx new file mode 100644 index 0000000000..92145eb127 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78284.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78300.docx b/sw/qa/extras/ooxmlexport/data/fdo78300.docx new file mode 100644 index 0000000000..40da0913d4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78300.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78384.docx b/sw/qa/extras/ooxmlexport/data/fdo78384.docx new file mode 100644 index 0000000000..ee102648f1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78384.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78420.docx b/sw/qa/extras/ooxmlexport/data/fdo78420.docx new file mode 100644 index 0000000000..6b253b189f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78420.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78432.docx b/sw/qa/extras/ooxmlexport/data/fdo78432.docx new file mode 100644 index 0000000000..343e76ae25 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78432.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78469.docx b/sw/qa/extras/ooxmlexport/data/fdo78469.docx new file mode 100644 index 0000000000..7ae4d71beb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78469.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78474.docx b/sw/qa/extras/ooxmlexport/data/fdo78474.docx new file mode 100644 index 0000000000..6468a84218 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78474.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78599.docx b/sw/qa/extras/ooxmlexport/data/fdo78599.docx new file mode 100644 index 0000000000..3c81780da1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78599.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78651.docx b/sw/qa/extras/ooxmlexport/data/fdo78651.docx new file mode 100644 index 0000000000..a510782b4a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78651.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78654.docx b/sw/qa/extras/ooxmlexport/data/fdo78654.docx new file mode 100644 index 0000000000..81d7bd0c42 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78654.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78658.docx b/sw/qa/extras/ooxmlexport/data/fdo78658.docx new file mode 100644 index 0000000000..1c0782e981 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78658.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78659.docx b/sw/qa/extras/ooxmlexport/data/fdo78659.docx new file mode 100644 index 0000000000..cf0800373e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78659.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78663.docx b/sw/qa/extras/ooxmlexport/data/fdo78663.docx new file mode 100644 index 0000000000..be35b6c004 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78663.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78882.docx b/sw/qa/extras/ooxmlexport/data/fdo78882.docx new file mode 100644 index 0000000000..da591f9e75 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78882.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78883.docx b/sw/qa/extras/ooxmlexport/data/fdo78883.docx new file mode 100644 index 0000000000..a72ff9436e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78883.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78886.docx b/sw/qa/extras/ooxmlexport/data/fdo78886.docx new file mode 100644 index 0000000000..e364948f1f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78886.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78887.docx b/sw/qa/extras/ooxmlexport/data/fdo78887.docx new file mode 100644 index 0000000000..db92fe4ede Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78887.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78904.docx b/sw/qa/extras/ooxmlexport/data/fdo78904.docx new file mode 100644 index 0000000000..c171ae2ca8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78904.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78907.docx b/sw/qa/extras/ooxmlexport/data/fdo78907.docx new file mode 100644 index 0000000000..abae6b4be0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78907.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78910.docx b/sw/qa/extras/ooxmlexport/data/fdo78910.docx new file mode 100644 index 0000000000..e8a090bee7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78910.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78939.docx b/sw/qa/extras/ooxmlexport/data/fdo78939.docx new file mode 100644 index 0000000000..2fc3198630 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78939.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo78957.docx b/sw/qa/extras/ooxmlexport/data/fdo78957.docx new file mode 100644 index 0000000000..38a18a3a6a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo78957.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79008.docx b/sw/qa/extras/ooxmlexport/data/fdo79008.docx new file mode 100644 index 0000000000..2b1758776b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79008.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79062.docx b/sw/qa/extras/ooxmlexport/data/fdo79062.docx new file mode 100644 index 0000000000..181ea72836 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79062.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79256.docx b/sw/qa/extras/ooxmlexport/data/fdo79256.docx new file mode 100644 index 0000000000..2358abb850 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79256.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79535.docx b/sw/qa/extras/ooxmlexport/data/fdo79535.docx new file mode 100644 index 0000000000..64aab18e0a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79535.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79540.docx b/sw/qa/extras/ooxmlexport/data/fdo79540.docx new file mode 100644 index 0000000000..ce843d6616 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79540.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79591.docx b/sw/qa/extras/ooxmlexport/data/fdo79591.docx new file mode 100644 index 0000000000..32a61debd4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79591.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79668.docx b/sw/qa/extras/ooxmlexport/data/fdo79668.docx new file mode 100644 index 0000000000..793fd2adff Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79668.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79738.docx b/sw/qa/extras/ooxmlexport/data/fdo79738.docx new file mode 100644 index 0000000000..e6873e7a23 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79738.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79817.docx b/sw/qa/extras/ooxmlexport/data/fdo79817.docx new file mode 100644 index 0000000000..7e948c5c8f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79817.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79822.docx b/sw/qa/extras/ooxmlexport/data/fdo79822.docx new file mode 100644 index 0000000000..2844671d60 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79822.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79915.docx b/sw/qa/extras/ooxmlexport/data/fdo79915.docx new file mode 100644 index 0000000000..351674df07 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79915.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79968.docx b/sw/qa/extras/ooxmlexport/data/fdo79968.docx new file mode 100644 index 0000000000..2da7ddcc4f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79968.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79969_xlsb.docx b/sw/qa/extras/ooxmlexport/data/fdo79969_xlsb.docx new file mode 100644 index 0000000000..0e413992be Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79969_xlsb.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo79969_xlsm.docx b/sw/qa/extras/ooxmlexport/data/fdo79969_xlsm.docx new file mode 100644 index 0000000000..6fd11f3974 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo79969_xlsm.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80097.docx b/sw/qa/extras/ooxmlexport/data/fdo80097.docx new file mode 100644 index 0000000000..3f8ba9f90a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80097.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80410.docx b/sw/qa/extras/ooxmlexport/data/fdo80410.docx new file mode 100644 index 0000000000..7660d84447 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80410.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80522.docx b/sw/qa/extras/ooxmlexport/data/fdo80522.docx new file mode 100644 index 0000000000..9445b733f5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80522.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80523_pptm.docx b/sw/qa/extras/ooxmlexport/data/fdo80523_pptm.docx new file mode 100644 index 0000000000..3140f3b6d6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80523_pptm.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80523_sldm.docx b/sw/qa/extras/ooxmlexport/data/fdo80523_sldm.docx new file mode 100644 index 0000000000..e50cda1a51 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80523_sldm.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80555.docx b/sw/qa/extras/ooxmlexport/data/fdo80555.docx new file mode 100644 index 0000000000..a15bdc1ecd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80555.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80800.docx b/sw/qa/extras/ooxmlexport/data/fdo80800.docx new file mode 100644 index 0000000000..64ed7697f7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80800.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80800b_tableStyle.docx b/sw/qa/extras/ooxmlexport/data/fdo80800b_tableStyle.docx new file mode 100644 index 0000000000..bde907cf22 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80800b_tableStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80895.docx b/sw/qa/extras/ooxmlexport/data/fdo80895.docx new file mode 100644 index 0000000000..711882fd4e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80895.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80897.docx b/sw/qa/extras/ooxmlexport/data/fdo80897.docx new file mode 100644 index 0000000000..2f0957e692 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80897.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80898.docx b/sw/qa/extras/ooxmlexport/data/fdo80898.docx new file mode 100644 index 0000000000..d4b9e1f23a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80898.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80902.docx b/sw/qa/extras/ooxmlexport/data/fdo80902.docx new file mode 100644 index 0000000000..73a927f9a3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80902.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo80997.docx b/sw/qa/extras/ooxmlexport/data/fdo80997.docx new file mode 100644 index 0000000000..713e890afd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo80997.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo81031.docx b/sw/qa/extras/ooxmlexport/data/fdo81031.docx new file mode 100644 index 0000000000..d80111dec5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo81031.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo81341.docx b/sw/qa/extras/ooxmlexport/data/fdo81341.docx new file mode 100644 index 0000000000..3c243c0dd1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo81341.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo81381.docx b/sw/qa/extras/ooxmlexport/data/fdo81381.docx new file mode 100644 index 0000000000..bf4a860c78 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo81381.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo81486.docx b/sw/qa/extras/ooxmlexport/data/fdo81486.docx new file mode 100644 index 0000000000..6e680c350a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo81486.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo81492.docx b/sw/qa/extras/ooxmlexport/data/fdo81492.docx new file mode 100644 index 0000000000..be3353b3c4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo81492.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo81945.docx b/sw/qa/extras/ooxmlexport/data/fdo81945.docx new file mode 100644 index 0000000000..51dee9cfe3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo81945.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo81946.docx b/sw/qa/extras/ooxmlexport/data/fdo81946.docx new file mode 100644 index 0000000000..b179f58bf8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo81946.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo82123.docx b/sw/qa/extras/ooxmlexport/data/fdo82123.docx new file mode 100644 index 0000000000..fc2632cb6a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo82123.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo82492.docx b/sw/qa/extras/ooxmlexport/data/fdo82492.docx new file mode 100644 index 0000000000..6533056f47 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo82492.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo83044.docx b/sw/qa/extras/ooxmlexport/data/fdo83044.docx new file mode 100644 index 0000000000..01d32bfdb8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo83044.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo83048.docx b/sw/qa/extras/ooxmlexport/data/fdo83048.docx new file mode 100644 index 0000000000..3ef6d995fa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo83048.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo83057.docx b/sw/qa/extras/ooxmlexport/data/fdo83057.docx new file mode 100644 index 0000000000..d4d42321de Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo83057.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo83428.docx b/sw/qa/extras/ooxmlexport/data/fdo83428.docx new file mode 100644 index 0000000000..9e9743a3e0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo83428.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fdo85542.docx b/sw/qa/extras/ooxmlexport/data/fdo85542.docx new file mode 100644 index 0000000000..db49408451 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo85542.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/field-rotated.fodt b/sw/qa/extras/ooxmlexport/data/field-rotated.fodt new file mode 100644 index 0000000000..079f35dfb9 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/field-rotated.fodt @@ -0,0 +1,44 @@ + + + + 2020-02-07T13:06:45.8693885021PT1M18SRotationeering2020-02-07T13:08:03.244415357LibreOfficeDev/7.0.0.0.alpha0$Linux_X86_64 LibreOffice_project/d2eff4b08869dd15b025c5801896e0332b14ba59 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rotationeering + + + diff --git a/sw/qa/extras/ooxmlexport/data/file_crash.docx b/sw/qa/extras/ooxmlexport/data/file_crash.docx new file mode 100644 index 0000000000..7a233aba5c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/file_crash.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/fixed-date-field.docx b/sw/qa/extras/ooxmlexport/data/fixed-date-field.docx new file mode 100644 index 0000000000..960e2db808 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fixed-date-field.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/flip_and_rotate.odt b/sw/qa/extras/ooxmlexport/data/flip_and_rotate.odt new file mode 100644 index 0000000000..4805bfa800 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/flip_and_rotate.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/floating-table-position.docx b/sw/qa/extras/ooxmlexport/data/floating-table-position.docx new file mode 100644 index 0000000000..de7a467aac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/floating-table-position.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/floating-tables-anchor.docx b/sw/qa/extras/ooxmlexport/data/floating-tables-anchor.docx new file mode 100644 index 0000000000..70dc7cf8bf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/floating-tables-anchor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/floatingtbl_with_formula.docx b/sw/qa/extras/ooxmlexport/data/floatingtbl_with_formula.docx new file mode 100644 index 0000000000..ecabbd6b2a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/floatingtbl_with_formula.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/floattable-nested-cell-start.odt b/sw/qa/extras/ooxmlexport/data/floattable-nested-cell-start.odt new file mode 100644 index 0000000000..3e2ed72eca Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/floattable-nested-cell-start.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/floattable-nested.odt b/sw/qa/extras/ooxmlexport/data/floattable-nested.odt new file mode 100644 index 0000000000..8644412f60 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/floattable-nested.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/fly_fieldmark.fodt b/sw/qa/extras/ooxmlexport/data/fly_fieldmark.fodt new file mode 100644 index 0000000000..af1ae9a862 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/fly_fieldmark.fodt @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foobar + + + diff --git a/sw/qa/extras/ooxmlexport/data/font-name-is-empty.docx b/sw/qa/extras/ooxmlexport/data/font-name-is-empty.docx new file mode 100644 index 0000000000..5ee8cad1ac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/font-name-is-empty.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/footer-body-distance.docx b/sw/qa/extras/ooxmlexport/data/footer-body-distance.docx new file mode 100644 index 0000000000..0244d76c75 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/footer-body-distance.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/footer-contain-hyperlink.docx b/sw/qa/extras/ooxmlexport/data/footer-contain-hyperlink.docx new file mode 100644 index 0000000000..42c68d5e1f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/footer-contain-hyperlink.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/footer-margin-lost.docx b/sw/qa/extras/ooxmlexport/data/footer-margin-lost.docx new file mode 100644 index 0000000000..d6a9d7bd8d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/footer-margin-lost.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/footnote.docx b/sw/qa/extras/ooxmlexport/data/footnote.docx new file mode 100644 index 0000000000..f5c94bd270 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/footnote.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/footnotesep.fodt b/sw/qa/extras/ooxmlexport/data/footnotesep.fodt new file mode 100644 index 0000000000..f786580bb2 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/footnotesep.fodt @@ -0,0 +1,86 @@ + + + + 2020-02-06T14:04:13.1522835722020-02-06T14:08:19.939509466PT4M8S1LibreOfficeDev/7.0.0.0.alpha0$Linux_X86_64 LibreOffice_project/d2eff4b08869dd15b025c5801896e0332b14ba59 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + foo + 2 + bar + + + diff --git a/sw/qa/extras/ooxmlexport/data/frame-wrap-auto.docx b/sw/qa/extras/ooxmlexport/data/frame-wrap-auto.docx new file mode 100644 index 0000000000..6ad7fe0594 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/frame-wrap-auto.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/frame.fodt b/sw/qa/extras/ooxmlexport/data/frame.fodt new file mode 100644 index 0000000000..c474b8de5e --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/frame.fodt @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + opaque + + + + solid + + + + transparent + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/frame_size_export.docx b/sw/qa/extras/ooxmlexport/data/frame_size_export.docx new file mode 100644 index 0000000000..86147f3110 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/frame_size_export.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/glossaryWithEmail.docx b/sw/qa/extras/ooxmlexport/data/glossaryWithEmail.docx new file mode 100644 index 0000000000..5ec375adf3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/glossaryWithEmail.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/grabbag.docx b/sw/qa/extras/ooxmlexport/data/grabbag.docx new file mode 100644 index 0000000000..0aca64d6ee Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/grabbag.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/gradient-fill-preservation.docx b/sw/qa/extras/ooxmlexport/data/gradient-fill-preservation.docx new file mode 100644 index 0000000000..c9abc10d29 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/gradient-fill-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/graphic-object-fliph.docx b/sw/qa/extras/ooxmlexport/data/graphic-object-fliph.docx new file mode 100644 index 0000000000..2f95a2b858 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/graphic-object-fliph.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/gridbefore.docx b/sw/qa/extras/ooxmlexport/data/gridbefore.docx new file mode 100644 index 0000000000..571fb48eaa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/gridbefore.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/grouped_link.docx b/sw/qa/extras/ooxmlexport/data/grouped_link.docx new file mode 100644 index 0000000000..8c5657b708 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/grouped_link.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/groupshape-picture.docx b/sw/qa/extras/ooxmlexport/data/groupshape-picture.docx new file mode 100644 index 0000000000..4ecce56cfa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/groupshape-picture.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/groupshape-rotation.docx b/sw/qa/extras/ooxmlexport/data/groupshape-rotation.docx new file mode 100644 index 0000000000..d63b5d0734 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/groupshape-rotation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/groupshape-smarttag.docx b/sw/qa/extras/ooxmlexport/data/groupshape-smarttag.docx new file mode 100644 index 0000000000..6fc1cb2e69 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/groupshape-smarttag.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/groupshape-textbox.docx b/sw/qa/extras/ooxmlexport/data/groupshape-textbox.docx new file mode 100644 index 0000000000..fca71bfcf9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/groupshape-textbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/groupshape-theme-font.docx b/sw/qa/extras/ooxmlexport/data/groupshape-theme-font.docx new file mode 100644 index 0000000000..75011d7e5c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/groupshape-theme-font.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/groupshape-trackedchanges.docx b/sw/qa/extras/ooxmlexport/data/groupshape-trackedchanges.docx new file mode 100644 index 0000000000..116721f39e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/groupshape-trackedchanges.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/gutter-left.docx b/sw/qa/extras/ooxmlexport/data/gutter-left.docx new file mode 100644 index 0000000000..4dc1cbf615 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/gutter-left.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/gutter-top.docx b/sw/qa/extras/ooxmlexport/data/gutter-top.docx new file mode 100644 index 0000000000..d48cb28462 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/gutter-top.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/header-border.docx b/sw/qa/extras/ooxmlexport/data/header-border.docx new file mode 100644 index 0000000000..18ee9f52ad Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/header-border.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/hello.docm b/sw/qa/extras/ooxmlexport/data/hello.docm new file mode 100644 index 0000000000..a00aa58e7b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/hello.docm differ diff --git a/sw/qa/extras/ooxmlexport/data/hello.docx b/sw/qa/extras/ooxmlexport/data/hello.docx new file mode 100644 index 0000000000..d5d8d43ebd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/hello.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/hidemark.docx b/sw/qa/extras/ooxmlexport/data/hidemark.docx new file mode 100644 index 0000000000..4a273d6039 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/hidemark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/hyperlink-field.odt b/sw/qa/extras/ooxmlexport/data/hyperlink-field.odt new file mode 100644 index 0000000000..0c265cf718 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/hyperlink-field.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/hyperlink.docx b/sw/qa/extras/ooxmlexport/data/hyperlink.docx new file mode 100644 index 0000000000..5f5289790c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/hyperlink.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/hyperlinkshape.docx b/sw/qa/extras/ooxmlexport/data/hyperlinkshape.docx new file mode 100644 index 0000000000..3bf4f8c5c4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/hyperlinkshape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/hyphenation.odt b/sw/qa/extras/ooxmlexport/data/hyphenation.odt new file mode 100644 index 0000000000..13c1afaaa5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/hyphenation.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/i120928.docx b/sw/qa/extras/ooxmlexport/data/i120928.docx new file mode 100644 index 0000000000..ce78653e98 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/i120928.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/i124106.docx b/sw/qa/extras/ooxmlexport/data/i124106.docx new file mode 100644 index 0000000000..de1d542936 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/i124106.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/image-comment-at-char.docx b/sw/qa/extras/ooxmlexport/data/image-comment-at-char.docx new file mode 100644 index 0000000000..677464de49 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/image-comment-at-char.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/image-noborder.docx b/sw/qa/extras/ooxmlexport/data/image-noborder.docx new file mode 100644 index 0000000000..7e0fc90d23 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/image-noborder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/image_data.docx b/sw/qa/extras/ooxmlexport/data/image_data.docx new file mode 100644 index 0000000000..a2f89b146c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/image_data.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/image_through_shape.docx b/sw/qa/extras/ooxmlexport/data/image_through_shape.docx new file mode 100644 index 0000000000..dd90f9d9bf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/image_through_shape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/imgshadow.docx b/sw/qa/extras/ooxmlexport/data/imgshadow.docx new file mode 100644 index 0000000000..efe0e95960 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/imgshadow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/indentation.docx b/sw/qa/extras/ooxmlexport/data/indentation.docx new file mode 100644 index 0000000000..cf57aaf541 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/indentation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/indents.docx b/sw/qa/extras/ooxmlexport/data/indents.docx new file mode 100644 index 0000000000..b16736791c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/indents.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/inheritFirstHeader.docx b/sw/qa/extras/ooxmlexport/data/inheritFirstHeader.docx new file mode 100644 index 0000000000..e3d7d20a2d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/inheritFirstHeader.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/inline-groupshape.docx b/sw/qa/extras/ooxmlexport/data/inline-groupshape.docx new file mode 100644 index 0000000000..def5a05b40 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/inline-groupshape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/inline-sdt-header.docx b/sw/qa/extras/ooxmlexport/data/inline-sdt-header.docx new file mode 100644 index 0000000000..0a6009c2cd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/inline-sdt-header.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/internal_hyperlink_frame.odt b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_frame.odt new file mode 100644 index 0000000000..2497d5926a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_frame.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/internal_hyperlink_ole.odt b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_ole.odt new file mode 100644 index 0000000000..844cf1be65 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_ole.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/internal_hyperlink_region.odt b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_region.odt new file mode 100644 index 0000000000..abec2c5a8f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_region.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/internal_hyperlink_table.odt b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_table.odt new file mode 100644 index 0000000000..f3144a30e5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/internal_hyperlink_table.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/invalid_date_form_field.docx b/sw/qa/extras/ooxmlexport/data/invalid_date_form_field.docx new file mode 100644 index 0000000000..9dc24e768b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/invalid_date_form_field.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/kde216114-1.odt b/sw/qa/extras/ooxmlexport/data/kde216114-1.odt new file mode 100644 index 0000000000..536da7253f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/kde216114-1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/kde302504-1.odt b/sw/qa/extras/ooxmlexport/data/kde302504-1.odt new file mode 100644 index 0000000000..d0b7c6017d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/kde302504-1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/kern.docx b/sw/qa/extras/ooxmlexport/data/kern.docx new file mode 100644 index 0000000000..b66130d38d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/kern.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/large-twips.docx b/sw/qa/extras/ooxmlexport/data/large-twips.docx new file mode 100644 index 0000000000..6e9d82dfab Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/large-twips.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/lastEmptyLineWithDirectFormatting.docx b/sw/qa/extras/ooxmlexport/data/lastEmptyLineWithDirectFormatting.docx new file mode 100644 index 0000000000..5cfb4fcce1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/lastEmptyLineWithDirectFormatting.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/layout-flow-alt-alone.docx b/sw/qa/extras/ooxmlexport/data/layout-flow-alt-alone.docx new file mode 100644 index 0000000000..59c2db23d5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/layout-flow-alt-alone.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/libreoffice.png b/sw/qa/extras/ooxmlexport/data/libreoffice.png new file mode 100644 index 0000000000..437f613c17 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/libreoffice.png differ diff --git a/sw/qa/extras/ooxmlexport/data/listWithLgl.docx b/sw/qa/extras/ooxmlexport/data/listWithLgl.docx new file mode 100644 index 0000000000..3bc5c32d2d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/listWithLgl.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/list_notcounted_indent.fodt b/sw/qa/extras/ooxmlexport/data/list_notcounted_indent.fodt new file mode 100644 index 0000000000..41a1f7d17a --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/list_notcounted_indent.fodt @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Foo + Blah blah blah + + Etc + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/longBookmarkName.fodt b/sw/qa/extras/ooxmlexport/data/longBookmarkName.fodt new file mode 100644 index 0000000000..8b09760fcb --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/longBookmarkName.fodt @@ -0,0 +1,13 @@ + + + + + + This is a hyperlink to the first target paragraph below + This is a hyperlink to the second target paragraph below + + The first target paragraph with a bookmark with a very long name + The second target paragraph with a bookmark with a very long name + + + diff --git a/sw/qa/extras/ooxmlexport/data/lorem_hyperlink.fodt b/sw/qa/extras/ooxmlexport/data/lorem_hyperlink.fodt new file mode 100644 index 0000000000..485f87f130 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/lorem_hyperlink.fodt @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lorem + 1 + + ipsum + + + \ No newline at end of file diff --git a/sw/qa/extras/ooxmlexport/data/lvlPicBulletId.docx b/sw/qa/extras/ooxmlexport/data/lvlPicBulletId.docx new file mode 100644 index 0000000000..28e656bdd4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/lvlPicBulletId.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/mailmerge.docx b/sw/qa/extras/ooxmlexport/data/mailmerge.docx new file mode 100644 index 0000000000..7e209a1b4d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/mailmerge.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/margins_from_style.docx b/sw/qa/extras/ooxmlexport/data/margins_from_style.docx new file mode 100644 index 0000000000..721982458e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/margins_from_style.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-accents.docx b/sw/qa/extras/ooxmlexport/data/math-accents.docx new file mode 100644 index 0000000000..b623cb556d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-accents.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-d.docx b/sw/qa/extras/ooxmlexport/data/math-d.docx new file mode 100644 index 0000000000..a18afdd810 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-d.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-escape.docx b/sw/qa/extras/ooxmlexport/data/math-escape.docx new file mode 100644 index 0000000000..e935a83f57 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-escape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-escaping.docx b/sw/qa/extras/ooxmlexport/data/math-escaping.docx new file mode 100644 index 0000000000..d51c47552e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-escaping.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-lim.docx b/sw/qa/extras/ooxmlexport/data/math-lim.docx new file mode 100644 index 0000000000..6adb548ab6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-lim.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-literal.docx b/sw/qa/extras/ooxmlexport/data/math-literal.docx new file mode 100644 index 0000000000..b62bd23513 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-literal.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-matrix.docx b/sw/qa/extras/ooxmlexport/data/math-matrix.docx new file mode 100644 index 0000000000..d6b5b1871a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-matrix.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-mso2k7.docx b/sw/qa/extras/ooxmlexport/data/math-mso2k7.docx new file mode 100644 index 0000000000..b6b16ef7cb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-mso2k7.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-nary.docx b/sw/qa/extras/ooxmlexport/data/math-nary.docx new file mode 100644 index 0000000000..f3bb781d6e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-nary.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-overbrace_underbrace.docx b/sw/qa/extras/ooxmlexport/data/math-overbrace_underbrace.docx new file mode 100644 index 0000000000..e4119f66f7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-overbrace_underbrace.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-overstrike.docx b/sw/qa/extras/ooxmlexport/data/math-overstrike.docx new file mode 100644 index 0000000000..9809edc8ef Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-overstrike.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-placeholders.docx b/sw/qa/extras/ooxmlexport/data/math-placeholders.docx new file mode 100644 index 0000000000..1c32c048f0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-placeholders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-rad.docx b/sw/qa/extras/ooxmlexport/data/math-rad.docx new file mode 100644 index 0000000000..39194dcca2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-rad.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-subscripts.docx b/sw/qa/extras/ooxmlexport/data/math-subscripts.docx new file mode 100644 index 0000000000..038925f639 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-subscripts.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/math-vertical_stacks.docx b/sw/qa/extras/ooxmlexport/data/math-vertical_stacks.docx new file mode 100644 index 0000000000..50dfab0ecb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/math-vertical_stacks.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/mathtype.docx b/sw/qa/extras/ooxmlexport/data/mathtype.docx new file mode 100644 index 0000000000..bf60f43b25 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/mathtype.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/mce-nested.docx b/sw/qa/extras/ooxmlexport/data/mce-nested.docx new file mode 100644 index 0000000000..907ac080c1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/mce-nested.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/mce-wpg.docx b/sw/qa/extras/ooxmlexport/data/mce-wpg.docx new file mode 100644 index 0000000000..bd0d846813 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/mce-wpg.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/mce.docx b/sw/qa/extras/ooxmlexport/data/mce.docx new file mode 100644 index 0000000000..d4790de411 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/mce.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/missing-path.docx b/sw/qa/extras/ooxmlexport/data/missing-path.docx new file mode 100644 index 0000000000..8d75e9f630 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/missing-path.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/missing_newline.odt b/sw/qa/extras/ooxmlexport/data/missing_newline.odt new file mode 100644 index 0000000000..b0f10ade81 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/missing_newline.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/mso-spt180.docx b/sw/qa/extras/ooxmlexport/data/mso-spt180.docx new file mode 100644 index 0000000000..bf3a801a96 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/mso-spt180.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/msobrightnesscontrast.docx b/sw/qa/extras/ooxmlexport/data/msobrightnesscontrast.docx new file mode 100644 index 0000000000..132f23575b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/msobrightnesscontrast.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/multi-column-line-separator-SAVED.docx b/sw/qa/extras/ooxmlexport/data/multi-column-line-separator-SAVED.docx new file mode 100644 index 0000000000..96458833b2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/multi-column-line-separator-SAVED.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/multi-column-separator-with-line.docx b/sw/qa/extras/ooxmlexport/data/multi-column-separator-with-line.docx new file mode 100644 index 0000000000..c19ed697b5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/multi-column-separator-with-line.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/multi-page-toc.docx b/sw/qa/extras/ooxmlexport/data/multi-page-toc.docx new file mode 100644 index 0000000000..5b5b5949d6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/multi-page-toc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/multi_space_url.fodt b/sw/qa/extras/ooxmlexport/data/multi_space_url.fodt new file mode 100644 index 0000000000..3a96582aa7 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/multi_space_url.fodt @@ -0,0 +1,9 @@ + + + + + + A sample hyperlink + + + \ No newline at end of file diff --git a/sw/qa/extras/ooxmlexport/data/n592908-frame.docx b/sw/qa/extras/ooxmlexport/data/n592908-frame.docx new file mode 100644 index 0000000000..ff59cacbad Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n592908-frame.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n592908-picture.docx b/sw/qa/extras/ooxmlexport/data/n592908-picture.docx new file mode 100644 index 0000000000..2766d3691c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n592908-picture.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n652364.docx b/sw/qa/extras/ooxmlexport/data/n652364.docx new file mode 100644 index 0000000000..0845509e84 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n652364.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n693238.docx b/sw/qa/extras/ooxmlexport/data/n693238.docx new file mode 100644 index 0000000000..5bcda0fff6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n693238.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n705956-1.docx b/sw/qa/extras/ooxmlexport/data/n705956-1.docx new file mode 100644 index 0000000000..edff3bac41 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n705956-1.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n705956-2.docx b/sw/qa/extras/ooxmlexport/data/n705956-2.docx new file mode 100644 index 0000000000..138818523a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n705956-2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n747461.docx b/sw/qa/extras/ooxmlexport/data/n747461.docx new file mode 100644 index 0000000000..1064e5db06 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n747461.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n750255.docx b/sw/qa/extras/ooxmlexport/data/n750255.docx new file mode 100644 index 0000000000..a0c7370022 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n750255.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n751054.docx b/sw/qa/extras/ooxmlexport/data/n751054.docx new file mode 100644 index 0000000000..49d7d6af9c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n751054.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n751117.docx b/sw/qa/extras/ooxmlexport/data/n751117.docx new file mode 100644 index 0000000000..17cc9c53d1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n751117.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n764005.docx b/sw/qa/extras/ooxmlexport/data/n764005.docx new file mode 100644 index 0000000000..1c0dd9d077 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n764005.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n766481.docx b/sw/qa/extras/ooxmlexport/data/n766481.docx new file mode 100644 index 0000000000..e1521ec82f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n766481.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n766487.docx b/sw/qa/extras/ooxmlexport/data/n766487.docx new file mode 100644 index 0000000000..85eda0e7e3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n766487.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n775906.docx b/sw/qa/extras/ooxmlexport/data/n775906.docx new file mode 100644 index 0000000000..6b6dd1a6b4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n775906.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n777337.docx b/sw/qa/extras/ooxmlexport/data/n777337.docx new file mode 100644 index 0000000000..8bb377dcf6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n777337.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n778828.docx b/sw/qa/extras/ooxmlexport/data/n778828.docx new file mode 100644 index 0000000000..ad2e22d17f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n778828.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n778836.docx b/sw/qa/extras/ooxmlexport/data/n778836.docx new file mode 100644 index 0000000000..ccd89e85b4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n778836.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n779630.docx b/sw/qa/extras/ooxmlexport/data/n779630.docx new file mode 100644 index 0000000000..97812d66cf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n779630.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n779642.docx b/sw/qa/extras/ooxmlexport/data/n779642.docx new file mode 100644 index 0000000000..2fe9a17668 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n779642.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n779834.docx b/sw/qa/extras/ooxmlexport/data/n779834.docx new file mode 100644 index 0000000000..24b6db1a44 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n779834.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n779941.docx b/sw/qa/extras/ooxmlexport/data/n779941.docx new file mode 100644 index 0000000000..9889d81e23 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n779941.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n780563.docx b/sw/qa/extras/ooxmlexport/data/n780563.docx new file mode 100644 index 0000000000..508dc7474b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n780563.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n780843.docx b/sw/qa/extras/ooxmlexport/data/n780843.docx new file mode 100644 index 0000000000..9b92f79aaa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n780843.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n780843b.docx b/sw/qa/extras/ooxmlexport/data/n780843b.docx new file mode 100644 index 0000000000..2ba9ab2c6f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n780843b.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n780853.docx b/sw/qa/extras/ooxmlexport/data/n780853.docx new file mode 100644 index 0000000000..fed8276fbb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n780853.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n782345.docx b/sw/qa/extras/ooxmlexport/data/n782345.docx new file mode 100644 index 0000000000..f25709fedf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n782345.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n783638.docx b/sw/qa/extras/ooxmlexport/data/n783638.docx new file mode 100644 index 0000000000..93b587b92e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n783638.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n785767.docx b/sw/qa/extras/ooxmlexport/data/n785767.docx new file mode 100644 index 0000000000..db356769bc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n785767.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n789482.docx b/sw/qa/extras/ooxmlexport/data/n789482.docx new file mode 100644 index 0000000000..493e8ee04b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n789482.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n792778.docx b/sw/qa/extras/ooxmlexport/data/n792778.docx new file mode 100644 index 0000000000..d9541d4ccf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n792778.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n793262.docx b/sw/qa/extras/ooxmlexport/data/n793262.docx new file mode 100644 index 0000000000..7f2d2e0a80 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n793262.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n793998.docx b/sw/qa/extras/ooxmlexport/data/n793998.docx new file mode 100644 index 0000000000..fc96e2e97f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n793998.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n816593.docx b/sw/qa/extras/ooxmlexport/data/n816593.docx new file mode 100644 index 0000000000..7d784e69d4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n816593.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n820509.docx b/sw/qa/extras/ooxmlexport/data/n820509.docx new file mode 100644 index 0000000000..bfaea90756 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n820509.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/n822175.odt b/sw/qa/extras/ooxmlexport/data/n822175.odt new file mode 100644 index 0000000000..d49a59194f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n822175.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/n830205.docx b/sw/qa/extras/ooxmlexport/data/n830205.docx new file mode 100644 index 0000000000..89cf1d8434 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/n830205.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/negative-cell-margin-twips.docx b/sw/qa/extras/ooxmlexport/data/negative-cell-margin-twips.docx new file mode 100644 index 0000000000..3ae73db5c8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/negative-cell-margin-twips.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/nested-text-frames.odt b/sw/qa/extras/ooxmlexport/data/nested-text-frames.odt new file mode 100644 index 0000000000..d2106f9800 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/nested-text-frames.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/nestedAlternateContent.docx b/sw/qa/extras/ooxmlexport/data/nestedAlternateContent.docx new file mode 100644 index 0000000000..5b6b03c1ac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/nestedAlternateContent.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/no-numlevel-but-indented.odt b/sw/qa/extras/ooxmlexport/data/no-numlevel-but-indented.odt new file mode 100644 index 0000000000..e435acdad3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/no-numlevel-but-indented.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/noDefault.docx b/sw/qa/extras/ooxmlexport/data/noDefault.docx new file mode 100644 index 0000000000..56bc266911 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/noDefault.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/non_ascii_link.docx b/sw/qa/extras/ooxmlexport/data/non_ascii_link.docx new file mode 100644 index 0000000000..345a55b5cf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/non_ascii_link.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/nonbmpchar.docx b/sw/qa/extras/ooxmlexport/data/nonbmpchar.docx new file mode 100644 index 0000000000..a6b5d416c1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/nonbmpchar.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/num-override-lvltext.docx b/sw/qa/extras/ooxmlexport/data/num-override-lvltext.docx new file mode 100644 index 0000000000..fe3142d54a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/num-override-lvltext.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/num-override-start.docx b/sw/qa/extras/ooxmlexport/data/num-override-start.docx new file mode 100644 index 0000000000..b57a02cde3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/num-override-start.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/num-parent-style.docx b/sw/qa/extras/ooxmlexport/data/num-parent-style.docx new file mode 100644 index 0000000000..4b8c657afa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/num-parent-style.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/number-portion-format.odt b/sw/qa/extras/ooxmlexport/data/number-portion-format.odt new file mode 100644 index 0000000000..66f3b175b5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/number-portion-format.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/numbering-font.docx b/sw/qa/extras/ooxmlexport/data/numbering-font.docx new file mode 100644 index 0000000000..ccbbd9ed8d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/numbering-font.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/numbering1.docx b/sw/qa/extras/ooxmlexport/data/numbering1.docx new file mode 100644 index 0000000000..55b4af3e85 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/numbering1.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/numlist-zhcn.odt b/sw/qa/extras/ooxmlexport/data/numlist-zhcn.odt new file mode 100644 index 0000000000..0ced2b63a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/numlist-zhcn.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/numlist-zhtw.odt b/sw/qa/extras/ooxmlexport/data/numlist-zhtw.odt new file mode 100644 index 0000000000..62a729d51a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/numlist-zhtw.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/object_cross_reference.odt b/sw/qa/extras/ooxmlexport/data/object_cross_reference.odt new file mode 100644 index 0000000000..31fdb2b01d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/object_cross_reference.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo106020-1.odt b/sw/qa/extras/ooxmlexport/data/ooo106020-1.odt new file mode 100644 index 0000000000..9cc774b174 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo106020-1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo30436-1-minimized.sxw b/sw/qa/extras/ooxmlexport/data/ooo30436-1-minimized.sxw new file mode 100644 index 0000000000..140d6b23ea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo30436-1-minimized.sxw differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo34469-1.odt b/sw/qa/extras/ooxmlexport/data/ooo34469-1.odt new file mode 100644 index 0000000000..7cf031fb2f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo34469-1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo39250-1-min.rtf b/sw/qa/extras/ooxmlexport/data/ooo39250-1-min.rtf new file mode 100644 index 0000000000..df1467e4fe --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/ooo39250-1-min.rtf @@ -0,0 +1,42 @@ +{\rtf1\ansi\ansicpg1250\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1060\deflangfe1060{\fonttbl{\f0\froman\fcharset238\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\f1\fswiss\fcharset238\fprq2{\*\panose 020b0604020202020204}Arial;}{\f40\froman\fcharset0\fprq2 Times New Roman;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;} +{\f42\froman\fcharset162\fprq2 Times New Roman Tur;}{\f43\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;} +{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f50\fswiss\fcharset0\fprq2 Arial;}{\f49\fswiss\fcharset204\fprq2 Arial Cyr;}{\f51\fswiss\fcharset161\fprq2 Arial Greek;}{\f52\fswiss\fcharset162\fprq2 Arial Tur;} +{\f53\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f54\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f55\fswiss\fcharset186\fprq2 Arial Baltic;}{\f56\fswiss\fcharset163\fprq2 Arial (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 \snext0 Normal;}{\*\cs10 \additive +\ssemihidden Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid3551688\rsid4459474} +{\*\generator Microsoft Word 11.0.6359;}{\info{\author robi01}{\doccomm Produced by: PsQRFilters V2.11 for QuickReport (www.pragnaan.com)}{\operator robi01}{\creatim\yr2004\mo12\dy16\hr12\min51}{\revtim\yr2004\mo12\dy16\hr12\min51}{\version2}{\edmins1} +{\nofpages1}{\nofwords256}{\nofchars1465}{\nofcharsws1718}{\vern24703}}\paperw11906\paperh16838\margl567\margr567\margt283\margb283 \widowctrl\ftnbj\aenddoc\hyphhotz425\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120 +\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot3551688 \fet0\sectd \linex0\headery0\footery0\colsx708\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}} +{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}} +{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9 +\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 {\lang1024\langfe1024\noproof\insrsid3551688 +} +{\f1\insrsid3551688 \par } + +\pard \ql \li0\ri0\nowidctlpar\pvpg\phpg\posx702\posy11927\absw1095\faauto\rin0\lin0\itap0 {\f1\fs16\cf1\insrsid3551688 +\par } +\pard \ql \li0\ri0\nowidctlpar\pvpg\phpg\posx1782\posy11927\absw1695\faauto\rin0\lin0\itap0 {\lang1024\langfe1024\noproof\insrsid3551688 +} + +\pard \qr \li0\ri0\nowidctlpar\pvpg\phpg\posx7347\posy11492\absw1785\faauto\rin0\lin0\itap0 {\b\f1\fs16\cf1\insrsid3551688 Za pla\'e8ilo: } + +{\lang1024\langfe1024\noproof\insrsid3551688 +{\shp{\*\shpinst\shpleft687\shptop12452\shpright11248\shpbottom13593\shpfhdr0\shpbxpage\shpbxignore\shpbypage\shpbyignore\shpwr3\shpwrk0\shpfblwtxt1\shpz7\shplid1033{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn lTxid}{\sv 65536}}{\sp{\sn dxTextLeft}{\sv 0}}{\sp{\sn dyTextTop}{\sv 0}}{\sp{\sn dxTextRight}{\sv 0}}{\sp{\sn dyTextBottom}{\sv 0}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn lineWidth}{\sv 0}}{\sp{\sn fLine}{\sv 0}}{\sp{\sn fShadow}{\sv 0}} +{\sp{\sn posrelh}{\sv 1}}{\sp{\sn posrelv}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 0}}{\sp{\sn fBehindDocument}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 0}}{\shptxt \pard\plain \qc \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 +\fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 {\b\f1\fs16\expnd-1\expndtw-6\insrsid3551688 +\par +\par Pla\'e8ilo izvr\'9aite na transakcijski ra\'e8un NLB in se sklicujte na \'9atevilko predra\'e8una +\par Do popolnega pla\'e8ila ostaja predmet pogodbe last podjetja TI, d.o.o. }{\f1\fs16\expnd-1\expndtw-6\insrsid3551688 +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\f1\fs16\expnd-1\expndtw-6\insrsid3551688 +\par }{\f1\insrsid3551688 _}}}{\shprslt{\*\do\dobxpage\dobypage\dodhgt7\dptxbx\dptxlrtb{\dptxbxtext\pard\plain \qc \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 {\b\f1\fs16\expnd-1\expndtw-6\insrsid3551688 +\par +\par Pla\'e8ilo izvr\'9aite na transakcijski ra\'e8un NLB in se sklicujte na \'9atevilko predra\'e8una +\par Do popolnega pla\'e8ila ostaja predmet pogodbe last podjetja TI, d.o.o. }{\f1\fs16\expnd-1\expndtw-6\insrsid3551688 +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\f1\fs16\expnd-1\expndtw-6\insrsid3551688 +\par }{\f1\insrsid3551688 _}}\dpx687\dpy12452\dpxsize10561\dpysize1141\dpfillfgcr255\dpfillfgcg255\dpfillfgcb255\dpfillbgcr255\dpfillbgcg255\dpfillbgcb255\dpfillpat0\dplinehollow}}}} + +} diff --git a/sw/qa/extras/ooxmlexport/data/ooo39845-7.odt b/sw/qa/extras/ooxmlexport/data/ooo39845-7.odt new file mode 100644 index 0000000000..ee8d139359 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo39845-7.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo47778-3.odt b/sw/qa/extras/ooxmlexport/data/ooo47778-3.odt new file mode 100644 index 0000000000..69005b11e1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo47778-3.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo47778-4.odt b/sw/qa/extras/ooxmlexport/data/ooo47778-4.odt new file mode 100644 index 0000000000..ae6b56b8cd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo47778-4.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo67471-2.odt b/sw/qa/extras/ooxmlexport/data/ooo67471-2.odt new file mode 100644 index 0000000000..82daa57763 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo67471-2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo72950-1.odt b/sw/qa/extras/ooxmlexport/data/ooo72950-1.odt new file mode 100644 index 0000000000..df0ac91828 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo72950-1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooo96040-2.odt b/sw/qa/extras/ooxmlexport/data/ooo96040-2.odt new file mode 100644 index 0000000000..35a1858e53 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooo96040-2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/ooxml-triangle.docx b/sw/qa/extras/ooxmlexport/data/ooxml-triangle.docx new file mode 100644 index 0000000000..4279fbfb05 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/ooxml-triangle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/open-as-read-only.docx b/sw/qa/extras/ooxmlexport/data/open-as-read-only.docx new file mode 100644 index 0000000000..057c67ff6d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/open-as-read-only.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/outline-number-types.odt b/sw/qa/extras/ooxmlexport/data/outline-number-types.odt new file mode 100644 index 0000000000..2232ad64ce Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/outline-number-types.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/page-background.docx b/sw/qa/extras/ooxmlexport/data/page-background.docx new file mode 100644 index 0000000000..8c1f2ebdb2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/page-background.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/page-border-shadow.docx b/sw/qa/extras/ooxmlexport/data/page-border-shadow.docx new file mode 100644 index 0000000000..65a2273f6b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/page-border-shadow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/page-borders-export-case-2.docx b/sw/qa/extras/ooxmlexport/data/page-borders-export-case-2.docx new file mode 100644 index 0000000000..f06471ecb8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/page-borders-export-case-2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/page-break-before.docx b/sw/qa/extras/ooxmlexport/data/page-break-before.docx new file mode 100644 index 0000000000..99d8c3a5d4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/page-break-before.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/page-content-bottom.docx b/sw/qa/extras/ooxmlexport/data/page-content-bottom.docx new file mode 100644 index 0000000000..f955586f39 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/page-content-bottom.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/page-graphic-background.odt b/sw/qa/extras/ooxmlexport/data/page-graphic-background.odt new file mode 100644 index 0000000000..15050e6307 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/page-graphic-background.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/pageBreak_after.odt b/sw/qa/extras/ooxmlexport/data/pageBreak_after.odt new file mode 100644 index 0000000000..c3096b58a5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/pageBreak_after.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/pagerelsize.docx b/sw/qa/extras/ooxmlexport/data/pagerelsize.docx new file mode 100644 index 0000000000..3b6c1ff448 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/pagerelsize.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/para-adjust-distribute.docx b/sw/qa/extras/ooxmlexport/data/para-adjust-distribute.docx new file mode 100644 index 0000000000..5389a75370 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/para-adjust-distribute.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/para-auto-spacing.docx b/sw/qa/extras/ooxmlexport/data/para-auto-spacing.docx new file mode 100644 index 0000000000..3cc8bd6fbd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/para-auto-spacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/para-shading.docx b/sw/qa/extras/ooxmlexport/data/para-shading.docx new file mode 100644 index 0000000000..9c2af1ad5e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/para-shading.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/para-shadow.docx b/sw/qa/extras/ooxmlexport/data/para-shadow.docx new file mode 100644 index 0000000000..d35d5f958d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/para-shadow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/para-style-char-position.docx b/sw/qa/extras/ooxmlexport/data/para-style-char-position.docx new file mode 100644 index 0000000000..946ca0bf9c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/para-style-char-position.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/para-style-num-level.docx b/sw/qa/extras/ooxmlexport/data/para-style-num-level.docx new file mode 100644 index 0000000000..2de0c50db6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/para-style-num-level.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/paragraph-mark-nonempty.odt b/sw/qa/extras/ooxmlexport/data/paragraph-mark-nonempty.odt new file mode 100644 index 0000000000..b12cbf607d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/paragraph-mark-nonempty.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/paragraph-mark.docx b/sw/qa/extras/ooxmlexport/data/paragraph-mark.docx new file mode 100644 index 0000000000..4636e4d368 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/paragraph-mark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/paragraph-mark2.docx b/sw/qa/extras/ooxmlexport/data/paragraph-mark2.docx new file mode 100644 index 0000000000..a465813dc6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/paragraph-mark2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/paragraph-sdt.docx b/sw/qa/extras/ooxmlexport/data/paragraph-sdt.docx new file mode 100644 index 0000000000..c86f599ed7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/paragraph-sdt.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/paragraphWithComments.docx b/sw/qa/extras/ooxmlexport/data/paragraphWithComments.docx new file mode 100644 index 0000000000..84a6f20a13 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/paragraphWithComments.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/parasplit-on-section-border.odt b/sw/qa/extras/ooxmlexport/data/parasplit-on-section-border.odt new file mode 100644 index 0000000000..8a6e4aeb47 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/parasplit-on-section-border.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/picture-artistic-effects-preservation.docx b/sw/qa/extras/ooxmlexport/data/picture-artistic-effects-preservation.docx new file mode 100644 index 0000000000..85f31d8c32 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture-artistic-effects-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/picture-effects-preservation.docx b/sw/qa/extras/ooxmlexport/data/picture-effects-preservation.docx new file mode 100644 index 0000000000..d26def49f9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture-effects-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/picture-with-schemecolor.docx b/sw/qa/extras/ooxmlexport/data/picture-with-schemecolor.docx new file mode 100644 index 0000000000..bfee0e1415 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture-with-schemecolor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx b/sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx new file mode 100644 index 0000000000..f858a05ad8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture-wrap-polygon.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/pictureWatermark.docx b/sw/qa/extras/ooxmlexport/data/pictureWatermark.docx new file mode 100644 index 0000000000..b526ecf370 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/pictureWatermark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/picture_colormode_black_white.odt b/sw/qa/extras/ooxmlexport/data/picture_colormode_black_white.odt new file mode 100644 index 0000000000..b2166bdd36 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture_colormode_black_white.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/picture_colormode_grayscale.docx b/sw/qa/extras/ooxmlexport/data/picture_colormode_grayscale.docx new file mode 100644 index 0000000000..2bc6458eda Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture_colormode_grayscale.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/picture_colormode_watermark.odt b/sw/qa/extras/ooxmlexport/data/picture_colormode_watermark.odt new file mode 100644 index 0000000000..70dd5e9089 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/picture_colormode_watermark.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/plausable-border.docx b/sw/qa/extras/ooxmlexport/data/plausable-border.docx new file mode 100644 index 0000000000..c6f049fe2d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/plausable-border.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/position-and-rotation.docx b/sw/qa/extras/ooxmlexport/data/position-and-rotation.docx new file mode 100644 index 0000000000..d883ad32e7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/position-and-rotation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/preserve_Z_field_TOC.docx b/sw/qa/extras/ooxmlexport/data/preserve_Z_field_TOC.docx new file mode 100644 index 0000000000..63ae40287a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/preserve_Z_field_TOC.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/preset-shape.docx b/sw/qa/extras/ooxmlexport/data/preset-shape.docx new file mode 100644 index 0000000000..922b906e25 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/preset-shape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/protectedform.docx b/sw/qa/extras/ooxmlexport/data/protectedform.docx new file mode 100644 index 0000000000..a67d88006c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/protectedform.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/quicktables.docx b/sw/qa/extras/ooxmlexport/data/quicktables.docx new file mode 100644 index 0000000000..5060d3dbae Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/quicktables.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rel-size-round.docx b/sw/qa/extras/ooxmlexport/data/rel-size-round.docx new file mode 100644 index 0000000000..ccd076a15e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rel-size-round.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/relative-link.docx b/sw/qa/extras/ooxmlexport/data/relative-link.docx new file mode 100644 index 0000000000..c3688f3e87 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/relative-link.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/relorientation.docx b/sw/qa/extras/ooxmlexport/data/relorientation.docx new file mode 100644 index 0000000000..22a04538bd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/relorientation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rhbz1180114.docx b/sw/qa/extras/ooxmlexport/data/rhbz1180114.docx new file mode 100644 index 0000000000..23009ebbdc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rhbz1180114.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rhbz988516.docx b/sw/qa/extras/ooxmlexport/data/rhbz988516.docx new file mode 100644 index 0000000000..38e2dcff32 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rhbz988516.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rot180-flipv.docx b/sw/qa/extras/ooxmlexport/data/rot180-flipv.docx new file mode 100644 index 0000000000..2a8bb19675 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rot180-flipv.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rot270-flipv.docx b/sw/qa/extras/ooxmlexport/data/rot270-flipv.docx new file mode 100644 index 0000000000..0aa19e08a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rot270-flipv.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rot90-fliph.docx b/sw/qa/extras/ooxmlexport/data/rot90-fliph.docx new file mode 100644 index 0000000000..c2a916d809 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rot90-fliph.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rotated_shape.fodt b/sw/qa/extras/ooxmlexport/data/rotated_shape.fodt new file mode 100644 index 0000000000..fce84f93e9 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/rotated_shape.fodt @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Foo + + + iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAAXNSR0IArs4c6QAAAAZiS0dE + AP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJBhI0A6HXrrIAAABl + SURBVDjLY/z//z8DtQATMYokl7D8p4phMIOIMZCJFBcRMpCJVK/hM5CJnDDCJc9EbmBjU8dE + jkG41DPhM+h5zB9GfHx0fTgjAJtGfOIMDAwMLMQoItZAJgYqglHDhpNhjNQsaQHF4y3hS/bS + HgAAAABJRU5ErkJggg== + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/rprchange_closed.docx b/sw/qa/extras/ooxmlexport/data/rprchange_closed.docx new file mode 100644 index 0000000000..ff53871e91 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rprchange_closed.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rtl-gutter.docx b/sw/qa/extras/ooxmlexport/data/rtl-gutter.docx new file mode 100644 index 0000000000..d6b28e5cbc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/rtl-gutter.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/rubyhyperlink.fodt b/sw/qa/extras/ooxmlexport/data/rubyhyperlink.fodt new file mode 100644 index 0000000000..a201d7c342 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/rubyhyperlink.fodt @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + barquux + foobarquuxbaz + foobarquuxbaz + foobarquuxbaz + foobarquuxbaz + foobarquuxbaz + foobarquuxbaz + foobarquuxbaz + foobarquuxbaz + + + diff --git a/sw/qa/extras/ooxmlexport/data/sample.dotx b/sw/qa/extras/ooxmlexport/data/sample.dotx new file mode 100644 index 0000000000..c0f4062c1e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sample.dotx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-2-para.docx b/sw/qa/extras/ooxmlexport/data/sdt-2-para.docx new file mode 100644 index 0000000000..b6d6565d65 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-2-para.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-2-run.docx b/sw/qa/extras/ooxmlexport/data/sdt-2-run.docx new file mode 100644 index 0000000000..6063ebc41c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-2-run.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-alias.docx b/sw/qa/extras/ooxmlexport/data/sdt-alias.docx new file mode 100644 index 0000000000..f46ef693a3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-alias.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-before-field.docx b/sw/qa/extras/ooxmlexport/data/sdt-before-field.docx new file mode 100644 index 0000000000..a83a76885c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-before-field.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx b/sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx new file mode 100644 index 0000000000..cd97f934a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-citation-run.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx b/sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx new file mode 100644 index 0000000000..96d25ff750 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-date-duplicate.docx b/sw/qa/extras/ooxmlexport/data/sdt-date-duplicate.docx new file mode 100644 index 0000000000..038ab111da Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-date-duplicate.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-duplicated-id.docx b/sw/qa/extras/ooxmlexport/data/sdt-duplicated-id.docx new file mode 100644 index 0000000000..d21894df30 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-duplicated-id.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-header.docx b/sw/qa/extras/ooxmlexport/data/sdt-header.docx new file mode 100644 index 0000000000..6a4bdfb2d0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-header.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-ignored-footer.docx b/sw/qa/extras/ooxmlexport/data/sdt-ignored-footer.docx new file mode 100644 index 0000000000..8330291af8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-ignored-footer.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt-run-picture.docx b/sw/qa/extras/ooxmlexport/data/sdt-run-picture.docx new file mode 100644 index 0000000000..fa2d57c2b3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-run-picture.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sdt_after_section_break.docx b/sw/qa/extras/ooxmlexport/data/sdt_after_section_break.docx new file mode 100644 index 0000000000..d753f5da30 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt_after_section_break.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/section_break_after_table.docx b/sw/qa/extras/ooxmlexport/data/section_break_after_table.docx new file mode 100644 index 0000000000..9f8e4c687b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/section_break_after_table.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/section_break_numbering.docx b/sw/qa/extras/ooxmlexport/data/section_break_numbering.docx new file mode 100644 index 0000000000..8b5378a771 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/section_break_numbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/sectionprot.odt b/sw/qa/extras/ooxmlexport/data/sectionprot.odt new file mode 100644 index 0000000000..1effc19516 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sectionprot.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/sectionprot2.odt b/sw/qa/extras/ooxmlexport/data/sectionprot2.odt new file mode 100644 index 0000000000..8f4a283f84 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sectionprot2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/shape-3d-effect-preservation.docx b/sw/qa/extras/ooxmlexport/data/shape-3d-effect-preservation.docx new file mode 100644 index 0000000000..1e361bd4e4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/shape-3d-effect-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/shape-atpage-in-table.fodt b/sw/qa/extras/ooxmlexport/data/shape-atpage-in-table.fodt new file mode 100644 index 0000000000..42c9c77905 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/shape-atpage-in-table.fodt @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ABC DEF GHI + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx b/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx new file mode 100644 index 0000000000..f2b91ea45f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/shape-effect-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/shape-in-floattable.docx b/sw/qa/extras/ooxmlexport/data/shape-in-floattable.docx new file mode 100644 index 0000000000..46af861822 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/shape-in-floattable.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/shape-theme-preservation.docx b/sw/qa/extras/ooxmlexport/data/shape-theme-preservation.docx new file mode 100644 index 0000000000..134f629fb6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/shape-theme-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/signature-line-all-props-set.docx b/sw/qa/extras/ooxmlexport/data/signature-line-all-props-set.docx new file mode 100644 index 0000000000..2f8401bf5c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/signature-line-all-props-set.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/simple-sdts.docx b/sw/qa/extras/ooxmlexport/data/simple-sdts.docx new file mode 100644 index 0000000000..95c5d00a6a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/simple-sdts.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/smartart.docx b/sw/qa/extras/ooxmlexport/data/smartart.docx new file mode 100644 index 0000000000..7a553f4251 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/smartart.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/strict-smartart.docx b/sw/qa/extras/ooxmlexport/data/strict-smartart.docx new file mode 100644 index 0000000000..bab7c16bce Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/strict-smartart.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/strict.docx b/sw/qa/extras/ooxmlexport/data/strict.docx new file mode 100644 index 0000000000..b46ce94b34 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/strict.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/style-inheritance.docx b/sw/qa/extras/ooxmlexport/data/style-inheritance.docx new file mode 100644 index 0000000000..65ca38aedd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/style-inheritance.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/symbol_chicago_list.docx b/sw/qa/extras/ooxmlexport/data/symbol_chicago_list.docx new file mode 100644 index 0000000000..5d27260ca8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/symbol_chicago_list.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-alignment.docx b/sw/qa/extras/ooxmlexport/data/table-alignment.docx new file mode 100644 index 0000000000..e1efaaefd5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-alignment.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size.docx b/sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size.docx new file mode 100644 index 0000000000..557edcb3cb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size2.docx b/sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size2.docx new file mode 100644 index 0000000000..2125f09da7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-auto-column-fixed-size2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-auto-nested.docx b/sw/qa/extras/ooxmlexport/data/table-auto-nested.docx new file mode 100644 index 0000000000..85f47dbba0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-auto-nested.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-black_fill.docx b/sw/qa/extras/ooxmlexport/data/table-black_fill.docx new file mode 100644 index 0000000000..c9d4e22896 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-black_fill.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-borders.docx b/sw/qa/extras/ooxmlexport/data/table-borders.docx new file mode 100644 index 0000000000..a18a93e790 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-borders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-btlr-center.docx b/sw/qa/extras/ooxmlexport/data/table-btlr-center.docx new file mode 100644 index 0000000000..79cb53eed0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-btlr-center.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-cell-margin.docx b/sw/qa/extras/ooxmlexport/data/table-cell-margin.docx new file mode 100644 index 0000000000..f59a5da11a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-cell-margin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-floating-margins.docx b/sw/qa/extras/ooxmlexport/data/table-floating-margins.docx new file mode 100644 index 0000000000..81f6f6cf1f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-floating-margins.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-floating.docx b/sw/qa/extras/ooxmlexport/data/table-floating.docx new file mode 100644 index 0000000000..1e0cb30ece Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-floating.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-ltr.docx b/sw/qa/extras/ooxmlexport/data/table-ltr.docx new file mode 100644 index 0000000000..d627b81a31 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-ltr.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-pagebreak.docx b/sw/qa/extras/ooxmlexport/data/table-pagebreak.docx new file mode 100644 index 0000000000..06ecf9535a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-pagebreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-position-14.docx b/sw/qa/extras/ooxmlexport/data/table-position-14.docx new file mode 100644 index 0000000000..f59a5da11a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-position-14.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-position-15.docx b/sw/qa/extras/ooxmlexport/data/table-position-15.docx new file mode 100644 index 0000000000..91fbdbef00 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-position-15.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-row-data-displayed-twice.docx b/sw/qa/extras/ooxmlexport/data/table-row-data-displayed-twice.docx new file mode 100644 index 0000000000..00c63d8fce Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-row-data-displayed-twice.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-rtl.docx b/sw/qa/extras/ooxmlexport/data/table-rtl.docx new file mode 100644 index 0000000000..90fba0b927 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-rtl.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-start-2-sdt.docx b/sw/qa/extras/ooxmlexport/data/table-start-2-sdt.docx new file mode 100644 index 0000000000..d3bf3bc5d6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-start-2-sdt.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-style-border-export.docx b/sw/qa/extras/ooxmlexport/data/table-style-border-export.docx new file mode 100644 index 0000000000..eeb23ee84b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-style-border-export.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-style-border.docx b/sw/qa/extras/ooxmlexport/data/table-style-border.docx new file mode 100644 index 0000000000..ceb0bd8a0e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-style-border.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-style-cell-back-color.docx b/sw/qa/extras/ooxmlexport/data/table-style-cell-back-color.docx new file mode 100644 index 0000000000..f622b9d842 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-style-cell-back-color.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-style-conf-nested.docx b/sw/qa/extras/ooxmlexport/data/table-style-conf-nested.docx new file mode 100644 index 0000000000..e35612addc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-style-conf-nested.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-style-parprop.docx b/sw/qa/extras/ooxmlexport/data/table-style-parprop.docx new file mode 100644 index 0000000000..1c68c704e7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-style-parprop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-style-rPr-sz.docx b/sw/qa/extras/ooxmlexport/data/table-style-rPr-sz.docx new file mode 100644 index 0000000000..6b6f694247 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-style-rPr-sz.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table-theme-preservation.docx b/sw/qa/extras/ooxmlexport/data/table-theme-preservation.docx new file mode 100644 index 0000000000..ae4ede04b4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table-theme-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table.fodt b/sw/qa/extras/ooxmlexport/data/table.fodt new file mode 100644 index 0000000000..e8346ca421 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/table.fodt @@ -0,0 +1,70 @@ + + + + 2020-02-07T17:21:48.0944269292020-02-07T17:22:23.469846014PT37S1LibreOfficeDev/7.0.0.0.alpha0$Linux_X86_64 LibreOffice_project/d2eff4b08869dd15b025c5801896e0332b14ba59 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foo + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/table.odt b/sw/qa/extras/ooxmlexport/data/table.odt new file mode 100644 index 0000000000..25b2a5fea2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tableCurrupt.docx b/sw/qa/extras/ooxmlexport/data/tableCurrupt.docx new file mode 100644 index 0000000000..1deda7ddcb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tableCurrupt.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tablePreferredWidth.docx b/sw/qa/extras/ooxmlexport/data/tablePreferredWidth.docx new file mode 100644 index 0000000000..6546be9b63 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tablePreferredWidth.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table_atleast.docx b/sw/qa/extras/ooxmlexport/data/table_atleast.docx new file mode 100644 index 0000000000..ec751aa58a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table_atleast.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/table_cross_reference.odt b/sw/qa/extras/ooxmlexport/data/table_cross_reference.odt new file mode 100644 index 0000000000..bd9c840161 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table_cross_reference.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/table_cross_reference_custom_format.odt b/sw/qa/extras/ooxmlexport/data/table_cross_reference_custom_format.odt new file mode 100644 index 0000000000..cbf03d34ed Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table_cross_reference_custom_format.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/table_lineRule.docx b/sw/qa/extras/ooxmlexport/data/table_lineRule.docx new file mode 100644 index 0000000000..d1d47ff240 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/table_lineRule.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tableborder-finedash.docx b/sw/qa/extras/ooxmlexport/data/tableborder-finedash.docx new file mode 100644 index 0000000000..003167ac3a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tableborder-finedash.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tblppr-shape.docx b/sw/qa/extras/ooxmlexport/data/tblppr-shape.docx new file mode 100644 index 0000000000..470bce4247 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tblppr-shape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tblr-height.docx b/sw/qa/extras/ooxmlexport/data/tblr-height.docx new file mode 100644 index 0000000000..6a16c81dd5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tblr-height.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tbrl-frame-vml.docx b/sw/qa/extras/ooxmlexport/data/tbrl-frame-vml.docx new file mode 100644 index 0000000000..c697e5846c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tbrl-frame-vml.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tbrl-textbox.docx b/sw/qa/extras/ooxmlexport/data/tbrl-textbox.docx new file mode 100644 index 0000000000..bdfcc5fff1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tbrl-textbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf100075.docx b/sw/qa/extras/ooxmlexport/data/tdf100075.docx new file mode 100644 index 0000000000..6312050aaf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf100075.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf100581.odt b/sw/qa/extras/ooxmlexport/data/tdf100581.odt new file mode 100644 index 0000000000..f098385e3c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf100581.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf100751_arrowBothFlip.docx b/sw/qa/extras/ooxmlexport/data/tdf100751_arrowBothFlip.docx new file mode 100644 index 0000000000..8a57f69eae Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf100751_arrowBothFlip.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf101122_noFillForCustomShape.odt b/sw/qa/extras/ooxmlexport/data/tdf101122_noFillForCustomShape.odt new file mode 100644 index 0000000000..8cc2a13f85 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf101122_noFillForCustomShape.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf101589_dontSplitTable.odt b/sw/qa/extras/ooxmlexport/data/tdf101589_dontSplitTable.odt new file mode 100644 index 0000000000..4a05018823 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf101589_dontSplitTable.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf102466.docx b/sw/qa/extras/ooxmlexport/data/tdf102466.docx new file mode 100644 index 0000000000..68a88799ce Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf102466.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103001.docx b/sw/qa/extras/ooxmlexport/data/tdf103001.docx new file mode 100644 index 0000000000..332d415698 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103001.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103090.odt b/sw/qa/extras/ooxmlexport/data/tdf103090.odt new file mode 100644 index 0000000000..d264f255ab Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103090.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103389.docx b/sw/qa/extras/ooxmlexport/data/tdf103389.docx new file mode 100644 index 0000000000..0ef80e6a18 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103389.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103544.docx b/sw/qa/extras/ooxmlexport/data/tdf103544.docx new file mode 100644 index 0000000000..2e18f21213 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103544.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103573.docx b/sw/qa/extras/ooxmlexport/data/tdf103573.docx new file mode 100644 index 0000000000..34d7e3367d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103573.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103651.docx b/sw/qa/extras/ooxmlexport/data/tdf103651.docx new file mode 100644 index 0000000000..de4c2d6c34 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103651.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakB.docx b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakB.docx new file mode 100644 index 0000000000..a7b880d00e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakB.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakC.docx b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakC.docx new file mode 100644 index 0000000000..52767abb8c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakC.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakD.docx b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakD.docx new file mode 100644 index 0000000000..37c752499f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakD.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakE.docx b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakE.docx new file mode 100644 index 0000000000..ac3eb9f7c7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103975_notPageBreakE.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103976.docx b/sw/qa/extras/ooxmlexport/data/tdf103976.docx new file mode 100644 index 0000000000..2081fcf078 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103976.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf103982.docx b/sw/qa/extras/ooxmlexport/data/tdf103982.docx new file mode 100644 index 0000000000..13e645356b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf103982.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104061_tableSectionColumns.docx b/sw/qa/extras/ooxmlexport/data/tdf104061_tableSectionColumns.docx new file mode 100644 index 0000000000..b5d2a4fee9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104061_tableSectionColumns.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104115.docx b/sw/qa/extras/ooxmlexport/data/tdf104115.docx new file mode 100644 index 0000000000..9236f0e3a5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104115.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104150.docx b/sw/qa/extras/ooxmlexport/data/tdf104150.docx new file mode 100644 index 0000000000..9898846426 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104150.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104162.docx b/sw/qa/extras/ooxmlexport/data/tdf104162.docx new file mode 100644 index 0000000000..61b51c0077 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104162.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx new file mode 100644 index 0000000000..ef3d06533b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104348_contextMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104354-2.docx b/sw/qa/extras/ooxmlexport/data/tdf104354-2.docx new file mode 100644 index 0000000000..5b67e015fb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104354-2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104354.docx b/sw/qa/extras/ooxmlexport/data/tdf104354.docx new file mode 100644 index 0000000000..d8655f4e08 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104354.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104354_firstParaInSection.docx b/sw/qa/extras/ooxmlexport/data/tdf104354_firstParaInSection.docx new file mode 100644 index 0000000000..79ff44f256 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104354_firstParaInSection.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104394_lostTextbox.docx b/sw/qa/extras/ooxmlexport/data/tdf104394_lostTextbox.docx new file mode 100644 index 0000000000..472d0723a9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104394_lostTextbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104418.odt b/sw/qa/extras/ooxmlexport/data/tdf104418.odt new file mode 100644 index 0000000000..12627ea286 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104418.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104420_lostParagraph.docx b/sw/qa/extras/ooxmlexport/data/tdf104420_lostParagraph.docx new file mode 100644 index 0000000000..b5d9988336 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104420_lostParagraph.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104539.odt b/sw/qa/extras/ooxmlexport/data/tdf104539.odt new file mode 100644 index 0000000000..76be8af1f5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104539.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104565_ArrowPosition.docx b/sw/qa/extras/ooxmlexport/data/tdf104565_ArrowPosition.docx new file mode 100644 index 0000000000..514eeddbaf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104565_ArrowPosition.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104707_urlComment.odt b/sw/qa/extras/ooxmlexport/data/tdf104707_urlComment.odt new file mode 100644 index 0000000000..4c63093fb0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104707_urlComment.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104713_undefinedStyles.docx b/sw/qa/extras/ooxmlexport/data/tdf104713_undefinedStyles.docx new file mode 100644 index 0000000000..5114a06935 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104713_undefinedStyles.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104797.docx b/sw/qa/extras/ooxmlexport/data/tdf104797.docx new file mode 100644 index 0000000000..6e52190ce6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104797.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf104823.docx b/sw/qa/extras/ooxmlexport/data/tdf104823.docx new file mode 100644 index 0000000000..4a354b848e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf104823.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105035_framePrB.docx b/sw/qa/extras/ooxmlexport/data/tdf105035_framePrB.docx new file mode 100644 index 0000000000..fe813609fb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105035_framePrB.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105035_framePrC.docx b/sw/qa/extras/ooxmlexport/data/tdf105035_framePrC.docx new file mode 100644 index 0000000000..4954f8cc62 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105035_framePrC.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105095.docx b/sw/qa/extras/ooxmlexport/data/tdf105095.docx new file mode 100644 index 0000000000..0a6a7a2ac3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105095.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105215.docx b/sw/qa/extras/ooxmlexport/data/tdf105215.docx new file mode 100644 index 0000000000..e464d460b2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105215.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105444.docx b/sw/qa/extras/ooxmlexport/data/tdf105444.docx new file mode 100644 index 0000000000..a6e0ea8732 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105444.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105485.docx b/sw/qa/extras/ooxmlexport/data/tdf105485.docx new file mode 100644 index 0000000000..be8a10e41a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105485.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105490_negativeMargins.docx b/sw/qa/extras/ooxmlexport/data/tdf105490_negativeMargins.docx new file mode 100644 index 0000000000..6acb9f383d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105490_negativeMargins.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105688.docx b/sw/qa/extras/ooxmlexport/data/tdf105688.docx new file mode 100644 index 0000000000..55a2972d39 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105688.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf105875_VmlShapeRotationWithFlip.docx b/sw/qa/extras/ooxmlexport/data/tdf105875_VmlShapeRotationWithFlip.docx new file mode 100644 index 0000000000..e6512e075c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf105875_VmlShapeRotationWithFlip.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106001-2.odt b/sw/qa/extras/ooxmlexport/data/tdf106001-2.odt new file mode 100644 index 0000000000..36d2650f4c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106001-2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106001.docx b/sw/qa/extras/ooxmlexport/data/tdf106001.docx new file mode 100644 index 0000000000..efe4104cf8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106001.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106062_nonHangingFootnote.odt b/sw/qa/extras/ooxmlexport/data/tdf106062_nonHangingFootnote.odt new file mode 100644 index 0000000000..af5e225ea0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106062_nonHangingFootnote.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106132.docx b/sw/qa/extras/ooxmlexport/data/tdf106132.docx new file mode 100644 index 0000000000..e342898141 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106132.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106174_rtlParaAlign.docx b/sw/qa/extras/ooxmlexport/data/tdf106174_rtlParaAlign.docx new file mode 100644 index 0000000000..a222f58814 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106174_rtlParaAlign.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106492.docx b/sw/qa/extras/ooxmlexport/data/tdf106492.docx new file mode 100644 index 0000000000..72ff4be5d0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106492.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106541_noinheritChapterNumbering.odt b/sw/qa/extras/ooxmlexport/data/tdf106541_noinheritChapterNumbering.odt new file mode 100644 index 0000000000..2408ecf550 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106541_noinheritChapterNumbering.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106690-cell.docx b/sw/qa/extras/ooxmlexport/data/tdf106690-cell.docx new file mode 100644 index 0000000000..e2ea6f4b09 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106690-cell.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106690.docx b/sw/qa/extras/ooxmlexport/data/tdf106690.docx new file mode 100644 index 0000000000..b233ef81c6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106690.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106724.docx b/sw/qa/extras/ooxmlexport/data/tdf106724.docx new file mode 100644 index 0000000000..3cce6ea7c3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106724.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106843.fodt b/sw/qa/extras/ooxmlexport/data/tdf106843.fodt new file mode 100644 index 0000000000..37a97489a3 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf106843.fodt @@ -0,0 +1,43 @@ + + + + + + h/jtkVcSX/xNqeBqe4ARrYClP+E= + + + + + + + + + Ismeretlen szerző + 2018-12-03T20:35:00 + + + + + + + Ismeretlen szerző + 2018-12-03T20:34:58 + + + + + + + + + + + + Par1Par2 + + Format this... + Par3 + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf106953.docx b/sw/qa/extras/ooxmlexport/data/tdf106953.docx new file mode 100644 index 0000000000..31dc0e28e4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106953.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106970.docx b/sw/qa/extras/ooxmlexport/data/tdf106970.docx new file mode 100644 index 0000000000..8a534558b6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106970.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf106974_int32Crop.docx b/sw/qa/extras/ooxmlexport/data/tdf106974_int32Crop.docx new file mode 100644 index 0000000000..e73cf5e28d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf106974_int32Crop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107020.docx b/sw/qa/extras/ooxmlexport/data/tdf107020.docx new file mode 100644 index 0000000000..9c6cf6d958 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107020.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107033.docx b/sw/qa/extras/ooxmlexport/data/tdf107033.docx new file mode 100644 index 0000000000..f4e08a3d36 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107033.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107035.docx b/sw/qa/extras/ooxmlexport/data/tdf107035.docx new file mode 100644 index 0000000000..a8ab045b61 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107035.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107104.docx b/sw/qa/extras/ooxmlexport/data/tdf107104.docx new file mode 100644 index 0000000000..2f8c87d8d3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107104.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107111.docx b/sw/qa/extras/ooxmlexport/data/tdf107111.docx new file mode 100644 index 0000000000..f89436fda7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107111.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107119.docx b/sw/qa/extras/ooxmlexport/data/tdf107119.docx new file mode 100644 index 0000000000..98de4f2ac7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107119.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107359-char-pitch.docx b/sw/qa/extras/ooxmlexport/data/tdf107359-char-pitch.docx new file mode 100644 index 0000000000..970d722d31 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107359-char-pitch.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107618.doc b/sw/qa/extras/ooxmlexport/data/tdf107618.doc new file mode 100644 index 0000000000..8a6972f45b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107618.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107626.odt b/sw/qa/extras/ooxmlexport/data/tdf107626.odt new file mode 100644 index 0000000000..b7c8489cd3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107626.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107684.odt b/sw/qa/extras/ooxmlexport/data/tdf107684.odt new file mode 100644 index 0000000000..0ca7c53d23 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107684.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107837.odt b/sw/qa/extras/ooxmlexport/data/tdf107837.odt new file mode 100644 index 0000000000..a31a70c523 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107837.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107889.docx b/sw/qa/extras/ooxmlexport/data/tdf107889.docx new file mode 100644 index 0000000000..452c4aa130 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107889.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf107969.docx b/sw/qa/extras/ooxmlexport/data/tdf107969.docx new file mode 100644 index 0000000000..e674bcb5db Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf107969.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108269.docm b/sw/qa/extras/ooxmlexport/data/tdf108269.docm new file mode 100644 index 0000000000..44e943531d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108269.docm differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108350_noFontdefaults.docx b/sw/qa/extras/ooxmlexport/data/tdf108350_noFontdefaults.docx new file mode 100644 index 0000000000..ea81722799 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108350_noFontdefaults.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108493.docx b/sw/qa/extras/ooxmlexport/data/tdf108493.docx new file mode 100644 index 0000000000..f1a51525ee Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108493.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108496.docx b/sw/qa/extras/ooxmlexport/data/tdf108496.docx new file mode 100644 index 0000000000..123d9e0a65 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108496.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108505.docx b/sw/qa/extras/ooxmlexport/data/tdf108505.docx new file mode 100644 index 0000000000..50ebc37708 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108505.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108682.docx b/sw/qa/extras/ooxmlexport/data/tdf108682.docx new file mode 100644 index 0000000000..1364025b82 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108682.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108944_footnoteSeparator2.odt b/sw/qa/extras/ooxmlexport/data/tdf108944_footnoteSeparator2.odt new file mode 100644 index 0000000000..17e0c6029f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108944_footnoteSeparator2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108973_backgroundTextbox.docx b/sw/qa/extras/ooxmlexport/data/tdf108973_backgroundTextbox.docx new file mode 100644 index 0000000000..177cb5b779 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108973_backgroundTextbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf108973_foregroundTextbox.docx b/sw/qa/extras/ooxmlexport/data/tdf108973_foregroundTextbox.docx new file mode 100644 index 0000000000..fb81047c39 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108973_foregroundTextbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf109063.docx b/sw/qa/extras/ooxmlexport/data/tdf109063.docx new file mode 100644 index 0000000000..70f4fe4e2f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf109063.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf109184.docx b/sw/qa/extras/ooxmlexport/data/tdf109184.docx new file mode 100644 index 0000000000..36e5232ae6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf109184.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf109306.docx b/sw/qa/extras/ooxmlexport/data/tdf109306.docx new file mode 100644 index 0000000000..d46049f83b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf109306.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx b/sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx new file mode 100644 index 0000000000..9949b98d5f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf111964.docx b/sw/qa/extras/ooxmlexport/data/tdf111964.docx new file mode 100644 index 0000000000..7cb85a1d87 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf111964.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112103_tablebgnofill.docx b/sw/qa/extras/ooxmlexport/data/tdf112103_tablebgnofill.docx new file mode 100644 index 0000000000..cee8756ec3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112103_tablebgnofill.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112118.docx b/sw/qa/extras/ooxmlexport/data/tdf112118.docx new file mode 100644 index 0000000000..3ddb068394 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112118.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112169.odt b/sw/qa/extras/ooxmlexport/data/tdf112169.odt new file mode 100644 index 0000000000..51bb97f2e1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112169.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112287.docx b/sw/qa/extras/ooxmlexport/data/tdf112287.docx new file mode 100644 index 0000000000..ca22693186 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112287.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112287B.docx b/sw/qa/extras/ooxmlexport/data/tdf112287B.docx new file mode 100644 index 0000000000..945d3d026b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112287B.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112312_AutoFitForLegacyShapes.odt b/sw/qa/extras/ooxmlexport/data/tdf112312_AutoFitForLegacyShapes.odt new file mode 100644 index 0000000000..b5ccb35620 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112312_AutoFitForLegacyShapes.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112352_nextPageColumns.docx b/sw/qa/extras/ooxmlexport/data/tdf112352_nextPageColumns.docx new file mode 100644 index 0000000000..f14681dd51 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112352_nextPageColumns.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf112446_frameStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf112446_frameStyle.docx new file mode 100644 index 0000000000..7c92ae36f4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf112446_frameStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf113183.docx b/sw/qa/extras/ooxmlexport/data/tdf113183.docx new file mode 100644 index 0000000000..197f483ba0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf113183.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf113258.docx b/sw/qa/extras/ooxmlexport/data/tdf113258.docx new file mode 100644 index 0000000000..d60a2ee641 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf113258.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf113258_noBeforeAutospacing.docx b/sw/qa/extras/ooxmlexport/data/tdf113258_noBeforeAutospacing.docx new file mode 100644 index 0000000000..de74eb2268 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf113258_noBeforeAutospacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf113399.doc b/sw/qa/extras/ooxmlexport/data/tdf113399.doc new file mode 100644 index 0000000000..1f3ddc993d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf113399.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf113547.docx b/sw/qa/extras/ooxmlexport/data/tdf113547.docx new file mode 100644 index 0000000000..7b35ad72ba Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf113547.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf113608_runAwayNumbering.docx b/sw/qa/extras/ooxmlexport/data/tdf113608_runAwayNumbering.docx new file mode 100644 index 0000000000..f31cc80150 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf113608_runAwayNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf114308.docx b/sw/qa/extras/ooxmlexport/data/tdf114308.docx new file mode 100644 index 0000000000..0796200fc5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf114308.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf114537_conditional-text2.doc b/sw/qa/extras/ooxmlexport/data/tdf114537_conditional-text2.doc new file mode 100644 index 0000000000..16f8076dc3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf114537_conditional-text2.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf114703.docx b/sw/qa/extras/ooxmlexport/data/tdf114703.docx new file mode 100644 index 0000000000..116b56a2b4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf114703.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf114734_commentFormating.docx b/sw/qa/extras/ooxmlexport/data/tdf114734_commentFormating.docx new file mode 100644 index 0000000000..5c8edb1689 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf114734_commentFormating.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf114882.docx b/sw/qa/extras/ooxmlexport/data/tdf114882.docx new file mode 100644 index 0000000000..8663f6b155 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf114882.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf115030.docx b/sw/qa/extras/ooxmlexport/data/tdf115030.docx new file mode 100644 index 0000000000..71b983295c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf115030.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf115094v3.docx b/sw/qa/extras/ooxmlexport/data/tdf115094v3.docx new file mode 100644 index 0000000000..6c7535f7b7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf115094v3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf115212.docx b/sw/qa/extras/ooxmlexport/data/tdf115212.docx new file mode 100644 index 0000000000..1a44fbd776 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf115212.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf115557.docx b/sw/qa/extras/ooxmlexport/data/tdf115557.docx new file mode 100644 index 0000000000..1edceac485 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf115557.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf115719.docx b/sw/qa/extras/ooxmlexport/data/tdf115719.docx new file mode 100644 index 0000000000..99806d4dc8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf115719.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf115719b.docx b/sw/qa/extras/ooxmlexport/data/tdf115719b.docx new file mode 100644 index 0000000000..f3e3925c88 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf115719b.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf115861.docx b/sw/qa/extras/ooxmlexport/data/tdf115861.docx new file mode 100644 index 0000000000..f42a7bad2c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf115861.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116084.docx b/sw/qa/extras/ooxmlexport/data/tdf116084.docx new file mode 100644 index 0000000000..61a9fdb13a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116084.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116194.docx b/sw/qa/extras/ooxmlexport/data/tdf116194.docx new file mode 100644 index 0000000000..feec3ee987 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116194.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116371.odt b/sw/qa/extras/ooxmlexport/data/tdf116371.odt new file mode 100644 index 0000000000..257696616e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116371.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116394.docx b/sw/qa/extras/ooxmlexport/data/tdf116394.docx new file mode 100644 index 0000000000..b152a0f3db Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116394.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116410.docx b/sw/qa/extras/ooxmlexport/data/tdf116410.docx new file mode 100644 index 0000000000..5352a233ed Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116410.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116436_rowFill.odt b/sw/qa/extras/ooxmlexport/data/tdf116436_rowFill.odt new file mode 100644 index 0000000000..45f4a1c54b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116436_rowFill.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116801.docx b/sw/qa/extras/ooxmlexport/data/tdf116801.docx new file mode 100644 index 0000000000..f904546cf3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116801.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116883.docx b/sw/qa/extras/ooxmlexport/data/tdf116883.docx new file mode 100644 index 0000000000..52a9c42218 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116883.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116976.docx b/sw/qa/extras/ooxmlexport/data/tdf116976.docx new file mode 100644 index 0000000000..70492a4af2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116976.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf116985.docx b/sw/qa/extras/ooxmlexport/data/tdf116985.docx new file mode 100644 index 0000000000..2a8e202388 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf116985.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf117137.docx b/sw/qa/extras/ooxmlexport/data/tdf117137.docx new file mode 100644 index 0000000000..1c2cc92b20 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf117137.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf117297_tableStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf117297_tableStyle.docx new file mode 100644 index 0000000000..57260f8160 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf117297_tableStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf117504_numberingIndent.docx b/sw/qa/extras/ooxmlexport/data/tdf117504_numberingIndent.docx new file mode 100644 index 0000000000..d86b0b4f1a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf117504_numberingIndent.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf117805.odt b/sw/qa/extras/ooxmlexport/data/tdf117805.odt new file mode 100644 index 0000000000..828384b361 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf117805.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf117988.docx b/sw/qa/extras/ooxmlexport/data/tdf117988.docx new file mode 100644 index 0000000000..5c92f209a9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf117988.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118169.docx b/sw/qa/extras/ooxmlexport/data/tdf118169.docx new file mode 100644 index 0000000000..2510fb3e59 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118169.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118242.odt b/sw/qa/extras/ooxmlexport/data/tdf118242.odt new file mode 100644 index 0000000000..14b468d750 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118242.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118361_RTLfootnoteSeparator.docx b/sw/qa/extras/ooxmlexport/data/tdf118361_RTLfootnoteSeparator.docx new file mode 100644 index 0000000000..8545cbf253 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118361_RTLfootnoteSeparator.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118521_marginsLR.docx b/sw/qa/extras/ooxmlexport/data/tdf118521_marginsLR.docx new file mode 100644 index 0000000000..66170ede47 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118521_marginsLR.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118535.odt b/sw/qa/extras/ooxmlexport/data/tdf118535.odt new file mode 100644 index 0000000000..146c6f471a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118535.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118682.fodt b/sw/qa/extras/ooxmlexport/data/tdf118682.fodt new file mode 100644 index 0000000000..b80074592d --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf118682.fodt @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 6 + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf118691.docx b/sw/qa/extras/ooxmlexport/data/tdf118691.docx new file mode 100644 index 0000000000..ce6c6c5cf7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118691.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118701.docx b/sw/qa/extras/ooxmlexport/data/tdf118701.docx new file mode 100644 index 0000000000..8fb26669d1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118701.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118702.odt b/sw/qa/extras/ooxmlexport/data/tdf118702.odt new file mode 100644 index 0000000000..d55099242d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118702.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118812_tableStyles-comprehensive.docx b/sw/qa/extras/ooxmlexport/data/tdf118812_tableStyles-comprehensive.docx new file mode 100644 index 0000000000..e2cbffc20a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118812_tableStyles-comprehensive.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle.docx new file mode 100644 index 0000000000..b5c55f6f3b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle2.docx b/sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle2.docx new file mode 100644 index 0000000000..7c0825feba Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf118947_tableStyle2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119037.odt b/sw/qa/extras/ooxmlexport/data/tdf119037.odt new file mode 100644 index 0000000000..b795b6b34b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119037.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119054.docx b/sw/qa/extras/ooxmlexport/data/tdf119054.docx new file mode 100644 index 0000000000..9c3657c24a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119054.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119143.docx b/sw/qa/extras/ooxmlexport/data/tdf119143.docx new file mode 100644 index 0000000000..be0bc03f71 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119143.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119188_list_margin_in_cell.docx b/sw/qa/extras/ooxmlexport/data/tdf119188_list_margin_in_cell.docx new file mode 100644 index 0000000000..02b538685f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119188_list_margin_in_cell.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119201.docx b/sw/qa/extras/ooxmlexport/data/tdf119201.docx new file mode 100644 index 0000000000..d454d6731b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119201.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119760_positionCellBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf119760_positionCellBorder.docx new file mode 100644 index 0000000000..17a570e063 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119760_positionCellBorder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119760_tableInTablePosition.docx b/sw/qa/extras/ooxmlexport/data/tdf119760_tableInTablePosition.docx new file mode 100644 index 0000000000..0456fe206e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119760_tableInTablePosition.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119800.docx b/sw/qa/extras/ooxmlexport/data/tdf119800.docx new file mode 100644 index 0000000000..35c4108d3b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119800.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119809.docx b/sw/qa/extras/ooxmlexport/data/tdf119809.docx new file mode 100644 index 0000000000..9779382531 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119809.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf119952_negativeMargins.docx b/sw/qa/extras/ooxmlexport/data/tdf119952_negativeMargins.docx new file mode 100644 index 0000000000..9b5a98d3f1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf119952_negativeMargins.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120224_textControlCrossRef.docx b/sw/qa/extras/ooxmlexport/data/tdf120224_textControlCrossRef.docx new file mode 100644 index 0000000000..c76bbd691c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120224_textControlCrossRef.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120315.docx b/sw/qa/extras/ooxmlexport/data/tdf120315.docx new file mode 100644 index 0000000000..d3943ea0b2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120315.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120338.docx b/sw/qa/extras/ooxmlexport/data/tdf120338.docx new file mode 100644 index 0000000000..94e0023cea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120338.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120344_FontTypes.docx b/sw/qa/extras/ooxmlexport/data/tdf120344_FontTypes.docx new file mode 100644 index 0000000000..74bcd59e24 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120344_FontTypes.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120394.docx b/sw/qa/extras/ooxmlexport/data/tdf120394.docx new file mode 100644 index 0000000000..39bd5886c0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120394.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120412_400PercentSubscript.docx b/sw/qa/extras/ooxmlexport/data/tdf120412_400PercentSubscript.docx new file mode 100644 index 0000000000..526d7d2c18 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120412_400PercentSubscript.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120511_eatenSection.docx b/sw/qa/extras/ooxmlexport/data/tdf120511_eatenSection.docx new file mode 100644 index 0000000000..6a6d6f17ba Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120511_eatenSection.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx b/sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx new file mode 100644 index 0000000000..77a6d48dd8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyProtection.docx b/sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyProtection.docx new file mode 100644 index 0000000000..02869aa5a7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyProtection.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyUnProtected.docx b/sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyUnProtected.docx new file mode 100644 index 0000000000..143799ddb6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120852_readOnlyUnProtected.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121045.docx b/sw/qa/extras/ooxmlexport/data/tdf121045.docx new file mode 100644 index 0000000000..271aca1ec0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121045.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121176.docx b/sw/qa/extras/ooxmlexport/data/tdf121176.docx new file mode 100644 index 0000000000..f95c023b05 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121176.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF.odt b/sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF.odt new file mode 100644 index 0000000000..392fae1b66 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF2.doc b/sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF2.doc new file mode 100644 index 0000000000..56a33d260e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121374_sectionHF2.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121441.docx b/sw/qa/extras/ooxmlexport/data/tdf121441.docx new file mode 100644 index 0000000000..d4c67feb52 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121441.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121456.docx b/sw/qa/extras/ooxmlexport/data/tdf121456.docx new file mode 100644 index 0000000000..a65870a9b7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121456.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121456_tabsOffset.odt b/sw/qa/extras/ooxmlexport/data/tdf121456_tabsOffset.odt new file mode 100644 index 0000000000..ff8d540095 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121456_tabsOffset.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121597.odt b/sw/qa/extras/ooxmlexport/data/tdf121597.odt new file mode 100644 index 0000000000..760b46e763 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121597.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121658.docx b/sw/qa/extras/ooxmlexport/data/tdf121658.docx new file mode 100644 index 0000000000..fe42b5cde8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121658.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121659_loseColumnBrNextToShape.docx b/sw/qa/extras/ooxmlexport/data/tdf121659_loseColumnBrNextToShape.docx new file mode 100644 index 0000000000..1fda1422e3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121659_loseColumnBrNextToShape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121661.docx b/sw/qa/extras/ooxmlexport/data/tdf121661.docx new file mode 100644 index 0000000000..dfd2f291e3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121661.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121663.docx b/sw/qa/extras/ooxmlexport/data/tdf121663.docx new file mode 100644 index 0000000000..dd2614169a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121663.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121665_back2backColumnBreaks.docx b/sw/qa/extras/ooxmlexport/data/tdf121665_back2backColumnBreaks.docx new file mode 100644 index 0000000000..e9173a9acf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121665_back2backColumnBreaks.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121666_lostPage.docx b/sw/qa/extras/ooxmlexport/data/tdf121666_lostPage.docx new file mode 100644 index 0000000000..195f574d1c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121666_lostPage.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121669_equalColumns.docx b/sw/qa/extras/ooxmlexport/data/tdf121669_equalColumns.docx new file mode 100644 index 0000000000..4f962e1bdd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121669_equalColumns.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121670_columnsInSectionsOnly.docx b/sw/qa/extras/ooxmlexport/data/tdf121670_columnsInSectionsOnly.docx new file mode 100644 index 0000000000..d8ba105440 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121670_columnsInSectionsOnly.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121784.docx b/sw/qa/extras/ooxmlexport/data/tdf121784.docx new file mode 100644 index 0000000000..30faeb2841 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121784.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf121867.odt b/sw/qa/extras/ooxmlexport/data/tdf121867.odt new file mode 100644 index 0000000000..361121d23b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf121867.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf122186_input_list.odt b/sw/qa/extras/ooxmlexport/data/tdf122186_input_list.odt new file mode 100644 index 0000000000..76a6289f70 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf122186_input_list.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf122201_editUnprotectedText.odt b/sw/qa/extras/ooxmlexport/data/tdf122201_editUnprotectedText.odt new file mode 100644 index 0000000000..217c8c38a4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf122201_editUnprotectedText.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf122342.docx b/sw/qa/extras/ooxmlexport/data/tdf122342.docx new file mode 100644 index 0000000000..0c7ecd67a5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf122342.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf122563.docx b/sw/qa/extras/ooxmlexport/data/tdf122563.docx new file mode 100644 index 0000000000..69168a3826 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf122563.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf122594.docx b/sw/qa/extras/ooxmlexport/data/tdf122594.docx new file mode 100644 index 0000000000..847d8ef590 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf122594.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf122648.docx b/sw/qa/extras/ooxmlexport/data/tdf122648.docx new file mode 100644 index 0000000000..900a9f30b2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf122648.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123054.docx b/sw/qa/extras/ooxmlexport/data/tdf123054.docx new file mode 100644 index 0000000000..d857479d5a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123054.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123104.docx b/sw/qa/extras/ooxmlexport/data/tdf123104.docx new file mode 100644 index 0000000000..73cad8617c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123104.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123116_oversizedRowSplit.odt b/sw/qa/extras/ooxmlexport/data/tdf123116_oversizedRowSplit.odt new file mode 100644 index 0000000000..aafc27ae22 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123116_oversizedRowSplit.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123243.docx b/sw/qa/extras/ooxmlexport/data/tdf123243.docx new file mode 100644 index 0000000000..9519a2a145 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123243.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123262_textFootnoteSeparators.docx b/sw/qa/extras/ooxmlexport/data/tdf123262_textFootnoteSeparators.docx new file mode 100644 index 0000000000..ceccb767e2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123262_textFootnoteSeparators.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginHasHeader.docx b/sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginHasHeader.docx new file mode 100644 index 0000000000..b978eec993 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginHasHeader.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginNoHeader.docx b/sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginNoHeader.docx new file mode 100644 index 0000000000..70c2793cbf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123324_testRelativeAnchorHeightFromTopMarginNoHeader.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123346_ArrowMarker.docx b/sw/qa/extras/ooxmlexport/data/tdf123346_ArrowMarker.docx new file mode 100644 index 0000000000..770bab263d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123346_ArrowMarker.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123351_UnderlineGroupSapeText.docx b/sw/qa/extras/ooxmlexport/data/tdf123351_UnderlineGroupSapeText.docx new file mode 100644 index 0000000000..8726f7ee6f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123351_UnderlineGroupSapeText.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123354.fodt b/sw/qa/extras/ooxmlexport/data/tdf123354.fodt new file mode 100644 index 0000000000..5e75b21295 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf123354.fodt @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + -10 + + + 0 + + + 10 + + + + + 10 + + + 0 + + + 10 + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf123355.docx b/sw/qa/extras/ooxmlexport/data/tdf123355.docx new file mode 100644 index 0000000000..da36db29f7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123355.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123356.fodt b/sw/qa/extras/ooxmlexport/data/tdf123356.fodt new file mode 100644 index 0000000000..c7dc5d1e61 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf123356.fodt @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + -10 + + + 0 + + + 10 + + + + + 3 + + + 1 + + + 4 + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf123381.docx b/sw/qa/extras/ooxmlexport/data/tdf123381.docx new file mode 100644 index 0000000000..a019560d51 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123381.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123382.docx b/sw/qa/extras/ooxmlexport/data/tdf123382.docx new file mode 100644 index 0000000000..cac27ef518 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123382.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123386.docx b/sw/qa/extras/ooxmlexport/data/tdf123386.docx new file mode 100644 index 0000000000..1278068dde Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123386.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123388.docx b/sw/qa/extras/ooxmlexport/data/tdf123388.docx new file mode 100644 index 0000000000..7d1da2b05e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123388.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123389.docx b/sw/qa/extras/ooxmlexport/data/tdf123389.docx new file mode 100644 index 0000000000..4245464b82 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123389.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123390.fodt b/sw/qa/extras/ooxmlexport/data/tdf123390.fodt new file mode 100644 index 0000000000..6512425bda --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf123390.fodt @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + -10 + + + 0 + + + 10 + + + + + -1 + + + 0 + + + 1 + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf123401.fodt b/sw/qa/extras/ooxmlexport/data/tdf123401.fodt new file mode 100644 index 0000000000..d0cdfe2c90 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf123401.fodt @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + 2 + + + + + 4 + + + + + 3 + + + + + 3 + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf123435.docx b/sw/qa/extras/ooxmlexport/data/tdf123435.docx new file mode 100644 index 0000000000..02d8cd1e9b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123435.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123460.docx b/sw/qa/extras/ooxmlexport/data/tdf123460.docx new file mode 100644 index 0000000000..c3b723b4e5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123460.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt b/sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt new file mode 100644 index 0000000000..b452852afe Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123610_handle_upright.docx b/sw/qa/extras/ooxmlexport/data/tdf123610_handle_upright.docx new file mode 100644 index 0000000000..d7dc1978a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123610_handle_upright.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123621.docx b/sw/qa/extras/ooxmlexport/data/tdf123621.docx new file mode 100644 index 0000000000..471b6ef71e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123621.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123622.docx b/sw/qa/extras/ooxmlexport/data/tdf123622.docx new file mode 100644 index 0000000000..54ef0cbd76 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123622.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123627.docx b/sw/qa/extras/ooxmlexport/data/tdf123627.docx new file mode 100644 index 0000000000..a85d440005 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123627.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123628.odt b/sw/qa/extras/ooxmlexport/data/tdf123628.odt new file mode 100644 index 0000000000..53ce54ad2e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123628.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak.docx b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak.docx new file mode 100644 index 0000000000..6f7b4b1445 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak2.docx b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak2.docx new file mode 100644 index 0000000000..a876bea84e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak3.docx b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak3.docx new file mode 100644 index 0000000000..1bcc335fdc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak4.docx b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak4.docx new file mode 100644 index 0000000000..3a9d86ee21 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123636_newlinePageBreak4.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123642.docx b/sw/qa/extras/ooxmlexport/data/tdf123642.docx new file mode 100644 index 0000000000..9817093e02 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123642.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123705.docx b/sw/qa/extras/ooxmlexport/data/tdf123705.docx new file mode 100644 index 0000000000..46e053fd46 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123705.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123757.docx b/sw/qa/extras/ooxmlexport/data/tdf123757.docx new file mode 100644 index 0000000000..6cfc8210c0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123757.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123873.docx b/sw/qa/extras/ooxmlexport/data/tdf123873.docx new file mode 100644 index 0000000000..b1de7f71f7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123873.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf123912_protectedForm.odt b/sw/qa/extras/ooxmlexport/data/tdf123912_protectedForm.odt new file mode 100644 index 0000000000..34e87467ee Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123912_protectedForm.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124367.docx b/sw/qa/extras/ooxmlexport/data/tdf124367.docx new file mode 100644 index 0000000000..0a1356dd0d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124367.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124384.docx b/sw/qa/extras/ooxmlexport/data/tdf124384.docx new file mode 100644 index 0000000000..a41be4b115 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124384.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124399_SingleCellTableBorders.docx b/sw/qa/extras/ooxmlexport/data/tdf124399_SingleCellTableBorders.docx new file mode 100644 index 0000000000..edb93b76e1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124399_SingleCellTableBorders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124472.docx b/sw/qa/extras/ooxmlexport/data/tdf124472.docx new file mode 100644 index 0000000000..7d7f275be7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124472.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124491.docx b/sw/qa/extras/ooxmlexport/data/tdf124491.docx new file mode 100644 index 0000000000..dad4d7c54b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124491.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124594.docx b/sw/qa/extras/ooxmlexport/data/tdf124594.docx new file mode 100644 index 0000000000..27abe18419 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124594.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124600b.docx b/sw/qa/extras/ooxmlexport/data/tdf124600b.docx new file mode 100644 index 0000000000..aa25ada91b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124600b.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124604.docx b/sw/qa/extras/ooxmlexport/data/tdf124604.docx new file mode 100644 index 0000000000..1bac640ecc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124604.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124637_sectionMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf124637_sectionMargin.docx new file mode 100644 index 0000000000..19aa819aca Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124637_sectionMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124678_no_leading_paragraph.odt b/sw/qa/extras/ooxmlexport/data/tdf124678_no_leading_paragraph.odt new file mode 100644 index 0000000000..a694ff6136 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124678_no_leading_paragraph.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124678_with_leading_paragraph.odt b/sw/qa/extras/ooxmlexport/data/tdf124678_with_leading_paragraph.odt new file mode 100644 index 0000000000..cb14c8ea4d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124678_with_leading_paragraph.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124795-5.docx b/sw/qa/extras/ooxmlexport/data/tdf124795-5.docx new file mode 100644 index 0000000000..19fd5f49c8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124795-5.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf124986.docx b/sw/qa/extras/ooxmlexport/data/tdf124986.docx new file mode 100644 index 0000000000..e5bb8f4966 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf124986.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125038_conditionalText3.docx b/sw/qa/extras/ooxmlexport/data/tdf125038_conditionalText3.docx new file mode 100644 index 0000000000..ec5698eeae Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125038_conditionalText3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125268.odt b/sw/qa/extras/ooxmlexport/data/tdf125268.odt new file mode 100644 index 0000000000..ebdc206191 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125268.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125298_crossreflink_nonascii_charlimit.docx b/sw/qa/extras/ooxmlexport/data/tdf125298_crossreflink_nonascii_charlimit.docx new file mode 100644 index 0000000000..d15739971c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125298_crossreflink_nonascii_charlimit.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125324.docx b/sw/qa/extras/ooxmlexport/data/tdf125324.docx new file mode 100644 index 0000000000..9382e295f0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125324.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125338.docm b/sw/qa/extras/ooxmlexport/data/tdf125338.docm new file mode 100644 index 0000000000..44e943531d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125338.docm differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125518.odt b/sw/qa/extras/ooxmlexport/data/tdf125518.odt new file mode 100644 index 0000000000..92df094a89 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125518.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125546.docx b/sw/qa/extras/ooxmlexport/data/tdf125546.docx new file mode 100644 index 0000000000..92e3bdcd15 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125546.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125657.docx b/sw/qa/extras/ooxmlexport/data/tdf125657.docx new file mode 100644 index 0000000000..eeaad7a4bb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125657.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125778_lostPageBreakTOX.docx b/sw/qa/extras/ooxmlexport/data/tdf125778_lostPageBreakTOX.docx new file mode 100644 index 0000000000..dd5d323e57 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125778_lostPageBreakTOX.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125894.docx b/sw/qa/extras/ooxmlexport/data/tdf125894.docx new file mode 100644 index 0000000000..1214f2c09c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125894.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf125936_numberingSuperscript.docx b/sw/qa/extras/ooxmlexport/data/tdf125936_numberingSuperscript.docx new file mode 100644 index 0000000000..eb856fb3b0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf125936_numberingSuperscript.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126206.docx b/sw/qa/extras/ooxmlexport/data/tdf126206.docx new file mode 100644 index 0000000000..166125e7a7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126206.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126245.docx b/sw/qa/extras/ooxmlexport/data/tdf126245.docx new file mode 100644 index 0000000000..7cdc261431 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126245.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126287.docx b/sw/qa/extras/ooxmlexport/data/tdf126287.docx new file mode 100644 index 0000000000..cf2250b9f9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126287.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx b/sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx new file mode 100644 index 0000000000..180383ec68 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126590.docx b/sw/qa/extras/ooxmlexport/data/tdf126590.docx new file mode 100644 index 0000000000..147db45652 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126590.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126723.docx b/sw/qa/extras/ooxmlexport/data/tdf126723.docx new file mode 100644 index 0000000000..297ea322fa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126723.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126768.docx b/sw/qa/extras/ooxmlexport/data/tdf126768.docx new file mode 100644 index 0000000000..7a3440e791 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126768.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126792.odt b/sw/qa/extras/ooxmlexport/data/tdf126792.odt new file mode 100644 index 0000000000..7eb43e78a7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126792.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent0.odt b/sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent0.odt new file mode 100644 index 0000000000..e650076a09 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent0.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent1.odt b/sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent1.odt new file mode 100644 index 0000000000..da2eae76bb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126795_TabsRelativeToIndent1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf126994_lostPageBreak.docx b/sw/qa/extras/ooxmlexport/data/tdf126994_lostPageBreak.docx new file mode 100644 index 0000000000..9025ce652e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf126994_lostPageBreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127085.docx b/sw/qa/extras/ooxmlexport/data/tdf127085.docx new file mode 100644 index 0000000000..65556fe38a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127085.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127116.odt b/sw/qa/extras/ooxmlexport/data/tdf127116.odt new file mode 100644 index 0000000000..2825b34c07 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127116.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127316_autoEscapement.odt b/sw/qa/extras/ooxmlexport/data/tdf127316_autoEscapement.odt new file mode 100644 index 0000000000..95987d4562 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127316_autoEscapement.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127339.docx b/sw/qa/extras/ooxmlexport/data/tdf127339.docx new file mode 100644 index 0000000000..7f0239ddb0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127339.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127362.odt b/sw/qa/extras/ooxmlexport/data/tdf127362.odt new file mode 100644 index 0000000000..488f1528fd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127362.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127579.odt b/sw/qa/extras/ooxmlexport/data/tdf127579.odt new file mode 100644 index 0000000000..a35fb47a03 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127579.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127605.odt b/sw/qa/extras/ooxmlexport/data/tdf127605.odt new file mode 100644 index 0000000000..583f7fdeeb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127605.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127622_framePr.docx b/sw/qa/extras/ooxmlexport/data/tdf127622_framePr.docx new file mode 100644 index 0000000000..5440a81985 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127622_framePr.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127741.docx b/sw/qa/extras/ooxmlexport/data/tdf127741.docx new file mode 100644 index 0000000000..1bedb9ade5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127741.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127814.docx b/sw/qa/extras/ooxmlexport/data/tdf127814.docx new file mode 100644 index 0000000000..10ed2348f1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127814.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127864.docx b/sw/qa/extras/ooxmlexport/data/tdf127864.docx new file mode 100644 index 0000000000..a9e59d9331 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127864.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf127925.odt b/sw/qa/extras/ooxmlexport/data/tdf127925.odt new file mode 100644 index 0000000000..b91e48f055 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf127925.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128156.docx b/sw/qa/extras/ooxmlexport/data/tdf128156.docx new file mode 100644 index 0000000000..b499f6e50b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128156.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128207.docx b/sw/qa/extras/ooxmlexport/data/tdf128207.docx new file mode 100644 index 0000000000..c234ec8bc1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128207.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128245.docx b/sw/qa/extras/ooxmlexport/data/tdf128245.docx new file mode 100644 index 0000000000..618f720305 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128245.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128290.odt b/sw/qa/extras/ooxmlexport/data/tdf128290.odt new file mode 100644 index 0000000000..81ea0c6773 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128290.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128304.odt b/sw/qa/extras/ooxmlexport/data/tdf128304.odt new file mode 100644 index 0000000000..6c5cbd1200 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128304.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128646.docx b/sw/qa/extras/ooxmlexport/data/tdf128646.docx new file mode 100644 index 0000000000..9648df35a2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128646.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128752.docx b/sw/qa/extras/ooxmlexport/data/tdf128752.docx new file mode 100644 index 0000000000..0e49291414 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128752.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf128820.fodt b/sw/qa/extras/ooxmlexport/data/tdf128820.fodt new file mode 100644 index 0000000000..576fd966e2 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf128820.fodt @@ -0,0 +1,16 @@ + + + + + + + + + PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLz4 + json + + + + + + \ No newline at end of file diff --git a/sw/qa/extras/ooxmlexport/data/tdf128889.fodt b/sw/qa/extras/ooxmlexport/data/tdf128889.fodt new file mode 100644 index 0000000000..6dc1c42026 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf128889.fodt @@ -0,0 +1,15 @@ + + + + + + + + + + + para1 + para2 + + + \ No newline at end of file diff --git a/sw/qa/extras/ooxmlexport/data/tdf128913.docx b/sw/qa/extras/ooxmlexport/data/tdf128913.docx new file mode 100644 index 0000000000..42cc2d75d3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf128913.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129242_InsideBorders.docx b/sw/qa/extras/ooxmlexport/data/tdf129242_InsideBorders.docx new file mode 100644 index 0000000000..58045c971c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129242_InsideBorders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129353.docx b/sw/qa/extras/ooxmlexport/data/tdf129353.docx new file mode 100644 index 0000000000..c5cf8865ed Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129353.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129442_RightBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf129442_RightBorder.docx new file mode 100644 index 0000000000..57ad24b614 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129442_RightBorder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129450_BottomBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf129450_BottomBorder.docx new file mode 100644 index 0000000000..df00bfe044 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129450_BottomBorder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129452_BottomBorders.docx b/sw/qa/extras/ooxmlexport/data/tdf129452_BottomBorders.docx new file mode 100644 index 0000000000..399c06be1a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129452_BottomBorders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129452_excessBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf129452_excessBorder.docx new file mode 100644 index 0000000000..2bce3ff883 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129452_excessBorder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129522_removeShadowStyle.odt b/sw/qa/extras/ooxmlexport/data/tdf129522_removeShadowStyle.odt new file mode 100644 index 0000000000..7ced9fc647 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129522_removeShadowStyle.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129525.rtf b/sw/qa/extras/ooxmlexport/data/tdf129525.rtf new file mode 100644 index 0000000000..1865d15ca9 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf129525.rtf @@ -0,0 +1,262 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang3082\deflangfe3082\themelang3082\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f38\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Tahoma{\*\falt Times};} +{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};}{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman{\*\falt Times};} +{\f1577\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\f1578\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\f1580\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\f1581\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\f1582\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\f1583\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\f1584\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\f1585\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\f1917\fbidi \froman\fcharset238\fprq2 Cambria Math CE;} +{\f1918\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f1920\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f1921\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f1924\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;} +{\f1925\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}{\f1957\fbidi \fswiss\fcharset238\fprq2 Tahoma CE{\*\falt Times};}{\f1958\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr{\*\falt Times};} +{\f1960\fbidi \fswiss\fcharset161\fprq2 Tahoma Greek{\*\falt Times};}{\f1961\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur{\*\falt Times};}{\f1962\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew){\*\falt Times};} +{\f1963\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic){\*\falt Times};}{\f1964\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic{\*\falt Times};}{\f1965\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese){\*\falt Times};} +{\f1966\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai){\*\falt Times};}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE{\*\falt Times};}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr{\*\falt Times};} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek{\*\falt Times};}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur{\*\falt Times};} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew){\*\falt Times};}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic){\*\falt Times};} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic{\*\falt Times};}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese){\*\falt Times};}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255; +\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0; +\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 } +\noqfpromote {\stylesheet{\ql \li0\ri0\sa120\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 +\snext0 \sqformat \spriority0 Normal;}{\s1\qj \li0\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs32\alang1025 \ltrch\fcs0 +\b\fs32\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \slink15 \sqformat heading 1;}{\s2\qj \fi-360\li360\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel1\adjustright\rin0\lin360\itap0 +\rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \slink16 \sqformat heading 2;}{ +\s3\qj \li0\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af0\afs24\alang1025 \ltrch\fcs0 \i\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 +\sbasedon0 \snext0 \slink17 \sqformat heading 3;}{\s4\qc \fi-360\li720\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel3\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af0\afs32\alang1025 \ltrch\fcs0 +\b\fs32\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \slink18 \sqformat heading 4;}{\s5\qj \fi-720\li720\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel4\adjustright\rin0\lin720\itap0 +\rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \slink19 \sqformat heading 5;}{ +\s6\qj \fi720\li0\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 +\sbasedon0 \snext0 \slink20 \sqformat heading 6;}{\s7\qj \li720\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel6\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 +\b\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \slink21 \sqformat heading 7;}{\s8\qj \li720\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel7\adjustright\rin0\lin720\itap0 \rtlch\fcs1 +\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \slink22 \sqformat heading 8;}{ +\s9\qj \fi720\li720\ri0\sa120\keepn\nowidctlpar\wrapdefault\faauto\outlinelevel8\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 +\sbasedon0 \snext0 \slink23 \sqformat heading 9;}{\*\cs10 \additive Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang3082\langfe3082\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp3082\langfenp3082 \snext11 \ssemihidden \sunhideused +Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af31503\afs32 \ltrch\fcs0 \b\fs32\lang1033\langfe0\kerning32\loch\f31502\hich\af31502\dbch\af31501\langnp1033 \sbasedon10 \slink1 \slocked \spriority9 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 +\ab\ai\af31503\afs28 \ltrch\fcs0 \b\i\fs28\lang1033\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp1033 \sbasedon10 \slink2 \slocked \ssemihidden \spriority9 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af31503\afs26 \ltrch\fcs0 +\b\fs26\lang1033\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp1033 \sbasedon10 \slink3 \slocked \ssemihidden \spriority9 Heading 3 Char;}{\*\cs18 \additive \rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\fs28\lang1033\langfe0\langnp1033 +\sbasedon10 \slink4 \slocked \ssemihidden \spriority9 Heading 4 Char;}{\*\cs19 \additive \rtlch\fcs1 \ab\ai\af0\afs26 \ltrch\fcs0 \b\i\fs26\lang1033\langfe0\langnp1033 \sbasedon10 \slink5 \slocked \ssemihidden \spriority9 Heading 5 Char;}{\*\cs20 +\additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\lang1033\langfe0\langnp1033 \sbasedon10 \slink6 \slocked \ssemihidden \spriority9 Heading 6 Char;}{\*\cs21 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \fs24\lang1033\langfe0\langnp1033 +\sbasedon10 \slink7 \slocked \ssemihidden \spriority9 Heading 7 Char;}{\*\cs22 \additive \rtlch\fcs1 \ai\af0\afs24 \ltrch\fcs0 \i\fs24\lang1033\langfe0\langnp1033 \sbasedon10 \slink8 \slocked \ssemihidden \spriority9 Heading 8 Char;}{\*\cs23 \additive +\rtlch\fcs1 \af31503 \ltrch\fcs0 \lang1033\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp1033 \sbasedon10 \slink9 \slocked \ssemihidden \spriority9 Heading 9 Char;}{\s24\ql \li0\ri0\sa120\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 +\cbpat9 \rtlch\fcs1 \af38\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f38\hich\af38\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext24 \slink25 Document Map;}{\*\cs25 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 +\f38\fs16\lang1033\langfe0\langnp1033 \sbasedon10 \slink24 \slocked \ssemihidden Document Map Char;}{\s26\qj \li0\ri0\sa120\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext26 \slink27 Body Text;}{\*\cs27 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\lang1033\langfe0\langnp1033 +\sbasedon10 \slink26 \slocked \ssemihidden Body Text Char;}{\s28\qj \fi360\li0\ri0\sa120\nowidctlpar\tx0\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext28 \slink29 Body Text 2;}{\*\cs29 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\lang1033\langfe0\langnp1033 +\sbasedon10 \slink28 \slocked \ssemihidden Body Text 2 Char;}{\s30\qc \li0\ri0\sa120\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs40\alang1025 \ltrch\fcs0 +\b\fs40\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext30 \slink31 \sqformat Title;}{\*\cs31 \additive \rtlch\fcs1 \ab\af31503\afs32 \ltrch\fcs0 +\b\fs32\lang1033\langfe0\kerning28\loch\f31502\hich\af31502\dbch\af31501\langnp1033 \sbasedon10 \slink30 \slocked \spriority10 Title Char;}{\s32\qj \fi-270\li630\ri0\sa120\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin630\itap0 \rtlch\fcs1 +\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext32 \slink33 Body Text Indent 2;}{\*\cs33 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 +\f0\fs24\lang1033\langfe0\langnp1033 \sbasedon10 \slink32 \slocked \ssemihidden Body Text Indent 2 Char;}{\s34\qj \fi-270\li720\ri0\sa120\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext34 \slink35 Body Text Indent 3;}{\*\cs35 \additive \rtlch\fcs1 \af0\afs16 \ltrch\fcs0 \f0\fs16\lang1033\langfe0\langnp1033 +\sbasedon10 \slink34 \slocked \ssemihidden Body Text Indent 3 Char;}{\s36\qc \li0\ri0\sa120\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\ai\af0\afs28\alang1025 \ltrch\fcs0 +\b\i\fs28\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext36 \slink37 \sqformat Subtitle;}{\*\cs37 \additive \rtlch\fcs1 \af31503\afs24 \ltrch\fcs0 +\fs24\lang1033\langfe0\loch\f31502\hich\af31502\dbch\af31501\langnp1033 \sbasedon10 \slink36 \slocked \spriority11 Subtitle Char;}{\s38\ql \li0\ri0\sa120\nowidctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext38 \slink39 footer;}{\*\cs39 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \f0\fs24\lang1033\langfe0\langnp1033 +\sbasedon10 \slink38 \slocked \ssemihidden Footer Char;}{\*\cs40 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 page number;}{\s41\ql \li0\ri0\sa120\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af0\afs24\alang1025 \ltrch\fcs0 \b\caps\fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd \spriority39 toc 1;}{\s42\ql \li245\ri0\sa120\nowidctlpar +\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin245\itap0 \rtlch\fcs1 \ab\af0\afs20\alang1025 \ltrch\fcs0 \b\fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd toc 2;}{ +\s43\ql \li480\ri0\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin480\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd +toc 3;}{\s44\ql \li720\ri0\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin720\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 +\sbasedon0 \snext0 \sautoupd toc 4;}{\s45\ql \li960\ri0\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin960\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 +\fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd toc 5;}{\s46\ql \li1200\ri0\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin1200\itap0 \rtlch\fcs1 \af0\afs20\alang1025 +\ltrch\fcs0 \fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd toc 6;}{\s47\ql \li1440\ri0\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin1440\itap0 \rtlch\fcs1 +\af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd toc 7;}{\s48\ql \li1680\ri0\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin1680\itap0 +\rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd toc 8;}{\s49\ql \li1920\ri0\nowidctlpar +\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin1920\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext0 \sautoupd toc 9;}{ +\s50\qj \fi-270\li1710\ri-720\sa120\widctlpar\wrapdefault\faauto\adjustright\rin-720\lin1710\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\f0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sbasedon0 \snext50 +Block Text;}}{\*\listtable{\list\listtemplateid0\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat3\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1800 +\jclisttab\tx1800\lin1800 }{\listname ;}\listid1}{\list\listtemplateid-1315301230\listsimple{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat4\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 +\ltrch\fcs0 \fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listname ;}\listid323165344}{\list\listtemplateid-2135629362\listsimple{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext +\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \ab\ai0\af0 \ltrch\fcs0 \b\i0\fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listname ;}\listid429664987}{\list\listtemplateid1066166024\listsimple{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelold\levelspace0\levelindent720{\leveltext\'03(\'00);}{\levelnumbers\'02;}\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \fi-720\li720\lin720 }{\listname ;}\listid467551770}{\list\listtemplateid67698707\listsimple{\listlevel\levelnfc1\levelnfcn1 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listname ;}\listid499321070}{\list\listtemplateid67698707 +\listsimple{\listlevel\levelnfc1\levelnfcn1\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-720\li720\jclisttab\tx720\lin720 }{\listname +;}\listid505092311}{\list\listtemplateid67698709\listsimple{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat10\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li360 +\jclisttab\tx360\lin360 }{\listname ;}\listid1328901394}{\list\listtemplateid266515624\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 +\af0 \ltrch\fcs0 \fbias0 \fi-360\li1800\jclisttab\tx1800\lin1800 }{\listname ;}\listid1822691375}{\list\listtemplateid2081336888\listsimple{\listlevel\levelnfc3\levelnfcn3\leveljc0\leveljcn0\levelfollow0\levelstartat3\levelspace0\levelindent0{\leveltext +\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-420\li420\jclisttab\tx420\lin420 }{\listname ;}\listid1903103825}}{\*\listoverridetable{\listoverride\listid467551770\listoverridecount0\ls1}{\listoverride\listid1822691375 +\listoverridecount0\ls2}{\listoverride\listid1\listoverridecount0\ls3}{\listoverride\listid1328901394\listoverridecount0\ls4}{\listoverride\listid429664987\listoverridecount0\ls5}{\listoverride\listid505092311\listoverridecount0\ls6} +{\listoverride\listid499321070\listoverridecount0\ls7}{\listoverride\listid1903103825\listoverridecount0\ls8}{\listoverride\listid323165344\listoverridecount0\ls9}}{\*\rsidtbl \rsid1993739\rsid4991862\rsid7286274\rsid7288753}{\mmathPr\mmathFont34\mbrkBin0 +\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\title VARIFLEX MANUAL}{\author Chemistry Department}{\operator xisco}{\creatim\yr1999\mo7\dy16\hr9\min53}{\revtim\yr2020\mo4\dy20\hr14\min59} +{\printim\yr1999\mo7\dy16\hr10\min14}{\version9}{\edmins34}{\nofpages1}{\nofwords25}{\nofchars142}{\*\company }{\nofcharsws166}{\vern49247}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl1440\margr1440\margt1296\margb1296\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\hyphcaps0\horzdoc\dghspace120\dgvspace120 +\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot7286274 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4991862 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4991862 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4991862 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1033\langfe3082\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4991862 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\footerr \ltrpar \pard\plain \ltrpar\s38\ql \li0\ri0\sa120\nowidctlpar\tqc\tx4320\tqr\tx8640\pvpara\phmrg\posxc\posy0\wrapdefault\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 +\ltrch\fcs0 \fs24\lang1033\langfe3082\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 {\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs40\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 PAGE }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs40\lang1024\langfe1024\noproof\insrsid1993739 \hich\af0\dbch\af31505\loch\f0 1}}}\sectd \ltrsect\linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs40\insrsid4991862 +\par }\pard \ltrpar\s38\ql \li0\ri0\sa120\nowidctlpar\tqc\tx4320\tqr\tx8640\wrapdefault\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4991862 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s41\ql \li0\ri0\sa120\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin0\itap0 +\rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\caps\fs24\lang1033\langfe3082\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 + TOC \\o "1-3" }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 Overv\hich\af0\dbch\af31505\loch\f0 iew\tab }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\caps0\lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 GOTOBUTTON _Toc434317063 }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \caps0\lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 + PAGEREF _Toc434317063 }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \caps0\lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 3}}}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid4991862 +\par }\pard \ltrpar\s41\ql \li0\ri0\sa120\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin0\itap0\pararsid1993739 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 More detailed description +\tab }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \caps0\lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 GOTOBUTTON _Toc434317064 }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\caps0\lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 PAGEREF _Toc434317064 }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \caps0\lang1024\langfe1024\noproof\insrsid4991862 \hich\af0\dbch\af31505\loch\f0 4}}}\sectd \ltrsect +\linex0\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid4991862 +\par }}}\pard\plain \ltrpar\s41\ql \li0\ri0\sa120\nowidctlpar\tqr\tx9360\wrapdefault\faauto\adjustright\rin0\lin0\itap0\pararsid1993739 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 +\b\caps\fs24\lang1033\langfe3082\loch\af0\hich\af0\dbch\af31505\cgrid\langnp1033\langfenp3082 \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4991862 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 1; +\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 3;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 4;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 6; +\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 7;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 heading 9;\lsdunhideused1 \lsdlocked0 index 1;\lsdunhideused1 \lsdlocked0 index 2; +\lsdunhideused1 \lsdlocked0 index 3;\lsdunhideused1 \lsdlocked0 index 4;\lsdunhideused1 \lsdlocked0 index 5;\lsdunhideused1 \lsdlocked0 index 6;\lsdunhideused1 \lsdlocked0 index 7;\lsdunhideused1 \lsdlocked0 index 8;\lsdunhideused1 \lsdlocked0 index 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdunhideused1 \lsdlocked0 Normal Indent;\lsdunhideused1 \lsdlocked0 footnote text;\lsdunhideused1 \lsdlocked0 annotation text;\lsdunhideused1 \lsdlocked0 header;\lsdunhideused1 \lsdlocked0 index heading; +\lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdunhideused1 \lsdlocked0 table of figures;\lsdunhideused1 \lsdlocked0 envelope address;\lsdunhideused1 \lsdlocked0 envelope return;\lsdunhideused1 \lsdlocked0 footnote reference; +\lsdunhideused1 \lsdlocked0 annotation reference;\lsdunhideused1 \lsdlocked0 line number;\lsdunhideused1 \lsdlocked0 endnote reference;\lsdunhideused1 \lsdlocked0 endnote text;\lsdunhideused1 \lsdlocked0 table of authorities; +\lsdunhideused1 \lsdlocked0 macro;\lsdunhideused1 \lsdlocked0 toa heading;\lsdunhideused1 \lsdlocked0 List;\lsdunhideused1 \lsdlocked0 List Bullet;\lsdunhideused1 \lsdlocked0 List Number;\lsdunhideused1 \lsdlocked0 List 2; +\lsdunhideused1 \lsdlocked0 List 3;\lsdunhideused1 \lsdlocked0 List 4;\lsdunhideused1 \lsdlocked0 List 5;\lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdunhideused1 \lsdlocked0 List Bullet 3;\lsdunhideused1 \lsdlocked0 List Bullet 4; +\lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdunhideused1 \lsdlocked0 List Number 2;\lsdunhideused1 \lsdlocked0 List Number 3;\lsdunhideused1 \lsdlocked0 List Number 4;\lsdunhideused1 \lsdlocked0 List Number 5; +\lsdsemihidden0 \lsdqformat1 \lsdlocked0 Title;\lsdunhideused1 \lsdlocked0 Closing;\lsdunhideused1 \lsdlocked0 Signature;\lsdunhideused1 \lsdlocked0 Body Text Indent;\lsdunhideused1 \lsdlocked0 List Continue;\lsdunhideused1 \lsdlocked0 List Continue 2; +\lsdunhideused1 \lsdlocked0 List Continue 3;\lsdunhideused1 \lsdlocked0 List Continue 4;\lsdunhideused1 \lsdlocked0 List Continue 5;\lsdunhideused1 \lsdlocked0 Message Header;\lsdsemihidden0 \lsdqformat1 \lsdlocked0 Subtitle; +\lsdunhideused1 \lsdlocked0 Salutation;\lsdunhideused1 \lsdlocked0 Date;\lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdunhideused1 \lsdlocked0 Note Heading; +\lsdunhideused1 \lsdlocked0 Body Text 3;\lsdunhideused1 \lsdlocked0 Hyperlink;\lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdsemihidden0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdunhideused1 \lsdlocked0 Plain Text;\lsdunhideused1 \lsdlocked0 E-mail Signature;\lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdunhideused1 \lsdlocked0 Normal (Web); +\lsdunhideused1 \lsdlocked0 HTML Acronym;\lsdunhideused1 \lsdlocked0 HTML Address;\lsdunhideused1 \lsdlocked0 HTML Cite;\lsdunhideused1 \lsdlocked0 HTML Code;\lsdunhideused1 \lsdlocked0 HTML Definition;\lsdunhideused1 \lsdlocked0 HTML Keyboard; +\lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdunhideused1 \lsdlocked0 HTML Sample;\lsdunhideused1 \lsdlocked0 HTML Typewriter;\lsdunhideused1 \lsdlocked0 HTML Variable;\lsdunhideused1 \lsdlocked0 Normal Table; +\lsdunhideused1 \lsdlocked0 annotation subject;\lsdunhideused1 \lsdlocked0 No List;\lsdunhideused1 \lsdlocked0 Outline List 1;\lsdunhideused1 \lsdlocked0 Outline List 2;\lsdunhideused1 \lsdlocked0 Outline List 3;\lsdunhideused1 \lsdlocked0 Table Simple 1; +\lsdunhideused1 \lsdlocked0 Table Simple 2;\lsdunhideused1 \lsdlocked0 Table Simple 3;\lsdunhideused1 \lsdlocked0 Table Classic 1;\lsdunhideused1 \lsdlocked0 Table Classic 2;\lsdunhideused1 \lsdlocked0 Table Classic 3; +\lsdunhideused1 \lsdlocked0 Table Classic 4;\lsdunhideused1 \lsdlocked0 Table Colorful 1;\lsdunhideused1 \lsdlocked0 Table Colorful 2;\lsdunhideused1 \lsdlocked0 Table Colorful 3;\lsdunhideused1 \lsdlocked0 Table Columns 1; +\lsdunhideused1 \lsdlocked0 Table Columns 2;\lsdunhideused1 \lsdlocked0 Table Columns 3;\lsdunhideused1 \lsdlocked0 Table Columns 4;\lsdunhideused1 \lsdlocked0 Table Columns 5;\lsdunhideused1 \lsdlocked0 Table Grid 1; +\lsdunhideused1 \lsdlocked0 Table Grid 2;\lsdunhideused1 \lsdlocked0 Table Grid 3;\lsdunhideused1 \lsdlocked0 Table Grid 4;\lsdunhideused1 \lsdlocked0 Table Grid 5;\lsdunhideused1 \lsdlocked0 Table Grid 6;\lsdunhideused1 \lsdlocked0 Table Grid 7; +\lsdunhideused1 \lsdlocked0 Table Grid 8;\lsdunhideused1 \lsdlocked0 Table List 1;\lsdunhideused1 \lsdlocked0 Table List 2;\lsdunhideused1 \lsdlocked0 Table List 3;\lsdunhideused1 \lsdlocked0 Table List 4;\lsdunhideused1 \lsdlocked0 Table List 5; +\lsdunhideused1 \lsdlocked0 Table List 6;\lsdunhideused1 \lsdlocked0 Table List 7;\lsdunhideused1 \lsdlocked0 Table List 8;\lsdunhideused1 \lsdlocked0 Table 3D effects 1;\lsdunhideused1 \lsdlocked0 Table 3D effects 2; +\lsdunhideused1 \lsdlocked0 Table 3D effects 3;\lsdunhideused1 \lsdlocked0 Table Contemporary;\lsdunhideused1 \lsdlocked0 Table Elegant;\lsdunhideused1 \lsdlocked0 Table Professional;\lsdunhideused1 \lsdlocked0 Table Subtle 1; +\lsdunhideused1 \lsdlocked0 Table Subtle 2;\lsdunhideused1 \lsdlocked0 Table Web 1;\lsdunhideused1 \lsdlocked0 Table Web 2;\lsdunhideused1 \lsdlocked0 Table Web 3;\lsdunhideused1 \lsdlocked0 Balloon Text; +\lsdsemihidden0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused1 \lsdlocked0 Table Theme;\lsdsemihidden0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdsemihidden0 \lsdpriority60 \lsdlocked0 Light Shading; +\lsdsemihidden0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdpriority62 \lsdlocked0 Light Grid;\lsdsemihidden0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdsemihidden0 \lsdpriority65 \lsdlocked0 Medium List 1;\lsdsemihidden0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdpriority71 \lsdlocked0 Colorful Shading;\lsdsemihidden0 \lsdpriority72 \lsdlocked0 Colorful List; +\lsdsemihidden0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdsemihidden0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1; +\lsdsemihidden0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdsemihidden0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;\lsdsemihidden0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference; +\lsdsemihidden0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdsemihidden0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000b09e +73861317d601feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/sw/qa/extras/ooxmlexport/data/tdf129575-directAfter.docx b/sw/qa/extras/ooxmlexport/data/tdf129575-directAfter.docx new file mode 100644 index 0000000000..c9856b0285 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129575-directAfter.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129575-directBefore.docx b/sw/qa/extras/ooxmlexport/data/tdf129575-directBefore.docx new file mode 100644 index 0000000000..5e75ef1be5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129575-directBefore.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129575-docDefault.docx b/sw/qa/extras/ooxmlexport/data/tdf129575-docDefault.docx new file mode 100644 index 0000000000..d7cdf2ec43 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129575-docDefault.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129575-styleAfter.docx b/sw/qa/extras/ooxmlexport/data/tdf129575-styleAfter.docx new file mode 100644 index 0000000000..97439011ff Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129575-styleAfter.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129888dml.docx b/sw/qa/extras/ooxmlexport/data/tdf129888dml.docx new file mode 100644 index 0000000000..1f6b03034f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129888dml.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf129888vml.docx b/sw/qa/extras/ooxmlexport/data/tdf129888vml.docx new file mode 100644 index 0000000000..ee7c60f8a8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf129888vml.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf130088.docx b/sw/qa/extras/ooxmlexport/data/tdf130088.docx new file mode 100644 index 0000000000..8d5a7a604b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130088.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf130120.docx b/sw/qa/extras/ooxmlexport/data/tdf130120.docx new file mode 100644 index 0000000000..5ca2adc76d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130120.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf130494.docx b/sw/qa/extras/ooxmlexport/data/tdf130494.docx new file mode 100644 index 0000000000..bc2050feaa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130494.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf130610_bold_in_2_styles.ott b/sw/qa/extras/ooxmlexport/data/tdf130610_bold_in_2_styles.ott new file mode 100644 index 0000000000..35937d9a8a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130610_bold_in_2_styles.ott differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf130690.docx b/sw/qa/extras/ooxmlexport/data/tdf130690.docx new file mode 100644 index 0000000000..ab08dd99a3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130690.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf130814.docx b/sw/qa/extras/ooxmlexport/data/tdf130814.docx new file mode 100644 index 0000000000..30c17120ec Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130814.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf130907.docx b/sw/qa/extras/ooxmlexport/data/tdf130907.docx new file mode 100644 index 0000000000..c0c25fc895 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf130907.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131203.docx b/sw/qa/extras/ooxmlexport/data/tdf131203.docx new file mode 100644 index 0000000000..2fd0dcabde Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131203.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131258.docx b/sw/qa/extras/ooxmlexport/data/tdf131258.docx new file mode 100644 index 0000000000..10b8f9de21 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131258.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131260.docx b/sw/qa/extras/ooxmlexport/data/tdf131260.docx new file mode 100644 index 0000000000..72e07abfd4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131260.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131420.docx b/sw/qa/extras/ooxmlexport/data/tdf131420.docx new file mode 100644 index 0000000000..3600735245 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131420.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131537.odt b/sw/qa/extras/ooxmlexport/data/tdf131537.odt new file mode 100644 index 0000000000..21f3963689 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131537.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131539.odt b/sw/qa/extras/ooxmlexport/data/tdf131539.odt new file mode 100644 index 0000000000..d0e446522a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131539.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131540.odt b/sw/qa/extras/ooxmlexport/data/tdf131540.odt new file mode 100644 index 0000000000..541ab20931 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131540.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131561_necessaryBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf131561_necessaryBorder.docx new file mode 100644 index 0000000000..51d1c52022 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131561_necessaryBorder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131594.docx b/sw/qa/extras/ooxmlexport/data/tdf131594.docx new file mode 100644 index 0000000000..009c6d56bd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131594.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131722.docx b/sw/qa/extras/ooxmlexport/data/tdf131722.docx new file mode 100644 index 0000000000..8b72ad4b86 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131722.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131775_SpacingGroupShapeText.docx b/sw/qa/extras/ooxmlexport/data/tdf131775_SpacingGroupShapeText.docx new file mode 100644 index 0000000000..a7d34d6f24 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131775_SpacingGroupShapeText.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131776_StrikeoutGroupShapeText.docx b/sw/qa/extras/ooxmlexport/data/tdf131776_StrikeoutGroupShapeText.docx new file mode 100644 index 0000000000..3fd4ab1f5f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131776_StrikeoutGroupShapeText.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131801.docx b/sw/qa/extras/ooxmlexport/data/tdf131801.docx new file mode 100644 index 0000000000..61872b5399 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131801.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf131922_LanguageInGroupShape.docx b/sw/qa/extras/ooxmlexport/data/tdf131922_LanguageInGroupShape.docx new file mode 100644 index 0000000000..afd5ec57ae Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf131922_LanguageInGroupShape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak.odt b/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak.odt new file mode 100644 index 0000000000..b88e660a74 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak2.odt b/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak2.odt new file mode 100644 index 0000000000..afa7961cb2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreak2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreakB.odt b/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreakB.odt new file mode 100644 index 0000000000..86ea177a9f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132149_pgBreakB.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132185.docx b/sw/qa/extras/ooxmlexport/data/tdf132185.docx new file mode 100644 index 0000000000..955de50979 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132185.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132271.docx b/sw/qa/extras/ooxmlexport/data/tdf132271.docx new file mode 100644 index 0000000000..202bfdda2b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132271.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132305.docx b/sw/qa/extras/ooxmlexport/data/tdf132305.docx new file mode 100644 index 0000000000..e6b9ad6b70 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132305.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132475_printField.docx b/sw/qa/extras/ooxmlexport/data/tdf132475_printField.docx new file mode 100644 index 0000000000..032a58d238 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132475_printField.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132483.docx b/sw/qa/extras/ooxmlexport/data/tdf132483.docx new file mode 100644 index 0000000000..e4ebf4b785 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132483.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132491_UnderlineColorGroupedShapes.docx b/sw/qa/extras/ooxmlexport/data/tdf132491_UnderlineColorGroupedShapes.docx new file mode 100644 index 0000000000..aa5528b310 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132491_UnderlineColorGroupedShapes.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132514.docx b/sw/qa/extras/ooxmlexport/data/tdf132514.docx new file mode 100644 index 0000000000..d32f84104e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132514.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132752.docx b/sw/qa/extras/ooxmlexport/data/tdf132752.docx new file mode 100644 index 0000000000..a94fc498a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132752.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132754.docx b/sw/qa/extras/ooxmlexport/data/tdf132754.docx new file mode 100644 index 0000000000..baec54f5e0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132754.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132766.docx b/sw/qa/extras/ooxmlexport/data/tdf132766.docx new file mode 100644 index 0000000000..aba5e82312 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132766.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132802.docx b/sw/qa/extras/ooxmlexport/data/tdf132802.docx new file mode 100644 index 0000000000..c4c2d9a1e2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132802.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132807.docx b/sw/qa/extras/ooxmlexport/data/tdf132807.docx new file mode 100644 index 0000000000..b1e4115c5d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132807.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx new file mode 100644 index 0000000000..50ebe7a297 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132898_extraBorder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx b/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx new file mode 100644 index 0000000000..54856dea55 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132898_missingBorder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf132976_testRelativeAnchorWidthFromLeftMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf132976_testRelativeAnchorWidthFromLeftMargin.docx new file mode 100644 index 0000000000..2f1c5560c1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf132976_testRelativeAnchorWidthFromLeftMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133000_numStyleFormatting.docx b/sw/qa/extras/ooxmlexport/data/tdf133000_numStyleFormatting.docx new file mode 100644 index 0000000000..567f38265c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133000_numStyleFormatting.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133030.docx b/sw/qa/extras/ooxmlexport/data/tdf133030.docx new file mode 100644 index 0000000000..e23f09adfc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133030.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133035.docx b/sw/qa/extras/ooxmlexport/data/tdf133035.docx new file mode 100644 index 0000000000..c28c119dbc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133035.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133045_TestShapeAlignmentRelativeFromTopMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf133045_TestShapeAlignmentRelativeFromTopMargin.docx new file mode 100644 index 0000000000..aa976e7cc9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133045_TestShapeAlignmentRelativeFromTopMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133052.docx b/sw/qa/extras/ooxmlexport/data/tdf133052.docx new file mode 100644 index 0000000000..937554facd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133052.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133065.odt b/sw/qa/extras/ooxmlexport/data/tdf133065.odt new file mode 100644 index 0000000000..a5e1b3587a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133065.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginHasFooter.docx b/sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginHasFooter.docx new file mode 100644 index 0000000000..2625a9a56a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginHasFooter.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginNoFooter.docx b/sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginNoFooter.docx new file mode 100644 index 0000000000..155e748574 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133070_testRelativeAnchorHeightFromBottomMarginNoFooter.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133163.fodt b/sw/qa/extras/ooxmlexport/data/tdf133163.fodt new file mode 100644 index 0000000000..8fdda1cdc5 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf133163.fodt @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 6 + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf133334_followPgStyle.odt b/sw/qa/extras/ooxmlexport/data/tdf133334_followPgStyle.odt new file mode 100644 index 0000000000..56f21545a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133334_followPgStyle.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133363.docx b/sw/qa/extras/ooxmlexport/data/tdf133363.docx new file mode 100644 index 0000000000..937554facd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133363.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133370_columnBreak.odt b/sw/qa/extras/ooxmlexport/data/tdf133370_columnBreak.odt new file mode 100644 index 0000000000..1848638aba Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133370_columnBreak.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133455.docx b/sw/qa/extras/ooxmlexport/data/tdf133455.docx new file mode 100644 index 0000000000..e852976995 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133455.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133457.docx b/sw/qa/extras/ooxmlexport/data/tdf133457.docx new file mode 100644 index 0000000000..8fb6730b09 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133457.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133473.docx b/sw/qa/extras/ooxmlexport/data/tdf133473.docx new file mode 100644 index 0000000000..c351db9502 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133473.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133605.docx b/sw/qa/extras/ooxmlexport/data/tdf133605.docx new file mode 100644 index 0000000000..d248d5e1a9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133605.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133605_2.docx b/sw/qa/extras/ooxmlexport/data/tdf133605_2.docx new file mode 100644 index 0000000000..8d3c5acba6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133605_2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133643.doc b/sw/qa/extras/ooxmlexport/data/tdf133643.doc new file mode 100644 index 0000000000..52db5e344f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133643.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133647.docx b/sw/qa/extras/ooxmlexport/data/tdf133647.docx new file mode 100644 index 0000000000..fb525446c7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133647.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133670_testRelativeAnchorWidthFromRightMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf133670_testRelativeAnchorWidthFromRightMargin.docx new file mode 100644 index 0000000000..68f24370a3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133670_testRelativeAnchorWidthFromRightMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133701.docx b/sw/qa/extras/ooxmlexport/data/tdf133701.docx new file mode 100644 index 0000000000..dfef409c26 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133701.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133702.docx b/sw/qa/extras/ooxmlexport/data/tdf133702.docx new file mode 100644 index 0000000000..46e08a920c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133702.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133771.odt b/sw/qa/extras/ooxmlexport/data/tdf133771.odt new file mode 100644 index 0000000000..fd54160af9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133771.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133861_RelativeAnchorWidthFromInsideOutsideMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf133861_RelativeAnchorWidthFromInsideOutsideMargin.docx new file mode 100644 index 0000000000..216434db3c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133861_RelativeAnchorWidthFromInsideOutsideMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf133924.docx b/sw/qa/extras/ooxmlexport/data/tdf133924.docx new file mode 100644 index 0000000000..3bdbe8d6f1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf133924.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134063.docx b/sw/qa/extras/ooxmlexport/data/tdf134063.docx new file mode 100644 index 0000000000..864c90db1c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134063.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134114_allowOverlap.docx b/sw/qa/extras/ooxmlexport/data/tdf134114_allowOverlap.docx new file mode 100644 index 0000000000..637d4b6b94 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134114_allowOverlap.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134260.docx b/sw/qa/extras/ooxmlexport/data/tdf134260.docx new file mode 100644 index 0000000000..98c4107f48 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134260.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134569_nestedTable.docx b/sw/qa/extras/ooxmlexport/data/tdf134569_nestedTable.docx new file mode 100644 index 0000000000..7fb07eb32a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134569_nestedTable.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134606.docx b/sw/qa/extras/ooxmlexport/data/tdf134606.docx new file mode 100644 index 0000000000..c5b95cef32 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134606.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134609_gridAfter.docx b/sw/qa/extras/ooxmlexport/data/tdf134609_gridAfter.docx new file mode 100644 index 0000000000..64f8e08186 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134609_gridAfter.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134618.doc b/sw/qa/extras/ooxmlexport/data/tdf134618.doc new file mode 100644 index 0000000000..693ab87e21 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134618.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134619_numberingProps.doc b/sw/qa/extras/ooxmlexport/data/tdf134619_numberingProps.doc new file mode 100644 index 0000000000..742b45ce65 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134619_numberingProps.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134648.docx b/sw/qa/extras/ooxmlexport/data/tdf134648.docx new file mode 100644 index 0000000000..36e856ca05 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134648.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134649_pageBreak.fodt b/sw/qa/extras/ooxmlexport/data/tdf134649_pageBreak.fodt new file mode 100644 index 0000000000..7d05c3e3ce --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf134649_pageBreak.fodt @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Two tables, one pagebreak: + + + + + + Hello1 + + + + + + + + World1 + + + + + + + + + + + + Hello2 + + + + + + + + World2 + + + + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf134784.docx b/sw/qa/extras/ooxmlexport/data/tdf134784.docx new file mode 100644 index 0000000000..2099db66e0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134784.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf134951_duplicates.odt b/sw/qa/extras/ooxmlexport/data/tdf134951_duplicates.odt new file mode 100644 index 0000000000..d7089944d0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf134951_duplicates.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135047_ImageSpaceSettings.fodt b/sw/qa/extras/ooxmlexport/data/tdf135047_ImageSpaceSettings.fodt new file mode 100644 index 0000000000..47dac15a5b --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf135047_ImageSpaceSettings.fodt @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgK + CgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAACAAIBAREA/8QAFAAB + AAAAAAAAAAAAAAAAAAAACP/EAB4QAAAEBwAAAAAAAAAAAAAAAAACBAUGFiU0Q1Nh/9oACAEB + AAA/AD/CzM0Sw0UpHYJ8BdZeD//Z + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum consequat mi quis pretium semper. Proin luctus orci ac neque venenatis, quis commodo dolor posuere. Curabitur dignissim sapien quis cursus egestas. Donec blandit auctor arcu, nec pellentesque eros molestie eget. In consectetur aliquam hendrerit. Sed cursus mauris vitae ligula pellentesque, non pellentesque urna aliquet. Fusce placerat mauris enim, nec rutrum purus semper vel. Praesent tincidunt neque eu pellentesque pharetra. Fusce pellentesque est orci. + Integer sodales tincidunt tristique. Sed a metus posuere, adipiscing nunc et, viverra odio. Donec auctor molestie sem, sit amet tristique lectus hendrerit sed. Cras sodales nisl sed orci mattis iaculis. Nunc eget dolor accumsan, pharetra risus a, vestibulum mauris. Nunc vulputate lobortis mollis. Vivamus nec tellus faucibus, tempor magna nec, facilisis felis. Donec commodo enim a vehicula pellentesque. Nullam vehicula vestibulum est vel ultricies. + Aliquam velit massa, laoreet vel leo nec, volutpat facilisis eros. Donec consequat arcu ut diam tempor luctus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent vitae lacus vel leo sodales pharetra a a nibh. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam luctus tempus nibh, fringilla dictum augue consectetur eget. Curabitur at ante sit amet tortor pharetra molestie eu nec ante. Mauris tincidunt, nibh eu sollicitudin molestie, dolor sapien congue tortor, a pulvinar sapien turpis sed ante. Donec nec est elementum, euismod nulla in, mollis nunc. + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf135164_cancelledNumbering.docx b/sw/qa/extras/ooxmlexport/data/tdf135164_cancelledNumbering.docx new file mode 100644 index 0000000000..47008b69d9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135164_cancelledNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135187.docx b/sw/qa/extras/ooxmlexport/data/tdf135187.docx new file mode 100644 index 0000000000..98a151048f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135187.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135329_lostImage.odt b/sw/qa/extras/ooxmlexport/data/tdf135329_lostImage.odt new file mode 100644 index 0000000000..234109a141 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135329_lostImage.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c12v3.docx b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c12v3.docx new file mode 100644 index 0000000000..b51e53124b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c12v3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14.docx b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14.docx new file mode 100644 index 0000000000..25505bddda Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14v2.docx b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14v2.docx new file mode 100644 index 0000000000..064e62f707 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c14v2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c15.docx b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c15.docx new file mode 100644 index 0000000000..f4bd1ff12e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135343_columnSectionBreak_c15.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap.odt b/sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap.odt new file mode 100644 index 0000000000..145a6af8da Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap_c12.docx b/sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap_c12.docx new file mode 100644 index 0000000000..00c1353d98 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135595_HFtableWrap_c12.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135653.docx b/sw/qa/extras/ooxmlexport/data/tdf135653.docx new file mode 100644 index 0000000000..b53777f819 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135653.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135655.odt b/sw/qa/extras/ooxmlexport/data/tdf135655.odt new file mode 100644 index 0000000000..06933eb3fa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135655.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135660.docx b/sw/qa/extras/ooxmlexport/data/tdf135660.docx new file mode 100644 index 0000000000..2309c9b0ac Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135660.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135665.docx b/sw/qa/extras/ooxmlexport/data/tdf135665.docx new file mode 100644 index 0000000000..2400a1c1a4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135665.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135667.odt b/sw/qa/extras/ooxmlexport/data/tdf135667.odt new file mode 100644 index 0000000000..2db8ade966 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135667.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135774_numberingCRProps.docx b/sw/qa/extras/ooxmlexport/data/tdf135774_numberingCRProps.docx new file mode 100644 index 0000000000..697db308e3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135774_numberingCRProps.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135774_numberingShading.docx b/sw/qa/extras/ooxmlexport/data/tdf135774_numberingShading.docx new file mode 100644 index 0000000000..9f62ef2a5a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135774_numberingShading.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135786.docx b/sw/qa/extras/ooxmlexport/data/tdf135786.docx new file mode 100644 index 0000000000..b766b1905a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135786.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135906.docx b/sw/qa/extras/ooxmlexport/data/tdf135906.docx new file mode 100644 index 0000000000..701fccff5e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135906.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135923-min.docx b/sw/qa/extras/ooxmlexport/data/tdf135923-min.docx new file mode 100644 index 0000000000..34bc964214 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135923-min.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135943_shapeWithText_LayoutInCell0_compat15.docx b/sw/qa/extras/ooxmlexport/data/tdf135943_shapeWithText_LayoutInCell0_compat15.docx new file mode 100644 index 0000000000..b4bbcb94e8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135943_shapeWithText_LayoutInCell0_compat15.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135949_anchoredBeforeBreak.docx b/sw/qa/extras/ooxmlexport/data/tdf135949_anchoredBeforeBreak.docx new file mode 100644 index 0000000000..6b61be383d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135949_anchoredBeforeBreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf135973.odt b/sw/qa/extras/ooxmlexport/data/tdf135973.odt new file mode 100644 index 0000000000..0eb42080f9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf135973.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136059.odt b/sw/qa/extras/ooxmlexport/data/tdf136059.odt new file mode 100644 index 0000000000..50d808d12f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136059.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonCurve.odt b/sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonCurve.odt new file mode 100644 index 0000000000..70a8b7a5b4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonCurve.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonLineShape.odt b/sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonLineShape.odt new file mode 100644 index 0000000000..5d193f56ed Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136386_WrapPolygonLineShape.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136404.fodt b/sw/qa/extras/ooxmlexport/data/tdf136404.fodt new file mode 100644 index 0000000000..9ac902d45b --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf136404.fodt @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + 6 + + + + + + + + + 10 + + + text + + + text + + + + + 2 + + + 8 + + + 60 + + + 0 + + + 0 + + + ** Expression is faulty ** + + + ** Expression is faulty ** + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf136441_commentInFootnote.odt b/sw/qa/extras/ooxmlexport/data/tdf136441_commentInFootnote.odt new file mode 100644 index 0000000000..61c9632b39 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136441_commentInFootnote.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136589_paraHadField.docx b/sw/qa/extras/ooxmlexport/data/tdf136589_paraHadField.docx new file mode 100644 index 0000000000..c4cf7a139a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136589_paraHadField.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136617.docx b/sw/qa/extras/ooxmlexport/data/tdf136617.docx new file mode 100644 index 0000000000..e7b35aa295 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136617.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136667.docx b/sw/qa/extras/ooxmlexport/data/tdf136667.docx new file mode 100644 index 0000000000..e5b047ee33 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136667.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136814.odt b/sw/qa/extras/ooxmlexport/data/tdf136814.odt new file mode 100644 index 0000000000..2318de04b7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136814.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136841.docx b/sw/qa/extras/ooxmlexport/data/tdf136841.docx new file mode 100644 index 0000000000..6f9020ee17 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136841.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136850.docx b/sw/qa/extras/ooxmlexport/data/tdf136850.docx new file mode 100644 index 0000000000..e94a66208e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136850.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136929_framesOfParagraph.odt b/sw/qa/extras/ooxmlexport/data/tdf136929_framesOfParagraph.odt new file mode 100644 index 0000000000..918b24f670 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136929_framesOfParagraph.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf136952_pgBreak3B.odt b/sw/qa/extras/ooxmlexport/data/tdf136952_pgBreak3B.odt new file mode 100644 index 0000000000..e39ebdef2b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf136952_pgBreak3B.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137295.doc b/sw/qa/extras/ooxmlexport/data/tdf137295.doc new file mode 100644 index 0000000000..915b7d62d9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137295.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137466.docx b/sw/qa/extras/ooxmlexport/data/tdf137466.docx new file mode 100644 index 0000000000..3c5977251b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137466.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137593.docx b/sw/qa/extras/ooxmlexport/data/tdf137593.docx new file mode 100644 index 0000000000..8b63fd39a8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137593.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137641_RelativeFromTopMargin.docx b/sw/qa/extras/ooxmlexport/data/tdf137641_RelativeFromTopMargin.docx new file mode 100644 index 0000000000..2cd299ff21 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137641_RelativeFromTopMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137642_Vertical_Alignment_toppage.docx b/sw/qa/extras/ooxmlexport/data/tdf137642_Vertical_Alignment_toppage.docx new file mode 100644 index 0000000000..fbe8b264bb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137642_Vertical_Alignment_toppage.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137655.docx b/sw/qa/extras/ooxmlexport/data/tdf137655.docx new file mode 100644 index 0000000000..d87d434b32 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137655.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137678_testVmlLineShapeMirroredY.docx b/sw/qa/extras/ooxmlexport/data/tdf137678_testVmlLineShapeMirroredY.docx new file mode 100644 index 0000000000..1559358b56 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137678_testVmlLineShapeMirroredY.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137683_charHighlightTests.docx b/sw/qa/extras/ooxmlexport/data/tdf137683_charHighlightTests.docx new file mode 100644 index 0000000000..7d1e3be60f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137683_charHighlightTests.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137742.docx b/sw/qa/extras/ooxmlexport/data/tdf137742.docx new file mode 100644 index 0000000000..26b3e91860 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137742.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137765_testVmlLineShapeRotated.docx b/sw/qa/extras/ooxmlexport/data/tdf137765_testVmlLineShapeRotated.docx new file mode 100644 index 0000000000..d411d7cda6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137765_testVmlLineShapeRotated.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137850_compat14ZOrder.docx b/sw/qa/extras/ooxmlexport/data/tdf137850_compat14ZOrder.docx new file mode 100644 index 0000000000..ab2715c1a2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137850_compat14ZOrder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf137850_compat15ZOrder.docx b/sw/qa/extras/ooxmlexport/data/tdf137850_compat15ZOrder.docx new file mode 100644 index 0000000000..07158e4c73 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf137850_compat15ZOrder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138093.docx b/sw/qa/extras/ooxmlexport/data/tdf138093.docx new file mode 100644 index 0000000000..097fbb1351 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138093.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138345_charStyleHighlight.docx b/sw/qa/extras/ooxmlexport/data/tdf138345_charStyleHighlight.docx new file mode 100644 index 0000000000..14c9aac9ff Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138345_charStyleHighlight.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138345_numberingHighlight.docx b/sw/qa/extras/ooxmlexport/data/tdf138345_numberingHighlight.docx new file mode 100644 index 0000000000..0083b1b38d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138345_numberingHighlight.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138374.odt b/sw/qa/extras/ooxmlexport/data/tdf138374.odt new file mode 100644 index 0000000000..86e3f87099 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138374.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138612.docx b/sw/qa/extras/ooxmlexport/data/tdf138612.docx new file mode 100644 index 0000000000..dd116044b5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138612.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138739.docx b/sw/qa/extras/ooxmlexport/data/tdf138739.docx new file mode 100644 index 0000000000..7b5bb302bf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138739.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138771.docx b/sw/qa/extras/ooxmlexport/data/tdf138771.docx new file mode 100644 index 0000000000..70b035508b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138771.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138780.odt b/sw/qa/extras/ooxmlexport/data/tdf138780.odt new file mode 100644 index 0000000000..3e7a96a029 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138780.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138892_noNumbering.docx b/sw/qa/extras/ooxmlexport/data/tdf138892_noNumbering.docx new file mode 100644 index 0000000000..5c0a0176e3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138892_noNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf138899.docx b/sw/qa/extras/ooxmlexport/data/tdf138899.docx new file mode 100644 index 0000000000..3e346ac0e4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf138899.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf139128.odt b/sw/qa/extras/ooxmlexport/data/tdf139128.odt new file mode 100644 index 0000000000..544527c069 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf139128.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf139549.docx b/sw/qa/extras/ooxmlexport/data/tdf139549.docx new file mode 100644 index 0000000000..6e76ae57c0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf139549.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf139580.odt b/sw/qa/extras/ooxmlexport/data/tdf139580.odt new file mode 100644 index 0000000000..48224c8dab Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf139580.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf139759_commentHighlightBackground.docx b/sw/qa/extras/ooxmlexport/data/tdf139759_commentHighlightBackground.docx new file mode 100644 index 0000000000..487439a5cf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf139759_commentHighlightBackground.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf139948.docx b/sw/qa/extras/ooxmlexport/data/tdf139948.docx new file mode 100644 index 0000000000..1b3f7df000 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf139948.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf140137.docx b/sw/qa/extras/ooxmlexport/data/tdf140137.docx new file mode 100644 index 0000000000..d03925e75e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf140137.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf140182_extraPagebreak.docx b/sw/qa/extras/ooxmlexport/data/tdf140182_extraPagebreak.docx new file mode 100644 index 0000000000..be47d79c5b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf140182_extraPagebreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf140336_paraNoneShading.odt b/sw/qa/extras/ooxmlexport/data/tdf140336_paraNoneShading.odt new file mode 100644 index 0000000000..c4bd80f1a6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf140336_paraNoneShading.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docx b/sw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docx new file mode 100644 index 0000000000..fd176dc8c8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf140597.docx b/sw/qa/extras/ooxmlexport/data/tdf140597.docx new file mode 100644 index 0000000000..36db7d9bea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf140597.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf140668.docx b/sw/qa/extras/ooxmlexport/data/tdf140668.docx new file mode 100644 index 0000000000..d7072187bb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf140668.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf141172.docx b/sw/qa/extras/ooxmlexport/data/tdf141172.docx new file mode 100644 index 0000000000..0e1647ae27 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf141172.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf141173_missingFrames.rtf b/sw/qa/extras/ooxmlexport/data/tdf141173_missingFrames.rtf new file mode 100644 index 0000000000..6ccc1de58e --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf141173_missingFrames.rtf @@ -0,0 +1,61 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang3082\deflangfe3082{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f36\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Frutiger LT 65 Bold;}{\f37\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Frutiger LT 45 Light;}{\f38\fscript\fcharset0\fprq2{\*\panose 00000000000000000000}Comic Sans MS;} +{\f39\froman\fcharset238\fprq2 Times New Roman CE;}{\f40\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f42\froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\froman\fcharset162\fprq2 Times New Roman Tur;} +{\f44\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\f49\fswiss\fcharset238\fprq2 Arial CE;}{\f50\fswiss\fcharset204\fprq2 Arial Cyr;}{\f52\fswiss\fcharset161\fprq2 Arial Greek;}{\f53\fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fswiss\fcharset177\fprq2 Arial (Hebrew);} +{\f55\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f56\fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f419\fscript\fcharset238\fprq2 Comic Sans MS CE;}{\f420\fscript\fcharset204\fprq2 Comic Sans MS Cyr;} +{\f422\fscript\fcharset161\fprq2 Comic Sans MS Greek;}{\f423\fscript\fcharset162\fprq2 Comic Sans MS Tur;}{\f426\fscript\fcharset186\fprq2 Comic Sans MS Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255; +\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0; +\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \snext0 Normal;}{\*\cs10 \additive \ssemihidden +Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid10428813\rsid14756311} +{\*\generator Microsoft Word 11.0.5604;}{\info{\author Crystal Reports}{\doccomm Powered By Crystal}{\operator GESTION}{\creatim\yr2014\mo7\dy4\hr10\min47}{\revtim\yr2014\mo7\dy4\hr11\min19}{\version3}{\edmins7}{\nofpages2}{\nofwords155}{\nofchars857} +{\*\company Crystal Decisions}{\nofcharsws1010}{\vern24689}}\paperw11904\paperh16836\margl192\margr192\margt240\margb242 \widowctrl\ftnbj\aenddoc\hyphhotz425\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120 +\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot14756311 \fet0\sectd \sbknone\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\pvpg\phpg\posx762\posy1182\absh-228\absw1653\faauto\rin0\lin0\itap0 \fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 { +\lang1024\langfe1024\noproof\insrsid10428813 {\shp{\shprslt{\*\do\dobxpage\dobypage\dodhgt1\dpline\dpptx0\dppty0\dpptx10945\dppty0\dpx306\dpy16065\dpxsize10945\dpysize0\dplinew20\dplinecor0\dplinecog0\dplinecob0}}}}{\f36\insrsid14756311 + +\par }\pard \qc \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\tx5400\tx5760\pvpg\phpg\posx2944\posy3235\absh-1764\absw5927\faauto\rin0\lin0\itap0 { +\lang1024\langfe1024\noproof\insrsid10428813 {\shp{\*\shpinst\shpleft192\shptop840\shpright670\shpbottom1852\shpfhdr0\shpbxpage\shpbxignore\shpbypage\shpbyignore\shpwr3\shpwrk0\shpfblwtxt1\shpz3\shplid1028 +{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pib}{\sv +}}{\sp{\sn posrelh}{\sv 1}}{\sp{\sn posrelv}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 0}}{\sp{\sn fBehindDocument}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 0}}}{\shprslt\par\pard +\ql \li0\ri0\widctlpar\pvpg\phpg\posx191\posy839\dxfrtext180\dfrmtxtx180\dfrmtxty0\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \par}} +}{\f38\fs23\cf1\insrsid14756311\charrsid14756311 Se convoca CONSEJO ESCOLAR}{\f38\insrsid14756311\charrsid14756311 +\par }{\f38\fs23\cf1\insrsid14756311\charrsid14756311 de car\'e1cter ORDINARIO,}{\f38\insrsid14756311\charrsid14756311 +\par }{\f38\fs23\cf1\insrsid14756311\charrsid14756311 que tendr\'e1 lugar el pr\'f3ximo d\'eda 09/07/2014, }{\f38\fs23\cf1\insrsid14756311 a las 7 de la tarde }{\f38\fs23\cf1\insrsid14756311\charrsid14756311 en SALA DE PROFESORES ,}{ +\f38\insrsid14756311\charrsid14756311 +\par }{\f38\fs23\cf1\insrsid14756311\charrsid14756311 con el siguiente }{\b\f38\fs23\ul\cf1\insrsid14756311\charrsid14756311 ORDEN DEL D\'cdA:}{\f38\insrsid14756311\charrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\tx5400\tx5760\tx6120\tx6480\tx6840\tx7200\tx7560\tx7920\tx8280\tx8640\tx9000\tx9360\tx9720\tx10080\pvpg\phpg +\posx707\posy6035\absh-5856\absw10180\faauto\rin0\lin0\itap0 {\f38\fs28\cf1\insrsid14756311\charrsid14756311 1.- Lectura y aprobaci\'f3n del acta anterior, si procede.}{\f38\fs28\insrsid14756311\charrsid14756311 +\par }{\f38\fs28\cf1\insrsid14756311\charrsid14756311 2.- An\'e1lisis de los resultados de la evaluaci\'f3n Final.}{\f38\fs28\insrsid14756311\charrsid14756311 +\par }{\f38\fs28\cf1\insrsid14756311\charrsid14756311 3.- Resultados de la prueba de diagn\'f3stico de los alumnos de 4\'ba de Primaria.}{\f38\fs28\cf1\insrsid14756311 +\par }{\f38\fs28\cf1\insrsid10428813 4.- Normativa de biling\'fce para el curso pr\'f3ximo.}{\f38\fs28\insrsid10428813\charrsid14756311 +\par }{\f38\fs28\cf1\insrsid10428813 5}{\f38\fs28\cf1\insrsid14756311\charrsid14756311 .- Aprobaci\'f3n de la MEMORIA del curso 2013-2014.}{\f38\fs28\insrsid14756311\charrsid14756311 +\par }{\f38\fs28\cf1\insrsid10428813 6}{\f38\fs28\cf1\insrsid14756311\charrsid14756311 .- Proceso de elecci\'f3n de directores.}{\f38\fs28\cf1\insrsid14756311 +\par }{\f38\fs28\cf1\insrsid10428813 7.- Libros de texto para el curso que viene.}{\f38\fs28\insrsid10428813\charrsid14756311 +\par }{\f38\fs28\cf1\insrsid10428813 8}{\f38\fs28\cf1\insrsid14756311\charrsid14756311 .- Implantaci\'f3n de la LOMCE para el curso 2014-2015.}{\f38\fs28\insrsid14756311\charrsid14756311 +\par }{\f38\fs28\cf1\insrsid10428813 9}{\f38\fs28\cf1\insrsid14756311\charrsid14756311 .- Ruegos y preguntas.}{\f38\fs28\insrsid14756311\charrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\pvpg\phpg\posx621\posy12184\absh-480\absw1869\faauto\rin0\lin0\itap0\pararsid14756311 {\f38\fs19\cf1\insrsid14756311\charrsid14756311 V\'baB\'ba}{\f38\insrsid14756311\charrsid14756311 + +\par }{\f38\fs19\cf1\insrsid14756311\charrsid14756311 El Director,}{\f38\insrsid14756311\charrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\pvpg\phpg\posx642\posy13627\absh-221\absw4950\faauto\rin0\lin0\itap0 {\f1\fs19\cf1\insrsid14756311 Fdo.: Jose Garcia Ros}{ +\f36\insrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\pvpg\phpg\posx3981\posy11104\absh-510\absw5120\faauto\rin0\lin0\itap0\pararsid14756311 { +\f38\fs19\cf1\insrsid14756311\charrsid14756311 ROLDAN, a 4 de julio de 2014}{\f38\insrsid14756311\charrsid14756311 +\par }\pard \qc \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\tx5400\tx5760\tx6120\tx6480\tx6840\tx7200\tx7560\tx7920\tx8280\tx8640\tx9000\tx9360\tx9720\tx10080\pvpg\phpg +\posx732\posy2715\absh-349\absw10155\faauto\rin0\lin0\itap0 {\b\f1\fs27\ul\cf1\insrsid14756311 Convocatoria de CONSEJO ESCOLAR}{\f36\insrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\pvpg\phpg\posx6087\posy12551\absh-221\absw1995\faauto\rin0\lin0\itap0 {\f38\fs19\cf1\insrsid14756311\charrsid14756311 La Secretaria,}{\f38\insrsid14756311\charrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\pvpg\phpg\posx6097\posy13616\absh-221\absw5070\faauto\rin0\lin0\itap0 {\f1\fs19\cf1\insrsid14756311 +Fdo.: Luz Maria Ferreiro Fraga}{\f36\insrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\tx360\tx720\tx1080\pvpg\phpg\posx306\posy16179\absh-221\absw1083\faauto\rin0\lin0\itap0 {\f1\fs17\cf1\insrsid14756311 04/07/2014}{\f36\insrsid14756311 +\par }\pard \qc \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\pvpg\phpg\posx4695\posy16179\absh-221\absw1710\faauto\rin0\lin0\itap0 {\f1\fs17\cf1\insrsid14756311 2013/14}{\f36\insrsid14756311 +\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\lang1024\langfe1024\noproof\insrsid10428813 +{\shp{\*\shpinst\shpleft741\shptop2464\shpright10955\shpbottom5065\shpfhdr0\shpbxpage\shpbxignore\shpbypage\shpbyignore\shpwr3\shpwrk0\shpfblwtxt1\shpz0\shplid1029{\sp{\sn shapeType}{\sv 1}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}} +{\sp{\sn fFilled}{\sv 0}}{\sp{\sn lineWidth}{\sv 12700}}{\sp{\sn fLine}{\sv 1}}{\sp{\sn posrelh}{\sv 1}}{\sp{\sn posrelv}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}} +{\sp{\sn fBehindDocument}{\sv 1}}{\sp{\sn fLayoutInCell}{\sv 1}}}{\shprslt{\*\do\dobxpage\dobypage\dodhgt0\dprect\dpx741\dpy2464\dpxsize10214\dpysize2601 +\dpfillfgcr255\dpfillfgcg255\dpfillfgcb255\dpfillbgcr255\dpfillbgcg255\dpfillbgcb255\dpfillpat0\dplinew20\dplinecor0\dplinecog0\dplinecob0}}}}{\f36\insrsid14756311 \page \sect }\sectd \sbknone\linex0\sectdefaultcl\sftnbj \pard\plain +\qc \li0\ri0\nowidctlpar\tx360\tx720\tx1080\tx1440\tx1800\tx2160\tx2520\tx2880\tx3240\tx3600\tx3960\tx4320\tx4680\tx5040\tx5400\tx5760\tx6120\tx6480\tx6840\pvpg\phpg\posx2093\posy1866\absh-228\absw7011\faauto\rin0\lin0\itap0\pararsid14756311 +\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\insrsid14756311 +\par }} diff --git a/sw/qa/extras/ooxmlexport/data/tdf141231_arabicHebrewNumbering.docx b/sw/qa/extras/ooxmlexport/data/tdf141231_arabicHebrewNumbering.docx new file mode 100644 index 0000000000..01bc2667a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf141231_arabicHebrewNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf141548.docx b/sw/qa/extras/ooxmlexport/data/tdf141548.docx new file mode 100644 index 0000000000..65c4e8b907 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf141548.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf141550.docx b/sw/qa/extras/ooxmlexport/data/tdf141550.docx new file mode 100644 index 0000000000..170ebebba6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf141550.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf141660.docx b/sw/qa/extras/ooxmlexport/data/tdf141660.docx new file mode 100644 index 0000000000..dbcceeebd2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf141660.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumberTortureTest.docx b/sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumberTortureTest.docx new file mode 100644 index 0000000000..808a708466 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumberTortureTest.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumbering.docx b/sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumbering.docx new file mode 100644 index 0000000000..3957fadf43 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf141966_chapterNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142361ShadowDirection.odt b/sw/qa/extras/ooxmlexport/data/tdf142361ShadowDirection.odt new file mode 100644 index 0000000000..78372e6035 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142361ShadowDirection.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142387.docx b/sw/qa/extras/ooxmlexport/data/tdf142387.docx new file mode 100644 index 0000000000..c4dc0d280c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142387.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverMarginC15.docx b/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverMarginC15.docx new file mode 100644 index 0000000000..60af474b5c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverMarginC15.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverSpacingC15.odt b/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverSpacingC15.odt new file mode 100644 index 0000000000..971a0a3a6e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142404_tabOverSpacingC15.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142404_tabSpacing.docx b/sw/qa/extras/ooxmlexport/data/tdf142404_tabSpacing.docx new file mode 100644 index 0000000000..c819c55416 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142404_tabSpacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142407.docx b/sw/qa/extras/ooxmlexport/data/tdf142407.docx new file mode 100644 index 0000000000..38397a4de9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142407.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142433_WrapPolygonCustomShape.odt b/sw/qa/extras/ooxmlexport/data/tdf142433_WrapPolygonCustomShape.odt new file mode 100644 index 0000000000..fbe0b97d6d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142433_WrapPolygonCustomShape.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142464_ampm.docx b/sw/qa/extras/ooxmlexport/data/tdf142464_ampm.docx new file mode 100644 index 0000000000..d633984888 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142464_ampm.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142486_FrameShadow.odt b/sw/qa/extras/ooxmlexport/data/tdf142486_FrameShadow.odt new file mode 100644 index 0000000000..6556d695cb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142486_FrameShadow.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142486_LeftMarginShadowLeft.docx b/sw/qa/extras/ooxmlexport/data/tdf142486_LeftMarginShadowLeft.docx new file mode 100644 index 0000000000..07478e2b8b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142486_LeftMarginShadowLeft.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx b/sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx new file mode 100644 index 0000000000..615799fd75 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142542_cancelledAutospacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142693_hugePaperSizeImport.docx b/sw/qa/extras/ooxmlexport/data/tdf142693_hugePaperSizeImport.docx new file mode 100644 index 0000000000..6ec35a7684 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142693_hugePaperSizeImport.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf142700.docx b/sw/qa/extras/ooxmlexport/data/tdf142700.docx new file mode 100644 index 0000000000..393e2ff477 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf142700.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143175.docx b/sw/qa/extras/ooxmlexport/data/tdf143175.docx new file mode 100644 index 0000000000..bcfbd2db76 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143175.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_glow_rotate.docx b/sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_glow_rotate.docx new file mode 100644 index 0000000000..b83188073b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_glow_rotate.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_stroke_shadow.docx b/sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_stroke_shadow.docx new file mode 100644 index 0000000000..53dfb488a2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143219ContourWrap_stroke_shadow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143384_tableInFoot_negativeMargins.docx b/sw/qa/extras/ooxmlexport/data/tdf143384_tableInFoot_negativeMargins.docx new file mode 100644 index 0000000000..918c1029fb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143384_tableInFoot_negativeMargins.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143399.docx b/sw/qa/extras/ooxmlexport/data/tdf143399.docx new file mode 100644 index 0000000000..1d9749a0cc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143399.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143432_Frame_WrapTextMode.odt b/sw/qa/extras/ooxmlexport/data/tdf143432_Frame_WrapTextMode.odt new file mode 100644 index 0000000000..6390c12db0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143432_Frame_WrapTextMode.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143583_emptyParaAtEndOfFootnote.docx b/sw/qa/extras/ooxmlexport/data/tdf143583_emptyParaAtEndOfFootnote.docx new file mode 100644 index 0000000000..e8b42b840a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143583_emptyParaAtEndOfFootnote.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143692_outlineLevelTortureTest.docx b/sw/qa/extras/ooxmlexport/data/tdf143692_outlineLevelTortureTest.docx new file mode 100644 index 0000000000..7072b47218 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143692_outlineLevelTortureTest.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf143860_NonPrimitiveCustomShape.odt b/sw/qa/extras/ooxmlexport/data/tdf143860_NonPrimitiveCustomShape.odt new file mode 100644 index 0000000000..6a12228770 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf143860_NonPrimitiveCustomShape.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf144362.odt b/sw/qa/extras/ooxmlexport/data/tdf144362.odt new file mode 100644 index 0000000000..9c161dbdeb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf144362.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf144563.docx b/sw/qa/extras/ooxmlexport/data/tdf144563.docx new file mode 100644 index 0000000000..59d64d2d1b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf144563.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf144668.odt b/sw/qa/extras/ooxmlexport/data/tdf144668.odt new file mode 100644 index 0000000000..7504adce40 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf144668.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf145998_unnecessaryPageStyles.odt b/sw/qa/extras/ooxmlexport/data/tdf145998_unnecessaryPageStyles.odt new file mode 100644 index 0000000000..82087eb691 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf145998_unnecessaryPageStyles.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146171.docx b/sw/qa/extras/ooxmlexport/data/tdf146171.docx new file mode 100644 index 0000000000..bdd534527a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146171.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146346.docx b/sw/qa/extras/ooxmlexport/data/tdf146346.docx new file mode 100644 index 0000000000..846a33e9ae Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146346.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146491.odt b/sw/qa/extras/ooxmlexport/data/tdf146491.odt new file mode 100644 index 0000000000..2ee08f1d3e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146491.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146515.odt b/sw/qa/extras/ooxmlexport/data/tdf146515.odt new file mode 100644 index 0000000000..139126d022 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146515.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146802.docx b/sw/qa/extras/ooxmlexport/data/tdf146802.docx new file mode 100644 index 0000000000..80d2ee17a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146802.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146851_1.docx b/sw/qa/extras/ooxmlexport/data/tdf146851_1.docx new file mode 100644 index 0000000000..b4456bf400 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146851_1.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146851_2.docx b/sw/qa/extras/ooxmlexport/data/tdf146851_2.docx new file mode 100644 index 0000000000..fbd5f40a68 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146851_2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146955.odt b/sw/qa/extras/ooxmlexport/data/tdf146955.odt new file mode 100644 index 0000000000..71e86e0e66 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146955.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf146984_anchorInShape.docx b/sw/qa/extras/ooxmlexport/data/tdf146984_anchorInShape.docx new file mode 100644 index 0000000000..38fcaf9abe Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf146984_anchorInShape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf147115_defaultStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf147115_defaultStyle.docx new file mode 100644 index 0000000000..e75099c6aa Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf147115_defaultStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf147646_mergedCellNumbering.docx b/sw/qa/extras/ooxmlexport/data/tdf147646_mergedCellNumbering.docx new file mode 100644 index 0000000000..6801447376 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf147646_mergedCellNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf147724.docx b/sw/qa/extras/ooxmlexport/data/tdf147724.docx new file mode 100644 index 0000000000..97f05c921b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf147724.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf147810.odt b/sw/qa/extras/ooxmlexport/data/tdf147810.odt new file mode 100644 index 0000000000..eb0d1a8846 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf147810.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf147861_customField.docx b/sw/qa/extras/ooxmlexport/data/tdf147861_customField.docx new file mode 100644 index 0000000000..70071fa7e8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf147861_customField.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf147892.fodt b/sw/qa/extras/ooxmlexport/data/tdf147892.fodt new file mode 100644 index 0000000000..bb3ffc324d --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf147892.fodt @@ -0,0 +1,25 @@ + + + + + + + + + Bob + 2023-01-02T00:00:00 + + + + + Alice + 2023-01-01T00:00:00 + + + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf147978_enhancedPath_commandABVW.odt b/sw/qa/extras/ooxmlexport/data/tdf147978_enhancedPath_commandABVW.odt new file mode 100644 index 0000000000..d9ef07db59 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf147978_enhancedPath_commandABVW.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148026.fodt b/sw/qa/extras/ooxmlexport/data/tdf148026.fodt new file mode 100644 index 0000000000..80d958a694 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf148026.fodt @@ -0,0 +1,14 @@ + + + + + + + + + + + https://bugs.documentfoundation.org/a#b _self frame + + + \ No newline at end of file diff --git a/sw/qa/extras/ooxmlexport/data/tdf148052.docx b/sw/qa/extras/ooxmlexport/data/tdf148052.docx new file mode 100644 index 0000000000..4e0dad0f5b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148052.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148111.docx b/sw/qa/extras/ooxmlexport/data/tdf148111.docx new file mode 100644 index 0000000000..a46fb508dc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148111.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148132.docx b/sw/qa/extras/ooxmlexport/data/tdf148132.docx new file mode 100644 index 0000000000..6ee2359795 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148132.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docx b/sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docx new file mode 100644 index 0000000000..1ebb1e8b41 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148273_sectionBulletFormatLeak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148360.docx b/sw/qa/extras/ooxmlexport/data/tdf148360.docx new file mode 100644 index 0000000000..8f09f685d2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148360.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148361.docx b/sw/qa/extras/ooxmlexport/data/tdf148361.docx new file mode 100644 index 0000000000..ecf9a5f008 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148361.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148380_createField.docx b/sw/qa/extras/ooxmlexport/data/tdf148380_createField.docx new file mode 100644 index 0000000000..c31ed72141 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148380_createField.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148380_fldLocked.docx b/sw/qa/extras/ooxmlexport/data/tdf148380_fldLocked.docx new file mode 100644 index 0000000000..2ac77223b2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148380_fldLocked.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148380_modifiedField.docx b/sw/qa/extras/ooxmlexport/data/tdf148380_modifiedField.docx new file mode 100644 index 0000000000..14f6e319e2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148380_modifiedField.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148380_printField.docx b/sw/qa/extras/ooxmlexport/data/tdf148380_printField.docx new file mode 100644 index 0000000000..44145748c6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148380_printField.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148380_usernameField.docx b/sw/qa/extras/ooxmlexport/data/tdf148380_usernameField.docx new file mode 100644 index 0000000000..241632bc80 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148380_usernameField.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148455_1.docx b/sw/qa/extras/ooxmlexport/data/tdf148455_1.docx new file mode 100644 index 0000000000..295d3ee744 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148455_1.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148455_2.docx b/sw/qa/extras/ooxmlexport/data/tdf148455_2.docx new file mode 100644 index 0000000000..3cde58ce5a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148455_2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148494.docx b/sw/qa/extras/ooxmlexport/data/tdf148494.docx new file mode 100644 index 0000000000..c60c73a206 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148494.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148671.docx b/sw/qa/extras/ooxmlexport/data/tdf148671.docx new file mode 100644 index 0000000000..d4ed09fa96 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148671.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148720.odt b/sw/qa/extras/ooxmlexport/data/tdf148720.odt new file mode 100644 index 0000000000..771c845053 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148720.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148834_lineNumbering.odt b/sw/qa/extras/ooxmlexport/data/tdf148834_lineNumbering.odt new file mode 100644 index 0000000000..4006cfe662 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148834_lineNumbering.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148952.odt b/sw/qa/extras/ooxmlexport/data/tdf148952.odt new file mode 100644 index 0000000000..b4f40f617d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148952.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf148956_directEndFormatting.docx b/sw/qa/extras/ooxmlexport/data/tdf148956_directEndFormatting.docx new file mode 100644 index 0000000000..0ed542643e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf148956_directEndFormatting.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149089.docx b/sw/qa/extras/ooxmlexport/data/tdf149089.docx new file mode 100644 index 0000000000..2390476841 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149089.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149198.docx b/sw/qa/extras/ooxmlexport/data/tdf149198.docx new file mode 100644 index 0000000000..61e2bfddba Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149198.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149200.docx b/sw/qa/extras/ooxmlexport/data/tdf149200.docx new file mode 100644 index 0000000000..811f594b64 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149200.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149313.docx b/sw/qa/extras/ooxmlexport/data/tdf149313.docx new file mode 100644 index 0000000000..4c0c454b42 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149313.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149388.docx b/sw/qa/extras/ooxmlexport/data/tdf149388.docx new file mode 100644 index 0000000000..9b97028199 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149388.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149388_fly.docx b/sw/qa/extras/ooxmlexport/data/tdf149388_fly.docx new file mode 100644 index 0000000000..92b9cf92ba Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149388_fly.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149546.docx b/sw/qa/extras/ooxmlexport/data/tdf149546.docx new file mode 100644 index 0000000000..2811ec1898 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149546.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149551_mongolianVert.docx b/sw/qa/extras/ooxmlexport/data/tdf149551_mongolianVert.docx new file mode 100644 index 0000000000..2f562757a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149551_mongolianVert.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149649.docx b/sw/qa/extras/ooxmlexport/data/tdf149649.docx new file mode 100644 index 0000000000..8d6fded674 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149649.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149708.docx b/sw/qa/extras/ooxmlexport/data/tdf149708.docx new file mode 100644 index 0000000000..5eee4a124f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149708.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf149711.docx b/sw/qa/extras/ooxmlexport/data/tdf149711.docx new file mode 100644 index 0000000000..d90efa7c1f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf149711.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf150166.docx b/sw/qa/extras/ooxmlexport/data/tdf150166.docx new file mode 100644 index 0000000000..f802ac611e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf150166.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf150542.docx b/sw/qa/extras/ooxmlexport/data/tdf150542.docx new file mode 100644 index 0000000000..3f115fa693 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf150542.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf150824.fodt b/sw/qa/extras/ooxmlexport/data/tdf150824.fodt new file mode 100644 index 0000000000..c1e437a121 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf150824.fodt @@ -0,0 +1,48 @@ + + + + + + + + + + Unknown Author + 2022-09-06T14:47:25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf150966_regularInset.docx b/sw/qa/extras/ooxmlexport/data/tdf150966_regularInset.docx new file mode 100644 index 0000000000..0d07a5453e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf150966_regularInset.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf151548_activeContentDemo.docm b/sw/qa/extras/ooxmlexport/data/tdf151548_activeContentDemo.docm new file mode 100644 index 0000000000..80886d864a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf151548_activeContentDemo.docm differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf151704_thinColumnHeight.docx b/sw/qa/extras/ooxmlexport/data/tdf151704_thinColumnHeight.docx new file mode 100644 index 0000000000..7e7cd57e13 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf151704_thinColumnHeight.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf151912.docx b/sw/qa/extras/ooxmlexport/data/tdf151912.docx new file mode 100644 index 0000000000..65e8d5a93f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf151912.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf152200-field+textbox.docx b/sw/qa/extras/ooxmlexport/data/tdf152200-field+textbox.docx new file mode 100644 index 0000000000..606d1346a2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf152200-field+textbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf152203.docx b/sw/qa/extras/ooxmlexport/data/tdf152203.docx new file mode 100644 index 0000000000..f8ba96ea59 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf152203.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf152425.docx b/sw/qa/extras/ooxmlexport/data/tdf152425.docx new file mode 100644 index 0000000000..53a65cc634 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf152425.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf152506.docx b/sw/qa/extras/ooxmlexport/data/tdf152506.docx new file mode 100644 index 0000000000..34f0130fdd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf152506.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak.odt b/sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak.odt new file mode 100644 index 0000000000..434c30ed31 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak2.docx b/sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak2.docx new file mode 100644 index 0000000000..255bf795a5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf152636_lostPageBreak2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153042_largeTab.docx b/sw/qa/extras/ooxmlexport/data/tdf153042_largeTab.docx new file mode 100644 index 0000000000..87730d6d12 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153042_largeTab.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153042_noTab.docx b/sw/qa/extras/ooxmlexport/data/tdf153042_noTab.docx new file mode 100644 index 0000000000..38b5208eab Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153042_noTab.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153104.docx b/sw/qa/extras/ooxmlexport/data/tdf153104.docx new file mode 100644 index 0000000000..d70b09852a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153104.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153128.docx b/sw/qa/extras/ooxmlexport/data/tdf153128.docx new file mode 100644 index 0000000000..97f08827d9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153128.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153255.docx b/sw/qa/extras/ooxmlexport/data/tdf153255.docx new file mode 100644 index 0000000000..e9f2892d56 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153255.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153526_commentInNumbering.docx b/sw/qa/extras/ooxmlexport/data/tdf153526_commentInNumbering.docx new file mode 100644 index 0000000000..f26240092c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153526_commentInNumbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153592_columnBreaks.docx b/sw/qa/extras/ooxmlexport/data/tdf153592_columnBreaks.docx new file mode 100644 index 0000000000..ea6acac29b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153592_columnBreaks.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak.docx new file mode 100644 index 0000000000..4501082086 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak2.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak2.docx new file mode 100644 index 0000000000..c29f8a4951 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak3.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak3.docx new file mode 100644 index 0000000000..5dd61ec7f4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak6.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak6.docx new file mode 100644 index 0000000000..f8b540012d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_anchoredAfterPgBreak6.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak.docx new file mode 100644 index 0000000000..6b25d6c70c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak2.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak2.docx new file mode 100644 index 0000000000..c8fe50ea3f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_inlineAfterPgBreak2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_sdtAfterPgBreak.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_sdtAfterPgBreak.docx new file mode 100644 index 0000000000..fa62b475cf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_sdtAfterPgBreak.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx new file mode 100644 index 0000000000..29c63ad71e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153613_textboxAfterPgBreak3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153804.docx b/sw/qa/extras/ooxmlexport/data/tdf153804.docx new file mode 100644 index 0000000000..65a1fdfa8e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153804.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153891.docx b/sw/qa/extras/ooxmlexport/data/tdf153891.docx new file mode 100644 index 0000000000..6fe8092982 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153891.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx b/sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx new file mode 100644 index 0000000000..696c4b4278 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153964_firstIndentAfterBreak14.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx b/sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx new file mode 100644 index 0000000000..a94a3c9736 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153964_numberingAfterBreak14.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak14.docx b/sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak14.docx new file mode 100644 index 0000000000..6c57bcfdc8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak14.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak15.docx b/sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak15.docx new file mode 100644 index 0000000000..e4d5c45ed0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf153964_topMarginAfterBreak15.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf154129_framePr1.docx b/sw/qa/extras/ooxmlexport/data/tdf154129_framePr1.docx new file mode 100644 index 0000000000..27ba6055c2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf154129_framePr1.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf154478.docx b/sw/qa/extras/ooxmlexport/data/tdf154478.docx new file mode 100644 index 0000000000..bfbfeda768 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf154478.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf154481.docx b/sw/qa/extras/ooxmlexport/data/tdf154481.docx new file mode 100644 index 0000000000..bfbfeda768 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf154481.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf154703_framePr.docx b/sw/qa/extras/ooxmlexport/data/tdf154703_framePr.docx new file mode 100644 index 0000000000..2ec5b493ec Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf154703_framePr.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf154703_framePr2.rtf b/sw/qa/extras/ooxmlexport/data/tdf154703_framePr2.rtf new file mode 100644 index 0000000000..614c539120 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf154703_framePr2.rtf @@ -0,0 +1,187 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2057\themelang2057\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f237\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f238\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f240\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f241\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f242\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f243\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f244\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f245\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f247\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f248\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\f250\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f251\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f252\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f253\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f254\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f255\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f577\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f578\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f580\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f581\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f584\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f585\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\ctexttwo\ctint153\cshade255\red84\green141\blue212;}{\*\defchp \fs22 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \snext11 \ssemihidden \sunhideused Normal Table;}{\s15\ql \li0\ri0\widctlpar +\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 \sbasedon0 \snext15 \slink16 \sunhideused \styrsid7478253 header;} +{\*\cs16 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \fs24\lang1060\langfe1060\langnp1060\langfenp1060 \sbasedon10 \slink15 \slocked \styrsid7478253 Header Char;}{\s17\ql \li0\ri0\widctlpar +\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 \sbasedon0 \snext17 \slink18 \sunhideused \styrsid7478253 footer;} +{\*\cs18 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \fs24\lang1060\langfe1060\langnp1060\langfenp1060 \sbasedon10 \slink17 \slocked \styrsid7478253 Footer Char;}}{\*\rsidtbl \rsid1707623\rsid2377995\rsid3551688\rsid4459474\rsid7478253\rsid8597786 +\rsid8659540\rsid10968976\rsid13382084\rsid13460485\rsid13894473\rsid13975497\rsid13991539\rsid14048189\rsid16266111\rsid16739686}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0 +\mnaryLim1}{\info{\author robi01}{\doccomm Produced by: PsQRFilters V2.11 for QuickReport (www.pragnaan.com)}{\operator JLAutoBuild}{\creatim\yr2023\mo4\dy12\hr22\min30}{\revtim\yr2023\mo4\dy12\hr23\min56}{\version12}{\edmins52}{\nofpages1}{\nofwords4} +{\nofchars23}{\nofcharsws26}{\vern49273}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw8392\paperh5954\margl283\margr283\margt567\margb567\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot3551688 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0 +{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7478253 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 {\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid16739686 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7478253 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16739686 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7478253 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16739686 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7478253 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16739686 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\lndscpsxn\psz70\linex0\headery0\footery0\colsx708\sectlinegrid326\sectdefaultcl\sectrsid13382084\sftnbj {\headerl \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar +\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7478253 +\par }}{\headerr \ltrpar \pard\plain \ltrpar\s15\qc \li0\ri0\widctlpar\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7478253 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1060\langnp2057\insrsid7478253 Exactly 6cm frame does NOT include border spacing}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1060\langnp2057\insrsid7478253\charrsid7478253 +\par }}{\footerl \ltrpar \pard\plain \ltrpar\s17\ql \li0\ri0\widctlpar\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7478253 +\par }}{\footerr \ltrpar \pard\plain \ltrpar\s17\ql \li0\ri0\widctlpar\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7478253 +\par }}{\headerf \ltrpar \pard\plain \ltrpar\s15\ql \li0\ri0\widctlpar\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7478253 +\par }}{\footerf \ltrpar \pard\plain \ltrpar\s17\ql \li0\ri0\widctlpar\tqc\tx4513\tqr\tx9026\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7478253 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\nowidctlpar\brdrt\brdrs\brdrw10\brsp620 \brdrl\brdrs\brdrw10\brsp300 \brdrb +\brdrs\brdrw10\brsp620 \brdrr\brdrs\brdrw10\brsp300 \pvpg\phpg\posxc\posyc\absw3402\wraparound\faauto\rin0\lin0\itap0\pararsid2377995 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1060\langfe1060\cgrid\langnp1060\langfenp1060 {\rtlch\fcs1 \af1 +\ltrch\fcs0 \f1\cf1\insrsid13382084\charrsid10968976 framePr}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\cf1\insrsid8597786\charrsid10968976 +\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\brdrt\brdrs\brdrw10\brsp620 \brdrl\brdrs\brdrw10\brsp300 \brdrb\brdrs\brdrw10\brsp620 \brdrr\brdrs\brdrw10\brsp300 \pvpg\phpg\posxc\posyc\absw3402\wraparound\faauto\rin0\lin0\itap0\pararsid2377995 \cbpat17 { +\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\cf1\insrsid13382084\charrsid10968976 background color +\par }\pard \ltrpar\ql \li0\ri0\nowidctlpar\brdrt\brdrs\brdrw10\brsp620 \brdrl\brdrs\brdrw10\brsp300 \brdrb\brdrs\brdrw10\brsp620 \brdrr\brdrs\brdrw10\brsp300 \pvpg\phpg\posxc\posyc\absw3402\wraparound\faauto\rin0\lin0\itap0\pararsid2377995 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid13382084\charrsid10968976 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14048189 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000000021 +3733816dd901feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/sw/qa/extras/ooxmlexport/data/tdf154703_framePrTextDirection.docx b/sw/qa/extras/ooxmlexport/data/tdf154703_framePrTextDirection.docx new file mode 100644 index 0000000000..e01c2cf9f4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf154703_framePrTextDirection.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf154703_framePrWrapSpacing.docx b/sw/qa/extras/ooxmlexport/data/tdf154703_framePrWrapSpacing.docx new file mode 100644 index 0000000000..57a9bea5a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf154703_framePrWrapSpacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf154751_dualStrikethrough.docx b/sw/qa/extras/ooxmlexport/data/tdf154751_dualStrikethrough.docx new file mode 100644 index 0000000000..4669be366a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf154751_dualStrikethrough.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf155690.docx b/sw/qa/extras/ooxmlexport/data/tdf155690.docx new file mode 100644 index 0000000000..1839862688 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf155690.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf155736_PageNumbers_footer.docx b/sw/qa/extras/ooxmlexport/data/tdf155736_PageNumbers_footer.docx new file mode 100644 index 0000000000..58e3698800 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf155736_PageNumbers_footer.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf155903.odt b/sw/qa/extras/ooxmlexport/data/tdf155903.odt new file mode 100644 index 0000000000..97ba58d892 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf155903.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf155945.docx b/sw/qa/extras/ooxmlexport/data/tdf155945.docx new file mode 100644 index 0000000000..9858ac7117 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf155945.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf156372.doc b/sw/qa/extras/ooxmlexport/data/tdf156372.doc new file mode 100644 index 0000000000..3b8ade19f8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf156372.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf157011_ins_del_empty_cols.docx b/sw/qa/extras/ooxmlexport/data/tdf157011_ins_del_empty_cols.docx new file mode 100644 index 0000000000..5ebb98fda0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157011_ins_del_empty_cols.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf157136_TwoContentControls.docx b/sw/qa/extras/ooxmlexport/data/tdf157136_TwoContentControls.docx new file mode 100644 index 0000000000..f4e898cb05 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157136_TwoContentControls.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf157572_defaultVAnchor.docx b/sw/qa/extras/ooxmlexport/data/tdf157572_defaultVAnchor.docx new file mode 100644 index 0000000000..9f63950693 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157572_defaultVAnchor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx b/sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx new file mode 100644 index 0000000000..d7437aedec Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157572_insidiousCombination.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx b/sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx new file mode 100644 index 0000000000..98f1bb195c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157572_noVAlignAsText.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf157598.docx b/sw/qa/extras/ooxmlexport/data/tdf157598.docx new file mode 100644 index 0000000000..7a5a2b1599 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf157598.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf158044.odt b/sw/qa/extras/ooxmlexport/data/tdf158044.odt new file mode 100755 index 0000000000..ca17b66256 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf158044.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf158436.docx b/sw/qa/extras/ooxmlexport/data/tdf158436.docx new file mode 100644 index 0000000000..8cdcd21b4c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf158436.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf36117_verticalAdjustment.docx b/sw/qa/extras/ooxmlexport/data/tdf36117_verticalAdjustment.docx new file mode 100644 index 0000000000..70fdec72dd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf36117_verticalAdjustment.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf37153_considerWrapOnObjPos.docx b/sw/qa/extras/ooxmlexport/data/tdf37153_considerWrapOnObjPos.docx new file mode 100644 index 0000000000..d89baaf084 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf37153_considerWrapOnObjPos.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf38778_properties_in_run_for_field.doc b/sw/qa/extras/ooxmlexport/data/tdf38778_properties_in_run_for_field.doc new file mode 100644 index 0000000000..5f0f7238a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf38778_properties_in_run_for_field.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf41466_testVmlShapeWithTextbox.docx b/sw/qa/extras/ooxmlexport/data/tdf41466_testVmlShapeWithTextbox.docx new file mode 100644 index 0000000000..2dfeb909cf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf41466_testVmlShapeWithTextbox.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf41542_borderlessPadding.odt b/sw/qa/extras/ooxmlexport/data/tdf41542_borderlessPadding.odt new file mode 100644 index 0000000000..9585041de3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf41542_borderlessPadding.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf41542_imagePadding.odt b/sw/qa/extras/ooxmlexport/data/tdf41542_imagePadding.odt new file mode 100644 index 0000000000..019e19f247 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf41542_imagePadding.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf44278.docx b/sw/qa/extras/ooxmlexport/data/tdf44278.docx new file mode 100644 index 0000000000..588416cdb0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf44278.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf44832_section_new_header.odt b/sw/qa/extras/ooxmlexport/data/tdf44832_section_new_header.odt new file mode 100644 index 0000000000..9db311db1f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf44832_section_new_header.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf44986.docx b/sw/qa/extras/ooxmlexport/data/tdf44986.docx new file mode 100644 index 0000000000..7859ab4020 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf44986.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf46938_clearTabStop.docx b/sw/qa/extras/ooxmlexport/data/tdf46938_clearTabStop.docx new file mode 100644 index 0000000000..8dea12fcb5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf46938_clearTabStop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf46940_dontEquallyDistributeColumns.docx b/sw/qa/extras/ooxmlexport/data/tdf46940_dontEquallyDistributeColumns.docx new file mode 100644 index 0000000000..657da5eb09 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf46940_dontEquallyDistributeColumns.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf48569.odt b/sw/qa/extras/ooxmlexport/data/tdf48569.odt new file mode 100644 index 0000000000..3ae5ac3939 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf48569.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf49073.docx b/sw/qa/extras/ooxmlexport/data/tdf49073.docx new file mode 100644 index 0000000000..ddcbb62fbb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf49073.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf53856_conflictingStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf53856_conflictingStyle.docx new file mode 100644 index 0000000000..71b925a9a3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf53856_conflictingStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf55427_footnote2endnote.odt b/sw/qa/extras/ooxmlexport/data/tdf55427_footnote2endnote.odt new file mode 100644 index 0000000000..7f77f6d39e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf55427_footnote2endnote.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf57589_hashColor.docx b/sw/qa/extras/ooxmlexport/data/tdf57589_hashColor.docx new file mode 100644 index 0000000000..d12b85b2da Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf57589_hashColor.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx b/sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx new file mode 100644 index 0000000000..56e37362ad Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf59274.docx b/sw/qa/extras/ooxmlexport/data/tdf59274.docx new file mode 100644 index 0000000000..38aad9ae91 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf59274.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf59699.docx b/sw/qa/extras/ooxmlexport/data/tdf59699.docx new file mode 100644 index 0000000000..158ac338f8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf59699.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs.docx b/sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs.docx new file mode 100644 index 0000000000..228b9b5478 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs2.docx b/sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs2.docx new file mode 100644 index 0000000000..cf674f3c46 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf63561_clearTabs2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf64264.docx b/sw/qa/extras/ooxmlexport/data/tdf64264.docx new file mode 100644 index 0000000000..e2fea64dad Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf64264.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf64372_continuousBreaks.docx b/sw/qa/extras/ooxmlexport/data/tdf64372_continuousBreaks.docx new file mode 100644 index 0000000000..20ad82bb51 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf64372_continuousBreaks.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf64531.docx b/sw/qa/extras/ooxmlexport/data/tdf64531.docx new file mode 100644 index 0000000000..ae9d232ac9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf64531.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf65955.odt b/sw/qa/extras/ooxmlexport/data/tdf65955.odt new file mode 100644 index 0000000000..e133938e03 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf65955.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf65955_2.odt b/sw/qa/extras/ooxmlexport/data/tdf65955_2.odt new file mode 100644 index 0000000000..5ad9146dc2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf65955_2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf66039.docx b/sw/qa/extras/ooxmlexport/data/tdf66039.docx new file mode 100644 index 0000000000..f17032b3f9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf66039.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf66398_permissions.docx b/sw/qa/extras/ooxmlexport/data/tdf66398_permissions.docx new file mode 100644 index 0000000000..d5c8559948 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf66398_permissions.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf66401.docx b/sw/qa/extras/ooxmlexport/data/tdf66401.docx new file mode 100644 index 0000000000..2e2ddca375 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf66401.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf66496.docx b/sw/qa/extras/ooxmlexport/data/tdf66496.docx new file mode 100644 index 0000000000..6f168d38e8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf66496.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf67207.docx b/sw/qa/extras/ooxmlexport/data/tdf67207.docx new file mode 100644 index 0000000000..b0604c2663 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf67207.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf70234.docx b/sw/qa/extras/ooxmlexport/data/tdf70234.docx new file mode 100644 index 0000000000..33ef99430b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf70234.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf73499.docx b/sw/qa/extras/ooxmlexport/data/tdf73499.docx new file mode 100644 index 0000000000..605c01e2b3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf73499.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf73547-dash.docx b/sw/qa/extras/ooxmlexport/data/tdf73547-dash.docx new file mode 100644 index 0000000000..40e741ebb3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf73547-dash.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf76022_textboxWrap.odt b/sw/qa/extras/ooxmlexport/data/tdf76022_textboxWrap.odt new file mode 100644 index 0000000000..b08fe002f3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf76022_textboxWrap.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf76683_negativeTwipsMeasure.docx b/sw/qa/extras/ooxmlexport/data/tdf76683_negativeTwipsMeasure.docx new file mode 100644 index 0000000000..eb769fdcc3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf76683_negativeTwipsMeasure.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf77219_backgroundShape.docx b/sw/qa/extras/ooxmlexport/data/tdf77219_backgroundShape.docx new file mode 100644 index 0000000000..bcfdcf3774 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf77219_backgroundShape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf77219_foregroundShape.docx b/sw/qa/extras/ooxmlexport/data/tdf77219_foregroundShape.docx new file mode 100644 index 0000000000..7de2b4c390 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf77219_foregroundShape.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf77236_MissingSolidFill.docx b/sw/qa/extras/ooxmlexport/data/tdf77236_MissingSolidFill.docx new file mode 100644 index 0000000000..2bb2c09783 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf77236_MissingSolidFill.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf77417.docx b/sw/qa/extras/ooxmlexport/data/tdf77417.docx new file mode 100644 index 0000000000..4b4fb20fee Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf77417.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf77796.docx b/sw/qa/extras/ooxmlexport/data/tdf77796.docx new file mode 100644 index 0000000000..e42c37daa3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf77796.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf78352.docx b/sw/qa/extras/ooxmlexport/data/tdf78352.docx new file mode 100644 index 0000000000..6f85f2e2ab Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf78352.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf78657_picture_hyperlink.docx b/sw/qa/extras/ooxmlexport/data/tdf78657_picture_hyperlink.docx new file mode 100644 index 0000000000..bc4759ecc3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf78657_picture_hyperlink.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf78749.docx b/sw/qa/extras/ooxmlexport/data/tdf78749.docx new file mode 100644 index 0000000000..db498849e6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf78749.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf78902.docx b/sw/qa/extras/ooxmlexport/data/tdf78902.docx new file mode 100644 index 0000000000..3cf3a443a9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf78902.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf79272_strictDxa.docx b/sw/qa/extras/ooxmlexport/data/tdf79272_strictDxa.docx new file mode 100644 index 0000000000..4d5ea67bd8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf79272_strictDxa.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf79329.docx b/sw/qa/extras/ooxmlexport/data/tdf79329.docx new file mode 100644 index 0000000000..142f29522d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf79329.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc b/sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc new file mode 100644 index 0000000000..da7fade809 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf79435_legacyInputFields.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf80526_word_wrap.docx b/sw/qa/extras/ooxmlexport/data/tdf80526_word_wrap.docx new file mode 100644 index 0000000000..abf5ee5ed2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf80526_word_wrap.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf81100.docx b/sw/qa/extras/ooxmlexport/data/tdf81100.docx new file mode 100644 index 0000000000..cd46100f05 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf81100.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf81345.docx b/sw/qa/extras/ooxmlexport/data/tdf81345.docx new file mode 100644 index 0000000000..4f18b1eead Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf81345.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf81507.docx b/sw/qa/extras/ooxmlexport/data/tdf81507.docx new file mode 100644 index 0000000000..2c00ee44cb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf81507.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf81567.odt b/sw/qa/extras/ooxmlexport/data/tdf81567.odt new file mode 100644 index 0000000000..93e449754b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf81567.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf82065_Ind_start_strict.docx b/sw/qa/extras/ooxmlexport/data/tdf82065_Ind_start_strict.docx new file mode 100644 index 0000000000..6cbdbdc97c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf82065_Ind_start_strict.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf82173_endnoteStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf82173_endnoteStyle.docx new file mode 100644 index 0000000000..d38a65943c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf82173_endnoteStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf82173_footnoteStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf82173_footnoteStyle.docx new file mode 100644 index 0000000000..4fa7b0a24d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf82173_footnoteStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf82175_noStyleInheritance.docx b/sw/qa/extras/ooxmlexport/data/tdf82175_noStyleInheritance.docx new file mode 100644 index 0000000000..e9df3b7048 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf82175_noStyleInheritance.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf82177_insideCellBorders.docx b/sw/qa/extras/ooxmlexport/data/tdf82177_insideCellBorders.docx new file mode 100644 index 0000000000..f1f0d272d0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf82177_insideCellBorders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf82177_outsideCellBorders.docx b/sw/qa/extras/ooxmlexport/data/tdf82177_outsideCellBorders.docx new file mode 100644 index 0000000000..75c9a656da Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf82177_outsideCellBorders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf82177_tblBorders.docx b/sw/qa/extras/ooxmlexport/data/tdf82177_tblBorders.docx new file mode 100644 index 0000000000..88a237cf69 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf82177_tblBorders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf8255.docx b/sw/qa/extras/ooxmlexport/data/tdf8255.docx new file mode 100644 index 0000000000..366e498856 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf8255.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf83227.docx b/sw/qa/extras/ooxmlexport/data/tdf83227.docx new file mode 100644 index 0000000000..bca19a955e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf83227.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf83300.docx b/sw/qa/extras/ooxmlexport/data/tdf83300.docx new file mode 100644 index 0000000000..aa3ad22d10 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf83300.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf83309.docx b/sw/qa/extras/ooxmlexport/data/tdf83309.docx new file mode 100644 index 0000000000..184018bb56 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf83309.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf84678.docx b/sw/qa/extras/ooxmlexport/data/tdf84678.docx new file mode 100644 index 0000000000..f79922861c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf84678.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf85161.docx b/sw/qa/extras/ooxmlexport/data/tdf85161.docx new file mode 100644 index 0000000000..e079b49066 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf85161.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf86374.docx b/sw/qa/extras/ooxmlexport/data/tdf86374.docx new file mode 100644 index 0000000000..7fd772d79b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf86374.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf86926_A3.docx b/sw/qa/extras/ooxmlexport/data/tdf86926_A3.docx new file mode 100644 index 0000000000..a4392dcf28 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf86926_A3.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf87348_linkedTextboxes.docx b/sw/qa/extras/ooxmlexport/data/tdf87348_linkedTextboxes.docx new file mode 100644 index 0000000000..8f9eb97d83 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf87348_linkedTextboxes.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf87460.docx b/sw/qa/extras/ooxmlexport/data/tdf87460.docx new file mode 100644 index 0000000000..c443dbe456 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf87460.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf87569_drawingml.docx b/sw/qa/extras/ooxmlexport/data/tdf87569_drawingml.docx new file mode 100644 index 0000000000..7f00a46e2c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf87569_drawingml.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf87569_vml.docx b/sw/qa/extras/ooxmlexport/data/tdf87569_vml.docx new file mode 100644 index 0000000000..0223ad71d4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf87569_vml.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf87924.docx b/sw/qa/extras/ooxmlexport/data/tdf87924.docx new file mode 100644 index 0000000000..5265d6638a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf87924.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf88496.docx b/sw/qa/extras/ooxmlexport/data/tdf88496.docx new file mode 100644 index 0000000000..b34f30389e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf88496.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf88583.odt b/sw/qa/extras/ooxmlexport/data/tdf88583.odt new file mode 100644 index 0000000000..307ab1e780 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf88583.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf89165.docx b/sw/qa/extras/ooxmlexport/data/tdf89165.docx new file mode 100644 index 0000000000..a060ca444e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf89165.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf89377_tableWithBreakBeforeParaStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf89377_tableWithBreakBeforeParaStyle.docx new file mode 100644 index 0000000000..bf673e86e7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf89377_tableWithBreakBeforeParaStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf89702.docx b/sw/qa/extras/ooxmlexport/data/tdf89702.docx new file mode 100644 index 0000000000..5542d1cbe5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf89702.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf89774.fodt b/sw/qa/extras/ooxmlexport/data/tdf89774.fodt new file mode 100644 index 0000000000..18e1e7ac49 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf89774.fodt @@ -0,0 +1,11 @@ + + + + PT1M5S + + + + hello + + + diff --git a/sw/qa/extras/ooxmlexport/data/tdf89791.docx b/sw/qa/extras/ooxmlexport/data/tdf89791.docx new file mode 100644 index 0000000000..7ea98aa581 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf89791.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf89890.docx b/sw/qa/extras/ooxmlexport/data/tdf89890.docx new file mode 100644 index 0000000000..8b3e8ebe18 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf89890.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf89991.docx b/sw/qa/extras/ooxmlexport/data/tdf89991.docx new file mode 100644 index 0000000000..a074d9679a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf89991.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90153.docx b/sw/qa/extras/ooxmlexport/data/tdf90153.docx new file mode 100644 index 0000000000..decbfa29d3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90153.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90611.docx b/sw/qa/extras/ooxmlexport/data/tdf90611.docx new file mode 100644 index 0000000000..ac54feedd0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90611.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90681-1.odt b/sw/qa/extras/ooxmlexport/data/tdf90681-1.odt new file mode 100644 index 0000000000..009e006caf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90681-1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90681-2.odt b/sw/qa/extras/ooxmlexport/data/tdf90681-2.odt new file mode 100644 index 0000000000..3d9d46fc4a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90681-2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90697_complexBreaksHeaders.docx b/sw/qa/extras/ooxmlexport/data/tdf90697_complexBreaksHeaders.docx new file mode 100644 index 0000000000..b5e7ef0234 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90697_complexBreaksHeaders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90789-2.docx b/sw/qa/extras/ooxmlexport/data/tdf90789-2.docx new file mode 100644 index 0000000000..2f831d722b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90789-2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90789.docx b/sw/qa/extras/ooxmlexport/data/tdf90789.docx new file mode 100644 index 0000000000..b94b2ad7f7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90789.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90810short.docx b/sw/qa/extras/ooxmlexport/data/tdf90810short.docx new file mode 100644 index 0000000000..85b6369fbf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90810short.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90906_colAuto.docx b/sw/qa/extras/ooxmlexport/data/tdf90906_colAuto.docx new file mode 100644 index 0000000000..3df6b65c8a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90906_colAuto.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf90906_colAutoB.docx b/sw/qa/extras/ooxmlexport/data/tdf90906_colAutoB.docx new file mode 100644 index 0000000000..84825201b0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf90906_colAutoB.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf91122.docx b/sw/qa/extras/ooxmlexport/data/tdf91122.docx new file mode 100644 index 0000000000..c7a45e4dd9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf91122.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf91260.docx b/sw/qa/extras/ooxmlexport/data/tdf91260.docx new file mode 100644 index 0000000000..4888f498dd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf91260.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf91261.docx b/sw/qa/extras/ooxmlexport/data/tdf91261.docx new file mode 100644 index 0000000000..6edb8b8755 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf91261.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf91417.docx b/sw/qa/extras/ooxmlexport/data/tdf91417.docx new file mode 100644 index 0000000000..1427f8cb3a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf91417.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf91429.docx b/sw/qa/extras/ooxmlexport/data/tdf91429.docx new file mode 100644 index 0000000000..5fc5f533a8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf91429.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf91594.docx b/sw/qa/extras/ooxmlexport/data/tdf91594.docx new file mode 100644 index 0000000000..ea539afa3a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf91594.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92045.docx b/sw/qa/extras/ooxmlexport/data/tdf92045.docx new file mode 100644 index 0000000000..d41f523c79 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92045.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92124.docx b/sw/qa/extras/ooxmlexport/data/tdf92124.docx new file mode 100644 index 0000000000..2999311930 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92124.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92157.docx b/sw/qa/extras/ooxmlexport/data/tdf92157.docx new file mode 100644 index 0000000000..ba5bc2a8f5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92157.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92335.docx b/sw/qa/extras/ooxmlexport/data/tdf92335.docx new file mode 100644 index 0000000000..28cf521c2a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92335.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92454.docx b/sw/qa/extras/ooxmlexport/data/tdf92454.docx new file mode 100644 index 0000000000..70426685e2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92454.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92470_footnoteRestart.docx b/sw/qa/extras/ooxmlexport/data/tdf92470_footnoteRestart.docx new file mode 100644 index 0000000000..b8746968b4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92470_footnoteRestart.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92472.docx b/sw/qa/extras/ooxmlexport/data/tdf92472.docx new file mode 100644 index 0000000000..6cf2b50e91 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92472.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92521.odt b/sw/qa/extras/ooxmlexport/data/tdf92521.odt new file mode 100644 index 0000000000..8148e49a22 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92521.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92524_autoColor.doc b/sw/qa/extras/ooxmlexport/data/tdf92524_autoColor.doc new file mode 100644 index 0000000000..147e9c133b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92524_autoColor.doc differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92526_ShapeLineWidth.odt b/sw/qa/extras/ooxmlexport/data/tdf92526_ShapeLineWidth.odt new file mode 100644 index 0000000000..fffd9b9b20 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92526_ShapeLineWidth.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex.docx b/sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex.docx new file mode 100644 index 0000000000..808d05697b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex2.docx b/sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex2.docx new file mode 100644 index 0000000000..18b63c07c4 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf92724_continuousBreaksComplex2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf93676-1.odt b/sw/qa/extras/ooxmlexport/data/tdf93676-1.odt new file mode 100644 index 0000000000..37d621b903 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf93676-1.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf93919.docx b/sw/qa/extras/ooxmlexport/data/tdf93919.docx new file mode 100644 index 0000000000..c7454690c8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf93919.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf94043.docx b/sw/qa/extras/ooxmlexport/data/tdf94043.docx new file mode 100644 index 0000000000..fa47be0760 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf94043.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf94374.docx b/sw/qa/extras/ooxmlexport/data/tdf94374.docx new file mode 100644 index 0000000000..d5d8d43ebd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf94374.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf94628.docx b/sw/qa/extras/ooxmlexport/data/tdf94628.docx new file mode 100644 index 0000000000..aa1d226841 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf94628.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf94801.docx b/sw/qa/extras/ooxmlexport/data/tdf94801.docx new file mode 100644 index 0000000000..bdbd3f5e54 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf94801.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95031.docx b/sw/qa/extras/ooxmlexport/data/tdf95031.docx new file mode 100644 index 0000000000..ef082f7520 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95031.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95033.docx b/sw/qa/extras/ooxmlexport/data/tdf95033.docx new file mode 100644 index 0000000000..5d2cc73db9 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95033.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95189.docx b/sw/qa/extras/ooxmlexport/data/tdf95189.docx new file mode 100644 index 0000000000..456276b20d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95189.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95213.docx b/sw/qa/extras/ooxmlexport/data/tdf95213.docx new file mode 100644 index 0000000000..831d543b90 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95213.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95367_inheritFollowStyle.docx b/sw/qa/extras/ooxmlexport/data/tdf95367_inheritFollowStyle.docx new file mode 100644 index 0000000000..96d91ddcaf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95367_inheritFollowStyle.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95374.docx b/sw/qa/extras/ooxmlexport/data/tdf95374.docx new file mode 100644 index 0000000000..49599953a1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95374.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95376.docx b/sw/qa/extras/ooxmlexport/data/tdf95376.docx new file mode 100644 index 0000000000..9bd2d05b2e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95376.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95377.docx b/sw/qa/extras/ooxmlexport/data/tdf95377.docx new file mode 100644 index 0000000000..be5551dca2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95377.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95495.docx b/sw/qa/extras/ooxmlexport/data/tdf95495.docx new file mode 100644 index 0000000000..21f534b112 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95495.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95775.docx b/sw/qa/extras/ooxmlexport/data/tdf95775.docx new file mode 100644 index 0000000000..a4c1293a56 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95775.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95777.docx b/sw/qa/extras/ooxmlexport/data/tdf95777.docx new file mode 100644 index 0000000000..e71fdea609 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95777.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95848.docx b/sw/qa/extras/ooxmlexport/data/tdf95848.docx new file mode 100644 index 0000000000..3bf17f6928 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95848.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf95848_2.docx b/sw/qa/extras/ooxmlexport/data/tdf95848_2.docx new file mode 100644 index 0000000000..33c1773d5f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf95848_2.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf96750_landscapeFollow.docx b/sw/qa/extras/ooxmlexport/data/tdf96750_landscapeFollow.docx new file mode 100644 index 0000000000..612078b26b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf96750_landscapeFollow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf97090.docx b/sw/qa/extras/ooxmlexport/data/tdf97090.docx new file mode 100644 index 0000000000..3ba402718e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf97090.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf97371.docx b/sw/qa/extras/ooxmlexport/data/tdf97371.docx new file mode 100644 index 0000000000..87e67ddf87 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf97371.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf97517_testVmlLineShapeMirroredX.docx b/sw/qa/extras/ooxmlexport/data/tdf97517_testVmlLineShapeMirroredX.docx new file mode 100644 index 0000000000..75e9d8573b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf97517_testVmlLineShapeMirroredX.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf97618_testVmlShapeTextWordWrap.docx b/sw/qa/extras/ooxmlexport/data/tdf97618_testVmlShapeTextWordWrap.docx new file mode 100644 index 0000000000..eb31a1244c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf97618_testVmlShapeTextWordWrap.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf97648_relativeWidth.docx b/sw/qa/extras/ooxmlexport/data/tdf97648_relativeWidth.docx new file mode 100644 index 0000000000..686fd6803a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf97648_relativeWidth.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf98000_changePageStyle.odt b/sw/qa/extras/ooxmlexport/data/tdf98000_changePageStyle.odt new file mode 100644 index 0000000000..95f65e919f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf98000_changePageStyle.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf98620_environmentBiDi.odt b/sw/qa/extras/ooxmlexport/data/tdf98620_environmentBiDi.odt new file mode 100644 index 0000000000..ae675b82ff Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf98620_environmentBiDi.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf98700_keepWithNext.odt b/sw/qa/extras/ooxmlexport/data/tdf98700_keepWithNext.odt new file mode 100644 index 0000000000..4ed96da554 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf98700_keepWithNext.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99074.docx b/sw/qa/extras/ooxmlexport/data/tdf99074.docx new file mode 100644 index 0000000000..d7be418fb1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99074.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99090_pgbrkAfterTable.docx b/sw/qa/extras/ooxmlexport/data/tdf99090_pgbrkAfterTable.docx new file mode 100644 index 0000000000..c914f350ea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99090_pgbrkAfterTable.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99140.docx b/sw/qa/extras/ooxmlexport/data/tdf99140.docx new file mode 100644 index 0000000000..42fa73d2f8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99140.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99227.docx b/sw/qa/extras/ooxmlexport/data/tdf99227.docx new file mode 100644 index 0000000000..27ec4eb383 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99227.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript.docx b/sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript.docx new file mode 100644 index 0000000000..a88c122eeb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript2.odt b/sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript2.odt new file mode 100644 index 0000000000..a82c815646 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99602_charStyleSubscript2.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99602_subscript_charStyleSize.docx b/sw/qa/extras/ooxmlexport/data/tdf99602_subscript_charStyleSize.docx new file mode 100644 index 0000000000..6283b8de73 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99602_subscript_charStyleSize.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99616_hidemarkb.docx b/sw/qa/extras/ooxmlexport/data/tdf99616_hidemarkb.docx new file mode 100644 index 0000000000..825108a3cb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99616_hidemarkb.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99631.docx b/sw/qa/extras/ooxmlexport/data/tdf99631.docx new file mode 100644 index 0000000000..c72950b724 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99631.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tdf99810-lost-arrow.odt b/sw/qa/extras/ooxmlexport/data/tdf99810-lost-arrow.odt new file mode 100644 index 0000000000..20e60f6cef Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf99810-lost-arrow.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/test76108.docx b/sw/qa/extras/ooxmlexport/data/test76108.docx new file mode 100644 index 0000000000..3476dc58cf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test76108.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test76317.docx b/sw/qa/extras/ooxmlexport/data/test76317.docx new file mode 100644 index 0000000000..2c86cdc384 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test76317.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test76317_2K10.docx b/sw/qa/extras/ooxmlexport/data/test76317_2K10.docx new file mode 100644 index 0000000000..5532063408 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test76317_2K10.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test76734_2K7.docx b/sw/qa/extras/ooxmlexport/data/test76734_2K7.docx new file mode 100644 index 0000000000..5e0e114a5d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test76734_2K7.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test77219.docx b/sw/qa/extras/ooxmlexport/data/test77219.docx new file mode 100644 index 0000000000..29aca1bebb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test77219.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testCrashWhileSave.docx b/sw/qa/extras/ooxmlexport/data/testCrashWhileSave.docx new file mode 100644 index 0000000000..2059951711 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testCrashWhileSave.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testCustomShapePresetExport.odt b/sw/qa/extras/ooxmlexport/data/testCustomShapePresetExport.odt new file mode 100644 index 0000000000..4f132e7604 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testCustomShapePresetExport.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/testFootnote.docx b/sw/qa/extras/ooxmlexport/data/testFootnote.docx new file mode 100644 index 0000000000..5bba6d8c95 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testFootnote.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testGlossary.docx b/sw/qa/extras/ooxmlexport/data/testGlossary.docx new file mode 100644 index 0000000000..eb05758d2e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testGlossary.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testOuterShdw.docx b/sw/qa/extras/ooxmlexport/data/testOuterShdw.docx new file mode 100644 index 0000000000..cc559a323c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testOuterShdw.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testPageref.docx b/sw/qa/extras/ooxmlexport/data/testPageref.docx new file mode 100644 index 0000000000..65ca38aedd Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testPageref.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testParaListRightIndent.docx b/sw/qa/extras/ooxmlexport/data/testParaListRightIndent.docx new file mode 100644 index 0000000000..975b598f47 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testParaListRightIndent.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testPgMargin.docx b/sw/qa/extras/ooxmlexport/data/testPgMargin.docx new file mode 100644 index 0000000000..aa54f6ad70 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testPgMargin.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTOCFlag_u.docx b/sw/qa/extras/ooxmlexport/data/testTOCFlag_u.docx new file mode 100644 index 0000000000..077bccfef8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTOCFlag_u.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTcBorders.docx b/sw/qa/extras/ooxmlexport/data/testTcBorders.docx new file mode 100644 index 0000000000..b7fb81ad4c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTcBorders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTdf130167_spilloverHeader.docx b/sw/qa/extras/ooxmlexport/data/testTdf130167_spilloverHeader.docx new file mode 100644 index 0000000000..6bcafa285f Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTdf130167_spilloverHeader.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTextBoxZOrder.docx b/sw/qa/extras/ooxmlexport/data/testTextBoxZOrder.docx new file mode 100644 index 0000000000..c6dd0b8f30 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTextBoxZOrder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTitlePage.docx b/sw/qa/extras/ooxmlexport/data/testTitlePage.docx new file mode 100644 index 0000000000..72bfdf81f8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTitlePage.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedEmptyParagraph.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedEmptyParagraph.docx new file mode 100644 index 0000000000..bd332efa4c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedEmptyParagraph.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedParagraphMark.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedParagraphMark.docx new file mode 100644 index 0000000000..5d85f326d3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedParagraphMark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableCell.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableCell.docx new file mode 100644 index 0000000000..c4d8394bf1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableCell.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableRow.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableRow.docx new file mode 100644 index 0000000000..71c4998786 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesDeletedTableRow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesEmptyParagraphsInADeletion.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesEmptyParagraphsInADeletion.docx new file mode 100644 index 0000000000..fcd78e9cd1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesEmptyParagraphsInADeletion.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedParagraphMark.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedParagraphMark.docx new file mode 100644 index 0000000000..33b4516137 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedParagraphMark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableCell.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableCell.docx new file mode 100644 index 0000000000..d1450be673 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableCell.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableRow.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableRow.docx new file mode 100644 index 0000000000..a7c0f56ed6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesInsertedTableRow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testTrackChangesParagraphProperties.docx b/sw/qa/extras/ooxmlexport/data/testTrackChangesParagraphProperties.docx new file mode 100644 index 0000000000..4a8585c1d0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testTrackChangesParagraphProperties.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testWPGZOrder.docx b/sw/qa/extras/ooxmlexport/data/testWPGZOrder.docx new file mode 100644 index 0000000000..664f47a0b6 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testWPGZOrder.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testWPGtextboxes.docx b/sw/qa/extras/ooxmlexport/data/testWPGtextboxes.docx new file mode 100644 index 0000000000..eb7486f2a3 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testWPGtextboxes.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx b/sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx new file mode 100644 index 0000000000..c860828fa8 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/testWordArtWithinDraingtool.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_GIF_ImageCrop.docx b/sw/qa/extras/ooxmlexport/data/test_GIF_ImageCrop.docx new file mode 100644 index 0000000000..8fe7ff2225 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_GIF_ImageCrop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_PNG_ImageCrop.docx b/sw/qa/extras/ooxmlexport/data/test_PNG_ImageCrop.docx new file mode 100644 index 0000000000..7fda32144d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_PNG_ImageCrop.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_extra_image.docx b/sw/qa/extras/ooxmlexport/data/test_extra_image.docx new file mode 100644 index 0000000000..cdb05afa44 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_extra_image.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_indentation.docx b/sw/qa/extras/ooxmlexport/data/test_indentation.docx new file mode 100644 index 0000000000..b39e066584 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_indentation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_line_spacing.docx b/sw/qa/extras/ooxmlexport/data/test_line_spacing.docx new file mode 100644 index 0000000000..2f92afbb70 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_line_spacing.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_msword_hang.docx b/sw/qa/extras/ooxmlexport/data/test_msword_hang.docx new file mode 100644 index 0000000000..cae7814f98 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_msword_hang.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_ole_object.docx b/sw/qa/extras/ooxmlexport/data/test_ole_object.docx new file mode 100644 index 0000000000..4391946f08 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_ole_object.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_sdt_datepicker.docx b/sw/qa/extras/ooxmlexport/data/test_sdt_datepicker.docx new file mode 100644 index 0000000000..3ff04cb60b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_sdt_datepicker.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_segfault_while_save.docx b/sw/qa/extras/ooxmlexport/data/test_segfault_while_save.docx new file mode 100644 index 0000000000..1c364dd0de Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_segfault_while_save.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/test_tdf120412.docx b/sw/qa/extras/ooxmlexport/data/test_tdf120412.docx new file mode 100644 index 0000000000..6ce527842c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/test_tdf120412.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textWatermark.docx b/sw/qa/extras/ooxmlexport/data/textWatermark.docx new file mode 100644 index 0000000000..c8bff75e02 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textWatermark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/text_cardinal_list.docx b/sw/qa/extras/ooxmlexport/data/text_cardinal_list.docx new file mode 100644 index 0000000000..9a1efd7c69 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/text_cardinal_list.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/text_number_list.docx b/sw/qa/extras/ooxmlexport/data/text_number_list.docx new file mode 100644 index 0000000000..674c4e797c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/text_number_list.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/text_ordinal_list.docx b/sw/qa/extras/ooxmlexport/data/text_ordinal_list.docx new file mode 100644 index 0000000000..bb5b4f520e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/text_ordinal_list.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textbox-right-edge.docx b/sw/qa/extras/ooxmlexport/data/textbox-right-edge.docx new file mode 100644 index 0000000000..990d1e49ea Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textbox-right-edge.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textbox-rounded-corners.docx b/sw/qa/extras/ooxmlexport/data/textbox-rounded-corners.docx new file mode 100644 index 0000000000..012e071cd1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textbox-rounded-corners.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textbox-table.docx b/sw/qa/extras/ooxmlexport/data/textbox-table.docx new file mode 100644 index 0000000000..8c06f5eeb0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textbox-table.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textbox-wpg-only.docx b/sw/qa/extras/ooxmlexport/data/textbox-wpg-only.docx new file mode 100644 index 0000000000..cd853f97d5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textbox-wpg-only.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textbox_picturefill.docx b/sw/qa/extras/ooxmlexport/data/textbox_picturefill.docx new file mode 100644 index 0000000000..f4fab1b1fe Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textbox_picturefill.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textframe-borders.docx b/sw/qa/extras/ooxmlexport/data/textframe-borders.docx new file mode 100644 index 0000000000..424ed2a32c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textframe-borders.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textframe-gradient.docx b/sw/qa/extras/ooxmlexport/data/textframe-gradient.docx new file mode 100644 index 0000000000..edbfe53b16 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textframe-gradient.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/textframes.odt b/sw/qa/extras/ooxmlexport/data/textframes.odt new file mode 100644 index 0000000000..301744af3e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textframes.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/textinput.odt b/sw/qa/extras/ooxmlexport/data/textinput.odt new file mode 100644 index 0000000000..3a5da684a0 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/textinput.odt differ diff --git a/sw/qa/extras/ooxmlexport/data/theme-preservation.docx b/sw/qa/extras/ooxmlexport/data/theme-preservation.docx new file mode 100644 index 0000000000..2de4374da5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/theme-preservation.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/toc_doc.docx b/sw/qa/extras/ooxmlexport/data/toc_doc.docx new file mode 100644 index 0000000000..26fa3dc715 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/toc_doc.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tools-line-numbering.docx b/sw/qa/extras/ooxmlexport/data/tools-line-numbering.docx new file mode 100644 index 0000000000..8fb2668b32 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tools-line-numbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/toxmarkhyperlink.fodt b/sw/qa/extras/ooxmlexport/data/toxmarkhyperlink.fodt new file mode 100644 index 0000000000..b1323f6f41 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/toxmarkhyperlink.fodt @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foo + foo + foo + foo + foo + foo + foo + foo + foobar + foo[fuh] + + + + + diff --git a/sw/qa/extras/ooxmlexport/data/transparent-shadow.docx b/sw/qa/extras/ooxmlexport/data/transparent-shadow.docx new file mode 100644 index 0000000000..267eb1a863 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/transparent-shadow.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/tscp.docx b/sw/qa/extras/ooxmlexport/data/tscp.docx new file mode 100644 index 0000000000..bbb32b178b Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tscp.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/unbalanced-columns.docx b/sw/qa/extras/ooxmlexport/data/unbalanced-columns.docx new file mode 100644 index 0000000000..da6f93f760 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/unbalanced-columns.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/unwanted-section-break.docx b/sw/qa/extras/ooxmlexport/data/unwanted-section-break.docx new file mode 100644 index 0000000000..a8565742f5 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/unwanted-section-break.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/vml-text-vertical-adjust.docx b/sw/qa/extras/ooxmlexport/data/vml-text-vertical-adjust.docx new file mode 100644 index 0000000000..1b05dbd6ed Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/vml-text-vertical-adjust.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/watermark-font.docx b/sw/qa/extras/ooxmlexport/data/watermark-font.docx new file mode 100644 index 0000000000..5a09dc9f78 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/watermark-font.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/watermark-shapetype.docx b/sw/qa/extras/ooxmlexport/data/watermark-shapetype.docx new file mode 100644 index 0000000000..423f3cf718 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/watermark-shapetype.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/watermark.docx b/sw/qa/extras/ooxmlexport/data/watermark.docx new file mode 100644 index 0000000000..98c305af8c Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/watermark.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/wpg-nested.docx b/sw/qa/extras/ooxmlexport/data/wpg-nested.docx new file mode 100644 index 0000000000..eba2aad0e7 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/wpg-nested.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/wpg-only.docx b/sw/qa/extras/ooxmlexport/data/wpg-only.docx new file mode 100644 index 0000000000..7c86361f9d Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/wpg-only.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/wps-char-color.docx b/sw/qa/extras/ooxmlexport/data/wps-char-color.docx new file mode 100644 index 0000000000..a027e92be1 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/wps-char-color.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/wps-only.docx b/sw/qa/extras/ooxmlexport/data/wps-only.docx new file mode 100644 index 0000000000..7f7b8c75bc Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/wps-only.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/wrap-tight-through.docx b/sw/qa/extras/ooxmlexport/data/wrap-tight-through.docx new file mode 100644 index 0000000000..1ea9e14788 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/wrap-tight-through.docx differ diff --git a/sw/qa/extras/ooxmlexport/data/zoom.docx b/sw/qa/extras/ooxmlexport/data/zoom.docx new file mode 100644 index 0000000000..ce93a1a9bb Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/zoom.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxml_ThemeExport.cxx b/sw/qa/extras/ooxmlexport/ooxml_ThemeExport.cxx new file mode 100644 index 0000000000..a0ffe87d00 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxml_ThemeExport.cxx @@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") + { + } +}; + +DECLARE_SW_ROUNDTRIP_TEST(testThemePortionLevelCharColor_ODF, + "Test_ThemePortionLevel_CharColor.fodt", nullptr, Test) +{ + auto xParagraph = getParagraph(1); + CPPUNIT_ASSERT(xParagraph.is()); + auto xComplexColor = getProperty>(getRun(xParagraph, 1), + "CharComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent2, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Tint, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), rTransforms[0].mnValue); +} + +DECLARE_SW_ROUNDTRIP_TEST(testThemePortionLevelCharColor_DOCX, + "Test_ThemePortionLevel_CharColor.docx", nullptr, Test) +{ + auto xParagraph = getParagraph(1); + CPPUNIT_ASSERT(xParagraph.is()); + auto xComplexColor = getProperty>(getRun(xParagraph, 1), + "CharComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent2, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Tint, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), rTransforms[0].mnValue); +} + +DECLARE_SW_ROUNDTRIP_TEST(testThemePortionBorderColor_DOCX, "Test_ThemeBorderColor.docx", nullptr, + Test) +{ + auto xParagraph = getParagraph(1); + CPPUNIT_ASSERT(xParagraph.is()); + { + auto xComplexColor + = getProperty>(xParagraph, "TopBorderComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent2, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Tint, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), rTransforms[0].mnValue); + } + { + auto xComplexColor = getProperty>( + xParagraph, "BottomBorderComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent4, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Tint, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4000), rTransforms[0].mnValue); + } + + CPPUNIT_ASSERT(isPropertyVoid(xParagraph, "LeftBorderComplexColor")); + CPPUNIT_ASSERT(isPropertyVoid(xParagraph, "RightBorderComplexColor")); +} + +DECLARE_SW_ROUNDTRIP_TEST(testCharUnderlineTheme_DOCX, "Test_CharUnderlineThemeColor.docx", nullptr, + Test) +{ + auto xParagraph = getParagraph(1); + CPPUNIT_ASSERT(xParagraph.is()); + auto xRun = getRun(xParagraph, 1); + auto xComplexColor + = getProperty>(xRun, "CharUnderlineComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent1, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Shade, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2509), rTransforms[0].mnValue); +} + +DECLARE_SW_ROUNDTRIP_TEST(testParaBackgroundTheme_DOCX, "Test_ThemeTextParaBackgroundColor.docx", + nullptr, Test) +{ + { + auto xParagraph = getParagraph(1); + CPPUNIT_ASSERT(xParagraph.is()); + auto xComplexColor = getProperty>( + xParagraph, "ParaBackgroundComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent3, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Tint, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(8000), rTransforms[0].mnValue); + } + + { + auto xParagraph = getParagraph(2); + CPPUNIT_ASSERT(xParagraph.is()); + auto xComplexColor = getProperty>( + xParagraph, "ParaBackgroundComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent6, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Tint, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(8000), rTransforms[0].mnValue); + } + + { + auto xParagraph = getParagraph(3); + CPPUNIT_ASSERT(xParagraph.is()); + auto xComplexColor = getProperty>( + xParagraph, "ParaBackgroundComplexColor"); + auto aComplexColor = model::color::getFromXComplexColor(xComplexColor); + CPPUNIT_ASSERT_EQUAL(model::ThemeColorType::Accent3, aComplexColor.getThemeColorType()); + auto const& rTransforms = aComplexColor.getTransformations(); + CPPUNIT_ASSERT_EQUAL(size_t(1), rTransforms.size()); + CPPUNIT_ASSERT_EQUAL(model::TransformationType::Tint, rTransforms[0].meType); + CPPUNIT_ASSERT_EQUAL(sal_Int16(8000), rTransforms[0].mnValue); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlencryption.cxx b/sw/qa/extras/ooxmlexport/ooxmlencryption.cxx new file mode 100644 index 0000000000..1c15b6efa3 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlencryption.cxx @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") + { + } +}; + +DECLARE_SW_ROUNDTRIP_TEST(testPasswordMSO2007, "Encrypted_MSO2007_abc.docx", "abc", Test) +{ + // Standard encryption format, AES 128, SHA1 + uno::Reference xParagraph(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(OUString("abc"), xParagraph->getString()); +} + +DECLARE_SW_ROUNDTRIP_TEST(testPasswordMSO2010, "Encrypted_MSO2010_abc.docx", "abc", Test) +{ + // Agile encryption format, AES 128, CBC, SHA1 + uno::Reference xParagraph(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(OUString("abc"), xParagraph->getString()); +} + +DECLARE_SW_ROUNDTRIP_TEST(testPasswordMSO2013, "Encrypted_MSO2013_abc.docx", "abc", Test) +{ + // Agile encryption format, AES 256, CBC, SHA512 + uno::Reference xParagraph(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(OUString("ABC"), xParagraph->getString()); +} + +DECLARE_SW_ROUNDTRIP_TEST(testPasswordLOStandard, "Encrypted_LO_Standard_abc.docx", "abc", Test) +{ + // Standard encryption format, AES 128, SHA1 + uno::Reference xParagraph(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(OUString("ABC"), xParagraph->getString()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx new file mode 100644 index 0000000000..6293b6c44d --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -0,0 +1,982 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testfdo81381) +{ + loadAndSave("fdo81381.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:object[1]/o:OLEObject[1]"_ostr, "DrawAspect"_ostr, "Icon"); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtAlias) +{ + loadAndSave("sdt-alias.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // was completely missing. + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:alias"_ostr, "val"_ostr, "Subtitle"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFooterBodyDistance) +{ + loadAndSave("footer-body-distance.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Page break was exported as section break, this was 0 + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:br"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testfdo81031, "fdo81031.docx") +{ + // vml image was not rendered + // As there are also numPicBullets in the file, + // the fragmentPath was not changed hence relationships were not resolved. + + uno::Reference image = getShape(1); + uno::Reference xImage(image, uno::UNO_QUERY); + uno::Reference xGraphic = getProperty >(xImage, "Graphic"); + uno::Reference xBitmap(xGraphic, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( static_cast(381), xBitmap->getSize().Width ); + CPPUNIT_ASSERT_EQUAL( static_cast(148), xBitmap->getSize().Height ); +} + +CPPUNIT_TEST_FIXTURE(Test, testPlausableBorder) +{ + loadAndSave("plausable-border.docx"); + // sw::util::IsPlausableSingleWordSection() did not merge two page styles due to borders. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Page break was exported as section break, this was 0 + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:br"_ostr, 1); + + CPPUNIT_ASSERT_EQUAL( 2, getPages() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testUnwantedSectionBreak) +{ + loadAndSave("unwanted-section-break.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 2: an additional sectPr was added to the document. + assertXPath(pXmlDoc, "//w:sectPr"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo80897 ) +{ + loadAndSave("fdo80897.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:bodyPr/a:prstTxWarp"_ostr, "prst"_ostr, "textTriangle"); +} + + +DECLARE_OOXMLEXPORT_TEST(testFdo80997, "fdo80997.docx") +{ + // The problem was that the DOCX exporter not able to export text behind textbox, if textbox has a wrap property. + uno::Reference< text::XTextRange > xParagraph = getParagraph( 1 ); + getRun( xParagraph, 1, " text"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo80902) +{ + loadAndSave("fdo80902.docx"); + // The problem was that the docGrid type was set as default so fix it for other grid type + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:docGrid"_ostr, "type"_ostr, "lines"); +} + +CPPUNIT_TEST_FIXTURE(Test, testParaShading) +{ + loadAndSave("para-shading.docx"); + // Make sure the themeColor attribute is not written when it would be empty. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathNoAttribute(pXmlDoc, "/w:document/w:body/w:p/w:pPr/w:shd"_ostr, "themeColor"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testFDO83044) +{ + loadAndSave("fdo83044.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:text"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testfdo83428, "fdo83428.docx") +{ + uno::Reference xDocumentPropertiesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xProps(xDocumentPropertiesSupplier->getDocumentProperties()); + uno::Reference xUDProps(xProps->getUserDefinedProperties(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Document"), getProperty(xUDProps, "Testing")); +} + +CPPUNIT_TEST_FIXTURE(Test, testShapeInFloattable) +{ + loadAndSave("shape-in-floattable.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // No nested drawingML w:txbxContent. + assertXPath(pXmlDoc, "//mc:Choice//w:txbxContent//w:txbxContent"_ostr, 0); + // Instead, make sure we have a separate shape and a table + assertXPath(pXmlDoc, "//mc:AlternateContent//mc:Choice[@Requires='wpg']"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testEmptyAnnotationMark) +{ + loadAndReload("empty-annotation-mark.docx"); + // Delete the word that is commented, and save again. + uno::Reference xRun = getRun(getParagraph(1), 3); + CPPUNIT_ASSERT_EQUAL(OUString("with"), xRun->getString()); + xRun->setString(""); + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->store(); + + // Then inspect the OOXML markup of the modified document model. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // There were two commentReference nodes. + assertXPath(pXmlDoc, "//w:commentReference"_ostr, "id"_ostr, "0"); + // Empty comment range was not ignored on export, this was 1. + assertXPath(pXmlDoc, "//w:commentRangeStart"_ostr, 0); + // Ditto. + assertXPath(pXmlDoc, "//w:commentRangeEnd"_ostr, 0); +} + +DECLARE_OOXMLEXPORT_TEST(testDropdownInCell, "dropdown-in-cell.docx") +{ + // First problem: table was missing from the document, this was 0. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + // Second problem: dropdown shape wasn't anchored inside the B1 cell. + if (getShapes() > 0) + { + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + uno::Reference xAnchor = xShape->getAnchor(); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("B1"), uno::UNO_QUERY); + uno::Reference xTextRangeCompare(xCell, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xTextRangeCompare->compareRegionStarts(xAnchor, xCell)); + } + else if (!isExported()) + { + // ComboBox was imported as DropDown text field + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.textfield.DropDown")); + } + else + { + // DropDown text field is exported as inline SDT, we import that back here. + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("B1"); + uno::Reference xParagraphsAccess(xCell, uno::UNO_QUERY); + uno::Reference xParagraphs = xParagraphsAccess->createEnumeration(); + uno::Reference xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference xPortions = xParagraph->createEnumeration(); + uno::Reference xTextPortion(xPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + uno::Sequence aListItems; + xContentControlProps->getPropertyValue("ListItems") >>= aListItems; + CPPUNIT_ASSERT(aListItems.hasElements()); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTableAlignment, "table-alignment.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + // This was LEFT_AND_WIDTH, i.e. table alignment wasn't imported correctly. + CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::RIGHT, getProperty(xTable, "HoriOrient")); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtIgnoredFooter) +{ + loadAndSave("sdt-ignored-footer.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 1, make sure no w:sdt sneaks into the main document from the footer. + assertXPath(pXmlDoc, "//w:sdt"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtRunPicture) +{ + loadAndSave("sdt-run-picture.docx"); + // SDT around run was exported as SDT around paragraph + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 1: there was an SDT around w:p. + assertXPath(pXmlDoc, "//w:body/w:sdt"_ostr, 0); + // This was 0: there were no SDT around w:r. + assertXPath(pXmlDoc, "//w:body/w:p/w:sdt"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testChartDupe, "chart-dupe.docx") +{ + // Single chart was exported back as two charts. + uno::Reference xTextEmbeddedObjectsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xEmbeddedObjects(xTextEmbeddedObjectsSupplier->getEmbeddedObjects(), uno::UNO_QUERY); + // This was 2, on second import we got a duplicated chart copy. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xEmbeddedObjects->getCount()); + + + if (!isExported()) + return; // initial import + + xmlDocUniquePtr pXmlDocCT = parseExport("[Content_Types].xml"); + + assertXPath(pXmlDocCT, + "/ContentType:Types/ContentType:Override[@PartName='/word/charts/chart1.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.drawingml.chart+xml"); + assertXPath(pXmlDocCT, "/ContentType:Types/ContentType:Override[@PartName='/word/embeddings/Microsoft_Excel_Worksheet1.xlsx']"_ostr, "ContentType"_ostr, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/charts/_rels/chart1.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='../embeddings/Microsoft_Excel_Worksheet1.xlsx']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + // check the content too + xmlDocUniquePtr pXmlDocChart1 = parseExport("word/charts/chart1.xml"); + assertXPath(pXmlDocChart1, + "/c:chartSpace/c:externalData"_ostr, + "id"_ostr, + "rId1"); +} + +DECLARE_OOXMLEXPORT_TEST(testPositionAndRotation, "position-and-rotation.docx") +{ + // The document should look like: "This line is tricky, because only 'This line is tricky,' is on the left." + // But the image was pushed down, so it did not break the line into two text portions. + uno::Reference xShape = getShape(1); + // Should be 1559, was -5639 + CPPUNIT_ASSERT(xShape->getPosition().X > 1500); + // Should be 88, was 473 + CPPUNIT_ASSERT(xShape->getPosition().Y < 100); +} + +DECLARE_OOXMLEXPORT_TEST(testNumberingFont, "numbering-font.docx") +{ + // check that the original numrule font name is still Calibri + uno::Reference xStyle(getStyles("CharacterStyles")->getByName("ListLabel 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Calibri"), getProperty(xStyle, "CharFontName")); + + uno::Reference xPara = getParagraph(2); + uno::Reference properties(xPara, uno::UNO_QUERY); + uno::Any aValue = properties->getPropertyValue("ListAutoFormat"); + CPPUNIT_ASSERT(aValue.hasValue()); + uno::Sequence aListAutoFormat; + CPPUNIT_ASSERT(aValue >>= aListAutoFormat); + auto it = std::find_if(std::cbegin(aListAutoFormat), std::cend(aListAutoFormat), + [](const css::beans::NamedValue& val) { return val.Name == "CharFontName"; }); + CPPUNIT_ASSERT(it != std::cend(aListAutoFormat)); + OUString sOverrideFontName; + CPPUNIT_ASSERT(it->Value >>= sOverrideFontName); + // but the overridden font name is Verdana + CPPUNIT_ASSERT_EQUAL(OUString("Verdana"), sOverrideFontName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf106541_noinheritChapterNumbering) +{ + loadAndReload("tdf106541_noinheritChapterNumbering.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // in LO, it appears that styles based on the Chapter Numbering style explicitly set the + // numbering style/outline level to 0 by default, and that LO prevents inheriting directly from "Outline" style. + // Adding this preventative unit test to ensure that any fix for tdf106541 doesn't make incorrect assumptions. + +//reverting tdf#76817 hard-codes the numbering style on the paragraph, preventing RT of "Outline" style +// CPPUNIT_ASSERT_EQUAL(OUString("Outline"), getProperty(getParagraph(1), "NumberingStyleName")); + + OUString sPara3NumberingStyle = getProperty(getParagraph(3), "NumberingStyleName"); + CPPUNIT_ASSERT_EQUAL(sPara3NumberingStyle, getProperty(getParagraph(4), "NumberingStyleName")); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//body/txt/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, 3); //three of the four paragraphs have numbering + assertXPath(pXmlDoc, "//body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr, "1"); + assertXPath(pXmlDoc, "//body/txt[2]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, 0); //second paragraph style disables numbering + assertXPath(pXmlDoc, "//body/txt[3]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr, "I."); + assertXPath(pXmlDoc, "//body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr, "II."); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf53856_conflictingStyle, "tdf53856_conflictingStyle.docx") +{ + // The "Text" style conflicted with builtin paragraph style Caption -> Text + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Text"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Times New Roman"), getProperty(xStyle, "CharFontName")); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xStyle, "CharPosture")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf104713_undefinedStyles, "tdf104713_undefinedStyles.docx") +{ + // Normal paragraph style was not defined, so don't replace conflicting styles + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Heading 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(212), getProperty(xStyle, "ParaBottomMargin")); + + // tdf108765: once importing is finished, use default values for any styles not yet defined. + xStyle.set( getStyles("ParagraphStyles")->getByName("Footnote"), uno::UNO_QUERY ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Font size", 10.f, getProperty(xStyle, "CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testDrawingmlFlipv) +{ + loadAndSave("drawingml-flipv.docx"); + // The problem was that the shape had vertical flip only, but then we added rotation as well on export. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathNoAttribute(pXmlDoc, "//a:xfrm"_ostr, "rot"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testRot90Fliph) +{ + loadAndSave("rot90-fliph.docx"); + // The problem was that a shape rotation of 90° got turned into 270° after roundtrip. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//a:xfrm"_ostr, "flipH"_ostr, "1"); + // This was 16200000 (270 * 60000). + assertXPath(pXmlDoc, "//a:xfrm"_ostr, "rot"_ostr, "5400000"); +} + +CPPUNIT_TEST_FIXTURE(Test, testRot180Flipv) +{ + loadAndSave("rot180-flipv.docx"); + // 180° rotation got lost after roundtrip. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//a:xfrm"_ostr, "flipV"_ostr, "1"); + // This attribute was completely missing. + assertXPath(pXmlDoc, "//a:xfrm"_ostr, "rot"_ostr, "10800000"); +} + +CPPUNIT_TEST_FIXTURE(Test, testRot270Flipv) +{ + loadAndSave("rot270-flipv.docx"); + // 270° rotation got turned into 90° after roundtrip. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//a:xfrm"_ostr, "flipV"_ostr, "1"); + // This was 5400000. + assertXPath(pXmlDoc, "//a:xfrm"_ostr, "rot"_ostr, "16200000"); +} + +DECLARE_OOXMLEXPORT_TEST(testWpsCharColor, "wps-char-color.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // This was -1, i.e. the character color was default (-1), not white. + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xShape->getStart(), "CharColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTableStyleCellBackColor, "table-style-cell-back-color.docx") +{ + // The problem was that cell background was white, not green. + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A1"); + // This was 0xffffff. + CPPUNIT_ASSERT_EQUAL(Color(0x00ff00), getProperty(xCell, "BackColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTableStyleBorder, "table-style-border.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // This was 0, the second cell was missing its right border. + uno::Reference xCell = xTable->getCellByName("A2"); + CPPUNIT_ASSERT(getProperty(xCell, "RightBorder").LineWidth > 0); + + // This was also 0 (even after fixing the previous problem), the first cell was missing its right border, too. + xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT(getProperty(xCell, "RightBorder").LineWidth > 0); +} + +DECLARE_OOXMLEXPORT_TEST(testTableStyleBorderExport, "table-style-border-export.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A3"); + // Bottom border was white, so this was 0xffffff. + CPPUNIT_ASSERT_EQUAL(Color(0x8064A2), Color(ColorTransparency, getProperty(xCell, "BottomBorder").Color)); +} + +DECLARE_OOXMLEXPORT_TEST(testAnchorPosition, "anchor-position.docx") +{ + // The problem was that the at-char anchored picture was at the end of the + // paragraph, so there were only two positions: a Text, then a Frame one. + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(getRun(getParagraph(1), 1), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), getProperty(getRun(getParagraph(1), 2), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(getRun(getParagraph(1), 3), "TextPortionType")); +} + +DECLARE_OOXMLEXPORT_TEST(testMultiPageToc, "multi-page-toc.docx") +{ + // Import of this document triggered an STL assertion. + + // Document has a ToC from its second paragraph. + uno::Reference xTextSection = getProperty< uno::Reference >(getParagraph(2), "TextSection"); + CPPUNIT_ASSERT_EQUAL(OUString("Table of Contents1"), xTextSection->getName()); + // There should be a field in the header as well. + uno::Reference xHeaderText = getProperty< uno::Reference >(getStyles("PageStyles")->getByName("Standard"), "HeaderText"); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(getRun(getParagraphOfText(1, xHeaderText), 1), "TextPortionType")); +} + +DECLARE_OOXMLEXPORT_TEST(testTextboxTable, "textbox-table.docx") +{ + // We wrote not-well-formed XML during export for this one: + // Shape with textbox, having a table and also anchored inside a table. + + // Just make sure that we have both tables. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testCropPixel) +{ + loadAndSave("crop-pixel.docx"); + // If map mode of the graphic is in pixels, then we used to handle original + // size of the graphic as mm100, but it was in pixels. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This is 17667 in the original document, was 504666 (so the image + // become invisible), now is around 19072. + CPPUNIT_ASSERT(getXPath(pXmlDoc, "//a:srcRect"_ostr, "l"_ostr).toInt32() <= 22452); +} +/* FixMe: tdf#142805 Test disabled, because the picture is not load at all. +CPPUNIT_TEST_FIXTURE(Test, testEffectExtent) +{ + loadAndSave("effect-extent.docx"); + // The problem was that in case there were no shadows on the picture, we + // wrote a full or zeros. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // E.g. this was 0. + assertXPath(pXmlDoc, "//wp:effectExtent", "l", "114300"); +} +*/ +CPPUNIT_TEST_FIXTURE(Test, testEffectExtentInline) +{ + loadAndSave("effect-extent-inline.docx"); + // The problem was that in case there was inline rotated picture, we + // wrote a full or zeros. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // E.g. this was 0. + assertXPath(pXmlDoc, "//wp:effectExtent"_ostr, "l"_ostr, "609600"); + assertXPath(pXmlDoc, "//wp:effectExtent"_ostr, "r"_ostr, "590550"); + assertXPath(pXmlDoc, "//wp:effectExtent"_ostr, "t"_ostr, "590550"); + assertXPath(pXmlDoc, "//wp:effectExtent"_ostr, "b"_ostr, "571500"); +} + +DECLARE_OOXMLEXPORT_TEST(testEm, "em.docx") +{ + // Test all possible arguments. + CPPUNIT_ASSERT_EQUAL(text::FontEmphasis::NONE, getProperty(getRun(getParagraph(1), 1), "CharEmphasis")); + // This was ACCENT_ABOVE. + CPPUNIT_ASSERT_EQUAL(text::FontEmphasis::DOT_ABOVE, getProperty(getRun(getParagraph(1), 2), "CharEmphasis")); + // This was DOT_ABOVE. + CPPUNIT_ASSERT_EQUAL(text::FontEmphasis::ACCENT_ABOVE, getProperty(getRun(getParagraph(1), 3), "CharEmphasis")); + CPPUNIT_ASSERT_EQUAL(text::FontEmphasis::CIRCLE_ABOVE, getProperty(getRun(getParagraph(1), 4), "CharEmphasis")); + CPPUNIT_ASSERT_EQUAL(text::FontEmphasis::DOT_BELOW, getProperty(getRun(getParagraph(1), 5), "CharEmphasis")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo77716, "fdo77716.docx") +{ + // The problem was that there should be 200 twips spacing between the two paragraphs, but there wasn't any. + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Standard"), uno::UNO_QUERY); + // This was 0. + CPPUNIT_ASSERT_EQUAL(static_cast(convertTwipToMm100(200)), getProperty(xStyle, "ParaBottomMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testAfterlines, "afterlines.docx") +{ + // This was 353, i.e. the value of from , instead of from . + CPPUNIT_ASSERT_EQUAL(static_cast(423), getProperty(getParagraph(1), "ParaBottomMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testParagraphMark, "paragraph-mark.docx") +{ + // The problem was that we didn't handle the situation when an empty paragraph's marker had both a char style and some direct formatting. + + // This was 11. + CPPUNIT_ASSERT_EQUAL(12.f, getProperty(getParagraph(1), "CharHeight")); + // This was empty. + CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), getProperty(getRun(getParagraph(1), 1), "CharStyleName")); +} + +DECLARE_OOXMLEXPORT_TEST(testParagraphMark2, "paragraph-mark2.docx") +{ + // The problem was that we didn't handle the situation when an empty paragraph's marker had both a char style and some direct formatting. + + // This was Segoe UI, set by Char Style FontStyle11 presumably. + CPPUNIT_ASSERT_EQUAL(OUString("Arial"), getProperty(getRun(getParagraph(1), 1), "CharFontName")); + // This was 11, set by Char Style FontStyle11 presumably. + CPPUNIT_ASSERT_EQUAL(10.f, getProperty(getRun(getParagraph(1), 1), "CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testParagraphMarkNonempty) +{ + loadAndSave("paragraph-mark-nonempty.odt"); + validate(maTempFile.GetFileName(), test::OOXML); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // There were two elements, make sure the 40 one is dropped and the 20 one is kept. + assertXPath(pXmlDoc, "//w:p/w:pPr/w:rPr/w:sz"_ostr, "val"_ostr, "20"); +} + +DECLARE_OOXMLEXPORT_TEST(testPageBreakBefore, "page-break-before.docx") +{ + // This was style::BreakType_PAGE_BEFORE, i.e. page break wasn't ignored, as it should have been. + CPPUNIT_ASSERT_EQUAL(style::BreakType_NONE, getProperty(getParagraph(2), "BreakType")); +} + +DECLARE_OOXMLEXPORT_TEST(testTableRtl, "table-rtl.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + // This was text::WritingMode2::LR_TB, i.e. direction of the table was ignored. + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, getProperty(xTable, "WritingMode")); +} + +DECLARE_OOXMLEXPORT_TEST(testTableLr, "table-ltr.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + // This was text::WritingMode2::RL_TB, i.e. direction of the table was wrongly guessed. + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::CONTEXT, getProperty(xTable, "WritingMode")); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlCjklist30, "cjklist30.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::TIAN_GAN_ZH, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlCjklist31, "cjklist31.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::DI_ZI_ZH, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlCjklist34, "cjklist34.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::NUMBER_UPPER_ZH_TW, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlCjklist35, "cjklist35.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::NUMBER_LOWER_ZH, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlCjklist44, "cjklist44.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::NUMBER_DIGITAL2_KO, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlTextNumberList, "text_number_list.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::TEXT_NUMBER, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlTextCardinalList, "text_cardinal_list.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::TEXT_CARDINAL, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlTextOrdinalList, "text_ordinal_list.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::TEXT_ORDINAL, numFormat); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlSymbolChicagoList, "symbol_chicago_list.docx") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::SYMBOL_CHICAGO, numFormat); +} + +CPPUNIT_TEST_FIXTURE(Test, testOoxmlNumListZHTW) +{ + loadAndSave("numlist-zhtw.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + + assertXPath ( pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:numFmt"_ostr,"val"_ostr,"taiwaneseCountingThousand" ); +} + +CPPUNIT_TEST_FIXTURE(Test, testOoxmlNumListZHCN) +{ + loadAndSave("numlist-zhcn.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + + assertXPath ( pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:numFmt"_ostr,"val"_ostr,"chineseCountingThousand" ); +} + +CPPUNIT_TEST_FIXTURE(Test, testOOxmlOutlineNumberTypes) +{ + loadAndSave("outline-number-types.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:pStyle"_ostr, "val"_ostr, "Heading1"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:numFmt"_ostr, "val"_ostr, "none"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[2]/w:numFmt"_ostr, "val"_ostr, "decimalEnclosedCircle"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[3]/w:numFmt"_ostr, "val"_ostr, "decimal"); // CHARS_GREEK_UPPER_LETTER fallback to decimal + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[4]/w:numFmt"_ostr, "val"_ostr, "decimal"); // CHARS_GREEK_LOWER_LETTER fallback to decimal + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[5]/w:numFmt"_ostr, "val"_ostr, "arabicAlpha"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[6]/w:numFmt"_ostr, "val"_ostr, "hindiVowels"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[7]/w:numFmt"_ostr, "val"_ostr, "thaiLetters"); + + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[1]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[2]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[3]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[4]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[5]/w:numFmt"_ostr, "val"_ostr, "russianUpper"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[6]/w:numFmt"_ostr, "val"_ostr, "russianLower"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[7]/w:numFmt"_ostr, "val"_ostr, "russianUpper"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[2]/w:lvl[8]/w:numFmt"_ostr, "val"_ostr, "russianLower"); + + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[3]/w:lvl[1]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[3]/w:lvl[2]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[3]/w:lvl[3]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[3]/w:lvl[4]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[3]/w:lvl[5]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[3]/w:lvl[6]/w:numFmt"_ostr, "val"_ostr, "decimal"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[3]/w:lvl[7]/w:numFmt"_ostr, "val"_ostr, "decimal"); + +} + +DECLARE_OOXMLEXPORT_TEST(testNumParentStyle, "num-parent-style.docx") +{ + CPPUNIT_ASSERT_EQUAL(static_cast(1), + getProperty(getParagraph(1), "OutlineLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(getParagraph(1), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(static_cast(2), + getProperty(getParagraph(2), "OutlineLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty(getParagraph(2), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(static_cast(1), + getProperty(getParagraph(3), "OutlineLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(getParagraph(3), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(static_cast(2), + getProperty(getParagraph(4), "OutlineLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("2.1"), getProperty(getParagraph(4), "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testNumOverrideLvltext, "num-override-lvltext.docx") +{ + uno::Reference xRules = getProperty< uno::Reference >(getStyles("NumberingStyles")->getByName("WWNum1"), "NumberingRules"); + // This was 1, i.e. the numbering on the second level was "1", not "1.1". + // Check the paragraph properties, not the list ones, since they can differ due to overrides + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty(xPara, "ListLabelString")); + + // The paragraph marker's red font color was inherited by the number portion, this was ff0000. + CPPUNIT_ASSERT_EQUAL(OUString("ffffffff"), parseDump("//SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']/SwFont"_ostr, "color"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testNumOverrideStart, "num-override-start.docx") +{ + uno::Reference xRules = getProperty< uno::Reference >(getStyles("NumberingStyles")->getByName("WWNum1"), "NumberingRules"); + // List starts with "1.1" + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), comphelper::SequenceAsHashMap(xRules->getByIndex(1))["StartWith"].get()); + // But paragraph starts with "1.3" + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), getProperty(xPara, "NumberingLevel")); + OUString listId; + CPPUNIT_ASSERT(xPara->getPropertyValue("ListId") >>= listId); + CPPUNIT_ASSERT_EQUAL(OUString("1.3"), getProperty(xPara, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTextboxRightEdge, "textbox-right-edge.docx") +{ + // I'm fairly sure this is not specific to DOCX, but the doc model created + // by the ODF import doesn't trigger this bug, so let's test this here + // instead of uiwriter. + int nShapeLeft = parseDump("//anchored/SwAnchoredDrawObject/bounds"_ostr, "left"_ostr).toInt32(); + int nShapeWidth = parseDump("//anchored/SwAnchoredDrawObject/bounds"_ostr, "width"_ostr).toInt32(); + int nTextboxLeft = parseDump("//anchored/fly/infos/bounds"_ostr, "left"_ostr).toInt32(); + int nTextboxWidth = parseDump("//anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32(); + // This is a rectangle, make sure the right edge of the textbox is still + // inside the draw shape. + CPPUNIT_ASSERT(nShapeLeft + nShapeWidth >= nTextboxLeft + nTextboxWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testEffectExtentMargin, "effectextent-margin.docx") +{ + // This was 318, i.e. oox::drawingml::convertEmuToHmm(114300), effectExtent + // wasn't part of the margin, leading to the fly not taking enough space + // around itself. + CPPUNIT_ASSERT_EQUAL(oox::drawingml::convertEmuToHmm(114300+95250), getProperty(getShape(1), "LeftMargin")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf88583) +{ + loadAndReload("tdf88583.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(getParagraph(1), "FillStyle")); + CPPUNIT_ASSERT_EQUAL(static_cast(0x00cc00), getProperty(getParagraph(1), "FillColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf97090, "tdf97090.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x95B3D7), getProperty(xTable->getCellByName("A1"), "BackColor")); + + uno::Reference paraEnumAccess(xTable->getCellByName("A1"), uno::UNO_QUERY); + assert( paraEnumAccess.is() ); + uno::Reference paraEnum = paraEnumAccess->createEnumeration(); + + assert( paraEnum.is() ); + uno::Reference paragraphProperties(paraEnum->nextElement(), uno::UNO_QUERY); + assert( paragraphProperties.is() ); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(paragraphProperties, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(Color(0xffffff), getProperty(paragraphProperties, "FillColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf89791, "tdf89791.docx") +{ + if (isExported()) + { + uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); + CPPUNIT_ASSERT_EQUAL(false, bool(xNameAccess->hasByName("docProps/custom.xml"))); + } + + //tdf#102619 - setting FollowStyle with a not-yet-created style was failing. (Titre is created before Corps de texte). + uno::Reference< beans::XPropertySet > properties(getStyles("ParagraphStyles")->getByName("Titre"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Corps de texte"), getProperty(properties, "FollowStyle")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf91261, "tdf91261.docx") +{ + bool snapToGrid = true; + uno::Reference< text::XTextRange > xPara = getParagraph( 2 ); + uno::Reference< beans::XPropertySet > properties( xPara, uno::UNO_QUERY); + properties->getPropertyValue("SnapToGrid") >>= snapToGrid ; + CPPUNIT_ASSERT_EQUAL(false, snapToGrid); + + uno::Reference< beans::XPropertySet> xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + sal_Int16 nGridMode; + xStyle->getPropertyValue("GridMode") >>= nGridMode; + CPPUNIT_ASSERT_EQUAL( sal_Int16(2), nGridMode); + + bool bGridSnapToChars; + xStyle->getPropertyValue("GridSnapToChars") >>= bGridSnapToChars; + CPPUNIT_ASSERT_EQUAL(true, bGridSnapToChars); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf89890, "tdf89890.docx") +{ + // Numbering picture bullet was too large. + uno::Reference xPropertySet(getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY); + uno::Reference xLevels(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; // 1st level + + bool bFound = false; + for (beans::PropertyValue const & rProp : std::as_const(aProps)) + { + if (rProp.Name == "GraphicSize") + { + // Height of the graphic was too large: 4382 after import, then 2485 after roundtrip. + CPPUNIT_ASSERT_EQUAL(static_cast(279), rProp.Value.get().Height); + bFound = true; + } + } + CPPUNIT_ASSERT(bFound); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf91594, "tdf91594.docx") +{ + uno::Reference xPara1(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(u'\xf0fb', xPara1->getString()[0] ); + uno::Reference xPara2(getParagraph(2)); + CPPUNIT_ASSERT_EQUAL(u'\xf0fc', xPara2->getString()[0] ); + uno::Reference xPara3(getParagraph(3)); + CPPUNIT_ASSERT_EQUAL(u'\xf0fd', xPara3->getString()[0] ); + uno::Reference xPara4(getParagraph(4)); + CPPUNIT_ASSERT_EQUAL(u'\xf0fe', xPara4->getString()[0] ); + + uno::Reference xRun(getRun(xPara1,1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), getProperty(xRun, "CharFontName")); + CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), getProperty(xRun, "CharFontNameAsian")); + CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), getProperty(xRun, "CharFontNameComplex")); +} +DECLARE_OOXMLEXPORT_TEST(testTDF99434, "protectedform.docx") +{ + css::uno::Reference m_xTextFactory(mxComponent, uno::UNO_QUERY); + uno::Reference< beans::XPropertySet > xSettings(m_xTextFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY); + uno::Any aProtect = xSettings->getPropertyValue("ProtectForm"); + bool bProt = false; + aProtect >>= bProt; + CPPUNIT_ASSERT(bProt); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf44986, "tdf44986.docx") +{ + // Check that the table at the second paragraph. + uno::Reference xTable(getParagraphOrTable(2), uno::UNO_QUERY); + uno::Reference xTableRows = xTable->getRows(); + // Check the first row of the table, it should have two cells (one separator). + // This was 0: the first row had no separators, so it had only one cell, which was too wide. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getProperty< uno::Sequence >(xTableRows->getByIndex(0), "TableColumnSeparators").getLength()); + // Check content of cells, including the newly added gridAfter cell + CPPUNIT_ASSERT_EQUAL(OUString("A1"), uno::Reference(xTable->getCellByName("A1"), uno::UNO_QUERY_THROW)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("A2"), uno::Reference(xTable->getCellByName("A2"), uno::UNO_QUERY_THROW)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(""), uno::Reference(xTable->getCellByName("B1"), uno::UNO_QUERY_THROW)->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf118682) +{ + loadAndSave("tdf118682.fodt"); + // Support cell references in table formulas + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Formula fields were completely missing. + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc/w:p/w:r/w:fldChar"_ostr, 3); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc/w:p/w:r/w:fldChar"_ostr, 3); + + // Cell references were parenthesized: + and SUM() + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc/w:p/w:r[2]/w:instrText"_ostr, " =A1+A2"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc/w:p/w:r[2]/w:instrText"_ostr, " =SUM(A1:A3)"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133163) +{ + loadAndSave("tdf133163.fodt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Formula cells were completely missing. + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc/w:p/w:r/w:fldChar"_ostr, 3); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc/w:p/w:r/w:fldChar"_ostr, 3); + + // Cell references were parenthesized: + and SUM() + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc/w:p/w:r[2]/w:instrText"_ostr, " =A1+A2"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc/w:p/w:r[2]/w:instrText"_ostr, " =SUM(A1:A3)"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133647) +{ + loadAndSave("tdf133647.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Keep original formula during round-trip + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =SUM(A1,B1)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[5]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =SUM(C1:D1)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[6]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =SUM(A1,5,B1:C1,6)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[7]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =(1+2)*SUM(C1,D1)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[8]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =3*(2+SUM(A1:C1)+7)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[9]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =1+(SUM(1,2))"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[10]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =(SUM(C1,5)*(2+7))*(3+SUM(1,B1))"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[11]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =sum(a1,b1)"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123386) +{ + loadAndSave("tdf123386.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Keep original formula during round-trip + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =A1 < 2"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =B1 > 1"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[5]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =C1=3"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[6]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =D1 <> 3"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[7]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =AND(A1=1,B1=2)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[8]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =AND((A1<1),(B1<>2))"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[9]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =OR(A1=1,B1=2)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[10]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =OR(TRUE,FALSE)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[11]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =NOT(TRUE)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[12]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =AND(1,DEFINED(ABC1))"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123389) +{ + loadAndSave("tdf123389.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Keep original formula during round-trip + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =ROUND(2.345,1)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =ROUND(A1,2)"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf106953, "tdf106953.docx") +{ + uno::Reference xRules = getProperty< uno::Reference >(getStyles("NumberingStyles")->getByName("WWNum1"), "NumberingRules"); + // This was -635, so the tab of the numbering expanded to a small value instead of matching Word's larger value. + CPPUNIT_ASSERT_EQUAL(static_cast(0), comphelper::SequenceAsHashMap(xRules->getByIndex(0))["FirstLineIndent"].get()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf115094v3) +{ + createSwDoc("tdf115094v3.docx"); + { + SwDoc* pDoc = getSwDoc(); + auto& rSpzFormats = *pDoc->GetSpzFrameFormats(); + auto pFormat = rSpzFormats[0]; + // Without the fix, this has failed with: + // - Expected: 1991 + // - Actual : 1883 + // i.e. some unwanted ~-2mm left margin appeared. + CPPUNIT_ASSERT_EQUAL(static_cast(1991), pFormat->GetHoriOrient().GetPos()); + } + save(mpFilter); + // floating table is now exported directly without surrounding frame + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblpPr"_ostr, "tblpX"_ostr, "1996"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblpPr"_ostr, "tblpY"_ostr, "1064"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx new file mode 100644 index 0000000000..44c93c5886 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx @@ -0,0 +1,739 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +DECLARE_OOXMLEXPORT_TEST(testWPGtextboxes, "testWPGtextboxes.docx") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + + auto MyShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GroupShape"), MyShape->getShapeType()); + + uno::Reference xGroup(MyShape, uno::UNO_QUERY_THROW); + uno::Reference xTriangle(xGroup->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xEmbedGroup(xGroup->getByIndex(1), uno::UNO_QUERY_THROW); + uno::Reference xCircle(xEmbedGroup->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xDiamond(xEmbedGroup->getByIndex(1), uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("The circle lost its textbox", true, xCircle->getPropertyValue("TextBox").get()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The diamond lost its textbox", true, xDiamond->getPropertyValue("TextBox").get()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The triangle lost its textbox", true, xTriangle->getPropertyValue("TextBox").get()); + +} + +CPPUNIT_TEST_FIXTURE(Test, testSmartart) +{ + SvtFilterOptions::Get().SetSmartArt2Shape(true); + comphelper::ScopeGuard g([] { SvtFilterOptions::Get().SetSmartArt2Shape(false); }); + + auto verify = [this]() { + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xGroup->getCount()); // background, 3 rectangles and an arrow in the group + + uno::Reference xPropertySet(xGroup->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x4f81bd), getProperty(xPropertySet, "FillColor")); // If fill color is right, theme import is OK + + uno::Reference xTextRange(xGroup->getByIndex(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Sample"), xTextRange->getString()); // Shape has text + + uno::Reference xParaEnumAccess(xTextRange->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + xPropertySet.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(style::ParagraphAdjust_CENTER), getProperty( xPropertySet, "ParaAdjust")); // Paragraph properties are imported + }; + createSwDoc("smartart.docx"); + verify(); + saveAndReload(mpFilter); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo69548) +{ + loadAndReload("fdo69548.docx"); + // The problem was that the last space in target URL was removed + CPPUNIT_ASSERT_EQUAL(OUString("#this_is_a_bookmark"), getProperty(getRun(getParagraph(1), 1), "HyperLinkURL")); +} + +DECLARE_OOXMLEXPORT_TEST(testWpsOnly, "wps-only.docx") +{ + // Document has wp:anchor, not wp:inline, so handle it accordingly. + uno::Reference xShape = getShape(1); + text::TextContentAnchorType eValue = getProperty(xShape, "AnchorType"); + // Word only as as-char and at-char, so at-char is our only choice. + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, eValue); + + // Check position, it was 0. This is a shape, so use getPosition(), not a property. + CPPUNIT_ASSERT_EQUAL(oox::drawingml::convertEmuToHmm(671830), xShape->getPosition().X); + + // Wrap type was PARALLEL. + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_THROUGH, getProperty(xShape, "Surround")); + // Confirm that the deprecated (incorrectly spelled) _THROUGHT also matches + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_THROUGHT, getProperty(xShape, "Surround")); + + // This should be in front of text. + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "Opaque")); + // And this should be behind the document. + CPPUNIT_ASSERT_EQUAL(false, getProperty(getShape(2), "Opaque")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFloattableNestedDOCXExport) +{ + // Given a document with nested floating tables: + createSwDoc("floattable-nested.odt"); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure both floating table is exported: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with + // - Expected: 2 + // - Actual : 1 + // i.e. the inner floating table was lost. + assertXPath(pXmlDoc, "//w:tblpPr"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testFloattableNestedCellStartDOCXExport) +{ + // Given a document with a nested floating table at cell start: + createSwDoc("floattable-nested-cell-start.odt"); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure both floating table is exported at the right position: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with + // - Expected: 1 + // - Actual : 0 + // i.e. the inner was between the two , not inside the C1 cell. + assertXPath(pXmlDoc, "//w:tc/w:tbl/w:tblPr/w:tblpPr"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testWpgOnly, "wpg-only.docx") +{ + uno::Reference xShape = getShape(1); + // Check position, it was nearly 0. This is a shape, so use getPosition(), not a property. + CPPUNIT_ASSERT_EQUAL(oox::drawingml::convertEmuToHmm(548005), xShape->getPosition().X); +} + +DECLARE_OOXMLEXPORT_TEST(testWpgNested, "wpg-nested.docx") +{ + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xShapeDescriptor(xGroup->getByIndex(0), uno::UNO_QUERY); + // This was a com.sun.star.drawing.CustomShape, due to lack of handling of groupshapes inside groupshapes. + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GroupShape"), xShapeDescriptor->getShapeType()); + + // This failed, the right edge of the shape was outside the page + // boundaries. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nPageLeft = getXPath(pXmlDoc, "/root/page[1]/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nPageWidth = getXPath(pXmlDoc, "/root/page[1]/infos/bounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nShapeLeft + = getXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/SwAnchoredDrawObject/bounds"_ostr, "left"_ostr) + .toInt32(); + sal_Int32 nShapeWidth + = getXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/SwAnchoredDrawObject/bounds"_ostr, "width"_ostr) + .toInt32(); + // Make sure the shape is within the page bounds. + CPPUNIT_ASSERT_GREATEREQUAL(nShapeLeft + nShapeWidth, nPageLeft + nPageWidth); +} + +DECLARE_OOXMLEXPORT_TEST(textboxWpgOnly, "textbox-wpg-only.docx") +{ + uno::Reference xShape = getShape(1); + // The relativeFrom attribute was ignored for groupshapes, i.e. these were text::RelOrientation::FRAME. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, "HoriOrientRelation")); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, "VertOrientRelation")); + // Make sure the shape is not in the background, as we have behindDoc="0" in the doc. + CPPUNIT_ASSERT_EQUAL(true, getProperty(xShape, "Opaque")); + + // The 3 paragraphs on the rectangles inside the groupshape ended up in the + // body text, make sure we don't have multiple paragraphs there anymore. + CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); // was 4 + + // Character escapement was enabled by default, this was 58. + uno::Reference xGroup(xShape, uno::UNO_QUERY); + uno::Reference xText = uno::Reference(xGroup->getByIndex(0), uno::UNO_QUERY_THROW)->getText(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(100), getProperty(getRun(getParagraphOfText(1, xText), 1), "CharEscapementHeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf120412_400PercentSubscript, "tdf120412_400PercentSubscript.docx") +{ + uno::Reference xPara = getParagraph(1); + // The word "Base" should not be subscripted. + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1, "Base"), "CharEscapement"), 0); + // The word "Subscript" should be 12pt, subscripted by 400% (48pt). + CPPUNIT_ASSERT_DOUBLES_EQUAL( -400.f, getProperty(getRun(xPara, 2, "Subscript"), "CharEscapement"), 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testFontEsc) +{ + loadAndSave("test_tdf120412.docx"); + xmlDocUniquePtr pXmlDoc =parseExport("word/document.xml"); + // don't lose the run with superscript formatting + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r"_ostr, 2); + // Superscript should be raised by 100% (11pt). Was 110% (12pt) + // calculated using docDefault with fontsize 10pt (note only w:szCs defined as 11pt, not w:sz) + // instead of inherited normal paraStyle fontsize 11pt (related to tdf#99602) + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:rPr/w:position"_ostr,"val"_ostr, "22"); +} + +DECLARE_OOXMLEXPORT_TEST(testMceWpg, "mce-wpg.docx") +{ + // Make sure that we read the primary branch, if wpg is requested as a feature. + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xText = uno::Reference(xGroup->getByIndex(0), uno::UNO_QUERY_THROW)->getText(); + // This was VML1. + getParagraphOfText(1, xText, "DML1"); +} + +DECLARE_OOXMLEXPORT_TEST(testMceNested, "mce-nested.docx") +{ + // Vertical position of the shape was incorrect due to incorrect nested mce handling. + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // positionV's posOffset from the bugdoc, was 0. + CPPUNIT_ASSERT(6879 <= getProperty(xShape, "VertOrientPosition")); + // This was -1 (default), make sure the background color is set. + CPPUNIT_ASSERT_EQUAL(Color(0x4f81bd), getProperty(xShape, "FillColor")); + + uno::Reference xShapeDescriptor = getShape(2); + // This was a com.sun.star.drawing.CustomShape, due to incorrect handling of wpg elements after a wps textbox. + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GroupShape"), xShapeDescriptor->getShapeType()); + + // Now check the top right textbox. + uno::Reference xGroup(getShape(2), uno::UNO_QUERY); + uno::Reference xText = uno::Reference(xGroup->getByIndex(1), uno::UNO_QUERY_THROW)->getText(); + uno::Reference xParagraph = getParagraphOfText(1, xText, "[Year]"); + CPPUNIT_ASSERT_EQUAL(48.f, getProperty(getRun(xParagraph, 1), "CharHeight")); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(getRun(xParagraph, 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(getRun(xParagraph, 1), "CharWeight")); + //FIXME: CPPUNIT_ASSERT_EQUAL(drawing::TextVerticalAdjust_BOTTOM, getProperty(xGroup->getByIndex(1), "TextVerticalAdjust")); +} + +DECLARE_OOXMLEXPORT_TEST(testMissingPath, "missing-path.docx") +{ + comphelper::SequenceAsHashMap aCustomShapeGeometry(getProperty(getShape(1), "CustomShapeGeometry")); + comphelper::SequenceAsHashMap aPath(aCustomShapeGeometry["Path"].get()); + uno::Sequence aCoordinates = aPath["Coordinates"].get< uno::Sequence >(); + // This was 0, the coordinate list was empty. + CPPUNIT_ASSERT_EQUAL(sal_Int32(19), aCoordinates.getLength()); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo70457, "fdo70457.docx") +{ + // The document contains a rotated bitmap + // It must be imported as a XShape object with the proper rotation value + + // Check: there is one shape in the doc + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + // Check: the angle of the shape is 45º + CPPUNIT_ASSERT_EQUAL(sal_Int32(4500), getProperty(getShape(1), "RotateAngle")); +} + +DECLARE_OOXMLEXPORT_TEST(testLOCrash, "file_crash.docx") +{ + //The problem was libreoffice crash while opening the file. + getParagraph(1,"Contents"); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo72560, "fdo72560.docx") +{ + // The problem was libreoffice confuse when there RTL default style for paragraph + uno::Reference xParaLeftRTL(getParagraph( 1, "RTL LEFT")); + uno::Reference xParaRightLTR(getParagraph( 2, "LTR RIGHT")); + + // this will test the text direction and alignment for paragraphs + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, getProperty( xParaLeftRTL, "WritingMode" )); + CPPUNIT_ASSERT_EQUAL( sal_Int32 (style::ParagraphAdjust_LEFT), getProperty< sal_Int32 >( xParaLeftRTL, "ParaAdjust" )); + + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, getProperty( xParaRightLTR, "WritingMode" )); + CPPUNIT_ASSERT_EQUAL( sal_Int32 (style::ParagraphAdjust_RIGHT), getProperty< sal_Int32 >( xParaRightLTR, "ParaAdjust" )); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo72560b, "fdo72560b.docx") +{ + // The problem was libreoffice confuse when RTL was specified in non-default style + uno::Reference xParaEndRTL(getParagraph( 2, "RTL END")); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, getProperty( xParaEndRTL, "WritingMode" )); + CPPUNIT_ASSERT_EQUAL( sal_Int32(style::ParagraphAdjust_LEFT), getProperty< sal_Int32 >( xParaEndRTL, "ParaAdjust" )); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo72560c, "fdo72560c.docx") +{ + // The problem was libreoffice confuse when RTL was specified in DocDefaults + uno::Reference xParaEndRTL(getParagraph( 2, "RTL END")); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, getProperty( xParaEndRTL, "WritingMode" )); + CPPUNIT_ASSERT_EQUAL( sal_Int32(style::ParagraphAdjust_LEFT), getProperty< sal_Int32 >( xParaEndRTL, "ParaAdjust" )); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo72560d, "fdo72560d.docx") +{ + // The problem was libreoffice confuse when RTL was specified in "Normal" when not using Normal at all + CPPUNIT_ASSERT_EQUAL( sal_Int32(style::ParagraphAdjust_RIGHT), getProperty< sal_Int32 >( getParagraph(1), "ParaAdjust" )); + CPPUNIT_ASSERT_EQUAL( sal_Int32(style::ParagraphAdjust_RIGHT), getProperty< sal_Int32 >( getParagraph(2), "ParaAdjust" )); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo72560e, "fdo72560e.docx") +{ + // The problem was libreoffice confuse when *locale* is RTL, but w:bidi / w:jc are never defined. + // This unit test would only be noticed if the testing environment is set to something like an Arabic locale. + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, getProperty( getParagraph(2), "WritingMode" )); + CPPUNIT_ASSERT_EQUAL(sal_Int32(style::ParagraphAdjust_LEFT), getProperty( getParagraph(2), "ParaAdjust" )); + + // widow/orphan control is on when never specified. + CPPUNIT_ASSERT_EQUAL(sal_Int8(2), getProperty( getParagraph(2), "ParaWidows" )); +} + +DECLARE_OOXMLEXPORT_TEST(testRPrChangeClosed, "rprchange_closed.docx") +{ + // Redline defined by rPrChanged wasn't removed. + // First paragraph has an rPrChange element, make sure it doesn't appear in the second paragraph. + CPPUNIT_ASSERT_EQUAL(false, hasProperty(getRun(getParagraph(2), 1), "RedlineType")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo65090, "fdo65090.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + // The first row had two cells, instead of a single horizontally merged one. + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty< uno::Sequence >(xTableRows->getByIndex(0), "TableColumnSeparators").getLength()); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo69649, "fdo69649.docx") +{ + // The DOCX containing the Table of Contents was not imported with correct page nos + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes( ); + uno::Reference xTOCIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextRange = xTOCIndex->getAnchor(); + uno::Reference xText = xTextRange->getText( ); + uno::Reference xTextCursor = xText->createTextCursor( ); + xTextCursor->gotoRange(xTextRange->getStart(),false); + xTextCursor->gotoRange(xTextRange->getEnd(),true); + OUString aTocString(xTextCursor->getString()); + + // heading 15 on the 15th page + aTocString = aTocString.copy(aTocString.indexOf("Heading 15.1:\t") + strlen("Heading 15.1:\t")); + CPPUNIT_ASSERT(aTocString.startsWithIgnoreAsciiCase( "15" ) ); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo73389) +{ + loadAndSave("fdo73389.docx"); + // The width of the inner table was too large. The first fix still converted + // the "auto" table width to a fixed one. The second fix used variable width. + // The recent fix uses fixed width again, according to the fixed width cells. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tbl/w:tblPr/w:tblW"_ostr,"type"_ostr,"dxa"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tbl/w:tblPr/w:tblW"_ostr,"w"_ostr,"1611"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133735) +{ + loadAndSave("fdo73389.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tbl/w:tr[2]/w:tc[1]/w:p/w:pPr/w:spacing"_ostr, "after"_ostr, "0"); + // This was 200 + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tbl/w:tr[1]/w:tc[1]/w:p/w:pPr/w:spacing"_ostr, "after"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tbl/w:tr[1]/w:tc[2]/w:p/w:pPr/w:spacing"_ostr, "after"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tbl/w:tr[1]/w:tc[3]/w:p/w:pPr/w:spacing"_ostr, "after"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134569_nestedTable) +{ + loadAndReload("tdf134569_nestedTable.docx"); + // non-overridden w:after spacing in the table was pushing the document to the second page. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf59274) +{ + loadAndSave("tdf59274.docx"); + // Table with "auto" table width and incomplete grid: 11 columns, but only 4 gridCol elements. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblW"_ostr, "type"_ostr, "dxa"); + // This was 7349: sum of the cell widths in first row, but the table width is determined by a longer row later. + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblW"_ostr, "w"_ostr, "9048"); + // This was 1224: too narrow first cell in first row + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcW"_ostr, "w"_ostr, "4291"); + // This was 3674: too wide last cell in first row + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[4]/w:tcPr/w:tcW"_ostr, "w"_ostr, "1695"); +} + +DECLARE_OOXMLEXPORT_TEST(testDMLGroupshapeSdt, "dml-groupshape-sdt.docx") +{ + uno::Reference xGroupShape(getShape(1), uno::UNO_QUERY); + // The text in the groupshape was missing due to the w:sdt and w:sdtContent wrapper around it. + CPPUNIT_ASSERT_EQUAL(OUString("sdt and sdtContent inside groupshape"), uno::Reference(xGroupShape->getByIndex(1), uno::UNO_QUERY_THROW)->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testDmlCharheightDefault, "dml-charheight-default.docx") +{ + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xShape(xGroup->getByIndex(0), uno::UNO_QUERY); + // This was 16: the first run of the second para incorrectly inherited the char height of the first para. + CPPUNIT_ASSERT_EQUAL(11.f, getProperty(getRun(getParagraphOfText(2, xShape->getText()), 1), "CharHeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testDMLGroupShapeCapitalization, "dml-groupshape-capitalization.docx") +{ + // Capitalization inside a group shape was not imported + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xText = uno::Reference(xGroup->getByIndex(1), uno::UNO_QUERY_THROW)->getText(); + // 2nd line is written with uppercase letters + CPPUNIT_ASSERT_EQUAL(style::CaseMap::UPPERCASE, getProperty(getRun(getParagraphOfText(2, xText), 1), "CharCaseMap")); + // 3rd line has no capitalization + CPPUNIT_ASSERT_EQUAL(style::CaseMap::NONE, getProperty(getRun(getParagraphOfText(3, xText), 1), "CharCaseMap")); + // 4th line has written with small capitals + CPPUNIT_ASSERT_EQUAL(style::CaseMap::SMALLCAPS, getProperty(getRun(getParagraphOfText(4, xText), 1), "CharCaseMap")); + // 5th line has no capitalization + CPPUNIT_ASSERT_EQUAL(style::CaseMap::NONE, getProperty(getRun(getParagraphOfText(5, xText), 1), "CharCaseMap")); +} + +DECLARE_OOXMLEXPORT_TEST(testPictureWithSchemeColor, "picture-with-schemecolor.docx") +{ + // At the start of the document, a picture which has a color specified with a color scheme, lost + // it's color during import. + uno::Reference xImage(getShape(1), uno::UNO_QUERY); + uno::Reference xGraphic = getProperty >(xImage, "Graphic"); + Graphic aVclGraphic(xGraphic); + BitmapEx aBitmap(aVclGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(tools::Long(341), aBitmap.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(181), aBitmap.GetSizePixel().Height()); + CPPUNIT_ASSERT_EQUAL(Color( 0xad, 0xc5, 0xdb ), aBitmap.GetPixelColor(120, 30)); + CPPUNIT_ASSERT_EQUAL(Color( 0xad, 0xc5, 0xdb ), aBitmap.GetPixelColor(260, 130)); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo69656, "Table_cell_auto_width_fdo69656.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8153), getProperty(xTables->getByIndex(0), "Width")); +} + +DECLARE_OOXMLEXPORT_TEST(testFloatingTablesAnchor, "floating-tables-anchor.docx") +{ + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + // Problem was one of the two text frames was anchored to the other text frame + // Both frames should be anchored to the body text + uno::Reference xTextContent(getShape(1), uno::UNO_QUERY); + uno::Reference xRange = xTextContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(xBodyText, xRange->getText()); + + xTextContent.set(getShape(2), uno::UNO_QUERY); + xRange = xTextContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(xBodyText, xRange->getText()); + + // tdf#149292 pre-emptive test - ensure "First Page" page style + // TODO - FIRST HEADER CHANGE - Need to find a solution to this + //CPPUNIT_ASSERT_EQUAL(OUString("First Page"), getProperty(getParagraph(1), "PageDescName")); +} + +DECLARE_OOXMLEXPORT_TEST(testAnnotationFormatting, "annotation-formatting.docx") +{ + uno::Reference xTextField = getProperty< uno::Reference >(getRun(getParagraph(2), 2), "TextField"); + uno::Reference xText = getProperty< uno::Reference >(xTextField, "TextRange"); + // Make sure we test the right annotation. + uno::Reference xParagraph = getParagraphOfText(1, xText, "days"); + // Formatting was lost: the second text portion was NONE, not SINGLE. + CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::SINGLE, getProperty(getRun(xParagraph, 1), "CharUnderline")); +} + +DECLARE_OOXMLEXPORT_TEST(testDMLGroupShapeRunFonts, "dml-groupshape-runfonts.docx") +{ + // Fonts defined by w:rFonts was not imported and so the font specified by a:fontRef was used. + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xText = uno::Reference(xGroup->getByIndex(1), uno::UNO_QUERY_THROW)->getText(); + uno::Reference xRun = getRun(getParagraphOfText(1, xText),1); + CPPUNIT_ASSERT_EQUAL(OUString("Arial"), getProperty(xRun, "CharFontName")); + CPPUNIT_ASSERT_EQUAL(OUString("Arial Unicode MS"), getProperty(xRun, "CharFontNameComplex")); + CPPUNIT_ASSERT_EQUAL(OUString("MS Mincho"), getProperty(xRun, "CharFontNameAsian")); +} + +DECLARE_OOXMLEXPORT_TEST(testStrict, "strict.docx") +{ + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + // This was only 127, pt suffix was ignored, so this got parsed as twips instead of points. + CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(72 * 20)), getProperty(xPageStyle, "BottomMargin")); + // This was only 1397, same issue + CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(792 * 20)), getProperty(xPageStyle, "Height")); + // Text was missing, due to not handling the strict namespaces. + getParagraph(1, "Hello world!"); + + // Header in the document caused a crash on import. + uno::Reference xHeaderText(xPageStyle->getPropertyValue("HeaderText"), uno::UNO_QUERY); + getParagraphOfText(1, xHeaderText, "This is a header."); + + // Picture was missing. + uno::Reference xServiceInfo(getShapeByName(u"Picture 2"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextGraphicObject")); + + // SmartArt was missing. + xServiceInfo.set(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.drawing.GroupShape")); + + // Chart was missing. + xServiceInfo.set(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextEmbeddedObject")); + + // Math was missing. + xServiceInfo.set(getShape(4), uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextEmbeddedObject")); +} + +CPPUNIT_TEST_FIXTURE(Test, testSmartartStrict) +{ + SvtFilterOptions::Get().SetSmartArt2Shape(true); + comphelper::ScopeGuard g([] { SvtFilterOptions::Get().SetSmartArt2Shape(false); }); + + auto verify = [this]() { + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + // This was 0, SmartArt was visually missing. + CPPUNIT_ASSERT_EQUAL(sal_Int32(7), xGroup->getCount()); // background, 3 ellipses + 3 arrows + }; + createSwDoc("strict-smartart.docx"); + verify(); + saveAndReload(mpFilter); + verify(); +} + +DECLARE_OOXMLEXPORT_TEST(testLibreOfficeHang, "frame-wrap-auto.docx") +{ + // fdo#72775 + // This was text::WrapTextMode_NONE. + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_DYNAMIC, getProperty(getShape(1), "Surround")); + + // tdf#154703 top/bottom margins should not be duplicated from paragraph(s) + uno::Reference xTextRange(getShape(1), uno::UNO_QUERY); + uno::Reference xText = xTextRange->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("test"), getParagraphOfText(1, xText)->getString()); + + sal_Int32 nFrame = getProperty(getShape(1), "TopBorderDistance"); + sal_Int32 nPara = getProperty(getParagraphOfText(1, xText), "TopBorderDistance"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(141), nFrame + nPara); + // NOTE: left/right are different because of compat flag INVERT_BORDER_SPACING] + nFrame = getProperty(getShape(1), "LeftBorderDistance"); + nPara = getProperty(getParagraphOfText(1, xText), "LeftBorderDistance"); + CPPUNIT_ASSERT_EQUAL(nFrame, nPara); + CPPUNIT_ASSERT(nPara); + + // Additionally, the width of the frame needs to grow by the size of the left/right spacing + CPPUNIT_ASSERT_EQUAL(sal_Int32(7064), getProperty(getShape(1), "Width")); +} + +DECLARE_OOXMLEXPORT_TEST(testI124106, "i124106.docx") +{ + // This was 2. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testLargeTwips, "large-twips.docx" ) +{ + // cp#1000043: MSO seems to ignore large twips values, we didn't, which resulted in different + // layout of broken documents (text not visible in this specific document). + OUString width = parseDump( "/root/page/body/tab/row[1]/cell[1]/txt/infos/bounds"_ostr, "width"_ostr ); + CPPUNIT_ASSERT( width.toInt32() > 0 ); +} + +DECLARE_OOXMLEXPORT_TEST(testNegativeCellMarginTwips, "negative-cell-margin-twips.docx") +{ + // Slightly related to cp#1000043, the twips value was negative, which wrapped around somewhere, + // while MSO seems to ignore that as well. + OUString width = parseDump( "/root/page/body/tab/row[1]/cell[1]/txt/infos/bounds"_ostr, "width"_ostr ); + CPPUNIT_ASSERT( width.toInt32() > 0 ); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo38414, "fdo38414.docx") +{ + // The cells in the last (4th) column were merged properly and so the result didn't have the same height. + // (Since w:gridBefore is worked around by faking another cell in the row, so column count is thus 5 + // instead of 4, therefore compare height of cells 4 and 5 rather than 3 and 4.) + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableColumns = xTextTable->getColumns(); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 5 ), xTableColumns->getCount()); + OUString height3 = parseDump("/root/page/body/tab/row[1]/cell[4]/infos/bounds"_ostr, "height"_ostr ); + OUString height4 = parseDump("/root/page/body/tab/row[1]/cell[5]/infos/bounds"_ostr, "height"_ostr ); + CPPUNIT_ASSERT_EQUAL( height3, height4 ); +} + +DECLARE_OOXMLEXPORT_TEST(test_extra_image, "test_extra_image.docx") +{ + // fdo#74652 Check there is no shape added to the doc during import + CPPUNIT_ASSERT_EQUAL(0, getShapes()); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo74401, "fdo74401.docx") +{ + uno::Reference xGroupShape(getShape(1), uno::UNO_QUERY); + uno::Reference xShape(xGroupShape->getByIndex(1), uno::UNO_QUERY); + // The triangle (second child) was a TextShape before, so it was shown as a rectangle. + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.CustomShape"), xShape->getShapeType()); + + uno::Reference xText = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + uno::Reference xCharRun = getRun(getParagraphOfText(1, xText), 1, "Triangle "); + + // tdf#128153 Paragraph Style Normal (Web) should not overwrite the 11pt directly applied fontsize. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Fontsize", 11.f, getProperty(xCharRun, "CharHeight")); + // but paragraph Style Normal (Web) should provide the font name + CPPUNIT_ASSERT_EQUAL_MESSAGE("Font", OUString("Times New Roman"), getProperty(xCharRun, "CharFontName")); +} + +DECLARE_OOXMLEXPORT_TEST(testGridBefore, "gridbefore.docx") +{ + // w:gridBefore is faked by inserting two cells without border (because Writer can't do non-rectangular tables). + // So check the first cell in the first row is in fact 3rd and that it's more to the right than the second + // cell on the second row. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableColumns = xTextTable->getColumns(); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 3 ), xTableColumns->getCount()); + OUString textA3 = parseDump("/root/page/body/tab/row[1]/cell[3]/txt/text()"_ostr ); + OUString leftA3 = parseDump("/root/page/body/tab/row[1]/cell[3]/infos/bounds"_ostr, "left"_ostr ); + OUString leftB2 = parseDump("/root/page/body/tab/row[2]/cell[2]/infos/bounds"_ostr, "left"_ostr ); + CPPUNIT_ASSERT_EQUAL( OUString( "A3" ), textA3 ); + CPPUNIT_ASSERT( leftA3.toInt32() > leftB2.toInt32()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf116194) +{ + loadAndSave("tdf116194.docx"); + // The problem was that the importer lost consecutive tables with w:gridBefore + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134606) +{ + loadAndSave("tdf134606.docx"); + // The problem was that the importer lost the nested table structure with w:gridBefore + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tbl"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testMsoBrightnessContrast, "msobrightnesscontrast.docx") +{ + uno::Reference image = getShape(1); + uno::Reference imageProperties(image, uno::UNO_QUERY); + uno::Reference graphic; + imageProperties->getPropertyValue( "Graphic" ) >>= graphic; + Graphic aVclGraphic(graphic); + BitmapEx aBitmap(aVclGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL(tools::Long(58), aBitmap.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(320), aBitmap.GetSizePixel().Height()); + Color aColor(aBitmap.GetPixelColor(20, 30)); + CPPUNIT_ASSERT_EQUAL(Color( 0xce, 0xce, 0xce ), aColor); +} + +DECLARE_OOXMLEXPORT_TEST(testChartSize, "chart-size.docx") +{ + // When chart was in a TextFrame, its size was too large. + uno::Reference xTextEmbeddedObjectsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xEmbeddedObjects(xTextEmbeddedObjectsSupplier->getEmbeddedObjects(), uno::UNO_QUERY); + // This was 10954. + CPPUNIT_ASSERT_EQUAL(sal_Int32(6008), getProperty(xEmbeddedObjects->getByIndex(0), "Width")); +} + +DECLARE_OOXMLEXPORT_TEST(testInlineGroupshape, "inline-groupshape.docx") +{ + // Inline groupshape was in the background, so it was hidden sometimes by other shapes. + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(1), "Opaque")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo78883, "fdo78883.docx") +{ + // fdo#78883 : LO was getting hang while opening document + // Checking there is a single page after loading a doc in LO. + // Check to make sure the document loaded. Note that the page number may + // be 1 or 2 depending on the environment. + CPPUNIT_ASSERT(getPages() > 0); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo79535, "fdo79535.docx") +{ + // fdo#79535 : LO was crashing while opening document + // Checking there is a single page after loading a doc successfully in LO. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testCaption, "caption.docx") +{ + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Caption"), uno::UNO_QUERY); + // This was awt::FontSlant_ITALIC: Writer default was used instead of what is in the document. + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xStyle, "CharPosture")); +} + +DECLARE_OOXMLEXPORT_TEST(testGroupshapeTrackedchanges, "groupshape-trackedchanges.docx") +{ + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xShape(xGroup->getByIndex(0), uno::UNO_QUERY); + // Shape text was completely missing, ensure inserted text is available. + uno::Reference xText + = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + auto xParagraph = getParagraphOfText(1, xText); + + CPPUNIT_ASSERT(hasProperty(getRun(xParagraph, 1), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Delete"), + getProperty(getRun(xParagraph, 1), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Deleted"), getRun(xParagraph, 2)->getString()); + + CPPUNIT_ASSERT(hasProperty(getRun(xParagraph, 4), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Insert"), + getProperty(getRun(xParagraph, 4), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString(" Inserted"), getRun(xParagraph, 5)->getString()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx new file mode 100644 index 0000000000..f7df210641 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx @@ -0,0 +1,874 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +DECLARE_OOXMLEXPORT_TEST(testTdf57589_hashColor, "tdf57589_hashColor.docx") +{ + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(getParagraph(1), "FillStyle")); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTMAGENTA, getProperty(getParagraph(1), "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(getParagraph(2), "FillStyle")); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(getParagraph(2), "ParaBackColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf90906_colAuto, "tdf90906_colAuto.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(getRun(xPara, 1, "Nazwa"), "CharBackColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf90906_colAutoB, "tdf90906_colAutoB.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + uno::Reference xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTGREEN, getProperty(xCell, "BackColor")); + xCell.set(xTable->getCellByName("A2")); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + xCell.set(xTable->getCellByName("B1")); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + xCell.set(xTable->getCellByName("B2")); + CPPUNIT_ASSERT_EQUAL(COL_LIGHTBLUE, getProperty(xCell, "BackColor")); + + uno::Reference xText(getParagraph(2, "Paragraphs too")); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xText, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xText, "ParaBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf92524_autoColor) +{ + loadAndReload("tdf92524_autoColor.doc"); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(getParagraph(1), "FillStyle")); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(getParagraph(1), "ParaBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf116436_rowFill) +{ + loadAndReload("tdf116436_rowFill.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT_EQUAL(Color(0xF8DF7C), getProperty(xCell, "BackColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf121665_back2backColumnBreaks, "tdf121665_back2backColumnBreaks.docx") +{ + CPPUNIT_ASSERT_EQUAL_MESSAGE("Column break type", + style::BreakType_COLUMN_BEFORE, getProperty(getParagraph(2), "BreakType")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf126795_TabsRelativeToIndent0) +{ + loadAndReload("tdf126795_TabsRelativeToIndent0.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Sequence< style::TabStop > stops = getProperty< uno::Sequence >(getParagraph( 2 ), "ParaTabStops"); + CPPUNIT_ASSERT_EQUAL( sal_Int32(1), stops.getLength()); + CPPUNIT_ASSERT_EQUAL( css::style::TabAlign_LEFT, stops[ 0 ].Alignment ); + CPPUNIT_ASSERT_EQUAL( sal_Int32(499), stops[ 0 ].Position ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf126795_TabsRelativeToIndent1) +{ + loadAndReload("tdf126795_TabsRelativeToIndent1.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Sequence< style::TabStop > stops = getProperty< uno::Sequence >(getParagraph( 2 ), "ParaTabStops"); + CPPUNIT_ASSERT_EQUAL( sal_Int32(1), stops.getLength()); + CPPUNIT_ASSERT_EQUAL( css::style::TabAlign_LEFT, stops[ 0 ].Alignment ); + CPPUNIT_ASSERT_EQUAL( sal_Int32(499), stops[ 0 ].Position ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf46938_clearTabStop, "tdf46938_clearTabStop.docx") +{ + // Number of tabstops should be zero, overriding the one in the style + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty< uno::Sequence >(getParagraph(1), "ParaTabStops").getLength()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf63561_clearTabs, "tdf63561_clearTabs.docx") +{ + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), getProperty< uno::Sequence >(getParagraph(1), "ParaTabStops").getLength()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7), getProperty< uno::Sequence >(getParagraph(3), "ParaTabStops").getLength()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), getProperty< uno::Sequence >(getParagraph(4), "ParaTabStops").getLength()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf63561_clearTabs2, "tdf63561_clearTabs2.docx") +{ + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getProperty< uno::Sequence >(getParagraph(1), "ParaTabStops").getLength()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getProperty< uno::Sequence >(getParagraph(3), "ParaTabStops").getLength()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), getProperty< uno::Sequence >(getParagraph(4), "ParaTabStops").getLength()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf124384, "tdf124384.docx") +{ + // There should be no crash during loading of the document + // so, let's check just how much pages we have + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121456_tabsOffset) +{ + loadAndReload("tdf121456_tabsOffset.odt"); + for (int i=2; i<8; i++) + { + uno::Sequence< style::TabStop > stops = getProperty< uno::Sequence >(getParagraph( i ), "ParaTabStops"); + CPPUNIT_ASSERT_EQUAL( sal_Int32(1), stops.getLength()); + CPPUNIT_ASSERT_EQUAL( css::style::TabAlign_RIGHT, stops[ 0 ].Alignment ); + CPPUNIT_ASSERT_EQUAL( sal_Int32(17000), stops[ 0 ].Position ); + } +} + +// tdf#121561: make sure w:sdt/w:sdtContent around TOC is written during ODT->DOCX conversion +CPPUNIT_TEST_FIXTURE(Test, testTdf121561_tocTitle) +{ + loadAndSave("tdf121456_tabsOffset.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p/w:r/w:t"_ostr, "Inhaltsverzeichnis"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p/w:r/w:instrText"_ostr, " TOC \\f \\o \"1-9\" \\h"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtPr/w:docPartObj/w:docPartGallery"_ostr, "val"_ostr, "Table of Contents"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtPr/w:docPartObj/w:docPartUnique"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129525) +{ + loadAndSave("tdf129525.rtf"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p[1]/w:r[4]/w:t"_ostr, "Overview"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p[1]/w:r[5]/w:t"_ostr, "3"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p[2]/w:r[1]/w:t"_ostr, "More detailed description"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p[2]/w:r[2]/w:t"_ostr, "4"); +} + +// Related issue tdf#121561: w:sdt/w:sdtContent around TOC +DECLARE_OOXMLEXPORT_TEST(testTdf124106, "tdf121456.docx") +{ + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference text = textDocument->getText(); + // -1 if the 'Y' character does not occur + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), text->getString().indexOf('Y')); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), text->getString().indexOf('y')); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121561_tocTitleDocx) +{ + loadAndSave("tdf121456_tabsOffset.odt"); + CPPUNIT_ASSERT_EQUAL(7, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // get TOC node + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes( ); + uno::Reference xTOCIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); + + // ensure TOC title was set in TOC properties + CPPUNIT_ASSERT_EQUAL(OUString("Inhaltsverzeichnis"), getProperty(xTOCIndex, "Title")); + + // ensure TOC end-field mark is placed inside TOC section + assertXPath(pXmlDoc, "/w:document/w:body/w:sdt/w:sdtContent/w:p[16]/w:r/w:fldChar"_ostr, "fldCharType"_ostr, "end"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf106174_rtlParaAlign, "tdf106174_rtlParaAlign.docx") +{ + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_CENTER), getProperty(getParagraph(1), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_CENTER), getProperty(getParagraph(2), "ParaAdjust")); + uno::Reference xPropertySet(getStyles("ParagraphStyles")->getByName("Another paragraph aligned to right"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(xPropertySet, "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(3), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(4), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(5), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(6), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(7), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(8), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(9), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(10), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(11), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(12), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(13), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(14), "ParaAdjust")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf82065_Ind_start_strict, "tdf82065_Ind_start_strict.docx") +{ + uno::Reference xPropertySet(getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY); + uno::Reference xLevels(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; // 1st level + bool bFoundIndentAt = false; + for (beans::PropertyValue const & rProp : std::as_const(aProps)) + { + if (rProp.Name == "IndentAt") + { + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("IndentAt", double(6001), rProp.Value.get(), 10 ); + bFoundIndentAt = true; + } + } + CPPUNIT_ASSERT_EQUAL_MESSAGE("IndentAt defined", true, bFoundIndentAt); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf76683_negativeTwipsMeasure) +{ + loadAndSave("tdf76683_negativeTwipsMeasure.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:cols/w:col"_ostr, 2); + sal_uInt32 nColumn1 = getXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:cols/w:col[1]"_ostr, "w"_ostr).toUInt32(); + sal_uInt32 nColumn2 = getXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:cols/w:col[2]"_ostr, "w"_ostr).toUInt32(); + CPPUNIT_ASSERT( nColumn1 > nColumn2 ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf118361_RTLfootnoteSeparator, "tdf118361_RTLfootnoteSeparator.docx") +{ + uno::Any aPageStyle = getStyles("PageStyles")->getByName("Standard"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Footnote separator RTL", sal_Int16(2), getProperty(aPageStyle, "FootnoteLineAdjust")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf115861, "tdf115861.docx") +{ + // Second item in the paragraph enumeration was a table, 2nd paragraph was + // lost. + CPPUNIT_ASSERT_EQUAL(OUString("(k)"), getParagraph(2)->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf67207_MERGEFIELD, "mailmerge.docx") +{ + uno::Reference xTextField = getProperty< uno::Reference >(getRun(getParagraph(1), 2), "TextField"); + CPPUNIT_ASSERT(xTextField.is()); + uno::Reference xServiceInfo(xTextField, uno::UNO_QUERY_THROW); + uno::Reference xDependent(xTextField, uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.Database")); + OUString sValue; + xTextField->getPropertyValue("Content") >>= sValue; + CPPUNIT_ASSERT_EQUAL(u"«Name»"_ustr, sValue); + + uno::Reference xFiledMaster = xDependent->getTextFieldMaster(); + uno::Reference xFiledMasterServiceInfo(xFiledMaster, uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(xFiledMasterServiceInfo->supportsService("com.sun.star.text.fieldmaster.Database")); + + // Defined properties: DataBaseName, Name, DataTableName, DataColumnName, DependentTextFields, DataCommandType, InstanceName, DataBaseURL + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("Name") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("Name"), sValue); + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("DataColumnName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("Name"), sValue); + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("InstanceName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.text.fieldmaster.DataBase.Name"), sValue); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf115719, "tdf115719.docx") +{ + // This was a single page, instead of pushing the textboxes to the second + // page. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf115719b, "tdf115719b.docx") +{ + // This is similar to testTdf115719, but here the left textbox is not aligned "from left, by + // 0cm" but simply aligned to left, which is a different codepath. + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 1 + // i.e. the textboxes did not appear on the 2nd page, but everything was on a single page. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123243, "tdf123243.docx") +{ + // Without the accompanying fix in place, this test would have failed with 'Expected: 1; Actual: + // 2'; i.e. unexpected paragraph margin created 2 pages. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf116410, "tdf116410.docx") +{ + // Opposite of the above, was 2 pages, should be 1 page. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testDefaultStyle, "defaultStyle.docx") +{ + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Default Style", OUString("Title"), getProperty(getParagraph(1), "ParaStyleName") ); + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf147115_defaultStyle, "tdf147115_defaultStyle.docx") +{ + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Default Style", OUString("Standard"), getProperty(getParagraph(1), "ParaStyleName") ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf117988, "tdf117988.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf94801, "tdf94801.docx") +{ + // This was a 2-page document with unwanted line breaking in table cells, because + // the table was narrower, than defined (< 1/100 mm loss during twip to 1/100 mm conversion) + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testParagraphSplitOnSectionBorder) +{ + loadAndSave("parasplit-on-section-border.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Test document has only two paragraphs. After splitting, it should contain + // three of them. + assertXPath(pXmlDoc, "//w:sectPr"_ostr, 2); + assertXPath(pXmlDoc, "//w:p"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf44832_testSectionWithDifferentHeader) +{ + loadAndSave("tdf44832_section_new_header.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:headerReference"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testSignatureLineShape, "signature-line-all-props-set.docx") +{ + uno::Reference xSignatureLineShape = getShape(1); + uno::Reference xPropSet(xSignatureLineShape, uno::UNO_QUERY); + + bool bIsSignatureLine; + xPropSet->getPropertyValue("IsSignatureLine") >>= bIsSignatureLine; + CPPUNIT_ASSERT_EQUAL(true, bIsSignatureLine); + + bool bShowSignDate; + xPropSet->getPropertyValue("SignatureLineShowSignDate") >>= bShowSignDate; + CPPUNIT_ASSERT_EQUAL(true, bShowSignDate); + + bool bCanAddComment; + xPropSet->getPropertyValue("SignatureLineCanAddComment") >>= bCanAddComment; + CPPUNIT_ASSERT_EQUAL(true, bCanAddComment); + + OUString aSignatureLineId; + xPropSet->getPropertyValue("SignatureLineId") >>= aSignatureLineId; + CPPUNIT_ASSERT_EQUAL(OUString("{0EBE47D5-A1BD-4C9E-A52E-6256E5C345E9}"), aSignatureLineId); + + OUString aSuggestedSignerName; + xPropSet->getPropertyValue("SignatureLineSuggestedSignerName") >>= aSuggestedSignerName; + CPPUNIT_ASSERT_EQUAL(OUString("John Doe"), aSuggestedSignerName); + + OUString aSuggestedSignerTitle; + xPropSet->getPropertyValue("SignatureLineSuggestedSignerTitle") >>= aSuggestedSignerTitle; + CPPUNIT_ASSERT_EQUAL(OUString("Farmer"), aSuggestedSignerTitle); + + OUString aSuggestedSignerEmail; + xPropSet->getPropertyValue("SignatureLineSuggestedSignerEmail") >>= aSuggestedSignerEmail; + CPPUNIT_ASSERT_EQUAL(OUString("john@thefarmers.com"), aSuggestedSignerEmail); + + OUString aSigningInstructions; + xPropSet->getPropertyValue("SignatureLineSigningInstructions") >>= aSigningInstructions; + CPPUNIT_ASSERT_EQUAL(OUString("Check the machines!"), aSigningInstructions); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf117805) +{ + loadAndSave("tdf117805.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + // This failed, the header was lost. It's still referenced at an incorrect + // location in document.xml, though. + CPPUNIT_ASSERT(xNameAccess->hasByName("word/header1.xml")); + + uno::Reference textbox(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(8, getParagraphs(textbox)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf113183, "tdf113183.docx") +{ + // The horizontal positioning of the star shape affected the positioning of + // the triangle one, so the triangle was outside the page frame. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nPageLeft = getXPath(pXmlDoc, "/root/page[1]/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nPageWidth = getXPath(pXmlDoc, "/root/page[1]/infos/bounds"_ostr, "width"_ostr).toInt32(); + sal_Int32 nShapeLeft + = getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "left"_ostr) + .toInt32(); + sal_Int32 nShapeWidth + = getXPath(pXmlDoc, "/root/page/body/txt/anchored/SwAnchoredDrawObject[2]/bounds"_ostr, "width"_ostr) + .toInt32(); + // Make sure the second triangle shape is within the page bounds (with ~1px tolerance). + CPPUNIT_ASSERT_GREATEREQUAL(nShapeLeft + nShapeWidth, nPageLeft + nPageWidth + 21); +} + +DECLARE_OOXMLEXPORT_TEST(testGraphicObjectFliph, "graphic-object-fliph.docx") +{ + CPPUNIT_ASSERT(getProperty(getShape(1), "HoriMirroredOnEvenPages")); + CPPUNIT_ASSERT(getProperty(getShape(1), "HoriMirroredOnOddPages")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf113547, "tdf113547.docx") +{ + uno::Reference xPropertySet( + getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY); + uno::Reference xLevels( + xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + comphelper::SequenceAsHashMap aProps(xLevels->getByIndex(0)); // 1st level + // This was 0, first-line left margin of the numbering was lost. + CPPUNIT_ASSERT_EQUAL(static_cast(-635), aProps["FirstLineIndent"].get()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf113399) +{ + loadAndReload("tdf113399.doc"); + // 0 padding was not preserved + // In LO 0 is the default, but in OOXML format the default is 254 / 127 + uno::Reference xPropSet(getShape(1), uno::UNO_QUERY); + sal_Int32 nPaddingValue; + xPropSet->getPropertyValue("TextLeftDistance") >>= nPaddingValue; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nPaddingValue); + xPropSet->getPropertyValue("TextRightDistance") >>= nPaddingValue; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nPaddingValue); + xPropSet->getPropertyValue("TextUpperDistance") >>= nPaddingValue; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nPaddingValue); + xPropSet->getPropertyValue("TextLowerDistance") >>= nPaddingValue; + CPPUNIT_ASSERT_EQUAL(static_cast(0), nPaddingValue); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf114882, "tdf114882.docx") +{ + // fastserializer must not fail assertion because of mismatching elements +} + +DECLARE_OOXMLEXPORT_TEST(testTdf49073, "tdf49073.docx") +{ + // test case for Asian phontic guide (ruby text.) + sal_Unicode aRuby[3] = {0x304D,0x3082,0x3093}; + OUString sRuby(aRuby, SAL_N_ELEMENTS(aRuby)); + CPPUNIT_ASSERT_EQUAL(sRuby,getProperty(getParagraph(1)->getStart(), "RubyText")); + OUString sStyle = getProperty( getParagraph(1)->getStart(), "RubyCharStyleName"); + uno::Reference xPropertySet(getStyles("CharacterStyles")->getByName(sStyle), uno::UNO_QUERY ); + CPPUNIT_ASSERT_EQUAL(5.f, getProperty(xPropertySet, "CharHeight")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::RubyAdjust_CENTER) ,getProperty(getParagraph(2)->getStart(),"RubyAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::RubyAdjust_BLOCK) ,getProperty(getParagraph(3)->getStart(),"RubyAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::RubyAdjust_INDENT_BLOCK),getProperty(getParagraph(4)->getStart(),"RubyAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::RubyAdjust_LEFT) ,getProperty(getParagraph(5)->getStart(),"RubyAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::RubyAdjust_RIGHT) ,getProperty(getParagraph(6)->getStart(),"RubyAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::RubyPosition::INTER_CHARACTER) ,getProperty(getParagraph(7)->getStart(),"RubyPosition")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf114703, "tdf114703.docx") +{ + uno::Reference xRules + = getProperty>( + getStyles("NumberingStyles")->getByName("WWNum1"), "NumberingRules"); + // This was 0, level override "default" replaced the non-default value from + // the abstract level. + CPPUNIT_ASSERT_EQUAL( + static_cast(-1000), + comphelper::SequenceAsHashMap(xRules->getByIndex(0))["FirstLineIndent"].get()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf113258, "tdf113258.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // This was 494, i.e. automatic spacing resulted in non-zero paragraph top + // margin for the first paragraph in a shape. + CPPUNIT_ASSERT_EQUAL(static_cast(0), + getProperty(xShape->getStart(), "ParaTopMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf113258_noBeforeAutospacing, "tdf113258_noBeforeAutospacing.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // This was 0, i.e. disabled automatic spacing still resulted in zero paragraph + // top margin for the first paragraph in a shape. + CPPUNIT_ASSERT_EQUAL(static_cast(1764), + getProperty(xShape->getStart(), "ParaTopMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf142542_cancelledAutospacing, "tdf142542_cancelledAutospacing.docx") +{ + //Direct formatting disabling autoSpacing must override paragraph-style's autoSpacing. + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(getParagraph(1), "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(getParagraph(1), "ParaBottomMargin")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf137655) +{ + loadAndSave("tdf137655.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // These were 280. + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p[1]/w:pPr/w:spacing"_ostr, "before"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:p[1]/w:pPr/w:spacing"_ostr, "before"_ostr, "0"); + + //tdf#142542: ensure that the original beforeAutospacing = 0 is not changed. + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p[1]/w:pPr/w:spacing"_ostr, "beforeAutospacing"_ostr, "0"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf120511_eatenSection, "tdf120511_eatenSection.docx") +{ + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nHeight = getXPath(pXmlDoc, "/root/page[1]/infos/prtBounds"_ostr, "height"_ostr).toInt32(); + sal_Int32 nWidth = getXPath(pXmlDoc, "/root/page[1]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_MESSAGE( "Page1 is portrait", nWidth < nHeight ); + nHeight = getXPath(pXmlDoc, "/root/page[2]/infos/prtBounds"_ostr, "height"_ostr).toInt32(); + nWidth = getXPath(pXmlDoc, "/root/page[2]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_MESSAGE( "Page2 is landscape", nWidth > nHeight ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf104354, "tdf104354.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // This was 494, i.e. automatic spacing resulted in non-zero paragraph top + // margin for the first paragraph in a text frame. + CPPUNIT_ASSERT_EQUAL(static_cast(0), + getProperty(xShape->getStart(), "ParaTopMargin")); + // still 494 in the second paragraph + CPPUNIT_ASSERT_EQUAL(static_cast(494), + getProperty(xShape->getEnd(), "ParaTopMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf104354_firstParaInSection, "tdf104354_firstParaInSection.docx") +{ + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xText(xFootnotes->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(494), + getProperty(getParagraphOfText(1, xText), "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageBreak_after) +{ + loadAndReload("pageBreak_after.odt"); + // The problem was that the page breakAfter put the empty page BEFORE the table + xmlDocUniquePtr pDump = parseLayoutDump(); + assertXPath(pDump, "/root/page[1]/body/tab"_ostr, 1); + // There should be two pages actually - a blank page after a page break. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Did you fix?? Table should be on page one of two", 1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf107035, "tdf107035.docx") +{ + // Select the second run containing the page number field + auto xPgNumRun = getRun(getParagraph(1), 2, "1"); + + // Check that the page number field colour is set to "automatic". + Color nPgNumColour = getProperty(xPgNumRun, "CharColor"); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, nPgNumColour); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf112118_DOCX, "tdf112118.docx") +{ + // The resulting left margin width (2081) differs from its DOC counterpart from ww8export2.cxx, + // because DOCX import does two conversions between mm/100 and twips on the route, losing one + // twip on the road and arriving with a value that is 2 mm/100 less. I don't see an obvious way + // to avoid that. + static const struct { + const char* styleName; + struct { + const char* sideName; + sal_Int32 nMargin; + sal_Int32 nBorderDistance; + sal_Int32 nBorderWidth; + } sideParams[4]; + } styleParams[] = { // Margin (MS-style), border distance, border width + { + "Standard", + { + { "Top", 496, 847, 159 }, // 851 twip, 24 pt (from text), 4.5 pt + { "Left", 2081, 706, 212 }, // 1701 twip, 20 pt (from text), 6.0 pt + { "Bottom", 1401, 564, 35 }, // 1134 twip, 16 pt (from text), 1.0 pt + { "Right", 3471, 423, 106 } // 2268 twip, 12 pt (from text), 3.0 pt + } + }, + { + "Converted1", + { + { "Top", 847, 496, 159 }, // 851 twip, 24 pt (from edge), 4.5 pt + { "Left", 706, 2081, 212 }, // 1701 twip, 20 pt (from edge), 6.0 pt + { "Bottom", 564, 1401, 35 }, // 1134 twip, 16 pt (from edge), 1.0 pt + { "Right", 423, 3471, 106 } // 2268 twip, 12 pt (from edge), 3.0 pt + } + } + }; + auto xStyles = getStyles("PageStyles"); + + for (const auto& style : styleParams) + { + const OUString sName = OUString::createFromAscii(style.styleName); + uno::Reference xStyle(xStyles->getByName(sName), uno::UNO_QUERY_THROW); + for (const auto& side : style.sideParams) + { + const OUString sSide = OUString::createFromAscii(side.sideName); + const OString sStage = style.styleName + OString::Concat(" ") + side.sideName; + + sal_Int32 nMargin = getProperty(xStyle, sSide + "Margin"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " margin width").getStr(), + side.nMargin, nMargin); + + sal_Int32 nBorderDistance = getProperty(xStyle, sSide + "BorderDistance"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border distance").getStr(), + side.nBorderDistance, nBorderDistance); + + table::BorderLine aBorder = getProperty(xStyle, sSide + "Border"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border width").getStr(), + side.nBorderWidth, + sal_Int32(aBorder.OuterLineWidth + aBorder.InnerLineWidth + aBorder.LineDistance)); + + // tdf#116472: check that AUTO border color is imported as black + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border color").getStr(), + sal_Int32(COL_BLACK), aBorder.Color); + } + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf82177_outsideCellBorders, "tdf82177_outsideCellBorders.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference< text::XTextTable > xTable( xTables->getByIndex(0), uno::UNO_QUERY ); + uno::Reference< table::XCell > xCell = xTable->getCellByName( "E4" ); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "TopBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "LeftBorder").LineWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf82177_insideCellBorders, "tdf82177_insideCellBorders.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference< text::XTextTable > xTable( xTables->getByIndex(0), uno::UNO_QUERY ); + uno::Reference< table::XCell > xCell = xTable->getCellByName( "E4" ); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "TopBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "LeftBorder").LineWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf82177_tblBorders, "tdf82177_tblBorders.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference< text::XTextTable > xTable( xTables->getByIndex(0), uno::UNO_QUERY ); + uno::Reference< table::XCell > xCell = xTable->getCellByName( "A5" ); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "BottomBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "LeftBorder").LineWidth); + xCell.set(xTable->getCellByName( "E5" )); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "TopBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xCell, "LeftBorder").LineWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf119760_positionCellBorder, "tdf119760_positionCellBorder.docx") +{ + //inconsistent in Word even. 2016 positions on last row, 2003 positions on first cell. + sal_Int32 nRowLeft = parseDump("/root/page/body/tab[4]/row[1]/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nTextLeft = parseDump("/root/page/body/tab[4]/row[1]/cell[1]/txt/infos/bounds"_ostr, "left"_ostr).toInt32(); + CPPUNIT_ASSERT( nRowLeft < nTextLeft ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf98620_environmentBiDi) +{ + loadAndReload("tdf98620_environmentBiDi.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, getProperty( getParagraph(1), "WritingMode" )); + CPPUNIT_ASSERT_EQUAL(sal_Int32(style::ParagraphAdjust_RIGHT), getProperty( getParagraph(1), "ParaAdjust" )); + + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, getProperty( getParagraph(2), "WritingMode" )); + CPPUNIT_ASSERT_EQUAL(sal_Int32(style::ParagraphAdjust_RIGHT), getProperty( getParagraph(2), "ParaAdjust" )); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf116976, "tdf116976.docx") +{ + // This was 0, relative size of shape after bitmap was ignored. + CPPUNIT_ASSERT_EQUAL(static_cast(40), + getProperty(getShape(1), "RelativeWidth")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf116985, "tdf116985.docx") +{ + // Body frame width is 10800, 40% is the requested relative width, with 144 + // spacing to text on the left/right side. So ideal width would be 4032, + // was 3431. Allow one pixel tolerance, though. + sal_Int32 nWidth + = parseDump("/root/page[1]/body/txt[1]/anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT(nWidth > 4000); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf116801, "tdf116801.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + // This raised a lang::IndexOutOfBoundsException, table was missing from + // the import result. + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("D1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("D1"), xCell->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf107969, "tdf107969.docx") +{ + // A VML object in a footnote's tracked changes caused write past end of document.xml at export to docx. + // After that, importing after export failed with + // SAXParseException: '[word/document.xml line 2]: Extra content at the end of the document', Stream 'word/document.xml'. +} + +DECLARE_OOXMLEXPORT_TEST(testOpenDocumentAsReadOnly, "open-as-read-only.docx") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + CPPUNIT_ASSERT(pTextDoc->GetDocShell()->IsSecurityOptOpenReadOnly()); +} + +DECLARE_OOXMLEXPORT_TEST(testNoDefault, "noDefault.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + + // Row 1: color directly applied to the paragraph, overrides table and style colors + CPPUNIT_ASSERT_EQUAL(Color(0x2E74B5), getProperty(getRun(xPara,1), "CharColor")); + + // Row2: (still part of firstRow table-style) ought to use the Normal style color, not the table-style color(5B9BD5) + //xCell.set(xTable->getCellByName("A2"), uno::UNO_QUERY); + //xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + //xParaEnum = xParaEnumAccess->createEnumeration(); + //xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + //CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTMAGENTA), getProperty(getRun(xPara,1), "CharColor")); + + // Row 3+: Normal style still applied, even if nothing is specified with w:default="1" + xCell.set(xTable->getCellByName("A3"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum = xParaEnumAccess->createEnumeration(); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(COL_LIGHTMAGENTA), getProperty(getRun(xPara,1), "CharColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testMarginsFromStyle, "margins_from_style.docx") +{ + // tdf#118521 paragraphs with direct formatting of top or bottom margins have + // lost the other margin comes from paragraph style, getting a bad + // margin from the default style + + // from direct formatting + CPPUNIT_ASSERT_EQUAL(sal_Int32(35), getProperty(getParagraph(1), "ParaTopMargin")); + // from paragraph style + CPPUNIT_ASSERT_EQUAL(sal_Int32(106), getProperty(getParagraph(1), "ParaBottomMargin")); + + // from paragraph style + CPPUNIT_ASSERT_EQUAL(sal_Int32(388), getProperty(getParagraph(3), "ParaTopMargin")); + // from direct formatting + CPPUNIT_ASSERT_EQUAL(sal_Int32(600), getProperty(getParagraph(3), "ParaBottomMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf134784, "tdf134784.docx") +{ + uno::Reference textbox(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(3, getParagraphs(textbox)); + uno::Reference xParagraph = getParagraphOfText(1, textbox); + CPPUNIT_ASSERT_EQUAL(sal_Int32(212), getProperty(xParagraph, "ParaBottomMargin")); + + // This wasn't zero (it was inherited from style of the previous paragraph in the main text) + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xParagraph, "ParaTopMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf136955, "tdf134784.docx") +{ + uno::Reference textbox(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(3, getParagraphs(textbox)); + uno::Reference xParagraph = getParagraphOfText(2, textbox); + + // These weren't zero (values inherited from style of the previous paragraph in the main text) + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xParagraph, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xParagraph, "ParaTopMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf104348_contextMargin, "tdf104348_contextMargin.docx") +{ + // tdf#104348 shows that ContextMargin belongs with Top/Bottom handling + + uno::Reference xMyStyle(getStyles("ParagraphStyles")->getByName("MyStyle"), uno::UNO_QUERY); + // from paragraph style - this is what direct formatting should equal + sal_Int32 nMargin = getProperty(xMyStyle, "ParaBottomMargin"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nMargin); + // from direct formatting + CPPUNIT_ASSERT_EQUAL(nMargin, getProperty(getParagraph(2), "ParaBottomMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf152310, "ColorOverwritten.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), + getProperty(getParagraphOfText(1, xShape), "CharColor")); + CPPUNIT_ASSERT_EQUAL(Color(0x00b050), + getProperty(getParagraphOfText(2, xShape), "CharColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf149996, "lorem_hyperlink.fodt") +{ + // Without the accompanying fix in place, this test would have crashed, + // because the exported file was corrupted. +} + +DECLARE_OOXMLEXPORT_TEST(testGroupedShapeLink, "grouped_link.docx") +{ + // tdf#145147 Hyperlink in grouped shape not imported + // tdf#154469 Hyperlink in grouped shape not exported + uno::Reference xGroupShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("https://www.libreoffice.org"), + getProperty(xGroupShape->getByIndex(0), "Hyperlink")); + CPPUNIT_ASSERT_EQUAL(OUString("https://www.documentfoundation.org"), + getProperty(xGroupShape->getByIndex(1), "Hyperlink")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf147810, "tdf147810.odt") +{ + // Without the accompanying fix in place, this test would have crashed, + // because the exported file was corrupted. +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx new file mode 100644 index 0000000000..c77936a8d6 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport12.cxx @@ -0,0 +1,2348 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testTableCrossReference) +{ + loadAndReload("table_cross_reference.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // tdf#42346: Cross references to tables were not saved + // MSO uses simple bookmarks for referencing table caption, so we do the same by export + + // Check whether we have all the necessary bookmarks exported and imported back + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(4), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_number_only")); + + // Check bookmark text ranges + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_full"), + uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 1: Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 1"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + + // Check reference fields + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess( + xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + + sal_uInt16 nIndex = 0; + while (xFields->hasMoreElements()) + { + uno::Reference xServiceInfo(xFields->nextElement(), uno::UNO_QUERY); + uno::Reference xPropertySet(xServiceInfo, uno::UNO_QUERY); + switch (nIndex) + { + // Full reference to table caption + case 0: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Table 1: Table caption"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Page style reference / exported as simple page reference + case 1: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to table number + case 2: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_number_only"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to caption only + case 3: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_caption_only"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to category and number + case 4: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Table 1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_label_and_number"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to page of the table + case 5: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Above / below reference + case 6: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("above"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + default: + break; + } + ++nIndex; + } + + CPPUNIT_ASSERT_EQUAL(sal_uInt16(8), nIndex); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableCrossReferenceCustomFormat) +{ + loadAndReload("table_cross_reference_custom_format.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // tdf#42346: Cross references to tables were not saved + // Check also captions with custom formatting + + // Check whether we have all the necessary bookmarks exported and imported back + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(16), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_number_only")); + + // Check bookmark text ranges + // First table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_full"), + uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1. Table: Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1. Table"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + // Second table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table1_full"), + uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("2. TableTable caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table1_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("2. Table"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table1_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table1_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("2"), xRange->getString()); + } + // Third table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table2_full"), + uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("3) Table Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table2_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("3) Table"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table2_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table2_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("3"), xRange->getString()); + } + // Fourth table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table3_full"), + uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 4- Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table3_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 4"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table3_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Table3_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("4"), xRange->getString()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testObjectCrossReference) +{ + loadAndReload("object_cross_reference.odt"); + CPPUNIT_ASSERT_EQUAL(10, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + // tdf#42346: Cross references to objects were not saved + // MSO uses simple bookmarks for referencing table caption, so we do the same by export + + // Check whether we have all the necessary bookmarks exported and imported back + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(15), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing1_full")); + + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration1_caption_only")); + + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text1_label_and_number")); + + // Check bookmark text ranges + // Cross references to shapes + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Drawing0_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 1: A rectangle"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Drawing0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 1"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Drawing0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("A rectangle"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Drawing0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Drawing1_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 2: a circle"), xRange->getString()); + } + + // Cross references to pictures + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Illustration0_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Illustration 1: A picture"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Illustration0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Illustration 1"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Illustration0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("A picture"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Illustration0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Illustration1_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("another image"), xRange->getString()); + } + + // Cross references to text frames + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Text0_full"), + uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Text 1: A frame"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Text0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Text 1"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Text0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("A frame"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Text0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + { + uno::Reference xContent( + xBookmarksByName->getByName("Ref_Text1_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Text 2"), xRange->getString()); + } + + // Check reference fields + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess( + xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + + sal_uInt16 nIndex = 0; + while (xFields->hasMoreElements()) + { + uno::Reference xServiceInfo(xFields->nextElement(), uno::UNO_QUERY); + uno::Reference xPropertySet(xServiceInfo, uno::UNO_QUERY); + switch (nIndex) + { + // Reference to image number + case 0: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Illustration0_number_only"), sValue); + break; + } + // Full reference to the circle shape + case 1: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 2: a circle"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Drawing1_full"), sValue); + break; + } + // Caption only reference to the second picture + case 2: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("another image"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Illustration1_caption_only"), sValue); + break; + } + // Category and number reference to second text frame + case 3: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Text 2"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Text1_label_and_number"), sValue); + break; + } + // Full reference to rectangle shape + case 4: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 1: A rectangle"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Drawing0_full"), sValue); + break; + } + // Caption only reference to rectangle shape + case 5: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("A rectangle"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Drawing0_caption_only"), sValue); + break; + } + // Category and number reference to rectangle shape + case 6: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Drawing0_label_and_number"), sValue); + break; + } + // Reference to rectangle shape's number + case 7: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Drawing0_number_only"), sValue); + break; + } + // Full reference to first text frame + case 8: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Text 1: A frame"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Text0_full"), sValue); + break; + } + // Caption only reference to first text frame + case 9: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("A frame"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Text0_caption_only"), sValue); + break; + } + // Category and number reference to first text frame + case 10: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Text 1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Text0_label_and_number"), sValue); + break; + } + // Number only reference to first text frame + case 11: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Text0_number_only"), sValue); + break; + } + // Full reference to first picture + case 12: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Illustration 1: A picture"), + sValue.trim()); // fails on MAC without trim + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Illustration0_full"), sValue); + break; + } + // Reference to first picture' caption + case 13: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("A picture"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Illustration0_caption_only"), sValue); + break; + } + // Category and number reference to first picture + case 14: + { + CPPUNIT_ASSERT( + xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Illustration 1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Illustration0_label_and_number"), sValue); + break; + } + default: + break; + } + ++nIndex; + } + + CPPUNIT_ASSERT_EQUAL(sal_uInt16(21), nIndex); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf112202, "090716_Studentische_Arbeit_VWS.docx") +{ + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // page 1 header: 1 paragraph, 2 flys, 1 draw object + assertXPath(pXmlDoc, "/root/page[1]/header/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/header/txt/anchored/fly"_ostr, 2); + if (isExported()) // somehow there's an additional shape on re-import? + assertXPath(pXmlDoc, "/root/page[1]/header/txt/anchored/SwAnchoredDrawObject"_ostr, 2); + else + assertXPath(pXmlDoc, "/root/page[1]/header/txt/anchored/SwAnchoredDrawObject"_ostr, 1); + + // page 2 header: 3 paragraphs, 1 table, 1 fly on last paragraph + assertXPath(pXmlDoc, "/root/page[2]/header/txt"_ostr, 3); + assertXPath(pXmlDoc, "/root/page[2]/header/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[2]/header/txt/anchored/fly"_ostr, 1); + + // page 3 header: 1 table, 1 paragraph, no text + assertXPath(pXmlDoc, "/root/page[3]/header/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[3]/header/tab"_ostr, 1); + assertXPath(pXmlDoc, + "/root/page[3]/header/tab/row/cell/txt/SwParaPortion/SwLineLayout/child::*"_ostr, + 0); + assertXPath(pXmlDoc, "/root/page[3]/header//anchored"_ostr, 0); + // tdf#149313: ensure 3rd page does not have extra empty paragraph at top + assertXPathContent(pXmlDoc, "/root/page[3]/body//txt"_ostr, "AUFGABENSTELLUNG"); + + // page 4 header: 1 table, 1 paragraph, with text + assertXPath(pXmlDoc, "/root/page[4]/header/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[4]/header/tab"_ostr, 1); + assertXPath( + pXmlDoc, + "/root/page[4]/header/tab/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "Titel der studentischen Arbeit"); + assertXPath(pXmlDoc, "/root/page[4]/header//anchored"_ostr, 0); + + // page 5: same as page 4 + assertXPath(pXmlDoc, "/root/page[5]/header/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[5]/header/tab"_ostr, 1); + assertXPath( + pXmlDoc, + "/root/page[5]/header/tab/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "Titel der studentischen Arbeit"); + assertXPath(pXmlDoc, "/root/page[5]/header//anchored"_ostr, 0); + + // page 6: same as page 4 + assertXPath(pXmlDoc, "/root/page[6]/header/txt"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[6]/header/tab"_ostr, 1); + assertXPath( + pXmlDoc, + "/root/page[6]/header/tab/row[1]/cell[1]/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr, "Titel der studentischen Arbeit"); + assertXPath(pXmlDoc, "/root/page[6]/header//anchored"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf79435_legacyInputFields) +{ + loadAndReload("tdf79435_legacyInputFields.doc"); + //using .doc input file to verify cross-format compatibility. + uno::Reference xFormField + = getProperty>(getRun(getParagraph(5), 3), "Bookmark"); + uno::Reference xParameters(xFormField->getParameters()); + + OUString sTmp; + // Doc import problems, so disabling tests + //xParameters->getByName("EntryMacro") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + //xParameters->getByName("Help") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("F1Help"), sTmp); + //xParameters->getByName("ExitMacro") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + xParameters->getByName("Hint") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("StatusHelp"), sTmp); + //xParameters->getByName("Content") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("Camelcase"), sTmp); + //xParameters->getByName("Format") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("TITLE CASE"), sTmp); + + sal_uInt16 nMaxLength = 0; + xParameters->getByName("MaxLength") >>= nMaxLength; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Max Length", sal_uInt16(10), nMaxLength); + + // too bad this is based on character runs - just found try trial and error. + xFormField + = getProperty>(getRun(getParagraph(6), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("calculated"), sTmp); + + xFormField + = getProperty>(getRun(getParagraph(7), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentDate"), sTmp); + + xFormField + = getProperty>(getRun(getParagraph(7), 7), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentTime"), sTmp); + + xFormField + = getProperty>(getRun(getParagraph(8), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("number"), sTmp); + + xFormField + = getProperty>(getRun(getParagraph(8), 7), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("date"), sTmp); + + xmlDocUniquePtr pXmlDoc = parseExport("word/settings.xml"); + assertXPath(pXmlDoc, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "name"_ostr, + "compatibilityMode"); + assertXPath(pXmlDoc, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "uri"_ostr, + "http://schemas.microsoft.com/office/word"); + assertXPath(pXmlDoc, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "val"_ostr, "11"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf120224_textControlCrossRef, "tdf120224_textControlCrossRef.docx") +{ + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), + uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), + uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); //Text + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), + getProperty(xPropertySet, "TextPortionType")); + uno::Reference xBookmark( + getProperty>(xPropertySet, "Bookmark"), uno::UNO_QUERY); + + // Critical test: does TextField's bookmark name match cross-reference? + const OUString& sTextFieldName(xBookmark->getName()); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess( + xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sTextFieldName, getProperty(xPropertySet, "SourceName")); + + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + // TextFields should not be turned into real bookmarks. + CPPUNIT_ASSERT_EQUAL(static_cast(1), xBookmarksByIdx->getCount()); + + // The actual name isn't critical, but if it fails, it is worth asking why. + CPPUNIT_ASSERT_EQUAL(OUString("Text1"), sTextFieldName); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf117504_numberingIndent, "tdf117504_numberingIndent.docx") +{ + OUString sName = getProperty(getParagraph(1), "NumberingStyleName"); + CPPUNIT_ASSERT_MESSAGE("Paragraph has numbering style", !sName.isEmpty()); + + uno::Reference xPropertySet( + getStyles("ParagraphStyles")->getByName("Revision"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(353), getProperty(xPropertySet, "ParaBottomMargin")); + xPropertySet.set(getStyles("ParagraphStyles")->getByName("Body Note"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPropertySet, "ParaBottomMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testWatermark, "watermark.docx") +{ + uno::Reference xShape = getShape(1); + + sal_Int32 nHeight = xShape->getSize().Height; + + // Rounding errors + sal_Int32 nDifference = 5150 - nHeight; + std::stringstream ss; + ss << "Difference: " << nDifference << " TotalHeight: " << nHeight; + CPPUNIT_ASSERT_MESSAGE(ss.str(), nDifference <= 4); + CPPUNIT_ASSERT_MESSAGE(ss.str(), nDifference >= -4); +} + +DECLARE_OOXMLEXPORT_TEST(testWatermarkTrim, "tdf114308.docx") +{ + uno::Reference xShape = getShape(1); + + // Rounding errors + sal_Int32 nHeight = xShape->getSize().Height; + sal_Int32 nDifference = 8729 - nHeight; + std::stringstream ss; + ss << "Difference: " << nDifference << " TotalHeight: " << nHeight; + CPPUNIT_ASSERT_MESSAGE(ss.str(), nDifference <= 4); + CPPUNIT_ASSERT_MESSAGE(ss.str(), nDifference >= -4); +} + +CPPUNIT_TEST_FIXTURE(Test, testVMLShapetypeId) +{ + loadAndSave("controlshape.fodt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // must be _x0000_t + assertXPath(pXmlDoc, + "/w:document/w:body/w:tbl[1]/w:tr[1]/w:tc[1]/w:p[1]/w:r/mc:AlternateContent/" + "mc:Choice/w:drawing/wp:inline/a:graphic/a:graphicData/wps:wsp/wps:txbx/" + "w:txbxContent/w:p/w:r/w:object/v:shapetype"_ostr, + "id"_ostr, "_x0000_t75"); + assertXPath(pXmlDoc, + "/w:document/w:body/w:tbl[1]/w:tr[1]/w:tc[1]/w:p[1]/w:r/mc:AlternateContent/" + "mc:Choice/w:drawing/wp:inline/a:graphic/a:graphicData/wps:wsp/wps:txbx/" + "w:txbxContent/w:p/w:r/w:object/v:shape"_ostr, + "type"_ostr, "#_x0000_t75"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf73547) +{ + loadAndSave("tdf73547-dash.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + double nD = getXPath(pXmlDoc, "//a:custDash/a:ds[1]"_ostr, "d"_ostr).toDouble(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(105000.0, nD, 5000.0); // was 100000 + double nSp = getXPath(pXmlDoc, "//a:custDash/a:ds[1]"_ostr, "sp"_ostr).toDouble(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(35000.0, nSp, 5000.0); // was 100000 +} + +DECLARE_OOXMLEXPORT_TEST(testTdf119143, "tdf119143.docx") +{ + // The runs inside were ignored + const OUString sParaText = getParagraph(1)->getString(); + CPPUNIT_ASSERT_EQUAL( + u"عندما يريد العالم أن يتكلّم ‬ ، فهو يتحدّث " + u"بلغة " + u"يونيكود. تسجّل الآن لحضور المؤتمر الدولي العاشر " + u"ليونيكود (Unicode Conference)، الذي سيعقد في 10-12 " + u"آذار 1997 بمدينة مَايِنْتْس، ألمانيا. و سيجمع المؤتمر " + u"بين خبراء من كافة قطاعات الصناعة على الشبكة " + u"العالمية انترنيت ويونيكود، حيث ستتم، على الصعيدين " + u"الدولي والمحلي على حد سواء مناقشة سبل استخدام " + u"يونكود في النظم القائمة وفيما يخص التطبيقات " + u"الحاسوبية، الخطوط، تصميم النصوص والحوسبة متعددة " + u"اللغات."_ustr, + sParaText); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf105444) +{ + loadAndSave("tdf105444.docx"); + xmlDocUniquePtr pXmlComm = parseExport("word/comments.xml"); + // there is no extra paragraph on Win32, only a single one. + assertXPath(pXmlComm, "/w:comments/w:comment/w:p"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf117137, "tdf117137.docx") +{ + // Paragraphs were not part of a numbering anymore after roundtrip. + uno::Reference xPara1(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara1.is()); + CPPUNIT_ASSERT(xPara1->getPropertyValue("NumberingRules").hasValue()); + + uno::Reference xPara2(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara2.is()); + CPPUNIT_ASSERT(xPara2->getPropertyValue("NumberingRules").hasValue()); + + uno::Reference xPara3(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara3.is()); + CPPUNIT_ASSERT(xPara3->getPropertyValue("NumberingRules").hasValue()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138780) +{ + loadAndReload("tdf138780.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Paragraphs were not part of a numbering anymore after roundtrip. + uno::Reference xPara1(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara1.is()); + CPPUNIT_ASSERT(xPara1->getPropertyValue("NumberingRules").hasValue()); + + uno::Reference xPara2(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara2.is()); + CPPUNIT_ASSERT(xPara2->getPropertyValue("NumberingRules").hasValue()); + + uno::Reference xPara3(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara3.is()); + CPPUNIT_ASSERT(xPara3->getPropertyValue("NumberingRules").hasValue()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134618) +{ + loadAndSave("tdf134618.doc"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + //Without the fix it in place, it would have failed with + //- Expected: 1 + //- Actual : 9 + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r"_ostr, 1); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf99631) +{ + loadAndSave("tdf99631.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "//w:object"_ostr, 2); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:object"_ostr, 2); + // first XSLX OLE object (1:1 scale) + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:object[1]"_ostr, "dxaOrig"_ostr, + "2561"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:object[1]"_ostr, "dyaOrig"_ostr, + "513"); + // second XLSX OLE object (same content + 1 row, but zoomed) + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:object[1]"_ostr, "dxaOrig"_ostr, + "2561"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:object[1]"_ostr, "dyaOrig"_ostr, + "769"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138899) +{ + loadAndSave("tdf138899.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + // This was 6, not removed empty temporary paragraph at the end of the section + assertXPath(pXmlDocument, "/w:document/w:body/w:p"_ostr, 5); + + //tdf#134385: Paragraph property to "add space between paragraphs of the same style" was lost + assertXPath(pXmlDocument, "//w:p[1]/w:pPr/w:contextualSpacing"_ostr, "val"_ostr, "false"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf122563) +{ + loadAndSave("tdf122563.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:object"_ostr, 1); + // Size of the embedded OLE spreadsheet was the bad "width:28.35pt;height:28.35pt" + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:object/v:shape"_ostr, "style"_ostr, + "width:255.75pt;height:63.75pt;mso-wrap-distance-right:0pt"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf94628) +{ + loadAndReload("tdf94628.docx"); + uno::Reference xPropertySet( + getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY); + uno::Reference xLevels( + xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; // 1st level + + OUString sBulletChar = std::find_if(std::cbegin(aProps), std::cend(aProps), + [](const beans::PropertyValue& rValue) { + return rValue.Name == "BulletChar"; + }) + ->Value.get(); + // Actually for 'BLACK UPPER RIGHT TRIANGLE' is \u25E5 + // But we use Wingdings 3 font here, so code is different + CPPUNIT_ASSERT_EQUAL(u"\uF07B"_ustr, sBulletChar); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf122594, "tdf122594.docx") +{ + // test import/export of ActiveTable (visible sheet) of embedded XLSX OLE objects + uno::Reference xEmbeddedObjectsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xObjects(xEmbeddedObjectsSupplier->getEmbeddedObjects(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), xObjects->getCount()); + + uno::Reference xSheets; + xObjects->getByIndex(0) >>= xSheets; + + uno::Reference xModel; + xSheets->getPropertyValue("Model") >>= xModel; + uno::Reference xViewDataSupplier(xModel, uno::UNO_QUERY); + + uno::Reference xIndexAccess(xViewDataSupplier->getViewData()); + CPPUNIT_ASSERT_EQUAL(static_cast(1), xIndexAccess->getCount()); + + uno::Sequence aSeq; + sal_Int32 nCheck = 0; + if (xIndexAccess->getByIndex(0) >>= aSeq) + { + sal_Int32 nCount(aSeq.getLength()); + for (sal_Int32 i = 0; i < nCount; ++i) + { + OUString sName(aSeq[i].Name); + if (sName == "ActiveTable") + { + OUString sTabName; + if (aSeq[i].Value >>= sTabName) + { + // Sheet2, not Sheet1 + CPPUNIT_ASSERT_EQUAL(OUString("Munka2"), sTabName); + nCheck++; + } + } + // tdf#122624 column and row viewarea positions + else if (sName == "PositionLeft") + { + sal_Int32 nPosLeft; + aSeq[i].Value >>= nPosLeft; + CPPUNIT_ASSERT_EQUAL(static_cast(1), nPosLeft); + nCheck++; + } + else if (sName == "PositionTop") + { + sal_Int32 nPosTop; + aSeq[i].Value >>= nPosTop; + CPPUNIT_ASSERT_EQUAL(static_cast(1), nPosTop); + nCheck++; + } + } + } + + CPPUNIT_ASSERT_EQUAL(static_cast(3), nCheck); +} + +CPPUNIT_TEST_FIXTURE(Test, testLanguageInGroupShape) +{ + loadAndSave("tdf131922_LanguageInGroupShape.docx"); + // tdf#131922: Check if good language is used in shape group texts + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + assertXPath(pXml, + "/w:document/w:body/w:p[7]/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/" + "a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[1]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:lang"_ostr, + "val"_ostr, "de-DE"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf116883, "tdf116883.docx") +{ + { + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>1>"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2>"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2>1>1>"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2>2>"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2>3>"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>1)"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(7), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2)"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(8), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2>1<1)"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(9), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2.2)"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(10), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1>2.3)"), getProperty(xPara, "ListLabelString")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf131420) +{ + loadAndSave("tdf131420.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:pPr/w:pBdr/w:top"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf80526_word_wrap, "tdf80526_word_wrap.docx") +{ + // tdf#80526: check whether the "wrap" property has been set + // TODO: fix export too + if (isExported()) + return; + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xShape, "TextWordWrap")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf118521_marginsLR, "tdf118521_marginsLR.docx") +{ + // tdf#118521 paragraphs with direct formatting of only some of left, right, or first margins have + // lost the other unset margins coming from paragraph style, getting a bad margin from the default style instead + + uno::Reference xMyStyle(getStyles("ParagraphStyles")->getByName("MyStyle"), + uno::UNO_QUERY); + // from paragraph style - this is what direct formatting should equal + sal_Int32 nMargin = getProperty(xMyStyle, "ParaLeftMargin"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nMargin); + // from direct formatting + CPPUNIT_ASSERT_EQUAL(nMargin, getProperty(getParagraph(1), "ParaLeftMargin")); + + nMargin = getProperty(xMyStyle, "ParaRightMargin"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1900), nMargin); + CPPUNIT_ASSERT_EQUAL(nMargin, getProperty(getParagraph(2), "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(882), + getProperty(getParagraph(2), "ParaFirstLineIndent")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf104797, "tdf104797.docx") +{ + // check moveFrom and moveTo + CPPUNIT_ASSERT_EQUAL(OUString("Will this sentence be duplicated?"), + getParagraph(1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(1), 1)->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(1), 3), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Delete"), + getProperty(getRun(getParagraph(1), 3), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getRun(getParagraph(1), 3), "IsStart")); + CPPUNIT_ASSERT_EQUAL( + OUString("This is a filler sentence. Will this sentence be duplicated ADDED STUFF?"), + getParagraph(2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(2), 1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("This is a filler sentence."), + getRun(getParagraph(2), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(2), 3)->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(2), 3), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Insert"), + getProperty(getRun(getParagraph(2), 3), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getRun(getParagraph(2), 3), "IsStart")); + + CPPUNIT_ASSERT_EQUAL(OUString(" "), getRun(getParagraph(2), 4)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(2), 5)->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(2), 6), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Insert"), + getProperty(getRun(getParagraph(2), 6), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(2), 7)->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(2), 7), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getRun(getParagraph(2), 7), "IsStart")); + CPPUNIT_ASSERT_EQUAL(OUString("Will this sentence be duplicated"), + getRun(getParagraph(2), 8)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(" ADDED STUFF"), getRun(getParagraph(2), 11)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("?"), getRun(getParagraph(2), 14)->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf145720, "tdf104797.docx") +{ + // check moveFromRangeStart/End and moveToRangeStart/End (to keep tracked text moving) + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // These were 0 (missing move*FromRange* elements) + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFrom/w:moveFromRangeStart"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFromRangeEnd"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveTo/w:moveToRangeStart"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveToRangeEnd"_ostr, 1); + + // paired names + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFrom/w:moveFromRangeStart"_ostr, + "name"_ostr, "move471382752"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveTo/w:moveToRangeStart"_ostr, + "name"_ostr, "move471382752"); + + // mandatory authors and dates + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFrom/w:moveFromRangeStart"_ostr, + "author"_ostr, u"Tekijä"_ustr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveTo/w:moveToRangeStart"_ostr, + "author"_ostr, u"Tekijä"_ustr); + // no date (anonymized change) + // This failed, date was exported as w:date="0-00-00T00:00:00Z", and later "1970-01-01T00:00:00Z" + assertXPathNoAttribute( + pXmlDoc, "/w:document/w:body/w:p[1]/w:moveFrom/w:moveFromRangeStart"_ostr, "date"_ostr); + assertXPathNoAttribute( + pXmlDoc, "/w:document/w:body/w:p[2]/w:moveTo/w:moveToRangeStart"_ostr, "date"_ostr); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf150166, "tdf150166.docx") +{ + // check moveFromRangeStart/End and moveToRangeStart/End (to keep tracked text moving) + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:moveFromRangeStart"_ostr, 0); + // This was 2 (missing RangeStart elements, but bad unpaired RangeEnds) + assertXPath(pXmlDoc, "//w:moveFromRangeEnd"_ostr, 0); + + // These were 0 (moveFrom, moveTo and t) + assertXPath(pXmlDoc, "//w:del"_ostr, 11); + assertXPath(pXmlDoc, "//w:ins"_ostr, 12); + assertXPath(pXmlDoc, "//w:delText"_ostr, 7); + + // no more moveFrom/moveTo to avoid of problems with ToC + assertXPath(pXmlDoc, "//w:moveFrom"_ostr, 0); + assertXPath(pXmlDoc, "//w:moveTo"_ostr, 0); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf143510, "TC-table-DnD-move.docx") +{ + // check moveFromRangeStart/End and moveToRangeStart/End for tracked table move by drag & drop + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 0 (missing tracked table row deletion/insertion) + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tr/w:trPr/w:del"_ostr, 2); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[2]/w:tr/w:trPr/w:ins"_ostr, 2); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf143510_table_from_row, "TC-table-Separate-Move.docx") +{ + // check moveFromRangeStart/End and moveToRangeStart/End for tracked table move by drag & drop + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 0 (missing tracked table row deletion/insertion) + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tr/w:trPr/w:del"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tr[3]/w:trPr/w:del"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[2]/w:tr"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[2]/w:tr/w:trPr/w:ins"_ostr, 1); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf143510_within_table, "TC-table-rowDND.docx") +{ + // check moveFromRangeStart/End and moveToRangeStart/End for tracked table row move by DnD + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 0 (missing tracked table row deletion/insertion) + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:trPr/w:del"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:trPr/w:ins"_ostr, 1); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf143510_within_table2, "TC-table-rowDND-front.docx") +{ + // check moveFromRangeStart/End and moveToRangeStart/End for tracked table row move by DnD + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 0 (missing tracked table row deletion/insertion) + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:trPr/w:ins"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:trPr/w:del"_ostr, 1); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf150824, "tdf150824.fodt") +{ + // check tracked table row insertion (stored in a single redline) + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 0 (missing tracked table row deletion/insertion) + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:trPr/w:ins"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:trPr/w:ins"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:trPr/w:ins"_ostr, 1); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf157011, "tdf157011_ins_del_empty_cols.docx") +{ + // check tracked table column insertions and deletions with empty cells + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // This was 1 (missing tracked table cell insertions) + assertXPath(pXmlDoc, "//w:ins"_ostr, 3); + + // This was 4 (missing tracked table cell deletions) + assertXPath(pXmlDoc, "//w:del"_ostr, 6); + + // tdf#157187 This was false (dummy w:tc/w:p/w:sdt/w:sdtContent content box) + assertXPath(pXmlDoc, "//w:tc/w:p/w:del"_ostr, 6); + assertXPath(pXmlDoc, "//w:tc/w:p/w:ins"_ostr, 3); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf150824_regression, "ooo30436-1-minimized.sxw") +{ + // There should be no crash during loading of the document + // so, let's check just how much pages we have + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf113608_runAwayNumbering, "tdf113608_runAwayNumbering.docx") +{ + // check that an incorrect numbering style is not applied + // after removing a w:r-less paragraph + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(getParagraph(2), "NumberingStyleName")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf119188_list_margin_in_cell, "tdf119188_list_margin_in_cell.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + + // lists with auto margins in cells: top margin of the first paragraph is zero, + // but not the bottom margin of the last paragraph, also other list items have got + // zero margins. + + CPPUNIT_ASSERT_EQUAL( + static_cast(0), + getProperty(getParagraphOfText(1, xCell->getText()), "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL( + static_cast(0), + getProperty(getParagraphOfText(1, xCell->getText()), "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL( + static_cast(0), + getProperty(getParagraphOfText(2, xCell->getText()), "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL( + static_cast(0), + getProperty(getParagraphOfText(2, xCell->getText()), "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL( + static_cast(0), + getProperty(getParagraphOfText(3, xCell->getText()), "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL( + static_cast(494), + getProperty(getParagraphOfText(3, xCell->getText()), "ParaBottomMargin")); +} + +CPPUNIT_TEST_FIXTURE(Test, testChart_BorderLine_Style) +{ + loadAndSave("Chart_BorderLine_Style.docx"); + /* DOCX containing Chart with BorderLine Style as Dash Type should get preserved + * inside an XML tag with value "dash", "sysDot, "lgDot", etc. + */ + xmlDocUniquePtr pXmlDoc = parseExport("word/charts/chart1.xml"); + assertXPath(pXmlDoc, + "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[1]/c:spPr/a:ln/a:prstDash"_ostr, + "val"_ostr, "sysDot"); + assertXPath(pXmlDoc, + "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[2]/c:spPr/a:ln/a:prstDash"_ostr, + "val"_ostr, "sysDash"); + assertXPath(pXmlDoc, + "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser[3]/c:spPr/a:ln/a:prstDash"_ostr, + "val"_ostr, "dash"); +} + +CPPUNIT_TEST_FIXTURE(Test, testChart_Plot_BorderLine_Style) +{ + loadAndSave("Chart_Plot_BorderLine_Style.docx"); + /* DOCX containing Chart wall (plot area) and Chart Page with BorderLine Style as Dash Type + * should get preserved inside an XML tag with value "dash", "sysDot, "lgDot", etc. + */ + xmlDocUniquePtr pXmlDoc = parseExport("word/charts/chart1.xml"); + assertXPath(pXmlDoc, "/c:chartSpace/c:chart/c:plotArea/c:spPr/a:ln/a:prstDash"_ostr, "val"_ostr, + "lgDashDot"); + assertXPath(pXmlDoc, "/c:chartSpace/c:spPr/a:ln/a:prstDash"_ostr, "val"_ostr, "sysDash"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesDeletedEmptyParagraph) +{ + loadAndSave("testTrackChangesDeletedEmptyParagraph.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:rPr/w:del"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesEmptyParagraphsInADeletion) +{ + loadAndSave("testTrackChangesEmptyParagraphsInADeletion.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + for (int i = 1; i < 12; ++i) + assertXPath(pXmlDoc, + "/w:document/w:body/w:p[" + OString::number(i) + "]/w:pPr/w:rPr/w:del"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf149708) +{ + loadAndSave("tdf149708.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // keep tracked insertion of a list item + // This was 0 (missing tracked insertion of the paragraph mark) + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:ins"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf149707) +{ + loadAndSave("tdf149711.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:moveFrom"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:moveTo"_ostr); + // These were missing + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:moveFrom"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:rPr/w:moveTo"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf70234) +{ + loadAndSave("tdf70234.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import field with tracked deletion + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:del/w:r[1]/w:fldChar"_ostr); + + // export multiple runs of a field with tracked deletion + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:del/w:r"_ostr, 6); + + // export w:delInstrText + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:del/w:r/w:delInstrText"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf115212) +{ + loadAndSave("tdf115212.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // export field with tracked deletion + assertXPath(pXmlDoc, "//w:p[2]/w:del[1]/w:r[1]/w:fldChar"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf126243) +{ + loadAndSave("tdf120338.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // export change tracking rejection data for tracked paragraph style change + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:pPrChange/w:pPr/w:pStyle"_ostr, + "val"_ostr, "Heading3"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf126245) +{ + loadAndSave("tdf126245.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // export change tracking rejection data for tracked numbering change + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pPrChange/w:pPr/w:numPr/w:numId"_ostr, + "val"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf124491) +{ + loadAndSave("tdf124491.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import format change of empty lines, FIXME: change w:r with w:pPr in export + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/*/w:rPr/w:rPrChange"_ostr); + // empty line without format change + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/*/w:rPrChange"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/*/*/w:rPrChange"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf143911) +{ + loadAndSave("tdf126206.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // export format change of text portions + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:rPr/w:rPrChange"_ostr); + // This was without tracked bold formatting + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:rPr/w:rPrChange/w:rPr/w:b"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf105485) +{ + loadAndSave("tdf105485.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import change tracking of deleted comments + assertXPath(pXmlDoc, "//w:del/w:r/w:commentReference"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125894) +{ + loadAndSave("tdf125894.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import change tracking in frames + assertXPath(pXmlDoc, "//w:del"_ostr, 2); + assertXPath(pXmlDoc, "//w:ins"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf149388) +{ + // see also testTdf132371 + loadAndSave("tdf132271.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import change tracking in floating tables + // (don't recognize tracked text moving during the import, + // because the text is too short and it's only a single word) + assertXPath(pXmlDoc, "//w:del"_ostr, 2); + assertXPath(pXmlDoc, "//w:ins"_ostr, 2); + assertXPath(pXmlDoc, "//w:moveFrom"_ostr, 0); + assertXPath(pXmlDoc, "//w:moveTo"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf132271) +{ + // see also testTdf149388 + loadAndSave("tdf149388.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import change tracking in floating tables + if (!isExported()) + { + assertXPath(pXmlDoc, "//w:del"_ostr, 2); + assertXPath(pXmlDoc, "//w:ins"_ostr, 2); + assertXPath(pXmlDoc, "//w:moveFrom"_ostr, 0); + assertXPath(pXmlDoc, "//w:moveTo"_ostr, 0); + } + else + { + assertXPath(pXmlDoc, "//w:del"_ostr, 1); + assertXPath(pXmlDoc, "//w:ins"_ostr, 1); + // tracked text moving recognized during the import + assertXPath(pXmlDoc, "//w:moveFrom"_ostr, 1); + assertXPath(pXmlDoc, "//w:moveTo"_ostr, 1); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf149388_fly) +{ + // see also testTdf136667 + loadAndSave("tdf136667.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import change tracking in floating tables + assertXPath(pXmlDoc, "//w:del"_ostr, 2); + assertXPath(pXmlDoc, "//w:ins"_ostr, 4); + assertXPath(pXmlDoc, "//w:moveFrom"_ostr, 0); + assertXPath(pXmlDoc, "//w:moveTo"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136667) +{ + // see also testTdf149388_fly + loadAndSave("tdf149388_fly.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import change tracking in floating tables + if (!isExported()) + { + assertXPath(pXmlDoc, "//w:del"_ostr, 2); + assertXPath(pXmlDoc, "//w:ins"_ostr, 4); + assertXPath(pXmlDoc, "//w:moveFrom"_ostr, 0); + assertXPath(pXmlDoc, "//w:moveTo"_ostr, 0); + } + else + { + assertXPath(pXmlDoc, "//w:del"_ostr, 1); + assertXPath(pXmlDoc, "//w:ins"_ostr, 3); + // tracked text moving recognized during the import + assertXPath(pXmlDoc, "//w:moveFrom"_ostr, 1); + assertXPath(pXmlDoc, "//w:moveTo"_ostr, 1); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136850) +{ + loadAndSave("tdf136850.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // import change tracking in floating tables + assertXPath(pXmlDoc, "//w:del"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128156) +{ + loadAndSave("tdf128156.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // keep tracked insertion of a paragraph + // This was 0 before 350972a8bffc1a74b531e0336954bf54b1356025, + // and 1 later (missing tracked insertion of the paragraph mark) + assertXPath(pXmlDoc, "//w:ins"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125546) +{ + loadAndSave("tdf125546.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // compress redlines (it was 15) + assertXPath(pXmlDoc, "//w:rPrChange"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testLabelWidthAndPosition_Left_FirstLineIndent) +{ + loadAndSave("Hau_min_list2.fodt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // list is LABEL_WIDTH_AND_POSITION with SvxAdjust::Left + // I) LTR + // a) all LTR cases with no number text look good in Word + // 1) negative first line indent on paragraph: + // no list width/indent: this one was 0 previously; this looks good + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "hanging"_ostr, "399"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:ind"_ostr, "hanging"_ostr, "966"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:ind"_ostr, "hanging"_ostr, "399"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width + list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:ind"_ostr, "start"_ostr, "1134"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:ind"_ostr, "hanging"_ostr, "966"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // 2) positive first line indent on paragraph: + // no list width/indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:ind"_ostr, "firstLine"_ostr, "420"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:pPr/w:ind"_ostr, "hanging"_ostr, "147"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:ind"_ostr, "firstLine"_ostr, "420"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width + list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[8]/w:pPr/w:ind"_ostr, "start"_ostr, "1134"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[8]/w:pPr/w:ind"_ostr, "hanging"_ostr, "147"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[8]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // b) all LTR cases with number text: the indent looks good but some tabs are wrong + // 1) negative first line indent on paragraph: + // no list width/indent: this one was 0 previously; this looks good + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr/w:ind"_ostr, "hanging"_ostr, "399"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[10]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[10]/w:pPr/w:ind"_ostr, "hanging"_ostr, "966"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[10]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:ind"_ostr, "hanging"_ostr, "399"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width + list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[12]/w:pPr/w:ind"_ostr, "start"_ostr, "1134"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[12]/w:pPr/w:ind"_ostr, "hanging"_ostr, "966"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[12]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // 2) positive first line indent on paragraph: + // no list width/indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:ind"_ostr, "firstLine"_ostr, "420"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[14]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[14]/w:pPr/w:ind"_ostr, "hanging"_ostr, "147"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[14]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:ind"_ostr, "start"_ostr, "567"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:ind"_ostr, "firstLine"_ostr, "420"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // list width + list indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[16]/w:pPr/w:ind"_ostr, "start"_ostr, "1134"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[16]/w:pPr/w:ind"_ostr, "hanging"_ostr, "147"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[16]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // (w:p[17] is empty) + // I) RTL + // a) only RTL cases with no number text and no width/indent look good in Word + // 1) negative first line indent on paragraph: + // no list width/indent + assertXPath(pXmlDoc, "/w:document/w:body/w:p[18]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[18]/w:pPr/w:ind"_ostr, "hanging"_ostr, "399"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[18]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // 2) positive first line indent on paragraph: + // no list width/indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[22]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[22]/w:pPr/w:ind"_ostr, "firstLine"_ostr, "420"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[22]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // b) RTL cases with number text: the indent looks good but some tabs are wrong + // 1) negative first line indent on paragraph: + // no list width/indent + assertXPath(pXmlDoc, "/w:document/w:body/w:p[26]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[26]/w:pPr/w:ind"_ostr, "hanging"_ostr, "399"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[26]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // 2) positive first line indent on paragraph: + // no list width/indent: + assertXPath(pXmlDoc, "/w:document/w:body/w:p[30]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[30]/w:pPr/w:ind"_ostr, "firstLine"_ostr, "420"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[30]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + // TODO: other cases +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf124604) +{ + loadAndSave("tdf124604.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // If the numbering comes from a base style, indentation of the base style has also priority. + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf95374) +{ + loadAndSave("tdf95374.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Numbering disabled by non-existent numId=0, disabling also inheritance of indentation of parent styles + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "hanging"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "start"_ostr, "1136"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf108493, "tdf108493.docx") +{ + uno::Reference xPara7(getParagraph(7), uno::UNO_QUERY); + // set in the paragraph (709 twips) + CPPUNIT_ASSERT_EQUAL(sal_Int32(1251), getProperty(xPara7, "ParaLeftMargin")); + // set in the numbering style (this was 0) + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1251), getProperty(xPara7, "ParaFirstLineIndent")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf118691, "tdf118691.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + // Text "Before" stays in the first cell, not removed before the table because of + // bad handling of + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Before\nAfter"), xCell->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf64264, "tdf64264.docx") +{ + // DOCX table rows with tblHeader setting mustn't modify the count of the + // repeated table header rows, when there is rows before them without tblHeader settings. + xmlDocUniquePtr pDump = parseLayoutDump(); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + // table starts on page 1 and finished on page 2 + // and it has got only a single repeating header line + assertXPath(pDump, "/root/page[2]/body/tab"_ostr, 1); + assertXPath(pDump, "/root/page[2]/body/tab/row"_ostr, 47); + CPPUNIT_ASSERT_EQUAL(OUString("Repeating Table Header"), + parseDump("/root/page[2]/body/tab/row[1]/cell[1]/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + parseDump("/root/page[2]/body/tab/row[2]/cell[1]/txt/text()"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf58944RepeatingTableHeader, "tdf58944-repeating-table-header.docx") +{ + // DOCX tables with more than 10 repeating header lines imported without repeating header lines + // as a workaround for MSO's limitation of header line repetition + xmlDocUniquePtr pDump = parseLayoutDump(); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + // table starts on page 1 and finished on page 2 + // instead of showing only a part of it on page 2 + assertXPath(pDump, "/root/page[1]/body/tab"_ostr, 1); + assertXPath(pDump, "/root/page[1]/body/tab/row"_ostr, 11); + CPPUNIT_ASSERT_EQUAL(OUString("Test1"), + parseDump("/root/page[2]/body/tab/row[1]/cell[1]/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Test2"), + parseDump("/root/page[2]/body/tab/row[2]/cell[1]/txt/text()"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf81100) +{ + loadAndSave("tdf81100.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/styles.xml"); + CPPUNIT_ASSERT(pXmlDoc); + // keep "repeat table header" setting of table styles + assertXPath(pXmlDoc, "/w:styles/w:style/w:tblStylePr/w:trPr/w:tblHeader"_ostr, 4); + + xmlDocUniquePtr pDump = parseLayoutDump(); + CPPUNIT_ASSERT_EQUAL(3, getPages()); + + // table starts on page 1 and finished on page 2 + // and it has got only a single repeating header line + assertXPath(pDump, "/root/page[2]/body/tab[1]"_ostr, 1); + assertXPath(pDump, "/root/page[2]/body/tab[1]/row"_ostr, 2); + assertXPath(pDump, "/root/page[3]/body/tab"_ostr, 1); + if (!isExported()) // TODO export tblHeader=false + assertXPath(pDump, "/root/page[3]/body/tab/row"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf88496) +{ + loadAndReload("tdf88496.docx"); + // Switch off repeating header, there is no place for it. + // Now there are only 3 pages with complete table content + // instead of a 51-page long table only with header. + CPPUNIT_ASSERT_EQUAL(3, getPages()); + // (this appears to have the correct result now?) + // FIXME: this actually has 3 pages but SwWrtShell::SttPg() puts the cursor + // into the single SwTextFrame in the follow-flow-row at the top of the + // table but that SwTextFrame 1105 should not exist and the cursor ends up + // at the end of its master frame 848 instead; the problem is somewhere in + // SwTextFrame::FormatAdjust() which first determines nNew = 1 but then + // grows this frame anyway so that the follow is empty, but nothing + // invalidates 1105 again. +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf77417) +{ + loadAndReload("tdf77417.docx"); + // MSO 2010 compatibility mode: terminating white spaces are ignored in tables. + // This was 3 pages with the first invisible blank page. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf130494) +{ + loadAndSave("tdf130494.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:pPr/w:rPr/w:highlight"_ostr, + "val"_ostr, "yellow"); + // keep direct formatting of table cell paragraph with removed highlighting + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r/w:rPr/w:highlight"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf130690) +{ + loadAndSave("tdf130690.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:pPr/w:rPr/w:highlight"_ostr, + "val"_ostr, "yellow"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[1]/w:rPr/w:highlight"_ostr, + 1); + // keep direct formatting of table cell paragraph with removed highlighting + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[2]/w:rPr/w:highlight"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf105215) +{ + loadAndSave("tdf105215.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:pPr/w:rPr/w:rFonts"_ostr, + "ascii"_ostr, "Linux Libertine G"); + + // These were "Linux Libertine G" + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r/w:rPr"_ostr, 5); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[1]/w:rPr/w:rFonts"_ostr, + "ascii"_ostr, "Lohit Devanagari"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[2]/w:rPr/w:rFonts"_ostr, + "ascii"_ostr, "Lohit Devanagari"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[3]/w:rPr/w:rFonts"_ostr, + "ascii"_ostr, "Lohit Devanagari"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[4]/w:rPr/w:rFonts"_ostr, + "ascii"_ostr, "Lohit Devanagari"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[5]/w:rPr/w:rFonts"_ostr, + "ascii"_ostr, "Lohit Devanagari"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135187) +{ + loadAndSave("tdf135187.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p/w:pPr/w:rPr/w:b"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[1]/w:p/w:pPr/w:rPr/w:b"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[1]/w:p/w:pPr/w:rPr/w:b"_ostr, 1); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p/w:r[1]/w:rPr/w:b"_ostr, 1); + assertXPathNoAttribute( + pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p/w:r[1]/w:rPr/w:b"_ostr, "val"_ostr); + // This was 0 + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[1]/w:p/w:r[1]/w:rPr/w:b"_ostr, 1); + assertXPathNoAttribute( + pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[1]/w:p/w:r[1]/w:rPr/w:b"_ostr, "val"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[1]/w:p/w:r[1]/w:rPr/w:b"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[1]/w:p/w:r[1]/w:rPr/w:b"_ostr, + "val"_ostr, "false"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136617) +{ + loadAndSave("tdf136617.docx"); + + // This was 2 + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:p[2]/w:pPr/w:rPr/w:sz"_ostr, + "val"_ostr, "16"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121597TrackedDeletionOfMultipleParagraphs) +{ + loadAndSave("tdf121597.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // check paragraphs with removed paragraph mark + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:del"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:del"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:rPr/w:del"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:rPr/w:del"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:rPr/w:del"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[10]/w:pPr/w:rPr/w:del"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141660) +{ + loadAndSave("tdf141660.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[2]/w:footnoteReference"_ostr, "id"_ostr, + "2"); + // w:del is imported correctly with its footnote + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:del[2]/w:r/w:footnoteReference"_ostr, + "id"_ostr, "3"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r/w:footnoteReference"_ostr, "id"_ostr, "4"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133643) +{ + loadAndSave("tdf133643.doc"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[1]/w:fldChar"_ostr, + "fldCharType"_ostr, "begin"); + assertXPath( + pXmlDoc, + "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[1]/w:fldChar/w:ffData/w:ddList/w:listEntry[1]"_ostr, + "val"_ostr, "Bourgoin-Jallieu, "); + assertXPath( + pXmlDoc, + "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[1]/w:fldChar/w:ffData/w:ddList/w:listEntry[2]"_ostr, + "val"_ostr, "Fontaine, "); + + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[2]/w:instrText"_ostr, + " FORMDROPDOWN "); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[3]/w:fldChar"_ostr, + "fldCharType"_ostr, "separate"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[5]/w:fldChar"_ostr, + "fldCharType"_ostr, "end"); + + // Without the fix in place, this w:r wouldn't exist + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r[6]/w:t"_ostr, + "le 22 fevrier 2013"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123189_tableBackground, "table-black_fill.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + uno::Reference xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT_EQUAL(COL_TRANSPARENT, getProperty(xCell, "BackColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf116084, "tdf116084.docx") +{ + // tracked line is not a single text portion: w:del is recognized within w:ins + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(1), 1)->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(1), 1), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("There "), getRun(getParagraph(1), 2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(1), 4)->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(1), 4), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("must"), getRun(getParagraph(1), 5)->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf116084_anonymized) +{ + loadAndSave("tdf116084.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // w:del in w:ins is exported correctly + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del/w:r/w:delText"_ostr, "must"); + + // no date (anonymized changes) + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins[@date]"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del[@w:date]"_ostr, 0); + + // w:ins and w:del have w:author attributes, and the same + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del[@w:author]"_ostr, 1); + OUString sAuthor = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins[2]"_ostr, "author"_ostr); + OUString sAuthor2 = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del"_ostr, "author"_ostr); + CPPUNIT_ASSERT_EQUAL(sAuthor, sAuthor2); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf121176, "tdf121176.docx") +{ + // w:del is imported correctly when it is in a same size w:ins + CPPUNIT_ASSERT_EQUAL(OUString(""), getRun(getParagraph(1), 1)->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(1), 1), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("must"), getRun(getParagraph(1), 2)->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121176_anonymized) +{ + loadAndSave("tdf121176.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // w:del in w:ins is exported correctly + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del/w:r/w:delText"_ostr, "must"); + + // no date (anonymized changes) + assertXPathNoAttribute(pXmlDoc, "/w:document/w:body/w:p/w:ins"_ostr, "date"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del[@w:date]"_ostr, 0); + + // w:ins and w:del have w:author attributes, and the same + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del[@w:author]"_ostr, 1); + OUString sAuthor = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins"_ostr, "author"_ostr); + OUString sAuthor2 = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del"_ostr, "author"_ostr); + CPPUNIT_ASSERT_EQUAL(sAuthor, sAuthor2); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128913) +{ + loadAndSave("tdf128913.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // w:ins and w:del are imported correctly, if they contain only inline images + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:r/w:drawing/wp:inline/a:graphic"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:del/w:r/w:drawing/wp:inline/a:graphic"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142700) +{ + loadAndSave("tdf142700.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // w:ins and w:del are imported correctly, if they contain only images anchored to character + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:r/w:drawing/wp:anchor/a:graphic"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:del/w:r/w:drawing/wp:anchor/a:graphic"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142387) +{ + loadAndSave("tdf142387.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // w:del in w:ins is exported correctly (only w:del was exported) + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:ins/w:del/w:r/w:delText"_ostr, + "inserts "); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf147892) +{ + loadAndSave("tdf147892.fodt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // w:del in w:ins is exported correctly + // (both w:del and w:ins were exported for para marker) + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:del"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:ins"_ostr, 0); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123054, "tdf123054.docx") +{ + CPPUNIT_ASSERT_EQUAL(OUString("No Spacing"), + getProperty(getParagraph(20), "ParaStyleName")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf67207_MERGEFIELD_DATABASE, "tdf67207.docx") +{ + // database fields use the database "database" and its table "Sheet1" + uno::Reference xTextField + = getProperty>(getRun(getParagraph(2), 2), "TextField"); + CPPUNIT_ASSERT(xTextField.is()); + uno::Reference xServiceInfo(xTextField, uno::UNO_QUERY_THROW); + uno::Reference xDependent(xTextField, uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.Database")); + OUString sValue; + xTextField->getPropertyValue("Content") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString::fromUtf8(""), sValue); + + uno::Reference xFiledMaster = xDependent->getTextFieldMaster(); + uno::Reference xFiledMasterServiceInfo(xFiledMaster, uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT( + xFiledMasterServiceInfo->supportsService("com.sun.star.text.fieldmaster.Database")); + + // Defined properties: DataBaseName, Name, DataTableName, DataColumnName, DependentTextFields, DataCommandType, InstanceName, DataBaseURL + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("DataBaseName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("database"), sValue); + sal_Int32 nCommandType; + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("DataCommandType") >>= nCommandType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nCommandType); // css::sdb::CommandType::TABLE + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("DataTableName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("Sheet1"), sValue); + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("DataColumnName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("c1"), sValue); + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("InstanceName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.text.fieldmaster.DataBase.database.Sheet1.c1"), + sValue); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf101122_noFillForCustomShape) +{ + loadAndSave("tdf101122_noFillForCustomShape.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // tdf#101122 check whether the "F" (noFill) option has been exported to docx + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, + "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Choice/w:drawing/wp:anchor/" + "a:graphic/a:graphicData/wps:wsp/wps:spPr/a:custGeom/a:pathLst/a:path"_ostr, + "fill"_ostr, "none"); + assertXPathNoAttribute( + pXmlDoc, + "/w:document/w:body/w:p/w:r/mc:AlternateContent[2]/mc:Choice/w:drawing/wp:anchor/a:graphic/" + "a:graphicData/wps:wsp/wps:spPr/a:custGeom/a:pathLst/a:path"_ostr, + "fill"_ostr); +} +// The (tdf124678_no_leading_paragraph.odt, tdf124678_with_leading_paragraph.odt) documents are the same, +// except: +// - tdf124678_no_leading_paragraph.odt doesn't contain leading empty paragraph +// before the first section +// +CPPUNIT_TEST_FIXTURE(Test, testTdf124678_case1) +{ + loadAndReload("tdf124678_no_leading_paragraph.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("First page header text", OUString(""), + parseDump("/root/page[1]/header/txt"_ostr)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Second page header text", OUString("HEADER"), + parseDump("/root/page[2]/header/txt"_ostr)); +} + +// The (tdf124678_no_leading_paragraph.odt, tdf124678_with_leading_paragraph.odt) documents are the same, +// except: +// - tdf124678_no_leading_paragraph.odt doesn't contain leading empty paragraph +// before the first section +// +CPPUNIT_TEST_FIXTURE(Test, testTdf124678_case2) +{ + loadAndReload("tdf124678_with_leading_paragraph.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("First page header text", OUString(""), + parseDump("/root/page[1]/header/txt"_ostr)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Second page header text", OUString("HEADER"), + parseDump("/root/page[2]/header/txt"_ostr)); +} + +static bool lcl_nearEqual(const sal_Int32 nNumber1, const sal_Int32 nNumber2, + sal_Int32 nMaxDiff = 5) +{ + return std::abs(nNumber1 - nNumber2) < nMaxDiff; +} + +DECLARE_OOXMLEXPORT_TEST(testTdf119952_negativeMargins, "tdf119952_negativeMargins.docx") +{ + // With negative margins (in MS Word) one can set up header (or footer) that overlaps with the body. + // LibreOffice unable to display that, so when importing negative margins, + // the header (or footer) converted to a flyframe, anchored to the header.. + // that can overlap with the body, and will appear like in Word. + // This conversion modifies the document [i.e. replacing header text with a textbox...] + // but its DOCX export looks the same, as the original document in Word, too. + xmlDocUniquePtr pDump = parseLayoutDump(); + + //Check layout positions / sizes + sal_Int32 nLeftHead + = getXPath(pDump, "//page[1]/header/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nLeftBody + = getXPath(pDump, "//page[1]/body/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nLeftFoot + = getXPath(pDump, "//page[1]/footer/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nLeftHFly + = getXPath(pDump, "//page[1]/header/txt/anchored/fly/infos/bounds"_ostr, "left"_ostr) + .toInt32(); + sal_Int32 nLeftFFly + = getXPath(pDump, "//page[1]/footer/txt/anchored/fly/infos/bounds"_ostr, "left"_ostr) + .toInt32(); + + sal_Int32 nTopHead + = getXPath(pDump, "//page[1]/header/infos/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 nTopBody = getXPath(pDump, "//page[1]/body/infos/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 nTopFoot + = getXPath(pDump, "//page[1]/footer/infos/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 nTopHFly + = getXPath(pDump, "//page[1]/header/txt/anchored/fly/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + sal_Int32 nTopFFly + = getXPath(pDump, "//page[1]/footer/txt/anchored/fly/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + + sal_Int32 nHeightHead + = getXPath(pDump, "//page[1]/header/infos/bounds"_ostr, "height"_ostr).toInt32(); + sal_Int32 nHeightBody + = getXPath(pDump, "//page[1]/body/infos/bounds"_ostr, "height"_ostr).toInt32(); + sal_Int32 nHeightFoot + = getXPath(pDump, "//page[1]/footer/infos/bounds"_ostr, "height"_ostr).toInt32(); + sal_Int32 nHeightHFly + = getXPath(pDump, "//page[1]/header/txt/anchored/fly/infos/bounds"_ostr, "height"_ostr) + .toInt32(); + sal_Int32 nHeightFFly + = getXPath(pDump, "//page[1]/footer/txt/anchored/fly/infos/bounds"_ostr, "height"_ostr) + .toInt32(); + sal_Int32 nHeightHFlyBound + = getXPath(pDump, "//page[1]/header/infos/prtBounds"_ostr, "height"_ostr).toInt32(); + sal_Int32 nHeightFFlyBound + = getXPath(pDump, "//page[1]/footer/infos/prtBounds"_ostr, "height"_ostr).toInt32(); + + CPPUNIT_ASSERT(lcl_nearEqual(nLeftHead, nLeftBody)); + CPPUNIT_ASSERT(lcl_nearEqual(nLeftHead, nLeftFoot)); + CPPUNIT_ASSERT(lcl_nearEqual(nLeftHead, nLeftHFly)); + CPPUNIT_ASSERT(lcl_nearEqual(nLeftHead, nLeftFFly)); + + CPPUNIT_ASSERT(lcl_nearEqual(nTopHead, 851)); + CPPUNIT_ASSERT(lcl_nearEqual(nTopBody, 1418)); + CPPUNIT_ASSERT(lcl_nearEqual(nTopFoot, 15875)); + CPPUNIT_ASSERT(lcl_nearEqual(nTopHFly, 851)); + + // this seems to be an import bug + if (!isExported()) + CPPUNIT_ASSERT(lcl_nearEqual(nTopFFly, 14403)); + + CPPUNIT_ASSERT(lcl_nearEqual(nHeightHead, 567)); + CPPUNIT_ASSERT(lcl_nearEqual(nHeightBody, 14457)); + CPPUNIT_ASSERT(lcl_nearEqual(nHeightFoot, 680)); + CPPUNIT_ASSERT(lcl_nearEqual(nHeightHFly, 2152)); + CPPUNIT_ASSERT(lcl_nearEqual(nHeightFFly, 2152)); + + // after export these heights increase to like 567. + // not sure if it is another import, or export bug... or just the result of the modified document + if (!isExported()) + { + CPPUNIT_ASSERT(lcl_nearEqual(nHeightHFlyBound, 57)); + CPPUNIT_ASSERT(lcl_nearEqual(nHeightFFlyBound, 57)); + } + + //Check text of header/ footer + CPPUNIT_ASSERT_EQUAL( + OUString("f1"), + getXPath( + pDump, + "//page[1]/header/txt/anchored/fly/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + CPPUNIT_ASSERT_EQUAL( + OUString(" f8"), + getXPath( + pDump, + "//page[1]/header/txt/anchored/fly/txt[8]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + CPPUNIT_ASSERT_EQUAL( + OUString(" f8"), + getXPath( + pDump, + "//page[1]/footer/txt/anchored/fly/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + CPPUNIT_ASSERT_EQUAL( + OUString("f1"), + getXPath( + pDump, + "//page[1]/footer/txt/anchored/fly/txt[8]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + + CPPUNIT_ASSERT_EQUAL( + OUString("p1"), + getXPath( + pDump, + "//page[2]/header/txt/anchored/fly/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + CPPUNIT_ASSERT_EQUAL( + OUString("p1"), + getXPath( + pDump, + "//page[2]/footer/txt/anchored/fly/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + + CPPUNIT_ASSERT_EQUAL( + OUString(" aaaa"), + getXPath( + pDump, + "//page[3]/header/txt/anchored/fly/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + CPPUNIT_ASSERT_EQUAL( + OUString(" eeee"), + getXPath( + pDump, + "//page[3]/header/txt/anchored/fly/txt[5]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, + "portion"_ostr)); + + CPPUNIT_ASSERT_EQUAL(OUString("f1 f2 f3 f4 f5 f6 " + " f7 f8"), + parseDump("/root/page[1]/header/txt/anchored/fly"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString(" f8 f7 f6 f5 " + " f4 f3 f2f1"), + parseDump("/root/page[1]/footer/txt/anchored/fly"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("p1"), parseDump("/root/page[2]/header/txt/anchored/fly"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("p1"), parseDump("/root/page[2]/footer/txt/anchored/fly"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString(" aaaa bbbb cccc dddd eeee"), + parseDump("/root/page[3]/header/txt/anchored/fly"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf143384_tableInFoot_negativeMargins, + "tdf143384_tableInFoot_negativeMargins.docx") +{ + // There should be no crash during loading of the document + // so, let's check just how much pages we have + // Ideally this would be 1, matching Word. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx new file mode 100644 index 0000000000..c7c670fe30 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx @@ -0,0 +1,1341 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +// TODO: the re-import doesn't work just yet, but that isn't a regression... +DECLARE_SW_EXPORT_TEST(testFlyInFly, "ooo39250-1-min.rtf", nullptr, Test) +{ + // check that anchor of text frame is in other text frame + uno::Reference const xAnchored(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xAnchored.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Frame1")/*generated name*/, uno::Reference(xAnchored, uno::UNO_QUERY_THROW)->getName()); + uno::Reference const xAnchorText(xAnchored->getAnchor()->getText()); + uno::Reference const xAnchorFrame(xAnchorText, uno::UNO_QUERY); + CPPUNIT_ASSERT(xAnchorFrame.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Frame3"), uno::Reference(xAnchorFrame, uno::UNO_QUERY_THROW)->getName()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf125778_lostPageBreakTOX, "tdf125778_lostPageBreakTOX.docx") +{ + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 3, getPages() ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf126994_lostPageBreak, "tdf126994_lostPageBreak.docx") +{ + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 3, getPages() ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf155690, "tdf155690.docx") +{ + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarks = xBookmarksSupplier->getBookmarks(); + { + uno::Reference xMark(xBookmarks->getByName("row1_1"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + // the problem was that the start was after the H + CPPUNIT_ASSERT_EQUAL(OUString("Hello world"), xMark->getAnchor()->getString()); + } + { + uno::Reference xMark(xBookmarks->getByName("row1_2"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Hello world"), xMark->getAnchor()->getString()); + } + { + uno::Reference xMark(xBookmarks->getByName("row1_3"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(OUString("ello world"), xMark->getAnchor()->getString()); + } + { + uno::Reference xMark(xBookmarks->getByName("row1_4"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Hello world"), xMark->getAnchor()->getString()); + } + { + uno::Reference xMark(xBookmarks->getByName("row2_1"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Hello world"), xMark->getAnchor()->getString()); + } + { + uno::Reference xMark(xBookmarks->getByName("row2_1"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Hello world"), xMark->getAnchor()->getString()); + } + { + uno::Reference xMark(xBookmarks->getByName("row2_3"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(OUString("ello world"), xMark->getAnchor()->getString()); + } + { + uno::Reference xMark(xBookmarks->getByName("row2_4"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xMark.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Hello world"), xMark->getAnchor()->getString()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121374_sectionHF) +{ + loadAndReload("tdf121374_sectionHF.odt"); + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + uno::Reference xFooterText = getProperty< uno::Reference >(xPageStyle, "FooterText"); + CPPUNIT_ASSERT_EQUAL( OUString("footer"), xFooterText->getString() ); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Paragraphs", 6, getParagraphs() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 6, getPages() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121374_sectionHF2) +{ + loadAndReload("tdf121374_sectionHF2.doc"); + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + uno::Reference xHeaderText = getProperty< uno::Reference >(xPageStyle, "HeaderText"); + CPPUNIT_ASSERT( xHeaderText->getString().startsWith("virkamatka-anomus") ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121666_lostPage) +{ + loadAndSave("tdf121666_lostPage.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[2]/w:br"_ostr, "type"_ostr, "page"); + // The second page break is exported too. + // Before this fix, if a node had both section break and page break, then only the section break was exported. + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:br"_ostr, "type"_ostr, "page"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:sectPr/w:type"_ostr, "val"_ostr, "nextPage"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf140182_extraPagebreak, "tdf140182_extraPagebreak.docx") +{ + // Table, page break, section break should be only 2 pages + // 2 breaks would normally results in 3 pages, but page break + section break is a special case + // that is handled so to break only 1 page that result only 2 pages. + // Because of the table, a hack (m_bDummyParaAddedForTableInSection) is set for the entire section, + // that canceled the page break + section break special case handling, resulting 3 pages. + // The accompanying fix eliminates this cancellation. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121659_loseColumnBrNextToShape) +{ + loadAndSave("tdf121659_loseColumnBrNextToShape.docx"); + // The third paragraph contains a manual column break and a shape. + // The column break was moved into the shape during the first import + // (messing also the shape position), and eliminated during the second import, + // losing the 2-column text layout. As a workaround, split the paragraph + // moving the column break into the fourth paragraph instead of losing it. + saveAndReload("Office Open XML Text"); + bool bBreakOnPara3 = getProperty(getParagraph(3), "BreakType") == style::BreakType_COLUMN_BEFORE; + bool bBreakOnPara4 = getProperty(getParagraph(4), "BreakType") == style::BreakType_COLUMN_BEFORE; + CPPUNIT_ASSERT(bBreakOnPara3 || bBreakOnPara4); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf95848, "tdf95848.docx") +{ + OUString listId; + OUString listStyle; + { + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle); + CPPUNIT_ASSERT(listStyle.startsWith("WWNum")); + CPPUNIT_ASSERT(xPara->getPropertyValue("ListId") >>= listId); + CPPUNIT_ASSERT_EQUAL(OUString("1.1.1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(listStyle, getProperty(xPara, "NumberingStyleName")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + CPPUNIT_ASSERT_EQUAL(OUString("1.1.2"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + // different numbering style + OUString listStyle3; + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle3); + CPPUNIT_ASSERT(listStyle3.startsWith("WWNum")); + CPPUNIT_ASSERT(listStyle3 != listStyle); + // but same list + CPPUNIT_ASSERT_EQUAL(OUString("1.1.3"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf95848_2, "tdf95848_2.docx") +{ + OUString listId; + OUString listStyle; + { + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle); + CPPUNIT_ASSERT(listStyle.startsWith("WWNum")); + CPPUNIT_ASSERT(xPara->getPropertyValue("ListId") >>= listId); + CPPUNIT_ASSERT_EQUAL(OUString("1)"), getProperty(xPara, "ListLabelString")); + // check indent of list style + auto xLevels = getProperty>(xPara, "NumberingRules"); + uno::Sequence aLevel; + xLevels->getByIndex(0) >>= aLevel; // top level + sal_Int32 nIndent = std::find_if(std::cbegin(aLevel), std::cend(aLevel), [](const beans::PropertyValue& rValue) { return rValue.Name == "FirstLineIndent"; })->Value.get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-635), nIndent); + } + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + // different numbering style + OUString listStyle2; + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle2); + CPPUNIT_ASSERT(listStyle2.startsWith("WWNum")); + CPPUNIT_ASSERT(listStyle2 != listStyle); + // but same list + CPPUNIT_ASSERT_EQUAL(OUString("2)"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + // check indent of list style - override + auto xLevels = getProperty>(xPara, "NumberingRules"); + uno::Sequence aLevel; + xLevels->getByIndex(0) >>= aLevel; // top level + sal_Int32 nIndent = std::find_if(std::cbegin(aLevel), std::cend(aLevel), [](const beans::PropertyValue& rValue) { return rValue.Name == "FirstLineIndent"; })->Value.get(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(9366), nIndent); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + // different numbering style + OUString listStyle3; + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle3); + CPPUNIT_ASSERT(listStyle3.startsWith("WWNum")); + CPPUNIT_ASSERT(listStyle3 != listStyle); + // and different list + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT(listId != getProperty(xPara, "ListId")); + } + { + // continue the first list + uno::Reference xPara(getParagraph(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(listStyle, getProperty(xPara, "NumberingStyleName")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + CPPUNIT_ASSERT_EQUAL(OUString("3)"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(listStyle, getProperty(xPara, "NumberingStyleName")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + CPPUNIT_ASSERT_EQUAL(OUString("4)"), getProperty(xPara, "ListLabelString")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf108496, "tdf108496.docx") +{ + OUString listId; + OUString listStyle; + // Lists with override + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle); + CPPUNIT_ASSERT(listStyle.startsWith("WWNum")); + CPPUNIT_ASSERT(xPara->getPropertyValue("ListId") >>= listId); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(listStyle, getProperty(xPara, "NumberingStyleName")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + // different numbering style + OUString listStyle2; + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle2); + CPPUNIT_ASSERT(listStyle2.startsWith("WWNum")); + CPPUNIT_ASSERT(listStyle2 != listStyle); + // restarted numeration due to override + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + } + { + uno::Reference xPara(getParagraph(6), uno::UNO_QUERY); + // different numbering style + OUString listStyle2; + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle2); + CPPUNIT_ASSERT(listStyle2.startsWith("WWNum")); + // restarted numeration due to override + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + } + + // Lists without override + { + uno::Reference xPara(getParagraph(8), uno::UNO_QUERY); + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle); + CPPUNIT_ASSERT(listStyle.startsWith("WWNum")); + CPPUNIT_ASSERT(xPara->getPropertyValue("ListId") >>= listId); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(9), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(listStyle, getProperty(xPara, "NumberingStyleName")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(11), uno::UNO_QUERY); + // different numbering style + OUString listStyle2; + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle2); + CPPUNIT_ASSERT(listStyle2.startsWith("WWNum")); + CPPUNIT_ASSERT(listStyle2 != listStyle); + // numeration is continued + CPPUNIT_ASSERT_EQUAL(OUString("3"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + } + { + uno::Reference xPara(getParagraph(12), uno::UNO_QUERY); + // different numbering style + OUString listStyle2; + CPPUNIT_ASSERT(xPara->getPropertyValue("NumberingStyleName") >>= listStyle2); + CPPUNIT_ASSERT(listStyle2.startsWith("WWNum")); + // numeration is continued + CPPUNIT_ASSERT_EQUAL(OUString("4"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(listId, getProperty(xPara, "ListId")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf126723, "tdf126723.docx") +{ + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(getParagraph(2), "ParaLeftMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testendingSectionProps, "endingSectionProps.docx") +{ + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + uno::Reference xHeaderText = getProperty< uno::Reference >(xPageStyle, "HeaderText"); + CPPUNIT_ASSERT_EQUAL( OUString("General header"), xHeaderText->getString()); + + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("# of paragraphs", 2, getParagraphs()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section is RightToLeft", text::WritingMode2::RL_TB, getProperty(xSect, "WritingMode")); + //regression: tdf124637 + //CPPUNIT_ASSERT_EQUAL_MESSAGE("Section Left Margin", sal_Int32(2540), getProperty(xSect, "SectionLeftMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTbrlTextbox, "tbrl-textbox.docx") +{ + uno::Reference xPropertySet(getShape(1), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with 'Expected: -90; + // Actual: 0', i.e. tbRl writing direction was imported as lrTb. + // Note: Implementation was changed to use WritingMode property instead of TextPreRotateAngle. + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL90, + getProperty(xPropertySet, "WritingMode")); +} + +DECLARE_OOXMLEXPORT_TEST(testBtlrShape, "btlr-textbox.docx") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + const auto& rFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT_EQUAL(static_cast(2), rFormats.size()); + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(RES_DRAWFRMFMT), rFormats[0]->Which()); + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(RES_FLYFRMFMT), rFormats[1]->Which()); + // Without the accompanying fix in place, this test would have failed with 'Expected: 5, Actual: + // 4', i.e. the textbox inherited its writing direction instead of having an explicit btlr + // value. + CPPUNIT_ASSERT_EQUAL(SvxFrameDirection::Vertical_LR_BT, + rFormats[1]->GetAttrSet().GetFrameDir().GetValue()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127316_autoEscapement) +{ + loadAndReload("tdf127316_autoEscapement.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // This should be roughly .8*35% of the ORIGINAL(non-reduced) size. However, during export the + // proportional height has to be changed into direct formatting, which then changes the relative percent. + // In this case, a 24pt font, proportional at 65% becomes roughly a 16pt font. + // Thus an escapement of 28% (6.72pt) becomes roughly 42% for the 16pt font. + uno::Reference xPara = getParagraph(1); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1), "CharEscapement"), 0); + CPPUNIT_ASSERT_DOUBLES_EQUAL(42.f, getProperty(getRun(xPara, 2), "CharEscapement"), 1); + + // Subscripts are different. Automatic escapement SHOULD BE limited by the font bottom line(?) + // and so the calculations ought to be different. There is room for a lot of export improvement here. + xPara.set(getParagraph(2)); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1, "Normal text "), "CharEscapement"), 0); + // Negative escapements (subscripts) were decreasing by 1% every round-trip due to bad manual rounding. + // This should be roughly .2*35% of the ORIGINAL (non-reduced) size. However, during export the + // proportional height has to be changed into direct formatting, which then changes the relative percent. + // In this case, a 24pt font, proportional at 65% becomes roughly a 16pt font. + // Thus an escapement of 7% (1.68pt) becomes roughly 10.5% for the 16pt font. + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Subscript", -10.f, getProperty(getRun(xPara, 2), "CharEscapement"), 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf99602_subscript_charStyleSize, "tdf99602_subscript_charStyleSize.docx") +{ + uno::Reference xPara = getParagraph(1); + // The word "Base" should not be subscripted. + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1, "Base"), "CharEscapement"), 0); + // The word "Subscript" should be 48pt, subscripted by 25% (12pt). + CPPUNIT_ASSERT_DOUBLES_EQUAL( -25.f, getProperty(getRun(xPara, 2, "Subscript"), "CharEscapement"), 0); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf99602_charStyleSubscript, "tdf99602_charStyleSubscript.docx") +{ + uno::Reference xPara = getParagraph(1); + // The word "Base" should not be subscripted. + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1, "Base"), "CharEscapement"), 0); + // The word "Subscript" should be 48pt, automatically subscripted, and automatic proportioned. + CPPUNIT_ASSERT_EQUAL( sal_Int16(DFLT_ESC_AUTO_SUB), getProperty(getRun(xPara, 2, "Subscript"), "CharEscapement") ); + CPPUNIT_ASSERT_EQUAL( sal_Int16(DFLT_ESC_PROP), getProperty(getRun(xPara, 2), "CharEscapementHeight") ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf99602_charStyleSubscript2) +{ + loadAndReload("tdf99602_charStyleSubscript2.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // *_In styles_*, don't let the proportionality/escapement affect the fontsize - otherwise it starts doubling up, + // so instead just throw away the values and use the default settings instead - meaning fontsize is unaffected. + // subscript custom: Proportional size is 80%, lower by 25%. + uno::Reference xStyle(getStyles("CharacterStyles")->getByName("subscript custom"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("CharStyle has 12pt font size", 12.f, getProperty(xStyle, "CharHeight")); + // subscript larger font: Proportional size is 80%, lowered by DFLT_ESC_AUTO_SUB + xStyle.set(getStyles("CharacterStyles")->getByName("subscript larger font"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Auto CharStyle has 12pt font size", 12.f, getProperty(xStyle, "CharHeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf124637_sectionMargin, "tdf124637_sectionMargin.docx") +{ + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + // sections 0 and 1 must be related to footnotes... + uno::Reference xSect(xSections->getByIndex(2), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section Left Margin", sal_Int32(0), getProperty(xSect, "SectionLeftMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123636_newlinePageBreak, "tdf123636_newlinePageBreak.docx") +{ + //MS Compatibility flag: SplitPgBreakAndParaMark + //special case: split first empty paragraph in a section. + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Paragraphs", 2, getParagraphs() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 2, getPages() ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123636_newlinePageBreak2, "tdf123636_newlinePageBreak2.docx") +{ + //WITHOUT SplitPgBreakAndParaMark: a following anchored shape should force a page break + //CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Paragraphs", 2, getParagraphs() ); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(getParagraph(2, ""), "NumberingStyleName")); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 2, getPages() ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123636_newlinePageBreak3, "tdf123636_newlinePageBreak3.docx") +{ + //MS Compatibility flag: SplitPgBreakAndParaMark + //proof case: split any non-empty paragraphs, not just the first paragraph of a section. + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Paragraphs", 5, getParagraphs() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 2, getPages() ); + + xmlDocUniquePtr pDump = parseLayoutDump(); + assertXPath(pDump, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwParaPortion[1]"_ostr, "portion"_ostr, "Last line on page 1"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123636_newlinePageBreak4, "tdf123636_newlinePageBreak4.docx") +{ + //MS Compatibility flag: SplitPgBreakAndParaMark + //special case: an empty paragraph doesn't split (except if first paragraph). + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Paragraphs", 3, getParagraphs() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 2, getPages() ); + + xmlDocUniquePtr pDump = parseLayoutDump(); + assertXPath(pDump, "/root/page[2]/body/txt[1]/SwParaPortion"_ostr, 0); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf118947_tableStyle, "tdf118947_tableStyle.docx") +{ + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Table grid settings set line-spacing to 250% instead of single-spacing, which is set as a document default."), xPara->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("TextBody has 10pt font size", 11.f, getProperty(xPara, "CharHeight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("TextBody has 1pt space below paragraph", sal_Int32(35), getProperty(xPara, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table has 10pt space above paragraph", sal_Int32(353), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table style sets 0 right margin", sal_Int32(0), getProperty(xPara, "ParaRightMargin")); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("TextBody has 1.07 line-spacing", sal_Int16(107), getProperty(xPara, "ParaLineSpacing").Height, 1); + // table-style based paragraph background color + CPPUNIT_ASSERT_EQUAL_MESSAGE("Missing paragraph background color in cell A1", Color(0xCCFFCC), getProperty(xPara, "ParaBackColor")); + + // This cell is affected by compatSetting overrideTableStyleFontSizeAndJustification=0 (the default value) + xCell.set(xTable->getCellByName("A2"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum = xParaEnumAccess->createEnumeration(); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Notice that this is 8pt font, right aligned in compatibility mode."), xPara->getString()); + // Even though not specified, Table-Style distributes the properties in DocDefault. DocDefault fontsize is 8pt. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Compat mode has 8pt font size", 8.f, getProperty(getRun(xPara,1), "CharHeight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Normal has 0pt space below paragraph", sal_Int32(0), getProperty(xPara, "ParaBottomMargin")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table sets 10pt space above paragraph", sal_Int32(353), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table style sets 0 right margin", sal_Int32(0), getProperty(xPara, "ParaRightMargin")); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Table sets 2.5 line-spacing", sal_Int16(250), getProperty(xPara, "ParaLineSpacing").Height, 1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Paragraph background color in cell A2", sal_Int32(-1), getProperty(xPara, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Compat mode overrides left adjust", style::ParagraphAdjust_RIGHT, + static_cast(getProperty(xPara, "ParaAdjust"))); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf118947_tableStyle2, "tdf118947_tableStyle2.docx") +{ + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + // This cell is affected by compatSetting overrideTableStyleFontSizeAndJustification=1 (no goofy exception) + uno::Reference xCell(xTable->getCellByName("A2"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(OUString("Notice that this is 12pt font, left aligned in non-compatibility mode."), xPara->getString()); + // Even though not specified, Table-Style tries to distribute the properties in DocDefault. DocDefault fontsize is 8pt. + // However, this is overridden by the default style's specified fontsize of 12 and left justify. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Non-Compat mode has 12pt font size", 12.f, getProperty(getRun(xPara,1), "CharHeight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Non-Compat mode keeps the style's left adjust", style::ParagraphAdjust_LEFT, + static_cast(getProperty(xPara, "ParaAdjust"))); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf123912_protectedForm) +{ + loadAndReload("tdf123912_protectedForm.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Compatibility: Protect form", true, + pDoc->getIDocumentSettingAccess().get( DocumentSettingId::PROTECT_FORM ) ); + + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY); + if ( xSect.is() ) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", false, getProperty(xSect, "IsProtected")); +} + +DECLARE_OOXMLEXPORT_TEST(tdf124600b, "tdf124600b.docx") +{ + // was lost on roundtrip, we always wrote "1" on export. + bool bAllowOverlap1 = getProperty(getShape(1), "AllowOverlap"); + CPPUNIT_ASSERT(!bAllowOverlap1); + bool bAllowOverlap2 = getProperty(getShape(2), "AllowOverlap"); + CPPUNIT_ASSERT(!bAllowOverlap2); +} + +CPPUNIT_TEST_FIXTURE(Test, testDateControl) +{ + loadAndReload("empty-date-control.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Check that we exported the empty date control correctly + // Date form field is converted to date content control. + + uno::Reference xTextPortion(getRun(getParagraph(1), 1), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + bool bDate{}; + xContentControlProps->getPropertyValue("Date") >>= bDate; + CPPUNIT_ASSERT(bDate); + + OUString sDateFormat; + xContentControlProps->getPropertyValue("DateFormat") >>= sDateFormat; + + OUString sLang; + xContentControlProps->getPropertyValue("DateLanguage") >>= sLang; + + OUString sCurrentDate; + xContentControlProps->getPropertyValue("CurrentDate") >>= sCurrentDate; + + CPPUNIT_ASSERT_EQUAL(OUString("dd/MM/yyyy"), sDateFormat); + CPPUNIT_ASSERT_EQUAL(OUString("en-US"), sLang); + CPPUNIT_ASSERT_EQUAL(OUString(""), sCurrentDate); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121867) +{ + loadAndReload("tdf121867.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwEditShell* pEditShell = pTextDoc->GetDocShell()->GetEditShell(); + // Without the accompanying fix in place, this test would have failed with + // 'Expected: 3; Actual : 0', i.e. page width zoom was lost on export. + CPPUNIT_ASSERT_EQUAL(SvxZoomType::PAGEWIDTH, pEditShell->GetViewOptions()->GetZoomType()); +} + +DECLARE_OOXMLEXPORT_TEST(testParaAdjustDistribute, "para-adjust-distribute.docx") +{ + // Without the accompanying fix in place, this test would have failed with + // 'Expected: 2; Actual : 0', i.e. the first paragraph's ParaAdjust was + // left, not block. + CPPUNIT_ASSERT_EQUAL( + style::ParagraphAdjust_BLOCK, + static_cast(getProperty(getParagraph(1), "ParaAdjust"))); + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_BLOCK, + static_cast( + getProperty(getParagraph(1), "ParaLastLineAdjust"))); + + CPPUNIT_ASSERT_EQUAL( + style::ParagraphAdjust_BLOCK, + static_cast(getProperty(getParagraph(2), "ParaAdjust"))); + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_LEFT, + static_cast( + getProperty(getParagraph(2), "ParaLastLineAdjust"))); +} + +CPPUNIT_TEST_FIXTURE(Test, testInputListExport) +{ + loadAndReload("tdf122186_input_list.odt"); + if (!isExported()) // importing the ODT, an input field + { + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.textfield.DropDown")); + } + else // importing the DOCX, a content control + { + uno::Reference xTextPortion(getRun(getParagraph(1), 1), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + uno::Sequence aListItems; + xContentControlProps->getPropertyValue("ListItems") >>= aListItems; + CPPUNIT_ASSERT_EQUAL(static_cast(3), aListItems.getLength()); + comphelper::SequenceAsHashMap aMap0(aListItems[0]); + CPPUNIT_ASSERT_EQUAL(OUString("1"), aMap0["Value"].get()); + comphelper::SequenceAsHashMap aMap1(aListItems[1]); + CPPUNIT_ASSERT_EQUAL(OUString("2"), aMap1["Value"].get()); + comphelper::SequenceAsHashMap aMap2(aListItems[2]); + CPPUNIT_ASSERT_EQUAL(OUString("3"), aMap2["Value"].get()); + uno::Reference xContentEnumAccess(xContentControl, uno::UNO_QUERY); + uno::Reference xContentEnum = xContentEnumAccess->createEnumeration(); + uno::Reference xContent(xContentEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xContent->getString()); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123435, "tdf123435.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // Without the fix in place, it would have failed with + // - Expected: 2 + // - Actual : 1 + CPPUNIT_ASSERT_EQUAL(2, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf116371) +{ + loadAndReload("tdf116371.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Make sure the rotation is exported correctly, and size not distorted + auto xShape(getShape(1)); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4700.0, getProperty(xShape, "RotateAngle"), 10); + auto frameRect = getProperty(xShape, "FrameRect"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(24063), frameRect.Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(24179), frameRect.Width); +} + +CPPUNIT_TEST_FIXTURE(Test, testFrameSizeExport) +{ + loadAndSave("floating-tables-anchor.docx"); + // Make sure the table width is 4000 + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tblPr/w:tblW"_ostr, "w"_ostr, "4000"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf119201, "tdf119201.docx") +{ + // Visibility of shapes wasn't imported/exported, for now base printable property on that, too + auto xShape(getShape(1)); + CPPUNIT_ASSERT_MESSAGE("First shape should be visible.", getProperty(xShape, "Visible")); + CPPUNIT_ASSERT_MESSAGE("First shape should be printable.", getProperty(xShape, "Printable")); + xShape = getShapeByName(u"Rectangle 1"); + CPPUNIT_ASSERT_MESSAGE("Second shape should not be visible.", !getProperty(xShape, "Visible")); + CPPUNIT_ASSERT_MESSAGE("Second shape should not be printable.", !getProperty(xShape, "Printable")); + xShape = getShapeByName(u"Oval 2"); + CPPUNIT_ASSERT_MESSAGE("Third shape should be visible.", getProperty(xShape, "Visible")); + CPPUNIT_ASSERT_MESSAGE("Third shape should be printable.", getProperty(xShape, "Printable")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf124594, "tdf124594.docx") +{ + xmlDocUniquePtr pDump = parseLayoutDump(); + // Without the accompanying fix in place, this test would have failed, as the portion text was + // only "Er horte leise Schritte hinter", which means the 1st line of the 2nd paragraph was + // split into two by a Special portion, i.e. the top margin of the shape was too large. + assertXPath(pDump, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]"_ostr, "portion"_ostr, + "Er horte leise Schritte hinter sich. Das bedeutete nichts Gutes. Wer wu"); // ... until the bookmark. +} + +CPPUNIT_TEST_FIXTURE(Test, testTextInput) +{ + loadAndSave("textinput.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + + // test the exported DOCX + + // no hint, empty + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[3]/w:instrText"_ostr, " FILLIN \"\""); + assertXPathChildren(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[5]"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[5]/w:rPr"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[6]/w:fldChar"_ostr, "fldCharType"_ostr, "end"); + + // no hint, content + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[3]/w:instrText"_ostr, " FILLIN \"\""); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[5]/w:t"_ostr, "content without hint"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[6]/w:fldChar"_ostr, "fldCharType"_ostr, "end"); + + // hint, empty + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[3]/w:instrText"_ostr, " FILLIN \"hint empty\""); + assertXPathChildren(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[5]"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[5]/w:rPr"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[6]/w:fldChar"_ostr, "fldCharType"_ostr, "end"); + + // hint, content + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[4]/w:r[3]/w:instrText"_ostr, " FILLIN \"hint content\""); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[4]/w:r[5]/w:t"_ostr, "content with hint"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:r[6]/w:fldChar"_ostr, "fldCharType"_ostr, "end"); + + // test the imported DOCX + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + int nElements = 0; + + do + { + uno::Any aField = xFields->nextElement(); + uno::Reference xServiceInfo(aField, uno::UNO_QUERY); + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.textfield.Input")); + uno::Reference xPropertySet(aField, uno::UNO_QUERY); + uno::Reference xText(aField, uno::UNO_QUERY); + + // why is the enumeration not in the same order then the fields in the document? + // it seems to be stable and the navigation in the GUI is actually correct. + OUString sContent, sHint; + switch (nElements) + { + case 1: + sContent = "content with hint"; + sHint = "hint content"; + break; + case 2: + sHint = "hint empty"; + break; + case 3: + sContent = "content without hint"; + break; + } + CPPUNIT_ASSERT_EQUAL(uno::Any(sContent), xPropertySet->getPropertyValue("Content")); + CPPUNIT_ASSERT_EQUAL(sContent, xText->getAnchor()->getString()); + CPPUNIT_ASSERT_EQUAL(uno::Any(sHint), xPropertySet->getPropertyValue("Hint")); + nElements++; + } + while (xFields->hasMoreElements()); + CPPUNIT_ASSERT_EQUAL(4, nElements); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123460, "tdf123460.docx") +{ + // check paragraph mark deletion at terminating moveFrom + CPPUNIT_ASSERT(getParagraph( 2 )->getString().startsWith("Nunc")); + uno::Reference xRunEnumAccess(getParagraph( 2 ), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + uno::Reference xRun(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( OUString( "" ), xRun->getString()); + xRun.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT(hasProperty(xRun, "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Delete"),getProperty(xRun, "RedlineType")); + xRun.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xRun->getString().endsWith("tellus.")); + xRun.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT(hasProperty(xRun, "Bookmark")); + + // The paragraph marker's formatting. + xRun.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"),getProperty(xRun, "TextPortionType")); + CPPUNIT_ASSERT(xRun->getString().isEmpty()); + + // deleted paragraph mark at the end of the second paragraph + if (isExported()) + { + // there is no run after the MoveBookmark + CPPUNIT_ASSERT(!xRunEnum->hasMoreElements()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf146140) +{ + loadAndSave("tdf123460.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + // This was 1 (put end of paragraph of the previous moveFrom into a w:del, + // resulting double deletions at the same position, which is an + // ODT back-compatibility issue described in tdf#107292) + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:del"_ostr, 0); + // This was 0 + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:moveFrom"_ostr, 1); +} + +//tdf#125298: fix charlimit restrictions in bookmarknames and field references if they contain non-ascii characters +CPPUNIT_TEST_FIXTURE(Test, testTdf125298) +{ + loadAndSave("tdf125298_crossreflink_nonascii_charlimit.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // check whether test file keeps non-ascii values or not + OUString bookmarkName1 = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:bookmarkStart[1]"_ostr, "name"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString::fromUtf8("\u00e1rv\u00edzt\u0171r\u0151_t\u00fck\u00f6rf\u00far\u00f3g\u00e9p"), bookmarkName1); + + OUString bookmarkName2 = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:bookmarkStart[1]"_ostr, "name"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString::fromUtf8("\u00e91\u00e12\u01713\u01514\u00fa5\u00f66\u00fc7\u00f38\u00ed9"), bookmarkName2); + OUString fieldName1 = getXPathContent(pXmlDoc, "/w:document/w:body/w:p[5]/w:r[2]/w:instrText[1]"_ostr); + OUString expectedFieldName1 = " REF " + bookmarkName1 + " \\h "; + CPPUNIT_ASSERT_EQUAL(expectedFieldName1, fieldName1); + OUString fieldName2 = getXPathContent(pXmlDoc, "/w:document/w:body/w:p[7]/w:r[2]/w:instrText[1]"_ostr); + OUString expectedFieldName2 = " REF " + bookmarkName2 + " \\h "; + CPPUNIT_ASSERT_EQUAL(expectedFieldName2, fieldName2); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf121784, "tdf121784.docx") +{ + // check tracked insertion of footnotes + CPPUNIT_ASSERT_EQUAL( OUString( "Text1" ), getParagraph( 1 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "" ), getRun( getParagraph( 1 ), 2 )->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(1), 2), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Insert"),getProperty(getRun(getParagraph(1), 2), "RedlineType")); + CPPUNIT_ASSERT_EQUAL( OUString( "1" ), getRun( getParagraph( 1 ), 3 )->getString()); + + // check tracked insertion of endnotes + CPPUNIT_ASSERT_EQUAL( OUString( "texti" ), getParagraph( 2 )->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "" ), getRun( getParagraph( 2 ), 2 )->getString()); + CPPUNIT_ASSERT(hasProperty(getRun(getParagraph(2), 2), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Insert"),getProperty(getRun(getParagraph(2), 2), "RedlineType")); + CPPUNIT_ASSERT_EQUAL( OUString( "i" ), getRun( getParagraph( 2 ), 3 )->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testTbrlFrameVml, "tbrl-frame-vml.docx") +{ + uno::Reference xTextFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xTextFrame.is()); + + if (isExported()) + { + // DML import: creates a TextBox, eaVert read back as TB_RL in TextWritingMode + + auto eMode = getProperty(xTextFrame, "TextWritingMode"); + CPPUNIT_ASSERT_EQUAL(text::WritingMode::WritingMode_TB_RL, eMode); + } + else + { + // VML import: creates a TextFrame. + + auto nActual = getProperty(xTextFrame, "WritingMode"); + // Without the accompanying fix in place, this test would have failed with 'Expected: 2; Actual: + // 4', i.e. writing direction was inherited from page, instead of explicit tbrl. + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL, nActual); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf119037) +{ + loadAndSave("tdf119037.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "single"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "single"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "single"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "single"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "dotted"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "dotted"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "dotted"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "dotted"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "dashed"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "dashed"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "dashed"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "dashed"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "dashSmallGap"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "dashSmallGap"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "dashSmallGap"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[7]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "dashSmallGap"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "dotDash"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "dotDash"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "dotDash"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "dotDash"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "dotDotDash"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "dotDotDash"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "dotDotDash"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[11]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "dotDotDash"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "double"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "double"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[17]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "thinThickSmallGap"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[17]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "thinThickSmallGap"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[17]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "thinThickSmallGap"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[17]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "thinThickSmallGap"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[19]/w:pPr/w:pBdr/w:top"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[19]/w:pPr/w:pBdr/w:left"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[19]/w:pPr/w:pBdr/w:right"_ostr, "val"_ostr, "double"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[19]/w:pPr/w:pBdr/w:bottom"_ostr, "val"_ostr, "double"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125657) +{ + loadAndSave("tdf125657.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + auto checkAttrIsInt = [&](const OString& sAttrName) { + OUString sAttr = getXPath(pXmlDoc, + "/w:document/w:body/w:p[1]/w:r[1]/w:drawing/wp:inline/a:graphic/" + "a:graphicData/pic:pic/pic:blipFill/a:srcRect"_ostr, + sAttrName); + OString sAssertMsg("Attribute " + sAttrName + " value " + sAttr.toUtf8() + + " is not a valid integer"); + CPPUNIT_ASSERT_MESSAGE(sAssertMsg.getStr(), !sAttr.isEmpty()); + // Only decimal characters allowed, optionally prepended with '-'; no '.' + CPPUNIT_ASSERT_MESSAGE(sAssertMsg.getStr(), + sAttr[0] == '-' || (sAttr[0] >= '0' && sAttr[0] <= '9')); + for (sal_Int32 i = 1; i < sAttr.getLength(); ++i) { + CPPUNIT_ASSERT_MESSAGE(sAssertMsg.getStr(), sAttr[i] >= '0'); + CPPUNIT_ASSERT_MESSAGE(sAssertMsg.getStr(), sAttr[i] <= '9'); + } + }; + // check that we export all coordinates of srcRect as integers + checkAttrIsInt("l"_ostr); + checkAttrIsInt("t"_ostr); + checkAttrIsInt("r"_ostr); + checkAttrIsInt("b"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf125324, "tdf125324.docx") +{ + discardDumpedLayout(); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page/body/txt[2]/anchored/fly/tab/infos/bounds"_ostr, "top"_ostr, "4193"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf78657) +{ + loadAndSave("tdf78657_picture_hyperlink.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + xmlDocUniquePtr pXmlRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:drawing/wp:inline/wp:docPr/a:hlinkClick"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:nvPicPr/pic:cNvPr/a:hlinkClick"_ostr, 1); + assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Target='http://www.google.com']"_ostr, "TargetMode"_ostr, "External"); +} + +CPPUNIT_TEST_FIXTURE(Test, testBtlrFrame) +{ + loadAndReload("btlr-frame.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPropertySet(getShape(1), uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with 'Expected: + // -270; Actual: 0', i.e. the writing direction of the frame was lost. + // Note: Implementation was changed to use WritingMode property instead of TextPreRotateAngle. + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, + getProperty(xPropertySet, "WritingMode")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125518) +{ + loadAndSave("tdf125518.odt"); + CPPUNIT_ASSERT_EQUAL(4, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + + // First diagram is anchored + OUString anchorName = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[2]/w:drawing/wp:anchor/wp:docPr"_ostr, "name"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("Object1"), anchorName); + + // Second diagram has anchor + anchorName = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[1]/w:drawing/wp:anchor/wp:docPr"_ostr, "name"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("Objekt1"), anchorName); + + // Third diagram has no anchor + anchorName = getXPath(pXmlDoc, "/w:document/w:body/w:p[12]/w:r[2]/w:drawing/wp:inline/wp:docPr"_ostr, "name"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("Object2"), anchorName); + + // 4th diagram has anchor too + anchorName = getXPath(pXmlDoc, "/w:document/w:body/w:p[14]/w:r[3]/w:drawing/wp:anchor/wp:docPr"_ostr, "name"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("Object3"), anchorName); +} + +DECLARE_OOXMLEXPORT_TEST(testImageCommentAtChar, "image-comment-at-char.docx") +{ + uno::Reference xPara = getParagraph(1); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + getProperty(getRun(xPara, 1), "TextPortionType")); + // Without the accompanying fix in place, this test would have failed with 'Expected: + // Annotation; Actual: Frame', i.e. the comment start before the image was lost. + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), + getProperty(getRun(xPara, 2), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), + getProperty(getRun(xPara, 3), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), + getProperty(getRun(xPara, 4), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + getProperty(getRun(xPara, 5), "TextPortionType")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf131594) +{ + loadAndSave("tdf131594.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // lnNumType should not be exported if w:countBy="0" + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:lnNumType"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121663) +{ + loadAndSave("tdf121663.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // auto distance of line numbering is 0.5 cm + assertXPath(pXmlDoc, "//w:lnNumType"_ostr, "distance"_ostr, "283"); +} + +DECLARE_OOXMLEXPORT_TEST(testInvalidDateFormField, "invalid_date_form_field.docx") +{ + + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + uno::Reference xPortions = xParagraph->createEnumeration(); + + int nIndex = 0; + while (xPortions->hasMoreElements()) + { + uno::Reference xTextPortion(xPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + if (aPortionType != "ContentControl") + { + continue; + } + + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + bool bDate{}; + xContentControlProps->getPropertyValue("Date") >>= bDate; + CPPUNIT_ASSERT(bDate); + + // Check date content control's parameters. + OUString sDateFormat; + xContentControlProps->getPropertyValue("DateFormat") >>= sDateFormat; + + OUString sLang; + xContentControlProps->getPropertyValue("DateLanguage") >>= sLang; + + OUString sCurrentDate; + xContentControlProps->getPropertyValue("CurrentDate") >>= sCurrentDate; + + // The first one has invalid date format (invalid = LO can't parse it) + if(nIndex == 0) + { + + CPPUNIT_ASSERT_EQUAL(OUString("YYYY.MM.DDT00:00:00Z"), sDateFormat); + CPPUNIT_ASSERT_EQUAL(OUString("en-US"), sLang); + CPPUNIT_ASSERT_EQUAL(OUString(""), sCurrentDate); + + } + else if (nIndex == 1) // The second has wrong date + { + CPPUNIT_ASSERT_EQUAL(OUString("MM/DD/YY"), sDateFormat); + CPPUNIT_ASSERT_EQUAL(OUString("en-US"), sLang); + CPPUNIT_ASSERT_EQUAL(OUString("2019.06.34T00:00:00Z"), sCurrentDate); + + } + else // The third one has wrong local + { + CPPUNIT_ASSERT_EQUAL(OUString("[NatNum12 MMMM=abbreviation]YYYY\". \"MMMM D."), sDateFormat); + CPPUNIT_ASSERT_EQUAL(OUString("xxxx"), sLang); + CPPUNIT_ASSERT_EQUAL(OUString("2019.06.11T00:00:00Z"), sCurrentDate); + + } + ++nIndex; + } + CPPUNIT_ASSERT_EQUAL(int(3), nIndex); +} + +DECLARE_OOXMLEXPORT_TEST(tdf127085, "tdf127085.docx") +{ + // Fill transparency was lost during export + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(50), getProperty(xShape, "FillTransparence")); +} + +DECLARE_OOXMLEXPORT_TEST(tdf119809, "tdf119809.docx") +{ + // Combobox without an item list lost during import + if (getShapes() > 0) + { + uno::Reference xControlShape(getShape(1), uno::UNO_QUERY); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + uno::Reference xServiceInfo(xPropertySet, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService("com.sun.star.form.component.ComboBox"))); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty< uno::Sequence >(xPropertySet, "StringItemList").getLength()); + } + else + { + // DropDown was imported as content control + // First run: bookmark + uno::Reference xTextPortion(getRun(getParagraph(1), 2), uno::UNO_QUERY); + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + uno::Sequence aListItems; + xContentControlProps->getPropertyValue("ListItems") >>= aListItems; + CPPUNIT_ASSERT_EQUAL(static_cast(0), aListItems.getLength()); + } +} + +DECLARE_OOXMLEXPORT_TEST(tdf118169, "tdf118169.docx") +{ + // Unicode characters were converted to question marks. + uno::Reference xControlShape(getShape(1), uno::UNO_QUERY); + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + uno::Reference xServiceInfo(xPropertySet, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService("com.sun.star.form.component.CheckBox"))); + CPPUNIT_ASSERT_EQUAL(u"őőőőőőőőőőőűűűű"_ustr, getProperty(xPropertySet, "Label")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127116) +{ + loadAndSave("tdf127116.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + + OUString bookmarkName = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:bookmarkStart"_ostr, "name"_ostr); + OUString anchor = getXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:hyperlink"_ostr, "anchor"_ostr); + CPPUNIT_ASSERT_EQUAL(anchor, bookmarkName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127339) +{ + loadAndSave("tdf127339.docx"); + xmlDocUniquePtr pXmlRels = parseExport("word/_rels/document.xml.rels"); + + assertXPathNoAttribute(pXmlRels, "/rels:Relationships/rels:Relationship[@Target='#bookmark']"_ostr, "TargetMode"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127362) +{ + loadAndSave("tdf127362.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + xmlDocUniquePtr pXmlRels = parseExport("word/_rels/document.xml.rels"); + + OUString bookmarkName = "#" + getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:bookmarkStart"_ostr, "name"_ostr); + OUString anchor = getXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='rId3']"_ostr, "Target"_ostr); + CPPUNIT_ASSERT_EQUAL(anchor, bookmarkName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127605) +{ + loadAndSave("tdf127605.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + OUString bookmarkName = getXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:bookmarkStart"_ostr, "name"_ostr); + OUString anchor = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:hyperlink"_ostr, "anchor"_ostr); + CPPUNIT_ASSERT_EQUAL(anchor, bookmarkName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127732) +{ + loadAndSave("internal_hyperlink_frame.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + OUString bookmarkName = getXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/mc:AlternateContent/mc:Fallback/w:pict/v:rect/v:textbox/w:txbxContent/w:p/w:bookmarkStart"_ostr, "name"_ostr); + OUString anchor = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:hyperlink"_ostr, "anchor"_ostr); + CPPUNIT_ASSERT_EQUAL(anchor, bookmarkName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127733) +{ + loadAndSave("internal_hyperlink_ole.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + + OUString bookmarkName = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:bookmarkStart"_ostr, "name"_ostr); + OUString anchor = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:hyperlink"_ostr, "anchor"_ostr); + CPPUNIT_ASSERT_EQUAL(anchor, bookmarkName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127734) +{ + loadAndSave("internal_hyperlink_region.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + OUString bookmarkName = getXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:bookmarkStart"_ostr, "name"_ostr); + OUString anchor = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:hyperlink"_ostr, "anchor"_ostr); + CPPUNIT_ASSERT_EQUAL(anchor, bookmarkName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127735) +{ + loadAndSave("internal_hyperlink_table.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + OUString bookmarkName = getXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:p/w:bookmarkStart"_ostr, "name"_ostr); + OUString anchor = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:hyperlink"_ostr, "anchor"_ostr); + CPPUNIT_ASSERT_EQUAL(anchor, bookmarkName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123628) +{ + loadAndSave("tdf123628.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:hyperlink/w:r/w:rPr/w:rStyle"_ostr, "val"_ostr, "Hyperlink"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Hyperlink']/w:name"_ostr, "val"_ostr, "Hyperlink"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf127741, "tdf127741.docx") +{ + uno::Reference xPara = getParagraph(1); + uno::Reference xRun(getRun(xPara,1), uno::UNO_QUERY); + OUString unVisitedStyleName = getProperty(xRun, "UnvisitedCharStyleName"); + CPPUNIT_ASSERT(unVisitedStyleName.equalsIgnoreAsciiCase("Internet Link")); + OUString visitedStyleName = getProperty(xRun, "VisitedCharStyleName"); + CPPUNIT_ASSERT(visitedStyleName.equalsIgnoreAsciiCase("Visited Internet Link")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142693_hugePaperSizeImport) +{ + loadAndSave("tdf142693_hugePaperSizeImport.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgSz"_ostr, "w"_ostr, "90369"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgSz"_ostr, "h"_ostr, "104372"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127925) +{ + loadAndSave("tdf127925.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='FollowedHyperlink']/w:name"_ostr, "val"_ostr, "FollowedHyperlink"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127579) +{ + loadAndSave("tdf127579.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:hyperlink/w:r/w:rPr/w:rStyle"_ostr, "val"_ostr, "Hyperlink"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128304) +{ + loadAndReload("tdf128304.odt"); + CPPUNIT_ASSERT_EQUAL(4, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + css::text::WritingMode eMode; + uno::Reference xProps1(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xProps1->getPropertyValue("TextWritingMode") >>= eMode); + CPPUNIT_ASSERT_EQUAL(css::text::WritingMode::WritingMode_TB_RL, eMode); + + uno::Reference xProps2(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xProps2->getPropertyValue("TextWritingMode") >>= eMode); + CPPUNIT_ASSERT_EQUAL(css::text::WritingMode::WritingMode_TB_RL, eMode); + + uno::Reference xProps3(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT(xProps3->getPropertyValue("TextWritingMode") >>= eMode); + CPPUNIT_ASSERT_EQUAL(css::text::WritingMode::WritingMode_TB_RL, eMode); + + uno::Reference xProps4(getShape(4), uno::UNO_QUERY); + CPPUNIT_ASSERT(xProps4->getPropertyValue("TextWritingMode") >>= eMode); + CPPUNIT_ASSERT_EQUAL(css::text::WritingMode::WritingMode_TB_RL, eMode); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx new file mode 100644 index 0000000000..4b0fbdd137 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx @@ -0,0 +1,1610 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace com::sun::star; + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +DECLARE_OOXMLEXPORT_TEST(Tdf130907, "tdf130907.docx") +{ + uno::Reference xPara1 = getParagraph(2); + CPPUNIT_ASSERT(xPara1.is()); + uno::Reference xFormula1Props(xPara1, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFormula1Props.is()); + sal_Int16 nHOri1; + xFormula1Props->getPropertyValue("ParaAdjust") >>= nHOri1; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The alignment of the equation is not left!", + sal_Int16(style::ParagraphAdjust::ParagraphAdjust_LEFT), nHOri1); + + uno::Reference xPara2 = getParagraph(3); + CPPUNIT_ASSERT(xPara2.is()); + uno::Reference xFormula2Props(xPara2, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFormula2Props.is()); + sal_Int16 nHOri2; + xFormula2Props->getPropertyValue("ParaAdjust") >>= nHOri2; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The alignment of the equation is not center!", + sal_Int16(style::ParagraphAdjust::ParagraphAdjust_CENTER), nHOri2); + + uno::Reference xPara3 = getParagraph(5); + CPPUNIT_ASSERT(xPara3.is()); + uno::Reference xFormula3Props(xPara3, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFormula3Props.is()); + sal_Int16 nHOri3; + xFormula3Props->getPropertyValue("ParaAdjust") >>= nHOri3; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The alignment of the equation is not right!", + sal_Int16(style::ParagraphAdjust::ParagraphAdjust_RIGHT), nHOri3); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128197) +{ + createSwDoc("128197_compat14.docx"); + xmlDocUniquePtr pLayout14 = parseLayoutDump(); + sal_Int32 nHeight14 = getXPath(pLayout14, "//page[1]/body/txt[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + + createSwDoc("128197_compat15.docx"); + xmlDocUniquePtr pLayout15 = parseLayoutDump(); + sal_Int32 nHeight15 = getXPath(pLayout15, "//page[1]/body/txt[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + + // In compat mode=14 second line has size of the shape thus entire paragraph height is smaller + // So nHeight14 < nHeight15 + CPPUNIT_ASSERT_LESS(nHeight15, nHeight14); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135595_HFtableWrap) +{ + loadAndReload("tdf135595_HFtableWrap.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nRowHeight = getXPath(pXmlDoc, "//page[1]/header/tab/row/infos/bounds"_ostr, "height"_ostr).toInt32(); + // tdf#77794: always force bLayoutInCell from false to true for MSO2013+ + // The fly is supposed to be inside the cell. Before, height was 998. Now it is 2839. + CPPUNIT_ASSERT_MESSAGE("Image must be contained inside the table cell", nRowHeight > 2000); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135943_shapeWithText_L0c15, + "tdf135943_shapeWithText_LayoutInCell0_compat15.docx") +{ + // With compat15, layoutinCell ought to be ignored/forced to true. + // HOWEVER, currently only the shape is correctly placed, while its text is un-synced separately. + // So to prevent this ugly mess, just leave everything together in the historical (wrong) spot. + xmlDocUniquePtr pDump = parseLayoutDump(); + sal_Int32 nFrameLeft = getXPath(pDump, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nFrameRight = getXPath(pDump, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "right"_ostr).toInt32(); + sal_Int32 nTextLeft = getXPath(pDump, "//anchored/fly/infos/bounds"_ostr, "left"_ostr).toInt32(); + sal_Int32 nTextRight = getXPath(pDump, "//anchored/fly/infos/bounds"_ostr, "right"_ostr).toInt32(); + // The text must be inside of its frame boundaries + CPPUNIT_ASSERT(nFrameRight >= nTextRight); + CPPUNIT_ASSERT(nFrameLeft <= nTextLeft); + // LayoutInCell: The text must fit inside cell A1 //cell[1]/info/bounds/right = 4703 + //CPPUNIT_ASSERT(nTextRight < 4704); + + uno::Reference xShapeProperties(getShape(1), uno::UNO_QUERY); + bool bValue; + xShapeProperties->getPropertyValue("IsFollowingTextFlow") >>= bValue; + CPPUNIT_ASSERT_EQUAL_MESSAGE("YOU FIXED ME? LayoutInCell ought to be true", false, bValue); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135595_HFtableWrap_c12, "tdf135595_HFtableWrap_c12.docx") +{ + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // tdf#104596: ignore wrap exception apparently does not apply if it is not "layout in table cell". + // Should be only one page. Row height should be two lines at 722, not wrapped to three lines at 998. + sal_Int32 nRowHeight = getXPath(pXmlDoc, "//header/tab/row/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_MESSAGE("Text must not wrap around header image", nRowHeight < 800); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf151704_thinColumnHeight, "tdf151704_thinColumnHeight.docx") +{ + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nRowHeightT1 = getXPath( + pXmlDoc, "//page[1]/body/tab[1]/row/cell/tab[1]/row[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + sal_Int32 nRowHeightT2 = getXPath( + pXmlDoc, "//page[2]/body/tab/row[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Same row height in both tables", nRowHeightT1, nRowHeightT2); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123622, "tdf123622.docx") +{ + uno::Reference XPropsRight(getShape(1),uno::UNO_QUERY); + sal_Int16 nRelativePosR = 0; + XPropsRight->getPropertyValue("HoriOrientRelation")>>=nRelativePosR; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape inside the margin", sal_Int16(4), nRelativePosR); + + uno::Reference XPropsLeft(getShape(2), uno::UNO_QUERY); + sal_Int16 nRelativePosL = 0; + XPropsLeft->getPropertyValue("HoriOrientRelation") >>= nRelativePosL; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape inside the margin", sal_Int16(3), nRelativePosL); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf78749) +{ + loadAndReload("tdf78749.docx"); + //Shape lost the background image before, now check if it still has... + auto xShape = getShape(1); + uno::Reference xShpProps(xShape, uno::UNO_QUERY); + OUString aPropertyVal; + xShpProps->getPropertyValue("FillBitmapName") >>= aPropertyVal; + CPPUNIT_ASSERT(!aPropertyVal.isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128207) +{ + loadAndSave("tdf128207.docx"); + //There was the charts on each other, because their horizontal and vertical position was 0! + xmlDocUniquePtr p_XmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(p_XmlDoc); + assertXPathContent(p_XmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:drawing/wp:anchor/wp:positionH/wp:posOffset"_ostr, "4445"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123873) +{ + loadAndSave("tdf123873.docx"); + //OLE Object were overlapped due to missing wrap import + xmlDocUniquePtr p_XmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(p_XmlDoc); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:drawing/wp:anchor/wp:wrapTopAndBottom"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, Tdf133065) +{ + loadAndSave("tdf133065.odt"); + CPPUNIT_ASSERT_EQUAL(7, getShapes()); + CPPUNIT_ASSERT_EQUAL(3, getPages()); + auto pxmldoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pxmldoc); + OUString aVal; + + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[3]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "type"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("square") > -1); + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[3]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "side"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("left") > -1); + + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[8]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "type"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("square") > -1); + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[8]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "side"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("right") > -1); + + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[12]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "type"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("square") > -1); + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[12]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "side"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("largest") > -1); + + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[20]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "type"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("topAndBottom") > -1); + + aVal = getXPath(pxmldoc, "/w:document/w:body/w:p[24]/w:r[2]/w:object/v:shape/w10:wrap"_ostr, "type"_ostr); + CPPUNIT_ASSERT(aVal.indexOf("square") > -1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf130814model, "tdf130814.docx") +{ + CPPUNIT_ASSERT_EQUAL(Color(0x1F497D), getProperty(getRun(getParagraph(2), 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL(double(16), getProperty(getRun(getParagraph(2), 1), "CharHeight")); + CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::SINGLE, getProperty(getRun(getParagraph(2), 1), "CharUnderline")); + CPPUNIT_ASSERT_EQUAL(OUString("Candara"), getProperty(getRun(getParagraph(2), 1), "CharFontName")); + CPPUNIT_ASSERT_EQUAL(OUString("Arial Unicode MS"), getProperty(getRun(getParagraph(2), 1), "CharFontNameAsian")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf107020) +{ + loadAndSave("tdf107020.docx"); + if (!IsDefaultDPI()) + return; + xmlDocUniquePtr p_XmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(p_XmlDoc); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p/w:r/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:srcRect"_ostr, "l"_ostr, "4910"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p/w:r/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:srcRect"_ostr, "t"_ostr, "27183"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p/w:r/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:srcRect"_ostr, "r"_ostr, "57638"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p/w:r/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:srcRect"_ostr, "b"_ostr, "48360"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf130814ooxml) +{ + loadAndSave("tdf130814.docx"); + xmlDocUniquePtr p_XmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(p_XmlDoc); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:rPr/w:rFonts"_ostr, "eastAsia"_ostr, "Arial Unicode MS"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:rPr/w:rFonts"_ostr, "ascii"_ostr, "Candara"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:rPr/w:rFonts"_ostr, "hAnsi"_ostr, "Candara"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:rPr/w:color"_ostr, "val"_ostr, "1F497D"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:rPr/w:sz"_ostr, "val"_ostr, "32"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:rPr/w:szCs"_ostr, "val"_ostr, "32"); + assertXPath( + p_XmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:rPr/w:u"_ostr, "val"_ostr, "single"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf129888vml, "tdf129888vml.docx") +{ + //the line shape has anchor in the first cell however it has to + //be positioned to an another cell. To reach this we must handle + //the o:allowincell attribute of the shape, and its position has + //to be calculated from the page frame instead of the table: + + uno::Reference xShapeProperties(getShape(1), uno::UNO_QUERY); + bool bValue; + xShapeProperties->getPropertyValue("IsFollowingTextFlow") >>= bValue; + CPPUNIT_ASSERT_EQUAL_MESSAGE("tdf129888vml The line shape has bad place!", + false, bValue); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf129888dml, "tdf129888dml.docx") +{ + //the shape has anchor in the first cell however it has to + //be positioned to the right side of the page. To reach this we must handle + //the layoutInCell attribute of the shape, and its position has + //to be calculated from the page frame instead of the table: + + uno::Reference xShapeProperties(getShape(1), uno::UNO_QUERY); + bool bValue; + xShapeProperties->getPropertyValue("IsFollowingTextFlow") >>= bValue; + CPPUNIT_ASSERT_EQUAL_MESSAGE("tdf129888dml The shape has bad place!", + false, bValue); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf130120) +{ + loadAndSave("tdf130120.docx"); + // Text for exporting the allowincell attribute: + xmlDocUniquePtr p_XmlDoc = parseExport("word/document.xml"); + assertXPath(p_XmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:r/mc:AlternateContent/" + "mc:Choice/w:drawing/wp:anchor"_ostr, "layoutInCell"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, Tdf133030) +{ + loadAndSave("tdf133030.docx"); + auto pExport = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pExport); + + assertXPath(pExport, "/w:document/w:body/w:p[3]/m:oMathPara/m:oMathParaPr/m:jc"_ostr, "val"_ostr, "center"); + assertXPath(pExport, "/w:document/w:body/w:p[5]/m:oMathPara/m:oMathParaPr/m:jc"_ostr, "val"_ostr, "left"); + assertXPath(pExport, "/w:document/w:body/w:p[7]/m:oMathPara/m:oMathParaPr/m:jc"_ostr, "val"_ostr, "right"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf87569v, "tdf87569_vml.docx") +{ + //the original tdf87569 sample has vml shapes... + uno::Reference xShapeProperties(getShape(1), uno::UNO_QUERY); + bool bValue; + xShapeProperties->getPropertyValue("IsFollowingTextFlow") >>= bValue; + CPPUNIT_ASSERT_EQUAL_MESSAGE("tdf87569_vml: The Shape is not in the table!", + true, bValue); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf133000_numStyleFormatting, "tdf133000_numStyleFormatting.docx") +{ + // Paragraph style's LeftMargin should not override numbering's Left Margin + xmlDocUniquePtr pDump = parseLayoutDump(); + assertXPathContent(pDump, "/root/page[1]/body/txt[2]"_ostr, "First line"); + const sal_Int32 nLevel1Margin = getXPath(pDump, "//page[1]/body/txt[2]/infos/prtBounds"_ostr, "left"_ostr).toInt32(); + assertXPathContent(pDump, "/root/page[1]/body/txt[4]"_ostr, "One sublevel"); + const sal_Int32 nLevel2Margin = getXPath(pDump, "//page[1]/body/txt[4]/infos/prtBounds"_ostr, "left"_ostr).toInt32(); + CPPUNIT_ASSERT( nLevel1Margin < nLevel2Margin ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf134260, "tdf134260.docx") +{ + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1270 + + auto xNum1Levels + = getProperty>(getParagraph(1), "NumberingRules"); + + CPPUNIT_ASSERT_EQUAL( + sal_Int32(0), + comphelper::SequenceAsHashMap(xNum1Levels->getByIndex(0))["ListtabStopPosition"] + .get()); + + auto xNum2Levels + = getProperty>(getParagraph(2), "NumberingRules"); + + CPPUNIT_ASSERT_EQUAL( + sal_Int32(0), + comphelper::SequenceAsHashMap(xNum2Levels->getByIndex(0))["ListtabStopPosition"] + .get()); + + auto xNum3Levels + = getProperty>(getParagraph(3), "NumberingRules"); + + CPPUNIT_ASSERT_EQUAL( + sal_Int32(0), + comphelper::SequenceAsHashMap(xNum3Levels->getByIndex(0))["ListtabStopPosition"] + .get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZeroNumbering, "arabic-zero-numbering.docx") +{ + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 64 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero3Numbering, "arabic-zero3-numbering.docx") +{ + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 65 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO3. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO3), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero4Numbering, "arabic-zero4-numbering.docx") +{ + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 66 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO4. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO4), + aMap["NumberingType"].get()); +} + +DECLARE_ODFEXPORT_TEST(testArabicZero5Numbering, "arabic-zero5-numbering.docx") +{ + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 67 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO5. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO5), + aMap["NumberingType"].get()); +} + +CPPUNIT_TEST_FIXTURE(Test, testArabicZeroNumberingFootnote) +{ + // Create a document, set footnote numbering type to ARABIC_ZERO. + createSwDoc(); + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnoteSettings + = xFootnotesSupplier->getFootnoteSettings(); + sal_uInt16 nNumberingType = style::NumberingType::ARABIC_ZERO; + xFootnoteSettings->setPropertyValue("NumberingType", uno::Any(nNumberingType)); + + // Insert a footnote. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnote( + xFactory->createInstance("com.sun.star.text.Footnote"), uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextContentAppend(xTextDocument->getText(), + uno::UNO_QUERY); + xTextContentAppend->appendTextContent(xFootnote, {}); + + saveAndReload("Office Open XML Text"); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // XPath '/w:document/w:body/w:sectPr/w:footnotePr/w:numFmt' number of nodes is incorrect + // because the exporter had no idea what markup to use for ARABIC_ZERO. + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:footnotePr/w:numFmt"_ostr, "val"_ostr, "decimalZero"); +} + +CPPUNIT_TEST_FIXTURE(Test, testChicagoNumberingFootnote) +{ + // Create a document, set footnote numbering type to SYMBOL_CHICAGO. + createSwDoc(); + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnoteSettings + = xFootnotesSupplier->getFootnoteSettings(); + sal_uInt16 nNumberingType = style::NumberingType::SYMBOL_CHICAGO; + xFootnoteSettings->setPropertyValue("NumberingType", uno::Any(nNumberingType)); + + // Insert a footnote. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnote( + xFactory->createInstance("com.sun.star.text.Footnote"), uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextContentAppend(xTextDocument->getText(), + uno::UNO_QUERY); + xTextContentAppend->appendTextContent(xFootnote, {}); + + saveAndReload("Office Open XML Text"); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // XPath '/w:document/w:body/w:sectPr/w:footnotePr/w:numFmt' number of nodes is incorrect + // because the exporter had no idea what markup to use for SYMBOL_CHICAGO. + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:footnotePr/w:numFmt"_ostr, "val"_ostr, "chicago"); +} + +CPPUNIT_TEST_FIXTURE(Test, testListNotCountedIndent) +{ + loadAndReload("list_notcounted_indent.fodt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:numPr/w:numId"_ostr, "val"_ostr, "0"); + // wrong: 720 + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:ind"_ostr, "hanging"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:numPr/w:numId"_ostr, "val"_ostr, "2"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:ind"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:numPr/w:numId"_ostr, "val"_ostr, "0"); + // wrong: 180 + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:ind"_ostr, "start"_ostr, "720"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:ind"_ostr, "hanging"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:numPr/w:numId"_ostr, "val"_ostr, "0"); + // wrong: 720 + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr/w:ind"_ostr, "hanging"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:numPr/w:numId"_ostr, "val"_ostr, "0"); + // wrong: 720 + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:ind"_ostr, "start"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:ind"_ostr, "end"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:pPr/w:ind"_ostr, "hanging"_ostr, "0"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf87569d, "tdf87569_drawingml.docx") +{ + //if the original tdf87569 sample is upgraded it will have drawingml shapes... + uno::Reference xShapeProperties(getShape(1), uno::UNO_QUERY); + bool bValue; + xShapeProperties->getPropertyValue("IsFollowingTextFlow") >>= bValue; + CPPUNIT_ASSERT_EQUAL_MESSAGE("tdf87569_drawingml: The Shape is not in the table!", + true, bValue); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf130610) +{ + loadAndReload("tdf130610_bold_in_2_styles.ott"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // check character properties + { + uno::Reference xStyle( + getStyles("CharacterStyles")->getByName("WollMuxRoemischeZiffer"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bold", awt::FontWeight::BOLD, getProperty(xStyle, "CharWeight")); + } + + // check paragraph properties + { + uno::Reference xStyle( + getStyles("ParagraphStyles")->getByName("WollMuxVerfuegungspunkt"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bold", awt::FontWeight::BOLD, getProperty(xStyle, "CharWeight")); + } + + // check inline text properties + { + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:rPr/w:b"_ostr); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121045) +{ + loadAndSave("tdf121045.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:pPr/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:pPr/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[1]/w:fldChar"_ostr, "fldCharType"_ostr, "begin"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[2]/w:instrText"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[3]/w:fldChar"_ostr, "fldCharType"_ostr, "separate"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[5]/w:fldChar"_ostr, "fldCharType"_ostr, "end"); + // form control keeps its direct formatted font size + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[2]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[2]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[3]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[3]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[4]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[4]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[5]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:p/w:r[5]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf78352, "tdf78352.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // Ensure that width of first tab is close to zero (previous value was ~1000 twips) + int nWidth = parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::TabLeft']"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_LESS(150, nWidth); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf81567) +{ + loadAndReload("tdf81567.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + + int nFrameWidth = parseDump("/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(2371, nFrameWidth); + + int nFrameHeight = parseDump("/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(3520, nFrameHeight); + + int nFrameTop = parseDump("/root/page/body/txt/anchored/fly/infos/bounds"_ostr, "top"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(1518, nFrameTop); + + int nImageWidth = parseDump("/root/page/body/txt/anchored/fly/txt/anchored/fly/infos/bounds"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(2370, nImageWidth); + + int nImageHeight = parseDump("/root/page/body/txt/anchored/fly/txt/anchored/fly/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(1605, nImageHeight); + + // Check the image is at the top of the frame + // Without the fix in place, this test would have failed with: + // - Expected: 1638 + // - Actual : 2236 + int nImageTop = parseDump("/root/page/body/txt/anchored/fly/txt/anchored/fly/infos/bounds"_ostr, "top"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(1638, nImageTop); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf92472) +{ + loadAndSave("tdf92472.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[1]/w:fldChar"_ostr, "fldCharType"_ostr, "begin"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:instrText"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[3]/w:fldChar"_ostr, "fldCharType"_ostr, "separate"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[5]/w:fldChar"_ostr, "fldCharType"_ostr, "end"); + // form control keeps its direct formatted font size + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[3]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[3]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[4]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[4]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[5]/w:rPr/w:sz"_ostr, "val"_ostr, "20"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[5]/w:rPr/w:szCs"_ostr, "val"_ostr, "20"); +} + +CPPUNIT_TEST_FIXTURE(Test, Tdf133035) +{ + loadAndSave("tdf133035.docx"); + auto pxml = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pxml); + OUString aXmlVal = getXPath(pxml, "/w:document/w:body/w:p[1]/w:r[1]/w:object/v:shape"_ostr, "style"_ostr); + CPPUNIT_ASSERT(aXmlVal.indexOf("margin-left:186.6pt") > -1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf131260, "tdf131260.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 3 + // - Actual : 2 + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTables->getCount()); +} +DECLARE_OOXMLEXPORT_TEST(testTdf120315, "tdf120315.docx") +{ + // tdf#120315 cells of the second column weren't vertically merged + // because their horizontal positions are different a little bit + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + CPPUNIT_ASSERT_EQUAL(getProperty>( + xTableRows->getByIndex(0), "TableColumnSeparators")[0] + .Position, + getProperty>( + xTableRows->getByIndex(1), "TableColumnSeparators")[2] + .Position); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf108350_noFontdefaults, "tdf108350_noFontdefaults.docx") +{ + uno::Reference< container::XNameAccess > paragraphStyles = getStyles("ParagraphStyles"); + uno::Reference< beans::XPropertySet > xStyleProps(paragraphStyles->getByName("NoParent"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Times New Roman"), getProperty(xStyleProps, "CharFontName")); + //CPPUNIT_ASSERT_EQUAL_MESSAGE("Font size", 10.f, getProperty(xStyleProps, "CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123116_oversizedRowSplit) +{ + loadAndReload("tdf123116_oversizedRowSplit.odt"); + // Intentionally require a very non-backward-compatible, natural continuation of the table + // instead of an ugly "page break" like MS Word does (and LO used to do). + CPPUNIT_ASSERT_EQUAL_MESSAGE("Row splits over 4 pages", 4, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testPageContentBottom, "page-content-bottom.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + sal_Int16 nExpected = text::RelOrientation::PAGE_PRINT_AREA_BOTTOM; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 10 (PAGE_PRINT_AREA_BOTTOM) + // - Actual : 0 (FRAME) + // i.e. the bottom-of-body relation was lost. + CPPUNIT_ASSERT_EQUAL(nExpected, getProperty(xShape, "VertOrientRelation")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129522_removeShadowStyle) +{ + loadAndReload("tdf129522_removeShadowStyle.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference< container::XNameAccess > paragraphStyles = getStyles("ParagraphStyles"); + uno::Reference< beans::XPropertySet > xStyleProps(paragraphStyles->getByName("Shadow"), uno::UNO_QUERY_THROW); + table::ShadowFormat aShadow = getProperty(xStyleProps, "ParaShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + + // Shadows were inherited regardless of whether the style disabled them. + xStyleProps.set(paragraphStyles->getByName("Shadow-removed"), uno::UNO_QUERY_THROW); + aShadow = getProperty(xStyleProps, "ParaShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_NONE, aShadow.Location); + + uno::Reference< container::XNameAccess > characterStyles = getStyles("CharacterStyles"); + xStyleProps.set(characterStyles->getByName("CharShadow"), uno::UNO_QUERY_THROW); + aShadow = getProperty(xStyleProps, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + + xStyleProps.set(characterStyles->getByName("CharShadow-removed"), uno::UNO_QUERY_THROW); + aShadow = getProperty(xStyleProps, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_NONE, aShadow.Location); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf130167_spilloverHeaderShape, "testTdf130167_spilloverHeader.docx") +{ + uno::Reference xTextGraphicObjectsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xNameAccess( + xTextGraphicObjectsSupplier->getGraphicObjects(), uno::UNO_QUERY); + // graphics from discarded headers were being added to the text body. Reduced from 5 to 2 shapes overall. + // CPPUNIT_ASSERT(xNameAccess->getCount() <= 4); -> What about hidden headers? + CPPUNIT_ASSERT_LESS(sal_Int32(9), xNameAccess->getCount()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf124986, "tdf124986.docx") +{ + // Load a document with SET fields, where the SET fields contain leading/trailing quotation marks and spaces. + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + while (xFields->hasMoreElements()) + { + uno::Reference xServiceInfo(xFields->nextElement(), uno::UNO_QUERY); + uno::Reference xPropertySet(xServiceInfo, uno::UNO_QUERY); + if (xServiceInfo->supportsService("com.sun.star.text.TextField.SetExpression")) + { + OUString aValue; + xPropertySet->getPropertyValue("Content") >>= aValue; + CPPUNIT_ASSERT_EQUAL(OUString("demo"), aValue); + } + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf83309, "tdf83309.docx") +{ + // Important: bug case had 4 pages + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + // First paragraph does not have tab before + // (same applies to all paragraphs in doc, but lets assume they are + // behave same way) + OUString sNodeType = parseDump("(/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*)[1]"_ostr, "type"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("PortionType::Text"), sNodeType); + + // tdf148380: creation-date field in header.xml was unsupported on export + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("8/31/14 10:26 AM"), xField->getPresentation(false)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121661) +{ + loadAndSave("tdf121661.docx"); + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:hyphenationZone"_ostr, "val"_ostr, "851"); + + // tdf#149421 + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Standard"), uno::UNO_QUERY); + // This was false + CPPUNIT_ASSERT_GREATER( static_cast(0), getProperty(xStyle, "ParaHyphenationZone")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf149421, "tdf121661.docx") +{ + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Standard"), uno::UNO_QUERY); + // This was false + CPPUNIT_ASSERT_GREATER( static_cast(0), getProperty(xStyle, "ParaHyphenationZone")); + + if (!isExported()) + { + CPPUNIT_ASSERT_EQUAL( static_cast(851), getProperty(xStyle, "ParaHyphenationZone")); + // modify hyphenation zone (note: only hyphenation zone set in Standard paragraph style + // is exported, according to the document-level hyphenation settings of OOXML) + xStyle->setPropertyValue("ParaHyphenationZone", uno::Any(static_cast(2000))); + } + else + { + // check the export of the modified hyphenation zone + CPPUNIT_ASSERT_EQUAL( static_cast(2000), getProperty(xStyle, "ParaHyphenationZone")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121658) +{ + loadAndSave("tdf121658.docx"); + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:doNotHyphenateCaps"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableStyleConfNested) +{ + loadAndSave("table-style-conf-nested.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed, as the custom table cell + // border properties were lost, so the outer A2 cell started to have borders, not present in the + // doc model. + assertXPath(pXmlDoc, "//w:body/w:tbl/w:tr/w:tc[2]/w:tcPr/w:tcBorders/w:top"_ostr, "val"_ostr, "nil"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133771) +{ + // Create the doc model. + createSwDoc("tdf133771.odt", /*pPassword*/ "test"); + + CPPUNIT_ASSERT_EQUAL(OUString("Password Protected"), getParagraph(1)->getString()); + + // Without the fix in place, this test would have failed with + // "An uncaught exception of type com.sun.star.io.IOException" + // exporting to docx + save("Office Open XML Text"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + assertXPathContent(pXmlDoc, "//w:body/w:p/w:r/w:t"_ostr, "Password Protected"); +} + +CPPUNIT_TEST_FIXTURE(Test, testZeroLineSpacing) +{ + // Create the doc model. + createSwDoc(); + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + style::LineSpacing aSpacing; + aSpacing.Mode = style::LineSpacingMode::MINIMUM; + aSpacing.Height = 0; + xParagraph->setPropertyValue("ParaLineSpacing", uno::Any(aSpacing)); + + // Export to docx. + save("Office Open XML Text"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: atLeast + // - Actual : auto + // i.e. the minimal linespacing was lost on export. + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:pPr/w:spacing"_ostr, "lineRule"_ostr, "atLeast"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:pPr/w:spacing"_ostr, "line"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testSemiTransparentText) +{ + // Create an in-memory empty document. + createSwDoc(); + + // Set text to half-transparent and type a character. + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT(xParagraph.is()); + sal_Int16 nTransparence = 75; + xParagraph->setPropertyValue("CharTransparence", uno::Any(nTransparence)); + uno::Reference xTextRange(xParagraph, uno::UNO_QUERY); + CPPUNIT_ASSERT(xTextRange.is()); + xTextRange->setString("x"); + + // Export to docx. + save("Office Open XML Text"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + double fValue = getXPath( + pXmlDoc, + "/w:document/w:body/w:p/w:r/w:rPr/w14:textFill/w14:solidFill/w14:srgbClr/w14:alpha"_ostr, + "val"_ostr) + .toDouble(); + sal_Int16 nActual = basegfx::fround(fValue / oox::drawingml::PER_PERCENT); + + // Without the accompanying fix in place, this test would have failed, as the w14:textFill + // element was missing. + CPPUNIT_ASSERT_EQUAL(nTransparence, nActual); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf147485, "Tdf147485.docx") +{ + // Before the fix this was impossible. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf149546, "tdf149546.docx") +{ + // Before the fix this was impossible. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testUserField) +{ + // Create an in-memory empty document with a user field. + createSwDoc(); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xField( + xFactory->createInstance("com.sun.star.text.TextField.User"), uno::UNO_QUERY); + uno::Reference xMaster( + xFactory->createInstance("com.sun.star.text.FieldMaster.User"), uno::UNO_QUERY); + xMaster->setPropertyValue("Name", uno::Any(OUString("foo"))); + xField->attachTextFieldMaster(xMaster); + xField->getTextFieldMaster()->setPropertyValue("Content", uno::Any(OUString("bar"))); + uno::Reference xDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xDocument->getText(); + xText->insertTextContent(xText->createTextCursor(), xField, /*bAbsorb=*/false); + + // Export to docx. + save("Office Open XML Text"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + // Without the accompanying fix in place, this test would have failed, the user field was + // exported as User Field foo = bar. + assertXPathContent(pXmlDoc, "//w:p/w:r[2]/w:instrText"_ostr, " DOCVARIABLE foo "); + assertXPathContent(pXmlDoc, "//w:p/w:r[4]/w:t"_ostr, "bar"); + + // Make sure that not only the variables, but also their values are written. + pXmlDoc = parseExport("word/settings.xml"); + CPPUNIT_ASSERT(pXmlDoc); + assertXPath(pXmlDoc, "//w:docVars/w:docVar"_ostr, "name"_ostr, "foo"); + assertXPath(pXmlDoc, "//w:docVars/w:docVar"_ostr, "val"_ostr, "bar"); +} + +CPPUNIT_TEST_FIXTURE(Test, testHighlightEdit_numbering) +{ + // Create the doc model. + createSwDoc("tdf135774_numberingCRProps.docx"); + + // This only affects when saving as w:highlight - which is not the default since 7.0. + SvtFilterOptions& rOpt = SvtFilterOptions::Get(); + bool bWasExportToShade = rOpt.IsCharBackground2Shading(); + rOpt.SetCharBackground2Highlighting(); + + //Simulate a user editing the char background color of the paragraph 2 marker (CR) + uno::Reference properties(getParagraph(2), uno::UNO_QUERY); + uno::Sequence aListAutoFormat; + CPPUNIT_ASSERT(properties->getPropertyValue("ListAutoFormat") >>= aListAutoFormat); + comphelper::SequenceAsHashMap aMap(properties->getPropertyValue("ListAutoFormat")); + // change the background color to RES_CHRATR_BACKGROUND. + aMap["CharBackColor"] <<= static_cast(0xff00ff); + // Two attributes can affect character background. Highlight has priority, and is only there for MS compatibility, + // so clear any potential highlight set earlier, or override any coming via a style. + aMap["CharHighlight"] <<= static_cast(COL_TRANSPARENT); + + uno::Sequence aGrabBag; + aMap["CharInteropGrabBag"] >>= aGrabBag; + for (beans::PropertyValue& rProp : asNonConstRange(aGrabBag)) + { + // The shading is no longer defined from import, so clear that flag. + // BackColor 0xff00ff will now attempt to export as highlight, since we set that in SvtFilterOptions. + if (rProp.Name == "CharShadingMarker") + rProp.Value <<= false; + } + aMap["CharInteropGrabBag"] <<= aGrabBag; + + aMap >> aListAutoFormat; + properties->setPropertyValue("ListAutoFormat", uno::Any(aListAutoFormat)); + + // Export to docx. + save("Office Open XML Text"); + + // Paragraph 2 should have only one w:highlight written per w:rPr. Without the fix, there were two. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:body/w:p[2]/w:pPr/w:rPr/w:highlight"_ostr, "val"_ostr, "none"); + // Visually, the "none" highlight means the bullet point should not have a character background. + + if (bWasExportToShade) + rOpt.SetCharBackground2Shading(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf132766) +{ + loadAndSave("tdf132766.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + // Ensure that for list=1 and level=0 we wrote correct bullet char and correct font + assertXPath(pXmlDoc, "//w:numbering/w:abstractNum[@w:abstractNumId='1']/w:lvl[@w:ilvl='0']/w:lvlText"_ostr, + "val"_ostr, u"\uF0B7"_ustr); + assertXPath(pXmlDoc, "//w:numbering/w:abstractNum[@w:abstractNumId='1']/w:lvl[@w:ilvl='0']/w:rPr/w:rFonts"_ostr, + "ascii"_ostr, "Symbol"); + assertXPath(pXmlDoc, "//w:numbering/w:abstractNum[@w:abstractNumId='1']/w:lvl[@w:ilvl='0']/w:rPr/w:rFonts"_ostr, + "hAnsi"_ostr, "Symbol"); + assertXPath(pXmlDoc, "//w:numbering/w:abstractNum[@w:abstractNumId='1']/w:lvl[@w:ilvl='0']/w:rPr/w:rFonts"_ostr, + "cs"_ostr, "Symbol"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128245) +{ + loadAndSave("tdf128245.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + CPPUNIT_ASSERT(pXmlDoc); + + assertXPath(pXmlDoc, "//w:num[@w:numId='1']/w:abstractNumId"_ostr, "val"_ostr, "1"); + assertXPath(pXmlDoc, "//w:num[@w:numId='2']/w:abstractNumId"_ostr, "val"_ostr, "2"); + assertXPath(pXmlDoc, "//w:num[@w:numId='3']/w:abstractNumId"_ostr, "val"_ostr, "3"); + assertXPath(pXmlDoc, "//w:num[@w:numId='4']/w:abstractNumId"_ostr, "val"_ostr, "1"); + assertXPath(pXmlDoc, "//w:num[@w:numId='4']/w:lvlOverride[@w:ilvl='0']"_ostr, "ilvl"_ostr, "0"); + assertXPath(pXmlDoc, "//w:num[@w:numId='4']/w:lvlOverride/w:startOverride"_ostr, "val"_ostr, "1"); + assertXPath(pXmlDoc, "//w:num[@w:numId='4']/w:lvlOverride[@w:ilvl='1']"_ostr, 0); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf124367, "tdf124367.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + // it was 2761 at the first import, and 2760 at the second import, due to incorrect rounding + CPPUNIT_ASSERT_EQUAL(static_cast(2762), + getProperty>( + xTableRows->getByIndex(2), "TableColumnSeparators")[0] + .Position); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf95189) +{ + loadAndReload("tdf95189.docx"); + { + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("3"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(7), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(xPara, "ListLabelString")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128820) +{ + loadAndSave("tdf128820.fodt"); + // Import of exported DOCX failed because of wrong namespace used for wsp element + // Now test the exported XML, in case we stop failing opening invalid files + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXml); + // The parent wpg:wgp element has three children: wpg:cNvGrpSpPr, wpg:grpSpPr, and wpg:wsp + // (if we start legitimately exporting additional children, this needs to be adjusted to check + // all those, to make sure we don't export wrong elements). + assertXPathChildren(pXml, + "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:inline/a:graphic/a:graphicData/wpg:wgp"_ostr, + 3); + assertXPath(pXml, + "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:inline/" + "a:graphic/a:graphicData/wpg:wgp/wpg:cNvGrpSpPr"_ostr); + assertXPath(pXml, + "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:inline/" + "a:graphic/a:graphicData/wpg:wgp/wpg:grpSpPr"_ostr); + // This one was pic:wsp instead of wps:wsp + assertXPath(pXml, + "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:inline/" + "a:graphic/a:graphicData/wpg:wgp/wps:wsp"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128889) +{ + loadAndSave("tdf128889.fodt"); + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXml); + // There was an w:r (with w:br) as an invalid child of first paragraph's w:pPr + assertXPath(pXml, "/w:document/w:body/w:p[1]/w:pPr/w:r"_ostr, 0); + assertXPath(pXml, "/w:document/w:body/w:p[1]/w:r"_ostr, 2); + // Check that the break is in proper - last - position + assertXPath(pXml, "/w:document/w:body/w:p[1]/w:r[2]/w:br"_ostr, "type"_ostr, "page"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf132754) +{ + loadAndReload("tdf132754.docx"); + { + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("0.0.0."), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("0.0.1."), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("0.0.2."), getProperty(xPara, "ListLabelString")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf129353, "tdf129353.docx") +{ + CPPUNIT_ASSERT_EQUAL(8, getParagraphs()); + getParagraph(1, "(Verne, 1870)"); + getParagraph(2, "Bibliography"); + getParagraph(4, "Christie, A. (1922). The Secret Adversary. "); + CPPUNIT_ASSERT_EQUAL(OUString(), getParagraph(8)->getString()); + + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes(); + uno::Reference xIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextRange = xIndex->getAnchor(); + uno::Reference xText = xTextRange->getText(); + uno::Reference xTextCursor = xText->createTextCursor(); + xTextCursor->gotoRange(xTextRange->getStart(), false); + xTextCursor->gotoRange(xTextRange->getEnd(), true); + OUString aIndexString(convertLineEnd(xTextCursor->getString(), LineEnd::LINEEND_LF)); + + // Check that all the pre-rendered entries are correct, including trailing spaces + CPPUNIT_ASSERT_EQUAL(OUString("\n" // starting with an empty paragraph + "Christie, A. (1922). The Secret Adversary. \n" + "\n" + "Verne, J. G. (1870). Twenty Thousand Leagues Under the Sea. \n" + ""), // ending with an empty paragraph + aIndexString); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf77796) +{ + loadAndSave("tdf77796.docx"); + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXml); + // cell paddings from table style + assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:start"_ostr, "w"_ostr, "5"); + assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:top"_ostr, "w"_ostr, "240"); + assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:bottom"_ostr, "w"_ostr, "480"); + // not modified + assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblCellMar/w:end"_ostr, "w"_ostr, "108"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128290) +{ + loadAndSave("tdf128290.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXml); + assertXPath(pXml, "/w:document/w:body/w:tbl/w:tblPr/w:tblLayout"_ostr, "type"_ostr, "fixed"); + + // ensure unnecessary suppressLineNumbers entry is not created. + xmlDocUniquePtr pStylesXml = parseExport("word/styles.xml"); + assertXPath(pStylesXml, "//w:style[@w:styleId='Normal']/w:pPr/w:suppressLineNumbers"_ostr, 0); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf120394, "tdf120394.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + { + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1.2.1"), getProperty(xPara, "ListLabelString")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf133605, "tdf133605.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(3), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("(a)"), getProperty(xPara, "ListLabelString")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf133605_2, "tdf133605_2.docx") +{ + // About the same document as tdf133605.docx, but number definition has level definitions in random order + CPPUNIT_ASSERT_EQUAL(1, getPages()); + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(3), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("(a)"), getProperty(xPara, "ListLabelString")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123757) +{ + loadAndSave("tdf123757.docx"); + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXml); + assertXPath(pXml, "/w:document/w:body/w:tbl"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141172) +{ + loadAndSave("tdf141172.docx"); + xmlDocUniquePtr pXml = parseExport("word/endnotes.xml"); + CPPUNIT_ASSERT(pXml); + // This was 1 (lost table during copying endnote content) + assertXPath(pXml, "/w:endnotes/w:endnote/w:tbl"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141548) +{ + loadAndSave("tdf141548.docx"); + xmlDocUniquePtr pXml = parseExport("word/endnotes.xml"); + CPPUNIT_ASSERT(pXml); + // This was 0 (lost text content of the run with endnoteRef) + assertXPath(pXml, "/w:endnotes/w:endnote[4]/w:p/w:r[2]/w:t"_ostr, 2); + assertXPathContent(pXml, "/w:endnotes/w:endnote[4]/w:p/w:r[2]/w:t[1]"_ostr, "another endnote"); + assertXPathContent(pXml, "/w:endnotes/w:endnote[4]/w:p/w:r[2]/w:t[2]"_ostr, "new line"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf143399) +{ + loadAndSave("tdf143399.docx"); + xmlDocUniquePtr pXml = parseExport("word/footnotes.xml"); + CPPUNIT_ASSERT(pXml); + // These were 0 (lost text content of documents both with footnotes and endnotes) + assertXPath(pXml, "/w:footnotes/w:footnote[3]/w:p/w:r[3]/w:t"_ostr, 1); + assertXPathContent(pXml, "/w:footnotes/w:footnote[3]/w:p/w:r[3]/w:t"_ostr, "Footnotes_graphic2"); + assertXPath(pXml, "/w:footnotes/w:footnote[4]/w:p/w:r[3]/w:t"_ostr, 1); + assertXPathContent(pXml, "/w:footnotes/w:footnote[4]/w:p/w:r[3]/w:t"_ostr, "Footnotes_graphic"); + + xmlDocUniquePtr pXml2 = parseExport("word/endnotes.xml"); + CPPUNIT_ASSERT(pXml); + // This was 0 (lost text content of the run with endnoteRef) + assertXPath(pXml2, "/w:endnotes/w:endnote[3]/w:p/w:r[3]/w:t"_ostr, 1); + assertXPathContent(pXml2, "/w:endnotes/w:endnote[3]/w:p/w:r[3]/w:t[1]"_ostr, "Endnotes"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf143583) +{ + loadAndSave("tdf143583_emptyParaAtEndOfFootnote.docx"); + xmlDocUniquePtr pXml = parseExport("word/footnotes.xml"); + CPPUNIT_ASSERT(pXml); + assertXPath(pXml, "/w:footnotes/w:footnote[3]/w:p"_ostr, 2); + // This was 1 + assertXPath(pXml, "/w:footnotes/w:footnote[4]/w:p"_ostr, 2); + // This was 2 + assertXPath(pXml, "/w:footnotes/w:footnote[5]/w:p"_ostr, 3); + // This was 2 + assertXPath(pXml, "/w:footnotes/w:footnote[6]/w:p"_ostr, 3); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152203) +{ + loadAndSave("tdf152203.docx"); + xmlDocUniquePtr pXml = parseExport("word/footnotes.xml"); + CPPUNIT_ASSERT(pXml); + + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xLastFootnote(xFootnotes->getByIndex(5), uno::UNO_QUERY); + // This was "Footnote for pg5" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg 6"), xLastFootnote->getString().trim() ); + + uno::Reference xLastButOne(xFootnotes->getByIndex(4), uno::UNO_QUERY); + // This was "Footnote for pg 6" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg5"), xLastButOne->getString().trim() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152506) +{ + loadAndSave("tdf152506.docx"); + xmlDocUniquePtr pXml = parseExport("word/footnotes.xml"); + CPPUNIT_ASSERT(pXml); + + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xLastFootnote(xFootnotes->getByIndex(1), uno::UNO_QUERY); + // This was "Footnote for pg5" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg 6"), xLastFootnote->getString().trim() ); + + uno::Reference xLastButOne(xFootnotes->getByIndex(0), uno::UNO_QUERY); + // This was "Footnote for pg 6" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg5"), xLastButOne->getString().trim() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf153255) +{ + loadAndSave("tdf153255.docx"); + xmlDocUniquePtr pXml = parseExport("word/footnotes.xml"); + CPPUNIT_ASSERT(pXml); + + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xLastFootnote(xFootnotes->getByIndex(5), uno::UNO_QUERY); + // This was "Footnote for pg2" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg 6"), xLastFootnote->getString().trim() ); + + uno::Reference xLastButOne(xFootnotes->getByIndex(4), uno::UNO_QUERY); + // This was "Footnote for pg 6" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg5"), xLastButOne->getString().trim() ); + + // check all the remaining footnotes + + uno::Reference xFootnote1(xFootnotes->getByIndex(0), uno::UNO_QUERY); + // This was "Footnote for pg3" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg1"), xFootnote1->getString().trim() ); + + uno::Reference xFootnote2(xFootnotes->getByIndex(1), uno::UNO_QUERY); + // This was "Footnote for pg5" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg2"), xFootnote2->getString().trim() ); + + uno::Reference xFootnote3(xFootnotes->getByIndex(2), uno::UNO_QUERY); + // This was "Footnote for pg4." (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg3"), xFootnote3->getString().trim() ); + + uno::Reference xFootnote4(xFootnotes->getByIndex(3), uno::UNO_QUERY); + // This was "Footnote for pg1" (replaced footnotes) + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg4."), xFootnote4->getString().trim() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf153804) +{ + loadAndSave("tdf153804.docx"); + xmlDocUniquePtr pXml = parseExport("word/footnotes.xml"); + CPPUNIT_ASSERT(pXml); + + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xLastFootnote(xFootnotes->getByIndex(1), uno::UNO_QUERY); + // This was empty + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg 6"), xLastFootnote->getString().trim() ); + + uno::Reference xLastButOne(xFootnotes->getByIndex(0), uno::UNO_QUERY); + // This was empty + CPPUNIT_ASSERT_EQUAL( OUString("Footnote for pg5"), xLastButOne->getString().trim() ); +} + +// skip test for macOS (missing fonts?) +#if !defined(MACOSX) +DECLARE_OOXMLEXPORT_TEST(testTdf146346, "tdf146346.docx") +{ + // This was 2 (by bad docDefault vertical margins around tables in footnotes) + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // only first page has table + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + // check first page: all tables on the first page + assertXPath(pXmlDoc, "/root/page[1]//anchored/fly"_ostr, 8); + assertXPath(pXmlDoc, "/root/page[1]//anchored/fly/tab"_ostr, 8); + + // No second page. + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. unwanted lower margin in the floating table's anchor paragraph in the footnote created a + // second page. + assertXPath(pXmlDoc, "/root/page[2]"_ostr, 0); +} +#endif + +DECLARE_OOXMLEXPORT_TEST(testTdf130088, "tdf130088.docx") +{ + // This was 2 (justification without shrinking resulted more lines) + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // check compatibility option in ODT export/import, too + saveAndReload("writer8"); + + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf158436, "tdf158436.docx") +{ + // This resulted freezing + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf159032, "tdf124795-5.docx") +{ + // This resulted crashing + CPPUNIT_ASSERT_EQUAL(57, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testHyphenationAuto) +{ + loadAndReload("hyphenation.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Explicitly set hyphenation=auto on document level + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + CPPUNIT_ASSERT(pXmlSettings); + assertXPath(pXmlSettings, "/w:settings/w:autoHyphenation"_ostr, "val"_ostr, "true"); + + // Second paragraph has explicitly enabled hyphenation + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXml); + assertXPath(pXml, "/w:document/w:body/w:p[2]/w:pPr/w:suppressAutoHyphens"_ostr, "val"_ostr, "false"); + + // Default paragraph style explicitly disables hyphens + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + CPPUNIT_ASSERT(pXmlStyles); + assertXPath(pXmlStyles, "/w:styles/w:docDefaults/w:pPrDefault/w:pPr/w:suppressAutoHyphens"_ostr, "val"_ostr, "true"); +} + +CPPUNIT_TEST_FIXTURE(Test, testStrikeoutGroupShapeText) +{ + loadAndSave("tdf131776_StrikeoutGroupShapeText.docx"); + // tdf#131776: Check if strikeout is used in shape group texts + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + + // double strike (dstrike) + // no "val" attribute + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[1]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:dstrike"_ostr); + assertXPathNoAttribute(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[1]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:dstrike"_ostr, "val"_ostr); + // "val" attribute is true, this is used in this test file. However, LO is going to export this element without the "val" attribute + // because if the element appears, but without an attribute its "val" true by default. + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[2]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:dstrike"_ostr); + assertXPathNoAttribute(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[2]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:dstrike"_ostr, "val"_ostr); + // "val" attribute is false (this was missing, resulting the regression) + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[3]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:dstrike"_ostr, "val"_ostr, "false"); + + // simple strike (strike) + // no "val" attribute + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[4]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:strike"_ostr); + assertXPathNoAttribute(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[4]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:strike"_ostr, "val"_ostr); + // "val" attribute is true, this is used in this test file. However, LO is going to export this element without the "val" attribute + // because if the element appears, but without an attribute its "val" true by default. + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[5]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:strike"_ostr); + assertXPathNoAttribute(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[5]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:strike"_ostr, "val"_ostr); + // "val" attribute is false + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wpg:wgp/" + "wps:wsp[6]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/w:strike"_ostr, "val"_ostr, "false"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf131539) +{ + loadAndSave("tdf131539.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //The positions of OLE objects were not exported, check if now it is exported correctly + xmlDocUniquePtr p_XmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(p_XmlDoc); + OUString aXmlVal = getXPath(p_XmlDoc, "/w:document/w:body/w:p[4]/w:r[1]/w:object/v:shape"_ostr, "style"_ostr); + // This data was missing + CPPUNIT_ASSERT(aXmlVal.indexOf("margin-left:139.95")>-1); +} + +CPPUNIT_TEST_FIXTURE(Test, testLineWidthRounding) +{ + loadAndSave("tdf126363_LineWidthRounding.docx"); + // tdf#126363: check if line with stays the same after export + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + // this was 57240 (it differs from the original 57150, losing the preset line width) + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln"_ostr, "w"_ostr, "57150"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf108505) +{ + loadAndReload("tdf108505.docx"); + uno::Reference xParagraph = getParagraph(3); + uno::Reference xText + = getRun(xParagraph, 1, "Wrong font when alone on the line"); + + // Without the fix in place this would have become Times New Roman + CPPUNIT_ASSERT_EQUAL( + OUString("Trebuchet MS"), + getProperty(xText, "CharFontName")); +} + +CPPUNIT_TEST_FIXTURE(Test, testRelativeAnchorHeightFromTopMarginHasHeader) +{ + loadAndReload("tdf123324_testRelativeAnchorHeightFromTopMarginHasHeader.docx"); + // tdf#123324 The height was set relative to page print area top, + // but this was handled relative to page height. + // Note: page print area top = margin + header height. + // In this case the header exists. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "height"_ostr, "2551"); +} + +CPPUNIT_TEST_FIXTURE(Test, testRelativeAnchorHeightFromTopMarginNoHeader) +{ + loadAndReload("tdf123324_testRelativeAnchorHeightFromTopMarginNoHeader.docx"); + // tdf#123324 The height was set relative from top margin, but this was handled relative from page height. + // Note: the MSO Word margin = LO margin + LO header height. + // In this case the header does not exist, so MSO Word margin and LO Writer margin are the same. + + // tdf#123324 The height was set relative to page print area top, + // but this was handled relative to page height. + // Note: page print area top = margin + header height. + // In this case the header does not exist, so OpenDocument and OOXML margins are the same. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "height"_ostr, "2551"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf64531) +{ + loadAndReload("tdf64531.docx"); + xmlDocUniquePtr pXmlDoc= parseExport("word/document.xml"); + OString sPathToTabs= "/w:document/w:body/w:sdt/w:sdtContent/w:p[2]/w:pPr/w:tabs/"_ostr; + assertXPath(pXmlDoc, sPathToTabs+"w:tab[1]", "pos"_ostr,"720"); + assertXPath(pXmlDoc, sPathToTabs+"w:tab[2]", "pos"_ostr,"12950"); +} +/* temporarily disabled to get further test results + The import now uses the dml shape, not the VML fallback. +DECLARE_OOXMLEXPORT_TEST(testVmlShapeTextWordWrap, "tdf97618_testVmlShapeTextWordWrap.docx") +{ + // tdf#97618 The text wrapping of a shape was not handled in a canvas. + // TODO: fix export too + if (isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + if (!pXmlDoc) + return; + // The bound rect of shape will be wider if wrap does not work (the wrong value is 3167). + assertXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds", "width", "2500"); +} +*/ + +DECLARE_OOXMLEXPORT_TEST(testVmlLineShapeMirroredX, "tdf97517_testVmlLineShapeMirroredX.docx") +{ + // tdf#97517 The "flip:x" was not handled for VML line shapes. + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + OUString sStyle = getXPath(pXmlDoc, + "/w:document/w:body/w:p[3]/w:r/mc:AlternateContent/mc:Fallback/w:pict/v:line"_ostr, + "style"_ostr); + CPPUNIT_ASSERT(sStyle.indexOf("flip:x") > 0); +} + +DECLARE_OOXMLEXPORT_TEST(testVmlLineShapeMirroredY, "tdf137678_testVmlLineShapeMirroredY.docx") +{ + // tdf#137678 The "flip:y" was not handled for VML line shapes. + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + OUString sStyle = getXPath(pXmlDoc, + "/w:document/w:body/w:p[3]/w:r/mc:AlternateContent/mc:Fallback/w:pict/v:line"_ostr, + "style"_ostr); + CPPUNIT_ASSERT(sStyle.indexOf("flip:y") > 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testVmlLineShapeRotated) +{ + loadAndSave("tdf137765_testVmlLineShapeRotated.docx"); + // tdf#137765 The "rotation" (in style attribute) was not handled correctly for VML line shapes. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // it was 1.55pt,279.5pt + assertXPath(pXmlDoc, + "/w:document/w:body/w:p[3]/w:r/mc:AlternateContent/mc:Fallback/w:pict/v:line"_ostr, + "from"_ostr, + "-9pt,296.75pt"); + // it was 25.5pt,317.8pt + assertXPath(pXmlDoc, + "/w:document/w:body/w:p[3]/w:r/mc:AlternateContent/mc:Fallback/w:pict/v:line"_ostr, + "to"_ostr, + "36.05pt,300.55pt"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx new file mode 100644 index 0000000000..96e7e6bae0 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx @@ -0,0 +1,1065 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testTdf123621) +{ + loadAndSave("tdf123621.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/wp:positionV/wp:posOffset"_ostr, "1080135"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf131540) +{ + loadAndReload("tdf131540.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // There are 2 OLEs test if one of them moved on save: + CPPUNIT_ASSERT_EQUAL_MESSAGE("The shape1 moved on saving!", text::RelOrientation::PAGE_FRAME, + getProperty(getShape(1), "HoriOrientRelation")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The shape2 moved on saving!", text::RelOrientation::PAGE_FRAME, + getProperty(getShape(2), "HoriOrientRelation")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf131801, "tdf131801.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + xmlDocUniquePtr pDump = parseLayoutDump(); + // "1." is red + CPPUNIT_ASSERT_EQUAL(OUString("1."), getXPath(pDump, "//page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("00ff0000"), getXPath(pDump, "//page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, "color"_ostr)); + // "2." is red + CPPUNIT_ASSERT_EQUAL(OUString("2."), getXPath(pDump, "//page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("00ff0000"), getXPath(pDump, "//page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, "color"_ostr)); + // "3." is black + CPPUNIT_ASSERT_EQUAL(OUString("3."), getXPath(pDump, "//page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("ffffffff"), getXPath(pDump, "//page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, "color"_ostr)); + // "4." is black + CPPUNIT_ASSERT_EQUAL(OUString("4."), getXPath(pDump, "//page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("ffffffff"), getXPath(pDump, "//page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, "color"_ostr)); + // "5." is red + CPPUNIT_ASSERT_EQUAL(OUString("5."), getXPath(pDump, "//page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("00ff0000"), getXPath(pDump, "//page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, "color"_ostr)); + // "6." is red + CPPUNIT_ASSERT_EQUAL(OUString("6."), getXPath(pDump, "//page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("00ff0000"), getXPath(pDump, "//page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, "color"_ostr)); + // "7." is black + CPPUNIT_ASSERT_EQUAL(OUString("7."), getXPath(pDump, "//page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("ffffffff"), getXPath(pDump, "//page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwFieldPortion/SwFont"_ostr, "color"_ostr)); + // "8." is black + CPPUNIT_ASSERT_EQUAL(OUString("8."), getXPath(pDump, "//page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwFieldPortion[1]"_ostr, "expand"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("ffffffff"), getXPath(pDump, "//page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwFieldPortion[1]/SwFont"_ostr, "color"_ostr)); + + if (!isExported()) + return; + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:rStyle"_ostr, + "val"_ostr, "Emphasis"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:rStyle"_ostr, + "val"_ostr, "Emphasis"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[3]/w:pPr/w:rPr/w:rStyle"_ostr, 0); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[4]/w:pPr/w:rPr/w:rStyle"_ostr, 0); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[5]/w:pPr/w:rPr/w:rStyle"_ostr, + "val"_ostr, "Emphasis"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[5]/w:pPr/w:rPr/w:sz"_ostr, + "val"_ostr, "32"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[6]/w:pPr/w:rPr/w:rStyle"_ostr, + "val"_ostr, "Emphasis"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[6]/w:pPr/w:rPr/w:sz"_ostr, + "val"_ostr, "32"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[7]/w:pPr/w:rPr/w:rStyle"_ostr, 0); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[8]/w:pPr/w:rPr/w:rStyle"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133334_followPgStyle) +{ + loadAndReload("tdf133334_followPgStyle.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf137850_compat14ZOrder, "tdf137850_compat14ZOrder.docx") +{ + // The file contains 2 shapes which have a different value of behindDoc. + // Test that the textbox is hidden behind the arrow (for Word <= 2010/compatibilityMode==14) + uno::Reference xShape(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2015"), xShape->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Textbox is in the background", false, getProperty(xShape, "Opaque")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf137850_compat15ZOrder, "tdf137850_compat15ZOrder.docx") +{ + // The file contains 2 shapes which have a different value of behindDoc. + // Test that the textbox is not hidden behind the arrow (for Word >= 2013/compatibilityMode==15) + uno::Reference xShape(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2015"), xShape->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Textbox is in the foreground", true, getProperty(xShape, "Opaque")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf118701) +{ + loadAndSave("tdf118701.docx"); + // This was 6, related to moving inline images after the page breaks + CPPUNIT_ASSERT_EQUAL(4, getPages()); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr[1]/w:numPr"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr[1]/w:numPr"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr[1]/w:numPr"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:pPr[1]/w:numPr"_ostr, 1); + + // Keep numbering of the paragraph of the inline image + assertXPath(pXmlDoc, "/w:document/w:body/w:p[8]/w:pPr[1]/w:numPr"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[9]/w:pPr[1]/w:numPr"_ostr, 1); + // This was 0 + assertXPath(pXmlDoc, "/w:document/w:body/w:p[10]/w:pPr[1]/w:numPr"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123388, "tdf123388.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Tests new cell formula PRODUCT + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("PRODUCT()"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("640"), xEnumerationAccess1->getPresentation(false).trim()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123381, "tdf123381.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("INT(5.65)"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("5"), xEnumerationAccess1->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("INT()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("6"), xEnumerationAccess2->getPresentation(false).trim()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123401) +{ + loadAndReload("tdf123401.fodt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Tests new cell formula AVERAGE + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("3"), xEnumerationAccess1->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("3"), xEnumerationAccess2->getPresentation(false).trim()); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // MEAN converted to AVERAGE + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc/w:p/w:r[2]/w:instrText"_ostr, " =AVERAGE(A1:A2)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc/w:p/w:r[2]/w:instrText"_ostr, " =AVERAGE(A1:A3)"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf116394, "tdf116394.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + uno::Reference xEnumerationAccess(xFields->nextElement(), uno::UNO_QUERY); + + // Without the fix in place, this test would have failed with + // - Expected: ab=cd.. + // - Actual : abcd.. + CPPUNIT_ASSERT_EQUAL(OUString("ab=cd.."), xEnumerationAccess->getPresentation(true).trim()); + + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:r[2]/w:instrText"_ostr, " MERGEFIELD ab=cd "); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123356) +{ + loadAndReload("tdf123356.fodt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Tests new cell formula COUNT + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("COUNT()"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xEnumerationAccess1->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("COUNT()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("4"), xEnumerationAccess2->getPresentation(false).trim()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136404) +{ + loadAndReload("tdf136404.fodt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Ignore empty cells or cells with text content with new interoperability functions COUNT, AVERAGE and PRODUCT + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("COUNT()"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("2"), xEnumerationAccess1->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess2->getPresentation(true).trim()); + // This was 0 + CPPUNIT_ASSERT_EQUAL(OUString("** Expression is faulty **"), xEnumerationAccess2->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess3(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess3->getPresentation(true).trim()); + // This was 0 + CPPUNIT_ASSERT_EQUAL(OUString("** Expression is faulty **"), xEnumerationAccess3->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess4(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("COUNT()"), xEnumerationAccess4->getPresentation(true).trim()); + // This was 2 + CPPUNIT_ASSERT_EQUAL(OUString("0"), xEnumerationAccess4->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess5(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("COUNT()"), xEnumerationAccess5->getPresentation(true).trim()); + // This was 1 + CPPUNIT_ASSERT_EQUAL(OUString("0"), xEnumerationAccess5->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess6(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("PRODUCT()"), xEnumerationAccess6->getPresentation(true).trim()); + // This was 0 + CPPUNIT_ASSERT_EQUAL(OUString("60"), xEnumerationAccess6->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess7(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess7->getPresentation(true).trim()); + // This was 2 + CPPUNIT_ASSERT_EQUAL(OUString("8"), xEnumerationAccess7->getPresentation(false).trim()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf138739, "tdf138739.docx") +{ + uno::Reference xParaProps(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Font type name does not match!", OUString("Comic Sans MS"), + xParaProps->getPropertyValue("CharFontName").get()); + + // tdf#148565: text at anchor point should be bold, Comic Sans MS font + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(getRun(getParagraph(5), 3), "CharWeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123390) +{ + loadAndReload("tdf123390.fodt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Tests new cell formula SIGN + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("SIGN()"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("-1"), xEnumerationAccess1->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("SIGN()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xEnumerationAccess2->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess3(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("SIGN()"), xEnumerationAccess3->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("0"), xEnumerationAccess3->getPresentation(false).trim()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123354) +{ + loadAndReload("tdf123354.fodt"); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Tests new cell formula SIGN + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ABS()"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("10"), xEnumerationAccess1->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ABS()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("10"), xEnumerationAccess2->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess3(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("ABS()"), xEnumerationAccess3->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("0"), xEnumerationAccess3->getPresentation(false).trim()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123355, "tdf123355.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Tests conversion of range IDs ABOVE, BELOW, LEFT and RIGHT + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + // Note: range ends at B4 here, which is a cell with text content + CPPUNIT_ASSERT_EQUAL(OUString("average( )"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("5,5"), xEnumerationAccess1->getPresentation(false).trim()); + + // range ends at the end of the empty cells + uno::Reference xEnumerationAccess6(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("SUM()"), xEnumerationAccess6->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("0"), xEnumerationAccess6->getPresentation(false).trim()); + + // range starts at the first cell above D5 + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("5,33"), xEnumerationAccess2->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess3(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess3->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("3,5"), xEnumerationAccess3->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess4(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess4->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("5"), xEnumerationAccess4->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess5(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AVERAGE()"), xEnumerationAccess5->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("4"), xEnumerationAccess5->getPresentation(false).trim()); + + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // keep original formula IDs + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =average( below )"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =AVERAGE(LEFT)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:p/w:r[2]/w:instrText"_ostr, " =AVERAGE(RIGHT)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[3]/w:p/w:r[2]/w:instrText"_ostr, " =AVERAGE(ABOVE)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[5]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =AVERAGE(ABOVE)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[6]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =SUM(LEFT)"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123382, "tdf123382.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // Tests conversion of range IDs ABOVE, BELOW, LEFT and RIGHT + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + // Note: range ends at B4 here, which is a cell with text content + CPPUNIT_ASSERT_EQUAL(OUString("MAX()"), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("12"), xEnumerationAccess1->getPresentation(false).trim()); + + // range ends at the end of the empty cells + uno::Reference xEnumerationAccess6(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("MAX()"), xEnumerationAccess6->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("9"), xEnumerationAccess6->getPresentation(false).trim()); + + // range starts at the first cell above D5 + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("SUM()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("30"), xEnumerationAccess2->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess3(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("MAX()"), xEnumerationAccess3->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("7"), xEnumerationAccess3->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess4(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("MAX()"), xEnumerationAccess4->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("7"), xEnumerationAccess4->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess5(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("MAX()"), xEnumerationAccess5->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("12"), xEnumerationAccess5->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess7(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("MAX()"), xEnumerationAccess7->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("10"), xEnumerationAccess7->getPresentation(false).trim()); + + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // keep original formula IDs + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:p/w:r[2]/w:instrText"_ostr, " =MAX(RIGHT)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:p/w:r[2]/w:instrText"_ostr, " =MAX(RIGHT)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[1]/w:p/w:r[2]/w:instrText"_ostr, " =SUM(RIGHT)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =MAX(BELOW)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =MAX(RIGHT)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =MAX(BELOW)"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[4]/w:p/w:r[2]/w:instrText"_ostr, " =MAX(LEFT)"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf122648, "tdf122648.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + // table formula conversion worked only in the first table + uno::Reference xEnumerationAccess1(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), xEnumerationAccess1->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xEnumerationAccess1->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess2(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("SUM()"), xEnumerationAccess2->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("2"), xEnumerationAccess2->getPresentation(false).trim()); + + // These were and SUM() with zero values + uno::Reference xEnumerationAccess3(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), xEnumerationAccess3->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xEnumerationAccess3->getPresentation(false).trim()); + + uno::Reference xEnumerationAccess4(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("SUM()"), xEnumerationAccess4->getPresentation(true).trim()); + CPPUNIT_ASSERT_EQUAL(OUString("2"), xEnumerationAccess4->getPresentation(false).trim()); + + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tr[1]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =A1"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tr[2]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =SUM(A1:B1)"); + // These were = and =SUM() + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl[2]/w:tr[1]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =A1"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:tbl[2]/w:tr[2]/w:tc[2]/w:p/w:r[2]/w:instrText"_ostr, " =SUM(A1:B1)"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf98000_changePageStyle) +{ + loadAndReload("tdf98000_changePageStyle.odt"); + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTextViewCursorSupplier(xModel->getCurrentController(), uno::UNO_QUERY); + + uno::Reference xCursor(xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY_THROW); + OUString sPageOneStyle = getProperty( xCursor, "PageStyleName" ); + + xCursor->jumpToNextPage(); + OUString sPageTwoStyle = getProperty( xCursor, "PageStyleName" ); + CPPUNIT_ASSERT_MESSAGE("Different page1/page2 styles", sPageOneStyle != sPageTwoStyle); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf145998_unnecessaryPageStyles) +{ + loadAndReload("tdf145998_unnecessaryPageStyles.odt"); + + // Sanity check - always good to test when dealing with page styles and breaks. + CPPUNIT_ASSERT_EQUAL(5, getPages()); + + // Page Style should be explicitly mentioned - otherwise it would be a "follow" style + uno::Reference xPara(getParagraph(2, "2"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(uno::Any() != xPara->getPropertyValue("PageDescName")); + // CPPUNIT_ASSERT_EQUAL(OUString("First Page header"), + // parseDump("/root/page[2]/header/txt")); + + // Page Style is converted into a page break instead. Still shows "first" header. + xPara.set(getParagraph(3, "3"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xPara->getPropertyValue("PageDescName")); + // CPPUNIT_ASSERT_EQUAL(OUString("Default page style - first page style"), + // parseDump("/root/page[3]/header/txt")); + CPPUNIT_ASSERT_EQUAL(OUString(), parseDump("/root/page[3]/footer/txt"_ostr)); + + // Page Style is converted into a page break instead. Shows the "normal" header. + xPara.set(getParagraph(5, "4"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xPara->getPropertyValue("PageDescName")); + CPPUNIT_ASSERT_EQUAL(OUString("Default page style"), + parseDump("/root/page[4]/header/txt"_ostr)); + + // Page Style is retained (with wrong header) in order to preserve page re-numbering. + xPara.set(getParagraph(7, "1"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT(uno::Any() != xPara->getPropertyValue("PageDescName")); + CPPUNIT_ASSERT_EQUAL(OUString(), parseDump("/root/page[5]/footer/txt"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136929_framesOfParagraph) +{ + loadAndReload("tdf136929_framesOfParagraph.odt"); + // Before this fix, the image was placed in the footer instead of in the text body - messing everything up. + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of Pages", 5, getPages() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Header2 text", OUString("* | *"), parseDump("/root/page[4]/footer/txt"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf136589_paraHadField, "tdf136589_paraHadField.docx") +{ + // The section break should not add an additional CR - which equals an empty page two. + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + //tdf#118711 - don't explicitly specify the default page style at the beginning of the document + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xPara->getPropertyValue("PageDescName")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133370_columnBreak) +{ + loadAndReload("tdf133370_columnBreak.odt"); + // Since non-DOCX formats ignores column breaks in non-column situations, don't export to docx. + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134649_pageBreak) +{ + loadAndReload("tdf134649_pageBreak.fodt"); + // This was 1 (missing page break between tables). + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135343_columnSectionBreak_c14, "tdf135343_columnSectionBreak_c14.docx") +{ + uno::Reference xTextSection = getProperty>(getParagraph(1), "TextSection"); + uno::Reference xTextColumns = getProperty>(xTextSection, "TextColumns"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section one's columns", sal_Int16(2), xTextColumns->getColumnCount()); + + // Old Word 2010 version - nextColumn breaks inside column sections are just treated as regular column breaks. + //xTextSection = getProperty>(getParagraph(12, "RTL 2"), "TextSection"); + //xTextColumns = getProperty>(xTextSection, "TextColumns"); + //CPPUNIT_ASSERT_EQUAL_MESSAGE("Section four's columns", sal_Int16(3), xTextColumns->getColumnCount()); + //CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135973) +{ + loadAndReload("tdf135973.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + { + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2."), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2."), getProperty(xPara, "ListLabelString")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135343_columnSectionBreak_c14v2, "tdf135343_columnSectionBreak_c14v2.docx") +{ + // In this Word 2010 v2, section three was changed to start with a nextColumn break instead of a continuous break. + // The previous section has no columns, so this time start the columns on a new page. + uno::Reference xTextSection = getProperty>(getParagraph(10, ""), "TextSection"); + uno::Reference xTextColumns = getProperty>(xTextSection, "TextColumns"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section three's columns", sal_Int16(3), xTextColumns->getColumnCount()); + //CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135343_columnSectionBreak_c12v3, "tdf135343_columnSectionBreak_c12v3.docx") +{ + // In this Word 20-3 v3, section one and two have different number of columns. It acts like a page break. + uno::Reference xTextSection = getProperty>(getParagraph(1, "Four columns,"), "TextSection"); + uno::Reference xTextColumns = getProperty>(xTextSection, "TextColumns"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section one's columns", sal_Int16(4), xTextColumns->getColumnCount()); + + xTextSection = getProperty>(getParagraph(6, "RTL 2"), "TextSection"); + xTextColumns = getProperty>(xTextSection, "TextColumns"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section two's columns", sal_Int16(2), xTextColumns->getColumnCount()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135343_columnSectionBreak_c15, "tdf135343_columnSectionBreak_c15.docx") +{ + // Word 2013+ version - nextColumn breaks inside column sections are always handled like nextPage breaks. + uno::Reference xTextSection = getProperty>(getParagraph(12, "RTL 2"), "TextSection"); + uno::Reference xTextColumns = getProperty>(xTextSection, "TextColumns"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section four's columns", sal_Int16(3), xTextColumns->getColumnCount()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Fits on two pages", 2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf121669_equalColumns, "tdf121669_equalColumns.docx") +{ + uno::Reference xTextSection = getProperty< uno::Reference >(getParagraph(1), "TextSection"); + CPPUNIT_ASSERT(xTextSection.is()); + uno::Reference xTextColumns = getProperty< uno::Reference >(xTextSection, "TextColumns"); + // The property was ignored when deciding at export whether the columns were equal or not. Layout isn't reliable. + CPPUNIT_ASSERT(getProperty(xTextColumns, "IsAutomatic")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf132149_pgBreak) +{ + loadAndReload("tdf132149_pgBreak.odt"); + // This 5 page document is designed to visually exaggerate the problems + // of emulating LO's followed-by-page-style into MSWord's sections. + // While much has been improved, there are extra pages present, which still need fixing. + xmlDocUniquePtr pDump = parseLayoutDump(); + + // No header on pages 1,2,3. + assertXPath(pDump, "//page[2]/header"_ostr, 0); + + // Margins/page orientation between Right and Left page styles are different + assertXPath(pDump, "//page[1]/infos/prtBounds"_ostr, "left"_ostr, "1134"); //Right page style + assertXPath(pDump, "//page[2]/infos/prtBounds"_ostr, "left"_ostr, "2268"); //Left page style + + assertXPath(pDump, "//page[1]/infos/bounds"_ostr, "width"_ostr, "8391"); //landscape + assertXPath(pDump, "//page[2]/infos/bounds"_ostr, "width"_ostr, "5940"); //portrait + // This two-line 3rd page ought not to exist. DID YOU FIX ME? The real page 3 should be "8391" landscape. + assertXPath(pDump, "//page[3]/infos/bounds"_ostr, "width"_ostr, "5940"); + // This really ought to be on odd page 3, but now it is on odd page 5. + assertXPath(pDump, "//page[5]/infos/bounds"_ostr, "width"_ostr, "8391"); + assertXPath(pDump, "//page[5]/infos/prtBounds"_ostr, "right"_ostr, "6122"); //Left page style + + + //Page style change here must not be lost. This SHOULD be on page 4, but sadly it is not. + assertXPathContent(pDump, "//page[6]/header/txt"_ostr, "First Page Style"); + CPPUNIT_ASSERT(getXPathContent(pDump, "//page[6]/body/txt[1]"_ostr).startsWith("Lorem ipsum")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf132149_pgBreakB) +{ + loadAndReload("tdf132149_pgBreakB.odt"); + // This 5 page document is designed to visually exaggerate the problems + // of emulating LO's followed-by-page-style into MSWord's sections. + xmlDocUniquePtr pDump = parseLayoutDump(); + + //Sanity check to ensure the correct page is being tested. This SHOULD be on page 3, but sadly it is not. + CPPUNIT_ASSERT(getXPathContent(pDump, "//page[5]/body/txt[1]"_ostr).startsWith("Lorem ipsum")); + //Prior to this fix, the original alternation between portrait and landscape was completely lost. + assertXPath(pDump, "//page[5]/infos/bounds"_ostr, "width"_ostr, "8391"); //landscape +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf132149_pgBreak2) +{ + loadAndReload("tdf132149_pgBreak2.odt"); + // This 3 page document is designed to visually exaggerate the problems + // of emulating LO's followed-by-page-style into MSWord's sections. + + // The only specified page style change should be between page 1 and 2. + // When the first paragraph was split into 3, each paragraph specified a page break. The last was unnecessary. + uno::Reference xParaThree(getParagraph(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xParaThree->getPropertyValue("PageDescName")); + // The ODT is only 2 paragraphs, but a hack to get the right page style breaks para1 into pieces. + // This was 4 paragraphs - the unnecessary page break had hacked in another paragraph split. + CPPUNIT_ASSERT_LESSEQUAL( 3, getParagraphs() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136952_pgBreak3B) +{ + loadAndReload("tdf136952_pgBreak3B.odt"); + // This 4 page document is designed to visually exaggerate the problems + // of emulating LO's followed-by-page-style into MSWord's sections. + xmlDocUniquePtr pDump = parseLayoutDump(); + + //page::breakAfter must not be lost. + //Prior to this bug fix, the Lorem ipsum paragraph was in the middle of a portrait page, with no switch to landscape occurring. + CPPUNIT_ASSERT(getXPathContent(pDump, "//page[3]/body/txt[1]"_ostr).startsWith("Lorem ipsum")); + assertXPath(pDump, "//page[3]/infos/bounds"_ostr, "width"_ostr, "8391"); //landscape +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135949_anchoredBeforeBreak, "tdf135949_anchoredBeforeBreak.docx") +{ + xmlDocUniquePtr pDump = parseLayoutDump(); + //The picture was shown on page 2, because the empty paragraph before the page break was removed + assertXPath(pDump, "//page[1]/body/txt/anchored/fly"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf129452_excessBorder, "tdf129452_excessBorder.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY_THROW); + + // The outside border should not be applied on inside cells. The merge doesn't extend to the table bottom. + // [Note: as humans, we would call this cell D3, but since row 4 hasn't been analyzed yet, it is considered column C.] + table::BorderLine2 aBorder = getProperty(xTable->getCellByName("C3"), "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("No bottom border on merged cell", sal_uInt32(0), aBorder.LineWidth); + + // [Note: as humans, we would call this cell C3, but since row 4 hasn't been analyzed yet, it is considered column B.] + aBorder = getProperty(xTable->getCellByName("B3"), "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("No bottom border on merged cell", sal_uInt32(0), aBorder.LineWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf132898_missingBorder, "tdf132898_missingBorder.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // The bottom border from the last merged cell was not showing + table::BorderLine2 aBorder = getProperty(xTable->getCellByName("A1"), "BottomBorder"); + CPPUNIT_ASSERT_MESSAGE("Bottom border on merged cell", aBorder.LineWidth > 0); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf132898_extraBorder, "tdf132898_extraBorder.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // A border defined on an earlier merged cell was showing + table::BorderLine2 aBorder = getProperty(xTable->getCellByName("C1"), "BottomBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("No bottom border on merged cell", sal_uInt32(0), aBorder.LineWidth); + // MS Word is interesting here. 2/3 of the merged cell has the right border, so what to do? + aBorder = getProperty(xTable->getCellByName("C1"), "RightBorder"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("No right border on merged cell", sal_uInt32(0), aBorder.LineWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf131561_necessaryBorder, "tdf131561_necessaryBorder.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // Hand-crafted pre-emptive test to make sure borders aren't lost. + // MS Word is interesting here. 2/3 of the merged cell has the right border, so what to do? + table::BorderLine2 aBorderR = getProperty(xTable->getCellByName("A1"), "RightBorder"); + table::BorderLine2 aBorderL = getProperty(xTable->getCellByName("B1"), "LeftBorder"); + CPPUNIT_ASSERT_MESSAGE("Border between A1 and B1", (aBorderR.LineWidth + aBorderL.LineWidth) > 0); + aBorderR = getProperty(xTable->getCellByName("A3"), "RightBorder"); + aBorderL = getProperty(xTable->getCellByName("B3"), "LeftBorder"); + CPPUNIT_ASSERT_MESSAGE("Border between A3 and B3", (aBorderR.LineWidth + aBorderL.LineWidth) > 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135655) +{ + loadAndSave("tdf135655.odt"); + const xmlDocUniquePtr pExpDoc = parseExport("word/document.xml"); + const OUString sXFillColVal = getXPath(pExpDoc, "/w:document/w:body/w:p/w:r/w:object/v:shape"_ostr, "fillcolor"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("#00A933"), sXFillColVal); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138374) +{ + loadAndSave("tdf138374.odt"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:pict/v:shape"_ostr, "fillcolor"_ostr, "#ffd320"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:pict/v:shape"_ostr, "coordsize"_ostr, "1315,6116"); + if (IsDefaultDPI()) + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:pict/v:shape"_ostr, "path"_ostr, + "m0,0l1314,0l1314,5914l416,5914l416,6115l106,5715l416,5415l416,5715l1014,5715l1014,224l0,224l0,16l0,0e"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:pict/v:shape"_ostr, "style"_ostr, + "position:absolute;margin-left:394.3pt;margin-top:204pt;width:37.2pt;height:173.3pt;mso-wrap-style:none;v-text-anchor:middle"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf134609_gridAfter, "tdf134609_gridAfter.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // Table borders (width 159) apply to edge cells, even in uneven cases caused by gridBefore/gridAfter, + table::BorderLine2 aBorder = getProperty(xTable->getCellByName("A1"), "RightBorder"); + CPPUNIT_ASSERT_MESSAGE("Right border before gridAfter cells", aBorder.LineWidth > 0); + aBorder = getProperty(xTable->getCellByName("E2"), "LeftBorder"); + CPPUNIT_ASSERT_MESSAGE("Left edge border after gridBefore cells", aBorder.LineWidth > 100); + aBorder = getProperty(xTable->getCellByName("E2"), "TopBorder"); + // but only for left/right borders, not top and bottom. + // So somewhat inconsistently, gridBefore/After affects outside edges of columns, but not of rows. + // insideH borders are width 53. (no insideV borders defined to emphasize missing edge borders) + CPPUNIT_ASSERT_MESSAGE("Top border on 'inside' cell", aBorder.LineWidth > 0); + CPPUNIT_ASSERT_MESSAGE("Top border is not an edge border", aBorder.LineWidth < 100); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135329_lostImage) +{ + loadAndReload("tdf135329_lostImage.odt"); + // the character-anchored image was being skipped, since searchNext didn't notice it. + uno::Reference xImageProps(getShape(2), uno::UNO_QUERY_THROW); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136441_commentInFootnote) +{ + loadAndReload("tdf136441_commentInFootnote.odt"); + // failed to load without error if footnote contained a comment. + // (MS Word's UI doesn't allow adding comments to a footnote.) +} + +DECLARE_OOXMLEXPORT_TEST(testTdf137683_charHighlightTests, "tdf137683_charHighlightTests.docx") +{ + // Don't export unnecessary w:highlight="none" (Unnecessary one intentionally hand-added to original .docx) + if (isExported()) + { + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Normal']/w:rPr/w:highlight"_ostr, 0); + } + + uno::Reference xRun(getRun(getParagraph(10), 2, "no highlight"), uno::UNO_QUERY_THROW); + // This test was failing with a cyan charHighlight of 65535 (0x00FFFF), instead of COL_TRANSPARENT (0xFFFFFFFF) + CPPUNIT_ASSERT_EQUAL(static_cast(COL_AUTO), getProperty(xRun, "CharHighlight")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf138345_charStyleHighlight, "tdf138345_charStyleHighlight.docx") +{ + // MS Word ignores the w:highlight setting in character styles. So shall we. + // Without the fix, there would be an orange or yellow background on some words. + const uno::Reference xRun(getRun(getParagraph(1), 2, "orange background"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(COL_TRANSPARENT), getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL(static_cast(COL_TRANSPARENT), getProperty(xRun,"CharBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125268) +{ + loadAndReload("tdf125268.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + const uno::Reference xRun(getRun(getParagraph(1), 1, "Hello"), uno::UNO_QUERY); + // Without the fix in place, this test would have failed with + // - Expected: -1 + // - Actual : 0 + CPPUNIT_ASSERT_EQUAL(static_cast(COL_TRANSPARENT), getProperty(xRun,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL(static_cast(COL_BLACK), getProperty(xRun,"CharBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138345_numberingHighlight) +{ + loadAndSave("tdf138345_numberingHighlight.docx"); + // Before the fix, the highlight was completely lost. + xmlDocUniquePtr pXmlStyles = parseExport("word/numbering.xml"); + if (pXmlStyles) + assertXPath(pXmlStyles, "/w:numbering/w:abstractNum[@w:abstractNumId='1']/w:lvl[@w:ilvl='0']/w:rPr/w:highlight"_ostr, "val"_ostr, "red"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf134063, "tdf134063.docx") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + xmlDocUniquePtr pDump = parseLayoutDump(); + + // There are three tabs with default width + CPPUNIT_ASSERT_EQUAL(sal_Int32(720), getXPath(pDump, "//page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFixPortion[1]"_ostr, "width"_ostr).toInt32()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(720), getXPath(pDump, "//page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFixPortion[2]"_ostr, "width"_ostr).toInt32()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(720), getXPath(pDump, "//page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwFixPortion[3]"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_OOXMLEXPORT_TEST(TestTdf135653, "tdf135653.docx") +{ + uno::Reference xOLEProps(getShape(1), uno::UNO_QUERY_THROW); + drawing::FillStyle nFillStyle = static_cast(-1); + xOLEProps->getPropertyValue("FillStyle") >>= nFillStyle; + Color aFillColor(COL_AUTO); + xOLEProps->getPropertyValue("FillColor") >>= aFillColor; + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Fill style setting does not match!", + drawing::FillStyle::FillStyle_SOLID, nFillStyle); + Color aExpectedColor; + aExpectedColor.SetRed(255); + aExpectedColor.SetGreen(0); + aExpectedColor.SetBlue(0); + CPPUNIT_ASSERT_EQUAL_MESSAGE("OLE bg color does not match!", aExpectedColor, aFillColor); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135665, "tdf135665.docx") +{ + uno::Reference xOLEProps1(getShape(1), uno::UNO_QUERY_THROW); + uno::Reference xOLEProps2(getShape(2), uno::UNO_QUERY_THROW); + bool bSurroundContour1 = false; + bool bSurroundContour2 = false; + xOLEProps1->getPropertyValue("SurroundContour") >>= bSurroundContour1; + xOLEProps2->getPropertyValue("SurroundContour") >>= bSurroundContour2; + + CPPUNIT_ASSERT_EQUAL_MESSAGE("OLE tight wrap setting not imported correctly", true, bSurroundContour1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("OLE tight wrap setting not imported correctly", false, bSurroundContour2); +} + +CPPUNIT_TEST_FIXTURE(Test, testAtPageShapeRelOrientation) +{ + loadAndSave("rotated_shape.fodt"); + // invalid combination of at-page anchor and horizontal-rel="paragraph" + // caused relativeFrom="column" instead of relativeFrom="page" + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Choice/w:drawing/wp:anchor" + "/wp:positionH/wp:posOffset"_ostr, "-480060"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Choice/w:drawing/wp:anchor" + "/wp:positionH"_ostr, "relativeFrom"_ostr, "page"); + assertXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Choice/w:drawing/wp:anchor" + "/wp:positionV/wp:posOffset"_ostr, "8147685"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Choice/w:drawing/wp:anchor" + "/wp:positionV"_ostr, "relativeFrom"_ostr, "page"); + + // same for sw + assertXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/w:drawing/wp:anchor" + "/wp:positionH/wp:posOffset"_ostr, "720090"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/w:drawing/wp:anchor" + "/wp:positionH"_ostr, "relativeFrom"_ostr, "page"); + assertXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/w:drawing/wp:anchor" + "/wp:positionV/wp:posOffset"_ostr, "1080135"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/w:drawing/wp:anchor" + "/wp:positionV"_ostr, "relativeFrom"_ostr, "page"); + + // now test text rotation -> VML writing direction + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Fallback/w:pict/v:shape/v:textbox"_ostr, "style"_ostr, "mso-layout-flow-alt:bottom-to-top"); + // text wrap -> VML + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Fallback/w:pict/v:shape/w10:wrap"_ostr, "type"_ostr, "none"); + // vertical alignment -> VML + OUString const style = getXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Fallback/w:pict/v:shape"_ostr, "style"_ostr); + CPPUNIT_ASSERT(style.indexOf("v-text-anchor:middle") != -1); +} + +CPPUNIT_TEST_FIXTURE(Test, testVMLallowincell) +{ + loadAndSave("shape-atpage-in-table.fodt"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // VML o:allowincell, apparently the default is "t" + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl[1]/w:tr[1]/w:tc[1]/w:p[1]/w:r/mc:AlternateContent[1]/mc:Fallback/w:pict/v:shape"_ostr, "allowincell"_ostr, "f"); + + // DML layoutInCell + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl[1]/w:tr[1]/w:tc[1]/w:p[1]/w:r/mc:AlternateContent[1]/mc:Choice/w:drawing/wp:anchor"_ostr, "layoutInCell"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testRelativeAnchorHeightFromBottomMarginHasFooter) +{ + loadAndSave("tdf133070_testRelativeAnchorHeightFromBottomMarginHasFooter.docx"); + // tdf#133070 The height was set relative to page print area bottom, + // but this was handled relative to page height. + // Note: page print area bottom = margin + footer height. + // In this case the footer exists. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "height"_ostr, "1147"); +} + +DECLARE_OOXMLEXPORT_TEST(TestTdf132483, "tdf132483.docx") +{ + uno::Reference xOLEProps(getShape(1), uno::UNO_QUERY_THROW); + sal_Int16 nVRelPos = -1; + sal_Int16 nHRelPos = -1; + xOLEProps->getPropertyValue("VertOrientRelation") >>= nVRelPos; + xOLEProps->getPropertyValue("HoriOrientRelation") >>= nHRelPos; + CPPUNIT_ASSERT_EQUAL_MESSAGE("The OLE is shifted vertically", + text::RelOrientation::PAGE_FRAME , nVRelPos); + CPPUNIT_ASSERT_EQUAL_MESSAGE("The OLE is shifted horizontally", + text::RelOrientation::PAGE_FRAME , nHRelPos); +} + +CPPUNIT_TEST_FIXTURE(Test, TestTdf143028) +{ + loadAndSave("fail_bracePair.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto pExportXml = parseExport("word/document.xml"); + + assertXPath(pExportXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/" + "a:graphic/a:graphicData/wps:wsp/wps:spPr/a:xfrm"_ostr); + +} + +CPPUNIT_TEST_FIXTURE(Test, testRelativeAnchorHeightFromBottomMarginNoFooter) +{ + loadAndSave("tdf133070_testRelativeAnchorHeightFromBottomMarginNoFooter.docx"); + // tdf#133070 The height was set relative to page print area bottom, + // but this was handled relative to page height. + // Note: page print area bottom = margin + footer height. + // In this case the footer does not exist, so OpenDocument and OOXML margins are the same. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "height"_ostr, "1147"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133702) +{ + loadAndSave("tdf133702.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135667) +{ + loadAndSave("tdf135667.odt"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // This was missing. + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:object/v:shapetype"_ostr); + + // line settings + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:object/v:shape"_ostr, "stroked"_ostr, "t"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:object/v:shape"_ostr, "strokecolor"_ostr, "#FF0000"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:object/v:shape"_ostr, "strokeweight"_ostr, "4pt"); + + // line type + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:object/v:shape/v:stroke"_ostr, "linestyle"_ostr, "Single"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:r/w:object/v:shape/v:stroke"_ostr, "dashstyle"_ostr, "Dash"); +} + +CPPUNIT_TEST_FIXTURE(Test, testImageSpaceSettings) +{ + loadAndSave("tdf135047_ImageSpaceSettings.fodt"); + // tdf#135047 The spaces of image were not saved. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:drawing/wp:anchor"_ostr, "distT"_ostr, "90170"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:drawing/wp:anchor"_ostr, "distB"_ostr, "90170"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:drawing/wp:anchor"_ostr, "distL"_ostr, "90170"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:drawing/wp:anchor"_ostr, "distR"_ostr, "90170"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf137295) +{ + loadAndReload("tdf137295.doc"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // Without the fix in place, the test would have failed with + // - Expected: 2 + // - Actual : 1 + CPPUNIT_ASSERT_EQUAL(2, getShapes()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135660, "tdf135660.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + const uno::Reference xShape = getShape(1); + const uno::Reference xOLEProps(xShape, uno::UNO_QUERY_THROW); + sal_Int32 nWrapDistanceLeft = -1; + sal_Int32 nWrapDistanceRight = -1; + sal_Int32 nWrapDistanceTop = -1; + sal_Int32 nWrapDistanceBottom = -1; + xOLEProps->getPropertyValue("LeftMargin") >>= nWrapDistanceLeft; + xOLEProps->getPropertyValue("RightMargin") >>= nWrapDistanceRight; + xOLEProps->getPropertyValue("TopMargin") >>= nWrapDistanceTop; + xOLEProps->getPropertyValue("BottomMargin") >>= nWrapDistanceBottom; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Left wrap distance is wrong", static_cast(0), nWrapDistanceLeft); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Right wrap distance is wrong", static_cast(400), nWrapDistanceRight); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Top wrap distance is wrong", static_cast(300), nWrapDistanceTop); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bottom wrap distance is wrong", static_cast(199), nWrapDistanceBottom); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136814) +{ + loadAndSave("tdf136814.odt"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // Padding in this document is 0.10 cm which should translate to 3 pt (approx. 1.0583mm) + assertXPath(pXmlDocument, "/w:document/w:body/w:sectPr/w:pgBorders/w:top"_ostr, "space"_ostr, "3"); + assertXPath(pXmlDocument, "/w:document/w:body/w:sectPr/w:pgBorders/w:left"_ostr, "space"_ostr, "3"); + assertXPath(pXmlDocument, "/w:document/w:body/w:sectPr/w:pgBorders/w:bottom"_ostr, "space"_ostr, "3"); + assertXPath(pXmlDocument, "/w:document/w:body/w:sectPr/w:pgBorders/w:right"_ostr, "space"_ostr, "3"); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx new file mode 100644 index 0000000000..dd1b87f147 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx @@ -0,0 +1,1098 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testTdf143860NonPrimitiveCustomShape) +{ + loadAndReload("tdf143860_NonPrimitiveCustomShape.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The document has a custom shape of type non-primitive without handles. Make sure that the shape + // is not exported with preset but with custom geometry. + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDocument); + assertXPath(pXmlDocument, "//a:prstGeom"_ostr, 0); + assertXPath(pXmlDocument, "//a:custGeom"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testWrapPolygonCurve) +{ + loadAndSave("tdf136386_WrapPolygonCurve.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Document has a curve with contour wrap and 'outside only'. Error was, that type 'square' was + // written and no wrap polygon. Make sure we write wrapTight and a wrapPolygon. + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDocument); + assertXPath(pXmlDocument, "//wp:wrapTight"_ostr, 1); + assertXPath(pXmlDocument, "//wp:wrapPolygon"_ostr, 1); + assertXPath(pXmlDocument, "//wp:start"_ostr, 1); + xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDocument, "//wp:lineTo"_ostr); + CPPUNIT_ASSERT_GREATER(sal_Int32(2), + static_cast(xmlXPathNodeSetGetLength(pXmlObj->nodesetval))); + xmlXPathFreeObject(pXmlObj); +} + +CPPUNIT_TEST_FIXTURE(Test, testWrapPolygonLineShape) +{ + loadAndSave("tdf136386_WrapPolygonLineShape.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Document has a sloping line with contour wrap. Error was, that type 'square' was written and + // no wrap polygon. Now we write 'through' and use wrap polygon 0|0, 21600|21600, 0|0. + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDocument); + assertXPath(pXmlDocument, "//wp:wrapThrough"_ostr, 1); + assertXPath(pXmlDocument, "//wp:lineTo"_ostr, 2); + sal_Int32 nYCoord = getXPath(pXmlDocument, "(//wp:lineTo)[1]"_ostr, "y"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(21600), nYCoord); + sal_Int32 nXCoord = getXPath(pXmlDocument, "(//wp:lineTo)[2]"_ostr, "x"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nXCoord); +} + +CPPUNIT_TEST_FIXTURE(Test, testWrapPolygonCustomShape) +{ + loadAndReload("tdf142433_WrapPolygonCustomShape.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Document has 4-point star with contour wrap. Error was, that the enhanced path was written + // literally as wrap polygon. But that does not work, because path might have links to equations + // and handles and not only numbers. + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDocument); + // Expected coordinates are 0|10800, 8936|8936, 10800|0, 12664|8936, 21600|10800, 12664|12664, + // 10800|21600, 8936|12664, 0|10800. Assert forth point, which comes from equations. Allow some + // tolerance. + sal_Int32 nXCoord = getXPath(pXmlDocument, "(//wp:lineTo)[3]"_ostr, "x"_ostr).toInt32(); + // Without fix it would fail with expected 12664, actual 3 + CPPUNIT_ASSERT_DOUBLES_EQUAL(12664, nXCoord, 10); + // Without fix it would fail with expected 8936, actual 4 + sal_Int32 nYCoord = getXPath(pXmlDocument, "(//wp:lineTo)[3]"_ostr, "y"_ostr).toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(8936, nYCoord, 10); +} + +CPPUNIT_TEST_FIXTURE(Test, testFrameWrapTextMode) +{ + loadAndSave("tdf143432_Frame_WrapTextMode.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDocument); + // Without the fix the value "largest" was written to file in both cases. + assertXPath(pXmlDocument, "(//wp:wrapSquare)[1]"_ostr, "wrapText"_ostr, "right"); + assertXPath(pXmlDocument, "(//wp:wrapSquare)[2]"_ostr, "wrapText"_ostr, "left"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134219ContourWrap_glow_rotate) +{ + auto verify = [this]() { + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1461), + getProperty(getShape(1), "LeftMargin"), 2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1302), + getProperty(getShape(1), "RightMargin"), 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1522), + getProperty(getShape(1), "TopMargin"), 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1296), + getProperty(getShape(1), "BottomMargin"), 1); + }; + // Given a document with a shape with contour wrap, that has glow effect and rotation. + createSwDoc("tdf143219ContourWrap_glow_rotate.docx"); + + // Error was, that the margins, which were added on import to approximate Word's rendering of + // contour wrap, contained the effect extent for rotation. But LibreOffice extents the wrap + // distance automatically. The distance was too large on first load and because the extent was + // not removed on export, much larger on reload. + // Test fails on reload without fix with left: expected 1461 actual 2455; right: expected 1302 + // actual 4177; top: expected 1522 actual 2457; bottom: expected 1296, actual 4179 + verify(); + saveAndReload("Office Open XML Text"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134219ContourWrap_stroke_shadow) +{ + auto verify = [this]() { + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(318), + getProperty(getShape(1), "LeftMargin"), 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1164), + getProperty(getShape(1), "RightMargin"), 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(318), + getProperty(getShape(1), "TopMargin"), 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1164), + getProperty(getShape(1), "BottomMargin"), 1); + }; + // Given a document with a shape with contour wrap, that has a fat stroke and large shadow. + createSwDoc("tdf143219ContourWrap_stroke_shadow.docx"); + + // Error was, that the margins, which were added on import to approximate Word's rendering of + // contour wrap, were not removed on export and so used twice on reload. + // Test after reload would fail without fix with + // left, top: expected 318 actual 635; right, bottom: expected 1164 actual 2434 + verify(); + saveAndReload("Office Open XML Text"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf123569_rotWriterImage) +{ + loadAndReload("tdf123569_rotWriterImage_46deg.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + // Error was, that position of logical rectangle was treated as position of snap rectangle. + // Thus a wrong position was calculated. + // Without fix this would have failed with expected 4798, actual 4860 + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(4798), + getProperty(xFrame, "HoriOrientPosition"), 1); + // Without fix this would have failed with expected 1438, actual 4062 + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1438), + getProperty(xFrame, "VertOrientPosition"), 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf142486_LeftMarginShadowLeft, "tdf142486_LeftMarginShadowLeft.docx") +{ + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + // Error was, that the shadow distance appeared as additional margin. + // Without fix this would have failed with expected 953, actual 2822 + // Margin is 36px (= 952.5Hmm) in Word. + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(953), getProperty(xFrame, "LeftMargin"), 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf151384Hyperlink, "151384Hyperlink.odt") +{ + loadAndSave("151384Hyperlink.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:hyperlink/w:r/w:rPr/w:rStyle"_ostr, "val"_ostr, "Hyperlink"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Hyperlink']/w:name"_ostr, "val"_ostr, "Hyperlink"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf66039, "tdf66039.docx") +{ + // This bugdoc has a groupshape (WPG) with a table inside its each member shape. + // Before there was no table after import at all. From now, there must be 2 tables. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + // This was 0 before: + CPPUNIT_ASSERT_EQUAL_MESSAGE("Where are the tables?!", static_cast(2), + xTables->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142486_FrameShadow) +{ + loadAndReload("tdf142486_FrameShadow.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTextViewCursorSupplier( + xModel->getCurrentController(), uno::UNO_QUERY_THROW); + uno::Reference xViewCursor(xTextViewCursorSupplier->getViewCursor()); + xViewCursor->gotoStart(/*bExpand=*/false); + uno::Reference xCursor(xViewCursor, uno::UNO_QUERY); + xCursor->goDown(/*nCount=*/3, /*bExpand=*/false); + xViewCursor->goRight(/*nCount=*/1, /*bExpand=*/true); + OUString sText = xViewCursor->getString(); + // Without fix in place, the frame size including shadow width was exported as object size. On + // import the shadow width was added as wrap "distance from text". That results in totally + // different wrapping of the surrounding text. + // Here line started with "x" instead of expected "e". + CPPUNIT_ASSERT(sText.startsWith("e")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136059) +{ + loadAndReload("tdf136059.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Contour has not been exported!", true, + getProperty(getShape(1), "SurroundContour")); + // With the fix this shall pass, see tdf136059. +} + +DECLARE_OOXMLEXPORT_TEST(testTdf138892_noNumbering, "tdf138892_noNumbering.docx") +{ + CPPUNIT_ASSERT_MESSAGE("Para1: Bullet point", !getProperty(getParagraph(1), "NumberingStyleName").isEmpty()); + CPPUNIT_ASSERT_MESSAGE("Para2: ", getProperty(getParagraph(2), "NumberingStyleName").isEmpty()); + CPPUNIT_ASSERT_MESSAGE("Para3: ", getProperty(getParagraph(3), "NumberingStyleName").isEmpty()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf44278, "tdf44278.docx") +{ + // Without the fix in place, this test would have failed with + // - Expected: 1 + // - Actual : 2 + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf137742, "tdf137742.docx") +{ + lang::Locale locale( + getProperty(getParagraph(1), "CharLocale")); + CPPUNIT_ASSERT_EQUAL(OUString("en"), locale.Language); + + // Without the fix in place, this test would have failed with + // - Expected: US + // - Actual : + CPPUNIT_ASSERT_EQUAL(OUString("US"), locale.Country); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf141231_arabicHebrewNumbering, "tdf141231_arabicHebrewNumbering.docx") +{ + // The page's numbering type: instead of Hebrew, this was default style::NumberingType::ARABIC (4). + auto nActual = getProperty(getStyles("PageStyles")->getByName("Standard"), "NumberingType"); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::NUMBER_HEBREW, nActual); + + // The footnote numbering type: instead of arabicAbjad, this was the default style::NumberingType::ARABIC. + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnoteSettings = xFootnotesSupplier->getFootnoteSettings(); + nActual = getProperty(xFootnotesSupplier->getFootnoteSettings(), "NumberingType"); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::CHARS_ARABIC_ABJAD, nActual); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf141966_chapterNumbering, "tdf141966_chapterNumbering.docx") +{ + uno::Reference xNumberingSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xNumberingRules = xNumberingSupplier->getChapterNumberingRules(); + comphelper::SequenceAsHashMap hashMap(xNumberingRules->getByIndex(0)); + + CPPUNIT_ASSERT(hashMap["HeadingStyleName"].get().match("CN1")); + + uno::Reference xPara(getParagraph(7, "Direct formatting with \"Outline\" numbering."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2nd"), getProperty(xPara, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf141966_chapterNumberTortureTest, "tdf141966_chapterNumberTortureTest.docx") +{ + // There is no point in identifying what the wrong values where in this test, + //because EVERYTHING was wrong, and MANY different fixes are required to solve the problems. + uno::Reference xPara(getParagraph(1, "No numId in style or paragraph"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(2, "Paragraph cancels numbering(0)"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(3, "First numbered line"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1st.i.a.1.I"), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(5, "Outline with listLvl 5"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(7, "inheritOnly: inherit outlineLvl and listLvl."), uno::UNO_QUERY); + // 2nd.iii in MS Word 2003. 2nd.ii in MS Word 2010/2016 where para5 is not numbered. + CPPUNIT_ASSERT_EQUAL(OUString("2nd.ii"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara, "NumberingLevel")); // Level 2 + + xPara.set(getParagraph(9, "outline with Body listLvl(9)."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(10, "outline with Body listLvl(9) #2."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(11, "direct formatting - Body listLvl(9)."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(12, "direct numId, inherit listLvl."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2nd.ii.a.1.I"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4), getProperty(xPara, "NumberingLevel")); // Level 5 + + xPara.set(getParagraph(13, "Style numId0 cancels inherited numbering."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf143692_outlineLevelTortureTest, "tdf143692_outlineLevelTortureTest.docx") +{ + uno::Reference xPara(getParagraph(1, "Head non Toc style"), uno::UNO_QUERY); + // fixed missing inherit from Heading 1 + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara, "OutlineLevel")); + + xPara.set(getParagraph(2, "noInheritHeading1"), uno::UNO_QUERY); + // fixed body level not cancelling inherited level + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xPara, "OutlineLevel")); + + xPara.set(getParagraph(4, "illegal -3"), uno::UNO_QUERY); + // illegal value is ignored, so inherit from Heading 1 + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara, "OutlineLevel")); + + xPara.set(getParagraph(5, "Heading 1 with invalid direct -2"), uno::UNO_QUERY); + // fixed illegal does not mean body level, it means inherit from style. + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara, "OutlineLevel")); + + xPara.set(getParagraph(7, "InheritCN3"), uno::UNO_QUERY); + // fixed Chapter Numbering cancelling inheritance + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), getProperty(xPara, "OutlineLevel")); + + xPara.set(getParagraph(8, "noInheritCN3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xPara, "OutlineLevel")); + + xPara.set(getParagraph(9, "override6CN3"), uno::UNO_QUERY); + // fixed body level not cancelling inherited level + CPPUNIT_ASSERT_EQUAL(sal_Int16(6), getProperty(xPara, "OutlineLevel")); + + xPara.set(getParagraph(10, "illegal 25"), uno::UNO_QUERY); + // fixed illegal value is ignored, so inherit from List Level (Chapter Numbering) + CPPUNIT_ASSERT_EQUAL(sal_Int16(3), getProperty(xPara, "OutlineLevel")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf132752, "tdf132752.docx") +{ + uno::Reference xPara1(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1801), getProperty(xPara1, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty(xPara1, "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara1, "ParaFirstLineIndent")); + + uno::Reference xPara2(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1801), getProperty(xPara2, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty(xPara2, "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-630), getProperty(xPara2, "ParaFirstLineIndent")); + + uno::Reference xPara3(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara3, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5891), getProperty(xPara3, "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara3, "ParaFirstLineIndent")); + + uno::Reference xPara4(getParagraph(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1801), getProperty(xPara4, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty(xPara4, "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4157), getProperty(xPara4, "ParaFirstLineIndent")); + + uno::Reference xPara5(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1801), getProperty(xPara5, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty(xPara5, "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-630), getProperty(xPara5, "ParaFirstLineIndent")); + + uno::Reference xPara6(getParagraph(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3565), getProperty(xPara6, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2764), getProperty(xPara6, "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2394), getProperty(xPara6, "ParaFirstLineIndent")); +} + +DECLARE_OOXMLEXPORT_TEST(testGutterLeft, "gutter-left.docx") +{ + uno::Reference xPageStyle; + getStyles("PageStyles")->getByName("Standard") >>= xPageStyle; + sal_Int32 nGutterMargin{}; + xPageStyle->getPropertyValue("GutterMargin") >>= nGutterMargin; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1270 + // - Actual : 0 + // i.e. gutter margin was lost. + CPPUNIT_ASSERT_EQUAL(static_cast(1270), nGutterMargin); +} + +CPPUNIT_TEST_FIXTURE(Test, testGutterTop) +{ + loadAndSave("gutter-top.docx"); + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + CPPUNIT_ASSERT(pXmlSettings); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. was lost. + assertXPath(pXmlSettings, "/w:settings/w:gutterAtTop"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testCustomShapePresetExport) +{ + loadAndReload("testCustomShapePresetExport.odt"); + // Check if the load failed. + CPPUNIT_ASSERT(getPages()); + + // Check all shapes of the file + int nCount = 0; + for (int i = 1; i <= getShapes(); i++) + { + uno::Reference xProperties(getShape(i), uno::UNO_QUERY); + if (!xProperties->getPropertySetInfo()->hasPropertyByName("CustomShapeGeometry")) + continue; + // Get the custom shape property + auto aCustomShapeGeometry = xProperties->getPropertyValue("CustomShapeGeometry") + .get>(); + // Find for shape type + for (const auto& aCustomGeometryIterator : std::as_const(aCustomShapeGeometry)) + { + if (aCustomGeometryIterator.Name == "Type") + CPPUNIT_ASSERT_MESSAGE( + "This is an ooxml preset shape with custom geometry! Shape type lost!", + aCustomGeometryIterator.Value.get() != "ooxml-non-primitive"); + // Without the fix, all shapes have ooxml-non-primitive type, and lost their + // real type (like triangle) with the textbox padding. + } + nCount++; + } + // Without the fix the count does not match. + CPPUNIT_ASSERT_EQUAL(17, nCount); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148671, "tdf148671.docx") +{ + // Don't assert with 'pFieldMark' failed when document is opened + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + if (!isExported()) + return; + // Preserve tag on SDT blocks. (Before the fix, these were all lost) + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:tag"_ostr, 3); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf140668, "tdf140668.docx") +{ + // Don't crash when document is opened + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf149649, "tdf149649.docx") +{ + // Don't crash when document is opened + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf138771, "tdf138771.docx") +{ + // Don't crash when document is imported + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf125936_numberingSuperscript, "tdf125936_numberingSuperscript.docx") +{ + // Without the fix, the first character run was superscripted. + CPPUNIT_ASSERT_EQUAL( sal_Int16(0), getProperty(getRun(getParagraph(1), 1, "A-570-108"), "CharEscapement") ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134619_numberingProps) +{ + loadAndReload("tdf134619_numberingProps.doc"); + // Get the third paragraph's numbering style's 1st level's bullet size + uno::Reference xParagraph = getParagraph(3); + auto xLevels = getProperty< uno::Reference >(xParagraph, "NumberingRules"); + uno::Sequence aLevel; + xLevels->getByIndex(0) >>= aLevel; // 1st level + OUString aCharStyleName = std::find_if(std::cbegin(aLevel), std::cend(aLevel), [](const beans::PropertyValue& rValue) { return rValue.Name == "CharStyleName"; })->Value.get(); + + // Make sure that the blue bullet's font size is 72 points, not 12 points. + uno::Reference xStyle(getStyles("CharacterStyles")->getByName(aCharStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(72.f, getProperty(xStyle, "CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134951_duplicates) +{ + loadAndReload("tdf134951_duplicates.odt"); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xEndnotesSupplier(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), xEndnotesSupplier->getEndnotes()->getCount()); + + getParagraph(5, "Duplicate fields: 1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135773_numberingShading) +{ + bool bIsExportAsShading = SvtFilterOptions::Get().IsCharBackground2Shading(); + // This function is run at the end of the test - returning the filter options to normal. + comphelper::ScopeGuard g( + [bIsExportAsShading] + { + if (bIsExportAsShading) + SvtFilterOptions::Get().SetCharBackground2Shading(); + }); + // For these test, ensure exporting CharBackground as w:highlight. + SvtFilterOptions::Get().SetCharBackground2Highlighting(); + + loadAndSave("tdf135774_numberingShading.docx"); + // This test uses a custom setting to export CharBackground as Highlight instead of the 7.0 default of Shading. + + // Before the fix, the imported shading was converted into a red highlight. + xmlDocUniquePtr pXmlStyles = parseExport("word/numbering.xml"); + assertXPath(pXmlStyles, "/w:numbering/w:abstractNum[@w:abstractNumId='1']/w:lvl[@w:ilvl='0']/w:rPr/w:shd"_ostr, "fill"_ostr, "ED4C05"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf140336_paraNoneShading) +{ + loadAndReload("tdf140336_paraNoneShading.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Before the fix, the background from a style was exported to dis-inheriting paragraphs/styles. + CPPUNIT_ASSERT_EQUAL(sal_uInt32(COL_AUTO), getProperty(getParagraph(1), "ParaBackColor")); + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("CanclledBackground"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xStyle, "FillStyle")); + + // sanity check: backgroundColor paragraph style has a golden color(FF7F50), which para2 inherits + CPPUNIT_ASSERT_EQUAL(sal_uInt32(16744272), getProperty(getParagraph(2), "ParaBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf141173_missingFrames) +{ + loadAndReload("tdf141173_missingFrames.rtf"); + // Without the fix in place, almost all of the text and textboxes were missing. + // Without the fix, there were only 2 shapes (mostly unseen). + CPPUNIT_ASSERT_EQUAL(13, getShapes()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf142404_tabSpacing, "tdf142404_tabSpacing.docx") +{ + // The tabstops should be laid out as triple-spaced when the paragraph takes multiple lines. + CPPUNIT_ASSERT_EQUAL_MESSAGE("too big for one page", 2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf142404_tabOverMarginC15, "tdf142404_tabOverMarginC15.docx") +{ + // TabOverMargin no longer applies to compatibilityMode 15 DOCX files. In Word 2016 this is 3pg. + // One page long if tabOverMargin is true. Two pages long if tabOverflow is true. + // Really should be 3 pages long, when tabOverflow is also false, but inadequate implementation. + CPPUNIT_ASSERT_EQUAL_MESSAGE("too big for one page", 2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142404_tabOverSpacingC15) +{ + loadAndReload("tdf142404_tabOverSpacingC15.odt"); + // Although TabOverMargin no longer applies to compatibilityMode 15 DOCX files, + // it still applies to a tab over the paragraph end (inside text boundaries). + // The original 3-page ODT saved as DOCX would fit on one page in MS Word 2010, but 3 in Word 2013. + CPPUNIT_ASSERT_EQUAL_MESSAGE("too big for two pages", 3, getPages()); + // The tab goes over the paragraph margin + CPPUNIT_ASSERT_EQUAL(OUString("A left tab positioned at"), parseDump("//page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]"_ostr, "portion"_ostr)); + sal_Int32 nTextLen = parseDump("//page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(OUString("*"), parseDump("//page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwFixPortion[1]"_ostr, "portion"_ostr)); + sal_Int32 nTabLen = parseDump("//page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwFixPortion[1]"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_MESSAGE("Large left tab", nTextLen < nTabLen); + // Not 1 line high (Word 2010 DOCX), or 3 lines high (LO DOCX) or 5 lines high (ODT), but 4 lines high + sal_Int32 nHeight = parseDump("//page[1]/body/txt[2]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_MESSAGE("4 lines high", 1100 < nHeight); + CPPUNIT_ASSERT_MESSAGE("4 lines high", nHeight < 1300); + + CPPUNIT_ASSERT_EQUAL(OUString("TabOverflow does what?"), parseDump("//page[1]/body/txt[7]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]"_ostr, "portion"_ostr)); + // Not 1 line high (Word 2010 DOCX), or 4 lines high (prev LO DOCX) or 8 lines high (ODT). + // but two lines high. (3 in Word 2016 because it pulls down "what?" to the second line - weird) + nHeight = parseDump("//page[1]/body/txt[7]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("2 lines high (but 3 in Word)", 242*2.5, nHeight, 242); + + CPPUNIT_ASSERT_EQUAL(OUString("A centered tab positioned at"), parseDump("//page[1]/body/txt[3]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]"_ostr, "portion"_ostr)); + sal_Int32 nLineWidth = parseDump("//page[1]/body/txt[3]/SwParaPortion/SwLineLayout[1]/SwFixPortion[1]"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Big tab: full paragraph area used", 737, nLineWidth, 100); + + // Pages 2/3 are TabOverMargin - in this particular case tabs should not go over margin. + CPPUNIT_ASSERT_EQUAL(OUString("A right tab positioned at"), parseDump("//page[2]/body/txt[6]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]"_ostr, "portion"_ostr)); + sal_Int32 nParaWidth = parseDump("//page[2]/body/txt[6]/infos/prtBounds"_ostr, "width"_ostr).toInt32(); + // the clearest non-first-line visual example is this second tab in the right-tab paragraph. + nLineWidth = parseDump("//page[2]/body/txt[6]/SwParaPortion/SwLineLayout[4]"_ostr, "width"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Full paragraph area used", nLineWidth, nParaWidth); + + CPPUNIT_ASSERT_EQUAL(OUString("TabOverflow does what?"), parseDump("//page[3]/body/txt[2]/SwParaPortion/SwLineLayout[1]/SwLinePortion[1]"_ostr, "portion"_ostr)); + // Not 1 line high (Word 2010 DOCX and ODT), or 4 lines high (prev LO DOCX), + // but 8 lines high. + nHeight = parseDump("//page[3]/body/txt[2]/infos/bounds"_ostr, "height"_ostr).toInt32(); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("8 lines high", 242*8, nHeight, 121); +} + +DECLARE_OOXMLEXPORT_TEST(testShapeHyperlink, "hyperlinkshape.docx") +{ + // Test import/export of hyperlink property on shapes + auto xShape(getShape(1)); + CPPUNIT_ASSERT_EQUAL(OUString("https://libreoffice.org/"), getProperty(xShape, "Hyperlink")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTextframeHyperlink) +{ + // Make sure hyperlink is imported correctly + createSwDoc("docxopenhyperlinkbox.docx"); + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("https://libreoffice.org/"), getProperty(xFrame, "HyperLinkURL")); + + // FIXME: After save&reload, the text frame should still be a text frame, and the above test should still work. + // (Currently the Writer text frame becomes a text box (shape based)). See tdf#140961 + saveAndReload("Office Open XML Text"); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // DML + assertXPath(pXmlDoc, "//w:drawing/wp:anchor/wp:docPr/a:hlinkClick"_ostr, 1); + // VML + assertXPath(pXmlDoc, "//w:pict/v:rect"_ostr, "href"_ostr, "https://libreoffice.org/"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf146171_invalid_change_date) +{ + createSwDoc("tdf146171.docx"); + // false alarm? during ODF roundtrip: + // 'Error: "1970-01-01" does not satisfy the "dateTime" type' + // disable and check only the conversion of the invalid (zeroed) change date + // 0000-00-00T00:00:00Z, resulting loss of change tracking during ODF roundtrip + // reload("writer8", "tdf146171.odt"); + saveAndReload("Office Open XML Text"); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 0 + assertXPath(pXmlDoc, "//w:ins"_ostr, 5); + // This was 0 + assertXPath(pXmlDoc, "//w:del"_ostr, 2); + // no date (anonymized change) + // This failed, date was exported as w:date="1970-01-01T00:00:00Z" before fixing tdf#147760 + assertXPathNoAttribute(pXmlDoc, "//w:del[1]"_ostr, "date"_ostr); + assertXPathNoAttribute(pXmlDoc, "//w:del[2]"_ostr, "date"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf139580) +{ + loadAndReload("tdf139580.odt"); + // Without the fix in place, this test would have crashed at export time + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf149198, "tdf149198.docx") +{ + // Without the fix in place, this test would have crashed at export time + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(OUString("Documentation"), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFooterMarginLost) +{ + loadAndSave("footer-margin-lost.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 709 + // - Actual : 0 + // i.e. import + export lost the footer margin value. + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgMar"_ostr, "footer"_ostr, "709"); +} + +CPPUNIT_TEST_FIXTURE(Test, testEffectExtentLineWidth) +{ + auto verify = [this]() { + CPPUNIT_ASSERT_EQUAL(static_cast(506), + getProperty(getShape(1), "TopMargin")); + }; + + // Given a document with a shape that has a non-zero line width and effect extent: + // When loading the document: + createSwDoc("effect-extent-line-width.docx"); + // Then make sure that the line width is not taken twice (once as part of the margin, and then + // also as the line width): + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 508 + // - Actual : 561 + // i.e. the upper spacing was too large, the last line of the text moved below the shape. + verify(); + saveAndReload("Office Open XML Text"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testRtlGutter) +{ + // Given a document with RTL gutter: + createSwDoc("rtl-gutter.docx"); + uno::Reference xStandard(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + CPPUNIT_ASSERT(getProperty(xStandard, "RtlGutter")); + + // When saving back to DOCX: + saveAndReload("Office Open XML Text"); + + // Then make sure the section's gutter is still RTL: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed as the XML element was + // missing. + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:rtlGutter"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf140572_docDefault_superscript) +{ + loadAndReload("tdf140572_docDefault_superscript.docx"); + // A round-trip was crashing. + + // Without the fix, everything was DFLT_ESC_AUTO_SUPER (default superscript) + CPPUNIT_ASSERT_EQUAL( sal_Int16(0), getProperty(getRun(getParagraph(1), 1), "CharEscapement") ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf136841, "tdf136841.docx") +{ + if (!IsDefaultDPI()) + return; + uno::Reference image = getShape(1); + uno::Reference imageProperties(image, uno::UNO_QUERY); + uno::Reference graphic; + imageProperties->getPropertyValue( "Graphic" ) >>= graphic; + Graphic vclGraphic(graphic); + BitmapEx bitmap(vclGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL( tools::Long(76), bitmap.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL( tools::Long(76), bitmap.GetSizePixel().Height()); + + // Without the fix in place, this test would have failed with + // - Expected: Color: R:228 G:71 B:69 A:0 + // - Actual : Color: R:0 G:0 B:0 A:0 + CPPUNIT_ASSERT_EQUAL( Color(228,71,69), bitmap.GetPixelColor(38,38)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138953) +{ + loadAndReload("croppedAndRotated.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Make sure the rotation is exported correctly, and size not distorted + auto xShape(getShape(1)); + CPPUNIT_ASSERT_EQUAL(27000.0, getProperty(xShape, "RotateAngle")); + auto frameRect = getProperty(xShape, "FrameRect"); + // Before the fix, original object size (i.e., before cropping) was written to spPr in OOXML, + // and the resulting object size was much larger than should be. + CPPUNIT_ASSERT_EQUAL(sal_Int32(12961), frameRect.Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8664), frameRect.Width); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf118535) +{ + loadAndReload("tdf118535.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); + CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("word/media/image1.jpeg"))); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: false + // - Actual : true + // i.e. the embedded picture would have been saved twice. + CPPUNIT_ASSERT_EQUAL(false, bool(xNameAccess->hasByName("word/media/image2.jpeg"))); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf133473_shadowSize, "tdf133473.docx") +{ + uno::Reference xShape = getShape(1); + + SdrObject* pObj(SdrObject::getSdrObjectFromXShape(xShape)); + const SfxItemSet& rSet = pObj->GetMergedItemSet(); + sal_Int32 nSize1 = rSet.Get(SDRATTR_SHADOWSIZEX).GetValue(); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 200000 + // - Actual : 113386 + // I.e. Shadow size will be smaller than actual. + + CPPUNIT_ASSERT_EQUAL(static_cast(200000), nSize1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153874, "image_through_shape.docx") +{ + uno::Reference const xShape1(getShapeByName(u"Test1"), uno::UNO_QUERY); + uno::Reference const xShape2(getShapeByName(u"Rectangle 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, xShape1->getPropertyValue("AnchorType").get()); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, xShape2->getPropertyValue("AnchorType").get()); + CPPUNIT_ASSERT_LESS(xShape2->getPropertyValue("ZOrder").get(), xShape1->getPropertyValue("ZOrder").get()); + CPPUNIT_ASSERT(xShape1->getPropertyValue("Decorative").get()); + // not implemented on shape yet + //CPPUNIT_ASSERT(xShape2->getPropertyValue("Decorative").get()); +} + +DECLARE_OOXMLEXPORT_TEST(testTextBoxZOrder, "testTextBoxZOrder.docx") +{ + // Is load successful? + CPPUNIT_ASSERT(mxComponent); + // Collect the z-order values of the textboxes + std::vector ShapeZorders; + std::vector FrameZorders; + for (int i = 1; i < 4; i++) + { + uno::Reference xShape(getShape(i)); + CPPUNIT_ASSERT(xShape); + uno::Reference xShapeProperties(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT(xShapeProperties); + uno::Reference xFrame = SwTextBoxHelper::getUnoTextFrame(xShape); + CPPUNIT_ASSERT(xFrame.is()); + uno::Reference const xFrameProperties(xFrame, uno::UNO_QUERY); + CPPUNIT_ASSERT(xFrameProperties); + ShapeZorders.push_back(xShapeProperties->getPropertyValue("ZOrder").get()); + FrameZorders.push_back(xFrameProperties->getPropertyValue("ZOrder").get()); + } + // Check the z-order values. + for (int i = 1; i < 3; i++) + { + CPPUNIT_ASSERT_GREATER(ShapeZorders[i - 1], ShapeZorders[i]); + CPPUNIT_ASSERT_GREATER(FrameZorders[i - 1], FrameZorders[i]); + CPPUNIT_ASSERT_GREATER(ShapeZorders[i - 1], FrameZorders[i - 1]); + } + // Without the fix it failed, because the z-order was wrong. +} + +DECLARE_OOXMLEXPORT_TEST(testTdf141550, "tdf141550.docx") +{ + uno::Reference xShape(getShape(1)); + uno::Reference xFrame = SwTextBoxHelper::getUnoTextFrame(xShape); + + CPPUNIT_ASSERT(xShape); + CPPUNIT_ASSERT(xFrame); + + const sal_uInt16 nShapeRelOri = getProperty(xShape, UNO_NAME_HORI_ORIENT_RELATION); + const sal_uInt16 nFrameRelOri = getProperty(xFrame, UNO_NAME_HORI_ORIENT_RELATION); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Textbox fallen apart!", nShapeRelOri, nFrameRelOri); + // Without the fix in place it fails with difference. +} + +DECLARE_OOXMLEXPORT_TEST(testTdf140137, "tdf140137.docx") +{ + // Don't throw exception during load + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf105688, "tdf105688.docx") +{ + // Don't throw exception during load + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testCommentReply) +{ + loadAndSave("CommentReply.docx"); + xmlDocUniquePtr pXmlComm = parseExport("word/comments.xml"); + xmlDocUniquePtr pXmlCommExt = parseExport("word/commentsExtended.xml"); + CPPUNIT_ASSERT(pXmlComm); + CPPUNIT_ASSERT(pXmlCommExt); + OUString sParentId = getXPath(pXmlComm, "/w:comments/w:comment[1]/w:p[1]"_ostr, "paraId"_ostr); + OUString sChildId = getXPath(pXmlComm, "/w:comments/w:comment[2]/w:p[1]"_ostr, "paraId"_ostr); + OUString sChildIdEx = getXPath(pXmlCommExt, "/w15:commentsEx/w15:commentEx"_ostr, "paraId"_ostr); + OUString sChildParentId = getXPath(pXmlCommExt, + "/w15:commentsEx/w15:commentEx"_ostr, "paraIdParent"_ostr); + // Make sure exported extended paraId matches the one in comments.xml + CPPUNIT_ASSERT_EQUAL(sChildId, sChildIdEx); + // Make sure the paraIdParent matches the id of its parent + CPPUNIT_ASSERT_EQUAL(sParentId, sChildParentId); +} + +CPPUNIT_TEST_FIXTURE(Test, testCommentDone) +{ + loadAndSave("CommentDone.docx"); + xmlDocUniquePtr pXmlComm = parseExport("word/comments.xml"); + assertXPath(pXmlComm, "/w:comments/w:comment[1]/w:p"_ostr, 2); + OUString idLastPara = getXPath(pXmlComm, "/w:comments/w:comment[1]/w:p[2]"_ostr, "paraId"_ostr); + xmlDocUniquePtr pXmlCommExt = parseExport("word/commentsExtended.xml"); + assertXPath(pXmlCommExt, "/w15:commentsEx"_ostr, "Ignorable"_ostr, "w15"); + assertXPath(pXmlCommExt, "/w15:commentsEx/w15:commentEx"_ostr, 1); + OUString idLastParaEx = getXPath(pXmlCommExt, "/w15:commentsEx/w15:commentEx"_ostr, "paraId"_ostr); + CPPUNIT_ASSERT_EQUAL(idLastPara, idLastParaEx); + assertXPath(pXmlCommExt, "/w15:commentsEx/w15:commentEx"_ostr, "done"_ostr, "1"); +} + +DECLARE_OOXMLEXPORT_TEST(testTableWidth, "frame_size_export.docx") +{ + // after exporting: table width was overwritten in the doc model + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), + getProperty(xTables->getByIndex(0), "RelativeWidth")); +} + + +DECLARE_OOXMLEXPORT_TEST(testCommentDoneModel, "CommentDone.docx") +{ + css::uno::Reference xTextFieldsSupplier( + mxComponent, css::uno::UNO_QUERY_THROW); + auto xFields(xTextFieldsSupplier->getTextFields()->createEnumeration()); + + // First comment: initially resolved, toggled to unresolved on import, unresolved on roundtrip + CPPUNIT_ASSERT(xFields->hasMoreElements()); + css::uno::Any aComment = xFields->nextElement(); + css::uno::Reference xComment(aComment, css::uno::UNO_QUERY_THROW); + + if (!isExported()) + { + // Check that it's resolved when initially read + CPPUNIT_ASSERT_EQUAL(true, xComment->getPropertyValue("Resolved").get()); + // Set to unresolved + xComment->setPropertyValue("Resolved", css::uno::Any(false)); + } + else + { + // After the roundtrip, it keeps the "unresolved" state set above + CPPUNIT_ASSERT_EQUAL(false, xComment->getPropertyValue("Resolved").get()); + } + + // Second comment: initially unresolved, toggled to resolved on import, resolved on roundtrip + CPPUNIT_ASSERT(xFields->hasMoreElements()); + aComment = xFields->nextElement(); + xComment.set(aComment, css::uno::UNO_QUERY_THROW); + + if (!isExported()) + { + // Check that it's unresolved when initially read + CPPUNIT_ASSERT_EQUAL(false, xComment->getPropertyValue("Resolved").get()); + // Set to resolved + xComment->setPropertyValue("Resolved", css::uno::Any(true)); + } + else + { + // After the roundtrip, it keeps the "resolved" state set above + CPPUNIT_ASSERT_EQUAL(true, xComment->getPropertyValue("Resolved").get()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, Test_ShadowDirection) +{ + loadAndSave("tdf142361ShadowDirection.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The attribute 'rotWithShape' has the default value 'true' in OOXML, so Words interprets a + // missing attribute as 'true'. That means that Word rotates the shadow if the shape is + // rotated. Because in LibreOffice a shadow is never rotated, we must not omit this + // attribute. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, + "/w:document/w:body/w:p[1]/w:r[1]/mc:AlternateContent/mc:Choice/w:drawing/" + "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:effectLst/a:outerShdw"_ostr, + "rotWithShape"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf150542) +{ + loadAndSave("tdf150542.docx"); + + xmlDocUniquePtr pSettingsDoc = parseExport("word/settings.xml"); + // Ensure that all docvars from input are written back and with correct values. + // Order of document variables is not checked. So this can fail at some time if order is changed. + assertXPath(pSettingsDoc, + "/w:settings/w:docVars/w:docVar[1]"_ostr, "name"_ostr, u"LocalChars\u00C1\u0072\u0076\u00ED\u007A\u0074\u0075\u0072\u006F\u0054\u00FC\u006B\u00F6\u0072\u0066\u00FA\u0072\u00F3\u0067\u00E9\u0070"_ustr); + assertXPath(pSettingsDoc, + "/w:settings/w:docVars/w:docVar[1]"_ostr, "val"_ostr, u"Correct value (\u00E1\u0072\u0076\u00ED\u007A\u0074\u0075\u0072\u006F\u0020\u0074\u00FC\u006B\u00F6\u0072\u0066\u00FA\u0072\u00F3\u0067\u00E9\u0070)"_ustr); + assertXPath(pSettingsDoc, + "/w:settings/w:docVars/w:docVar[2]"_ostr, "name"_ostr, "DocVar1"); + assertXPath(pSettingsDoc, + "/w:settings/w:docVars/w:docVar[2]"_ostr, "val"_ostr, "DocVar1 Value"); + assertXPath(pSettingsDoc, + "/w:settings/w:docVars/w:docVar[3]"_ostr, "name"_ostr, "DocVar3"); + assertXPath(pSettingsDoc, + "/w:settings/w:docVars/w:docVar[3]"_ostr, "val"_ostr, "DocVar3 Value"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf139549) +{ + loadAndSave("tdf139549.docx"); + // Document contains a VML textbox, the position of the textbox was incorrect. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + OUString aStyle = getXPath(pXmlDoc, "//w:pict/v:shape"_ostr, "style"_ostr); + /* original is: "position:absolute;margin-left:138.5pt;margin-top:40.1pt;width:183pt; + height:68pt;z-index:251675648;mso-position-horizontal:absolute; + mso-position-horizontal-relative:page;mso-position-vertical:absolute; + mso-position-vertical-relative:page" */ + CPPUNIT_ASSERT(!aStyle.isEmpty()); + + sal_Int32 nextTokenPos = 0; + OUString aStyleCommand = aStyle.getToken(0, ';', nextTokenPos); + CPPUNIT_ASSERT(!aStyleCommand.isEmpty()); + + OUString aStyleCommandName = aStyleCommand.getToken(0, ':'); + OUString aStyleCommandValue = aStyleCommand.getToken(1, ':'); + CPPUNIT_ASSERT_EQUAL(OUString("position"), aStyleCommandName); + CPPUNIT_ASSERT_EQUAL(OUString("absolute"), aStyleCommandValue); + + aStyleCommand = aStyle.getToken(0, ';', nextTokenPos); + CPPUNIT_ASSERT(!aStyleCommand.isEmpty()); + + aStyleCommandName = aStyleCommand.getToken(0, ':'); + aStyleCommandValue = aStyleCommand.getToken(1, ':'); + CPPUNIT_ASSERT_EQUAL(OUString("margin-left"), aStyleCommandName); + // Without the fix it failed, because the margin-left was 171.85pt. + CPPUNIT_ASSERT_DOUBLES_EQUAL(138.5, aStyleCommandValue.toFloat(), 0.1); + + aStyleCommand = aStyle.getToken(0, ';', nextTokenPos); + CPPUNIT_ASSERT(!aStyleCommand.isEmpty()); + + aStyleCommandName = aStyleCommand.getToken(0, ':'); + aStyleCommandValue = aStyleCommand.getToken(1, ':'); + CPPUNIT_ASSERT_EQUAL(OUString("margin-top"), aStyleCommandName); + // Without the fix it failed, because the margin-top was 55.45pt. + CPPUNIT_ASSERT_DOUBLES_EQUAL(40.1, aStyleCommandValue.toFloat(), 0.1); +} + + +CPPUNIT_TEST_FIXTURE(Test, testTdf143726) +{ + loadAndReload("Simple-TOC.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + CPPUNIT_ASSERT(pXmlStyles); + // Without the fix this was "TOA Heading" which belongs to the "Table of Authorities" index in Word + // TOC's heading style should be exported as "TOC Heading" as that's the default Word style name + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='TOCHeading']/w:name"_ostr, "val"_ostr, "TOC Heading"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152153) +{ + loadAndReload("embedded_images.odt"); + + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + const uno::Sequence aNames(xNameAccess->getElementNames()); + int nImageFiles = 0; + for (const auto& rElementName : aNames) + if (rElementName.startsWith("word/media/image")) + nImageFiles++; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 4 + // - Actual : 3 + // i.e. the once embedded picture wouldn't have been saved. + CPPUNIT_ASSERT_EQUAL(4, nImageFiles); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152152) +{ + loadAndReload("artistic_effects.docx"); + + uno::Reference xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + const uno::Sequence aNames(xNameAccess->getElementNames()); + int nImageFiles = 0; + for (const auto& rElementName : aNames) + if (rElementName.startsWith("word/media/hdphoto")) + nImageFiles++; + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 1 + // i.e. the once WDP picture wouldn't have been saved. + CPPUNIT_ASSERT_EQUAL(2, nImageFiles); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx new file mode 100644 index 0000000000..49d974b011 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport17.cxx @@ -0,0 +1,1157 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +DECLARE_OOXMLEXPORT_TEST(testTdf135164_cancelledNumbering, "tdf135164_cancelledNumbering.docx") +{ + uno::Reference xPara(getParagraph(1, u"TBMM DÖNEMİ"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(2, "Numbering explicitly cancelled"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(6, "Default style has roman numbering"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("i"), getProperty(xPara, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf147861_customField, "tdf147861_customField.docx") +{ + // These should each be specific values, not a shared DocProperty + getParagraph(1, "CustomEditedTitle"); // edited + // A couple of nulls at the end of the string thwarted all attempts at an "equals" comparison. + CPPUNIT_ASSERT(getParagraph(2)->getString().startsWith(" INSERT Custom Title here")); + getParagraph(3, "My Title"); // edited + + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("CustomEditedTitle"), xField->getPresentation(false)); + // The " (fixed)" part is unnecessary, but it must be consistent across a round-trip + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Title (fixed)"), xField->getPresentation(true)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148380_createField, "tdf148380_createField.docx") +{ + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // This should NOT be "Lorenzo Chavez", or a real date since the user hand-modified the result. + CPPUNIT_ASSERT_EQUAL(OUString("Myself - that's who"), xField->getPresentation(false)); + xField.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("yesterday at noon"), xField->getPresentation(false)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148380_fldLocked, "tdf148380_fldLocked.docx") +{ + getParagraph(2, "4/5/2022 4:29:00 PM"); + getParagraph(4, "1/23/4567 8:9:10 PM"); + + // Verify that these are fields, and not just plain text + // (import only, since export thankfully just dumps these fixed fields as plain text + if (isExported()) + return; + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // This should NOT be updated at FILEOPEN to match the last modified time - it is locked. + CPPUNIT_ASSERT_EQUAL(OUString("4/5/2022 4:29:00 PM"), xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Modified (fixed)"), xField->getPresentation(true)); + xField.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1/23/4567 8:9:10 PM"), xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Last printed (fixed)"), xField->getPresentation(true)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148380_usernameField, "tdf148380_usernameField.docx") +{ + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // These should match the as-last-seen-in-the-text name, and not the application's user name + CPPUNIT_ASSERT_EQUAL(OUString("Charlie Brown"), xField->getPresentation(false)); + xField.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("CB"), xField->getPresentation(false)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148380_modifiedField, "tdf148380_modifiedField.docx") +{ + getParagraph(2, "4/5/2022 3:29:00 PM"); // default (unspecified) date format + + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // unspecified SAVEDATE gets default US formatting because style.xml has w:lang w:val="en-US" + CPPUNIT_ASSERT_EQUAL(OUString("4/5/2022 3:29:00 PM"), xField->getPresentation(false)); + xField.set(xFields->nextElement(), uno::UNO_QUERY); + // This was hand-modified and really should be Charlie Brown, not Charles ... + CPPUNIT_ASSERT_EQUAL(OUString("Charlie Brown"), xField->getPresentation(false)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148380_printField, "tdf148380_printField.docx") +{ + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // unspecified SAVEDATE gets default GB formatting because style.xml has w:lang w:val="en-GB" + CPPUNIT_ASSERT_EQUAL(OUString("08/04/2022 07:10:00 AM"), xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Modified"), xField->getPresentation(true)); + xField.set(xFields->nextElement(), uno::UNO_QUERY); + // MS Word actually shows "8 o'clock-ish" until the document is reprinted, + // but it seems best to actually show the real last-printed date since it can't be FIXEDFLD + CPPUNIT_ASSERT_EQUAL(OUString("08/04/2022 06:47:00 AM"), xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Last printed"), xField->getPresentation(true)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf132475_printField, "tdf132475_printField.docx") +{ + // The last printed date field: formatted two different ways + getParagraph(2, "Thursday, March 17, 2022"); + getParagraph(3, "17-Mar-22"); + // Time zone affects the displayed time in MS Word. LO shows GMT time. Word only updated by F9 + getParagraph(5, "12:49"); + getParagraph(6, "12:49:00 PM"); + + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Thursday, March 17, 2022"), xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Last printed"), xField->getPresentation(true)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf114734_commentFormating, "tdf114734_commentFormating.docx") +{ + // Get the PostIt/Comment/Annotation + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + + uno::Reference xText = getProperty>(xField, "TextRange"); + uno::Reference xParagraph = getParagraphOfText(1, xText); + // Paragraph formatting was lost: should be right to left, and thus right-justified + CPPUNIT_ASSERT_EQUAL_MESSAGE("Right to Left comment", + text::WritingMode2::RL_TB, + getProperty(xParagraph, "WritingMode")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("literal right justified", + sal_Int16(style::ParagraphAdjust_RIGHT), + getProperty(xParagraph, "ParaAdjust")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf139759_commentHighlightBackground, "tdf139759_commentHighlightBackground.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + + uno::Reference xText = getProperty>(xField, "TextRange"); + uno::Reference xParagraph = getParagraphOfText(1, xText); + CPPUNIT_ASSERT_EQUAL(COL_YELLOW, getProperty(getRun(xParagraph, 2), "CharBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf135906) +{ + loadAndReload("tdf135906.docx"); + // just test round-tripping. The document was exported as corrupt and didn't re-load. +} + +DECLARE_OOXMLEXPORT_TEST(testTdf146802, "tdf146802.docx") +{ + // First check if the load failed, as before the fix. + CPPUNIT_ASSERT(mxComponent); + + // There is a group shape with text box inside having an embedded VML formula, + // check if something missing. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Where is the formula?", 2, getShapes()); + // Before the fix the bugdoc failed to load or the formula was missing. +} + +CPPUNIT_TEST_FIXTURE(Test, testParaStyleNumLevel) +{ + loadAndSave("para-style-num-level.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/styles.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. a custom list level in a para style was lost on import+export. + assertXPath(pXmlDoc, "/w:styles/w:style[@w:styleId='Mystyle']/w:pPr/w:numPr/w:ilvl"_ostr, "val"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testClearingBreak) +{ + // Given a document with a clearing break, when saving to DOCX: + loadAndSave("clearing-break.docx"); + + // Then make sure that the clearing break is not lost: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - XPath '/w:document/w:body/w:p/w:r/w:br' number of nodes is incorrect + // i.e. first the clearing break was turned into a plain break, then it was completely lost. + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:br"_ostr, "clear"_ostr, "all"); +} + +CPPUNIT_TEST_FIXTURE(Test, testContentControlExport) +{ + // Given a document with a content control around one or more text portions: + createSwDoc(); + uno::Reference xMSF(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor = xText->createTextCursor(); + xText->insertString(xCursor, "test", /*bAbsorb=*/false); + xCursor->gotoStart(/*bExpand=*/false); + xCursor->gotoEnd(/*bExpand=*/true); + uno::Reference xContentControl( + xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY); + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + xContentControlProps->setPropertyValue("ShowingPlaceHolder", uno::Any(true)); + xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure the expected markup is used: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // XPath '//w:sdt/w:sdtPr/w:showingPlcHdr' number of nodes is incorrect + // i.e. the SDT elements were missing on export. + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:showingPlcHdr"_ostr, 1); + assertXPath(pXmlDoc, "//w:sdt/w:sdtContent"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testCheckboxContentControlExport) +{ + // Given a document with a checkbox content control around a text portion: + createSwDoc(); + uno::Reference xMSF(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor = xText->createTextCursor(); + xText->insertString(xCursor, u"☐"_ustr, /*bAbsorb=*/false); + xCursor->gotoStart(/*bExpand=*/false); + xCursor->gotoEnd(/*bExpand=*/true); + uno::Reference xContentControl( + xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY); + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + xContentControlProps->setPropertyValue("Checkbox", uno::Any(true)); + xContentControlProps->setPropertyValue("Checked", uno::Any(true)); + xContentControlProps->setPropertyValue("CheckedState", uno::Any(u"☒"_ustr)); + xContentControlProps->setPropertyValue("UncheckedState", uno::Any(u"☐"_ustr)); + xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure the expected markup is used: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - XPath '//w:sdt/w:sdtPr/w14:checkbox/w14:checked' number of nodes is incorrect + // i.e. and its child elements were lost. + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w14:checkbox/w14:checked"_ostr, "val"_ostr, "1"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w14:checkbox/w14:checkedState"_ostr, "val"_ostr, "2612"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w14:checkbox/w14:uncheckedState"_ostr, "val"_ostr, "2610"); +} + +CPPUNIT_TEST_FIXTURE(Test, testDropdownContentControlExport) +{ + // Given a document with a dropdown content control around a text portion: + createSwDoc(); + uno::Reference xMSF(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor = xText->createTextCursor(); + xText->insertString(xCursor, "choose an item", /*bAbsorb=*/false); + xCursor->gotoStart(/*bExpand=*/false); + xCursor->gotoEnd(/*bExpand=*/true); + uno::Reference xContentControl( + xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY); + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + { + xContentControlProps->setPropertyValue("DropDown", uno::Any(true)); + uno::Sequence aListItems = { + { + comphelper::makePropertyValue("DisplayText", uno::Any(OUString("red"))), + comphelper::makePropertyValue("Value", uno::Any(OUString("R"))), + }, + { + comphelper::makePropertyValue("DisplayText", uno::Any(OUString("green"))), + comphelper::makePropertyValue("Value", uno::Any(OUString("G"))), + }, + { + comphelper::makePropertyValue("DisplayText", uno::Any(OUString("blue"))), + comphelper::makePropertyValue("Value", uno::Any(OUString("B"))), + }, + }; + xContentControlProps->setPropertyValue("ListItems", uno::Any(aListItems)); + } + xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure the expected markup is used: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - XPath '//w:sdt/w:sdtPr/w:dropDownList/w:listItem[1]' number of nodes is incorrect + // i.e. the list items were lost on export. + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[1]"_ostr, "displayText"_ostr, "red"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[1]"_ostr, "value"_ostr, "R"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[2]"_ostr, "displayText"_ostr, "green"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[2]"_ostr, "value"_ostr, "G"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[3]"_ostr, "displayText"_ostr, "blue"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dropDownList/w:listItem[3]"_ostr, "value"_ostr, "B"); +} + +CPPUNIT_TEST_FIXTURE(Test, testPictureContentControlExport) +{ + // Given a document with a picture content control around a text portion: + createSwDoc(); + uno::Reference xMSF(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor = xText->createTextCursor(); + uno::Reference xTextGraphic( + xMSF->createInstance("com.sun.star.text.TextGraphicObject"), uno::UNO_QUERY); + xTextGraphic->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AS_CHARACTER)); + uno::Reference xTextContent(xTextGraphic, uno::UNO_QUERY); + xText->insertTextContent(xCursor, xTextContent, false); + xCursor->gotoStart(/*bExpand=*/false); + xCursor->gotoEnd(/*bExpand=*/true); + uno::Reference xContentControl( + xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY); + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + xContentControlProps->setPropertyValue("Picture", uno::Any(true)); + xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure the expected markup is used: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. was lost on export. + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:picture"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testDateContentControlExport) +{ + // Given a document with a date content control around a text portion: + createSwDoc(); + uno::Reference xMSF(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor = xText->createTextCursor(); + xText->insertString(xCursor, "test", /*bAbsorb=*/false); + xCursor->gotoStart(/*bExpand=*/false); + xCursor->gotoEnd(/*bExpand=*/true); + uno::Reference xContentControl( + xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY); + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + xContentControlProps->setPropertyValue("Date", uno::Any(true)); + xContentControlProps->setPropertyValue("DateFormat", uno::Any(OUString("M/d/yyyy"))); + xContentControlProps->setPropertyValue("DateLanguage", uno::Any(OUString("en-US"))); + xContentControlProps->setPropertyValue("CurrentDate", uno::Any(OUString("2022-05-26T00:00:00Z"))); + xContentControlProps->setPropertyValue("PlaceholderDocPart", uno::Any(OUString("DefaultPlaceholder_-1854013437"))); + xContentControlProps->setPropertyValue("DataBindingPrefixMappings", uno::Any(OUString("xmlns:ns0='http://schemas.microsoft.com/vsto/samples' "))); + xContentControlProps->setPropertyValue("DataBindingXpath", uno::Any(OUString("/ns0:employees[1]/ns0:employee[1]/ns0:hireDate[1]"))); + xContentControlProps->setPropertyValue("DataBindingStoreItemID", uno::Any(OUString("{241A8A02-7FFD-488D-8827-63FBE74E8BC9}"))); + xContentControlProps->setPropertyValue("Color", uno::Any(OUString("008000"))); + xContentControlProps->setPropertyValue("Appearance", uno::Any(OUString("hidden"))); + xContentControlProps->setPropertyValue("Alias", uno::Any(OUString("myalias"))); + xContentControlProps->setPropertyValue("Tag", uno::Any(OUString("mytag"))); + xContentControlProps->setPropertyValue("Id", uno::Any(static_cast(123))); + xContentControlProps->setPropertyValue("TabIndex", uno::Any(sal_uInt32(4294967295))); // -1 + xContentControlProps->setPropertyValue("Lock", uno::Any(OUString("sdtLocked"))); + + xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure the expected markup is used: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - XPath '//w:sdt/w:sdtPr/w:date/w:dateFormat' number of nodes is incorrect + // i.e. the was lost on export. + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date/w:dateFormat"_ostr, "val"_ostr, "M/d/yyyy"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date/w:lid"_ostr, "val"_ostr, "en-US"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date"_ostr, "fullDate"_ostr, "2022-05-26T00:00:00Z"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:placeholder/w:docPart"_ostr, "val"_ostr, "DefaultPlaceholder_-1854013437"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dataBinding"_ostr, "prefixMappings"_ostr, "xmlns:ns0='http://schemas.microsoft.com/vsto/samples' "); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dataBinding"_ostr, "xpath"_ostr, "/ns0:employees[1]/ns0:employee[1]/ns0:hireDate[1]"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:dataBinding"_ostr, "storeItemID"_ostr, "{241A8A02-7FFD-488D-8827-63FBE74E8BC9}"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w15:color"_ostr, "val"_ostr, "008000"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w15:appearance"_ostr, "val"_ostr, "hidden"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:alias"_ostr, "val"_ostr, "myalias"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:tag"_ostr, "val"_ostr, "mytag"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:id"_ostr, "val"_ostr, "123"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:tabIndex"_ostr, "val"_ostr, "-1"); + assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:lock"_ostr, "val"_ostr, "sdtLocked"); +} + +CPPUNIT_TEST_FIXTURE(Test, testNegativePageBorder) +{ + // Given a document with a negative border distance: + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwDocShell* pDocShell = pTextDoc->GetDocShell(); + SwWrtShell* pWrtShell = pDocShell->GetWrtShell(); + pWrtShell->Insert("test"); + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + xPageStyle->setPropertyValue("TopMargin", uno::Any(static_cast(501))); + table::BorderLine2 aBorder; + aBorder.LineWidth = 159; + aBorder.OuterLineWidth = 159; + xPageStyle->setPropertyValue("TopBorder", uno::Any(aBorder)); + sal_Int32 nTopBorderDistance = -646; + xPageStyle->setPropertyValue("TopBorderDistance", uno::Any(nTopBorderDistance)); + + // When exporting to DOCX: + save("Office Open XML Text"); + + // Then make sure that the page edge -> border space is correct: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:pgMar"_ostr, "top"_ostr, "284"); + assertXPath(pXmlDoc, "//w:pgBorders/w:top"_ostr, "sz"_ostr, "36"); + // Without the fix in place, this test would have failed with: + // - Expected: 28 + // - Actual : 0 + // i.e. editeng::BorderDistancesToWord() mis-handled negative border distances. + assertXPath(pXmlDoc, "//w:pgBorders/w:top"_ostr, "space"_ostr, "28"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf148494) +{ + loadAndSave("tdf148494.docx"); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Without the fix in place, this test would have failed with + // - Expected: MACROBUTTON AllCaps Hello World + // - Actual : MACROBUTTONAllCaps Hello World + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:r[3]/w:instrText"_ostr, " MACROBUTTON AllCaps Hello World "); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf137466, "tdf137466.docx") +{ + if (!isExported()) + return; // initial import, no further checks + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Ensure that we have + OUString sDocPart = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:placeholder/w:docPart"_ostr, "val"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("DefaultPlaceholder_-1854013440"), sDocPart); + + // Ensure that we have + OUString sColor = getXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w15:color"_ostr, "val"_ostr); + CPPUNIT_ASSERT_EQUAL(OUString("FF0000"), sColor); +} + +DECLARE_OOXMLEXPORT_TEST(testParaListRightIndent, "testParaListRightIndent.docx") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty(getParagraph(1), "ParaRightMargin")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5001), getProperty(getParagraph(2), "ParaRightMargin")); +} + +CPPUNIT_TEST_FIXTURE(Test, testDontAddNewStyles) +{ + // Given a document that lacks builtin styles, and addition of them is disabled: + { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Load::DisableBuiltinStyles::set(true, pBatch); + pBatch->commit(); + } + comphelper::ScopeGuard g([] { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::Load::DisableBuiltinStyles::set(false, pBatch); + pBatch->commit(); + }); + + // When saving that document: + loadAndSave("dont-add-new-styles.docx"); + + // Then make sure that export doesn't have additional styles, Caption was one of them: + xmlDocUniquePtr pXmlDoc = parseExport("word/styles.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. builtin styles were added to the export result, even if we opted out. + assertXPath(pXmlDoc, "/w:styles/w:style[@w:styleId='Caption']"_ostr, 0); +} + +DECLARE_OOXMLEXPORT_TEST(TestWPGZOrder, "testWPGZOrder.docx") +{ + // Check if the load failed. + CPPUNIT_ASSERT(mxComponent); + + // Get the WPG + uno::Reference xGroup(getShape(1), uno::UNO_QUERY_THROW); + uno::Reference xGroupProperties(xGroup, uno::UNO_QUERY_THROW); + + // Initialize a queue for subgroups + std::queue> xGroupList; + xGroupList.push(xGroup); + + // Every textbox shall be visible. + while (xGroupList.size()) + { + // Get the first group + xGroup = xGroupList.front(); + xGroupList.pop(); + for (sal_Int32 i = 0; i < xGroup->getCount(); ++i) + { + // Get the child shape + uno::Reference xChildShapeProperties(xGroup->getByIndex(i), + uno::UNO_QUERY_THROW); + // Check for textbox + if (!xChildShapeProperties->getPropertyValue("TextBox").get()) + { + // Is this a Group Shape? Put it into the queue. + uno::Reference xInnerGroup(xGroup->getByIndex(i), uno::UNO_QUERY); + if (xInnerGroup) + xGroupList.push(xInnerGroup); + continue; + } + + // Get the textbox properties + uno::Reference xTextBoxFrameProperties( + xChildShapeProperties->getPropertyValue("TextBoxContent"), uno::UNO_QUERY_THROW); + + // Assert that the textbox ZOrder greater than the groupshape + CPPUNIT_ASSERT_GREATER(xGroupProperties->getPropertyValue("ZOrder").get(), + xTextBoxFrameProperties->getPropertyValue("ZOrder").get()); + // Before the fix, this failed because that was less, and the textboxes were covered. + } + + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf148720) +{ + loadAndReload("tdf148720.odt"); + const auto& pLayout = parseLayoutDump(); + + const OString sShapeXPaths[] = + { + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObjGroup/SdrObjList/SdrObject[1]"_ostr, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObjGroup/SdrObjList/SdrObjGroup/SdrObjList/SdrObjGroup/SdrObjList/SdrObject[1]"_ostr, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObjGroup/SdrObjList/SdrObjGroup/SdrObjList/SdrObjGroup/SdrObjList/SdrObject[2]"_ostr, + "/root/page/body/txt/anchored/SwAnchoredDrawObject/SdrObjGroup/SdrObjList/SdrObject[2]"_ostr + }; + + const OString sTextXPaths[] = + { + "/root/page/body/txt/anchored/fly[1]/infos/bounds"_ostr, + "/root/page/body/txt/anchored/fly[2]/infos/bounds"_ostr, + "/root/page/body/txt/anchored/fly[3]/infos/bounds"_ostr, + "/root/page/body/txt/anchored/fly[4]/infos/bounds"_ostr + }; + + const OString sAttribs[] = + { + "left"_ostr, + "top"_ostr, + "width"_ostr, + "height"_ostr + }; + + for (sal_Int32 i = 0; i < 4; ++i) + { + OUString aShapeVals[4]; + int aTextVals[4] = {0, 0, 0, 0}; + + const auto aOutRect = getXPath(pLayout, sShapeXPaths[i], "aOutRect"_ostr); + + sal_uInt16 nCommaPos[4] = {0, 0, 0, 0}; + nCommaPos[1] = aOutRect.indexOf(","); + nCommaPos[2] = aOutRect.indexOf(",", nCommaPos[1] + 1); + nCommaPos[3] = aOutRect.indexOf(",", nCommaPos[2] + 1); + + + aShapeVals[0] = aOutRect.copy(nCommaPos[0], nCommaPos[1] - nCommaPos[0]); + aShapeVals[1] = aOutRect.copy(nCommaPos[1] + 2, nCommaPos[2] - nCommaPos[1] - 2); + aShapeVals[2] = aOutRect.copy(nCommaPos[2] + 2, nCommaPos[3] - nCommaPos[2] - 2); + aShapeVals[3] = aOutRect.copy(nCommaPos[3] + 2, aOutRect.getLength() - nCommaPos[3] - 2); + + for (int ii = 0; ii < 4; ++ii) + { + aTextVals[ii] = getXPath(pLayout, sTextXPaths[i], sAttribs[ii]).toInt32(); + } + + tools::Rectangle ShapeArea(Point(aShapeVals[0].toInt32(), aShapeVals[1].toInt32()), Size(aShapeVals[2].toInt32() + 5, aShapeVals[3].toInt32() + 5)); + + tools::Rectangle TextArea(Point(aTextVals[0], aTextVals[1]), Size(aTextVals[2], aTextVals[3])); + + CPPUNIT_ASSERT(ShapeArea.Contains(TextArea)); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf126287, "tdf126287.docx") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123642_BookmarkAtDocEnd, "tdf123642.docx") +{ + // get bookmark interface + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + // check: we have 1 bookmark (previously there were 0) + CPPUNIT_ASSERT_EQUAL(static_cast(1), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Bookmark1")); + + // and it is really in exported DOCX (let's ensure) + if (!isExported()) + return; // initial import, no further checks + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark1"), getXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:bookmarkStart[1]"_ostr, "name"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148361, "tdf148361.docx") +{ + // Plain text Block SDT is imported as content control + OUString aActual = getParagraph(1)->getString(); + // This was "itadmin". + CPPUNIT_ASSERT_EQUAL(OUString("itadmin"), aActual); + + aActual = getParagraph(2)->getString(); + // This was "itadmin". + CPPUNIT_ASSERT_EQUAL(OUString("[Type text]"), aActual); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153082_semicolon, "custom-styles-TOC-semicolon.docx") +{ + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes(); + uno::Reference xTOC(xIndexes->getByIndex(0), uno::UNO_QUERY); + // check styles + uno::Reference xParaStyles = + getProperty>(xTOC, "LevelParagraphStyles"); + uno::Sequence styles; + xParaStyles->getByIndex(0) >>= styles; + CPPUNIT_ASSERT_EQUAL(uno::Sequence{}, styles); + xParaStyles->getByIndex(1) >>= styles; + CPPUNIT_ASSERT_EQUAL(uno::Sequence{}, styles); + xParaStyles->getByIndex(2) >>= styles; + // the first one is built-in Word style "Intense Quote" that was localised DE "Intensives Zitat" in the file + CPPUNIT_ASSERT_EQUAL((uno::Sequence{"Intensives Zitat", "Custom1", "_MyStyle0"}), styles); + xTOC->update(); + OUString const tocContent(xTOC->getAnchor()->getString()); + CPPUNIT_ASSERT(tocContent.startsWith("Table of Contents")); + CPPUNIT_ASSERT(tocContent.indexOf("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.") != -1); + CPPUNIT_ASSERT(tocContent.indexOf("Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.") != -1); + CPPUNIT_ASSERT(tocContent.indexOf("Proin pharetra nonummy pede. Mauris et orci.") != -1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153082_comma, "custom-styles-TOC-comma.docx") +{ + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes(); + uno::Reference xTOC(xIndexes->getByIndex(0), uno::UNO_QUERY); + // check styles + uno::Reference xParaStyles = + getProperty>(xTOC, "LevelParagraphStyles"); + uno::Sequence styles; + xParaStyles->getByIndex(0) >>= styles; + CPPUNIT_ASSERT_EQUAL(uno::Sequence{"_MyStyle0"}, styles); + xParaStyles->getByIndex(1) >>= styles; + CPPUNIT_ASSERT_EQUAL(uno::Sequence{"Custom1"}, styles); + xParaStyles->getByIndex(2) >>= styles; + // the first one is built-in Word style "Intense Quote" that was localised DE "Intensives Zitat" in the file + CPPUNIT_ASSERT_EQUAL(uno::Sequence{"Intensives Zitat"}, styles); + xTOC->update(); + OUString const tocContent(xTOC->getAnchor()->getString()); + CPPUNIT_ASSERT(tocContent.startsWith("Table of Contents")); + CPPUNIT_ASSERT(tocContent.indexOf("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.") != -1); + CPPUNIT_ASSERT(tocContent.indexOf("Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.") != -1); + CPPUNIT_ASSERT(tocContent.indexOf("Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.") != -1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf142407, "tdf142407.docx") +{ + uno::Reference xPageStyles = getStyles("PageStyles"); + uno::Reference xPageStyle(xPageStyles->getByName("Standard"), uno::UNO_QUERY); + sal_Int16 nGridLines; + xPageStyle->getPropertyValue("GridLines") >>= nGridLines; + CPPUNIT_ASSERT_EQUAL( sal_Int16(36), nGridLines); // was 23, left large space before text. +} + +DECLARE_OOXMLEXPORT_TEST(testWPGBodyPr, "WPGbodyPr.docx") +{ + // Is load successful? + CPPUNIT_ASSERT(mxComponent); + + // There are a WPG shape and a picture + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + + // Get the WPG shape + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + // And the embed WPG + uno::Reference xEmbedGroup(xGroup->getByIndex(1), uno::UNO_QUERY); + + // Get the properties of the shapes + uno::Reference xOuterShape(xGroup->getByIndex(0), uno::UNO_QUERY); + uno::Reference xMiddleShape(xEmbedGroup->getByIndex(0), uno::UNO_QUERY); + uno::Reference xInnerShape(xEmbedGroup->getByIndex(1), uno::UNO_QUERY); + + // Get the properties of the textboxes too + uno::Reference xOuterTextBox( + xOuterShape->getPropertyValue("TextBoxContent"), uno::UNO_QUERY); + uno::Reference xMiddleTextBox( + xMiddleShape->getPropertyValue("TextBoxContent"), uno::UNO_QUERY); + uno::Reference xInnerTextBox( + xInnerShape->getPropertyValue("TextBoxContent"), uno::UNO_QUERY); + + // Check the alignments + CPPUNIT_ASSERT_EQUAL(css::drawing::TextVerticalAdjust::TextVerticalAdjust_TOP, + xOuterTextBox->getPropertyValue("TextVerticalAdjust") + .get()); + CPPUNIT_ASSERT_EQUAL(css::drawing::TextVerticalAdjust::TextVerticalAdjust_TOP, + xMiddleTextBox->getPropertyValue("TextVerticalAdjust") + .get()); + CPPUNIT_ASSERT_EQUAL(css::drawing::TextVerticalAdjust::TextVerticalAdjust_CENTER, + xInnerTextBox->getPropertyValue("TextVerticalAdjust") + .get()); + + // Check the inset margins, all were 0 before the fix + CPPUNIT_ASSERT_EQUAL(sal_Int32(499), + xInnerShape->getPropertyValue("TextLowerDistance").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(499), + xInnerShape->getPropertyValue("TextUpperDistance").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), + xInnerShape->getPropertyValue("TextLeftDistance").get()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(254), + xInnerShape->getPropertyValue("TextRightDistance").get()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf146851_1, "tdf146851_1.docx") +{ + uno::Reference xPara; + + xPara.set(getParagraph(1, "qwerty"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + + xPara.set(getParagraph(2, "asdfg"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1/"), getProperty(xPara, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf146851_2, "tdf146851_2.docx") +{ + // Ensure numbering on second para + uno::Reference xPara; + xPara.set(getParagraph(2, "."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Schedule"), getProperty(xPara, "ListLabelString")); + + // Refresh fields and ensure cross-reference to numbered para is okay + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + + uno::Reference(xFieldsAccess, uno::UNO_QUERY_THROW)->refresh(); + + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + uno::Reference xTextField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Schedule"), xTextField->getPresentation(false)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148052, "tdf148052.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + + uno::Reference xTextField(xFields->nextElement(), uno::UNO_QUERY); + + // Without the fix in place, this test would have failed with + // - Expected: 14. Aug 18 + // - Actual : 11. Apr 22 + CPPUNIT_ASSERT_EQUAL(OUString("14. Aug 18"), xTextField->getPresentation(false)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148111, "tdf148111.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + + uno::Reference xFields(xFieldsAccess->createEnumeration()); + std::vector aExpectedValues = { + // These field values are NOT in order in document: getTextFields did provide + // fields in a strange but fixed order + "Title", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Placeholder", "Placeholder", "Placeholder", + "Placeholder", "Title", "Title", "Title", + "Title", "Title", "Title", "Title" + }; + + sal_uInt16 nIndex = 0; + while (xFields->hasMoreElements()) + { + uno::Reference xTextField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(aExpectedValues[nIndex++], xTextField->getPresentation(false)); + } + + // No more fields + CPPUNIT_ASSERT(!xFields->hasMoreElements()); + + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // ShowingPlaceholder should be off for 0, false and "on". (This was 21 before the fix) + assertXPath(pXmlDoc,"//w:p/w:sdt/w:sdtPr/w:showingPlcHdr"_ostr, 12); +} + +DECLARE_OOXMLEXPORT_TEST(TestTdf73499, "tdf73499.docx") +{ + // Ensure, the bugdoc is opened + CPPUNIT_ASSERT(mxComponent); + // Get the groupshape + uno::Reference xGroup(getShape(1), uno::UNO_QUERY_THROW); + + // Get the textboxes of the groupshape + uno::Reference xTextBox1(xGroup->getByIndex(0), uno::UNO_QUERY_THROW); + uno::Reference xTextBox2(xGroup->getByIndex(1), uno::UNO_QUERY_THROW); + + // Get the properties of the textboxes + uno::Reference xTextBox1Properties(xTextBox1, uno::UNO_QUERY_THROW); + uno::Reference xTextBox2Properties(xTextBox2, uno::UNO_QUERY_THROW); + + // Get the name of the textboxes + uno::Reference xTextBox1Name(xTextBox1, uno::UNO_QUERY_THROW); + uno::Reference xTextBox2Name(xTextBox2, uno::UNO_QUERY_THROW); + + // Check for the links, before the fix that were missing + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Link name missing!", xTextBox2Name->getName(), + xTextBox1Properties->getPropertyValue("ChainNextName").get()); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "Link name missing!", xTextBox1Name->getName(), + xTextBox2Properties->getPropertyValue("ChainPrevName").get()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf81507, "tdf81507.docx") +{ + if (!isExported()) + return; // initial import, no further checks + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Ensure that we have + CPPUNIT_ASSERT_EQUAL(OUString("1"), getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:sdt/w:sdtPr/w:text"_ostr, "multiLine"_ostr)); + + // Ensure that we have + CPPUNIT_ASSERT_EQUAL(OUString("0"), getXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:sdt/w:sdtPr/w:text"_ostr, "multiLine"_ostr)); + + // Ensure that we have + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:sdt/w:sdtPr/w:text"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:sdt/w:sdtPr/w:text"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf139948, "tdf139948.docx") +{ + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(1, "No border"), "TopBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(2, "Border below"), "TopBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(88), + getProperty(getParagraph(3, "Borders below and above"), "TopBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(88), + getProperty(getParagraph(4, "Border above"), "TopBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(5, "No border"), "TopBorder").LineWidth); + + + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(1), "BottomBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(2), "BottomBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(3), "BottomBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(4), "BottomBorder").LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), + getProperty(getParagraph(5), "BottomBorder").LineWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf144563, "tdf144563.docx") +{ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + + // Refresh all cross-reference fields + uno::Reference(xFieldsAccess, uno::UNO_QUERY_THROW)->refresh(); + + // Verify values + uno::Reference xFields(xFieldsAccess->createEnumeration()); + + std::vector aExpectedValues = { + // These field values are NOT in order in document: getTextFields did provide + // fields in a strange but fixed order + "1", "1", "1", "1", "1/", "1/", "1/", "1)", "1)", "1)", "1.)", + "1.)", "1.)", "1..", "1..", "1..", "1.", "1.", "1.", "1", "1" + }; + + sal_uInt16 nIndex = 0; + while (xFields->hasMoreElements()) + { + uno::Reference xTextField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(aExpectedValues[nIndex++], xTextField->getPresentation(false)); + } +} + +// broken test document? +#if !defined(_WIN32) +CPPUNIT_TEST_FIXTURE(Test, testTdf146955) +{ + loadAndReload("tdf146955.odt"); + // import of a (broken?) DOCX export with dozens of frames raised a SAX exception, + // when the code tried to access to a non-existent footnote + uno::Reference xNotes(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xNotes->getFootnotes()->getCount()); +} +#endif + +CPPUNIT_TEST_FIXTURE(Test, testTdf144668) +{ + loadAndReload("tdf144668.odt"); + uno::Reference xPara1(getParagraph(1, u"level1"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("[0001]"), getProperty(xPara1, "ListLabelString")); + + uno::Reference xPara2(getParagraph(2, u"level2"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("[001]"), getProperty(xPara2, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148455_1, "tdf148455_1.docx") +{ + uno::Reference xPara2(getParagraph(3, u"1.1.1"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1.1."), getProperty(xPara2, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148455_2, "tdf148455_2.docx") +{ + if (!isExported()) + return; // initial import, no further checks + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Find list id for restarted list + sal_Int32 nListId = getXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:numPr/w:numId"_ostr, "val"_ostr).toInt32(); + + xmlDocUniquePtr pNumberingDoc = parseExport("word/numbering.xml"); + + // Ensure we have empty lvlOverride for levels 0 - 1 + assertXPath(pNumberingDoc, "/w:numbering/w:num[@w:numId='" + OString::number(nListId) +"']/w:lvlOverride[@w:ilvl='0']"); + assertXPath(pNumberingDoc, "/w:numbering/w:num[@w:numId='" + OString::number(nListId) +"']/w:lvlOverride[@w:ilvl='1']"); + // And normal override for level 2 + getXPath(pNumberingDoc, "/w:numbering/w:num[@w:numId='" + OString::number(nListId) +"']/w:lvlOverride[@w:ilvl='2']/w:startOverride", "val"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf147978enhancedPathABVW) +{ + createSwDoc("tdf147978_enhancedPath_commandABVW.odt"); + saveAndReload("Office Open XML Text"); + // Make sure the new implemented export for commands A,B,V and W use the correct arc between + // the given two points, here the short one. + for (sal_Int16 i = 1 ; i <= 4; ++i) + { + uno::Reference xShape = getShape(i); + CPPUNIT_ASSERT_EQUAL(sal_Int32(506), getProperty(xShape, "BoundRect").Height); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148132, "tdf148132.docx") +{ + { + uno::Reference xParagraph = getParagraph(1); + auto xLevels = getProperty< uno::Reference >(xParagraph, "NumberingRules"); + // Get level 2 char style + comphelper::SequenceAsHashMap levelProps(xLevels->getByIndex(1)); + OUString aCharStyleName = levelProps["CharStyleName"].get(); + // Ensure that numbering in this paragraph is 24pt bold italic + // Previously it got overridden by paragraph properties and became 6pt, no bold, no italic + uno::Reference xStyle(getStyles("CharacterStyles")->getByName(aCharStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(24.f, getProperty(xStyle, "CharHeight")); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xStyle, "CharWeight")); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, getProperty(xStyle, "CharPosture")); + } + // And do the same for second paragraph. Numbering should be identical + { + uno::Reference xParagraph = getParagraph(2); + auto xLevels = getProperty< uno::Reference >(xParagraph, "NumberingRules"); + comphelper::SequenceAsHashMap levelProps(xLevels->getByIndex(1)); + OUString aCharStyleName = levelProps["CharStyleName"].get(); + + uno::Reference xStyle(getStyles("CharacterStyles")->getByName(aCharStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(24.f, getProperty(xStyle, "CharHeight")); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xStyle, "CharWeight")); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, getProperty(xStyle, "CharPosture")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf154481, "tdf154481.docx") +{ + CPPUNIT_ASSERT_EQUAL_MESSAGE("Missing pages!", 7, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf149200) +{ + loadAndSave("tdf149200.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Ensure there is no unexpected invalid structure + // There is just one run property + xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlDoc, "count(/w:document/w:body/w:p[1]/w:r[1]/w:rPr/*)"_ostr); + CPPUNIT_ASSERT(pXmlObj); + CPPUNIT_ASSERT_EQUAL(double(1), pXmlObj->floatval); + // And it is a color definition with themeColor + CPPUNIT_ASSERT_EQUAL(OUString("dark1"), getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/w:rPr/w:color"_ostr, "themeColor"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf149313, "tdf149313.docx") +{ + // only 2, but not 3 pages in document + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // And ensure that pages are with correct sections (have correct dimensions) + CPPUNIT_ASSERT_EQUAL(sal_Int32(4989), getXPath(pXmlDoc, "/root/page[1]/infos/bounds"_ostr, "height"_ostr).toInt32()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4989), getXPath(pXmlDoc, "/root/page[1]/infos/bounds"_ostr, "width"_ostr).toInt32()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4989), getXPath(pXmlDoc, "/root/page[2]/infos/bounds"_ostr, "height"_ostr).toInt32()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8000), getXPath(pXmlDoc, "/root/page[2]/infos/bounds"_ostr, "width"_ostr).toInt32()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148360, "tdf148360.docx") +{ + const auto& pLayout = parseLayoutDump(); + + // Ensure first element is a tab + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, "type"_ostr, "PortionType::TabLeft"); + // and only then goes content + assertXPath(pLayout, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, "type"_ostr, "PortionType::Text"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135923, "tdf135923-min.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + uno::Reference xParagraph = getParagraphOfText(1, xShape); + + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(getRun(xParagraph, 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, getProperty(getRun(xParagraph, 2), "CharColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148273_sectionBulletFormatLeak, "tdf148273_sectionBulletFormatLeak.docx") +{ + // get a paragraph with bullet point after section break + uno::Reference xParagraph = getParagraph(4); + uno::Reference xProps(xParagraph, uno::UNO_QUERY); + + // Make sure that the bullet has no ListAutoFormat inherited from + // the empty paragraph before the section break + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 1 + // i.e. empty paragraph formats from the first section leaked to the bullet's formatting + uno::Any aValue = xProps->getPropertyValue("ListAutoFormat"); + CPPUNIT_ASSERT_EQUAL(false, aValue.hasValue()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf149089, "tdf149089.docx") +{ + uno::Reference xPageStyles = getStyles("PageStyles"); + uno::Reference xPageStyle(xPageStyles->getByName("Standard"), uno::UNO_QUERY); + sal_Int16 nGridMode; + xPageStyle->getPropertyValue("GridMode") >>= nGridMode; + CPPUNIT_ASSERT_EQUAL( sal_Int16(text::TextGridMode::LINES), nGridMode); // was LINES_AND_CHARS +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf139128) +{ + loadAndReload("tdf139128.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 0 + // i.e. the line break was lost on export. + assertXPath(pXmlDoc, "//w:br"_ostr, 2); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx new file mode 100644 index 0000000000..967a4f2418 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx @@ -0,0 +1,879 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testTdf150197_predefinedNumbering) +{ + createSwDoc(); + + // The exact numbering style doesn't matter - just any non-bullet pre-defined numbering style. + uno::Sequence aPropertyValues = comphelper::InitPropertySequence({ + { "Style", uno::Any(OUString("Numbering 123")) }, + { "FamilyName", uno::Any(OUString("NumberingStyles")) }, + }); + dispatchCommand(mxComponent, ".uno:StyleApply", aPropertyValues); + + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(getParagraph(1), "ListLabelString")); + + saveAndReload("Office Open XML Text"); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(getParagraph(1), "ListLabelString")); +} + +CPPUNIT_TEST_FIXTURE(Test, testInlineSdtHeader) +{ + // Without the accompanying fix in place, this test would have failed with an assertion failure, + // we produced not-well-formed XML on save. + loadAndSave("inline-sdt-header.docx"); +} + +CPPUNIT_TEST_FIXTURE(Test, testCellSdtRedline) +{ + // Without the accompanying fix in place, this test would have failed with an assertion failure, + // we produced not-well-formed XML on save. + loadAndSave("cell-sdt-redline.docx"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf148956_directEndFormatting, "tdf148956_directEndFormatting.docx") +{ + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // pWrtShell->EndPara(/*bSelect=*/true); + dispatchCommand(mxComponent, ".uno:GotoEndOfPara", {}); + if (!isExported()) + { + CPPUNIT_ASSERT_MESSAGE( + "Has direct formatting", + pWrtShell->GetCursor()->GetPoint()->GetNode().GetTextNode()->GetpSwpHints()); + } + else + { + CPPUNIT_ASSERT_MESSAGE( + "Direct formatting cleared", + !pWrtShell->GetCursor()->GetPoint()->GetNode().GetTextNode()->GetpSwpHints()); + } + + pWrtShell->SttPara(/*bSelect=*/true); + dispatchCommand(mxComponent, ".uno:ResetAttributes", {}); + + dispatchCommand(mxComponent, ".uno:GotoEndOfPara", {}); + + CPPUNIT_ASSERT_MESSAGE( + "Direct formatting cleared", + !pWrtShell->GetCursor()->GetPoint()->GetNode().GetTextNode()->GetpSwpHints()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf147646, "tdf147646_mergedCellNumbering.docx") +{ + parseLayoutDump(); + //Without the fix in place, it would have failed with + //- Expected: 2. + //- Actual : 4. + CPPUNIT_ASSERT_EQUAL(OUString("2."),parseDump("/root/page/body/tab/row[4]/cell/txt/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr,"expand"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153526_commentInNumbering, "tdf153526_commentInNumbering.docx") +{ + // an exception was prematurely ending finishParagraph, losing numbering and CRs + // so before the patch, this was 6. + CPPUNIT_ASSERT_EQUAL(13, getParagraphs()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153042_largeTab, "tdf153042_largeTab.docx") +{ + // This is not the greatest test because it is slightly weird, and has a different layout + // in MS Word 2010/2003 than it does in Word 2019. This tests for the 2019 layout. + // Additionally (in Word 2019), going to paragraph properties and hitting OK changes the layout. + // It changes back by going to outline numbering properties and hitting OK. + + // export does not keep the tabstop when exporting non-numbering. (Probably a good thing...) + if (isExported()) + return; + + const auto& pLayout = parseLayoutDump(); + // Ensure a large tabstop is used in the pseudo-numbering (numbering::NONE followed by tabstop) + assertXPath(pLayout, "//SwFixPortion"_ostr, "width"_ostr, "1701"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153042_noTab, "tdf153042_noTab.docx") +{ + // This is not the greatest test because it is slightly weird. + // It is the same as the "largeTab" file, except the paragraph properties were viewed + // and OK'ed, and now it looks like how Word 2010 and 2003 were laying it out. + // Amazingly, LO is handling both documents correctly at the moment, so let's unit test that... + + // export does not keep the tabstop when exporting non-numbering. (Probably a good thing...) + if (isExported()) + return; + + const auto& pLayout = parseLayoutDump(); + // Ensure a miniscule tab is used in the pseudo-numbering (numbering::NONE followed by tabstop) + assertXPath(pLayout, "//SwFixPortion"_ostr, "width"_ostr, "10"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf154751_dualStrikethrough, "tdf154751_dualStrikethrough.docx") +{ + auto nStrike = getProperty(getRun(getParagraph(1), 1), "CharStrikeout"); + CPPUNIT_ASSERT_EQUAL(awt::FontStrikeout::SINGLE, nStrike); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf154478) +{ + loadAndSave("tdf154478.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/comments.xml"); + + OUString aValues[5] = { "Comment1 seen.", "Comment2 seen.", "Comment3 NOTseen.", "Comment4 NOTseen.", "Comment5 NOTseen." }; + for (size_t i = 1; i < 6; ++i) + { + OString sPath = "/w:comments/w:comment[" + OString::number(i) + "]/w:p/w:r/w:t"; + + // Without the fix in place, this test would have failed with + // - In <>, XPath '/w:comments/w:comment[3]/w:p/w:r/w:t' not found + assertXPathContent(pXmlDoc, sPath, aValues[i - 1]); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf153592_columnBreaks) +{ + loadAndSave("tdf153592_columnBreaks.docx"); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // The two column breaks were lost on import. (I wouldn't complain if they were at 3,5) + assertXPath(pXmlDoc, "//w:br"_ostr, 2); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf104394_lostTextbox, "tdf104394_lostTextbox.docx") +{ + // This was only one page b/c the textbox was missing. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf146984_anchorInShape, "tdf146984_anchorInShape.docx") +{ + // This was only one page b/c the page break was missing. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf127622_framePr, "tdf127622_framePr.docx") +{ + // All the paragraphs end up with the same frame definition, so put them all in one frame + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf105035_framePrB, "tdf105035_framePrB.docx") +{ + // The paragraphs have different frame definitions, so they must be in separate frames, + // and the frames must not overlap - even though their vertical positions are identical. + const auto& pLayout = parseLayoutDump(); + sal_Int32 n1stFlyBottom + = getXPath(pLayout, "//page[1]//anchored/fly[1]/infos/bounds"_ostr, "bottom"_ostr).toInt32(); + sal_Int32 n2ndFlyTop + = getXPath(pLayout, "//page[1]//anchored/fly[2]/infos/bounds"_ostr, "top"_ostr).toInt32(); + CPPUNIT_ASSERT_GREATER(n1stFlyBottom, n2ndFlyTop); //Top is greater than bottom + + // Impossible layout TODO: the textboxes are in the wrong order. + OUString sTextBox1("Preparation of Papers for IEEE TRANSACTIONS and JOURNALS (November 2012)"); + CPPUNIT_ASSERT_MESSAGE("DID YOU FIX ME? Wow - I didn't think this would be possible!", + !getXPathContent(pLayout, "//page[1]//anchored/fly[1]/txt"_ostr).startsWith(sTextBox1)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf105035_framePrC, "tdf105035_framePrC.docx") +{ + // The paragraphs have different frame definitions, so they must be in separate frames, + // and the frames DO overlap this time. + const auto& pLayout = parseLayoutDump(); + sal_Int32 n1stFlyTop + = getXPath(pLayout, "//page[1]//anchored/fly[1]/infos/bounds"_ostr, "top"_ostr).toInt32(); + sal_Int32 n2ndFlyTop + = getXPath(pLayout, "//page[1]//anchored/fly[2]/infos/bounds"_ostr, "top"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(n1stFlyTop, n2ndFlyTop); //both frames start at the same position +} + +DECLARE_OOXMLEXPORT_TEST(testTdf154129_framePr1, "tdf154129_framePr1.docx") +{ + for (size_t i = 1; i < 4; ++i) + { + uno::Reference xTextFrame = getShape(i); + // The anchor is defined in the style, and only the first style was checked, not the parents + auto nAnchor = getProperty(xTextFrame, "HoriOrientRelation"); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, nAnchor); + nAnchor = getProperty(xTextFrame, "VertOrientRelation"); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, nAnchor); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf154703_framePr, "tdf154703_framePr.docx") +{ + // the frame conversion had been failing, so it imported as plain text only. + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf154703_framePr2, "tdf154703_framePr2.rtf") +{ + // framePr frames are always imported as fully transparent + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(getShape(1), "FillTransparence")); + + // as opposed to testLibreOfficeHang (RTF != INVERT_BORDER_SPACING) do not duplicate left/right + uno::Reference xTextRange(getShape(1), uno::UNO_QUERY); + uno::Reference xText = xTextRange->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("framePr"), getParagraphOfText(1, xText)->getString()); + sal_Int32 nFrame = getProperty(getShape(1), "LeftBorderDistance"); + sal_Int32 nPara = getProperty(getParagraphOfText(1, xText), "LeftBorderDistance"); + if (!isExported()) // RTF + CPPUNIT_ASSERT_EQUAL(sal_Int32(529), nFrame + nPara); + else // DOCX + CPPUNIT_ASSERT_EQUAL(sal_Int32(529*2), nFrame + nPara); + + if (!isExported()) + { + // Fill the frame with a red background. It should be transferred on export to the paragraph + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + xFrame->setPropertyValue("FillColor", uno::Any(COL_RED)); + xFrame->setPropertyValue("FillTransparence", uno::Any(static_cast(0))); + + return; + } + + // exported: framed paragraphs without a background should now have a red background + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:body/w:p[1]/w:pPr/w:shd"_ostr, "fill"_ostr, "800000"); + assertXPath(pXmlDoc, "//w:body/w:p[2]/w:pPr/w:shd"_ostr, "fill"_ostr, "548DD4"); // was blue already, no change + assertXPath(pXmlDoc, "//w:body/w:p[3]/w:pPr/w:shd"_ostr, "fill"_ostr, "800000"); + assertXPath(pXmlDoc, "//w:body/w:p[3]/w:pPr/w:framePr"_ostr, "yAlign"_ostr, "center"); + assertXPathNoAttribute(pXmlDoc, "//w:body/w:p[3]/w:pPr/w:framePr"_ostr, "y"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf154703_framePrWrapSpacing, "tdf154703_framePrWrapSpacing.docx") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); + if (!isExported()) + return; + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // before the fix, this was half of the correct value. + assertXPath(pXmlDoc, "//w:body/w:p/w:pPr/w:framePr"_ostr, "hSpace"_ostr, "2552"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf154703_framePrTextDirection, "tdf154703_framePrTextDirection.docx") +{ + CPPUNIT_ASSERT_EQUAL(sal_Int16(text::WritingMode2::TB_RL), getProperty(getShape(1), "WritingMode")); + if (!isExported()) + return; + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:body/w:p/w:pPr/w:textDirection"_ostr, "val"_ostr, "tbRl"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_anchoredAfterPgBreak, "tdf153613_anchoredAfterPgBreak.docx") +{ + const auto& pLayout = parseLayoutDump(); + // An anchored TO character image anchors before the page break. + assertXPath(pLayout, "//page[1]//anchored"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_anchoredAfterPgBreak2, "tdf153613_anchoredAfterPgBreak2.docx") +{ + const auto& pLayout = parseLayoutDump(); + // An anchored TO character image, followed by more characters moves to the following page + assertXPath(pLayout, "//page[2]//anchored"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_anchoredAfterPgBreak3, "tdf153613_anchoredAfterPgBreak3.docx") +{ + const auto& pLayout = parseLayoutDump(); + // An anchored TO character image, with setting splitPgBreakAndParaMark moves to the following page + assertXPath(pLayout, "//page[2]//anchored"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_anchoredAfterPgBreak6, "tdf153613_anchoredAfterPgBreak6.docx") +{ + // An anchored TO character image, followed by more characters moves to the following page + // The difference from test 2 is that it is not the first character run + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(4, getParagraphs()); + + const auto& pLayout = parseLayoutDump(); + CPPUNIT_ASSERT_EQUAL(OUString("y"), getXPathContent(pLayout, "//page[2]/body/txt[1]"_ostr)); + assertXPath(pLayout, "//page[1]//anchored"_ostr, 1); // DID YOU FIX ME? This should be page[2] +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_inlineAfterPgBreak, "tdf153613_inlineAfterPgBreak.docx") +{ + const auto& pLayout = parseLayoutDump(); + // An inline AS character image moves to the following page when after the page break. + assertXPath(pLayout, "//page[2]//anchored"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_inlineAfterPgBreak2, "tdf153613_inlineAfterPgBreak2.docx") +{ + // An inline AS character image moves to the following page when after the page break. + // The difference from the previous test is that it is not the first character run + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(4, getParagraphs()); + + const auto& pLayout = parseLayoutDump(); + CPPUNIT_ASSERT_EQUAL(OUString("x"), getXPathContent(pLayout, "//page[1]/body/txt[2]"_ostr)); + assertXPath(pLayout, "//page[2]//anchored"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_sdtAfterPgBreak, "tdf153613_sdtAfterPgBreak.docx") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153613_textboxAfterPgBreak3, "tdf153613_textboxAfterPgBreak3.docx") +{ + // both textboxes on on the second (last) page + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + const auto& pLayout = parseLayoutDump(); + assertXPath(pLayout, "//page[2]/body/txt/anchored/fly"_ostr, 2); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153964_topMarginAfterBreak14, "tdf153964_topMarginAfterBreak14.docx") +{ + //The top margin should only apply once in a split paragraph. + //In this compat14 (Windows 2010) version, it applies after the break if no prior visible run. + uno::Reference xPara(getParagraph(2, "a w:br at the start of the document. Does it use 60 point top margin?"), uno::UNO_QUERY); + //CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty(xPara, "ParaTopMargin")); + + xPara.set(getParagraph(3, u"60 pt spacing before"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty(xPara, "ParaBackColor")); + + // The top margin was applied to paragraph 3, so it shouldn't apply here + xPara.set(getParagraph(4, u"column break1"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty(xPara, "ParaBackColor")); + + xPara.set(getParagraph(5, u"60 pt followed by page break"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xdeeaf6), getProperty(xPara, "ParaBackColor")); + + // The top margin was applied to paragraph 5, so it shouldn't apply here + xPara.set(getParagraph(6, u"page break1"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xdeeaf6), getProperty(xPara, "ParaBackColor")); + + // The top margin was not applied yet, so with compat14 it should apply here. + xPara.set(getParagraph(7, u"column break2"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xe2efd9), getProperty(xPara, "ParaBackColor")); + + // In an odd twist, the w:br was actually at the end of the previous w:p, so in that case + // we ignore the top margin definition this time. + xPara.set(getParagraph(9, u"page break2"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + + // The top margin was not applied before the column break, so with compat14 it should apply here + xPara.set(getParagraph(10, u""_ustr), uno::UNO_QUERY); // after column break + CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xfff2cc), getProperty(xPara, "ParaBackColor")); + + // In an odd twist, the w:br was actually at the end of the previous w:p, so in that case + // we ignore the top margin definition this time. + xPara.set(getParagraph(12, u""_ustr), uno::UNO_QUERY); // after page break + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153964_topMarginAfterBreak15, "tdf153964_topMarginAfterBreak15.docx") +{ + //The top margin should only apply once (at most) in a split paragraph. + //In this compat15 (Windows 2013) version, it never applies after the break. + uno::Reference xPara(getParagraph(2, "a w:br at the start of the document. Does it use 60 point top margin?"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + + xPara.set(getParagraph(3, u"60 pt spacing before"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty(xPara, "ParaBackColor")); + + // The top margin was applied to paragraph 3, so it shouldn't apply here + xPara.set(getParagraph(4, u"column break1"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xfbe4d5), getProperty(xPara, "ParaBackColor")); + + xPara.set(getParagraph(5, u"60 pt followed by page break"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2117), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xdeeaf6), getProperty(xPara, "ParaBackColor")); + + // The top margin was applied to paragraph 5, so it shouldn't apply here + xPara.set(getParagraph(6, u"page break1"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xdeeaf6), getProperty(xPara, "ParaBackColor")); + + // The top margin was not applied to paragraph 6, and with compat15 it shouldn't apply here. + xPara.set(getParagraph(7, u"column break2"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xe2efd9), getProperty(xPara, "ParaBackColor")); + + // The top margin not was applied to paragraph 8, and with compat15 it shouldn't apply here. + xPara.set(getParagraph(9, u"page break2"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + + // The top margin was not applied to paragraph 9, and with compat15 it shouldn't apply here. + xPara.set(getParagraph(10, u""_ustr), uno::UNO_QUERY); // after column break + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); + CPPUNIT_ASSERT_EQUAL(Color(0xfff2cc), getProperty(xPara, "ParaBackColor")); + + // The top margin was not applied to paragraph 11, and with compat15 it shouldn't apply here. + xPara.set(getParagraph(12, u""_ustr), uno::UNO_QUERY); // after page break + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaTopMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153964_numberingAfterBreak14, "tdf153964_numberingAfterBreak14.docx") +{ + //Numbering should only apply once in a split paragraph. + uno::Reference xPara(getParagraph(2, "How numbering affected by a column break?"), uno::UNO_QUERY); + //CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(3, "How is numbering affected by a page break?"), uno::UNO_QUERY); + //CPPUNIT_ASSERT_EQUAL(OUString("2."), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(4, "x"), uno::UNO_QUERY); + //CPPUNIT_ASSERT_EQUAL(OUString("3."), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(5, "column break"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(6, "y"), uno::UNO_QUERY); + //CPPUNIT_ASSERT_EQUAL(OUString("3."), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(7, "page break"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf153964_firstIndentAfterBreak14, "tdf153964_firstIndentAfterBreak14.docx") +{ + //First line indents should only apply once in a split paragraph. + uno::Reference xPara(getParagraph(2, "How is first line indent affected by a column break?"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty(xPara, "ParaFirstLineIndent")); + xPara.set(getParagraph(3, "How is first line indent affected by a page break?"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty(xPara, "ParaFirstLineIndent")); + xPara.set(getParagraph(4, "x"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty(xPara, "ParaFirstLineIndent")); + xPara.set(getParagraph(5, "column break"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaFirstLineIndent")); + xPara.set(getParagraph(6, "y"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2000), getProperty(xPara, "ParaFirstLineIndent")); + xPara.set(getParagraph(7, "page break"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPara, "ParaFirstLineIndent")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf148834_lineNumbering) +{ + loadAndSave("tdf148834_lineNumbering.odt"); + + xmlDocUniquePtr pStylesXml = parseExport("word/styles.xml"); + // user specified: do not include in line numbering + assertXPath(pStylesXml, "//w:style[@w:styleId='Normal']/w:pPr/w:suppressLineNumbers"_ostr, 1); + // even though it matches the parent style, these should always avoid showing line numbering + assertXPath(pStylesXml, "//w:style[@w:styleId='Footer']/w:pPr/w:suppressLineNumbers"_ostr, 1); + assertXPath(pStylesXml, + "//w:style[@w:styleId='0NUMBERED']/w:pPr/w:suppressLineNumbers"_ostr, "val"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf157598) +{ + loadAndSave("tdf157598.docx"); + + xmlDocUniquePtr pStylesXml = parseExport("word/styles.xml"); + + // Without the fix in place, this test would have failed with + // - Expected: 0 + // - Actual : 1 + assertXPath(pStylesXml, "//w:style[@w:styleId='Normal']/w:rPr/w:rtl"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf76022_textboxWrap) +{ + // Granted, this is an ODT with a bit of an anomaly - tables ignore fly wrapping. + createSwDoc("tdf76022_textboxWrap.odt"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Did you make wrapping sane/interoperable?", 1, getPages()); + + // When saving to DOCX, the table should obey the fly wrapping + saveAndReload("Office Open XML Text"); + + // The fly takes up the whole page, so the table needs to shift down to the next page. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf134114_allowOverlap, "tdf134114_allowOverlap.docx") +{ + // CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT(!getProperty(getShape(1), "AllowOverlap")); + CPPUNIT_ASSERT(getProperty(getShape(2), "AllowOverlap")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf149551_mongolianVert) +{ + // Given a docx document with a shape with vert="mongolianVert". + createSwDoc("tdf149551_mongolianVert.docx"); + + // The shape is imported as custom shape with attached frame. + // Without fix the shape itself had WritingMode = 0 = LR_TB, + // the frame in it had WritingMode = 2 = TB_RL. + // It should be WritingMode = 3 = TB_LR in both cases. + const sal_Int16 eExpected(text::WritingMode2::TB_LR); + CPPUNIT_ASSERT_EQUAL(eExpected, getProperty(getShape(1), "WritingMode")); + uno::Reference xShapeProps(getShape(1), uno::UNO_QUERY); + uno::Reference xFrameProps(xShapeProps->getPropertyValue("TextBoxContent"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(eExpected, getProperty(xFrameProps, "WritingMode")); + + // Such shape must have vert="mongolianVert" again after saving. + // Without fix the orientation was vert="vert". + save("Office Open XML Text"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//wps:bodyPr"_ostr, "vert"_ostr, "mongolianVert"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf151912, "tdf151912.docx") +{ + // For now just ensure roundtrip is successful + + //tdf#151548 - ensure block SDT preserves id (instead of random re-assignment) + if (!isExported()) + return; + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:sdt//w:sdtPr/w:id"_ostr, "val"_ostr, "1802566103"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf147724, "tdf147724.docx") +{ + const auto& pLayout = parseLayoutDump(); + + // Ensure we load field value from external XML correctly (it was "HERUNTERLADEN") + assertXPathContent(pLayout, "/root/page[1]/body/txt[1]"_ostr, "Placeholder -> *ABC*"); + + // This SDT has no storage id, it is not an error, but content can be taken from any suitable XML + // There 2 variants possible, both are acceptable + OUString sFieldResult = getXPathContent(pLayout, "/root/page[1]/body/txt[2]"_ostr); + CPPUNIT_ASSERT(sFieldResult == "Placeholder -> *HERUNTERLADEN*" || sFieldResult == "Placeholder -> *ABC*"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf130782, "chart.docx") +{ + uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xAccess->getCount()); + uno::Reference xObj(xAccess->getByIndex(0), uno::UNO_QUERY); + + // these properties were not imported + CPPUNIT_ASSERT_EQUAL(OUString("Diagramm 1"), xObj->getName()); + CPPUNIT_ASSERT_EQUAL(OUString("uninspired default chart"), getProperty(xObj, "Title")); + CPPUNIT_ASSERT_EQUAL(OUString("the description is here"), getProperty(xObj, "Description")); +} + +CPPUNIT_TEST_FIXTURE(Test, testNumberPortionFormatFromODT) +{ + // Given a document with a single paragraph, direct formatting asks 24pt font size for the + // numbering and the text portion: + createSwDoc("number-portion-format.odt"); + + // When saving to DOCX: + save("Office Open XML Text"); + + // Then make sure that the paragraph marker's char format has that custom font size: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - XPath '//w:pPr/w:rPr/w:sz' number of nodes is incorrect + // i.e. was missing under 's . + assertXPath(pXmlDoc, "//w:pPr/w:rPr/w:sz"_ostr, "val"_ostr, "48"); +} + +CPPUNIT_TEST_FIXTURE(Test, testParaStyleCharPosition) +{ + // Given a loaded document where the Normal paragraph style has : + createSwDoc("para-style-char-position.docx"); + + // When saving it back to DOCX: + save("Office Open XML Text"); + + // Then make sure that is not turned into a normal subscript text: + xmlDocUniquePtr pXmlDoc = parseExport("word/styles.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - XPath '/w:styles/w:style[@w:styleId='Normal']/w:rPr/w:position' number of nodes is incorrect + // i.e. we wrote instead of . + assertXPath(pXmlDoc, "/w:styles/w:style[@w:styleId='Normal']/w:rPr/w:position"_ostr, "val"_ostr, "-1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf150966_regularInset) +{ + // Given a docx document with a rectangular shape with height cy="900000" (EMU), tIns="180000" + // and bIns="360000", resulting in 360000EMU text area height. + createSwDoc("tdf150966_regularInset.docx"); + + // The shape is imported as custom shape with attached frame. + // The insets are currently imported as margin top="4.99mm" and bottom="10mm". + // That should result in tIns="179640" and bIns="360000" on export. + + // Without fix the insets were tIns="359280" and bIns="539640". The text area had 1080Emu height + // and Word displays no text at all. + save("Office Open XML Text"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathAttrs(pXmlDoc, "//wps:bodyPr"_ostr, { { "tIns", "179640" }, { "bIns", "360000" } }); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152636_lostPageBreak) +{ + loadAndReload("tdf152636_lostPageBreak.odt"); + + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152636_lostPageBreak2) +{ + loadAndReload("tdf152636_lostPageBreak2.docx"); + + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdtDuplicatedId) +{ + // Given a document with 2 inline , with each a : + createSwDoc("sdt-duplicated-id.docx"); + + // When exporting that back to DOCX: + save("Office Open XML Text"); + + // Then make sure we write 2 and no duplicates: + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 2 + // - Actual : 4 + // i.e. grab-bags introduced 2 unwanted duplicates. + assertXPath(pXmlDoc, "//w:sdt"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testImageCropping) +{ + loadAndReload("crop-roundtrip.docx"); + + // the image has no cropping after roundtrip, because it has been physically cropped + // NB: this test should be fixed when the core feature to show image cropped when it + // has the "GraphicCrop" is set is implemented + auto aGraphicCropStruct = getProperty(getShape(1), "GraphicCrop"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aGraphicCropStruct.Left); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aGraphicCropStruct.Right); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aGraphicCropStruct.Top); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), aGraphicCropStruct.Bottom); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152200) +{ + // Given a document with a fly anchored after a FORMTEXT in the end of the paragraph: + createSwDoc("tdf152200-field+textbox.docx"); + + // When exporting that back to DOCX: + save("Office Open XML Text"); + + // Then make sure that fldChar with type 'end' goes prior to the at-char anchored fly. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + const int nRunsBeforeFldCharEnd = countXPathNodes(pXmlDoc, "//w:fldChar[@w:fldCharType='end']/preceding::w:r"_ostr); + CPPUNIT_ASSERT(nRunsBeforeFldCharEnd); + const int nRunsBeforeAlternateContent = countXPathNodes(pXmlDoc, "//mc:AlternateContent/preceding::w:r"_ostr); + CPPUNIT_ASSERT(nRunsBeforeAlternateContent); + // Without the accompanying fix in place, this test would have failed with: + // - Expected greater than: 6 + // - Actual : 5 + CPPUNIT_ASSERT_GREATER(nRunsBeforeFldCharEnd, nRunsBeforeAlternateContent); + // Make sure we only have one paragraph in body, and only three field characters overall, + // located directly in runs of this paragraph + assertXPath(pXmlDoc, "/w:document/w:body/w:p"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:fldChar"_ostr, 3); + assertXPath(pXmlDoc, "//w:fldChar"_ostr, 3); // no field characters elsewhere +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf126477) +{ + loadAndReload("embedded_chart.odt"); + + uno::Reference xTEOSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xAccess(xTEOSupplier->getEmbeddedObjects()); + uno::Sequence aSeq(xAccess->getElementNames()); + + // Check number of embedded objects. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aSeq.getLength()); + + uno::Reference xEOSupplier(xAccess->getByName(aSeq[0]), + uno::UNO_QUERY); + uno::Reference xObj(xEOSupplier->getEmbeddedObject()); + uno::Reference xTEOSupplier2(xObj, uno::UNO_QUERY); + uno::Reference xAccess2(xTEOSupplier2->getEmbeddedObjects()); + uno::Sequence aSeq2(xAccess2->getElementNames()); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // i.e. the chart lost in the embedded document. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aSeq2.getLength()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf152425) +{ + loadAndReload("tdf152425.docx"); + + // Check that "List Number" and "List 5" styles don't get merged + const OUString Para3Style = getProperty(getParagraph(3), "ParaStyleName"); + CPPUNIT_ASSERT_EQUAL(OUString("Numbering 1"), Para3Style); + const OUString Para4Style = getProperty(getParagraph(4), "ParaStyleName"); + CPPUNIT_ASSERT_EQUAL(OUString("List 5 (WW)"), Para4Style); + // Also check that "List 5" and "List Bullet 5" styles don't get merged + const OUString Para5Style = getProperty(getParagraph(5), "ParaStyleName"); + CPPUNIT_ASSERT_EQUAL(OUString("List 5"), Para5Style); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf153104) +{ + loadAndReload("tdf153104.docx"); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + OUString numId = getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:numPr/w:numId"_ostr, "val"_ostr); + + xmlDocUniquePtr pXmlNum = parseExport("word/numbering.xml"); + OString numPath = "/w:numbering/w:num[@w:numId='" + + OUStringToOString(numId, RTL_TEXTENCODING_ASCII_US) + "']/"; + + // Check that first level's w:lvlOverride/w:startOverride is written correctly: + // the list defines starting value of 10, which must be kept upon second level + // numbering reset. + // Without the fix, this would fail with + // - Expected: 1 + // - Actual : 0 + // - In <>, XPath '/w:numbering/w:num[@w:numId='3']/w:lvlOverride[@w:ilvl='0']/w:startOverride' number of nodes is incorrect + assertXPath(pXmlNum, numPath + "w:lvlOverride[@w:ilvl='0']/w:startOverride", "val"_ostr, "10"); + assertXPath(pXmlNum, numPath + "w:lvlOverride[@w:ilvl='1']/w:startOverride", "val"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf153128) +{ + loadAndReload("tdf153128.docx"); + calcLayout(); + sal_Int32 nFirstLineHeight + = parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion"_ostr, "height"_ostr) + .toInt32(); + CPPUNIT_ASSERT_GREATER(sal_Int32(0), nFirstLineHeight); + + // The text height is 1 pt, i.e. 20 twip; without the fix, it would fail with + // - Expected less than: 30 + // - Actual : 414 + CPPUNIT_ASSERT_LESS(sal_Int32(30), nFirstLineHeight); +} + +CPPUNIT_TEST_FIXTURE(Test, testExportingUnknownStyleInRedline) +{ + // This must not fail assertions + loadAndReload("UnknownStyleInRedline.docx"); + // Check that the original unknown style name "UnknownStyle" is roundtripped + // (maybe this is wrong, because Word does not do this). + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, + "/w:document/w:body/w:p/w:pPr/w:pPrChange/w:pPr/w:pStyle[@w:val='UnknownStyle']"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf148026) +{ + loadAndReload("tdf148026.fodt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // - In <>, XPath '//w:hyperlink' number of nodes is incorrect + // i.e. a HYPERLINK field was exported instead of the hyperlink XML element. + assertXPath(pXmlDoc, "//w:hyperlink"_ostr, "tgtFrame"_ostr, "_self"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf153664) +{ + loadAndReload("Table-of-Figures.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + CPPUNIT_ASSERT(pXmlStyles); + // Without the fix this was styleId='FigureIndex1' and name was "Figure Index 1" + // This led to style settings being reset when ToF was updated in Word + // TOF's paragraph style should be exported as "Table of Figures" as that's the default Word style name + assertXPath(pXmlStyles, "/w:styles/w:style[12]"_ostr, "styleId"_ostr, "TableofFigures"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='TableofFigures']/w:name"_ostr, "val"_ostr, "Table of Figures"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf124472_hyperlink, "tdf124472.docx") +{ + CPPUNIT_ASSERT_EQUAL(OUString("https://www.libreoffice.org/"), + getProperty(getRun(getParagraph(1), 1), "HyperLinkURL")); + CPPUNIT_ASSERT_EQUAL(OUString("mailto:info@libreoffice.org"), + getProperty(getRun(getParagraph(2), 1), "HyperLinkURL")); + CPPUNIT_ASSERT_EQUAL(OUString(""), + getProperty(getRun(getParagraph(3), 1), "HyperLinkURL")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf135786, "tdf135786.docx") +{ + // Empty first line remain, if the section's initial dummy paragraph is not deleted: + // - Expected: 2 + // - Actual : 3 + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf155736, "tdf155736_PageNumbers_footer.docx") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/footer"_ostr); + assertXPath(pXmlDoc, "/root/page[2]/footer"_ostr); + //Without the fix in place, it would have failed with + //- Expected: Page * of * + //- Actual : Page of + CPPUNIT_ASSERT_EQUAL(OUString("Page * of *"), parseDump("/root/page[1]/footer/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Page * of *"), parseDump("/root/page[2]/footer/txt/text()"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf155903, "tdf155903.odt") +{ + // Without the accompanying fix in place, this test would have crashed, + // because the exported file was corrupted. +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport19.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport19.cxx new file mode 100644 index 0000000000..0c1d1a25fb --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport19.cxx @@ -0,0 +1,1224 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") + { + } +}; + +DECLARE_OOXMLEXPORT_TEST(testFdo78939, "fdo78939.docx") +{ + // fdo#78939 : LO hanged while opening issue document + + // Whenever a para-style was applied to a Numbering format level, + // LO incorrectly also changed the para-style... + + // check that file opens and does not hang while opening and also + // check that an incorrect numbering style is not applied ... + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(getParagraph(1), "NumberingStyleName")); +} + +DECLARE_OOXMLEXPORT_TEST(testFootnote, "footnote.docx") +{ + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xFootnote(xFootnotes->getByIndex(0), uno::UNO_QUERY); + OUString aFootnote = xFootnote->getString(); + // Ensure there are no additional newlines after "bar". + CPPUNIT_ASSERT(aFootnote.endsWith("bar")); +} + +DECLARE_OOXMLEXPORT_TEST(testTableBtlrCenter, "table-btlr-center.docx") +{ + // Note that this is btLr text, so layout and doc model horizontal/vertical is the opposite of + // each other. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A2"); + // Cell vertical alignment was CENTER, should be NONE. + CPPUNIT_ASSERT_EQUAL(text::VertOrientation::NONE, getProperty(xCell, "VertOrient")); + + // Cell horizontal alignment should be CENTER. + uno::Reference xCellText(xCell, uno::UNO_QUERY); + auto nActual = getProperty(getParagraphOfText(1, xCellText), "ParaAdjust"); + CPPUNIT_ASSERT_EQUAL(static_cast(style::ParagraphAdjust_CENTER), nActual); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo80555, "fdo80555.docx") +{ + uno::Reference xShape = getShape(1); + // Shape was wrongly placed at X=0, Y=0 + CPPUNIT_ASSERT_EQUAL(sal_Int32(3318), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(247), xShape->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf104418) +{ + loadAndReload("tdf104418.odt"); + // Problem was that cell property was ignored. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + + // Without the fix in place, this test would have failed with + // - Expected: 750 + // - Actual : 1499 + CPPUNIT_ASSERT_EQUAL(sal_Int64(750), + getProperty(xTableRows->getByIndex(0), "Height")); +} + +DECLARE_OOXMLEXPORT_TEST(testHidemark, "hidemark.docx") +{ + // Problem was that cell property was ignored. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + // Height should be minimal + CPPUNIT_ASSERT_EQUAL(convertTwipToMm100(MINLAY), + getProperty(xTableRows->getByIndex(1), "Height")); + // Size type was MIN, should be FIX to avoid considering the end of paragraph marker. + CPPUNIT_ASSERT_EQUAL(text::SizeType::FIX, + getProperty(xTableRows->getByIndex(1), "SizeType")); + + //tdf#104876: Width was not recognized during import when table size was 'auto' + CPPUNIT_ASSERT_MESSAGE("table size is less than 7000?", + sal_Int32(7000) > getProperty(xTextTable, "Width")); +} + +DECLARE_OOXMLEXPORT_TEST(testHidemarkb, "tdf99616_hidemarkb.docx") +{ + // Problem was that the smallest possible height was forced, not the min specified size. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTextTable->getRows(); + // Height should be .5cm + CPPUNIT_ASSERT_EQUAL(sal_Int64(501), + getProperty(xTableRows->getByIndex(1), "Height")); + // Size type was MIN, should be FIX to avoid considering the end of paragraph marker. + CPPUNIT_ASSERT_EQUAL(text::SizeType::FIX, + getProperty(xTableRows->getByIndex(1), "SizeType")); +} + +DECLARE_OOXMLEXPORT_TEST(testBnc891663, "bnc891663.docx") +{ + // The image should be inside a cell, so the text in the following cell should be below it. + int imageTop + = parseDump("/root/page/body/tab/row[1]/cell[2]/txt[1]/anchored/fly/infos/bounds"_ostr, + "top"_ostr) + .toInt32(); + int imageHeight + = parseDump("/root/page/body/tab/row[1]/cell[2]/txt[1]/anchored/fly/infos/bounds"_ostr, + "height"_ostr) + .toInt32(); + int textNextRowTop + = parseDump("/root/page/body/tab/row[2]/cell[1]/txt[1]/infos/bounds"_ostr, "top"_ostr) + .toInt32(); + CPPUNIT_ASSERT(textNextRowTop >= imageTop + imageHeight); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf123104, "tdf123104.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("E1"); + // See SwXCell::getPropertyValue(), we really put 'long' into an Any there. + // Without the accompanying fix in place, this test would have failed with 'Expected: 3;Actual : + // 2', i.e. the vertical merge covered one less cell, resulting in a cell with white background. + CPPUNIT_ASSERT_EQUAL(static_cast(3), getProperty(xCell, "RowSpan")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo85542, "fdo85542.docx") +{ + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(3), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("B1")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("B2")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("B3")); + // B1 + uno::Reference xContent1(xBookmarksByName->getByName("B1"), uno::UNO_QUERY); + uno::Reference xRange1 = xContent1->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("ABB"), xRange1->getString()); + // B2 + uno::Reference xContent2(xBookmarksByName->getByName("B2"), uno::UNO_QUERY); + uno::Reference xRange2 = xContent2->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("BBC"), xRange2->getString()); + // B3 -- testing a collapsed bookmark + uno::Reference xContent3(xBookmarksByName->getByName("B3"), uno::UNO_QUERY); + uno::Reference xRange3 = xContent3->getAnchor(); + CPPUNIT_ASSERT_EQUAL(xRange3->getString(), OUString()); + uno::Reference xText = xRange3->getText(); + uno::Reference xNeighborhoodCursor = xText->createTextCursor(); + xNeighborhoodCursor->gotoRange(xRange3, false); + xNeighborhoodCursor->goLeft(1, false); + xNeighborhoodCursor->goRight(2, true); + CPPUNIT_ASSERT_EQUAL(OUString("AB"), xNeighborhoodCursor->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf65955) +{ + loadAndReload("tdf65955.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("a")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("b")); + // a + uno::Reference xContent3(xBookmarksByName->getByName("a"), uno::UNO_QUERY); + uno::Reference xRange3 = xContent3->getAnchor(); + CPPUNIT_ASSERT_EQUAL(xRange3->getString(), OUString()); + // b + uno::Reference xContent2(xBookmarksByName->getByName("b"), uno::UNO_QUERY); + uno::Reference xRange2 = xContent2->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("r"), xRange2->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf65955_2) +{ + loadAndReload("tdf65955_2.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("test")); + + uno::Reference xContent3(xBookmarksByName->getByName("test"), + uno::UNO_QUERY); + uno::Reference xRange3 = xContent3->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("foo bar"), xRange3->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testChtOutlineNumberingOoxml, "chtoutline.docx") +{ + static constexpr OUStringLiteral aExpectedNumbering = u"\u7b2c 1 \u7ae0"; + + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(aExpectedNumbering), + getProperty(xPara, "ListLabelString")); +} + +DECLARE_OOXMLEXPORT_TEST(mathtype, "mathtype.docx") +{ + uno::Reference xTextEmbeddedObjectsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xEmbeddedObjects( + xTextEmbeddedObjectsSupplier->getEmbeddedObjects(), uno::UNO_QUERY); + // This failed as the Model property was empty. + auto xModel + = getProperty>(xEmbeddedObjects->getByIndex(0), "Model"); + CPPUNIT_ASSERT(xModel->supportsService("com.sun.star.formula.FormulaProperties")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf8255) +{ + auto verify = [this]() { + // A full-page-wide multi-page floating table should be allowed to split: + uno::Reference xDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xFrame(xDocument->getTextFrames()->getByName("Frame1"), + uno::UNO_QUERY); + bool bIsSplitAllowed{}; + xFrame->getPropertyValue("IsSplitAllowed") >>= bIsSplitAllowed; + CPPUNIT_ASSERT(bIsSplitAllowed); + }; + createSwDoc("tdf8255.docx"); + verify(); + saveAndReload("Office Open XML Text"); + verify(); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf87460, "tdf87460.docx") +{ + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xEndnotesSupplier(xTextDocument, uno::UNO_QUERY); + uno::Reference xEndnotes = xEndnotesSupplier->getEndnotes(); + // This was 0: endnote was lost on import. + CPPUNIT_ASSERT_EQUAL(static_cast(1), xEndnotes->getCount()); + + // Also make sure that is mapped to a text frame (hosting the table): + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTextFrames = xTextFramesSupplier->getTextFrames(); + // Without the fix in place, this test would have failed, the table was inline. + CPPUNIT_ASSERT(xTextFrames->hasByName("Frame1")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf90611, "tdf90611.docx") +{ + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xFootnoteText; + xFootnotes->getByIndex(0) >>= xFootnoteText; + // This was 11. + CPPUNIT_ASSERT_EQUAL(10.f, + getProperty(getParagraphOfText(1, xFootnoteText), "CharHeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf89702, "tdf89702.docx") +{ + // Get the first paragraph's numbering style's 2nd level's character style name. + uno::Reference xParagraph = getParagraph(1); + auto xLevels + = getProperty>(xParagraph, "NumberingRules"); + uno::Sequence aLevel; + xLevels->getByIndex(1) >>= aLevel; // 2nd level + OUString aCharStyleName = std::find_if(std::cbegin(aLevel), std::cend(aLevel), + [](const beans::PropertyValue& rValue) { + return rValue.Name == "CharStyleName"; + }) + ->Value.get(); + + // Make sure that the font name is Arial, this was Verdana. + uno::Reference xStyle( + getStyles("CharacterStyles")->getByName(aCharStyleName), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Arial"), getProperty(xStyle, "CharFontName")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf86374, "tdf86374.docx") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTable->getRows(); + // btLr text direction was imported as FIX, it should be MIN to have enough space for the additionally entered paragraphs. + CPPUNIT_ASSERT_EQUAL(text::SizeType::MIN, + getProperty(xTableRows->getByIndex(0), "SizeType")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf87924, "tdf87924.docx") +{ + uno::Reference xPropertySet(getShape(1), uno::UNO_QUERY); + comphelper::SequenceAsHashMap aGeometry(xPropertySet->getPropertyValue("CustomShapeGeometry")); + // This was -270, the text rotation angle was set when it should not be rotated. + CPPUNIT_ASSERT_EQUAL(static_cast(0), + aGeometry["TextPreRotateAngle"].get()); +} + +DECLARE_OOXMLEXPORT_TEST(testIndents, "indents.docx") +{ + //expected left margin and first line indent values + static const sal_Int32 indents[] = { 0, 0, -2000, 0, -2000, 1000, -1000, -1000, 2000, -1000 }; + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(textDocument->getText(), + uno::UNO_QUERY); + // list of paragraphs + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + size_t paraIndex = 0; + do + { + uno::Reference xServiceInfo; + if (xParaEnum->nextElement() >>= xServiceInfo) + { + uno::Reference const xPropertySet(xServiceInfo, + uno::UNO_QUERY_THROW); + sal_Int32 nIndent = 0; + sal_Int32 nFirstLine = 0; + xPropertySet->getPropertyValue("ParaLeftMargin") >>= nIndent; + xPropertySet->getPropertyValue("ParaFirstLineIndent") >>= nFirstLine; + CPPUNIT_ASSERT_EQUAL(indents[paraIndex * 2], nIndent); + CPPUNIT_ASSERT_EQUAL(indents[paraIndex * 2 + 1], nFirstLine); + ++paraIndex; + } + } while (xParaEnum->hasMoreElements()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf92454, "tdf92454.docx") +{ + // The first paragraph had a large indentation / left margin as inheritance + // in Word and Writer works differently, and no direct value was set to be + // explicit. + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + // This was beans::PropertyState_DEFAULT_VALUE. + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DIRECT_VALUE, + xParagraph->getPropertyState("ParaFirstLineIndent")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf95377, "tdf95377.docx") +{ + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1000), getProperty(xParagraph, "ParaRightMargin")); + + xParagraph.set(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-501), + getProperty(xParagraph, "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2501), getProperty(xParagraph, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DIRECT_VALUE, + xParagraph->getPropertyState("ParaFirstLineIndent")); + + xParagraph.set(getParagraph(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-250), + getProperty(xParagraph, "ParaFirstLineIndent")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(250), getProperty(xParagraph, "ParaLeftMargin")); + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DIRECT_VALUE, + xParagraph->getPropertyState("ParaFirstLineIndent")); + + //default style has numbering enabled. Styles inherit numbering unless specifically disabled + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, + "//body/txt/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, + 3); //first three paragraphs have numbering + assertXPath( + pXmlDoc, + "//body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, + "expand"_ostr, "a."); + assertXPath( + pXmlDoc, + "//body/txt[2]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, + "expand"_ostr, "b."); + assertXPath( + pXmlDoc, + "//body/txt[3]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, + "expand"_ostr, "c."); + assertXPath( + pXmlDoc, + "/root/page/body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, + 0); //last paragraph style disables numbering +} + +DECLARE_OOXMLEXPORT_TEST(testTdf95376, "tdf95376.docx") +{ + uno::Reference xParagraph(getParagraph(2), uno::UNO_QUERY); + // This was beans::PropertyState_DIRECT_VALUE: indentation-from-numbering + // did not have priority over indentation-from-paragraph-style, due to a + // filter workaround that's not correct here. + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, + xParagraph->getPropertyState("ParaFirstLineIndent")); + + //tdf#131321 - paragraph styles lost their numbering. Bullet+space inherits WWNum1 from Bullet + uno::Reference xStyle( + getStyles("ParagraphStyles")->getByName("Bullet+space"), uno::UNO_QUERY); + CPPUNIT_ASSERT(!(getProperty(xStyle, "NumberingStyleName")).isEmpty()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf92124, "tdf92124.docx") +{ + // Get the second paragraph's numbering style's 1st level's suffix. + uno::Reference xParagraph = getParagraph(2); + auto xLevels + = getProperty>(xParagraph, "NumberingRules"); + uno::Sequence aLevel; + xLevels->getByIndex(0) >>= aLevel; // 1st level + OUString aSuffix + = std::find_if(std::cbegin(aLevel), std::cend(aLevel), + [](const beans::PropertyValue& rValue) { return rValue.Name == "Suffix"; }) + ->Value.get(); + // Make sure it's empty as the source document contains . + CPPUNIT_ASSERT(aSuffix.isEmpty()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf90153, "tdf90153.docx") +{ + // This was at-para, so the line-level VertOrientRelation was lost, resulting in an incorrect vertical position. + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, + getProperty(getShape(1), "AnchorType")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf93919, "tdf93919.docx") +{ + // This was 0, left margin was not inherited from the list style. + CPPUNIT_ASSERT_EQUAL(static_cast(1270), + getProperty(getParagraph(1), "ParaLeftMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf91417, "tdf91417.docx") +{ + // The first paragraph should contain a link to "http://www.google.com/" + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextCursor = xTextDocument->getText()->createTextCursor(); + uno::Reference xCursorProps(xTextCursor, uno::UNO_QUERY); + OUString aValue; + xCursorProps->getPropertyValue("HyperLinkURL") >>= aValue; + CPPUNIT_ASSERT_EQUAL(OUString("http://www.google.com/"), aValue); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf90810, "tdf90810short.docx") +{ + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnoteSupp(xTextDocument, uno::UNO_QUERY); + uno::Reference xFootnoteIdxAcc = xFootnoteSupp->getFootnotes(); + uno::Reference xFootnote(xFootnoteIdxAcc->getByIndex(0), uno::UNO_QUERY); + uno::Reference xFootnoteText(xFootnote, uno::UNO_QUERY); + OUString sFootnoteText = xFootnoteText->getString(); + CPPUNIT_ASSERT_EQUAL(static_cast(89), sFootnoteText.getLength()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf89165, "tdf89165.docx") +{ + // This must not hang in layout +} + +DECLARE_OOXMLEXPORT_TEST(testTdf95777, "tdf95777.docx") +{ + // This must not fail on open +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf94374) +{ + createSwDoc("hello.docx"); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xEnd = xText->getEnd(); + // This failed: it wasn't possible to insert a DOCX document into an existing Writer one. + paste(u"ooxmlexport/data/tdf94374.docx", "com.sun.star.comp.Writer.WriterFilter", xEnd); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf83300, "tdf83300.docx") +{ + // tdf#143722: This was 'TOC Heading', upon updating a TOC the heading replaced its Word-default blue + Calibri style + // with a Writer-default black + Liberation Sans one + CPPUNIT_ASSERT_EQUAL(OUString("Contents Heading"), + getProperty(getParagraph(1), "ParaStyleName")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf78902, "tdf78902.docx") +{ + // This hung in layout. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf95775, "tdf95775.docx") +{ + // This must not fail in layout +} + +DECLARE_OOXMLEXPORT_TEST(testTdf92157, "tdf92157.docx") +{ + // A graphic with dimensions 0,0 should not fail on load + + // Additionally, the bookmark names should not change (they got a "1" appended when copied) + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("referentiegegevens")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("referentiegegevens_bk")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf97417, "section_break_numbering.docx") +{ + uno::Reference xProps(getParagraph(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("1st page: first paragraph erroneous numbering", + !xProps->getPropertyValue("NumberingRules").hasValue()); + // paragraph with numbering and section break was removed by writerfilter + // but its numbering was copied to all following paragraphs + CPPUNIT_ASSERT_MESSAGE( + "2nd page: first paragraph missing numbering", + getProperty>(getParagraph(2), "NumberingRules") + .is()); + xProps = uno::Reference(getParagraph(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("2nd page: second paragraph erroneous numbering", + !xProps->getPropertyValue("NumberingRules").hasValue()); + + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf94043, "tdf94043.docx") +{ + auto xTextSection + = getProperty>(getParagraph(2), "TextSection"); + auto xTextColumns + = getProperty>(xTextSection, "TextColumns"); + // This was 0, the separator line was not visible due to 0 width. + CPPUNIT_ASSERT_EQUAL(static_cast(2), + getProperty(xTextColumns, "SeparatorLineWidth")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf95213, "tdf95213.docx") +{ + // Get the second paragraph's numbering style's 2nd level's character style name. + uno::Reference xParagraph = getParagraph(2); + auto xLevels + = getProperty>(xParagraph, "NumberingRules"); + uno::Sequence aLevel; + xLevels->getByIndex(1) >>= aLevel; // 2nd level + OUString aName = std::find_if(std::cbegin(aLevel), std::cend(aLevel), + [](const beans::PropertyValue& rValue) { + return rValue.Name == "CharStyleName"; + }) + ->Value.get(); + + uno::Reference xStyle(getStyles("CharacterStyles")->getByName(aName), + uno::UNO_QUERY); + // This was awt::FontWeight::BOLD. + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty(xStyle, "CharWeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf97371, "tdf97371.docx") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + SdrObject* pShape = pPage->GetObj(0); + SdrObject* pTextBox = pPage->GetObj(1); + tools::Long nDiff = std::abs(pShape->GetSnapRect().Top() - pTextBox->GetSnapRect().Top()); + // The top of the two shapes were 410 and 3951, now it should be 3950 and 3951. + CPPUNIT_ASSERT(nDiff < 10); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf99140) +{ + auto verify = [this]() { + // A multi-page floating table appeared only on the first page. + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = dynamic_cast(pLayout->Lower()); + CPPUNIT_ASSERT(pPage1); + const SwSortedObjs& rPage1Objs = *pPage1->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), rPage1Objs.size()); + auto pPage1Fly = dynamic_cast(rPage1Objs[0]); + CPPUNIT_ASSERT(pPage1Fly); + SwFrame* pTab1 = pPage1Fly->GetLower(); + // This was text::HoriOrientation::NONE, the second table was too wide due to this. + CPPUNIT_ASSERT_EQUAL(static_cast(9622), pTab1->getFrameArea().Width()); + SwFrame* pRow1 = pTab1->GetLower(); + SwFrame* pCell1 = pRow1->GetLower(); + auto pText1 = dynamic_cast(pCell1->GetLower()); + CPPUNIT_ASSERT(pText1); + CPPUNIT_ASSERT_EQUAL(OUString("Table2:A1"), pText1->GetText()); + + auto pPage2 = dynamic_cast(pPage1->GetNext()); + CPPUNIT_ASSERT(pPage2); + const SwSortedObjs& rPage2Objs = *pPage2->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), rPage2Objs.size()); + auto pPage2Fly = dynamic_cast(rPage2Objs[0]); + CPPUNIT_ASSERT(pPage2Fly); + SwFrame* pTab2 = pPage2Fly->GetLower(); + SwFrame* pRow2 = pTab2->GetLower(); + SwFrame* pCell2 = pRow2->GetLower(); + auto pText2 = dynamic_cast(pCell2->GetLower()); + CPPUNIT_ASSERT(pText2); + CPPUNIT_ASSERT_EQUAL(OUString("Table2:A2"), pText2->GetText()); + }; + createSwDoc("tdf99140.docx"); + verify(); + saveAndReload("Office Open XML Text"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableMarginAdjustment) +{ + loadAndReload("table.fodt"); + // Writer, (new) Word: margin 0 means table border starts at 0 + // (old) Word: margin 0 means paragraph in table starts at 0 + + auto const xTable(getParagraphOrTable(1)); + // shifted very slightly to account for half of the thin border width, so 4, not 0. + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), getProperty(xTable, "LeftMargin")); + + // Now that compatibilityMode is set to 2013's 15 (new), expect the new values, + // since LO is exporting in the NEW way now instead of the OLD way. + // This was 55 when using 2007's compatibilityMode of 12 (old) + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "//w:tbl[1]/w:tblPr[1]/w:tblInd[1]"_ostr, "type"_ostr, "dxa"); + assertXPath(pXmlDoc, "//w:tbl[1]/w:tblPr[1]/w:tblInd[1]"_ostr, "w"_ostr, "0"); + + // tdf#143982: automatic tables should export as something better than just left-and-size + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xTable, "RelativeWidth")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf119760_tableInTablePosition, "tdf119760_tableInTablePosition.docx") +{ + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "//w:tbl[1]/w:tr[1]/w:tc[1]/w:tbl[1]/w:tblPr[1]/w:tblInd[1]"_ostr, + "type"_ostr, "dxa"); + assertXPath(pXmlDoc, "//w:tbl[1]/w:tr[1]/w:tc[1]/w:tbl[1]//w:tblPr[1]/w:tblInd[1]"_ostr, + "w"_ostr, "0"); + } + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + // For compatibilityMode 15: margin 0 means table border starts at 0, + // shifted to account for half of the thick border width, so 106, not 0. + CPPUNIT_ASSERT_EQUAL(sal_Int32(106), getProperty(xTable, "LeftMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testTableCellMargin, "table-cell-margin.docx") +{ + sal_Int32 const cellLeftMarginFromOffice[] = { 250, 100, 0, 0 }; + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + + for (int i = 0; i < 4; i++) + { + uno::Reference xTable1(xTables->getByIndex(i), uno::UNO_QUERY); + + // Verify left margin of 1st cell : + // * Office left margins are measured relative to the right of the border + // * LO left spacing is measured from the center of the border + uno::Reference xCell = xTable1->getCellByName("A1"); + uno::Reference xPropSet(xCell, uno::UNO_QUERY_THROW); + sal_Int32 aLeftMargin = -1; + xPropSet->getPropertyValue("LeftBorderDistance") >>= aLeftMargin; + uno::Any aLeftBorder = xPropSet->getPropertyValue("LeftBorder"); + table::BorderLine2 aLeftBorderLine; + aLeftBorder >>= aLeftBorderLine; + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( + "Incorrect left spacing computed from docx cell margin", cellLeftMarginFromOffice[i], + aLeftMargin - 0.5 * aLeftBorderLine.LineWidth, 1); + // The 'a' in the fourth table should not be partly hidden by the border + if (i == 3) + { + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect cell left padding", + 0.5 * aLeftBorderLine.LineWidth, aLeftMargin, 1); + // tdf#119885: cell's edit area must touch right border + sal_Int32 aRightMargin = -1; + xPropSet->getPropertyValue("RightBorderDistance") >>= aRightMargin; + uno::Any aRightBorder = xPropSet->getPropertyValue("RightBorder"); + table::BorderLine2 aRightBorderLine; + aRightBorder >>= aRightBorderLine; + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect cell right padding", + 0.5 * aRightBorderLine.LineWidth, aRightMargin, 1); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, TestPuzzleExport) +{ + loadAndReload("TestPuzzleExport.odt"); + // See tdf#148342 for details + // Get the doc + uno::Reference xTextDoc(mxComponent, uno::UNO_QUERY_THROW); + auto pSwDoc = dynamic_cast(xTextDoc.get()); + CPPUNIT_ASSERT(pSwDoc); + // Create a metafile + auto pMeta = pSwDoc->GetDocShell()->GetPreviewMetaFile(); + CPPUNIT_ASSERT(pMeta); + MetafileXmlDump aDumper; + auto pMetaXml = dumpAndParse(aDumper, *pMeta); + CPPUNIT_ASSERT(pMetaXml); + // After parsing check that node... + auto pXNode = getXPathNode( + pMetaXml, "/metafile/push/push/push/push[4]/push/push/polypolygon/polygon"_ostr); + CPPUNIT_ASSERT(pXNode); + auto pNode = pXNode->nodesetval->nodeTab[0]; + CPPUNIT_ASSERT(pNode); + auto it = pNode->children; + int nCount = 0; + // .. and count the children + while (it != nullptr) + { + nCount++; + it = it->next; + } + // In case of puzzle there will be so many... Without the fix there was a rectangle with 4 points. + CPPUNIT_ASSERT_GREATER(300, nCount); +} + +// tdf#106742 for DOCX with compatibility level <= 14 (MS Word up to and incl. ver.2010), we should use cell margins when calculating table left border position +DECLARE_OOXMLEXPORT_TEST(testTablePosition14, "table-position-14.docx") +{ + sal_Int32 const aXCoordsFromOffice[] = { 2500, -1000, 0, 0 }; + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + + for (int i = 0; i < 4; i++) + { + uno::Reference xTable1(xTables->getByIndex(i), uno::UNO_QUERY); + + // Verify X coord + uno::Reference xCtrl(xModel->getCurrentController(), + uno::UNO_QUERY); + xCtrl->select(uno::Any(xTable1)); + uno::Reference xTextViewCursorSupplier(xCtrl, + uno::UNO_QUERY); + uno::Reference xCursor = xTextViewCursorSupplier->getViewCursor(); + awt::Point pos = xCursor->getPosition(); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect X coord computed from docx", + aXCoordsFromOffice[i], pos.X, 1); + } +} + +// tdf#106742 for DOCX with compatibility level > 14 (MS Word since ver.2013), +// we should NOT use cell margins when calculating table left border position. But we do need to use border width. +DECLARE_OOXMLEXPORT_TEST(testTablePosition15, "table-position-15.docx") +{ + sal_Int32 const aXCoordsFromOffice[] = { 2751, -899, 1, 212 }; + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + + for (int i = 0; i < 4; i++) + { + uno::Reference xTable1(xTables->getByIndex(i), uno::UNO_QUERY); + + // Verify X coord + uno::Reference xCtrl(xModel->getCurrentController(), + uno::UNO_QUERY); + xCtrl->select(uno::Any(xTable1)); + uno::Reference xTextViewCursorSupplier(xCtrl, + uno::UNO_QUERY); + uno::Reference xCursor = xTextViewCursorSupplier->getViewCursor(); + awt::Point pos = xCursor->getPosition(); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect X coord computed from docx", + aXCoordsFromOffice[i], pos.X, 1); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf107359, "tdf107359-char-pitch.docx") +{ + uno::Reference xPropertySet(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + + bool bGridSnapToChars; + xPropertySet->getPropertyValue("GridSnapToChars") >>= bGridSnapToChars; + CPPUNIT_ASSERT_EQUAL(false, bGridSnapToChars); + + sal_Int32 nRubyHeight; + xPropertySet->getPropertyValue("GridRubyHeight") >>= nRubyHeight; + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRubyHeight); + + sal_Int32 nBaseHeight; + xPropertySet->getPropertyValue("GridBaseHeight") >>= nBaseHeight; + CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(18 * 20)), nBaseHeight); + + sal_Int32 nBaseWidth; + xPropertySet->getPropertyValue("GridBaseWidth") >>= nBaseWidth; + CPPUNIT_ASSERT_EQUAL(sal_Int32(convertTwipToMm100(24 * 20)), nBaseWidth); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf77236_MissingSolidFill) +{ + loadAndSave("tdf77236_MissingSolidFill.docx"); + // tdf#77236: solidFill of VML shape was not exported if the colors of line and style were the same + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath( + pXmlDoc, + "//mc:Choice/w:drawing/wp:inline/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln/a:solidFill"_ostr, + 1); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf105875_VmlShapeRotationWithFlip, + "tdf105875_VmlShapeRotationWithFlip.docx") +{ + // tdf#105875: check whether the rotation of the VML bezier shape is ok (with flip too) + // TODO: fix export too + if (isExported()) + return; + + { + uno::Reference xPropertySet(getShape(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), + xPropertySet->getPropertyValue("RotateAngle").get()); + } + + { + uno::Reference xPropertySet(getShape(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(220 * 100), + xPropertySet->getPropertyValue("RotateAngle").get(), + 1); + } + + { + uno::Reference xPropertySet(getShape(3), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(320 * 100), + xPropertySet->getPropertyValue("RotateAngle").get(), + 1); + } + + { + uno::Reference xPropertySet(getShape(4), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(140 * 100), + xPropertySet->getPropertyValue("RotateAngle").get(), + 1); + } + + { + uno::Reference xPropertySet(getShape(5), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_DOUBLES_EQUAL( + sal_Int32(40 * 100), xPropertySet->getPropertyValue("RotateAngle").get(), 1); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133363) +{ + loadAndSave("tdf133363.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // tdf#133363: remove extra auto space between first and second list elements + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc/w:p[2]/w:pPr/w:spacing"_ostr, + "before"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:tc/w:p[3]/w:pPr/w:spacing"_ostr, + "after"_ostr, "0"); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf138093, "tdf138093.docx") +{ + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:sdt"_ostr, 3); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("B1"); + uno::Reference xParagraphsAccess(xCell, uno::UNO_QUERY); + uno::Reference xParagraphs + = xParagraphsAccess->createEnumeration(); + uno::Reference xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference xPortions = xParagraph->createEnumeration(); + uno::Reference xTextPortion(xPortions->nextElement(), uno::UNO_QUERY); + + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + bool bDate{}; + xContentControlProps->getPropertyValue("Date") >>= bDate; + CPPUNIT_ASSERT(bDate); + uno::Reference xContentControlEnumAccess(xContentControl, + uno::UNO_QUERY); + uno::Reference xContentControlEnum + = xContentControlEnumAccess->createEnumeration(); + uno::Reference xTextPortionRange(xContentControlEnum->nextElement(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2017"), xTextPortionRange->getString()); + } + else + { + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMarkAccess->getAllMarksCount()); + + ::sw::mark::IDateFieldmark* pFieldmark + = dynamic_cast<::sw::mark::IDateFieldmark*>(*pMarkAccess->getAllMarksBegin()); + CPPUNIT_ASSERT(pFieldmark); + CPPUNIT_ASSERT_EQUAL(ODF_FORMDATE, pFieldmark->GetFieldname()); + CPPUNIT_ASSERT_EQUAL(OUString("2017"), pFieldmark->GetContent()); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTdf131722, "tdf131722.docx") +{ + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:sdt"_ostr, 4); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A1"); + uno::Reference xParagraphsAccess(xCell, uno::UNO_QUERY); + uno::Reference xParagraphs + = xParagraphsAccess->createEnumeration(); + uno::Reference xParagraph(xParagraphs->nextElement(), + uno::UNO_QUERY); + uno::Reference xPortions = xParagraph->createEnumeration(); + uno::Reference xTextPortion(xPortions->nextElement(), uno::UNO_QUERY); + + OUString aPortionType; + xTextPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("ContentControl"), aPortionType); + + uno::Reference xContentControl; + xTextPortion->getPropertyValue("ContentControl") >>= xContentControl; + uno::Reference xContentControlProps(xContentControl, uno::UNO_QUERY); + bool bDate{}; + xContentControlProps->getPropertyValue("Date") >>= bDate; + CPPUNIT_ASSERT(bDate); + uno::Reference xContentControlEnumAccess(xContentControl, + uno::UNO_QUERY); + uno::Reference xContentControlEnum + = xContentControlEnumAccess->createEnumeration(); + uno::Reference xTextPortionRange(xContentControlEnum->nextElement(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Enter a date here!"), xTextPortionRange->getString()); + } + else + { + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), pMarkAccess->getFieldmarksCount()); + + for (auto aIter = pMarkAccess->getFieldmarksBegin(); + aIter != pMarkAccess->getFieldmarksEnd(); ++aIter) + { + ::sw::mark::IDateFieldmark* pFieldmark + = dynamic_cast<::sw::mark::IDateFieldmark*>(*aIter); + CPPUNIT_ASSERT(pFieldmark); + CPPUNIT_ASSERT_EQUAL(ODF_FORMDATE, pFieldmark->GetFieldname()); + CPPUNIT_ASSERT_EQUAL(OUString("Enter a date here!"), pFieldmark->GetContent()); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf155945) +{ + createSwDoc("tdf155945.docx"); + + CPPUNIT_ASSERT_EQUAL(3, getParagraphs()); + // Without a fix in place, this would fail with + // - Expected: 0 + // - Actual : 423 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(2), "ParaBottomMargin")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133560) +{ + createSwDoc("lastEmptyLineWithDirectFormatting.docx"); + + CPPUNIT_ASSERT_EQUAL(4, getParagraphs()); + // Without a fix in place, this would fail with + // - Expected: 12 + // - Actual : 48 + CPPUNIT_ASSERT_EQUAL(12.0f, getProperty(getParagraph(4), "CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf150408_isLvl_RoundTrip) +{ + loadAndSave("listWithLgl.docx"); + + // Second level's numbering should use Arabic numbers for first level reference + auto xPara = getParagraph(1); + CPPUNIT_ASSERT_EQUAL(OUString("CH I"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(2); + CPPUNIT_ASSERT_EQUAL(OUString("Sect 1.01"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(3); + CPPUNIT_ASSERT_EQUAL(OUString("CH II"), getProperty(xPara, "ListLabelString")); + xPara = getParagraph(4); + CPPUNIT_ASSERT_EQUAL(OUString("Sect 2.01"), getProperty(xPara, "ListLabelString")); + + xmlDocUniquePtr pXml = parseExport("word/numbering.xml"); + assertXPath(pXml, "/w:numbering/w:abstractNum"_ostr); // Only one list + // The second list level must keep the isLgl element + assertXPath(pXml, "/w:numbering/w:abstractNum/w:lvl[2]/w:isLgl"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf156372, "tdf156372.doc") +{ + sal_Int32 nHeight + = parseDump("//page[1]/header/tab/row[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + // Without a fix in place, this would fail with + // - Expected: 847 + // - Actual : 1327 + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(847), nHeight, 5); + + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf156548) +{ + // Given a document using two bookmarks with similar names longer than 40 characters + loadAndReload("longBookmarkName.fodt"); + + // After the export, the names must be no longer than 40 characters; they must be unique; + // and the hyperlinks must use the same names, to still point to the correct targets: + + { + // 1st paragraph - hyperlink to 4th paragraph + auto sURL = getProperty(getRun(getParagraph(1), 1), "HyperLinkURL"); + CPPUNIT_ASSERT_EQUAL(OUString("#A_bookmark_name_longer_than_forty_charac"), sURL); + // 4th paragraph - a bookmark + auto xBookmark = getProperty>(getRun(getParagraph(4), 1), + "Bookmark"); + CPPUNIT_ASSERT_EQUAL(OUString("A_bookmark_name_longer_than_forty_charac"), + xBookmark->getName()); + } + + { + // 2nd paragraph - hyperlink to 5th paragraph + auto sURL = getProperty(getRun(getParagraph(2), 1), "HyperLinkURL"); + CPPUNIT_ASSERT_EQUAL(OUString("#A_bookmark_name_longer_than_forty_chara1"), sURL); + // 5th paragraph - a bookmark + auto xBookmark = getProperty>(getRun(getParagraph(5), 1), + "Bookmark"); + CPPUNIT_ASSERT_EQUAL(OUString("A_bookmark_name_longer_than_forty_chara1"), + xBookmark->getName()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf157136) +{ + // Given a document with two content controls - one block, one inline + createSwDoc("tdf157136_TwoContentControls.docx"); + + // Both of them must import with the correct character style + + { + // 1st paragraph - block content control + auto xRun = getRun(getParagraph(1), 1); + auto xContentControl + = getProperty>(xRun, "ContentControl"); + CPPUNIT_ASSERT_EQUAL(OUString("Click or tap here to enter text."), + xContentControl->getString()); + // Without the fix in place, this would fail with + // - Expected: Placeholder Text + // - Actual : + CPPUNIT_ASSERT_EQUAL(OUString("Placeholder Text"), + getProperty(xRun, "CharStyleName")); + } + + { + // 2nd paragraph - inline content control + auto xRun = getRun(getParagraph(2), 1); + auto xContentControl + = getProperty>(xRun, "ContentControl"); + CPPUNIT_ASSERT_EQUAL(OUString("Click or tap here to enter text."), + xContentControl->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Placeholder Text"), + getProperty(xRun, "CharStyleName")); + } + + // Test the same after round-trip + saveAndReload("Office Open XML Text"); + + { + // 1st paragraph - becomes inline content control after roundtrip + auto xRun = getRun(getParagraph(1), 1); + auto xContentControl + = getProperty>(xRun, "ContentControl"); + CPPUNIT_ASSERT_EQUAL(OUString("Click or tap here to enter text."), + xContentControl->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Placeholder Text"), + getProperty(xRun, "CharStyleName")); + } + + { + // 2nd paragraph - inline content control + auto xRun = getRun(getParagraph(2), 1); + auto xContentControl + = getProperty>(xRun, "ContentControl"); + CPPUNIT_ASSERT_EQUAL(OUString("Click or tap here to enter text."), + xContentControl->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Placeholder Text"), + getProperty(xRun, "CharStyleName")); + } +} + +//Tests for support of fallback for ECMA-376 1st ed to merge the title value with descr attribute +CPPUNIT_TEST_FIXTURE(Test, testTdf148952_2007) +{ + //Given a document with 1 image (with name, alt title and description field populated) in odt format + createSwDoc("tdf148952.odt"); + + OUString rFilterName = "MS Word 2007 XML"; + + //Export it to MS word 2007(.docx) format + saveAndReload(rFilterName); + + // Checks the number of images in the docx file + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 1, getShapes()); + + uno::Reference xImage(getShape(1), uno::UNO_QUERY); + + // Check if alt title value is appended to description + OUString descr; + xImage->getPropertyValue("Description") >>= descr; + CPPUNIT_ASSERT_EQUAL(OUString("Black\nShapes"), descr); + + // Check if alt title field is empty + OUString title; + xImage->getPropertyValue("Title") >>= title; + CPPUNIT_ASSERT_EQUAL(OUString(""), title); +} + +//Tests for support of title attribute for ECMA-376 2nd ed and above +CPPUNIT_TEST_FIXTURE(Test, testTdf148952_2010) +{ + //Given a document with 1 image (with name, alt title and description field populated) in odt format + createSwDoc("tdf148952.odt"); + + OUString rFilterName = "Office Open XML Text"; + + //Export it to MS word 2010-365 (.docx) format + saveAndReload(rFilterName); + + // Checks the number of images in the docx file + const OString sFailedMessage = OString::Concat("Failed on filter: ") + rFilterName.toUtf8(); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 1, getShapes()); + + uno::Reference xImage(getShape(1), uno::UNO_QUERY); + + // Check if description field contains same value after export + OUString descr; + xImage->getPropertyValue("Description") >>= descr; + CPPUNIT_ASSERT_EQUAL(OUString("Shapes"), descr); + + // Check if alt title field contains same value after export + OUString title; + xImage->getPropertyValue("Title") >>= title; + CPPUNIT_ASSERT_EQUAL(OUString("Black"), title); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport2.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport2.cxx new file mode 100644 index 0000000000..6e27f9a6a1 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport2.cxx @@ -0,0 +1,1153 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +CPPUNIT_TEST_FIXTURE(Test, testPageGraphicBackground) +{ + loadAndReload("page-graphic-background.odt"); + validate(maTempFile.GetFileName(), test::OOXML); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // No idea how the graphic background should be exported (seems there is no + // way to do a non-tiling export to OOXML), but at least the background + // color shouldn't be black. + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xPageStyle, "BackColor")); +} + + +CPPUNIT_TEST_FIXTURE(Test, testCustomProperties) +{ + loadAndSave("custom-properties.docx"); + // tdf#133377 tdf#103987 FILESAVE XLSX: Make sure the custom/core/application + // file properties are stored correctly after roundtrip to .docx + + // Extended file properties - specific to Office package, + // eg. docx - Number of Pages, pptx - Number of Slides + xmlDocUniquePtr pXmlDoc = parseExport("docProps/app.xml"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Paragraphs"_ostr, "1"); + //assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Lines", "1"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Pages"_ostr, "1"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Words"_ostr, "3"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Characters"_ostr, "22"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:CharactersWithSpaces"_ostr, "24"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Company"_ostr, "hhhhkompany"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Manager"_ostr, "ffffmenadzer;iiiiisecondmanager"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:HyperlinkBase"_ostr, "gggghiperlink"); + //assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:DocSecurity", "2"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:AppVersion"_ostr, "15.0000"); + + // Custom file properties - defined by user + xmlDocUniquePtr pCustomXml = parseExport("docProps/custom.xml"); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property"_ostr, 9); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[1]"_ostr, + "name"_ostr, "testDateProperty"); + assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[1]/vt:filetime"_ostr, + "1982-04-19T10:00:00Z"); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[3]"_ostr, + "name"_ostr, "testNegativeNumberProperty"); + assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[3]/vt:r8"_ostr, + "-100"); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[4]"_ostr, + "name"_ostr, "testNumberProperty"); + //assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[4]/vt:i4", + // "256"); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[5]"_ostr, + "name"_ostr, "testRealNumberProperty"); + assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[5]/vt:r8"_ostr, + "-128.1"); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[6]"_ostr, + "name"_ostr, "testScientificNumber"); + assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[6]/vt:r8"_ostr, + "1.23456789E+023"); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[7]"_ostr, + "name"_ostr, "testTextProperty"); + assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[7]/vt:lpwstr"_ostr, + "testPropertyValue"); + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[8]"_ostr, + "name"_ostr, "testYesNoProperty"); + assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[8]/vt:bool"_ostr, + "1"); + // Hidden Custom File Property. With Final set, MS Office notifies recipients that the document is final, and sets the document to read-only. + assertXPath(pCustomXml, "/custom-properties:Properties/custom-properties:property[9]"_ostr, + "name"_ostr, "_MarkAsFinal"); + assertXPathContent(pCustomXml, "/custom-properties:Properties/custom-properties:property[9]/vt:bool"_ostr, + "1"); + + // Core file properties - common for all packages (eg. creation date, modify date) + pXmlDoc = parseExport("docProps/core.xml"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/dc:creator"_ostr, "Bartosz Kosiorek;secondauthor"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/dc:description"_ostr, "cccckomentarzglowny"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/cp:lastPrinted"_ostr, "2020-10-15T07:42:00Z"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/dcterms:created"_ostr, "2020-10-14T16:23:00Z"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/cp:category"_ostr, "eeeetokategoria"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/cp:version"_ostr, "xxxxversion"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/cp:contentStatus"_ostr, "ddddstatusnieznany"); + assertXPathContent(pXmlDoc, "/cp:coreProperties/dc:identifier"_ostr, "zzzzidentifier"); +} + +DECLARE_OOXMLEXPORT_TEST(testUTF8CustomProperties, "tdf127864.docx") +{ + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xDocumentProperties + = xDocumentPropertiesSupplier->getDocumentProperties(); + uno::Reference xPropertySet( + xDocumentProperties->getUserDefinedProperties(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(u"первый"_ustr, getProperty(xPropertySet, u"первый"_ustr)); +} + +DECLARE_OOXMLEXPORT_TEST(testKeywords, "tdf143175.docx") +{ + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xDocumentProperties + = xDocumentPropertiesSupplier->getDocumentProperties(); + uno::Sequence aKeywords(xDocumentProperties->getKeywords()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), aKeywords.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("One"), aKeywords[0]); + CPPUNIT_ASSERT_EQUAL(OUString("Two"), aKeywords[1]); + CPPUNIT_ASSERT_EQUAL(OUString("Three"), aKeywords[2]); +} + +DECLARE_OOXMLEXPORT_TEST(testZoom, "zoom.docx") +{ + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xViewSettingsSupplier(xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xPropertySet(xViewSettingsSupplier->getViewSettings()); + sal_Int16 nValue = 0; + xPropertySet->getPropertyValue("ZoomValue") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(42), nValue); + + // Validation test: order of elements were wrong. + if (!isExported()) + return; + validate(maTempFile.GetFileName(), test::OOXML); + xmlDocUniquePtr pXmlDoc = parseExport("word/styles.xml"); + // Order was: rsid, next. + int nNext = getXPathPosition(pXmlDoc, "/w:styles/w:style[3]"_ostr, "next"); + int nRsid = getXPathPosition(pXmlDoc, "/w:styles/w:style[3]"_ostr, "rsid"); + CPPUNIT_ASSERT(nNext < nRsid); + + pXmlDoc = parseExport("docProps/app.xml"); + // One paragraph in the document. + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Paragraphs"_ostr, "1"); + assertXPathContent(pXmlDoc, "/extended-properties:Properties/extended-properties:Company"_ostr, "Example Ltd"); +} + +CPPUNIT_TEST_FIXTURE(Test, defaultTabStopNotInStyles) +{ + loadAndReload("empty.odt"); + validate(maTempFile.GetFileName(), test::OOXML); + CPPUNIT_ASSERT_EQUAL(1, getPages()); +// The default tab stop was mistakenly exported to a style. +// xray ThisComponent.StyleFamilies(1)(0).ParaTabStop + uno::Reference< container::XNameAccess > paragraphStyles = getStyles( "ParagraphStyles" ); + uno::Sequence< style::TabStop > stops = getProperty< uno::Sequence< style::TabStop > >( + paragraphStyles->getByName( "Standard" ), "ParaTabStops" ); +// There actually be one tab stop, but it will be the default. + CPPUNIT_ASSERT_EQUAL( static_cast(1), stops.getLength()); + CPPUNIT_ASSERT_EQUAL( style::TabAlign_DEFAULT, stops[ 0 ].Alignment ); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo38244, "fdo38244.docx") +{ + /* + * Comments attached to a range was imported without the range, check for the annotation mark start/end positions. + * + * oParas = ThisComponent.Text.createEnumeration + * oPara = oParas.nextElement + * oRuns = oPara.createEnumeration + * oRun = oRuns.nextElement + * oRun = oRuns.nextElement 'Annotation + * oRun = oRuns.nextElement + * oRun = oRuns.nextElement 'AnnotationEnd + * xray oRun.TextPortionType + */ + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty(xPropertySet, "TextPortionType")); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty(xPropertySet, "TextPortionType")); + + /* + * Initials were not imported. + * + * oFields = ThisComponent.TextFields.createEnumeration + * oField = oFields.nextElement + * xray oField.Initials + */ + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty(xPropertySet, "Initials")); + + /* + * There was a fake empty paragraph at the end of the comment text. + * + * oFields = ThisComponent.TextFields.createEnumeration + * oField = oFields.nextElement + * oParas = oField.TextRange.createEnumeration + * oPara = oParas.nextElement + * oPara = oParas.nextElement + */ + + xParaEnumAccess = getProperty< uno::Reference >(xPropertySet, "TextRange"); + xParaEnum = xParaEnumAccess->createEnumeration(); + xParaEnum->nextElement(); + CPPUNIT_ASSERT(!xParaEnum->hasMoreElements()); + + if (isExported()) + validate(maTempFile.GetFileName(), test::OOXML); +} + +CPPUNIT_TEST_FIXTURE(Test, testCommentsNested) +{ + loadAndReload("comments-nested.odt"); + validate(maTempFile.GetFileName(), test::OOXML); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xOuter = getProperty< uno::Reference >(getRun(getParagraph(1), 2), "TextField"); + CPPUNIT_ASSERT_EQUAL(OUString("Outer"), getProperty(xOuter, "Content")); + + uno::Reference xInner = getProperty< uno::Reference >(getRun(getParagraph(1), 4), "TextField"); + CPPUNIT_ASSERT_EQUAL(OUString("Inner"), getProperty(xInner, "Content")); +} + +CPPUNIT_TEST_FIXTURE(Test, testMathEscape) +{ + loadAndReload("math-escape.docx"); + CPPUNIT_ASSERT_EQUAL(OUString("\\{ left [ right ] left ( right ) \\}"), getFormula(getRun(getParagraph(1), 1))); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo51034) +{ + loadAndReload("fdo51034.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The problem was that the 'l' param of the HYPERLINK field was parsed with = "#", not += "#". + CPPUNIT_ASSERT_EQUAL(OUString("http://Www.google.com/#a"), getProperty(getRun(getParagraph(1), 1), "HyperLinkURL")); +} + +// Remove all spaces, as LO export/import may change that. +// Replace symbol - (i.e. U+2212) with ASCII - , LO does this change and it shouldn't matter. +static void CHECK_FORMULA(OUString const & expected, OUString const & actual) { + CPPUNIT_ASSERT_EQUAL( + expected.replaceAll( " ", "" ).replaceAll( u"\u2212", "-" ), + actual.replaceAll( " ", "" ).replaceAll( u"\u2212", "-" )); +} + +DECLARE_OOXMLEXPORT_TEST(testMathAccents, "math-accents.docx") +{ + CHECK_FORMULA( + "acute {a} grave {a} check {a} breve {a} circle {a} widevec {a} widetilde {a}" + " widehat {a} dot {a} widevec {a} widevec {a} widetilde {a} underline {a}", + getFormula( getRun( getParagraph( 1 ), 1 ))); +} + +DECLARE_OOXMLEXPORT_TEST(testMathD, "math-d.docx") +{ + CHECK_FORMULA( "left (x mline y mline z right )", getFormula( getRun( getParagraph( 1 ), 1 ))); + CHECK_FORMULA( "left (1 right )", getFormula( getRun( getParagraph( 1 ), 2 ))); + CHECK_FORMULA( "left [2 right ]", getFormula( getRun( getParagraph( 1 ), 3 ))); + CHECK_FORMULA( "left ldbracket 3 right rdbracket", getFormula( getRun( getParagraph( 1 ), 4 ))); + CHECK_FORMULA( "left lline 4 right rline", getFormula( getRun( getParagraph( 1 ), 5 ))); + CHECK_FORMULA( "left ldline 5 right rdline", getFormula( getRun( getParagraph( 1 ), 6 ))); + CHECK_FORMULA( "left langle 6 right rangle", getFormula( getRun( getParagraph( 1 ), 7 ))); + CHECK_FORMULA( "left langle a mline b right rangle", getFormula( getRun( getParagraph( 1 ), 8 ))); + CHECK_FORMULA( "left ({x} over {y} right )", getFormula( getRun( getParagraph( 1 ), 9 ))); +} + +DECLARE_OOXMLEXPORT_TEST(testMathEscaping, "math-escaping.docx") +{ + CHECK_FORMULA( u"\u2212 \u221E < x < \u221E"_ustr, getFormula( getRun( getParagraph( 1 ), 1 ))); +} + +DECLARE_OOXMLEXPORT_TEST(testMathLim, "math-lim.docx") +{ + CHECK_FORMULA( u"lim from {x \u2192 1} {x}"_ustr, getFormula( getRun( getParagraph( 1 ), 1 ))); +} + +DECLARE_OOXMLEXPORT_TEST(testMathMatrix, "math-matrix.docx") +{ + CHECK_FORMULA( "left [matrix {1 # 2 ## 3 # 4} right ]", getFormula( getRun( getParagraph( 1 ), 1 ))); +} + +CPPUNIT_TEST_FIXTURE(Test, testMathMso2k7) +{ + loadAndReload("math-mso2k7.docx"); + CHECK_FORMULA( u"A = \u03C0 {r} ^ {2}"_ustr, getFormula( getRun( getParagraph( 1 ), 1 ))); +// TODO check the stack/binom difference +// CHECK_FORMULA( "{left (x+a right )} ^ {n} = sum from {k=0} to {n} {left (binom {n} {k} right ) {x} ^ {k} {a} ^ {n-k}}", + CHECK_FORMULA( "{left (x+a right )} ^ {n} = sum from {k=0} to {n} {left (stack {n # k} right ) {x} ^ {k} {a} ^ {n-k}}", + getFormula( getRun( getParagraph( 2 ), 1 ))); + CHECK_FORMULA( u"{left (1+x right )} ^ {n} =1+ {nx} over {1!} + {n left (n-1 right ) {x} ^ {2}} over {2!} +\u2026"_ustr, + getFormula( getRun( getParagraph( 3 ), 1 ))); +// TODO check (cos/sin miss {}) +// CHECK_FORMULA( "f left (x right ) = {a} rsub {0} + sum from {n=1} to {\xe2\x88\x9e} {left ({a} rsub {n} cos {{n\xcf\x80x} over {L}} + {b} rsub {n} sin {{n\xcf\x80x} over {L}} right )}", + CHECK_FORMULA( u"f left (x right ) = {a} rsub {0} + sum from {n=1} to {\u221E} {left ({a} rsub {n} cos {n\u03C0x} over {L} + {b} rsub {n} sin {n\u03C0x} over {L} right )}"_ustr, + getFormula( getRun( getParagraph( 4 ), 1 ))); + CHECK_FORMULA( "{a} ^ {2} + {b} ^ {2} = {c} ^ {2}", getFormula( getRun( getParagraph( 5 ), 1 ))); + CHECK_FORMULA( u"x = {- b \u00B1 sqrt {{b} ^ {2} -4 ac}} over {2 a}"_ustr, + getFormula( getRun( getParagraph( 6 ), 1 ))); + CHECK_FORMULA( + u"{e} ^ {x} =1+ {x} over {1!} + {{x} ^ {2}} over {2!} + {{x} ^ {3}} over {3!} +\u2026, -\u221E to ", getFormula( getRun( getParagraph( 1 ), 1 ))); +} + +DECLARE_OOXMLEXPORT_TEST(testMathRad, "math-rad.docx") +{ + CHECK_FORMULA( "sqrt {4}", getFormula( getRun( getParagraph( 1 ), 1 ))); + CHECK_FORMULA( "nroot {3} {x + 1}", getFormula( getRun( getParagraph( 1 ), 2 ))); +} + +DECLARE_OOXMLEXPORT_TEST(testMathSubscripts, "math-subscripts.docx") +{ + CHECK_FORMULA( "{x} ^ {y} + {e} ^ {x}", getFormula( getRun( getParagraph( 1 ), 1 ))); + CHECK_FORMULA( "{x} ^ {b}", getFormula( getRun( getParagraph( 1 ), 2 ))); + CHECK_FORMULA( "{x} rsub {b}", getFormula( getRun( getParagraph( 1 ), 3 ))); + CHECK_FORMULA( "{a} rsub {c} rsup {b}", getFormula( getRun( getParagraph( 1 ), 4 ))); + CHECK_FORMULA( "{x} lsub {2} lsup {1}", getFormula( getRun( getParagraph( 1 ), 5 ))); + CHECK_FORMULA( "{{x csup {6} csub {3}} lsub {4} lsup {5}} rsub {2} rsup {1}", + getFormula( getRun( getParagraph( 1 ), 6 ))); +} + +DECLARE_OOXMLEXPORT_TEST(testMathVerticalStacks, "math-vertical_stacks.docx") +{ + CHECK_FORMULA( "{a} over {b}", getFormula( getRun( getParagraph( 1 ), 1 ))); + CHECK_FORMULA( "{a} / {b}", getFormula( getRun( getParagraph( 2 ), 1 ))); +// TODO check these +// CHECK_FORMULA( "binom {a} {b}", getFormula( getRun( getParagraph( 3 ), 1 ))); +// CHECK_FORMULA( "binom {a} {binom {b} {c}}", getFormula( getRun( getParagraph( 4 ), 1 ))); +} + +CPPUNIT_TEST_FIXTURE(Test, testTable) +{ + loadAndReload("table.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Make sure we write qFormat for well-known style names. + xmlDocUniquePtr pXmlDocCT = parseExport("word/styles.xml"); + CPPUNIT_ASSERT(pXmlDocCT); + assertXPath(pXmlDocCT, "//w:style[@w:styleId='Normal']/w:qFormat"_ostr, 1); +} + +namespace { + +struct SingleLineBorders { + sal_Int16 top, bottom, left, right; + SingleLineBorders(int t=0, int b=0, int l=0, int r=0) + : top(t), bottom(b), left(l), right(r) {} + sal_Int16 getBorder(int i) const + { + switch (i) { + case 0: return top; + case 1: return bottom; + case 2: return left; + case 3: return right; + default: assert(false); return 0; + } + } +}; + +} + +DECLARE_OOXMLEXPORT_TEST(testTableBorders, "table-borders.docx") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + uno::Reference xTextTable (xTables->getByIndex(0), uno::UNO_QUERY); + + std::map cellBorders; + cellBorders[OUString("A1")] = SingleLineBorders(106, 106, 106, 106); + cellBorders[OUString("B1")] = SingleLineBorders(106, 0, 106, 35); + cellBorders[OUString("C1")] = SingleLineBorders(106, 106, 35, 106); + cellBorders[OUString("A2")] = SingleLineBorders(106, 35, 106, 0); + cellBorders[OUString("B2")] = SingleLineBorders(0, 0, 0, 0); + cellBorders[OUString("C2")] = SingleLineBorders(106, 106, 0, 106); + cellBorders[OUString("A3")] = SingleLineBorders(35, 35, 106, 106); + cellBorders[OUString("B3")] = SingleLineBorders(0, 106, 106, 106); + cellBorders[OUString("C3")] = SingleLineBorders(106, 106, 106, 106); + cellBorders[OUString("A4")] = SingleLineBorders(35, 106, 106, 35); + cellBorders[OUString("B4")] = SingleLineBorders(106, 106, 35, 106); + cellBorders[OUString("C4")] = SingleLineBorders(106, 106, 106, 106); + + const OUString borderNames[] = { + OUString("TopBorder"), + OUString("BottomBorder"), + OUString("LeftBorder"), + OUString("RightBorder"), + }; + + uno::Sequence const cells = xTextTable->getCellNames(); + sal_Int32 nLength = cells.getLength(); + CPPUNIT_ASSERT_EQUAL(static_cast(cellBorders.size()), nLength); + + for (sal_Int32 i = 0; i < nLength; ++i) + { + uno::Reference xCell = xTextTable->getCellByName(cells[i]); + uno::Reference< beans::XPropertySet > xPropSet(xCell, uno::UNO_QUERY_THROW); + const SingleLineBorders& borders = cellBorders[cells[i]]; + + for (sal_Int32 j = 0; j < 4; ++j) + { + uno::Any aBorder = xPropSet->getPropertyValue(borderNames[j]); + table::BorderLine aBorderLine; + if (aBorder >>= aBorderLine) + { + std::stringstream message; + message << cells[i] << "'s " << borderNames[j] << " is incorrect"; + CPPUNIT_ASSERT_EQUAL_MESSAGE(message.str(), + borders.getBorder(j), aBorderLine.OuterLineWidth); + } + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo51550) +{ + loadAndReload("fdo51550.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The problem was that we lacked the fallback to export the replacement + // graphic for OLE objects. But we can actually export the OLE itself now, + // so check that instead. + uno::Reference xTextEmbeddedObjectsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xEmbeddedObjects(xTextEmbeddedObjectsSupplier->getEmbeddedObjects(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xEmbeddedObjects->getCount()); + + xmlDocUniquePtr pXmlDocCT = parseExport("[Content_Types].xml"); + + if (!pXmlDocCT) + return; // initial import + + assertXPath(pXmlDocCT, "/ContentType:Types/ContentType:Override[@PartName='/word/embeddings/oleObject1.xlsx']"_ostr, "ContentType"_ostr, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.xlsx']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + // check the content too + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + assertXPath(pXmlDocContent, + "/w:document/w:body/w:p/w:r/w:object/o:OLEObject"_ostr, + "ProgID"_ostr, + "Excel.Sheet.12"); +} + +DECLARE_OOXMLEXPORT_TEST(test1Table1Page, "1-table-1-page.docx") +{ + // 2 problem for this document after export: + // - invalid sectPr inserted at the beginning of the page + // - font of empty cell is not preserved, leading to change in rows height + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTextFrames) +{ + loadAndReload("textframes.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The frames were simply missing, so let's check if all 3 frames were imported back. + CPPUNIT_ASSERT_EQUAL(3, getShapes()); +} + +DECLARE_OOXMLEXPORT_TEST(testTextFrameBorders, "textframe-borders.docx") +{ + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + if (xIndexAccess->getCount()) + { + // After import, a TextFrame is created by the VML import. + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xD99594), getProperty(xFrame, "BackColor")); + + table::BorderLine2 aBorder = getProperty(xFrame, "TopBorder"); + CPPUNIT_ASSERT_EQUAL(Color(0xC0504D), Color(ColorTransparency, aBorder.Color)); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(35), aBorder.LineWidth); + + table::ShadowFormat aShadowFormat = getProperty(xFrame, "ShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadowFormat.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(48), aShadowFormat.ShadowWidth); + CPPUNIT_ASSERT_EQUAL(Color(0x622423), Color(ColorTransparency, aShadowFormat.Color)); + } + else + { + // After export and import, the result is a shape. + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xD99594), getProperty(xShape, "FillColor")); + + CPPUNIT_ASSERT_EQUAL(Color(0xC0504D), getProperty(xShape, "LineColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(35), getProperty(xShape, "LineWidth")); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(48), getProperty(xShape, "ShadowXDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(48), getProperty(xShape, "ShadowYDistance")); + CPPUNIT_ASSERT_EQUAL(Color(0x622423), getProperty(xShape, "ShadowColor")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testTextframeGradient, "textframe-gradient.docx") +{ + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, "FillStyle")); + awt::Gradient2 aGradient(getProperty(xFrame, "FillGradient")); + + // MCGR: Use the completely imported transparency gradient to check for correctness + basegfx::BColorStops aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(3), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xd99594), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 0.5)); + CPPUNIT_ASSERT_EQUAL(Color(0xc0504d), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[2].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0xd99594), Color(aColorStops[2].getStopColor())); + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_LINEAR, aGradient.Style); + + xFrame.set(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame, "FillStyle")); + aGradient = getProperty(xFrame, "FillGradient"); + + // MCGR: Use the completely imported transparency gradient to check for correctness + aColorStops = model::gradient::getColorStopsFromUno(aGradient.ColorStops); + + CPPUNIT_ASSERT_EQUAL(size_t(3), aColorStops.size()); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[0].getStopOffset(), 0.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x666666), Color(aColorStops[0].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[1].getStopOffset(), 0.5)); + CPPUNIT_ASSERT_EQUAL(Color(0x000000), Color(aColorStops[1].getStopColor())); + CPPUNIT_ASSERT(basegfx::fTools::equal(aColorStops[2].getStopOffset(), 1.0)); + CPPUNIT_ASSERT_EQUAL(Color(0x666666), Color(aColorStops[2].getStopColor())); + CPPUNIT_ASSERT_EQUAL(awt::GradientStyle_LINEAR, aGradient.Style); + + // Left / right margin was incorrect: the attribute was missing and we + // didn't have the right default (had 0 instead of the below one). + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(318), getProperty(xFrame, "LeftMargin"), 2); + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(318), getProperty(xFrame, "RightMargin"), 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testCellBtlr) +{ + loadAndSave("cell-btlr.docx"); + /* + * The problem was that the exporter didn't mirror the workaround of the + * importer, regarding the btLr text direction: the token was completely missing in the output. + */ + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tcPr/w:textDirection"_ostr, "val"_ostr, "btLr"); +} + +DECLARE_OOXMLEXPORT_TEST(testTableStylerPrSz, "table-style-rPr-sz.docx") +{ + // Verify that font size inside the table is 20pt, despite the sz attribute in the table size. + // Also check that other rPr attribute are used: italic, bold, underline + // Office has the same behavior + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); +// disabled temporarily, next commit enables it again +#if 0 + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(20.f, getProperty(getRun(xPara, 1), "CharHeight")); +#endif +// CPPUNIT_ASSERT_EQUAL(awt::FontUnderline::SINGLE, getProperty(getRun(xPara, 1), "CharUnderline")); +// CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(getRun(xPara, 1), "CharWeight")); +// CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, getProperty(getRun(xPara, 1), "CharPosture")); +} + +DECLARE_OOXMLEXPORT_TEST(testMathLiteral, "math-literal.docx") +{ + CHECK_FORMULA( u"iiint from {V} to {\"div\" \"F\"} dV= llint from {S} to {\"F\" \u2219 \"n \" dS}"_ustr, + getFormula( getRun( getParagraph( 1 ), 1 ))); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo48557) +{ + loadAndReload("fdo48557.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Inner margins of the textframe wasn't exported. + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(150), getProperty(xFrame, "TextLeftDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(150), getProperty(xFrame, "TextRightDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(150), getProperty(xFrame, "TextUpperDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(150), getProperty(xFrame, "TextLowerDistance")); + + //tdf#140967 frame border was too small. Expected 0 (hairline), actual was 2 + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), getProperty(xFrame, "LineWidth")); +} + +DECLARE_OOXMLEXPORT_TEST(testI120928, "i120928.docx") +{ + // w:numPicBullet was ignored, leading to missing graphic bullet in numbering. + uno::Reference xPropertySet(getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY); + uno::Reference xLevels(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; // 1st level + + uno::Reference xBitmap; + sal_Int16 nNumberingType = -1; + + for (beans::PropertyValue const & rProp : std::as_const(aProps)) + { + if (rProp.Name == "NumberingType") + nNumberingType = rProp.Value.get(); + else if (rProp.Name == "GraphicBitmap") + xBitmap = rProp.Value.get>(); + } + CPPUNIT_ASSERT_EQUAL(style::NumberingType::BITMAP, nNumberingType); + CPPUNIT_ASSERT(xBitmap.is()); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo64826, "fdo64826.docx") +{ + // 'Track-Changes' (Track Revisions) wasn't exported. + CPPUNIT_ASSERT_EQUAL(true, getProperty(mxComponent, "RecordChanges")); + // 'Show-Changes' should not be exported - default is true. + if (isExported()) + { + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:revisionView"_ostr, 0); + } +} + +DECLARE_OOXMLEXPORT_TEST(testPageBackground, "page-background.docx") +{ + // 'Document Background' wasn't exported. + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x92D050), getProperty(xPageStyle, "BackColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo65265, "fdo65265.docx") +{ + // Redline (tracked changes) of text formatting were not exported + uno::Reference xParagraph1 = getParagraph(1); + uno::Reference xParagraph2 = getParagraph(2); + + CPPUNIT_ASSERT_EQUAL(OUString("Format"), getProperty(getRun(xParagraph1, 3), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(OUString("Format"), getProperty(getRun(xParagraph2, 2), "RedlineType")); +} + +DECLARE_OOXMLEXPORT_TEST(testFDO63053, "fdo63053.docx") +{ + uno::Reference xDocumentPropertiesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDocumentProperties = xDocumentPropertiesSupplier->getDocumentProperties(); + CPPUNIT_ASSERT_EQUAL(OUString("test1&test2"), xDocumentProperties->getTitle()); + CPPUNIT_ASSERT_EQUAL(OUString("test1&test2"), xDocumentProperties->getSubject()); +} + +DECLARE_OOXMLEXPORT_TEST(testWatermark, "watermark.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // 1st problem: last character was missing + CPPUNIT_ASSERT_EQUAL(OUString("SAMPLE"), xShape->getString()); + + const uno::Sequence aProps = getProperty< uno::Sequence >(xShape, "CustomShapeGeometry"); + bool bFound = false; + for (beans::PropertyValue const & prop : aProps) + if (prop.Name == "TextPath") + bFound = true; + // 2nd problem: v:textpath wasn't imported + CPPUNIT_ASSERT_EQUAL(true, bFound); + + // 3rd problem: rotation angle was 315, not 45. + CPPUNIT_ASSERT_EQUAL(sal_Int32(45 * 100), getProperty(xShape, "RotateAngle")); + + // 4th problem: mso-position-vertical-relative:margin was ignored, VertOrientRelation was text::RelOrientation::FRAME. + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_PRINT_AREA, getProperty(xShape, "VertOrientRelation")); + + // These problems were in the exporter + // The textpath wasn't semi-transparent. + CPPUNIT_ASSERT_EQUAL(sal_Int16(50), getProperty(xShape, "FillTransparence")); + // The textpath had a stroke. + CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_NONE, getProperty(xShape, "LineStyle")); +} + +DECLARE_OOXMLEXPORT_TEST(testWatermarkFont, "watermark-font.docx") +{ + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("TestFont"), xShape->getString()); + + uno::Reference xPropertySet(xShape, uno::UNO_QUERY); + OUString aFont; + float nFontSize; + + // Check font family + CPPUNIT_ASSERT(xPropertySet->getPropertyValue("CharFontName") >>= aFont); + CPPUNIT_ASSERT_EQUAL(OUString("DejaVu Serif"), aFont); + + // Check font size + CPPUNIT_ASSERT(xPropertySet->getPropertyValue("CharHeight") >>= nFontSize); + CPPUNIT_ASSERT_EQUAL(float(72), nFontSize); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo43093, "fdo43093.docx") +{ + // The problem was that the alignment are not exchange when the paragraph are RTL. + uno::Reference xParaRtlLeft(getParagraph( 1, "RTL Left")); + sal_Int32 nRtlLeft = getProperty< sal_Int32 >( xParaRtlLeft, "ParaAdjust" ); + // test the text Direction value for the paragraph + sal_Int16 nRLDir = getProperty< sal_Int32 >( xParaRtlLeft, "WritingMode" ); + + uno::Reference xParaRtlRight(getParagraph( 3, "RTL Right")); + sal_Int32 nRtlRight = getProperty< sal_Int32 >( xParaRtlRight, "ParaAdjust" ); + sal_Int16 nRRDir = getProperty< sal_Int32 >( xParaRtlRight, "WritingMode" ); + + uno::Reference xParaLtrLeft(getParagraph( 5, "LTR Left")); + sal_Int32 nLtrLeft = getProperty< sal_Int32 >( xParaLtrLeft, "ParaAdjust" ); + sal_Int16 nLLDir = getProperty< sal_Int32 >( xParaLtrLeft, "WritingMode" ); + + uno::Reference xParaLtrRight(getParagraph( 7, "LTR Right")); + sal_Int32 nLtrRight = getProperty< sal_Int32 >( xParaLtrRight, "ParaAdjust" ); + sal_Int16 nLRDir = getProperty< sal_Int32 >( xParaLtrRight, "WritingMode" ); + + // this will test the both the text direction and alignment for each paragraph + CPPUNIT_ASSERT_EQUAL( sal_Int32 (style::ParagraphAdjust_LEFT), nRtlLeft); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, nRLDir); + + CPPUNIT_ASSERT_EQUAL( sal_Int32 (style::ParagraphAdjust_RIGHT), nRtlRight); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::RL_TB, nRRDir); + + CPPUNIT_ASSERT_EQUAL( sal_Int32 (style::ParagraphAdjust_LEFT), nLtrLeft); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nLLDir); + + CPPUNIT_ASSERT_EQUAL( sal_Int32 (style::ParagraphAdjust_RIGHT), nLtrRight); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nLRDir); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo56679, "fdo56679.docx") +{ + // The problem was that the DOCX importer and exporter did not handle the 'color' of an underline + // (not the color of the text, the color of the underline itself) + uno::Reference< text::XTextRange > xParagraph = getParagraph( 1 ); + uno::Reference< text::XTextRange > xText = getRun( xParagraph, 2, "This is a simple sentence."); + + CPPUNIT_ASSERT_EQUAL(true, getProperty(xText, "CharUnderlineHasColor")); + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), getProperty(xText, "CharUnderlineColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo65400, "fdo65400.docx") +{ + // The problem was that if in Word you choose 'Character Shading' - then the text portion + // is marked with 'w:shd val=pct15'. LO did not store this value and so when importing and exporting + // this value was lost (and so Word did not show 'Character Shading' was on) + uno::Reference< text::XTextRange > paragraph1 = getParagraph( 1 ); + uno::Reference< text::XTextRange > shaded = getRun( paragraph1, 2, "normal" ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 0x0026 ), getProperty< sal_Int32 >( shaded, "CharShadingValue" )); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 0xd8d8d8 ), getProperty< sal_Int32 >( shaded, "CharBackColor" )); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo66543, "fdo66543.docx") +{ + // The problem was that when importing DOCX with 'line numbers' - the 'start value' was imported + // but nothing was done with it. + + uno::Reference< text::XTextRange > paragraph1 = getParagraph( 1 ); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), + getProperty(paragraph1, "ParaLineNumberStartValue")); + + if (!isExported()) + return; + + // ensure unnecessary suppressLineNumbers entry is not created. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:p[1]/w:pPr/w:suppressLineNumbers"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testN822175) +{ + loadAndReload("n822175.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + // Was text::WrapTextMode_THROUGH, due to missing Surround handling in the exporter. + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_PARALLEL, getProperty(xFrame, "Surround")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo66688, "fdo66688.docx") +{ + // The problem was that TextFrame imported and exported the wrong value for transparency + // (was stored as 'FillTransparence' instead of 'BackColorTransparency' + uno::Reference xFrame(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 80 ), getProperty< sal_Int32 >( xFrame, "FillTransparence" ) ); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo66773, "fdo66773.docx") +{ + // The problem was the line spacing was interpreted by Word as 'Multiple 1.08' if no default settings were written. + // Now after the 'docDefaults' section is written in - there is no more problem. + // (Word does not try to calculate some arbitrary value for line spacing). + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + CPPUNIT_ASSERT(xParaEnum->hasMoreElements()); + + style::LineSpacing alineSpacing = getProperty(xParaEnum->nextElement(), "ParaLineSpacing"); + CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::PROP, alineSpacing.Mode); + CPPUNIT_ASSERT_EQUAL(static_cast(100), static_cast(alineSpacing.Height)); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo58577) +{ + loadAndReload("fdo58577.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The second frame was simply missing, so let's check if both frames were imported back. + CPPUNIT_ASSERT_EQUAL(2, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(Test, testBnc581614) +{ + loadAndReload("bnc581614.doc"); + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xFrame, "FillStyle")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo66929, "fdo66929.docx") +{ + // The problem was that the default 'inset' attribute of the 'textbox' node was exported incorrectly. + // A node like '' was exported back as '' + // This is wrong because the original node denotes a specific 'left' inset, and a default 'top','right','bottom' inset + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + if (xIndexAccess->getCount()) + { + // VML import -> TextFrame + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 0 ) , getProperty< sal_Int32 >( xFrame, "LeftBorderDistance" ) ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 127 ), getProperty< sal_Int32 >( xFrame, "TopBorderDistance" ) ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 254 ), getProperty< sal_Int32 >( xFrame, "RightBorderDistance" ) ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 127 ), getProperty< sal_Int32 >( xFrame, "BottomBorderDistance" ) ); + } + else + { + // drawingML import -> shape with TextBox + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xShape, "TextLeftDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(127), getProperty(xShape, "TextUpperDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(254), getProperty(xShape, "TextRightDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(127), getProperty(xShape, "TextLowerDistance")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testPageBorderSpacingExportCase2) +{ + loadAndSave("page-borders-export-case-2.docx"); + // The problem was that the exporter didn't mirror the workaround of the + // importer, regarding the page border's spacing : the + // and the inner nodes like + // + // The exporter ALWAYS exported 'w:offsetFrom="text"' even when the spacing values where too large + // for Word to handle (larger than 31 points) + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Assert the XPath expression - page borders + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgBorders"_ostr, "offsetFrom"_ostr, "page"); + + // Assert the XPath expression - 'left' border + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgBorders/w:left"_ostr, "space"_ostr, "24"); + + // Assert the XPath expression - 'right' border + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgBorders/w:right"_ostr, "space"_ostr, "24"); +} + +CPPUNIT_TEST_FIXTURE(Test, testGrabBag) +{ + loadAndSave("grabbag.docx"); + // w:mirrorIndents was lost on roundtrip, now should be handled as a grab bag property + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:pPr/w:mirrorIndents"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo66781, "fdo66781.docx") +{ + // The problem was that bullets with level=0 were shown in LO as normal bullets, + // and when saved back to DOCX were saved with level=1 (so hidden bullets became visible) + uno::Reference xPropertySet(getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY); + uno::Reference xLevels(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY); + uno::Sequence aProps; + xLevels->getByIndex(0) >>= aProps; // 1st level + + for (beans::PropertyValue const & rProp : std::as_const(aProps)) + { + if (rProp.Name == "BulletChar") + { + CPPUNIT_ASSERT_EQUAL(OUString("\x0", 1, RTL_TEXTENCODING_ASCII_US), rProp.Value.get()); + return; + } + } + + // Shouldn't reach here + CPPUNIT_FAIL("Did not find bullet with level 0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo60990) +{ + loadAndReload("fdo60990.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The shape had no background, no paragraph adjust and no font color. + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x00CFE7F5), getProperty(xShape, "FillColor")); + uno::Reference xText = uno::Reference(xShape, uno::UNO_QUERY_THROW)->getText(); + uno::Reference xParagraph = getParagraphOfText(1, xText); + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_CENTER, static_cast(getProperty(xParagraph, "ParaAdjust"))); + CPPUNIT_ASSERT_EQUAL(Color(0x00FF00), getProperty(getRun(xParagraph, 1), "CharColor")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo65718, "fdo65718.docx") +{ + // The problem was that the exporter always exported values of "0" for an images distance from text. + // the actual attributes where 'distT', 'distB', 'distL', 'distR' + uno::Reference xPropertySet(getShape(1), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(oox::drawingml::convertEmuToHmm(0), getProperty(xPropertySet, "TopMargin") ); + CPPUNIT_ASSERT_EQUAL(oox::drawingml::convertEmuToHmm(0), getProperty(xPropertySet, "BottomMargin") ); + + // 'getProperty' return 318 (instead of 317.5) + // I think this is because it returns an integer, instead of a float. + // The actual exporting to DOCX exports the correct value (114300 = 317.5 * 360) + // The exporting to DOCX uses the 'SvxLRSpacing' that stores the value in TWIPS (180 TWIPS) + // However, the 'LeftMargin' property is an integer property that holds that value in 'MM100' (should hold 317.5, but it is 318) + CPPUNIT_ASSERT_EQUAL(oox::drawingml::convertEmuToHmm(114300), getProperty(xPropertySet, "LeftMargin") ); + CPPUNIT_ASSERT_EQUAL(oox::drawingml::convertEmuToHmm(114300), getProperty(xPropertySet, "RightMargin") ); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo64350, "fdo64350.docx") +{ + // The problem was that page border shadows were not exported + table::ShadowFormat aShadow = getProperty(getStyles("PageStyles")->getByName("Standard"), "ShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo67013, "fdo67013.docx") +{ + /* + * The problem was that borders inside headers \ footers were not exported + * This was checked in xray using these commands: + * + * xHeaderText = ThisComponent.getStyleFamilies().getByName("PageStyles").getByName("Standard").HeaderText + * xHeaderEnum = xHeaderText.createEnumeration() + * xHeaderFirstParagraph = xHeaderEnum.nextElement() + * xHeaderBottomBorder = xHeaderFirstParagraph.BottomBorder + * + * xFooterText = ThisComponent.getStyleFamilies().getByName("PageStyles").getByName("Standard").FooterText + * xFooterEnum = xFooterText.createEnumeration() + * xFooterFirstParagraph = xFooterEnum.nextElement() + * xFooterTopBorder = xFooterFirstParagraph.TopBorder + */ + uno::Reference xHeaderText = getProperty< uno::Reference >(getStyles("PageStyles")->getByName("Standard"), "HeaderText"); + uno::Reference< text::XTextRange > xHeaderParagraph = getParagraphOfText( 1, xHeaderText ); + table::BorderLine2 aHeaderBottomBorder = getProperty(xHeaderParagraph, "BottomBorder"); + CPPUNIT_ASSERT_EQUAL(Color(0x622423), Color(ColorTransparency, aHeaderBottomBorder.Color)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(106), aHeaderBottomBorder.InnerLineWidth); + CPPUNIT_ASSERT_EQUAL(sal_Int16(26), aHeaderBottomBorder.LineDistance); + CPPUNIT_ASSERT_EQUAL(sal_Int16(7), aHeaderBottomBorder.LineStyle); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(159), aHeaderBottomBorder.LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_Int16(26), aHeaderBottomBorder.OuterLineWidth); + + uno::Reference xFooterText = getProperty< uno::Reference >(getStyles("PageStyles")->getByName("Standard"), "FooterText"); + uno::Reference< text::XTextRange > xFooterParagraph = getParagraphOfText( 1, xFooterText ); + table::BorderLine2 aFooterTopBorder = getProperty(xFooterParagraph, "TopBorder"); + CPPUNIT_ASSERT_EQUAL(Color(0x622423), Color(ColorTransparency, aFooterTopBorder.Color)); + CPPUNIT_ASSERT_EQUAL(sal_Int16(26), aFooterTopBorder.InnerLineWidth); + CPPUNIT_ASSERT_EQUAL(sal_Int16(26), aFooterTopBorder.LineDistance); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4), aFooterTopBorder.LineStyle); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(159), aFooterTopBorder.LineWidth); + CPPUNIT_ASSERT_EQUAL(sal_Int16(106), aFooterTopBorder.OuterLineWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testParaShadow, "para-shadow.docx") +{ + // The problem was that in w:pBdr, child elements had a w:shadow attribute, but that was ignored. + table::ShadowFormat aShadow = getProperty(getParagraph(2), "ParaShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + // w:sz="48" is in eights of a point, 1 pt is 20 twips. + CPPUNIT_ASSERT_EQUAL(sal_Int16(convertTwipToMm100(24/8*20)), aShadow.ShadowWidth); +} + +DECLARE_OOXMLEXPORT_TEST(testTableFloating, "table-floating.docx") +{ + // Both the size and the position of the table was incorrect. + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + // Second table was too wide: 16249, i.e. as wide as the first table. + CPPUNIT_ASSERT_EQUAL(sal_Int32(11248), getProperty(xTables->getByIndex(1), "Width")); + + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + if (xIndexAccess->getCount()) + { + // After import, table is inside a TextFrame. + uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + // This was 0, should be the opposite of (left margin + half of the border width). + CPPUNIT_ASSERT_EQUAL(sal_Int32(-199), getProperty(xFrame, "HoriOrientPosition")); + // Was 0 as well, should be the right margin. + CPPUNIT_ASSERT_EQUAL(sal_Int32(250), getProperty(xFrame, "RightMargin")); + } + else + { + // After import, table is inside a TextFrame. + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // This was 0, should be the opposite of (left margin + half of the border width). + CPPUNIT_ASSERT_EQUAL(sal_Int32(-199), getProperty(xShape, "HoriOrientPosition")); + // Was 0 as well, should be the right margin. + CPPUNIT_ASSERT_EQUAL(sal_Int32(250), getProperty(xShape, "RightMargin")); + } +} + +DECLARE_OOXMLEXPORT_TEST(testFdo44689_start_page_0, "fdo44689_start_page_0.docx") +{ + // The problem was that the import & export process did not analyze the 'start from page' attribute of a section + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty(xPara, "PageNumberOffset")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo44689_start_page_7, "fdo44689_start_page_7.docx") +{ + // The problem was that the import & export process did not analyze the 'start from page' attribute of a section + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(7), getProperty(xPara, "PageNumberOffset")); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo67737, "fdo67737.docx") +{ + // The problem was that imported shapes did not import and render the 'flip:x' and 'flip:y' attributes + uno::Reference xArrow = getShape(1); + const uno::Sequence aProps = getProperty< uno::Sequence >(xArrow, "CustomShapeGeometry"); + for (beans::PropertyValue const & rProp : aProps) + { + if (rProp.Name == "MirroredY") + { + CPPUNIT_ASSERT_EQUAL( true, rProp.Value.get() ); + return; + } + } + + // Shouldn't reach here + CPPUNIT_FAIL("Did not find MirroredY=true property"); +} + +DECLARE_OOXMLEXPORT_TEST(testTransparentShadow, "transparent-shadow.docx") +{ + uno::Reference xPicture = getShape(1); + sal_Int16 nShadowTransparence = getProperty(xPicture, "ShadowTransparence"); + CPPUNIT_ASSERT_EQUAL(Color(0x808080), getProperty(xPicture, "ShadowColor")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(50), nShadowTransparence); +} + +CPPUNIT_TEST_FIXTURE(Test, NoFillAttrInImagedata) +{ + loadAndSave("NoFillAttrInImagedata.docx"); + //problem was that type and color2 which are v:fill attributes were written in 'v:imagedata'. The + //source file has v:fill and no v:imagedata. Same should be in the file written by LO. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent[2]/mc:Fallback/w:pict/v:rect/v:imagedata"_ostr, 0); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent[2]/mc:Fallback/w:pict/v:rect/v:fill"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent[2]/mc:Fallback/w:pict/v:rect/v:fill"_ostr, "type"_ostr, "tile"); +} + +DECLARE_OOXMLEXPORT_TEST(testBnc837302, "bnc837302.docx") +{ + // The problem was that text with empty author was not inserted as a redline + uno::Reference xParagraph = getParagraph(1); + + // previously 'AAA' was not an own run + getRun(xParagraph, 3, "AAA"); + // interestingly the 'Insert' is set on the _previous_ run + CPPUNIT_ASSERT_EQUAL(OUString("Insert"), getProperty(getRun(xParagraph, 2), "RedlineType")); + + // make sure we don't introduce a redlined delete in the 2nd paragraph + xParagraph = getParagraph(2); + CPPUNIT_ASSERT_EQUAL(false, hasProperty(getRun(xParagraph, 1), "RedlineType")); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport20.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport20.cxx new file mode 100644 index 0000000000..8812cf729e --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport20.cxx @@ -0,0 +1,1125 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testfdo79969_xlsb) +{ + loadAndSave("fdo79969_xlsb.docx"); + // This UT for DOCX embedded with binary excel work sheet. + xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); + + assertXPath(pXmlDoc, + "/ContentType:Types/ContentType:Override[@ContentType='application/" + "vnd.ms-excel.sheet.binary.macroEnabled.12']"_ostr, + "PartName"_ostr, "/word/embeddings/oleObject1.xlsb"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.xlsb']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + // check the content too + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + assertXPath(pXmlDocContent, "/w:document/w:body/w:p[1]/w:r/w:object/o:OLEObject"_ostr, + "ProgID"_ostr, "Excel.SheetBinaryMacroEnabled.12"); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo80097) +{ + loadAndSave("fdo80097.docx"); + //fdo#76635 : Table borders are not getting preserved. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + //Table Cell Borders + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:top[@w:val = 'single']"_ostr, + 1); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:top[@w:sz = 4]"_ostr, + 1); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:top[@w:space = 0]"_ostr, + 1); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:top[@w:color = '000000']"_ostr, + 1); + + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:bottom[@w:val = 'single']"_ostr, + 1); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:bottom[@w:sz = 4]"_ostr, + 1); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:bottom[@w:space = 0]"_ostr, + 1); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:bottom[@w:color = '000000']"_ostr, + 1); + + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:insideH"_ostr, + 0); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/" + "w:insideV"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf95033) +{ + loadAndSave("tdf95033.docx"); + //tdf#95033 : Table borders defined by row-level tblPrEx are not getting preserved. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + //Not disabled table cell borders + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[5]/w:tc[1]/w:tcPr/w:tcBorders/w:start[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[5]/w:tc[2]/w:tcPr/w:tcBorders/w:end[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[9]/w:tc[1]/w:tcPr/w:tcBorders/w:start[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[9]/w:tc[2]/w:tcPr/w:tcBorders/w:end[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[9]/w:tc[1]/w:tcPr/w:tcBorders/w:bottom[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[9]/w:tc[2]/w:tcPr/w:tcBorders/w:bottom[@w:val = 'nil']"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf133455) +{ + loadAndSave("tdf133455.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + //Not disabled table cell borders + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/w:top[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/w:start[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/w:end[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:tcPr/w:tcBorders/w:start[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:tcPr/w:tcBorders/w:end[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[11]/w:tc[1]/w:tcPr/w:tcBorders/w:start[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[11]/w:tc[1]/w:tcPr/w:tcBorders/w:end[@w:val = 'nil']"_ostr, + 0); + assertXPath( + pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[11]/w:tc[1]/w:tcPr/w:tcBorders/w:bottom[@w:val = 'nil']"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138612) +{ + loadAndSave("tdf138612.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // Row 5 Col 1 - vertically merged cell + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[5]/w:tc[1]/w:tcPr/w:vMerge"_ostr, + "val"_ostr, "restart"); + // Row 5 Col 2 - split cell + // This was w:vMerge="restart" + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[5]/w:tc[2]/w:tcPr/w:vMerge"_ostr, 0); + + // Row 6 Col 1 - merged with cell in Row 5 Col 1 + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[6]/w:tc[1]/w:tcPr/w:vMerge"_ostr, + "val"_ostr, "continue"); + // Row 6 Col 2 - split cell + // This was w:vMerge="continue" (merged with cell in Row 5 Col 2) + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[6]/w:tc[2]/w:tcPr/w:vMerge"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf140597) +{ + loadAndSave("tdf140597.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // There were missing tblPrEx table exception borders + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:tcPr/w:tcBorders/w:top"_ostr); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:tcPr/w:tcBorders/w:start"_ostr); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[3]/w:tc[1]/w:tcPr/w:tcBorders/w:top"_ostr); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[3]/w:tc[1]/w:tcPr/w:tcBorders/w:start"_ostr); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[4]/w:tc[1]/w:tcPr/w:tcBorders/w:top"_ostr); + assertXPath(pXmlDocument, + "/w:document/w:body/w:tbl/w:tr[4]/w:tc[1]/w:tcPr/w:tcBorders/w:start"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128646) +{ + loadAndSave("tdf128646.docx"); + // The problem was that not hidden shapes anchored to empty hidden paragraphs were imported as hidden. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p[7]/w:pPr/w:rPr/w:vanish"_ostr, 1); + if (!isExported()) + // originally no (the same as ) + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p[7]/w:r/w:rPr/w:vanish"_ostr, + 0); + else + // This was hidden () + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p[7]/w:r/w:rPr/w:vanish"_ostr, + "val"_ostr, "false"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf119800) +{ + loadAndSave("tdf119800.docx"); + // The problem was that not hidden shapes anchored to empty hidden paragraphs were imported as hidden. + // (tdf#128646 solved the same only for table paragraphs) + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:vanish"_ostr, 1); + if (!isExported()) + // originally no (the same as ) + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:rPr/w:vanish"_ostr, 0); + else + // This was hidden () + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:rPr/w:vanish"_ostr, "val"_ostr, + "false"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo77129) +{ + loadAndSave("fdo77129.docx"); + // The problem was that text after TOC field was missing if footer reference comes in field. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Data was lost from this paragraph. + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[4]/w:r[1]/w:t"_ostr, "Abstract"); +} + +// Test the same testdoc used for testFdo77129. +DECLARE_OOXMLEXPORT_TEST(testTdf129402, "fdo77129.docx") +{ + // tdf#129402: ToC title must be "Contents", not "Content"; the index field must include + // pre-rendered element. + + // Currently export drops empty paragraph after ToC, so skip getParagraphs test for now + // CPPUNIT_ASSERT_EQUAL(5, getParagraphs()); + CPPUNIT_ASSERT_EQUAL(OUString("owners."), getParagraph(1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Contents"), getParagraph(2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("How\t2"), getParagraph(3)->getString()); + // CPPUNIT_ASSERT_EQUAL(OUString(), getParagraph(4)->getString()); + + uno::Reference xIndexSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexes = xIndexSupplier->getDocumentIndexes(); + uno::Reference xIndex(xIndexes->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTextRange = xIndex->getAnchor(); + uno::Reference xText = xTextRange->getText(); + uno::Reference xTextCursor = xText->createTextCursor(); + xTextCursor->gotoRange(xTextRange->getStart(), false); + xTextCursor->gotoRange(xTextRange->getEnd(), true); + OUString aTocString(xTextCursor->getString()); + + // Check that the pre-rendered entry is inside the index + CPPUNIT_ASSERT_EQUAL(OUString("How\t2"), aTocString); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo79969_xlsm) +{ + loadAndSave("fdo79969_xlsm.docx"); + // This UT for DOCX embedded with excel work sheet. + xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); + + assertXPath(pXmlDoc, + "/ContentType:Types/ContentType:Override[@ContentType='application/" + "vnd.ms-excel.sheet.macroEnabled.12']"_ostr, + "PartName"_ostr, "/word/embeddings/oleObject1.xlsm"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.xlsm']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + // check the content too + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + assertXPath(pXmlDocContent, "/w:document/w:body/w:p[1]/w:r/w:object/o:OLEObject"_ostr, + "ProgID"_ostr, "Excel.SheetMacroEnabled.12"); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo80522) +{ + loadAndReload("fdo80522.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); + + assertXPath(pXmlDoc, + "/ContentType:Types/ContentType:Override[@ContentType='application/" + "vnd.ms-word.document.macroEnabled.12']"_ostr, + "PartName"_ostr, "/word/embeddings/oleObject1.docm"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.docm']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + // check the content too + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + assertXPath(pXmlDocContent, "/w:document/w:body/w:p[1]/w:r/w:object/o:OLEObject"_ostr, + "ProgID"_ostr, "Word.DocumentMacroEnabled.12"); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo80523_pptm) +{ + loadAndReload("fdo80523_pptm.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); + + assertXPath(pXmlDoc, + "/ContentType:Types/ContentType:Override[@ContentType='application/" + "vnd.ms-powerpoint.presentation.macroEnabled.12']"_ostr, + "PartName"_ostr, "/word/embeddings/oleObject1.pptm"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.pptm']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + // check the content too + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + assertXPath(pXmlDocContent, "/w:document/w:body/w:p[1]/w:r/w:object/o:OLEObject"_ostr, + "ProgID"_ostr, "PowerPoint.ShowMacroEnabled.12"); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo80523_sldm) +{ + loadAndReload("fdo80523_sldm.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); + + assertXPath(pXmlDoc, + "/ContentType:Types/ContentType:Override[@ContentType='application/" + "vnd.ms-powerpoint.slide.macroEnabled.12']"_ostr, + "PartName"_ostr, "/word/embeddings/oleObject1.sldm"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.sldm']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + // check the content too + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + assertXPath(pXmlDocContent, "/w:document/w:body/w:p[1]/w:r/w:object/o:OLEObject"_ostr, + "ProgID"_ostr, "PowerPoint.SlideMacroEnabled.12"); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo80898) +{ + loadAndSave("fdo80898.docx"); + // This UT for DOCX embedded with binary excel work sheet. + xmlDocUniquePtr pXmlDoc = parseExport("[Content_Types].xml"); + + assertXPath(pXmlDoc, + "/ContentType:Types/ContentType:Override[@ContentType='application/msword']"_ostr, + "PartName"_ostr, "/word/embeddings/oleObject1.doc"); + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.doc']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"); + // check the content too + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + assertXPath(pXmlDocContent, "/w:document/w:body/w:p[1]/w:r/w:object/o:OLEObject"_ostr, + "ProgID"_ostr, "Word.Document.8"); +} + +CPPUNIT_TEST_FIXTURE(Test, testOleIconDrawAspect) +{ + loadAndSave("tdf131537.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:object/o:OLEObject"_ostr, + "DrawAspect"_ostr, "Icon"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableCellWithDirectFormatting) +{ + loadAndSave("fdo80800.docx"); + // Issue was Direct Formatting for non-first Table cells was not getting preserved. + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // Ensure that for Third Table cell Direct Formatting is preserved. + // In file, Direct Formatting used for Third Table cell is Line Spacing="1.5 lines" + // For Line Spacing "1.5 lines" w:line equals 360 + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[3]/w:p/w:pPr/w:spacing"_ostr, + "line"_ostr, "360"); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo80800b_tableStyle, "fdo80800b_tableStyle.docx") +{ + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Cell1 1.5lines"), xPara->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell A1 1.5 line spacing", sal_Int16(150), + getProperty(xPara, "ParaLineSpacing").Height); + + xCell.set(xTable->getCellByName("B1"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum = xParaEnumAccess->createEnumeration(); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Cell2 Implicit (Single)"), xPara->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B1 single line spacing", sal_Int16(100), + getProperty(xPara, "ParaLineSpacing").Height); + + xCell.set(xTable->getCellByName("C1"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum = xParaEnumAccess->createEnumeration(); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Cell3 Implicit (Single)"), xPara->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("C1 paragraph1 single line spacing", sal_Int16(100), + getProperty(xPara, "ParaLineSpacing").Height); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("C1 paragraph3 line spacing", sal_Int16(212), + getProperty(xPara, "ParaLineSpacing").Height); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf117297_tableStyle, "tdf117297_tableStyle.docx") +{ + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("B1"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xText = xPara->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("Green text, default size (9), 1.5 spaced"), xPara->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B1 Paragraph1 green font", Color(0x70AD47), + getProperty(getRun(xPara, 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B1 Paragraph1 1.5 line spacing", sal_Int16(150), + getProperty(xPara, "ParaLineSpacing").Height); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xText = xPara->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("TableGrid color (blue), TableGrid size (9), double spacing"), + xPara->getString()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B1 Paragraph3 blue font", Color(0x00B0F0), + getProperty(getRun(xPara, 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Cell B1 Paragraph3 double spacing", sal_Int16(200), + getProperty(xPara, "ParaLineSpacing").Height); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf82175_noStyleInheritance, "tdf82175_noStyleInheritance.docx") +{ + // The document's "Default" paragraph style is 1 inch fixed line spacing, and that is what should not be inherited. + style::LineSpacing aSpacing + = getProperty(getParagraph(1), "ParaLineSpacing"); + // MSWord uses 115% line spacing, but LO follows the documentation and sets single spacing. + CPPUNIT_ASSERT_MESSAGE("Text Body style 115% line spacing", sal_Int16(120) > aSpacing.Height); + CPPUNIT_ASSERT_MESSAGE("THANKS for *FIXING* line spacing", sal_Int16(115) != aSpacing.Height); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::LineSpacingMode::PROP), aSpacing.Mode); +} + +DECLARE_OOXMLEXPORT_TEST(test2colHeader, "2col-header.docx") +{ + // Header was lost on export when the document had multiple columns. + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPageStyle, "HeaderIsOn")); +} + +CPPUNIT_TEST_FIXTURE(Test, testfdo83048) +{ + loadAndSave("fdo83048.docx"); + // Issue was wrong SDT properties were getting exported for Date SDT + xmlDocUniquePtr pXmlDoc = parseExport("word/footer2.xml"); + + // Make sure Date is inside SDT tag. + // This will happen only if right SDT properties are exported. + assertXPathContent( + pXmlDoc, "/w:ftr/w:sdt/w:sdtContent/w:p[1]/w:sdt/w:sdtContent/w:r[2]/w:t"_ostr, "1/2/2013"); +} + +CPPUNIT_TEST_FIXTURE(Test, testSdt2Run) +{ + loadAndSave("sdt-2-run.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + // The problem was that was closed after "first", not after "second", so the second assert failed. + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t"_ostr, + "firstsecond"); + // Make sure the third portion is still outside . + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/w:t"_ostr, "third"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFD083057) +{ + loadAndSave("fdo83057.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/header2.xml"); + + // A fly frame was attached to a para which started with a hint (run) containing an SDT. + // This SDT was handled while exporting the FLYFRAME and also the text of the run. + // So, even though the original file had only one sdt in the header, the RT file had two; + // one for a separate run as expected, and one incorrectly exported in the alternateContent (FLYFRAME) + + // Assert that the file has only one sdt, in a separate run + assertXPath(pXmlDoc, "//w:sdt"_ostr, 1); + assertXPath(pXmlDoc, "//mc:AlternateContent//w:sdt"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testHeaderBorder) +{ + loadAndSave("header-border.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 0, as header margin was lost during import. + assertXPath(pXmlDoc, "//w:pgMar"_ostr, "header"_ostr, "720"); + // This was 33: 33 points -> 660 twips. We counted 900 - 240 (distance + // of page and body frame) instead of 720 - 240 (distance of page and + // header frame). + assertXPath(pXmlDoc, "//w:pgBorders/w:top"_ostr, "space"_ostr, "24"); +} + +DECLARE_OOXMLEXPORT_TEST(testTablepprShape, "tblppr-shape.docx") +{ + // Unhandled exception due to unexpected w:tblpPr resulted in not importing page size, either. + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + // This was 2000, page width wasn't large enough. + CPPUNIT_ASSERT_EQUAL(static_cast(2540), + getProperty(xPageStyle, "LeftMargin")); +} + +DECLARE_OOXMLEXPORT_TEST(testImageNoborder, "image-noborder.docx") +{ + // This was 26; we exported border for an image that had no border. + CPPUNIT_ASSERT_EQUAL(static_cast(0), + getProperty(getShape(1), "TopBorder").LineWidth); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf89774) +{ + loadAndSave("tdf89774.fodt"); + xmlDocUniquePtr pXmlDoc = parseExport("docProps/app.xml"); + // This was 65, as unit was seconds instead of minutes. + assertXPathContent(pXmlDoc, + "/extended-properties:Properties/extended-properties:TotalTime"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testSectionProtection) +{ + loadAndReload("sectionprot.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:pPr/w:sectPr/w:formProt"_ostr, "val"_ostr, + "true"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:formProt"_ostr, "val"_ostr, "false"); + + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "enforcement"_ostr, "true"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "edit"_ostr, "forms"); + + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), + uno::UNO_QUERY); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("TextSection is protected", true, + getProperty(xSect, "IsProtected")); + xSect.set(xSections->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", false, + getProperty(xSect, "IsProtected")); +} + +CPPUNIT_TEST_FIXTURE(Test, testSectionProtection2) +{ + loadAndSave("sectionprot2.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "enforcement"_ostr, "true"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "edit"_ostr, "forms"); + + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), + uno::UNO_QUERY); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("TextSection is protected", true, + getProperty(xSect, "IsProtected")); +} + +DECLARE_OOXMLEXPORT_TEST(tdf66398_permissions, "tdf66398_permissions.docx") +{ + // check document permission settings for the whole document + if (isExported()) + { + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "edit"_ostr, "readOnly"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "enforcement"_ostr, "1"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "cryptProviderType"_ostr, + "rsaAES"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, + "cryptAlgorithmClass"_ostr, "hash"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, + "cryptAlgorithmType"_ostr, "typeAny"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "cryptAlgorithmSid"_ostr, + "14"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "cryptSpinCount"_ostr, + "100000"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "hash"_ostr, + "A0/" + "Xy6KcXljJlZjP0TwJMPJuW2rc46UwXqn2ctxckc2nCECE5i89M85z2Noh3ZEA5NBQ9RJ5ycxiUH6nz" + "mJaKw=="); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "salt"_ostr, + "B8k6wb1pkjUs4Nv/8QBk/w=="); + } + + // get bookmark interface + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + // check: we have 2 bookmarks + CPPUNIT_ASSERT_EQUAL(static_cast(2), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("_GoBack")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("permission-for-group:267014232:everyone")); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf106843) +{ + loadAndSave("tdf106843.fodt"); + // check Track Changes permission set in Writer/OpenDocument (password: "test", encoded by default encoding of Writer) + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "edit"_ostr, + "trackedChanges"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection"_ostr, "enforcement"_ostr, "1"); + + // LO intends to export a .docx format that is natively compatible with 2013 + // but this document has an implicitly added setting AddExternalLeading = false + assertXPath(pXmlSettings, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "name"_ostr, + "compatibilityMode"); + assertXPath(pXmlSettings, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "uri"_ostr, + "http://schemas.microsoft.com/office/word"); + assertXPath(pXmlSettings, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "val"_ostr, + "14"); // compatible with 2010 +} + +CPPUNIT_TEST_FIXTURE(Test, tdf89991_revisionView) +{ + loadAndSave("tdf89991.docx"); + // check revisionView (Show Changes) import and export + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:revisionView"_ostr, "insDel"_ostr, "0"); + assertXPath(pXmlSettings, "/w:settings/w:revisionView"_ostr, "formatting"_ostr, "0"); + + // There was no compatibilityMode defined. + // 12: Use word processing features specified in ECMA-376. This is the default. + assertXPath(pXmlSettings, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "name"_ostr, + "compatibilityMode"); + assertXPath(pXmlSettings, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "uri"_ostr, + "http://schemas.microsoft.com/office/word"); + assertXPath(pXmlSettings, "/w:settings/w:compat/w:compatSetting[1]"_ostr, "val"_ostr, "12"); +} + +CPPUNIT_TEST_FIXTURE(Test, tdf122201_editUnprotectedText) +{ + loadAndReload("tdf122201_editUnprotectedText.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // get the document + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + + // get two different nodes + SwNodeIndex aDocEnd(pDoc->GetNodes().GetEndOfContent()); + SwNodeIndex aDocStart(*aDocEnd.GetNode().StartOfSectionNode(), 3); + + // check protected area + SwPaM aPaMProtected(aDocStart); + CPPUNIT_ASSERT(aPaMProtected.HasReadonlySel(false, false)); + + // check unprotected area + SwPaM aPaMUnprotected(aDocEnd); + CPPUNIT_ASSERT(!aPaMUnprotected.HasReadonlySel(false, false)); +} + +CPPUNIT_TEST_FIXTURE(Test, testSectionHeader) +{ + loadAndReload("sectionprot.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // this test must not be zero + assertXPath(pXmlDoc, "//w:headerReference"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf146491) +{ + loadAndReload("tdf146491.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // This was 12 - a page style was unnecessarily created for every section. + assertXPath(pXmlDoc, "//w:footerReference"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testOO47778_1) +{ + loadAndReload("ooo47778-3.odt"); + CPPUNIT_ASSERT_EQUAL(5, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathContent(pXmlDoc, "(//w:t)[3]"_ostr, "c"); +} + +CPPUNIT_TEST_FIXTURE(Test, testOO47778_2) +{ + loadAndReload("ooo47778-4.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathContent(pXmlDoc, "(//w:t)[4]"_ostr, "c"); + + // tdf116436: The problem was that the table background was undefined, not white. + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xCell, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testOO67471) +{ + loadAndReload("ooo67471-2.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathContent(pXmlDoc, "(//w:t)[2]"_ostr, "B"); +} + +CPPUNIT_TEST_FIXTURE(Test, testKDE302504) +{ + loadAndReload("kde302504-1.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//v:shape"_ostr, "ID"_ostr, "KoPathShape"); +} + +CPPUNIT_TEST_FIXTURE(Test, testKDE216114) +{ + loadAndReload("kde216114-1.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:pict"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testOO72950) +{ + loadAndReload("ooo72950-1.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:tbl"_ostr, 1); +} + +//There are two tables to export in this doc the second of which is inside a +//frame anchored to first cell of the first table. They must not be +//considered the same table +CPPUNIT_TEST_FIXTURE(Test, fdo60957) +{ + loadAndSave("fdo60957-2.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:tbl"_ostr, 2); + + //tdf#154956 + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), + uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + CPPUNIT_ASSERT_EQUAL(static_cast(1), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("_GoBack")); +} + +//This has more cells than msword supports, we must balance the +//number of cell start and ends +CPPUNIT_TEST_FIXTURE(Test, testOO106020) +{ + loadAndSave("ooo106020-1.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "//w:tbl"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testNonBMPChar, "nonbmpchar.docx") +{ + // Assert that UTF8 encoded non-BMP Unicode character is correct + uno::Reference xTextRange1 = getRun(getParagraph(1), 1); + CPPUNIT_ASSERT_EQUAL(u"\U00024b62"_ustr, xTextRange1->getString()); +} + +CPPUNIT_TEST_FIXTURE(Test, testSpacingGroupShapeText) +{ + loadAndSave("tdf131775_SpacingGroupShapeText.docx"); + // tdf#131775: Check if correct spacing. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, + "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/a:graphic/a:graphicData/wpg:wgp/wps:wsp[1]/wps:txbx/w:txbxContent/w:p/w:r/w:rPr/" + "w:spacing"_ostr, + "val"_ostr, "200"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf100581) +{ + loadAndSave("tdf100581.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath( + pXmlDocument, + "/w:document/w:body/w:p[1]/w:r[2]/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/a:graphic/a:graphicData/wps:wsp/wps:txbx/w:txbxContent/w:p[1]/w:pPr/w:pStyle"_ostr, + "val"_ostr, "FrameContents"); + + // w:sectPr is not exported + assertXPath( + pXmlDocument, + "/w:document/w:body/w:p[1]/w:r[2]/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/a:graphic/a:graphicData/wps:wsp/wps:txbx/w:txbxContent/w:p[1]/w:pPr/w:sectPr"_ostr, + 0); + + assertXPath(pXmlDocument, + "/w:document/w:body/w:p[1]/w:r[2]/mc:AlternateContent/mc:Fallback/w:pict/v:rect" + "/v:textbox/w:txbxContent/w:p[1]/w:pPr/w:pStyle"_ostr, + "val"_ostr, "FrameContents"); + + // w:sectPr is not exported + assertXPath(pXmlDocument, + "/w:document/w:body/w:p[1]/w:r[2]/mc:AlternateContent/mc:Fallback/w:pict/v:rect" + "/v:textbox/w:txbxContent/w:p[1]/w:pPr/w:sectPr"_ostr, + 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf112287) +{ + loadAndSave("tdf112287.docx"); + // tdf#131775: Check if correct spacing. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "vAnchor"_ostr, + "margin"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "hAnchor"_ostr, + "text"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "xAlign"_ostr, + "center"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "yAlign"_ostr, + "bottom"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf157572_defaultVAnchor) +{ + loadAndSave("tdf157572_defaultVAnchor.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // vAnchor wasn't defined on import. It should default to 'margin' when w:y=non-zero + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "vAnchor"_ostr, + "margin"); + // yAlign=something is not compatible with w:y=non-zero" - don't write anything out + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, + "yAlign"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf157572_insidiousCombination) +{ + loadAndSave("tdf157572_insidiousCombination.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // This is a NASTY example. In MS Word, it IMPORTS yAlign=bottom, but positions it as y=0. + // although the UI shows "bottom" instead of position 0cm. Clicking -ok- MOVES the textbox. + // Seems best to throw away "bottom" in LO, since a round-trip in MS Word keeps the 0cm + // position and the vAlign ONLY affects the UI. + + // vAnchor was defined as text. + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "vAnchor"_ostr, + "text"); + // yAlign=something is not compatible with "text" - don't write anything out + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, + "yAlign"_ostr); + // y is zero - no need to write out the default value + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, + "y"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf157572_noVAlignAsText) +{ + loadAndSave("tdf157572_noVAlignAsText.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "vAnchor"_ostr, + "text"); + // yAlign=something is not compatible with vAnchor="text" - don't write anything out + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, + "yAlign"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf112287B) +{ + loadAndSave("tdf112287B.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "vAnchor"_ostr, + "text"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:pPr/w:framePr"_ostr, "hAnchor"_ostr, + "text"); +} + +CPPUNIT_TEST_FIXTURE(Test, testZOrderInHeader) +{ + loadAndSave("tdf120760_ZOrderInHeader.docx"); + // tdf#120760 Check that the Z-Order of the background is smaller than the front shape's. + xmlDocUniquePtr pXml = parseExport("word/header2.xml"); + + // Get the Z-Order of the background image and of the shape in front of it. + sal_Int32 nBackground + = getXPath(pXml, "/w:hdr/w:p[1]/w:r[1]/w:drawing/wp:anchor"_ostr, "relativeHeight"_ostr) + .toInt32(); + sal_Int32 nFrontShape = getXPath(pXml, + "/w:hdr/w:p[1]/w:r[1]/mc:AlternateContent[2]" + "/mc:Choice/w:drawing/wp:anchor"_ostr, + "relativeHeight"_ostr) + .toInt32(); + + // Assert that background is in the back. + CPPUNIT_ASSERT(nBackground < nFrontShape); +} + +CPPUNIT_TEST_FIXTURE(Test, testSvgExtensionsSupport) +{ + loadAndSave("SvgImageTest.odt"); + + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + + // Check we have 2 relationships - one for PNG and one for SVG files + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='media/image1.png']"_ostr, "Id"_ostr, + "rId2"); + + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='media/image2.svg']"_ostr, "Id"_ostr, + "rId3"); + + // Check there is the extension present + xmlDocUniquePtr pXmlDocContent = parseExport("word/document.xml"); + + OString aPath( + "/w:document/w:body/w:p/w:r/w:drawing/wp:anchor/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip"_ostr); + assertXPath(pXmlDocContent, aPath, "embed"_ostr, "rId2"); + + assertXPath(pXmlDocContent, aPath + "/a:extLst/a:ext"_ostr, "uri"_ostr, + "{96DAC541-7B7A-43D3-8B79-37D633B846F1}"); + assertXPath(pXmlDocContent, aPath + "/a:extLst/a:ext/asvg:svgBlip"_ostr, "embed"_ostr, "rId3"); +} + +CPPUNIT_TEST_FIXTURE(Test, testtdf158044) +{ + loadAndSave("tdf158044.odt"); + // write hard attributes to prevent multiple toggle attributes from vanishing + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr[1]/w:rStyle[1]"_ostr, "val"_ostr, + "BoldItalicCapsEmbossedStrike"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr[1]/w:b[1]"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr[1]/w:bCs[1]"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr[1]/w:i[1]"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr[1]/w:iCs[1]"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr[1]/w:strike[1]"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r[2]/w:rPr[1]/w:emboss[1]"_ostr); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[4]/w:rPr[1]/w:rStyle[1]"_ostr, "val"_ostr, + "SmallcapsImprint"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[4]/w:rPr[1]/w:imprint[1]"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[4]/w:rPr[1]/w:smallCaps[1]"_ostr); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:r[2]/w:rPr[1]/w:rStyle[1]"_ostr, "val"_ostr, + "AllCaps"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[4]/w:r[2]/w:rPr[1]/w:caps[1]"_ostr); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:r[2]/w:rPr[1]/w:rStyle[1]"_ostr, "val"_ostr, + "Hidden"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[6]/w:r[2]/w:rPr[1]/w:vanish[1]"_ostr); + + assertXPath(pXmlDoc, "/w:document/w:body/w:p[8]/w:r[4]/w:rPr[1]/w:rStyle[1]"_ostr, "val"_ostr, + "OutlineShadow"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[8]/w:r[4]/w:rPr[1]/w:outline[1]"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[8]/w:r[4]/w:rPr[1]/w:shadow[1]"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf158855) +{ + // Given a table immediately followed by a section break + loadFromFile(u"section_break_after_table.docx"); + + // Check that the import doesn't produce an extra empty paragraph before a page break + CPPUNIT_ASSERT_EQUAL(2, getPages()); // was 3 + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); // was 3 + uno::Reference(getParagraphOrTable(1), uno::UNO_QUERY_THROW); + getParagraph(2, u"Next page"_ustr); // was empty, with the 3rd being "Next page" + + saveAndReload(mpFilter); + + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); + uno::Reference(getParagraphOrTable(1), uno::UNO_QUERY_THROW); + getParagraph(2, u"Next page"_ustr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf158971) +{ + // Given a section break and an SDT in the following paragraph + loadFromFile(u"sdt_after_section_break.docx"); + + // Check that the import doesn't introduce unwanted character properties in the paragraph after + // the section break + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); + { + auto para = getParagraph(2, u"text"_ustr); + css::uno::Reference xRunState(getRun(para, 1, u""_ustr), + css::uno::UNO_QUERY_THROW); + // without the fix, this would fail with + // - Expected: 1 + // - Actual : 0 + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"RubyAdjust"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"RubyIsAbove"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"RubyPosition"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"UnvisitedCharStyleName"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"VisitedCharStyleName"_ustr)); + } + + // Saving must not fail assertions + saveAndReload(mpFilter); + + // Check again + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); + { + auto para = getParagraph(2, u"text"_ustr); + css::uno::Reference xRunState(getRun(para, 1, u""_ustr), + css::uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"RubyAdjust"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"RubyIsAbove"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"RubyPosition"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"UnvisitedCharStyleName"_ustr)); + CPPUNIT_ASSERT_EQUAL(css::beans::PropertyState_DEFAULT_VALUE, + xRunState->getPropertyState(u"VisitedCharStyleName"_ustr)); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf159110) +{ + // Given a text with an URL with multiple spaces + loadAndReload("multi_space_url.fodt"); + + constexpr OUString sExpectedURL = u"http://www.example.org/path%20%20with%20%20spaces"_ustr; + + // Without the fix, this would have failed with + // - Expected: http://www.example.org/path%20%20with%20%20spaces + // - Actual : http://www.example.org/path with spaces + CPPUNIT_ASSERT_EQUAL(sExpectedURL, + getProperty(getRun(getParagraph(1), 1), u"HyperLinkURL"_ustr)); + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + OString sId + = OUStringToOString(getXPath(pXmlDoc, "/w:document/w:body/w:p/w:hyperlink"_ostr, "id"_ostr), + RTL_TEXTENCODING_UTF8); + + xmlDocUniquePtr pXmlRels = parseExport("word/_rels/document.xml.rels"); + + // Without the fix, this would have failed with + // - Expected: http://www.example.org/path%20%20with%20%20spaces + // - Actual : http://www.example.org/path with spaces + // - In <>, attribute 'Target' of '/rels:Relationships/rels:Relationship[@Id='rId2']' incorrect value. + // I.e., the spaces were stored without percent-encoding, and collapsed on import + assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@Id='"_ostr + sId + "']", + "Target"_ostr, sExpectedURL); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx new file mode 100644 index 0000000000..bb20cec1a5 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport3.cxx @@ -0,0 +1,1234 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} +}; + +DECLARE_OOXMLEXPORT_TEST(testFdo68418, "fdo68418.docx") +{ + // The problem was that in 'MSWordExportBase::SectionProperties' function in 'wrt8sty.cxx' + // it checked if it 'IsPlausableSingleWordSection'. + // The 'IsPlausableSingleWordSection' compared different aspects of 2 'SwFrameFormat' objects. + // One of the checks was 'do both formats have the same distance from the top and bottom ?' + // This check is correct if both have headers or both don't have headers. + // However - if one has a header, and the other one has an empty header (no header) - it is not correct to compare + // between them (same goes for 'footer'). + uno::Reference xFooterText = getProperty< uno::Reference >(getStyles("PageStyles")->getByName("Standard"), "FooterText"); + uno::Reference< text::XTextRange > xFooterParagraph = getParagraphOfText( 1, xFooterText ); + + // First page footer is empty, second page footer is 'aaaa' + CPPUNIT_ASSERT_EQUAL(OUString("aaaa"), xFooterParagraph->getString()); // I get an error that it expects '' +} + +DECLARE_OOXMLEXPORT_TEST(testA4AndBorders, "a4andborders.docx") +{ + /* + * The problem was that in case of a document with borders, the pgSz attribute + * was exported as a child of pgBorders, thus being ignored on reload. + * We assert dimension against A4 size in mm (to avoid minor rounding errors) + */ + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect Page Width (mm)", sal_Int32(210), getProperty(xPageStyle, "Width") / 100); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect Page Height (mm)", sal_Int32(297), getProperty(xPageStyle, "Height") / 100); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo68787, "fdo68787.docx") +{ + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + // This was 25, the 'lack of w:separator' <-> '0 line width' mapping was missing. + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xPageStyle, "FootnoteLineRelativeWidth")); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf92470_footnoteRestart, "tdf92470_footnoteRestart.docx") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT( pTextDoc ); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT( pDoc ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Footnote doesn't restart every Page", FTNNUM_PAGE, pDoc->GetFootnoteInfo().m_eNum ); + + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(25), getProperty(xPageStyle, "FootnoteLineRelativeWidth")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf108944_footnoteSeparator2) +{ + loadAndReload("tdf108944_footnoteSeparator2.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + //This was zero. The comment was causing the bHasFtnSep flag to be reset to false, so the separator was missing. + CPPUNIT_ASSERT_EQUAL(static_cast(25), getProperty(xPageStyle, "FootnoteLineRelativeWidth")); +} + +CPPUNIT_TEST_FIXTURE(Test, testCharacterBorder) +{ + loadAndReload("charborder.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xRun(getRun(getParagraph(1),1), uno::UNO_QUERY); + // OOXML has just one border attribute () for text border so all side has + // the same border with the same padding + // Border + { + const table::BorderLine2 aTopBorder = getProperty(xRun,"CharTopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(table::BorderLine2(0xFF6600,0,318,0,0,318), aTopBorder); + CPPUNIT_ASSERT_BORDER_EQUAL(aTopBorder, getProperty(xRun,"CharLeftBorder")); + CPPUNIT_ASSERT_BORDER_EQUAL(aTopBorder, getProperty(xRun,"CharBottomBorder")); + CPPUNIT_ASSERT_BORDER_EQUAL(aTopBorder, getProperty(xRun,"CharRightBorder")); + } + + // Padding (w:space) + { + const sal_Int32 nTopPadding = getProperty(xRun,"CharTopBorderDistance"); + // In the original ODT the padding is 150, but the unit conversion round it down. + CPPUNIT_ASSERT_EQUAL(sal_Int32(141), nTopPadding); + CPPUNIT_ASSERT_EQUAL(nTopPadding, getProperty(xRun,"CharLeftBorderDistance")); + CPPUNIT_ASSERT_EQUAL(nTopPadding, getProperty(xRun,"CharBottomBorderDistance")); + CPPUNIT_ASSERT_EQUAL(nTopPadding, getProperty(xRun,"CharRightBorderDistance")); + } + + // Shadow (w:shadow) + /* OOXML use just one bool value for shadow so the next conversions + are made during an export-import round + color: any -> black + location: any -> bottom-right + width: any -> border width */ + { + const table::ShadowFormat aShadow = getProperty(xRun, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(318), aShadow.ShadowWidth); + } + + // Also check shadow when it is in middle of the paragraph + // (problem can be during export with SwWW8AttrIter::HasTextItem()) + { + uno::Reference xMiddleRun(getRun(getParagraph(2),2), uno::UNO_QUERY); + const table::ShadowFormat aShadow = getProperty(xMiddleRun, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(318), aShadow.ShadowWidth); + } + + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + // Make sure we write qFormat for custom style names. + assertXPath(pXmlStyles, "//w:style[@w:styleId='Heading']/w:qFormat"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testStyleInheritance) +{ + loadAndSave("style-inheritance.docx"); + + // Check that now styleId's are more like what MSO produces + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + // the 1st style always must be Normal + assertXPath(pXmlStyles, "/w:styles/w:style[1]"_ostr, "styleId"_ostr, "Normal"); + // some random style later + assertXPath(pXmlStyles, "/w:styles/w:style[4]"_ostr, "styleId"_ostr, "Heading3"); + + // Check that we do _not_ export w:next for styles that point to themselves. + assertXPath(pXmlStyles, "/w:styles/w:style[1]/w:next"_ostr, 0); + + // Check that we roundtrip correctly - on XML level + assertXPath(pXmlStyles, "/w:styles/w:style[2]/w:next"_ostr, "val"_ostr, "Normal"); + // And to be REALLY sure, check it on the API level too ;-) + uno::Reference< container::XNameAccess > paragraphStyles = getStyles("ParagraphStyles"); + uno::Reference< beans::XPropertySet > properties(paragraphStyles->getByName("Heading 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Standard"), getProperty(properties, "FollowStyle")); + + // This was 0, as export of w:outlineLvl was missing. + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getProperty(properties, "OutlineLevel")); + + properties.set(paragraphStyles->getByName("Heading 11"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Heading 1"), getProperty(properties, "FollowStyle")); + + // Make sure style #2 is Heading 1. + assertXPath(pXmlStyles, "/w:styles/w:style[2]"_ostr, "styleId"_ostr, "Heading1"); + // w:ind was copied from the parent (Normal) style without a good reason. + assertXPath(pXmlStyles, "/w:styles/w:style[2]/w:pPr/w:ind"_ostr, 0); + + // We output exactly 2 properties in rPrDefault, nothing else was + // introduced as an additional default + assertXPath(pXmlStyles, "/w:styles/w:docDefaults/w:rPrDefault/w:rPr/*"_ostr, 2); + // Check that we output real content of rPrDefault + assertXPath(pXmlStyles, "/w:styles/w:docDefaults/w:rPrDefault/w:rPr/w:rFonts"_ostr, "ascii"_ostr, "Times New Roman"); + assertXPath(pXmlStyles, "/w:styles/w:docDefaults/w:rPrDefault/w:rPr/w:lang"_ostr, "bidi"_ostr, "ar-SA"); + // pPrDefault contains only one hyphenation property + assertXPath(pXmlStyles, "/w:styles/w:docDefaults/w:pPrDefault/w:pPr/*"_ostr, 1); + + // Check latent styles + uno::Sequence aGrabBag = getProperty< uno::Sequence >(mxComponent, "InteropGrabBag"); + uno::Sequence aLatentStyles; + for (beans::PropertyValue const & prop : std::as_const(aGrabBag)) + if (prop.Name == "latentStyles") + prop.Value >>= aLatentStyles; + CPPUNIT_ASSERT(aLatentStyles.getLength()); // document should have latent styles + + // Check latent style default attributes + OUString aCount; + uno::Sequence aLatentStyleExceptions; + for (beans::PropertyValue const & prop : std::as_const(aLatentStyles)) + { + if (prop.Name == "count") + aCount = prop.Value.get(); + else if (prop.Name == "lsdExceptions") + prop.Value >>= aLatentStyleExceptions; + } + CPPUNIT_ASSERT_EQUAL(OUString("371"), aCount); // This check the "count" attribute. + + // Check exceptions to the latent style defaults. + uno::Sequence aLatentStyleException; + aLatentStyleExceptions[0].Value >>= aLatentStyleException; + OUString aName; + for (beans::PropertyValue const & prop : std::as_const(aLatentStyleException)) + if (prop.Name == "name") + aName = prop.Value.get(); + CPPUNIT_ASSERT_EQUAL(OUString("Normal"), aName); // This checks the "name" attribute of the first exception. + + // This numbering style wasn't roundtripped. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='NoList']/w:name"_ostr, "val"_ostr, "No List"); + + // Table style wasn't roundtripped. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='TableNormal']/w:tblPr/w:tblCellMar/w:left"_ostr, "w"_ostr, "108"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='TableNormal']/w:semiHidden"_ostr, 1); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='TableNormal']/w:unhideWhenUsed"_ostr, 1); + + // Additional para style properties should be also roundtripped. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='ListParagraph']/w:uiPriority"_ostr, "val"_ostr, "34"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Normal']/w:qFormat"_ostr, 1); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Normal']/w:rsid"_ostr, "val"_ostr, "00780346"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Normal']"_ostr, "default"_ostr, "1"); + + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Heading1']/w:link"_ostr, "val"_ostr, "Heading1Char"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Heading1']/w:locked"_ostr, 1); + + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Heading11']"_ostr, "customStyle"_ostr, "1"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Heading11']/w:autoRedefine"_ostr, 1); + + // Additional char style properties should be also roundtripped. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='DefaultParagraphFont']"_ostr, "default"_ostr, "1"); + + // Finally check the same for numbering styles. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='NoList']"_ostr, "default"_ostr, "1"); + + // This was 1, the default style had even for a default style having no RES_PARATR_HYPHENZONE set. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Normal']/w:pPr/w:suppressAutoHyphens"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testCalendar1) +{ + loadAndSave("calendar1.docx"); + // Document has a non-trivial table style, test the roundtrip of it. + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:basedOn"_ostr, "val"_ostr, "TableNormal"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:rsid"_ostr, "val"_ostr, "00903003"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblPr/w:tblStyleColBandSize"_ostr, "val"_ostr, "1"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tcPr/w:shd"_ostr, "val"_ostr, "clear"); + + // Table style lost its paragraph / run properties. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:pPr/w:spacing"_ostr, "lineRule"_ostr, "auto"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:rPr/w:lang"_ostr, "eastAsia"_ostr, "ja-JP"); + + // Table style lost its conditional table formatting properties. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblStylePr[@w:type='firstRow']/w:pPr/w:wordWrap"_ostr, 1); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblStylePr[@w:type='firstRow']/w:rPr/w:rFonts"_ostr, "hAnsiTheme"_ostr, "minorHAnsi"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblStylePr[@w:type='firstRow']/w:tblPr"_ostr, 1); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblStylePr[@w:type='firstRow']/w:tcPr/w:vAlign"_ostr, "val"_ostr, "bottom"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblStylePr[@w:type='lastRow']/w:tcPr/w:tcBorders/w:tr2bl"_ostr, "val"_ostr, "nil"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar1']/w:tblStylePr[@w:type='band2Horz']/w:tcPr/w:tcBorders/w:top"_ostr, "themeColor"_ostr, "text1"); + + // w:tblLook element and its attributes were missing. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblLook"_ostr, "firstRow"_ostr, "1"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblLook"_ostr, "lastRow"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblLook"_ostr, "lastColumn"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblLook"_ostr, "firstColumn"_ostr, "1"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblLook"_ostr, "noHBand"_ostr, "0"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblLook"_ostr, "noVBand"_ostr, "1"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblLook"_ostr, "val"_ostr, "04a0"); +} + +DECLARE_OOXMLEXPORT_TEST(testCalendar2, "calendar2.docx") +{ + // Problem was that CharCaseMap was style::CaseMap::NONE. + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(style::CaseMap::UPPERCASE, getProperty(getRun(getParagraphOfText(1, xCell->getText()), 1), "CharCaseMap")); + // Font size in the second row was 11. + xCell.set(xTable->getCellByName("A2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(16.f, getProperty(getRun(getParagraphOfText(1, xCell->getText()), 1), "CharHeight")); + // Font size in the third row was 11 as well. + xCell.set(xTable->getCellByName("B3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(14.f, getProperty(getRun(getParagraphOfText(1, xCell->getText()), 1), "CharHeight")); + + // This paragraph property was missing in table style. + if (!isExported()) + return; + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:pPr/w:jc"_ostr, "val"_ostr, "center"); + + // These run properties were missing + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:rPr/w:lang"_ostr, "val"_ostr, "en-US"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:rPr/w:lang"_ostr, "bidi"_ostr, "ar-SA"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:tblStylePr[@w:type='firstRow']/w:rPr/w:caps"_ostr, 1); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:tblStylePr[@w:type='firstRow']/w:rPr/w:smallCaps"_ostr, "val"_ostr, "0"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:tblStylePr[@w:type='firstRow']/w:rPr/w:color"_ostr, "themeColor"_ostr, "accent1"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:tblStylePr[@w:type='firstRow']/w:rPr/w:spacing"_ostr, "val"_ostr, "20"); + + // Table borders were also missing + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar2']/w:tblPr/w:tblBorders/w:insideV"_ostr, "themeTint"_ostr, "99"); +} + +DECLARE_OOXMLEXPORT_TEST(testCalendar3, "calendar3.docx") +{ + // TableStyle:firstRow (for header rows 1 and 2) color and size overrides document rPrDefault + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x5B9BD5), getProperty(getRun(getParagraphOfText(1, xCell->getText()), 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL(16.f, getProperty(getRun(getParagraphOfText(1, xCell->getText()),1), "CharHeight")); + // direct formatting in A1 + uno::Reference xCell2(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x2E74B5), getProperty(getRun(getParagraphOfText(1, xCell2->getText()), 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL(20.f, getProperty(getRun(getParagraphOfText(1, xCell2->getText()),1), "CharHeight")); + + // tdf#132149 Despite specifying portrait, the page size's specified width is greater than its height. + // Both Word and LO display it as landscape, so ensure that it round-trips with landscape dimensions. + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Page Width (mm) ", sal_Int32(148), getProperty(xPageStyle, "Width") / 100); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Page Height (mm)", sal_Int32(104), getProperty(xPageStyle, "Height") / 100); +} + +DECLARE_OOXMLEXPORT_TEST(testCalendar4, "calendar4.docx") +{ + // TableStyle:fontsize - overrides DocDefaults, but not Style. + // In this case the style does not define anything (but does copy-inherit the DocDefaults size 36) + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(14.f, getProperty(getRun(xCell,1), "CharHeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testCalendar5, "calendar5.docx") +{ + // check text portions with and without direct formatting + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + // text portions with direct formatting + CPPUNIT_ASSERT_EQUAL(Color(0x2E74B5), getProperty(getRun(getParagraphOfText(1, xCell->getText()), 1), "CharColor")); + CPPUNIT_ASSERT_EQUAL(Color(0xFF0000), getProperty(getRun(getParagraphOfText(1, xCell->getText()), 2), "CharColor")); + // default paragraph text color + CPPUNIT_ASSERT_EQUAL(Color(0x5B9BD5), getProperty(getRun(getParagraphOfText(1, xCell->getText()), 3), "CharColor")); + // text portions with direct formatting + CPPUNIT_ASSERT_EQUAL(20.f, getProperty(getRun(getParagraphOfText(1, xCell->getText()),1), "CharHeight")); + CPPUNIT_ASSERT_EQUAL(10.f, getProperty(getRun(getParagraphOfText(1, xCell->getText()),2), "CharHeight")); + // default paragraph text size + CPPUNIT_ASSERT_EQUAL(16.f, getProperty(getRun(getParagraphOfText(1, xCell->getText()),3), "CharHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTcBorders) +{ + loadAndSave("testTcBorders.docx"); + //fdo#76635 : Table borders are not getting preserved. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document[1]/w:body[1]/w:tbl[1]/w:tr[1]/w:tc[1]/w:tcPr[1]/w:tcBorders[1]/w:bottom[1][@w:val = 'single']"_ostr,1); + assertXPath(pXmlDocument, "/w:document[1]/w:body[1]/w:tbl[1]/w:tr[1]/w:tc[1]/w:tcPr[1]/w:tcBorders[1]/w:bottom[1][@w:sz = 4]"_ostr, 1); + assertXPath(pXmlDocument, "/w:document[1]/w:body[1]/w:tbl[1]/w:tr[1]/w:tc[1]/w:tcPr[1]/w:tcBorders[1]/w:bottom[1][@w:space = 0]"_ostr, 1); + assertXPath(pXmlDocument, "/w:document[1]/w:body[1]/w:tbl[1]/w:tr[1]/w:tc[1]/w:tcPr[1]/w:tcBorders[1]/w:bottom[1][@w:color = 808080]"_ostr, 1); + + uno::Reference xStyle( + getStyles("CharacterStyles")->getByName("Code Featured Element"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Bold", float(150), getProperty(xStyle, "CharWeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testQuicktables) +{ + loadAndSave("quicktables.docx"); + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + + // These were missing in the Calendar3 table style. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar3']/w:rPr/w:rFonts"_ostr, "cstheme"_ostr, "majorBidi"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar3']/w:rPr/w:color"_ostr, "themeTint"_ostr, "80"); + CPPUNIT_ASSERT(getXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar3']/w:tblStylePr[@w:type='firstRow']/w:rPr/w:color"_ostr, "themeShade"_ostr).equalsIgnoreAsciiCase("BF")); + + // Calendar4. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar4']/w:pPr/w:snapToGrid"_ostr, "val"_ostr, "0"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar4']/w:rPr/w:bCs"_ostr, 1); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar4']/w:tcPr/w:shd"_ostr, "themeFill"_ostr, "accent1"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar4']/w:tcPr/w:shd"_ostr, "themeFillShade"_ostr, "80"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar4']/w:tblStylePr[@w:type='firstCol']/w:pPr/w:ind"_ostr, "rightChars"_ostr, "0"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar4']/w:tblStylePr[@w:type='firstCol']/w:pPr/w:ind"_ostr, "right"_ostr, "144"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Calendar4']/w:tblStylePr[@w:type='band2Horz']/w:tcPr/w:tcMar/w:bottom"_ostr, "w"_ostr, "86"); + + // LightList. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='LightList']/w:tblStylePr[@w:type='firstRow']/w:pPr/w:spacing"_ostr, "before"_ostr, "0"); + + // MediumList2-Accent1. + CPPUNIT_ASSERT(getXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='MediumList2-Accent1']/w:tblStylePr[@w:type='band1Vert']/w:tcPr/w:shd"_ostr, "themeFillTint"_ostr).equalsIgnoreAsciiCase("3F")); + + // MediumShading2-Accent5. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='MediumShading2-Accent5']/w:tblStylePr[@w:type='firstRow']/w:tcPr/w:tcBorders/w:top"_ostr, "color"_ostr, "auto"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo71302) +{ + loadAndSave("fdo71302.docx"); + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + + // This got renamed to "Strong Emphasis" without a good reason. + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Strong']"_ostr, 1); +} + + +DECLARE_OOXMLEXPORT_TEST(testSmartart, "smartart.docx") +{ + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY); + uno::Sequence aGrabBag(0); + xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag; + CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty + + bool bTheme = false; + for(beans::PropertyValue const & prop : std::as_const(aGrabBag)) + { + if (prop.Name == "OOXTheme") + { + bTheme = true; + uno::Reference aThemeDom; + CPPUNIT_ASSERT(prop.Value >>= aThemeDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aThemeDom); // Reference not empty + } + } + CPPUNIT_ASSERT(bTheme); // Grab Bag has all the expected elements + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); // One groupshape in the doc + + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xGroup->getCount()); // 1 rendered bitmap from the original shapes + + uno::Reference xGroupPropertySet(getShape(1), uno::UNO_QUERY); + xGroupPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag; + CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty + + bool bData = false, bLayout = false, bQStyle = false, bColor = false, bDrawing = false; + for(beans::PropertyValue const & prop : std::as_const(aGrabBag)) + { + if (prop.Name == "OOXData") + { + bData = true; + uno::Reference aDataDom; + CPPUNIT_ASSERT(prop.Value >>= aDataDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aDataDom); // Reference not empty + } + else if (prop.Name == "OOXLayout") + { + bLayout = true; + uno::Reference aLayoutDom; + CPPUNIT_ASSERT(prop.Value >>= aLayoutDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aLayoutDom); // Reference not empty + } + else if (prop.Name == "OOXStyle") + { + bQStyle = true; + uno::Reference aStyleDom; + CPPUNIT_ASSERT(prop.Value >>= aStyleDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aStyleDom); // Reference not empty + } + else if (prop.Name == "OOXColor") + { + bColor = true; + uno::Reference aColorDom; + CPPUNIT_ASSERT(prop.Value >>= aColorDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aColorDom); // Reference not empty + } + else if (prop.Name == "OOXDrawing") + { + bDrawing = true; + uno::Sequence< uno::Any > diagramDrawing; + uno::Reference aDrawingDom; + CPPUNIT_ASSERT(prop.Value >>= diagramDrawing); + CPPUNIT_ASSERT(diagramDrawing[0] >>= aDrawingDom); // PropertyValue of proper type + CPPUNIT_ASSERT(aDrawingDom); // Reference not empty + } + } + // Grab Bag has all the expected elements: + CPPUNIT_ASSERT(bData); + CPPUNIT_ASSERT(bLayout); + CPPUNIT_ASSERT(bQStyle); + CPPUNIT_ASSERT(bColor); + CPPUNIT_ASSERT(bDrawing); + + uno::Reference xPropertySet(xGroup->getByIndex(0), uno::UNO_QUERY); + OUString nValue; + xPropertySet->getPropertyValue("Name") >>= nValue; + CPPUNIT_ASSERT_EQUAL(OUString("RenderedShapes"), nValue); // Rendered bitmap has the proper name +} + +CPPUNIT_TEST_FIXTURE(Test, testFontNameIsEmpty) +{ + loadAndSave("font-name-is-empty.docx"); + // Check no empty font name is exported + // This test does not fail, if the document contains a font with empty name. + + xmlDocUniquePtr pXmlFontTable = parseExport("word/fontTable.xml"); + xmlXPathObjectPtr pXmlObj = getXPathNode(pXmlFontTable, "/w:fonts/w:font"_ostr); + xmlNodeSetPtr pXmlNodes = pXmlObj->nodesetval; + sal_Int32 length = xmlXPathNodeSetGetLength(pXmlNodes); + for(sal_Int32 index = 0; index < length; index++){ + xmlNodePtr pXmlNode = pXmlNodes->nodeTab[index]; + OUString attrVal = OUString::createFromAscii(reinterpret_cast(xmlGetProp(pXmlNode, BAD_CAST("name")))); + if (attrVal.isEmpty()){ + CPPUNIT_FAIL("Font name is empty."); + } + } + xmlXPathFreeObject(pXmlObj); +} + +CPPUNIT_TEST_FIXTURE(Test, testMultiColumnLineSeparator) +{ + loadAndSave("multi-column-line-separator-SAVED.docx"); + // Check for the Column Separator value.It should be FALSE as the document does not contain separator line. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:pPr/w:sectPr/w:cols"_ostr,"sep"_ostr,"false"); +} + +DECLARE_OOXMLEXPORT_TEST(testCustomXmlGrabBag, "customxml.docx") +{ + // The problem was that item[n].xml and itemProps[n].xml and .rels files for item[n].xml + // files were missing from docx file after saving file. + // This test case tests whether customxml files grabbagged properly in correct object. + + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocumentPropertySet(xTextDocument, uno::UNO_QUERY); + uno::Sequence aGrabBag(0); + xTextDocumentPropertySet->getPropertyValue("InteropGrabBag") >>= aGrabBag; + CPPUNIT_ASSERT(aGrabBag.hasElements()); // Grab Bag not empty + bool CustomXml = false; + for(beans::PropertyValue const & prop : std::as_const(aGrabBag)) + { + if (prop.Name == "OOXCustomXml" || prop.Name == "OOXCustomXmlProps") + { + CustomXml = true; + uno::Reference aCustomXmlDom; + uno::Sequence > aCustomXmlDomList; + CPPUNIT_ASSERT(prop.Value >>= aCustomXmlDomList); // PropertyValue of proper type + sal_Int32 length = aCustomXmlDomList.getLength(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), length); + aCustomXmlDom = aCustomXmlDomList[0]; + CPPUNIT_ASSERT(aCustomXmlDom); // Reference not empty + } + } + CPPUNIT_ASSERT(CustomXml); // Grab Bag has all the expected elements +} + +CPPUNIT_TEST_FIXTURE(Test, testCustomXmlRelationships) +{ + loadAndSave("customxml.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("customXml/_rels/item1.xml.rels"); + + // Check there is a relation to itemProps1.xml. + assertXPath(pXmlDoc, "/rels:Relationships/rels:Relationship"_ostr, 1); + assertXPath(pXmlDoc, "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, "Target"_ostr, "itemProps1.xml"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo69644) +{ + loadAndSave("fdo69644.docx"); + // The problem was that the exporter exported the table definition + // with only 3 columns, instead of 5 columns. + // Check that the table grid is exported with 5 columns + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblGrid/w:gridCol"_ostr, 5); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo70812, "fdo70812.docx") +{ + // Import just crashed. + getParagraph(1, "Sample pages document."); +} + +CPPUNIT_TEST_FIXTURE(Test, testPgMargin) +{ + loadAndSave("testPgMargin.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgMar"_ostr, "left"_ostr, "1440"); +} + +DECLARE_OOXMLEXPORT_TEST(testImageCrop, "ImageCrop.docx") +{ + uno::Reference image = getShape(1); + uno::Reference imageProperties(image, uno::UNO_QUERY); + css::text::GraphicCrop aGraphicCropStruct; + + imageProperties->getPropertyValue( "GraphicCrop" ) >>= aGraphicCropStruct; + + CPPUNIT_ASSERT_EQUAL( sal_Int32( 2955 ), aGraphicCropStruct.Left ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 5477 ), aGraphicCropStruct.Right ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 2856 ), aGraphicCropStruct.Top ); + CPPUNIT_ASSERT_EQUAL( sal_Int32( 2291 ), aGraphicCropStruct.Bottom ); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf106974_int32Crop, "tdf106974_int32Crop.docx") +{ + uno::Reference image = getShape(1); + uno::Reference imageProperties(image, uno::UNO_QUERY); + css::text::GraphicCrop aGraphicCropStruct; + + imageProperties->getPropertyValue( "GraphicCrop" ) >>= aGraphicCropStruct; + + // The crop is constructed in GraphicProperties::pushToPropMap, where + // GraphicHelper::getOriginalSize tries to get graphic size in mm, then falls back to pixels, + // which are then converted to mm taking screen DPI scaling into account. Thus, the resulting + // values are DPI-dependent. + const double fXScaleFactor = 96.0 / Application::GetDefaultDevice()->GetDPIX(); + + CPPUNIT_ASSERT_MESSAGE( + OString::number(aGraphicCropStruct.Right).getStr(), + 40470 * fXScaleFactor < aGraphicCropStruct.Right); +} + +DECLARE_OOXMLEXPORT_TEST(testLineSpacingexport, "test_line_spacing.docx") +{ + // The Problem was that the w:line attribute value in w:spacing tag was incorrect + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + CPPUNIT_ASSERT(xParaEnum->hasMoreElements()); + + // FIXME The test passes on most machines (including Linux x86_64 with gcc-4.7), but fails on various configs: + // Linux arm, Linux x86_64 with gcc-4.8 and Mac. Need to figure out what goes wrong and fix that. +#if 0 + style::LineSpacing alineSpacing = getProperty(xParaEnum->nextElement(), "ParaLineSpacing"); + CPPUNIT_ASSERT_EQUAL(static_cast(13200), static_cast(alineSpacing.Height)); + xmlDocPtr pXmlDoc = parseExport("word/document.xml"); + if (!pXmlDoc) + return; + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:spacing", "line", "31680"); +#endif +} + +DECLARE_OOXMLEXPORT_TEST(testTextBoxGradientAngle, "fdo65295.docx") +{ + CPPUNIT_ASSERT_EQUAL(8, getShapes()); + + // Angle of frame#1 is 135 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame1(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame1, "FillStyle")); + awt::Gradient aGradient1 = getProperty(xFrame1, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(135 * 10), aGradient1.Angle); + + // Angle of frame#2 is 180 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame2(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame2, "FillStyle")); + awt::Gradient aGradient2 = getProperty(xFrame2, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(180 * 10), aGradient2.Angle); + + // Angle of frame#3 is 90 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame3(getShape(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame3, "FillStyle")); + awt::Gradient aGradient3 = getProperty(xFrame3, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16( 90 * 10), aGradient3.Angle); + + // Angle of frame#4 is 225 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame4(getShape(4), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame4, "FillStyle")); + awt::Gradient aGradient4 = getProperty(xFrame4, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(225 * 10), aGradient4.Angle); + + // Angle of frame#5 is 270 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame5(getShape(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame5, "FillStyle")); + awt::Gradient aGradient5 = getProperty(xFrame5, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(270 * 10), aGradient5.Angle); + + // Angle of frame#6 is 315 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame6(getShape(6), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame6, "FillStyle")); + awt::Gradient aGradient6 = getProperty(xFrame6, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(315 * 10), aGradient6.Angle); + + // Angle of frame#7 is 0 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame7(getShape(7), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame7, "FillStyle")); + awt::Gradient aGradient7 = getProperty(xFrame7, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16( 0 * 10), aGradient7.Angle); + + // Angle of frame#8 is 45 degrees, but 'aGradient.Angle' holds value in 1/10 of a degree + uno::Reference xFrame8(getShape(8), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_GRADIENT, getProperty(xFrame8, "FillStyle")); + awt::Gradient aGradient8 = getProperty(xFrame8, "FillGradient"); + CPPUNIT_ASSERT_EQUAL(sal_Int16( 45 * 10), aGradient8.Angle); +} + +CPPUNIT_TEST_FIXTURE(Test, testCellGridSpan) +{ + loadAndSave("cell-grid-span.docx"); + // The problem was during export gridSpan value for 1st & 2nd cells for test document + // used to get set wrongly to 5 and 65532 respectively which was the reason for crash during save operation + // Verifying gridSpan element is not present in RoundTripped Document (As it's Default value is 1). + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:tcPr/w:gridSpan"_ostr,0); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc[2]/w:tcPr/w:gridSpan"_ostr,0); +} +DECLARE_OOXMLEXPORT_TEST(testFdo71646, "fdo71646.docx") +{ + // The problem was after save file created by MS the direction changed to RTL. + uno::Reference xParaLTRLeft(getParagraph( 1, "LTR LEFT")); + sal_Int32 nLTRLeft = getProperty< sal_Int32 >( xParaLTRLeft, "ParaAdjust" ); + // test the text Direction value for the paragraph + sal_Int16 nLRDir = getProperty< sal_Int32 >( xParaLTRLeft, "WritingMode" ); + + // this will test the both the text direction and alignment for paragraph + CPPUNIT_ASSERT_EQUAL( sal_Int32 (style::ParagraphAdjust_LEFT), nLTRLeft); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::LR_TB, nLRDir); +} + +CPPUNIT_TEST_FIXTURE(Test, testParaAutoSpacing) +{ + loadAndSave("para-auto-spacing.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:spacing"_ostr, "beforeAutospacing"_ostr,"1"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:spacing"_ostr, "afterAutospacing"_ostr,"1"); + + assertXPathNoAttribute(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:spacing"_ostr, + "beforeAutospacing"_ostr); + assertXPathNoAttribute(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:spacing"_ostr, + "afterAutospacing"_ostr); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:spacing"_ostr, "before"_ostr,"400"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:pPr/w:spacing"_ostr, "after"_ostr,"400"); +} + +DECLARE_OOXMLEXPORT_TEST(testGIFImageCrop, "test_GIF_ImageCrop.docx") +{ + uno::Reference image = getShape(1); + uno::Reference imageProperties(image, uno::UNO_QUERY); + css::text::GraphicCrop aGraphicCropStruct; + + imageProperties->getPropertyValue( "GraphicCrop" ) >>= aGraphicCropStruct; + + // The crop is constructed in GraphicProperties::pushToPropMap, where + // GraphicHelper::getOriginalSize tries to get graphic size in mm, then falls back to pixels, + // which are then converted to mm taking screen DPI scaling into account. Thus, the resulting + // values are DPI-dependent. + const double fXScaleFactor = 96.0 / Application::GetDefaultDevice()->GetDPIX(); + const double fYScaleFactor = 96.0 / Application::GetDefaultDevice()->GetDPIY(); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(1085 * fXScaleFactor, aGraphicCropStruct.Left, 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(3651 * fXScaleFactor, aGraphicCropStruct.Right, 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(953 * fYScaleFactor, aGraphicCropStruct.Top, 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1244 * fYScaleFactor, aGraphicCropStruct.Bottom, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testPNGImageCrop, "test_PNG_ImageCrop.docx") +{ + /* The problem was image cropping information was not getting saved + * after roundtrip. + * Check for presence of cropping parameters in exported file. + */ + uno::Reference image = getShape(1); + uno::Reference imageProperties(image, uno::UNO_QUERY); + css::text::GraphicCrop aGraphicCropStruct; + + imageProperties->getPropertyValue( "GraphicCrop" ) >>= aGraphicCropStruct; + + // The crop is constructed in GraphicProperties::pushToPropMap, where + // GraphicHelper::getOriginalSize tries to get graphic size in mm, then falls back to pixels, + // which are then converted to mm taking screen DPI scaling into account. Thus, the resulting + // values are DPI-dependent. + const double fXScaleFactor = 96.0 / Application::GetDefaultDevice()->GetDPIX(); + const double fYScaleFactor = 96.0 / Application::GetDefaultDevice()->GetDPIY(); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(1058 * fXScaleFactor, aGraphicCropStruct.Left, 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1111 * fXScaleFactor, aGraphicCropStruct.Right, 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1164 * fYScaleFactor, aGraphicCropStruct.Top, 1); + CPPUNIT_ASSERT_DOUBLES_EQUAL(635 * fYScaleFactor, aGraphicCropStruct.Bottom, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf41542_imagePadding) +{ + loadAndReload("tdf41542_imagePadding.odt"); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // borderlessImage - image WITHOUT BORDERS : simulate padding with -crop + text::GraphicCrop crop = getProperty(getShape(2), "GraphicCrop"); + CPPUNIT_ASSERT( crop.Left != 0 ); + CPPUNIT_ASSERT( crop.Right != 0 ); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Top); + CPPUNIT_ASSERT_EQUAL( crop.Right, crop.Bottom); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Right); + + // borderedImage - image WITH BORDERS : simulate padding with -crop + crop = getProperty(getShape(3), "GraphicCrop"); + CPPUNIT_ASSERT( crop.Left != 0 ); + CPPUNIT_ASSERT( crop.Right != 0 ); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Top); + CPPUNIT_ASSERT_EQUAL( crop.Right, crop.Bottom); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Right); +} + +CPPUNIT_TEST_FIXTURE(Test, testFootnoteParagraphTag) +{ + loadAndSave("testFootnote.docx"); + /* In footnotes.xml, the paragraph tag inside was getting written into document.xml. + * Check for, paragraph tag is correctly written into footnotes.xml. + */ + xmlDocUniquePtr pXmlFootnotes = parseExport("word/footnotes.xml"); + assertXPath(pXmlFootnotes, "/w:footnotes/w:footnote[3]"_ostr,"id"_ostr,"2"); + assertXPath(pXmlFootnotes, "/w:footnotes/w:footnote[3]/w:p/w:r/w:footnoteRef"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testSpacingLineRule) +{ + loadAndReload("table_lineRule.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:p/w:pPr/w:spacing"_ostr, "lineRule"_ostr, "auto"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableLineSpacing) +{ + loadAndSave("table_atleast.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr/w:tc/w:p/w:pPr/w:spacing"_ostr, "line"_ostr, "320"); +} + +DECLARE_OOXMLEXPORT_TEST(testOoxmlTriangle, "ooxml-triangle.docx") +{ + // The problem was that ooxml-triangle shape type wasn't handled by VML + // export (only isosceles-triangle), leading to a missing shape. + getShape(1); +} + +DECLARE_OOXMLEXPORT_TEST(testMce, "mce.docx") +{ + // The shape is red in Word2007, green in Word2010. Check that our import follows the later. + CPPUNIT_ASSERT_EQUAL(Color(0x9bbb59), getProperty(getShape(1), "FillColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testThemePreservation) +{ + loadAndSave("theme-preservation.docx"); + // check default font theme values have been preserved + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + assertXPath(pXmlStyles, "/w:styles/w:docDefaults/w:rPrDefault/w:rPr/w:rFonts"_ostr, "asciiTheme"_ostr, "minorHAnsi"); + assertXPath(pXmlStyles, "/w:styles/w:docDefaults/w:rPrDefault/w:rPr/w:rFonts"_ostr, "cstheme"_ostr, "minorBidi"); + + // check the font theme values in style definitions + assertXPath(pXmlStyles, "/w:styles/w:style[1]/w:rPr/w:rFonts"_ostr, "eastAsiaTheme"_ostr, "minorEastAsia"); + + // check the color theme values in style definitions + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Custom1']/w:rPr/w:color"_ostr, "themeColor"_ostr, "accent1"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='Custom1']/w:rPr/w:color"_ostr, "themeTint"_ostr, "99"); + + // check direct format font theme values have been preserved + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[5]/w:r[1]/w:rPr/w:rFonts"_ostr, "hAnsiTheme"_ostr, "majorHAnsi"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[5]/w:r[1]/w:rPr/w:rFonts"_ostr, "asciiTheme"_ostr, "majorHAnsi"); + + // check theme font color value has been preserved + assertXPath(pXmlDocument, "/w:document/w:body/w:p[4]/w:r[1]/w:rPr/w:color"_ostr, "themeColor"_ostr, "accent3"); + OUString sThemeShade = getXPath(pXmlDocument, "/w:document/w:body/w:p[4]/w:r[1]/w:rPr/w:color"_ostr, "themeShade"_ostr); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0xbf), sThemeShade.toInt32(16)); + + // check the themeFontLang values in settings file + xmlDocUniquePtr pXmlSettings = parseExport("word/settings.xml"); + assertXPath(pXmlSettings, "/w:settings/w:themeFontLang"_ostr, "val"_ostr, "en-US"); + assertXPath(pXmlSettings, "/w:settings/w:themeFontLang"_ostr, "eastAsia"_ostr, "zh-CN"); + assertXPath(pXmlSettings, "/w:settings/w:themeFontLang"_ostr, "bidi"_ostr, "he-IL"); + + // check fonts have been applied properly + sal_Unicode fontName[2]; //represents the string "宋体" + fontName[0] = 0x5b8b; + fontName[1] = 0x4f53; + CPPUNIT_ASSERT_EQUAL(OUString(fontName, 2), getProperty(getParagraph(1), "CharFontNameAsian")); + CPPUNIT_ASSERT_EQUAL(OUString("Arial"), + getProperty(getParagraph(2), "CharFontNameComplex")); + CPPUNIT_ASSERT_EQUAL(OUString("Trebuchet MS"), + getProperty(getParagraph(3, "Default style theme font"), "CharFontName")); + CPPUNIT_ASSERT_EQUAL(OUString("Arial Black"), + getProperty(getRun(getParagraph(4, "Direct format font"), 1), "CharFontName")); + CPPUNIT_ASSERT_EQUAL(OUString("Trebuchet MS"), + getProperty(getParagraph(5, "Major theme font"), "CharFontName")); + + // check the paragraph background pattern has been preserved including theme colors + assertXPath(pXmlDocument, "/w:document/w:body/w:p[6]/w:pPr/w:shd"_ostr, "val"_ostr, "thinHorzStripe"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[6]/w:pPr/w:shd"_ostr, "themeFill"_ostr, "text2"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[6]/w:pPr/w:shd"_ostr, "themeFillTint"_ostr, "33"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[6]/w:pPr/w:shd"_ostr, "themeColor"_ostr, "accent1"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[6]/w:pPr/w:shd"_ostr, "themeShade"_ostr, "80"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableThemePreservation) +{ + loadAndSave("table-theme-preservation.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // check cell theme colors have been preserved + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:tcPr/w:shd"_ostr, "themeFill"_ostr, "accent6"); + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:tcPr/w:shd"_ostr, + "themeFillShade"_ostr); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[1]/w:tcPr/w:shd"_ostr, "themeFillTint"_ostr, "33"); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:tcPr/w:shd"_ostr, "themeFill"_ostr, "accent6"); + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:tcPr/w:shd"_ostr, + "themeFillShade"_ostr); + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[2]/w:tcPr/w:shd"_ostr, + "themeFillTint"_ostr); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:tcPr/w:shd"_ostr, "themeFill"_ostr, "accent6"); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:tcPr/w:shd"_ostr, "themeFillShade"_ostr, "80"); + assertXPathNoAttribute(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:tcPr/w:shd"_ostr, + "themeFillTint"_ostr); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:tcPr/w:shd"_ostr, "val"_ostr, "horzStripe"); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:tcPr/w:shd"_ostr, "themeColor"_ostr, "accent3"); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:tcPr/w:shd"_ostr, "themeTint"_ostr, "33"); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[2]/w:tc[3]/w:tcPr/w:shd"_ostr, "color"_ostr, "E7EEEE"); + + // check table style has been preserved + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tblPr/w:tblStyle"_ostr, "val"_ostr, "Sombreadoclaro-nfasis1"); + // check table style is not overwritten by other properties + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[2]/w:tcPr/w:tcBorders/*"_ostr, 0); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[3]/w:tcPr/w:tcBorders/*"_ostr, 0); + // check that one cell attribute present in the original document has been preserved + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[1]/w:tcPr/w:tcBorders/*"_ostr, 1); + + // Check that w:cnfStyle row, cell and paragraph property is preserved. + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:trPr/w:cnfStyle"_ostr, "val"_ostr, "100000000000"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:trPr/w:cnfStyle"_ostr, "firstRow"_ostr, "1"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:trPr/w:cnfStyle"_ostr, "lastRow"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:trPr/w:cnfStyle"_ostr, "firstColumn"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:trPr/w:cnfStyle"_ostr, "lastColumn"_ostr, "0"); + + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc/w:tcPr/w:cnfStyle"_ostr, "val"_ostr, "001000000000"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc/w:tcPr/w:cnfStyle"_ostr, "oddVBand"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc/w:tcPr/w:cnfStyle"_ostr, "evenVBand"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc/w:tcPr/w:cnfStyle"_ostr, "oddHBand"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc/w:tcPr/w:cnfStyle"_ostr, "evenHBand"_ostr, "0"); + + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc[2]/w:p/w:pPr/w:cnfStyle"_ostr, "val"_ostr, "100000000000"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc[2]/w:p/w:pPr/w:cnfStyle"_ostr, "firstRowFirstColumn"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc[2]/w:p/w:pPr/w:cnfStyle"_ostr, "firstRowLastColumn"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc[2]/w:p/w:pPr/w:cnfStyle"_ostr, "lastRowFirstColumn"_ostr, "0"); + assertXPath(pXmlDocument, "//w:tbl/w:tr[1]/w:tc[2]/w:p/w:pPr/w:cnfStyle"_ostr, "lastRowLastColumn"_ostr, "0"); + +} + +CPPUNIT_TEST_FIXTURE(Test, testcantSplit) +{ + loadAndSave("2_table_doc.docx"); + // if Split table value is true for a table then during export do not write + // in table row property,As default row prop is allow row to break across page. + // writing during export was causing problem that all the cell data used to come on same page + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tr/w:trPr/w:cantSplit"_ostr,0); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[2]/w:tr/w:trPr/w:cantSplit"_ostr,"val"_ostr,"true"); +} + +CPPUNIT_TEST_FIXTURE(Test, testDontSplitTable) +{ + loadAndReload("tdf101589_dontSplitTable.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + //single row tables need to prevent split by setting row to no split + CPPUNIT_ASSERT_EQUAL( OUString("Row 1"), parseDump("/root/page[2]/body/tab[1]/row[1]/cell[1]/txt[1]"_ostr) ); + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable (xTables->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTable, "Split")); + + uno::Reference xTableRows = xTable->getRows(); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xTableRows->getByIndex(0), "IsSplitAllowed")); +} + +DECLARE_OOXMLEXPORT_TEST(testExtraSectionBreak, "1_page.docx") +{ + // There was a problem for some documents during export.Invalid sectPr getting added + // because of faulty calculation of PageDesc value + // This was the reason for increasing number of pages after RT + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + // tdf126544 Styles were being added before their base/parent/inherited-from style existed, and so were using default settings. + uno::Reference xParaStyles(getStyles("ParagraphStyles")); + uno::Reference xStyle(xParaStyles->getByName("Heading 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( OUString("Heading Base"), xStyle->getParentStyle() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testcolumnbreak) +{ + loadAndSave("columnbreak.docx"); + CPPUNIT_ASSERT_EQUAL(style::BreakType_COLUMN_BEFORE, getProperty(getParagraph(5, "This is first line after col brk."), "BreakType")); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[5]/w:r[1]/w:br"_ostr, "type"_ostr, "column"); +} + +CPPUNIT_TEST_FIXTURE(Test, testGlossary) +{ + loadAndSave("testGlossary.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/glossary/document.xml"); + assertXPath(pXmlDoc, "/w:glossaryDocument"_ostr, "Ignorable"_ostr, "w14 wp14"); +} + +CPPUNIT_TEST_FIXTURE(Test, testGlossaryWithEmail) +{ + // tdf#152289 + loadAndSave("glossaryWithEmail.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/glossary/_rels/document.xml.rels"); + assertXPath(pXmlDoc, "/rels:Relationships/rels:Relationship[@Id='rId4' " + "and @Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink' " + "and @Target='mailto:emailgoeshere@example.com' " + "and @TargetMode='External']"_ostr); + + // preserve the ShowingPlaceholder setting on both block SDTs. + pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:showingPlcHdr"_ostr, 1); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:hyperlink/w:sdt/w:sdtPr/w:showingPlcHdr"_ostr, 1); +} + +DECLARE_OOXMLEXPORT_TEST(testFdo71785, "fdo71785.docx") +{ + // crashtest +} + +CPPUNIT_TEST_FIXTURE(Test, testCrashWhileSave) +{ + loadAndSave("testCrashWhileSave.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/footer1.xml"); + CPPUNIT_ASSERT(getXPath(pXmlDoc, "/w:ftr/w:tbl/w:tr/w:tc[1]/w:p[1]/w:pPr/w:pStyle"_ostr, "val"_ostr).match("Normal")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFileOpenInputOutputError) +{ + loadAndReload("floatingtbl_with_formula.docx"); + // Docx containing Floating table with formula was giving "General input/output error" while opening in LibreOffice + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pStyle"_ostr, "val"_ostr, "Normal"); + + // let's also assert that the formula was exported properly + assertXPathContent(pXmlDoc, "//w:tbl/w:tr/w:tc[2]/w:p/m:oMathPara/m:oMath/m:sSubSup/m:e/m:r/m:t"_ostr, u"\u03C3"_ustr); +} + +CPPUNIT_TEST_FIXTURE(Test, testSingleCellTableBorders) +{ + loadAndSave("tdf124399_SingleCellTableBorders.docx"); + // tdf#124399: Extra borders on single cell tables fixed. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tcPr/w:tcBorders/w:top [@w:val = 'nil']"_ostr, 1); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr/w:tc/w:tcPr/w:tcBorders/w:bottom [@w:val = 'nil']"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testInsideBorders) +{ + loadAndSave("tdf129242_InsideBorders.docx"); + // tdf#129242: Don't remove inside borders if the table has more than one cells. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // If this is not 0, then inside borders are removed. + assertXPathChildren(pXmlDocument, "/w:document/w:body/w:tbl/w:tr/w:tc[2]/w:tcPr/w:tcBorders"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testRightBorder) +{ + loadAndSave("tdf129442_RightBorder.docx"); + // tdf#129442: Right border of a one column table was missing. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // If the right border is missing like in the bug, then there is a tag in tcBorders. + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[1]/w:tc/w:tcPr/w:tcBorders/w:end [@w:val = 'nil']"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testBottomBorder) +{ + loadAndSave("tdf129450_BottomBorder.docx"); + // tdf#129450: Missing bottom border in one row table. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // If there is no bottom border, it is shown in tcBorders. + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr/w:tc[1]/w:tcPr/w:tcBorders/w:bottom [@w:val = 'nil']"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testBottomBorders) +{ + loadAndSave("tdf129452_BottomBorders.docx"); + // tdf#129452: Do not omit bottom borders when a column in a table is vertically merged and + // the inside borders are turned off. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[1]/w:tcPr/w:tcBorders/w:bottom [@w:val = 'nil']"_ostr, 0); + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[4]/w:tc[2]/w:tcPr/w:tcBorders/w:bottom [@w:val = 'nil']"_ostr, 0); + + // But also don't treat separately merged cells as one - the topmost merged cell shouldn't gain a border. + assertXPath(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[1]/w:tc[4]/w:tcPr/w:tcBorders/w:bottom"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testFontTypes) +{ + loadAndSave("tdf120344_FontTypes.docx"); + // tdf#120344: Font type of numbering symbols can be different than the font type of the text. + + // Check the font type of the text, should be Consolas. + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p[1]/w:r/w:rPr/w:rFonts [@w:ascii='Consolas']"_ostr, 1); + + // Now the font type of the numbering symbols, should be Arial Black. + xmlDocUniquePtr qXmlDocument = parseExport("word/numbering.xml"); + assertXPath(qXmlDocument, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:rPr/w:rFonts [@w:ascii='Arial Black']"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testNumberingLevels) +{ + loadAndSave("tdf95495.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // tdf#95495: set list level of the custom style based on the setting of the parent style + // [this assertXPath is not a very good test, since the numbering definition is not set on the paragraph itself, + // but in a style. This just tests the current copy-to-paragraph implementation. But leaving it for now, + // since this example is very much a corner case, so anyone trespassing here should double-check everything...] + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:pPr/w:numPr/w:ilvl [@w:val = '1']"_ostr, 1); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Note: _Toc and _Ref hidden bookmarks are imported from OOXML as normal bookmarks. + // Without hiding them from visible bookmarks (SwBookmarkPortion), this line would be + // shown as "A.2.1 [[[[[.DESCRIPTION]]]] with XML layout dump "A.2.1 #_Ref... Bookmark Start..." + assertXPath(pXmlDoc, "//body/txt[5]/SwParaPortion/SwLineLayout/child::*[1]"_ostr, "expand"_ostr, "A.2.1 "); + assertXPath(pXmlDoc, "//body/txt[5]/SwParaPortion/SwLineLayout/child::*[2]"_ostr, "portion"_ostr, ".DESCRIPTION"); +} + +CPPUNIT_TEST_FIXTURE(Test, testVerticalBorders) +{ + loadAndSave("calendar3.docx"); + // tdf#130799: Inside vertical borders of a table should not be missing. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + // Left and right borders. + assertXPathChildren(pXmlDocument, "/w:document/w:body/w:tbl/w:tr[3]/w:tc[3]/w:tcPr/w:tcBorders"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(Test, testArrowFlipXY) +{ + loadAndSave("tdf100751_arrowBothFlip.docx"); + // tdf#100751: Both x and y flip should happen. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + OUString arrowStyle = getXPath(pXmlDocument, + "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Fallback/" + "w:pict/v:group/v:shape[@type='_x0000_t32']"_ostr, + "style"_ostr); + CPPUNIT_ASSERT(arrowStyle.indexOf(u"flip:xy") != sal_Int32(-1)); +} + +CPPUNIT_TEST_FIXTURE(Test, testArrowPosition) +{ + loadAndSave("tdf104565_ArrowPosition.docx"); + // tdf#104565: Test correct position. + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + // This is the correct Y coordinate, the incorrect was 817880. + assertXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/wp:positionV/wp:posOffset"_ostr, "516255"); +} + +CPPUNIT_TEST_FIXTURE(Test, testArrowMarker) +{ + loadAndSave("tdf123346_ArrowMarker.docx"); + // tdf#123346: Check arrow marker. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln/a:tailEnd"_ostr, "type"_ostr, "arrow"); +} + +CPPUNIT_TEST_FIXTURE(Test, testShapeLineWidth) +{ + loadAndSave("tdf92526_ShapeLineWidth.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // tdf#92526: Make sure that line with stays 0. + xmlDocUniquePtr pXml = parseExport("word/document.xml"); + + // "w" attribute was not exported. + assertXPath(pXml, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing" + "/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln"_ostr, "w"_ostr, "0"); +} + +CPPUNIT_TEST_FIXTURE(Test, testRelativeAnchorWidthFromLeftMargin) +{ + loadAndSave("tdf132976_testRelativeAnchorWidthFromLeftMargin.docx"); + // tdf#132976 The size of the width of this shape should come from the size of the left margin. + // It was set to the size of the width of the entire page before. + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//anchored/SwAnchoredDrawObject/bounds"_ostr, "width"_ostr, "1133"); +} + +CPPUNIT_TEST_FIXTURE(Test, testRelativeAnchorWidthFromInsideOutsideMargin) +{ + loadAndSave("tdf133861_RelativeAnchorWidthFromInsideOutsideMargin.docx"); + // tdf#133863 tdf#133864 The sizes of the width of these shapes depend on the sizes of the inside and outside margins. + // The open book: outside --text-- inside | inside --text-- outside + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Inside + assertXPath(pXmlDoc, "(//anchored/SwAnchoredDrawObject)[1]/bounds"_ostr, "width"_ostr, "1440"); + // Outside + assertXPath(pXmlDoc, "(//anchored/SwAnchoredDrawObject)[2]/bounds"_ostr, "width"_ostr, "2552"); + // Outside + assertXPath(pXmlDoc, "(//anchored/SwAnchoredDrawObject)[3]/bounds"_ostr, "width"_ostr, "2552"); + // Inside + assertXPath(pXmlDoc, "(//anchored/SwAnchoredDrawObject)[4]/bounds"_ostr, "width"_ostr, "1440"); +} + +CPPUNIT_TEST_FIXTURE(Test, testBodyPrUpright) +{ + loadAndSave("tdf123610_handle_upright.docx"); + // tdf#123610: Check grab-bag attribute upright to keep text upright regardless of shape rotation. + + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/a:graphic/a:graphicData/wps:wsp/wps:bodyPr"_ostr, "upright"_ostr, "1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testLostArrow) +{ + loadAndReload("tdf99810-lost-arrow.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // tdf#99810: check whether we use normal shape instead of connector shape if the XML namespace + // is wps, because wps: + xmlDocUniquePtr pDoc = parseExport("word/document.xml"); + + assertXPath(pDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor" + "/a:graphic/a:graphicData/wps:wsp"_ostr); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx new file mode 100644 index 0000000000..f1c4fc5f54 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx @@ -0,0 +1,1313 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ooxmlexport/data/", "Office Open XML Text") {} + +protected: + void verifyComboBoxExport(bool aComboBoxAsDropDown); +}; + +DECLARE_OOXMLEXPORT_TEST(testRelorientation, "relorientation.docx") +{ + uno::Reference xShape = getShape(1); + // This was text::RelOrientation::FRAME, when handling relativeFrom=page, align=right + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, "HoriOrientRelation")); + + uno::Reference xGroup(xShape, uno::UNO_QUERY); + // This resulted in lang::IndexOutOfBoundsException, as nested groupshapes weren't handled. + uno::Reference xShapeDescriptor(xGroup->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GroupShape"), xShapeDescriptor->getShapeType()); + + // 'actual child size' = 'group ext' * 'child ext' / 'chExt from group', see section 'chExt' in + // [MS-OI29500]. Here for width from file 3108960 * 4896 / 4911 = 3099464 EMU. That corresponds to + // width 8.61cm and 325px in UI in Word and rounds down to 8609 Hmm. Considering scaling of the + // parent group to the anchor extent (* 3118485 / 3108960) we get a display width of 3108960 EMU + // = 8636Hmm. FIXME: Expected value is as in LO 7.2. Reason for difference is yet unknown. + if (isExported()) + { + uno::Reference xYear(xGroup->getByIndex(1), uno::UNO_QUERY); + // This was 2, due to incorrect handling of parent transformations inside DML groupshapes. + CPPUNIT_ASSERT_EQUAL(sal_Int32(8662), xYear->getSize().Width); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testBezier) +{ + loadAndReload("bezier.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Check that no shape got lost: a bezier, a line and a text shape. + CPPUNIT_ASSERT_EQUAL(3, getShapes()); +} + +DECLARE_OOXMLEXPORT_TEST(testGroupshapeTextbox, "groupshape-textbox.docx") +{ + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xShape(xGroup->getByIndex(0), uno::UNO_QUERY); + // The VML export lost text on textboxes inside groupshapes. + // The DML export does not, make sure it stays that way. + CPPUNIT_ASSERT_EQUAL(OUString("first"), xShape->getString()); + // This was 16, i.e. inheriting doc default char height didn't work. + CPPUNIT_ASSERT_EQUAL(11.f, getProperty(getParagraphOfText(1, xShape->getText()), "CharHeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testGroupshapePicture, "groupshape-picture.docx") +{ + // Picture in the groupshape got lost, groupshape had only one child. + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + uno::Reference xShapeDescriptor(xGroup->getByIndex(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.GraphicObjectShape"), xShapeDescriptor->getShapeType()); +} + +DECLARE_OOXMLEXPORT_TEST(testAutofit, "autofit.docx") +{ + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(1), "TextAutoGrowHeight")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(getShape(2), "TextAutoGrowHeight")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesDeletedParagraphMark) +{ + loadAndSave("testTrackChangesDeletedParagraphMark.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:del"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesInsertedParagraphMark) +{ + loadAndSave("testTrackChangesInsertedParagraphMark.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:ins"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesDeletedTableRow) +{ + loadAndSave("testTrackChangesDeletedTableRow.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:trPr/w:del"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesInsertedTableRow) +{ + loadAndSave("testTrackChangesInsertedTableRow.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[2]/w:trPr/w:ins"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesDeletedTableCell) +{ + loadAndSave("testTrackChangesDeletedTableCell.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc/w:tcPr/w:cellDel"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesInsertedTableCell) +{ + loadAndSave("testTrackChangesInsertedTableCell.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tr[3]/w:tc/w:tcPr/w:cellIns"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testTextBoxPictureFill, "textbox_picturefill.docx") +{ + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_BITMAP, getProperty(xFrame, "FillStyle")); + auto xBitmap = getProperty>(xFrame, "FillBitmap"); + CPPUNIT_ASSERT(xBitmap.is()); + uno::Reference xGraphic(xBitmap, uno::UNO_QUERY); + CPPUNIT_ASSERT(xGraphic.is()); + Graphic aGraphic(xGraphic); + CPPUNIT_ASSERT(!aGraphic.IsNone()); + CPPUNIT_ASSERT(aGraphic.GetSizeBytes() > 0L); + CPPUNIT_ASSERT_EQUAL(tools::Long(447), aGraphic.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL(tools::Long(528), aGraphic.GetSizePixel().Height()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFDO73034) +{ + loadAndSave("FDO73034.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT(getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:rPr/w:u"_ostr, "val"_ostr).match("single")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFDO71834) +{ + loadAndSave("fdo71834.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl[1]/w:tr[2]/w:tc[1]/w:tcPr[1]/w:tcW[1]"_ostr,"type"_ostr, "dxa"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTrackChangesParagraphProperties) +{ + loadAndSave("testTrackChangesParagraphProperties.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathChildren(pXmlDoc, "/w:document/w:body/w:p[1]/w:pPr/w:pPrChange"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testMsoSpt180) +{ + loadAndReload("mso-spt180.docx"); + uno::Reference xGroup(getShape(1), uno::UNO_QUERY); + const uno::Sequence aProps = getProperty< uno::Sequence >(xGroup->getByIndex(0), "CustomShapeGeometry"); + OUString aType; + for (beans::PropertyValue const & prop : aProps) + if (prop.Name == "Type") + aType = prop.Value.get(); + // This was exported as borderCallout90, which is an invalid drawingML preset shape string. + CPPUNIT_ASSERT_EQUAL(OUString("ooxml-borderCallout1"), aType); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo73550) +{ + loadAndSave("fdo73550.docx"); + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + // This was wrap="none". + assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:pPr/w:rPr/w:rFonts"_ostr); +} + +DECLARE_OOXMLEXPORT_TEST(testPageRelSize, "pagerelsize.docx") +{ + // First shape: width is relative from page, but not height. + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, "RelativeWidthRelation")); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xShape, "RelativeHeightRelation")); + + // Second shape: height is relative from page, but not height. + xShape = getShape(2); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xShape, "RelativeHeightRelation")); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(xShape, "RelativeWidthRelation")); +} + +DECLARE_OOXMLEXPORT_TEST(testRelSizeRound, "rel-size-round.docx") +{ + // This was 9: 9.8 was imported as 9 instead of being rounded to 10. + CPPUNIT_ASSERT_EQUAL(sal_Int16(10), getProperty(getShape(1), "RelativeHeight")); +} + +DECLARE_OOXMLEXPORT_TEST(testTestTitlePage, "testTitlePage.docx") +{ + // this has 2 pages in Word + CPPUNIT_ASSERT_EQUAL(OUString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), parseDump("/root/page[2]/footer/txt/text()"_ostr)); +} + +DECLARE_OOXMLEXPORT_TEST(testTableRowDataDisplayedTwice, "table-row-data-displayed-twice.docx") +{ + // fdo#73534: There was a problem for some documents during export.Invalid sectPr getting added + // because of wrong condition in code. + // This was the reason for increasing number of pages after RT + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo73556) +{ + loadAndSave("fdo73556.docx"); + /* + * The file contains a table with 3 columns + * the gridcols are as follows: {1210, 1331, 1210} + * whereas the individual cells have {1210, 400, 1210} + * The table column separators were taken from the Grid, while + * the table width was calculated as 2820 from cells instead + * of 3751 from the Grid. + */ + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblGrid/w:gridCol"_ostr, 3); + sal_Int32 tableWidth = 0; + tableWidth += getXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblGrid/w:gridCol[1]"_ostr, "w"_ostr).toInt32(); + tableWidth += getXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblGrid/w:gridCol[2]"_ostr, "w"_ostr).toInt32(); + tableWidth += getXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblGrid/w:gridCol[3]"_ostr, "w"_ostr).toInt32(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3751), tableWidth); +} + +CPPUNIT_TEST_FIXTURE(Test, testSegFaultWhileSave) +{ + loadAndSave("test_segfault_while_save.docx"); + // fdo#74499 + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + CPPUNIT_ASSERT_EQUAL(static_cast(6137), getXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblGrid/w:gridCol[2]"_ostr, "w"_ostr).toInt32()); +} + +CPPUNIT_TEST_FIXTURE(Test, fdo69656) +{ + loadAndSave("Table_cell_auto_width_fdo69656.docx"); + // Changed the UT to check "dxa" instead of "auto" + // For this particular issue file few cells have width type "auto" + // LO supports VARIABLE and FIXED width type. + // If type is VARIABLE LO calculates width as percent of PageSize + // Else if the width is fixed it uses the width value. + // After changes for fdo76741 the fixed width is exported as "dxa" for DOCX + + // Check for the width type of table and its cells. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:tbl/w:tblPr/w:tblW"_ostr,"type"_ostr,"dxa"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo76741) +{ + loadAndSave("fdo76741.docx"); + + // There are two issue related to table in the saved(exported) file + // - the table alignment in saved file is "left" instead of "center" + // - the table width type in properties is "auto" instead of "dxa" + + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPath(pXmlDoc, "//w:jc"_ostr, "val"_ostr, "center"); + assertXPath(pXmlDoc, "//w:tblW"_ostr, "w"_ostr, "10081"); + assertXPath(pXmlDoc, "//w:tblW"_ostr, "type"_ostr, "dxa"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo73541) +{ + loadAndSave("fdo73541.docx"); + // fdo#73541: The mirrored margins were not imported and mapped correctly in Page Layout + // Hence tag was not exported back in settings.xml + xmlDocUniquePtr pXmlDoc = parseExport("word/settings.xml"); + assertXPath(pXmlDoc, "/w:settings/w:mirrorMargins"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo106029) +{ + loadAndSave("fdo106029.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/settings.xml"); + assertXPath(pXmlDoc, "/w:settings/w:compat/w:doNotExpandShiftReturn"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf146515) +{ + loadAndSave("tdf146515.odt"); + xmlDocUniquePtr pXmlDoc = parseExport("word/settings.xml"); + assertXPath(pXmlDoc, "/w:settings/w:compat/w:usePrinterMetrics"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testFDO74106) +{ + loadAndSave("FDO74106.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + assertXPath(pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:numFmt"_ostr, "val"_ostr,"hebrew1"); +} + +CPPUNIT_TEST_FIXTURE(Test, testFDO74215) +{ + loadAndSave("FDO74215.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + // tdf#106849 NumPicBullet xShape should not be resized. + + // This is dependent on the running system: see MSWordExportBase::BulletDefinitions + // FIXME: the size of a bullet is defined by GraphicSize property + // (stored in SvxNumberFormat::aGraphicSize) so use that for the size + // (properly convert from 100mm to pt (1 inch is 72 pt, 1 pt is 20 twips). + + // On 96 DPI "width:11.25pt;height:11.25pt"; on 120 DPI "width:9pt;height:9pt" + const OUString sStyle + = getXPath(pXmlDoc, "/w:numbering/w:numPicBullet[2]/w:pict/v:shape"_ostr, "style"_ostr); + { + OUString sWidth = sStyle.getToken(0, ';'); + CPPUNIT_ASSERT(sWidth.startsWith("width:", &sWidth)); + CPPUNIT_ASSERT(sWidth.endsWith("pt", &sWidth)); + const double fWidth = sWidth.toDouble(); + const double fXScaleFactor = 96.0 / Application::GetDefaultDevice()->GetDPIX(); + // note: used to fail on Mac with 14.7945205479452 vs. 14.8 + // note: used to fail on another Mac with 12.1348314606742 vs 12.15 + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25 * fXScaleFactor, fWidth, 0.1); + } + { + OUString sHeight = sStyle.getToken(1, ';'); + CPPUNIT_ASSERT(sHeight.startsWith("height:", &sHeight)); + CPPUNIT_ASSERT(sHeight.endsWith("pt", &sHeight)); + const double fHeight = sHeight.toDouble(); + const double fYScaleFactor = 96.0 / Application::GetDefaultDevice()->GetDPIY(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(11.25 * fYScaleFactor, fHeight, 0.1); + } +} + +DECLARE_OOXMLEXPORT_TEST(testColumnBreak_ColumnCountIsZero,"fdo74153.docx") +{ + /* fdo73545: Column Break with Column_count = 0 was not getting preserved. + * The was missing after roundtrip + */ + if (isExported()) + { + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[1]/w:br"_ostr,"type"_ostr,"column"); + } + + //tdf76349 match Word's behavior of treating breaks in single columns as page breaks. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_OOXMLEXPORT_TEST(testTdf90697_complexBreaksHeaders,"tdf90697_complexBreaksHeaders.docx") +{ +// This is a complex document using many types of section breaks and re-defined headers. +// Paragraphs 44-47 were in two columns + uno::Reference xTextSection = getProperty< uno::Reference >(getParagraph(45), "TextSection"); + CPPUNIT_ASSERT(xTextSection.is()); + uno::Reference xTextColumns = getProperty< uno::Reference >(xTextSection, "TextColumns"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), xTextColumns->getColumnCount()); + +// after that, the section break should switch things back to one column. + xTextSection = getProperty< uno::Reference >(getParagraph(50), "TextSection"); + CPPUNIT_ASSERT(xTextSection.is()); + xTextColumns = getProperty< uno::Reference >(xTextSection, "TextColumns"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), xTextColumns->getColumnCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testIndentation) +{ + loadAndSave("test_indentation.docx"); + // fdo#74141 :There was a problem that in style.xml and document.xml in tag "right" & "left" margin + // attributes gets added(w:right=0 & w:left=0) if these attributes are not set in original document. + // This test is to verify does not contain w:right attribute. + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPathNoAttribute(pXmlDoc, "/w:document/w:body/w:p/w:pPr/w:ind"_ostr, "end"_ostr); +} + +CPPUNIT_TEST_FIXTURE(Test, testChartInFooter) +{ + loadAndSave("chart-in-footer.docx"); + // fdo#73872: document contains chart in footer. + // The problem was that footer1.xml.rels files for footer1.xml + // files were missing from docx file after roundtrip. + xmlDocUniquePtr pXmlDoc = parseExport("word/_rels/footer2.xml.rels"); + + // Check footer2.xml.rels contains in doc after roundtrip. + // Check Id = rId1 in footer2.xml.rels + assertXPath(pXmlDoc,"/rels:Relationships/rels:Relationship"_ostr,"Id"_ostr,"rId1"); + assertXPath(pXmlDoc, + "/rels:Relationships/rels:Relationship[@Id='rId1']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart"); + + xmlDocUniquePtr pXmlDocCT = parseExport("[Content_Types].xml"); + assertXPath(pXmlDocCT, + "/ContentType:Types/ContentType:Override[@PartName='/word/charts/chart1.xml']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.drawingml.chart+xml"); + + // check the content too + xmlDocUniquePtr pXmlDocFooter2 = parseExport("word/footer2.xml"); + assertXPath(pXmlDocFooter2, + "/w:ftr/w:p[1]/w:r/w:drawing/wp:inline/a:graphic/a:graphicData"_ostr, + "uri"_ostr, + "http://schemas.openxmlformats.org/drawingml/2006/chart"); + assertXPath(pXmlDocFooter2, + "/w:ftr/w:p[1]/w:r/w:drawing/wp:inline/a:graphic/a:graphicData/c:chart"_ostr, + "id"_ostr, + "rId1"); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(Test, testNestedTextFrames) +{ + loadAndReload("nested-text-frames.odt"); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // First problem was LO crashed during export (crash test) + + // Second problem was LO made file corruption, writing out nested text boxes, which can't be handled by Word. + // Test that all three exported text boxes are anchored to the same paragraph and not each other. + uno::Reference xTextContent(getShape(1), uno::UNO_QUERY); + uno::Reference xRange = xTextContent->getAnchor(); + uno::Reference xText = xRange->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("Anchor point"), xText->getString()); + + xTextContent.set(getShape(2), uno::UNO_QUERY); + xRange = xTextContent->getAnchor(); + xText = xRange->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("Anchor point"), xText->getString()); + + xTextContent.set(getShape(3), uno::UNO_QUERY); + xRange = xTextContent->getAnchor(); + xText = xRange->getText(); + CPPUNIT_ASSERT_EQUAL(OUString("Anchor point"), xText->getString()); +} + +DECLARE_OOXMLEXPORT_TEST(testFloatingTablePosition, "floating-table-position.docx") +{ + // Position of shape was wrong, because some conversion was missing. + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + // This was 3295. + CPPUNIT_ASSERT_EQUAL(sal_Int32(5964), getProperty(xShape, "HoriOrientPosition")); + // This was 4611. + CPPUNIT_ASSERT_EQUAL(sal_Int32(8133), getProperty(xShape, "VertOrientPosition")); +} + +CPPUNIT_TEST_FIXTURE(Test, testAbi11739) +{ + loadAndSave("abi11739.docx"); + // Validation test: order of elements were wrong. + xmlDocUniquePtr pXmlDoc = parseExport("word/styles.xml"); + // Order was: uiPriority, link, basedOn. + CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[3]"_ostr, "basedOn") < getXPathPosition(pXmlDoc, "/w:styles/w:style[3]"_ostr, "link")); + CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[3]"_ostr, "link") < getXPathPosition(pXmlDoc, "/w:styles/w:style[3]"_ostr, "uiPriority")); + // Order was: qFormat, unhideWhenUsed. + CPPUNIT_ASSERT(getXPathPosition(pXmlDoc, "/w:styles/w:style[11]"_ostr, "unhideWhenUsed") < getXPathPosition(pXmlDoc, "/w:styles/w:style[11]"_ostr, "qFormat")); +} + +DECLARE_OOXMLEXPORT_TEST(testEmbeddedXlsx, "embedded-xlsx.docx") +{ + // check there are two objects and they are FrameShapes + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(OUString("FrameShape"), getShape(1)->getShapeType()); + CPPUNIT_ASSERT_EQUAL(OUString("FrameShape"), getShape(2)->getShapeType()); + + // check the objects are present in the exported document.xml + if (!isExported()) + return; + xmlDocUniquePtr pXmlDocument = parseExport("word/document.xml"); + assertXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/w:object"_ostr, 2); + + // finally check the embedded files are present in the zipped document + uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); + const uno::Sequence names = xNameAccess->getElementNames(); + int nSheetFiles = 0; + int nImageFiles = 0; + for (OUString const & n : names) + { + if(n.startsWith("word/embeddings/oleObject")) + nSheetFiles++; + if(n.startsWith("word/media/image")) + nImageFiles++; + } + CPPUNIT_ASSERT_EQUAL(2, nSheetFiles); + CPPUNIT_ASSERT_EQUAL(2, nImageFiles); +} + +CPPUNIT_TEST_FIXTURE(Test, testNumberedLists_StartingWithZero) +{ + loadAndSave("FDO74105.docx"); + /* Issue : Numbered lists Starting with value '0' is not preserved after RT. + * In numbering.xml, an XML tag is optional. If not mentioned, + * the Numbered list should start from 0. + * Problem was LO was writing for all levels 0-8 with default value "1". + */ + xmlDocUniquePtr pXmlDoc = parseExport("word/numbering.xml"); + + // Check that we do _not_ export w:start for . + assertXPath(pXmlDoc, "w:numbering/w:abstractNum[1]/w:lvl[1]/w:start"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testPageBreak) +{ + loadAndReload("fdo74566.docx"); + /* Break to next page was written into wrong paragraph as . + * LO was not preserving Page Break as . + * Now after fix , LO writes Page Break as the new paragraph and also + * preserves the xml tag . + */ + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + uno::Reference xParagraph2 = getParagraph(2); + uno::Reference xParagraph4 = getParagraph(4); + + getRun(xParagraph2, 1, "First Page Second Line"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[3]/w:r[2]/w:br"_ostr,"type"_ostr,"page"); + getRun(xParagraph4, 1, "Second Page First line after Page Break"); +} + +CPPUNIT_TEST_FIXTURE(Test, testOleObject) +{ + loadAndSave("test_ole_object.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + + assertXPathNoAttribute(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/w:object/v:shape/v:imagedata"_ostr, + "o:title"_ostr); + assertXPath(pXmlDoc, + "/w:document/w:body/w:p[2]/w:r/w:object/o:OLEObject"_ostr, + "DrawAspect"_ostr, + "Content"); + // TODO: ProgID="Package" - what is this? Zip with 10k extra header? + + // check the rels too + xmlDocUniquePtr pXmlDocRels = parseExport("word/_rels/document.xml.rels"); + assertXPath(pXmlDocRels, + "/rels:Relationships/rels:Relationship[@Target='embeddings/oleObject1.bin']"_ostr, + "Type"_ostr, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"); + // check the media type too + xmlDocUniquePtr pXmlDocCT = parseExport("[Content_Types].xml"); + assertXPath(pXmlDocCT, + "/ContentType:Types/ContentType:Override[@PartName='/word/embeddings/oleObject1.bin']"_ostr, + "ContentType"_ostr, + "application/vnd.openxmlformats-officedocument.oleObject"); + +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo74792) +{ + loadAndSave("fdo74792.docx"); + /* + * fdo#74792 : The images associated with smart-art data[i].xml + * were not preserved on exporting to DOCX format + * Added support to grabbag the rels, with associated images. + */ + xmlDocUniquePtr pXmlDoc = parseExport("word/diagrams/_rels/data1.xml.rels"); + assertXPath(pXmlDoc,"/rels:Relationships/rels:Relationship"_ostr, 4); + uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL( + comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); + + //check that images are also saved + uno::Reference xInputStream(xNameAccess->getByName( "word/media/OOXDiagramDataRels1_0.jpeg" /*added anchor id to form a unique name*/ ), uno::UNO_QUERY); + CPPUNIT_ASSERT( xInputStream.is() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo77718) +{ + loadAndSave("fdo77718.docx"); + //in case of multiple smart arts the names for images were getting + //repeated and thereby causing a data loss as the binary stream was + //getting over written. This test case ensures that unique names are + //given for images in different smart arts. + xmlDocUniquePtr pXmlDataRels1 = parseExport("word/diagrams/_rels/data1.xml.rels"); + xmlDocUniquePtr pXmlDataRels2 = parseExport("word/diagrams/_rels/data2.xml.rels"); + + //ensure that the rels file is present. + assertXPath(pXmlDataRels1,"/rels:Relationships/rels:Relationship"_ostr, 4); + assertXPath(pXmlDataRels2,"/rels:Relationships/rels:Relationship"_ostr, 4); + + uno::Reference xNameAccess = packages::zip::ZipFileAccess::createWithURL( + comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); + + //check that images are also saved + uno::Reference xInputStream1(xNameAccess->getByName( "word/media/OOXDiagramDataRels1_0.jpeg" /*added anchor id to form a unique name*/ ), uno::UNO_QUERY); + CPPUNIT_ASSERT( xInputStream1.is() ); + + //check that images are saved for other smart-arts as well. + uno::Reference xInputStream2(xNameAccess->getByName( "word/media/OOXDiagramDataRels2_0.jpeg" /*added anchor id to form a unique name*/ ), uno::UNO_QUERY); + CPPUNIT_ASSERT( xInputStream2.is() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableCurruption) +{ + loadAndSave("tableCurrupt.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/header2.xml"); + CPPUNIT_ASSERT(pXmlDoc) ; + assertXPath(pXmlDoc, "/w:hdr/w:tbl[1]/w:tr[1]/w:tc[1]"_ostr,1); + + // tdf#116549: header paragraph should not have a bottom border. + uno::Reference xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xStyle.is()); + uno::Reference xHeaderText = getProperty>(xStyle, "HeaderTextFirst"); + CPPUNIT_ASSERT(xHeaderText.is()); + auto xParagraph = getParagraphOfText(1, xHeaderText); + CPPUNIT_ASSERT(xParagraph.is()); + table::BorderLine2 aHeaderBottomBorder = getProperty(xParagraph, "BottomBorder"); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), aHeaderBottomBorder.LineWidth); +} + +CPPUNIT_TEST_FIXTURE(Test, testDateControl) +{ + loadAndSave("date-control.docx"); + // check XML + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date"_ostr, "fullDate"_ostr, "2014-03-05T00:00:00Z"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:dateFormat"_ostr, "val"_ostr, "dddd, dd' de 'MMMM' de 'yyyy"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtPr/w:date/w:lid"_ostr, "val"_ostr, "es-ES"); + assertXPathContent(pXmlDoc, "/w:document/w:body/w:p/w:sdt/w:sdtContent/w:r/w:t"_ostr, u"mi\u00E9rcoles, 05 de marzo de 2014"_ustr); +} + +CPPUNIT_TEST_FIXTURE(Test, test_Tdf115030) +{ + loadAndSave("tdf115030.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + sal_Unicode aDot = {0x02D9}; + sal_Unicode aDobleDot = {0x00A8}; + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/m:oMath[1]/m:acc/m:accPr/m:chr"_ostr, "val"_ostr, OUString(aDot)); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/m:oMath[2]/m:acc/m:accPr/m:chr"_ostr, "val"_ostr, OUString(aDobleDot)); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/m:oMathPara/m:oMath[1]/m:acc/m:accPr/m:chr"_ostr, "val"_ostr, OUString(aDot)); +} + +CPPUNIT_TEST_FIXTURE(Test, test_OpeningBrace) +{ + loadAndSave("2120112713_OpenBrace.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + // Checking for OpeningBrace tag + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/m:oMath[1]/m:d[1]/m:dPr[1]/m:begChr[1]"_ostr,"val"_ostr,""); +} + +CPPUNIT_TEST_FIXTURE(Test, test_Tdf132305) +{ + loadAndSave("tdf132305.docx"); + xmlDocUniquePtr pXmlDoc = parseExport("word/document.xml"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/m:oMath[1]/m:bar/m:barPr/m:pos"_ostr,"val"_ostr,"top"); +} + +// Checks that all runs of the field have text properties. +// Old behaviour: only first run has text properties of the field +// +// There are several runs are used in fields: +// +// +// " + emulateTyping(*pTextDoc, u" -->"); + OUString sReplaced2(sReplaced + u" -->"); + // This was "–>" instead of "-->" + CPPUNIT_ASSERT_EQUAL(sReplaced2, getParagraph(1)->getString()); + emulateTyping(*pTextDoc, u" "); + sReplaced += u" → "; + // This was "–>" instead of "→" + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + // tdf#83037 + emulateTyping(*pTextDoc, u"-> "); + sReplaced += u"→ "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + emulateTyping(*pTextDoc, u"<- "); + sReplaced += u"← "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + emulateTyping(*pTextDoc, u"<-- "); + sReplaced += u"← "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + emulateTyping(*pTextDoc, u"<--> "); + sReplaced += u"↔ "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf133524_Romanian) +{ + createSwDoc("tdf133524_ro.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + // 1. Testing autocorrect of " to << and >> inside „...” + // Example: „Sentence and «word».” + // opening primary level quote + emulateTyping(*pTextDoc, u"\""); + OUString sReplaced(u"„"_ustr); + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // opening second level quote + emulateTyping(*pTextDoc, u"Sentence and \""); + sReplaced += u"Sentence and «"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // closing second level quote + emulateTyping(*pTextDoc, u"word\""); + sReplaced += u"word»"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // closing primary level quote + emulateTyping(*pTextDoc, u".\""); + sReplaced += u".”"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // 2. Testing recognition of closing double quotation mark ” + emulateTyping(*pTextDoc, u" \""); + sReplaced += u" „"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // 3. Testing recognition of alternative closing double quotation mark “ + emulateTyping(*pTextDoc, u"Alternative.“ \""); + sReplaced += u"Alternative.“ „"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf128860) +{ + createSwDoc("tdf128860.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + // Second level ending quote: ‚word' -> ,word‘ + emulateTyping(*pTextDoc, u",word'"); + OUString sReplaced(u",word\u2019"_ustr); + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // Us apostrophe without preceding starting quote: word' -> word’ + emulateTyping(*pTextDoc, u" word'"); + sReplaced += u" word\u2019"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // But only after letters: word.' -> word.‘ + emulateTyping(*pTextDoc, u" word.'"); + sReplaced += u" word.‘"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf123786) +{ + createSwDoc("tdf123786.fodt"); + SwDoc* pDoc = getSwDoc(); + + // On Windows, it will detect that system input language is en-US (despite "typing" e.g. Cyrillic characters), + // and will change Russian into English (US); in the latter language, + // the replacement from single quote will not become “, but ’. + SvtSysLocaleOptions aOptions; + aOptions.SetIgnoreLanguageChange(true); + aOptions.Commit(); + + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + // Second level ending quote: „word' -> „word“ + emulateTyping(*pTextDoc, u"„слово'"); + OUString sReplaced(u"„слово“"_ustr); + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // Us apostrophe without preceding starting quote: word' -> word’ + emulateTyping(*pTextDoc, u" слово'"); + sReplaced += u" слово’"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // But only after letters: word.' -> word.“ + emulateTyping(*pTextDoc, u" слово.'"); + sReplaced += u" слово.“"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf133589) +{ + // Hungarian test document with right-to-left paragraph setting + createSwDoc("tdf133589.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + // translitere words to Old Hungarian + emulateTyping(*pTextDoc, u"székely "); + OUString sReplaced(u"𐳥𐳋𐳓𐳉𐳗 "_ustr); + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // disambiguate consonants: asszony -> asz|szony + emulateTyping(*pTextDoc, u"asszony "); + sReplaced += u"𐳀𐳥𐳥𐳛𐳚 "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // disambiguate consonants: kosszarv -> kos|szarv + // (add explicit ZWSP temporarily for consonant disambiguation, because the requested + // hu_HU hyphenation dictionary isn't installed on all testing platform) + // pWrtShell->Insert(u"kosszarv"); + emulateTyping(*pTextDoc, u"kos\u200Bszarv "); + sReplaced += u"𐳓𐳛𐳤𐳥𐳀𐳢𐳮 "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // transliterate numbers to Old Hungarian + emulateTyping(*pTextDoc, u"2020 "); + sReplaced += u"𐳺𐳺𐳿𐳼𐳼 "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + // tdf#147546 transliterate punctuation marks + + // question mark + emulateTyping(*pTextDoc, u"Kérdőjel?"); + sReplaced += u"𐲓𐳋𐳢𐳇𐳟𐳒𐳉𐳖"; + OUString sReplaced2(sReplaced + "?"); + CPPUNIT_ASSERT_EQUAL(sReplaced2, getParagraph(1)->getString()); + emulateTyping(*pTextDoc, u" "); + sReplaced += u"⸮ "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // comma + emulateTyping(*pTextDoc, u"Vessző,"); + sReplaced += u"𐲮𐳉𐳥𐳥𐳟"; + sReplaced2 = sReplaced + ","; + CPPUNIT_ASSERT_EQUAL(sReplaced2, getParagraph(1)->getString()); + emulateTyping(*pTextDoc, u" "); + sReplaced += u"⹁ "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // semicolon + emulateTyping(*pTextDoc, u"pontosvessző;"); + sReplaced += u"𐳠𐳛𐳙𐳦𐳛𐳤𐳮𐳉𐳥𐳥𐳟"; + sReplaced2 = sReplaced + ";"; + CPPUNIT_ASSERT_EQUAL(sReplaced2, getParagraph(1)->getString()); + emulateTyping(*pTextDoc, u" "); + sReplaced += u"⁏ "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // quotation marks + emulateTyping(*pTextDoc, u"„idézőjel” "); + sReplaced += u"⹂𐳐𐳇𐳋𐳯𐳟𐳒𐳉𐳖‟ "; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + // tdf#148672 transliterate word with closing bracket + emulateTyping(*pTextDoc, u"word] "); + sReplaced += u"𐳮𐳛𐳢𐳇] "; // This was "word]" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + // tdf#148672 transliterate words with parenthesis (libnumbertext 1.0.11) + emulateTyping(*pTextDoc, u"(word) "); + sReplaced += u"(𐳮𐳛𐳢𐳇) "; // This was "(word)" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + emulateTyping(*pTextDoc, u"(word "); + sReplaced += u"(𐳮𐳛𐳢𐳇 "; // This was "(word" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + emulateTyping(*pTextDoc, u"word) "); + sReplaced += u"𐳮𐳛𐳢𐳇) "; // This was "word)" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + emulateTyping(*pTextDoc, u"{word} "); + sReplaced += u"{𐳮𐳛𐳢𐳇} "; // This was "(word)" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + emulateTyping(*pTextDoc, u"{word "); + sReplaced += u"{𐳮𐳛𐳢𐳇 "; // This was "(word" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + emulateTyping(*pTextDoc, u"word} "); + sReplaced += u"𐳮𐳛𐳢𐳇} "; // This was "word)" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + emulateTyping(*pTextDoc, u"[word] "); + sReplaced += u"[𐳮𐳛𐳢𐳇] "; // This was "(word)" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + + emulateTyping(*pTextDoc, u"[word "); + sReplaced += u"[𐳮𐳛𐳢𐳇 "; // This was "(word" (no transliteration) + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testAutoCorr) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + //Normal AutoCorrect + emulateTyping(*pTextDoc, u"tset "); + CPPUNIT_ASSERT_EQUAL(OUString("Test "), getParagraph(1)->getString()); + + //AutoCorrect with change style to bolt + emulateTyping(*pTextDoc, u"Bolt "); + const uno::Reference xRun = getRun(getParagraph(1), 2); + CPPUNIT_ASSERT_EQUAL(OUString("Bolt"), xRun->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("Arial"), getProperty(xRun, "CharFontName")); + + //AutoCorrect inserts Table with 2 rows and 3 columns + emulateTyping(*pTextDoc, u"4xx "); + const uno::Reference xTable(getParagraphOrTable(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getColumns()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf130274) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* const pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines()); + CPPUNIT_ASSERT( + !IDocumentRedlineAccess::IsRedlineOn(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + + // "tset" may be replaced by the AutoCorrect in the test profile + emulateTyping(*pTextDoc, u"tset"); + // select from left to right + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 4, /*bBasicCall=*/false); + + pWrtShell->SetRedlineFlags(pWrtShell->GetRedlineFlags() | RedlineFlags::On); + // this would crash in AutoCorrect + emulateTyping(*pTextDoc, u"."); + + CPPUNIT_ASSERT(!pDoc->getIDocumentRedlineAccess().GetRedlineTable().empty()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf83260) +{ + createSwDoc("tdf83260-1.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + // enabled but not shown + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); +#if 0 + CPPUNIT_ASSERT(IDocumentRedlineAccess::IsHideChanges( + pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); +#endif + CPPUNIT_ASSERT( + IDocumentRedlineAccess::IsRedlineOn(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + CPPUNIT_ASSERT(!pDoc->getIDocumentRedlineAccess().GetRedlineTable().empty()); + + // the document contains redlines that are combined with CompressRedlines() + // if that happens during AutoCorrect then indexes in Undo are off -> crash + emulateTyping(*pTextDoc, u"tset "); + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + auto const nActions(rUndoManager.GetUndoActionCount()); + for (auto i = nActions; 0 < i; --i) + { + rUndoManager.Undo(); + } + // check that every text node has a layout frame + for (SwNodeOffset i(0); i < pDoc->GetNodes().Count(); ++i) + { + if (SwTextNode const* const pNode = pDoc->GetNodes()[i]->GetTextNode()) + { + CPPUNIT_ASSERT(pNode->getLayoutFrame(nullptr, nullptr, nullptr)); + } + } + for (auto i = nActions; 0 < i; --i) + { + rUndoManager.Redo(); + } + for (SwNodeOffset i(0); i < pDoc->GetNodes().Count(); ++i) + { + if (SwTextNode const* const pNode = pDoc->GetNodes()[i]->GetTextNode()) + { + CPPUNIT_ASSERT(pNode->getLayoutFrame(nullptr, nullptr, nullptr)); + } + } + for (auto i = nActions; 0 < i; --i) + { + rUndoManager.Undo(); + } + for (SwNodeOffset i(0); i < pDoc->GetNodes().Count(); ++i) + { + if (SwTextNode const* const pNode = pDoc->GetNodes()[i]->GetTextNode()) + { + CPPUNIT_ASSERT(pNode->getLayoutFrame(nullptr, nullptr, nullptr)); + } + } +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf74363) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + //testing autocorrect of initial capitals on start of first paragraph + //Inserting one all-lowercase word into the first paragraph + emulateTyping(*pTextDoc, u"testing "); + //The word should be capitalized due to autocorrect + CPPUNIT_ASSERT_EQUAL(OUString("Testing "), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf139922) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); + Scheduler::ProcessEventsToIdle(); + + emulateTyping(*pTextDoc, u"this is a SEntence. this is a SEntence."); + + // Without the fix in place, this test would have failed with + // - Expected: This is a Sentence. This is a Sentence. + // - Actual : this is a Sentence. This is a Sentence. + CPPUNIT_ASSERT_EQUAL(OUString("This is a Sentence. This is a Sentence."), + getParagraph(2)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf143176) +{ + // Hungarian test document with right-to-left paragraph setting + createSwDoc("tdf143176.fodt"); + + // transliterate the document to Old Hungarian (note: it only works + // with right-to-left text direction and Default Paragraph Style) + dispatchCommand(mxComponent, ".uno:AutoFormatApply", {}); + + // This was the original "Lorem ipsum..." + CPPUNIT_ASSERT_EQUAL(u"𐲖𐳛𐳢𐳉𐳘 𐳐𐳠𐳤𐳪𐳘 𐳇𐳛𐳖𐳛𐳢 " + u"𐳤𐳐𐳦 𐳀𐳘𐳉𐳦⹁"_ustr, + getParagraph(1)->getString()); + CPPUNIT_ASSERT_EQUAL(u"𐳄𐳛𐳙𐳤𐳉𐳄𐳦𐳉𐳦𐳪𐳢 " + u"𐳀𐳇𐳐𐳠𐳐𐳤𐳄𐳐𐳙𐳍 𐳉𐳖𐳐𐳦."_ustr, + getParagraph(2)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testInsertLongDateFormat) +{ + // only for Hungarian, yet + createSwDoc("tdf133524.fodt"); + dispatchCommand(mxComponent, ".uno:InsertDateField", {}); + // Make sure that the document starts with a field now, and its expanded string value contains space + const uno::Reference xField = getRun(getParagraph(1), 1); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xField, "TextPortionType")); + // the date format was "YYYY-MM-DD", but now "YYYY. MMM DD." + CPPUNIT_ASSERT(xField->getString().indexOf(" ") > -1); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf129270) +{ + createSwDoc("tdf129270.odt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + // Go to document end + pWrtShell->SttEndDoc(/*bStt=*/false); + + // Press enter + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); + Scheduler::ProcessEventsToIdle(); + + // Numbering for previous outline should remain the same "2" + CPPUNIT_ASSERT_EQUAL(OUString("2"), getProperty(getParagraph(4), "ListLabelString")); + + // Numbering for newly created outline should be "2.1" + CPPUNIT_ASSERT_EQUAL(OUString("2.1"), + getProperty(getParagraph(5), "ListLabelString")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testInsertPdf) +{ + auto pPdfium = vcl::pdf::PDFiumLibrary::get(); + if (!pPdfium) + { + return; + } + + createSwDoc(); + + // insert the PDF into the document + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "FileName", uno::Any(createFileURL(u"hello-world.pdf")) } })); + dispatchCommand(mxComponent, ".uno:InsertGraphic", aArgs); + + // Save and load cycle + saveAndReload("writer8"); + + uno::Reference xShape = getShape(1); + // Assert that we have a replacement graphics + auto xReplacementGraphic + = getProperty>(xShape, "ReplacementGraphic"); + CPPUNIT_ASSERT(xReplacementGraphic.is()); + + auto xGraphic = getProperty>(xShape, "Graphic"); + CPPUNIT_ASSERT(xGraphic.is()); + // Assert that the graphic is a PDF + CPPUNIT_ASSERT_EQUAL(OUString("application/pdf"), getProperty(xGraphic, "MimeType")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf143760WrapContourToOff) +{ + // Actually, this is an ooxmlexport test. It is here because here is a ready environment + // to change a shape by dispatchCommand. + createSwDoc("tdf143760_ContourToWrapOff.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + CPPUNIT_ASSERT_EQUAL(true, getProperty(getShape(1), "SurroundContour")); + + // Mark the object + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + SdrObject* pObject = pPage->GetObj(0); + CPPUNIT_ASSERT(pObject); + SdrView* pView = pWrtShell->GetDrawView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + + // Set "wrap off" + dispatchCommand(mxComponent, ".uno:WrapOff", {}); + CPPUNIT_ASSERT_EQUAL(false, getProperty(getShape(1), "SurroundContour")); + + // Without fix this had failed, because the shape was written to file with contour. + saveAndReload("Office Open XML Text"); + CPPUNIT_ASSERT_EQUAL(false, getProperty(getShape(1), "SurroundContour")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testHatchFill) +{ + createSwDoc(); + + // Add a rectangle shape to the document. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(10000, 10000)); + xShape->setPosition(awt::Point(1000, 1000)); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + xShapeProps->setPropertyValue("FillStyle", uno::Any(drawing::FillStyle_HATCH)); + xShapeProps->setPropertyValue("FillHatchName", uno::Any(OUString("Black 0 Degrees"))); + xShapeProps->setPropertyValue("FillBackground", uno::Any(false)); + xShapeProps->setPropertyValue("FillTransparence", uno::Any(sal_Int32(30))); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage = xDrawPageSupplier->getDrawPage(); + xDrawPage->add(xShape); + + // Save it as DOCX and load it again. + saveAndReload("Office Open XML Text"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + // tdf#127989 Without fix this had failed, because the background of the hatch was not set as 'no background'. + CPPUNIT_ASSERT(!getProperty(getShape(1), "FillBackground")); + + // tdf#146822 Without fix this had failed, because the transparency value of the hatch was not exported. + CPPUNIT_ASSERT_EQUAL(sal_Int32(30), getProperty(getShape(1), "FillTransparence")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testNestedGroupTextBoxCopyCrash) +{ + createSwDoc("tdf149550.docx"); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + // This crashed here before the fix. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_ESCAPE); + Scheduler::ProcessEventsToIdle(); + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_MESSAGE("Where is the doc, it crashed, isn't it?!", mxComponent); + + auto pLayout = parseLayoutDump(); + // There must be 2 textboxes! + assertXPath(pLayout, "/root/page/body/txt/anchored/fly[2]"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testCrashOnExit) +{ + // Load the bugdoc with a table and a textbox shape inside. + createSwDoc("tdf142715.odt"); + + // Get the textbox selected + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + selectShape(1); + auto xShape = getShape(1); + uno::Reference xProperties(xShape, uno::UNO_QUERY); + + // Check if the textbox is selected + CPPUNIT_ASSERT_EQUAL(true, xProperties->getPropertyValue("TextBox").get()); + + // Remove the textbox + dispatchCommand(mxComponent, ".uno:RemoveTextBox", {}); + + CPPUNIT_ASSERT_EQUAL(false, xProperties->getPropertyValue("TextBox").get()); + + // Readd the textbox (to run the textboxhelper::create() method) + dispatchCommand(mxComponent, ".uno:AddTextBox", {}); + + CPPUNIT_ASSERT_EQUAL(true, xProperties->getPropertyValue("TextBox").get()); + + // save and reload + saveAndReload("writer8"); + + // Before the fix this crashed here and could not reopen. + CPPUNIT_ASSERT_MESSAGE("Crash on exit, isn't it?", mxComponent); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testCaptionShape) +{ + createSwDoc(); + + // Add a caption shape to the document. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xShape( + xFactory->createInstance("com.sun.star.drawing.CaptionShape"), uno::UNO_QUERY); + xShape->setSize(awt::Size(10000, 10000)); + xShape->setPosition(awt::Point(1000, 1000)); + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDrawPage = xDrawPageSupplier->getDrawPage(); + xDrawPage->add(xShape); + + // Save it as DOCX and load it again. + saveAndReload("Office Open XML Text"); + + // Without fix in place, the shape was lost on export. + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf151828_Comment2) +{ + createSwDoc(); + + // Add a basic shape to the document. + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } })); + dispatchCommand(mxComponent, ".uno:BasicShapes", aArgs); + + auto xBasicShape = getShape(1); + auto pObject = SdrObject::getSdrObjectFromXShape(xBasicShape); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + // rename the shape name + pObject->SetName("Shape"); + + // cut and paste it + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + // it is required to get the shape object again after paste + xBasicShape = getShape(1); + pObject = SdrObject::getSdrObjectFromXShape(xBasicShape); + + // Without fix in place, the shape name was 'Shape 1' after paste. + CPPUNIT_ASSERT_EQUAL(OUString("Shape"), pObject->GetName()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf151828) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // insert a table + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 1, 1); + + // move cursor into the table + CPPUNIT_ASSERT(pWrtShell->MoveTable(GotoPrevTable, fnTableStart)); + + SwFrameFormat* pFormat = pWrtShell->GetTableFormat(); + CPPUNIT_ASSERT(pFormat); + + // set name of table to 'MyTableName' + pWrtShell->SetTableName(*pFormat, "MyTableName"); + + // cut and paste the table + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:Cut", {}); + dispatchCommand(mxComponent, ".uno:Paste", {}); + + // move cursor into the pasted table + CPPUNIT_ASSERT(pWrtShell->MoveTable(GotoPrevTable, fnTableStart)); + + pFormat = pWrtShell->GetTableFormat(); + CPPUNIT_ASSERT(pFormat); + + // Before the fix the pasted table name was 'Table1'. + CPPUNIT_ASSERT_EQUAL(OUString("MyTableName"), pFormat->GetName()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf146178) +{ + createSwDoc(); + + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + + // insert two fields + dispatchCommand(mxComponent, ".uno:InsertTimeField", {}); + dispatchCommand(mxComponent, ".uno:InsertDateField", {}); + + // navigate by field + SwView::SetMoveType(NID_FIELD); + + // set cursor to the start of the document + pWrtShell->SttEndDoc(false); + // navigate to the previous field + dispatchCommand(mxComponent, ".uno:ScrollToPrevious", {}); + // Before the fix the position would be 0, navigation did not wrap to end of document + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pCursor->GetPoint()->GetContentIndex()); + + // set cursor to the end of the document + pWrtShell->SttEndDoc(false); + // navigate to the next field + dispatchCommand(mxComponent, ".uno:ScrollToNext", {}); + // Before the fix the position would be 1, navigation did not wrap to start of document + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pCursor->GetPoint()->GetContentIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf106663HeaderTextFrameGoToNextPlacemarker) +{ + createSwDoc("testTdf106663.odt"); + + SwDoc* pDoc = getSwDoc(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // Move the cursor into the fly frame of the document's header + pWrtShell->GotoFly("FrameInHeader", FLYCNTTYPE_FRM, false); + + // Check that GoToNextPlacemarker highlights the first field instead of the second one + dispatchCommand(mxComponent, ".uno:GoToNextPlacemarker", {}); + // Without the fix in place, this test would have failed with + // - Expected: Heading + // - Actual : Some other marker + // i.e. the GoToNextPlacemarker command skipped the first field + CPPUNIT_ASSERT(pCursor->GetPoint()->GetNode().GetTextNode()->GetText().startsWith("Heading")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest6, testTdf155407) +{ + createSwDoc(); + SwXTextDocument& rTextDoc = dynamic_cast(*mxComponent); + + { + emulateTyping(rTextDoc, u"Foo - 11’--’22 "); + // Without the fix in place, this would fail with + // - Expected: Foo – 11’—’22 + // - Actual : Foo – 11’--’22 + CPPUNIT_ASSERT_EQUAL(u"Foo – 11’—’22 "_ustr, getParagraph(1)->getString()); + } + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); // start again + + { + emulateTyping(rTextDoc, u"Bar -- 111--222 "); + // Without the fix in place, this would fail with + // - Expected: Bar – 111–222 + // - Actual : Bar – 111-–22 + CPPUNIT_ASSERT_EQUAL(u"Bar – 111–222 "_ustr, getParagraph(1)->getString()); + } +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/uiwriter/uiwriter7.cxx b/sw/qa/extras/uiwriter/uiwriter7.cxx new file mode 100644 index 0000000000..16afe5f205 --- /dev/null +++ b/sw/qa/extras/uiwriter/uiwriter7.cxx @@ -0,0 +1,2801 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +int CountFilesInDirectory(const OUString& rURL) +{ + int nRet = 0; + + osl::Directory aDir(rURL); + CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, aDir.open()); + + osl::DirectoryItem aItem; + osl::FileStatus aFileStatus(osl_FileStatus_Mask_FileURL | osl_FileStatus_Mask_Type); + while (aDir.getNextItem(aItem) == osl::FileBase::E_None) + { + aItem.getFileStatus(aFileStatus); + if (aFileStatus.getFileType() != osl::FileStatus::Directory) + ++nRet; + } + + return nRet; +} + +} //namespace + +class SwUiWriterTest7 : public SwModelTestBase +{ +public: + SwUiWriterTest7() + : SwModelTestBase("/sw/qa/extras/uiwriter/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testExportToPicture) +{ + createSwDoc(); + uno::Sequence aFilterData( + comphelper::InitPropertySequence({ { "PixelWidth", uno::Any(sal_Int32(610)) }, + { "PixelHeight", uno::Any(sal_Int32(610)) } })); + uno::Sequence aDescriptor(comphelper::InitPropertySequence( + { { "FilterName", uno::Any(OUString("writer_png_Export")) }, + { "FilterData", uno::Any(aFilterData) } })); + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->storeToURL(maTempFile.GetURL(), aDescriptor); + bool extchk = maTempFile.IsValid(); + CPPUNIT_ASSERT_EQUAL(true, extchk); + osl::File tmpFile(maTempFile.GetURL()); + tmpFile.open(sal_uInt32(osl_File_OpenFlag_Read)); + sal_uInt64 val; + CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, tmpFile.getSize(val)); + CPPUNIT_ASSERT(val > 100); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf77340) +{ + createSwDoc(); + //Getting some paragraph style in our document + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xStyle( + xFactory->createInstance("com.sun.star.style.ParagraphStyle"), uno::UNO_QUERY); + uno::Reference xPropSet(xStyle, uno::UNO_QUERY_THROW); + xPropSet->setPropertyValue("ParaBackColor", uno::Any(sal_Int32(0xFF00FF))); + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xNameAccess(xSupplier->getStyleFamilies()); + uno::Reference xNameCont; + xNameAccess->getByName("ParagraphStyles") >>= xNameCont; + xNameCont->insertByName("myStyle", uno::Any(xStyle)); + CPPUNIT_ASSERT_EQUAL(OUString("myStyle"), xStyle->getName()); + //Setting the properties with proper values + xPropSet->setPropertyValue("PageDescName", uno::Any(OUString("First Page"))); + xPropSet->setPropertyValue("PageNumberOffset", uno::Any(sal_Int16(3))); + //Getting the properties and checking that they have proper values + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("First Page")), + xPropSet->getPropertyValue("PageDescName")); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(3)), xPropSet->getPropertyValue("PageNumberOffset")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf79236) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + //Getting some paragraph style + SwTextFormatColl* pTextFormat = pDoc->FindTextFormatCollByName(u"Body Text"_ustr); + const SwAttrSet& rAttrSet = pTextFormat->GetAttrSet(); + std::unique_ptr pNewSet = rAttrSet.Clone(); + sal_uInt16 initialCount = pNewSet->Count(); + SvxAdjustItem AdjustItem = rAttrSet.GetAdjust(); + SvxAdjust initialAdjust = AdjustItem.GetAdjust(); + //By default the adjust is LEFT + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, initialAdjust); + //Changing the adjust to RIGHT + AdjustItem.SetAdjust(SvxAdjust::Right); + //Checking whether the change is made or not + SvxAdjust modifiedAdjust = AdjustItem.GetAdjust(); + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, modifiedAdjust); + //Modifying the itemset, putting *one* item + pNewSet->Put(AdjustItem); + //The count should increment by 1 + sal_uInt16 modifiedCount = pNewSet->Count(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(initialCount + 1), modifiedCount); + //Setting the updated item set on the style + pDoc->ChgFormat(*pTextFormat, *pNewSet); + //Checking the Changes + SwTextFormatColl* pTextFormat2 = pDoc->FindTextFormatCollByName(u"Body Text"_ustr); + const SwAttrSet& rAttrSet2 = pTextFormat2->GetAttrSet(); + const SvxAdjustItem& rAdjustItem2 = rAttrSet2.GetAdjust(); + SvxAdjust Adjust2 = rAdjustItem2.GetAdjust(); + //The adjust should be RIGHT as per the modifications made + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, Adjust2); + //Undo the changes + rUndoManager.Undo(); + SwTextFormatColl* pTextFormat3 = pDoc->FindTextFormatCollByName(u"Body Text"_ustr); + const SwAttrSet& rAttrSet3 = pTextFormat3->GetAttrSet(); + const SvxAdjustItem& rAdjustItem3 = rAttrSet3.GetAdjust(); + SvxAdjust Adjust3 = rAdjustItem3.GetAdjust(); + //The adjust should be back to default, LEFT + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, Adjust3); + //Redo the changes + rUndoManager.Redo(); + SwTextFormatColl* pTextFormat4 = pDoc->FindTextFormatCollByName(u"Body Text"_ustr); + const SwAttrSet& rAttrSet4 = pTextFormat4->GetAttrSet(); + const SvxAdjustItem& rAdjustItem4 = rAttrSet4.GetAdjust(); + SvxAdjust Adjust4 = rAdjustItem4.GetAdjust(); + //The adjust should be RIGHT as per the modifications made + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Right, Adjust4); + //Undo the changes + rUndoManager.Undo(); + SwTextFormatColl* pTextFormat5 = pDoc->FindTextFormatCollByName(u"Body Text"_ustr); + const SwAttrSet& rAttrSet5 = pTextFormat5->GetAttrSet(); + const SvxAdjustItem& rAdjustItem5 = rAttrSet5.GetAdjust(); + SvxAdjust Adjust5 = rAdjustItem5.GetAdjust(); + //The adjust should be back to default, LEFT + CPPUNIT_ASSERT_EQUAL(SvxAdjust::Left, Adjust5); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTextSearch) +{ + // Create a new empty Writer document + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + // Insert some text + rIDCO.InsertString(*pCursor, "Hello World This is a test"); + // Use cursor to select part of text + for (int i = 0; i < 10; i++) + { + pCursor->Move(fnMoveBackward); + } + pCursor->SetMark(); + for (int i = 0; i < 4; i++) + { + pCursor->Move(fnMoveBackward); + } + //Checking that the proper selection is made + CPPUNIT_ASSERT_EQUAL(OUString("This"), pCursor->GetText()); + // Apply a "Bold" attribute to selection + SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + //making another selection of text + for (int i = 0; i < 7; i++) + { + pCursor->Move(fnMoveBackward); + } + pCursor->SetMark(); + for (int i = 0; i < 5; i++) + { + pCursor->Move(fnMoveBackward); + } + //Checking that the proper selection is made + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), pCursor->GetText()); + // Apply a "Bold" attribute to selection + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + //Performing Search Operation and also covering the UNO coverage for setProperty + uno::Reference xSearch(mxComponent, uno::UNO_QUERY); + uno::Reference xSearchDes = xSearch->createSearchDescriptor(); + uno::Reference xProp(xSearchDes, uno::UNO_QUERY); + //setting some properties + uno::Sequence aDescriptor(comphelper::InitPropertySequence( + { { "CharWeight", uno::Any(float(css::awt::FontWeight::BOLD)) } })); + xProp->setSearchAttributes(aDescriptor); + //receiving the defined properties and asserting them with expected values, covering UNO + uno::Sequence aPropVal2(xProp->getSearchAttributes()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aPropVal2.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("CharWeight"), aPropVal2[0].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(float(css::awt::FontWeight::BOLD)), aPropVal2[0].Value); + //specifying the search attributes + uno::Reference xPropSet(xSearchDes, uno::UNO_QUERY_THROW); + xPropSet->setPropertyValue("SearchWords", uno::Any(true)); + xPropSet->setPropertyValue("SearchCaseSensitive", uno::Any(true)); + //this will search all the BOLD words + uno::Reference xIndex(xSearch->findAll(xSearchDes)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndex->getCount()); + //Replacing the searched string via XReplaceable + uno::Reference xReplace(mxComponent, uno::UNO_QUERY); + uno::Reference xReplaceDes = xReplace->createReplaceDescriptor(); + uno::Reference xProp2(xReplaceDes, uno::UNO_QUERY); + xProp2->setReplaceAttributes(aDescriptor); + //checking that the proper attributes are there or not + uno::Sequence aRepProp(xProp2->getReplaceAttributes()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aRepProp.getLength()); + CPPUNIT_ASSERT_EQUAL(OUString("CharWeight"), aRepProp[0].Name); + CPPUNIT_ASSERT_EQUAL(uno::Any(float(css::awt::FontWeight::BOLD)), aRepProp[0].Value); + //setting strings for replacement + xReplaceDes->setSearchString("test"); + xReplaceDes->setReplaceString("task"); + //checking the replaceString + CPPUNIT_ASSERT_EQUAL(OUString("task"), xReplaceDes->getReplaceString()); + //this will replace *normal*test to *bold*task + sal_Int32 ReplaceCount = xReplace->replaceAll(xReplaceDes); + //There should be only 1 replacement since there is only one occurrence of "test" in the document + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + //Now performing search again for BOLD words, count should be 3 due to replacement + uno::Reference xIndex2(xReplace->findAll(xSearchDes)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndex2->getCount()); + // regex tests + xSearchDes->setPropertyValue("SearchRegularExpression", uno::Any(true)); + // regex: test correct matching combined with attributes like BOLD + xSearchDes->setSearchString(".*"); // should match all bold words in the text + xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xIndex->getCount()); + uno::Reference xFound(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xFound->getString()); + xFound.set(xIndex->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("This"), xFound->getString()); + xFound.set(xIndex->getByIndex(2), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("task"), xFound->getString()); + // regex: test anchor combined with attributes like BOLD + xSearchDes->setSearchString("^.*|.*$"); // should match first and last words (they are bold) + xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndex->getCount()); + xFound.set(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Hello"), xFound->getString()); + xFound.set(xIndex->getByIndex(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("task"), xFound->getString()); + // regex: test look-ahead/look-behind assertions outside of the bold text + xSearchDes->setSearchString("(?<= ).*(?= )"); // should match second bold word + xIndex.set(xReplace->findAll(xSearchDes), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndex->getCount()); + xFound.set(xIndex->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("This"), xFound->getString()); + xReplaceDes->setPropertyValue("SearchRegularExpression", uno::Any(true)); + // regex: test correct match of paragraph start + xReplaceDes->setSearchString("^."); // should only match first character of the paragraph + xReplaceDes->setReplaceString("C"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: test correct match of word start + xReplaceDes->setSearchString("\\b\\w"); // should match all words' first characters + xReplaceDes->setReplaceString("x&"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), ReplaceCount); + // regex: test negative look-behind assertion + xReplaceDes->setSearchString("(?setReplaceString("y"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: test positive look-behind assertion + xReplaceDes->setSearchString("(?<=xCelly xWorld xTh)i"); // only "i" in "xThis", not in "xis" + xReplaceDes->setReplaceString("z"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: use capturing group to test reference + xReplaceDes->setSearchString("\\b(\\w\\w\\w\\w)\\w"); + xReplaceDes->setReplaceString("$1q"); // only fifth characters in words should change + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), ReplaceCount); + // check of the end result + CPPUNIT_ASSERT_EQUAL(OUString("xCelqy xWorqd xThzq xis xa xtasq"), + pCursor->GetPointNode().GetTextNode()->GetText()); + // regex: use positive look-ahead assertion + xReplaceDes->setSearchString("Wor(?=qd xThzq xis xa xtasq)"); + xReplaceDes->setReplaceString("&p"); // testing & reference + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), ReplaceCount); + // regex: use negative look-ahead assertion + xReplaceDes->setSearchString("x(?!Worpqd xThzq xis xa xtasq)"); + xReplaceDes->setReplaceString("m"); + ReplaceCount = xReplace->replaceAll(xReplaceDes); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), ReplaceCount); // one of the 6 "x" must not be replaced + // check of the end result + CPPUNIT_ASSERT_EQUAL(OUString("mCelqy xWorpqd mThzq mis ma mtasq"), + pCursor->GetPointNode().GetTextNode()->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf69282) +{ + createSwDoc(); + SwDoc* source = getSwDoc(); + uno::Reference xSourceDoc = mxComponent; + mxComponent.clear(); + createSwDoc(); + SwDoc* target = getSwDoc(); + SwPageDesc* sPageDesc = source->MakePageDesc("SourceStyle"); + SwPageDesc* tPageDesc = target->MakePageDesc("TargetStyle"); + sPageDesc->ChgFirstShare(false); + CPPUNIT_ASSERT(!sPageDesc->IsFirstShared()); + SwFrameFormat& rSourceMasterFormat = sPageDesc->GetMaster(); + //Setting horizontal spaces on master + SvxLRSpaceItem horizontalSpace(RES_LR_SPACE); + horizontalSpace.SetLeft(11); + horizontalSpace.SetRight(12); + rSourceMasterFormat.SetFormatAttr(horizontalSpace); + //Setting vertical spaces on master + SvxULSpaceItem verticalSpace(RES_UL_SPACE); + verticalSpace.SetUpper(13); + verticalSpace.SetLower(14); + rSourceMasterFormat.SetFormatAttr(verticalSpace); + //Changing the style and copying it to target + source->ChgPageDesc("SourceStyle", *sPageDesc); + target->CopyPageDesc(*sPageDesc, *tPageDesc); + //Checking the set values on all Formats in target + SwFrameFormat& rTargetMasterFormat = tPageDesc->GetMaster(); + SwFrameFormat& rTargetLeftFormat = tPageDesc->GetLeft(); + SwFrameFormat& rTargetFirstMasterFormat = tPageDesc->GetFirstMaster(); + SwFrameFormat& rTargetFirstLeftFormat = tPageDesc->GetFirstLeft(); + //Checking horizontal spaces + const SvxLRSpaceItem MasterLRSpace = rTargetMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), MasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), MasterLRSpace.GetRight()); + const SvxLRSpaceItem LeftLRSpace = rTargetLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), LeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), LeftLRSpace.GetRight()); + const SvxLRSpaceItem FirstMasterLRSpace = rTargetFirstMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstMasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstMasterLRSpace.GetRight()); + const SvxLRSpaceItem FirstLeftLRSpace = rTargetFirstLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstLeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstLeftLRSpace.GetRight()); + //Checking vertical spaces + const SvxULSpaceItem MasterULSpace = rTargetMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), MasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), MasterULSpace.GetLower()); + const SvxULSpaceItem LeftULSpace = rTargetLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), LeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), LeftULSpace.GetLower()); + const SvxULSpaceItem FirstMasterULSpace = rTargetFirstMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstMasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstMasterULSpace.GetLower()); + const SvxULSpaceItem FirstLeftULSpace = rTargetFirstLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstLeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstLeftULSpace.GetLower()); + xSourceDoc->dispose(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf69282WithMirror) +{ + createSwDoc(); + SwDoc* source = getSwDoc(); + uno::Reference xSourceDoc = mxComponent; + mxComponent.clear(); + createSwDoc(); + SwDoc* target = getSwDoc(); + SwPageDesc* sPageDesc = source->MakePageDesc("SourceStyle"); + SwPageDesc* tPageDesc = target->MakePageDesc("TargetStyle"); + //Enabling Mirror + sPageDesc->SetUseOn(UseOnPage::Mirror); + SwFrameFormat& rSourceMasterFormat = sPageDesc->GetMaster(); + //Setting horizontal spaces on master + SvxLRSpaceItem horizontalSpace(RES_LR_SPACE); + horizontalSpace.SetLeft(11); + horizontalSpace.SetRight(12); + rSourceMasterFormat.SetFormatAttr(horizontalSpace); + //Setting vertical spaces on master + SvxULSpaceItem verticalSpace(RES_UL_SPACE); + verticalSpace.SetUpper(13); + verticalSpace.SetLower(14); + rSourceMasterFormat.SetFormatAttr(verticalSpace); + //Changing the style and copying it to target + source->ChgPageDesc("SourceStyle", *sPageDesc); + target->CopyPageDesc(*sPageDesc, *tPageDesc); + //Checking the set values on all Formats in target + SwFrameFormat& rTargetMasterFormat = tPageDesc->GetMaster(); + SwFrameFormat& rTargetLeftFormat = tPageDesc->GetLeft(); + SwFrameFormat& rTargetFirstMasterFormat = tPageDesc->GetFirstMaster(); + SwFrameFormat& rTargetFirstLeftFormat = tPageDesc->GetFirstLeft(); + //Checking horizontal spaces + const SvxLRSpaceItem MasterLRSpace = rTargetMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), MasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), MasterLRSpace.GetRight()); + //mirror effect should be present + const SvxLRSpaceItem LeftLRSpace = rTargetLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), LeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), LeftLRSpace.GetRight()); + const SvxLRSpaceItem FirstMasterLRSpace = rTargetFirstMasterFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstMasterLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstMasterLRSpace.GetRight()); + //mirror effect should be present + const SvxLRSpaceItem FirstLeftLRSpace = rTargetFirstLeftFormat.GetLRSpace(); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetRight(), FirstLeftLRSpace.GetLeft()); + CPPUNIT_ASSERT_EQUAL(horizontalSpace.GetLeft(), FirstLeftLRSpace.GetRight()); + //Checking vertical spaces + const SvxULSpaceItem MasterULSpace = rTargetMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), MasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), MasterULSpace.GetLower()); + const SvxULSpaceItem LeftULSpace = rTargetLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), LeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), LeftULSpace.GetLower()); + const SvxULSpaceItem FirstMasterULSpace = rTargetFirstMasterFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstMasterULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstMasterULSpace.GetLower()); + const SvxULSpaceItem FirstLeftULSpace = rTargetFirstLeftFormat.GetULSpace(); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetUpper(), FirstLeftULSpace.GetUpper()); + CPPUNIT_ASSERT_EQUAL(verticalSpace.GetLower(), FirstLeftULSpace.GetLower()); + xSourceDoc->dispose(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf78742) +{ + //testing with service type and any .ods file + OUString path = createFileURL(u"calc-data-source.ods"); + SfxMedium aMedium(path, StreamMode::READ | StreamMode::SHARE_DENYWRITE); + SfxFilterMatcher aMatcher("com.sun.star.text.TextDocument"); + std::shared_ptr pFilter; + ErrCode filter = aMatcher.DetectFilter(aMedium, pFilter); + CPPUNIT_ASSERT_EQUAL(ERRCODE_IO_ABORT, filter); + //it should not return any Filter + CPPUNIT_ASSERT(!pFilter); + //testing without service type and any .ods file + SfxMedium aMedium2(path, StreamMode::READ | StreamMode::SHARE_DENYWRITE); + SfxFilterMatcher aMatcher2; + std::shared_ptr pFilter2; + ErrCode filter2 = aMatcher2.DetectFilter(aMedium2, pFilter2); + CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, filter2); + //Filter should be returned with proper Name + CPPUNIT_ASSERT_EQUAL(OUString("calc8"), pFilter2->GetFilterName()); + //testing with service type and any .odt file + OUString path2 = createFileURL(u"fdo69893.odt"); + SfxMedium aMedium3(path2, StreamMode::READ | StreamMode::SHARE_DENYWRITE); + SfxFilterMatcher aMatcher3("com.sun.star.text.TextDocument"); + std::shared_ptr pFilter3; + ErrCode filter3 = aMatcher3.DetectFilter(aMedium3, pFilter3); + CPPUNIT_ASSERT_EQUAL(ERRCODE_NONE, filter3); + //Filter should be returned with proper Name + CPPUNIT_ASSERT_EQUAL(OUString("writer8"), pFilter3->GetFilterName()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUnoParagraph) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //Inserting some text content in the document + pWrtShell->Insert("This is initial text in paragraph one"); + pWrtShell->SplitNode(); + //Inserting second paragraph + pWrtShell->Insert("This is initial text in paragraph two"); + //now testing the SwXParagraph + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText(xTextDocument->getText()); + uno::Reference xParaAccess(xText, uno::UNO_QUERY); + uno::Reference xPara(xParaAccess->createEnumeration()); + //getting first paragraph + uno::Reference xFirstParaContent(xPara->nextElement(), uno::UNO_QUERY); + uno::Reference xFirstPara(xFirstParaContent, uno::UNO_QUERY); + //testing the initial text + CPPUNIT_ASSERT_EQUAL(OUString("This is initial text in paragraph one"), + xFirstPara->getString()); + //changing the text content in first paragraph + xFirstPara->setString("This is modified text in paragraph one"); + //testing the changes + CPPUNIT_ASSERT_EQUAL(OUString("This is modified text in paragraph one"), + xFirstPara->getString()); + //getting second paragraph + uno::Reference xSecondParaContent(xPara->nextElement(), uno::UNO_QUERY); + uno::Reference xSecondPara(xSecondParaContent, uno::UNO_QUERY); + //testing the initial text + CPPUNIT_ASSERT_EQUAL(OUString("This is initial text in paragraph two"), + xSecondPara->getString()); + //changing the text content in second paragraph + xSecondPara->setString("This is modified text in paragraph two"); + //testing the changes + CPPUNIT_ASSERT_EQUAL(OUString("This is modified text in paragraph two"), + xSecondPara->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf72788) +{ + //Create a new empty Writer document + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + //Insert some text - two paragraphs + rIDCO.InsertString(*pCursor, "this is text"); + //Position of word 9876543210 + //Position of word 0123456789 + //Change Paragraph + pWrtShell->SplitNode(); + //Insert second paragraph + rIDCO.InsertString(*pCursor, "more text"); + //Position of word 012345678 + //Make the following selection *bold* + //this[is text + //more] text + //Move cursor back + for (int i = 0; i < 5; i++) + { + pCursor->Move(fnMoveBackward); + } + //Start selection + pCursor->SetMark(); + for (int i = 0; i < 12; i++) + { + pCursor->Move(fnMoveBackward); + } + //Check the text selection + CPPUNIT_ASSERT_EQUAL(OUString(u"is text" + OUStringChar(CH_TXTATR_NEWLINE) + u"more"), + pCursor->GetText()); + //Apply a *Bold* attribute to selection + SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + SfxItemSet aSet(pDoc->GetAttrPool(), svl::Items); + //Add selected text's attributes to aSet + pCursor->GetPointNode().GetTextNode()->GetParaAttr(aSet, 5, 12); + SfxPoolItem const* pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); + //Check that bold is active on the selection and it's in aSet + CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem == aWeightItem)); + //Make selection to remove formatting in first paragraph + //[this is text + //]more text + pWrtShell->StartOfSection(); + //Start selection + pCursor->SetMark(); + for (int i = 0; i < 13; i++) + { + pCursor->Move(fnMoveForward); + } + //Clear all the Direct Formatting ( Ctrl + M ) + SwTextNode* pTextNode = pCursor->GetPointNode().GetTextNode(); + sal_Int32 nEnd = pTextNode->Len(); + pTextNode->RstTextAttr(0, nEnd); + //In case of Regression RstTextAttr() call will result to infinite recursion + //Check that bold is removed in first paragraph + aSet.ClearItem(); + pTextNode->GetParaAttr(aSet, 5, 12); + SfxPoolItem const* pPoolItem2 = aSet.GetItem(RES_CHRATR_WEIGHT); + CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem2 != aWeightItem)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf60967) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + pWrtShell->ChangeHeaderOrFooter(u"Default Page Style", true, true, true); + //Inserting table + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 2, 2); + //getting the cursor's position just after the table insert + SwPosition aPosAfterTable(*(pCursor->GetPoint())); + //moving cursor to B2 (bottom right cell) + pCursor->Move(fnMoveBackward); + SwPosition aPosInTable(*(pCursor->GetPoint())); + //deleting paragraph following table with Ctrl+Shift+Del + bool val = pWrtShell->DelToEndOfSentence(); + CPPUNIT_ASSERT_EQUAL(true, val); + //getting the cursor's position just after the paragraph deletion + SwPosition aPosAfterDel(*(pCursor->GetPoint())); + //moving cursor forward to check whether there is any node following the table, BTW there should not be any such node + pCursor->Move(fnMoveForward); + SwPosition aPosMoveAfterDel(*(pCursor->GetPoint())); + //checking the positions to verify that the paragraph is actually deleted + CPPUNIT_ASSERT_EQUAL(aPosAfterDel, aPosInTable); + CPPUNIT_ASSERT_EQUAL(aPosMoveAfterDel, aPosInTable); + //Undo the changes + rUndoManager.Undo(); + { + //paragraph *text node* should be back + SwPosition aPosAfterUndo(*(pCursor->GetPoint())); + //after undo aPosAfterTable increases the node position by one, since this contains the position *text node* so aPosAfterUndo should be less than aPosAfterTable + CPPUNIT_ASSERT(aPosAfterTable > aPosAfterUndo); + //moving cursor forward to check whether there is any node following the paragraph, BTW there should not be any such node as paragraph node is the last one in header + pCursor->Move(fnMoveForward); + SwPosition aPosMoveAfterUndo(*(pCursor->GetPoint())); + //checking positions to verify that paragraph node is the last one and we are paragraph node only + CPPUNIT_ASSERT(aPosAfterTable > aPosMoveAfterUndo); + CPPUNIT_ASSERT_EQUAL(aPosAfterUndo, aPosMoveAfterUndo); + } + //Redo the changes + rUndoManager.Redo(); + //paragraph *text node* should not be there + SwPosition aPosAfterRedo(*(pCursor->GetPoint())); + //position should be exactly same as it was after deletion of *text node* + CPPUNIT_ASSERT_EQUAL(aPosAfterRedo, aPosMoveAfterDel); + //moving the cursor forward, but it should not actually move as there is no *text node* after the table due to this same position is expected after move as it was before move + pCursor->Move(fnMoveForward); + SwPosition aPosAfterUndoMove(*(pCursor->GetPoint())); + CPPUNIT_ASSERT_EQUAL(aPosAfterRedo, aPosAfterUndoMove); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testSearchWithTransliterate) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + { + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + pDoc->getIDocumentContentOperations().InsertString(aPaM, "This is paragraph one"); + pWrtShell->SplitNode(); + } + { + SwNodeIndex aIdx(pDoc->GetNodes().GetEndOfContent(), -1); + SwPaM aPaM(aIdx); + pDoc->getIDocumentContentOperations().InsertString(aPaM, "This is Other PARAGRAPH"); + } + i18nutil::SearchOptions2 SearchOpt; + SearchOpt.searchFlag = css::util::SearchFlags::ALL_IGNORE_CASE; + SearchOpt.searchString = "other"; + SearchOpt.replaceString.clear(); + SearchOpt.changedChars = 0; + SearchOpt.deletedChars = 0; + SearchOpt.insertedChars = 0; + SearchOpt.transliterateFlags = TransliterationFlags::IGNORE_DIACRITICS_CTL; + SearchOpt.AlgorithmType2 = css::util::SearchAlgorithms2::ABSOLUTE; + SearchOpt.WildcardEscapeCharacter = 0; + //transliteration option set so that at least one of the search strings is not found + sal_Int32 case1 + = pWrtShell->SearchPattern(SearchOpt, true, SwDocPositions::Start, SwDocPositions::End); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(true); + CPPUNIT_ASSERT_EQUAL(OUString(), pShellCursor->GetText()); + CPPUNIT_ASSERT_EQUAL(0, static_cast(case1)); + SearchOpt.searchString = "paragraph"; + SearchOpt.transliterateFlags = TransliterationFlags::IGNORE_KASHIDA_CTL; + //transliteration option set so that all search strings are found + sal_Int32 case2 + = pWrtShell->SearchPattern(SearchOpt, true, SwDocPositions::Start, SwDocPositions::End); + pShellCursor = pWrtShell->getShellCursor(true); + CPPUNIT_ASSERT_EQUAL(OUString("paragraph"), pShellCursor->GetText()); + CPPUNIT_ASSERT_EQUAL(1, static_cast(case2)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf73660) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + OUString aData1 = "First" + OUStringChar(CHAR_SOFTHYPHEN) + "Word"; + OUString aData2 = "Seco" + OUStringChar(CHAR_SOFTHYPHEN) + "nd"; + OUString aData3 = OUStringChar(CHAR_SOFTHYPHEN) + "Third"; + OUString aData4 = "Fourth" + OUStringChar(CHAR_SOFTHYPHEN); + pWrtShell->Insert("We are inserting some text in the document to check the search feature "); + pWrtShell->Insert(aData1 + " "); + pWrtShell->Insert(aData2 + " "); + pWrtShell->Insert(aData3 + " "); + pWrtShell->Insert(aData4 + " "); + pWrtShell->Insert("Fifth "); + pWrtShell->Insert("Now we have enough text let's test search for all the cases"); + //searching for all 5 strings entered with soft-hyphen, search string contains no soft-hyphen + i18nutil::SearchOptions2 searchOpt; + searchOpt.searchFlag = css::util::SearchFlags::NORM_WORD_ONLY; + searchOpt.AlgorithmType2 = css::util::SearchAlgorithms2::REGEXP; + //case 1 + searchOpt.searchString = "First"; + CPPUNIT_ASSERT_EQUAL( + sal_Int32(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 2 + searchOpt.searchString = "Second"; + CPPUNIT_ASSERT_EQUAL( + sal_Int32(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 3 + searchOpt.searchString = "Third"; + CPPUNIT_ASSERT_EQUAL( + sal_Int32(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 4 + searchOpt.searchString = "Fourth"; + CPPUNIT_ASSERT_EQUAL( + sal_Int32(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); + //case 5 + searchOpt.searchString = "Fifth"; + CPPUNIT_ASSERT_EQUAL( + sal_Int32(1), + pWrtShell->SearchPattern(searchOpt, true, SwDocPositions::Start, SwDocPositions::End)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testNewDocModifiedState) +{ + //creating a new doc + SwDoc* pDoc = new SwDoc(); + //getting the state of the document via IDocumentState + IDocumentState& rState(pDoc->getIDocumentState()); + //the state should not be modified, no modifications yet + CPPUNIT_ASSERT(!(rState.IsModified())); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf77342) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + //inserting first footnote + pWrtShell->InsertFootnote(""); + SwFieldType* pField = pWrtShell->GetFieldType(0, SwFieldIds::GetRef); + SwGetRefFieldType* pRefType = static_cast(pField); + //moving cursor to the starting of document + pWrtShell->StartOfSection(); + //inserting reference field 1 + SwGetRefField aField1(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(0), sal_uInt16(0), + REF_CONTENT); + pWrtShell->InsertField2(aField1); + //inserting second footnote + pWrtShell->InsertFootnote(""); + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + //inserting reference field 2 + SwGetRefField aField2(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(1), sal_uInt16(0), + REF_CONTENT); + pWrtShell->InsertField2(aField2); + //inserting third footnote + pWrtShell->InsertFootnote(""); + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //inserting reference field 3 + SwGetRefField aField3(pRefType, "", "", REF_FOOTNOTE, sal_uInt16(2), sal_uInt16(0), + REF_CONTENT); + pWrtShell->InsertField2(aField3); + //updating the fields + IDocumentFieldsAccess& rField(pDoc->getIDocumentFieldsAccess()); + rField.UpdateExpFields(nullptr, true); + //creating new clipboard doc + rtl::Reference xClpDoc(new SwDoc()); + xClpDoc->SetClipBoard(true); + xClpDoc->getIDocumentFieldsAccess().LockExpFields(); + //selecting reference field 2 and reference field 3 and footnote 1 and footnote 2 + //selection is such that more than one and not all footnotes and ref fields are selected + pCursor->Move(fnMoveBackward); + pCursor->Move(fnMoveBackward); + //start marking + pCursor->SetMark(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //copying the selection to clipboard + pWrtShell->Copy(*xClpDoc); + //deleting selection mark after copy + pCursor->DeleteMark(); + //checking that the footnotes reference fields have same values after copy operation + uno::Any aAny; + sal_uInt16 aFormat; + //reference field 1 + pWrtShell->StartOfSection(); + SwField* pRef1 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef1->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef1->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(0)), aAny); + //reference field 2 + pCursor->Move(fnMoveForward); + SwField* pRef2 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef2->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef2->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //reference field 3 + pCursor->Move(fnMoveForward); + SwField* pRef3 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef3->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef3->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //moving cursor to the end of the document + pWrtShell->EndOfSection(); + //pasting the copied selection at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //old reference field 1 + SwField* pOldRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef13 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef13->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef13->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //old footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd1 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote1 + = pTextNd1->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote1(pFootnote1->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnote1.GetNumber()); + SwTextFootnote* pTFNote1 = static_cast(pFootnote1); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pTFNote1->GetSeqRefNo()); + //old footnote 2 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd2 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote2 + = pTextNd2->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote2(pFootnote2->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnote2.GetNumber()); + SwTextFootnote* pTFNote2 = static_cast(pFootnote2); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pTFNote2->GetSeqRefNo()); + //old footnote 3 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd3 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote3 + = pTextNd3->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote3(pFootnote3->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnote3.GetNumber()); + SwTextFootnote* pTFNote3 = static_cast(pFootnote3); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pTFNote3->GetSeqRefNo()); + //new reference field 1 + pCursor->Move(fnMoveForward); + SwField* pNewRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(3)), aAny); + //new footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd4 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote4 + = pTextNd4->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote4(pFootnote4->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnote4.GetNumber()); + SwTextFootnote* pTFNote4 = static_cast(pFootnote4); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pTFNote4->GetSeqRefNo()); + //moving the cursor to the starting of document + pWrtShell->StartOfSection(); + //pasting the selection again at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //new reference field 1 + SwField* pNewRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(4)), aAny); + //new footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd11 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote11 + = pTextNd11->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote11(pFootnote11->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), rFootnote11.GetNumber()); + SwTextFootnote* pTFNote11 = static_cast(pFootnote11); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pTFNote11->GetSeqRefNo()); + //old reference field 1 + pCursor->Move(fnMoveForward); + SwField* pOldRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef23 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef23->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef23->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //old footnote 1 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd12 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote12 + = pTextNd12->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote12(pFootnote12->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), rFootnote12.GetNumber()); + SwTextFootnote* pTFNote12 = static_cast(pFootnote12); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pTFNote12->GetSeqRefNo()); + //old footnote 2 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd13 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote13 + = pTextNd13->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote13(pFootnote13->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), rFootnote13.GetNumber()); + SwTextFootnote* pTFNote13 = static_cast(pFootnote13); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pTFNote13->GetSeqRefNo()); + //old footnote 3 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd14 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote14 + = pTextNd14->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote14(pFootnote14->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), rFootnote14.GetNumber()); + SwTextFootnote* pTFNote14 = static_cast(pFootnote14); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pTFNote14->GetSeqRefNo()); + //old reference field 4 + pCursor->Move(fnMoveForward); + SwField* pOldRef24 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef24->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef24->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //old reference field 5 + pCursor->Move(fnMoveForward); + SwField* pOldRef25 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef25->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef25->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(3)), aAny); + //old footnote 4 + pCursor->Move(fnMoveForward); + SwTextNode* pTextNd15 = pCursor->GetPointNode().GetTextNode(); + SwTextAttr* const pFootnote15 + = pTextNd15->GetTextAttrForCharAt(pCursor->GetPoint()->GetContentIndex(), RES_TXTATR_FTN); + const SwFormatFootnote& rFootnote15(pFootnote15->GetFootnote()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), rFootnote15.GetNumber()); + SwTextFootnote* pTFNote15 = static_cast(pFootnote15); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pTFNote15->GetSeqRefNo()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf63553) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + //inserting sequence field 1 + SwSetExpFieldType* pSeqType = static_cast( + pWrtShell->GetFieldType(SwFieldIds::SetExp, "Illustration")); + SwSetExpField aSetField1(pSeqType, "", SVX_NUM_ARABIC); + pWrtShell->InsertField2(aSetField1); + SwGetRefFieldType* pRefType + = static_cast(pWrtShell->GetFieldType(0, SwFieldIds::GetRef)); + //moving cursor to the starting of document + pWrtShell->StartOfSection(); + //inserting reference field 1 + SwGetRefField aGetField1(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(0), + sal_uInt16(0), REF_CONTENT); + pWrtShell->InsertField2(aGetField1); + //now we have ref1-seq1 + //moving the cursor + pCursor->Move(fnMoveForward); + //inserting sequence field 2 + SwSetExpField aSetField2(pSeqType, "", SVX_NUM_ARABIC); + pWrtShell->InsertField2(aSetField2); + //moving the cursor + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + //inserting reference field 2 + SwGetRefField aGetField2(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(1), + sal_uInt16(0), REF_CONTENT); + pWrtShell->InsertField2(aGetField2); + //now we have ref1-ref2-seq1-seq2 + //moving the cursor + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //inserting sequence field 3 + SwSetExpField aSetField3(pSeqType, "", SVX_NUM_ARABIC); + pWrtShell->InsertField2(aSetField3); + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //inserting reference field 3 + SwGetRefField aGetField3(pRefType, "Illustration", "", REF_SEQUENCEFLD, sal_uInt16(2), + sal_uInt16(0), REF_CONTENT); + pWrtShell->InsertField2(aGetField3); + //now after insertion we have ref1-ref2-ref3-seq1-seq2-seq3 + //updating the fields + IDocumentFieldsAccess& rField(pDoc->getIDocumentFieldsAccess()); + rField.UpdateExpFields(nullptr, true); + //creating new clipboard doc + rtl::Reference xClpDoc(new SwDoc()); + xClpDoc->SetClipBoard(true); + xClpDoc->getIDocumentFieldsAccess().LockExpFields(); + //selecting reference field 2 and 3 and sequence field 1 and 2 + //selection is such that more than one and not all sequence fields and reference fields are selected + //ref1-[ref2-ref3-seq1-seq2]-seq3 + pWrtShell->StartOfSection(); + pCursor->Move(fnMoveForward); + //start marking + pCursor->SetMark(); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + pCursor->Move(fnMoveForward); + //copying the selection to clipboard + pWrtShell->Copy(*xClpDoc); + //deleting selection mark after copy + pCursor->DeleteMark(); + //checking whether the sequence and reference fields have same values after copy operation + uno::Any aAny; + sal_uInt16 aFormat; + //reference field 1 + pWrtShell->StartOfSection(); + SwField* pRef1 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef1->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef1->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(0)), aAny); + //reference field 2 + pCursor->Move(fnMoveForward); + SwField* pRef2 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef2->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef2->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //reference field 3 + pCursor->Move(fnMoveForward); + SwField* pRef3 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pRef3->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pRef3->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeqF1 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pSeqF1->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF1->GetFieldName()); + //sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeqF2 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pSeqF2->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF2->GetFieldName()); + //sequence field 3 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeqF3 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pSeqF3->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeqF3->GetFieldName()); + //moving cursor to the end of the document + pWrtShell->EndOfSection(); + //pasting the copied selection at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //now we have ref1-ref2-ref3-seq1-seq2-seq3-nref1-nref2-nseq1-nseq2 + //old reference field 1 + SwField* pOldRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef13 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef13->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef13->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //old sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeq1 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pSeq1->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq1->GetFieldName()); + //old sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeq2 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pSeq2->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq2->GetFieldName()); + //old sequence field 3 + pCursor->Move(fnMoveForward); + SwSetExpField* pSeq3 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pSeq3->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pSeq3->GetFieldName()); + //new reference field 1 + pCursor->Move(fnMoveForward); + SwField* pNewRef11 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef11->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef11->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(4)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef12 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef12->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef12->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //new sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq1 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pNewSeq1->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq1->GetFieldName()); + //new sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq2 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pNewSeq2->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq2->GetFieldName()); + //moving the cursor to the starting of document + pWrtShell->StartOfSection(); + //pasting the selection again at current cursor position + pWrtShell->Paste(*xClpDoc); + //checking the fields, both new and old, for proper values + pWrtShell->StartOfSection(); + //now we have [nnref1-nnref2-nnseq1-nnseq2]-ref1-[ref2-ref3-seq1-seq2]-seq3-[nref1-nref2-nseq1-nseq2] + //new reference field 1 + SwField* pNewRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(6)), aAny); + //new reference field 2 + pCursor->Move(fnMoveForward); + SwField* pNewRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pNewRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pNewRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //new sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq11 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), pNewSeq11->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq11->GetFieldName()); + //new sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pNewSeq12 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), pNewSeq12->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pNewSeq12->GetFieldName()); + //old reference field 1 + pCursor->Move(fnMoveForward); + SwField* pOldRef21 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef21->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef21->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(0)), aAny); + //old reference field 2 + pCursor->Move(fnMoveForward); + SwField* pOldRef22 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef22->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef22->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(1)), aAny); + //old reference field 3 + pCursor->Move(fnMoveForward); + SwField* pOldRef23 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef23->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef23->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //old sequence field 1 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq11 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pOldSeq11->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq11->GetFieldName()); + //old sequence field 2 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq12 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), pOldSeq12->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq12->GetFieldName()); + //old sequence field 3 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq13 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(2), pOldSeq13->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq13->GetFieldName()); + //old reference field 4 + pCursor->Move(fnMoveForward); + SwField* pOldRef24 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef24->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef24->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(4)), aAny); + //old reference field 5 + pCursor->Move(fnMoveForward); + SwField* pOldRef25 = SwCursorShell::GetFieldAtCursor(pCursor, true); + aFormat = pOldRef25->GetFormat(); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_CONTENT), aFormat); + pOldRef25->QueryValue(aAny, sal_uInt16(FIELD_PROP_SHORT1)); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_uInt16(2)), aAny); + //old sequence field 4 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq14 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pOldSeq14->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq14->GetFieldName()); + //old sequence field 5 + pCursor->Move(fnMoveForward); + SwSetExpField* pOldSeq15 + = static_cast(SwCursorShell::GetFieldAtCursor(pCursor, true)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), pOldSeq15->GetSeqNumber()); + CPPUNIT_ASSERT_EQUAL(OUString("Number range Illustration"), pOldSeq15->GetFieldName()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf74230) +{ + createSwDoc(); + //exporting the empty document to ODT via TempFile + save("writer8"); + CPPUNIT_ASSERT(maTempFile.IsValid()); + //loading an XML DOM of the "styles.xml" of the TempFile + xmlDocUniquePtr pXmlDoc = parseExport("styles.xml"); + //pXmlDoc should not be null + CPPUNIT_ASSERT(pXmlDoc); + //asserting XPath in loaded XML DOM + assertXPath(pXmlDoc, "//office:styles/style:default-style[@style:family='graphic']/" + "style:graphic-properties[@svg:stroke-color='#3465a4']"_ostr); + assertXPath(pXmlDoc, "//office:styles/style:default-style[@style:family='graphic']/" + "style:graphic-properties[@draw:fill-color='#729fcf']"_ostr); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf80663) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //Inserting 2x2 Table + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 2, 2); + //Checking for the number of rows and columns + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the first row + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->SelTableRow(); //selects the first row + pWrtShell->DeleteRow(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the second row + pWrtShell->GoNextCell(); //moves the cursor to next cell + pWrtShell->SelTableRow(); //selects the second row + pWrtShell->DeleteRow(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the first column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->SelTableCol(); //selects first column + pWrtShell->DeleteCol(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Deleting the second column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->GoNextCell(); //moves the cursor to next cell + pWrtShell->SelTableCol(); //selects second column + pWrtShell->DeleteCol(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf57197) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //Inserting 1x1 Table + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 1, 1); + //Checking for the number of rows and columns + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one row before the existing row + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertRow(1, false); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one row after the existing row + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertRow(1, true); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one column before the existing column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertCol(1, false); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Inserting one column after the existing column + pWrtShell->StartOfSection(); //moves the cursor to the start of Doc + pWrtShell->InsertCol(1, true); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + //Redo changes + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTable->getColumns()->getCount()); + //Undo changes + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf131990) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + CPPUNIT_ASSERT(!pWrtShell->Up(false, 1, true)); + CPPUNIT_ASSERT(!pWrtShell->Down(false, 1, true)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf90808) +{ + createSwDoc(); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextRange = xTextDocument->getText(); + uno::Reference xText = xTextRange->getText(); + uno::Reference xCursor(xText->createTextCursor(), uno::UNO_QUERY); + //inserting text into document so that the paragraph is not empty + xText->setString("Hello World!"); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + //creating bookmark 1 + uno::Reference xHeadingBookmark1( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xHeadingName1(xHeadingBookmark1, uno::UNO_QUERY); + xHeadingName1->setName("__RefHeading__1"); + //moving cursor to the starting of paragraph + xCursor->gotoStartOfParagraph(false); + //inserting the bookmark in paragraph + xText->insertTextContent(xCursor, xHeadingBookmark1, true); + //creating bookmark 2 + uno::Reference xHeadingBookmark2( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xHeadingName2(xHeadingBookmark2, uno::UNO_QUERY); + xHeadingName2->setName("__RefHeading__2"); + //inserting the bookmark in same paragraph, at the end + //only one bookmark of this type is allowed in each paragraph an exception of com.sun.star.lang.IllegalArgumentException must be thrown when inserting the other bookmark in same paragraph + xCursor->gotoEndOfParagraph(true); + CPPUNIT_ASSERT_THROW(xText->insertTextContent(xCursor, xHeadingBookmark2, true), + css::lang::IllegalArgumentException); + //now testing for __RefNumPara__ + //creating bookmark 1 + uno::Reference xNumBookmark1( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xNumName1(xNumBookmark1, uno::UNO_QUERY); + xNumName1->setName("__RefNumPara__1"); + //moving cursor to the starting of paragraph + xCursor->gotoStartOfParagraph(false); + //inserting the bookmark in paragraph + xText->insertTextContent(xCursor, xNumBookmark1, true); + //creating bookmark 2 + uno::Reference xNumBookmark2( + xFact->createInstance("com.sun.star.text.Bookmark"), uno::UNO_QUERY); + uno::Reference xNumName2(xNumBookmark2, uno::UNO_QUERY); + xNumName2->setName("__RefNumPara__2"); + //inserting the bookmark in same paragraph, at the end + //only one bookmark of this type is allowed in each paragraph an exception of com.sun.star.lang.IllegalArgumentException must be thrown when inserting the other bookmark in same paragraph + xCursor->gotoEndOfParagraph(true); + CPPUNIT_ASSERT_THROW(xText->insertTextContent(xCursor, xNumBookmark2, true), + css::lang::IllegalArgumentException); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf97601) +{ + // Instructions from the bugreport to trigger an infinite loop. + createSwDoc("tdf97601.odt"); + uno::Reference xEmbeddedObjectsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xEmbeddedObjects + = xEmbeddedObjectsSupplier->getEmbeddedObjects(); + uno::Reference xChart; + xEmbeddedObjects->getByName("myChart") >>= xChart; + uno::Reference xChartComponent; + xChart->getPropertyValue("Component") >>= xChartComponent; + uno::Sequence> aDataSequences + = xChartComponent->getDataSequences(); + uno::Reference xChartState(xChart, uno::UNO_QUERY); + xChartState->getExtendedControlOverEmbeddedObject()->changeState(1); + uno::Reference xDataSequenceModifiable(aDataSequences[2]->getValues(), + uno::UNO_QUERY); + xDataSequenceModifiable->setModified(true); + + // Make sure that the chart is marked as modified. + uno::Reference xModifiable(xChartComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xModifiable->isModified())); + calcLayout(); + // This never returned. + Scheduler::ProcessEventsToIdle(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf75137) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(true); + pWrtShell->InsertFootnote("This is first footnote"); + SwNodeOffset firstIndex = pShellCursor->GetPointNode().GetIndex(); + pShellCursor->GotoFootnoteAnchor(); + pWrtShell->InsertFootnote("This is second footnote"); + pWrtShell->Up(false); + SwNodeOffset secondIndex = pShellCursor->GetPointNode().GetIndex(); + pWrtShell->Down(false); + SwNodeOffset thirdIndex = pShellCursor->GetPointNode().GetIndex(); + CPPUNIT_ASSERT_EQUAL(firstIndex, thirdIndex); + CPPUNIT_ASSERT(firstIndex != secondIndex); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf83798) +{ + createSwDoc("tdf83798.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->GotoNextTOXBase(); + const SwTOXBase* pTOXBase = pWrtShell->GetCurTOX(); + pWrtShell->UpdateTableOf(*pTOXBase); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->Move(fnMoveBackward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("Table of Contents"), pCursor->GetText()); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->DeleteMark(); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("1"), pCursor->GetText()); + pCursor->DeleteMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("1.A"), pCursor->GetText()); + pCursor->DeleteMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("2"), pCursor->GetText()); + pCursor->DeleteMark(); + pCursor->Move(fnMoveForward, GoInNode); + pCursor->SetMark(); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + pCursor->Move(fnMoveForward, GoInContent); + CPPUNIT_ASSERT_EQUAL(OUString("2.A"), pCursor->GetText()); + pCursor->DeleteMark(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf89714) +{ + createSwDoc(); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + uno::Reference xInterface(xFact->createInstance("com.sun.star.text.Defaults"), + uno::UNO_QUERY); + uno::Reference xPropState(xInterface, uno::UNO_QUERY); + //enabled Paragraph Orphan and Widows by default starting in LO5.1 + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int8(2)), xPropState->getPropertyDefault("ParaOrphans")); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int8(2)), xPropState->getPropertyDefault("ParaWidows")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf130287) +{ + //create a new writer document + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + //insert a 1-cell table in the newly created document + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 1, 1); + //checking for the row and column + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTable->getColumns()->getCount()); + uno::Reference xCell = xTable->getCellByName("A1"); + uno::Reference xCellText(xCell, uno::UNO_QUERY); + uno::Reference xParagraph = getParagraphOfText(1, xCellText); + // they were 2 (orphan/widow control enabled unnecessarily in Table Contents paragraph style) + CPPUNIT_ASSERT_EQUAL(sal_Int8(0), getProperty(xParagraph, "ParaOrphans")); + CPPUNIT_ASSERT_EQUAL(sal_Int8(0), getProperty(xParagraph, "ParaWidows")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testPropertyDefaults) +{ + createSwDoc(); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + uno::Reference xInterface(xFact->createInstance("com.sun.star.text.Defaults"), + uno::UNO_QUERY); + uno::Reference xPropSet(xInterface, uno::UNO_QUERY_THROW); + uno::Reference xPropState(xInterface, uno::UNO_QUERY); + //testing CharFontName from style::CharacterProperties + //getting property default + uno::Any aCharFontName = xPropState->getPropertyDefault("CharFontName"); + //asserting property default and defaults received from "css.text.Defaults" service + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharFontName"), aCharFontName); + //changing the default value + xPropSet->setPropertyValue("CharFontName", uno::Any(OUString("Symbol"))); + CPPUNIT_ASSERT_EQUAL(uno::Any(OUString("Symbol")), xPropSet->getPropertyValue("CharFontName")); + //resetting the value to default + xPropState->setPropertyToDefault("CharFontName"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharFontName"), aCharFontName); + //testing CharHeight from style::CharacterProperties + //getting property default + uno::Any aCharHeight = xPropState->getPropertyDefault("CharHeight"); + //asserting property default and defaults received from "css.text.Defaults" service + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharHeight"), aCharHeight); + //changing the default value + xPropSet->setPropertyValue("CharHeight", uno::Any(float(14))); + CPPUNIT_ASSERT_EQUAL(uno::Any(float(14)), xPropSet->getPropertyValue("CharHeight")); + //resetting the value to default + xPropState->setPropertyToDefault("CharHeight"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharHeight"), aCharHeight); + //testing CharWeight from style::CharacterProperties + uno::Any aCharWeight = xPropSet->getPropertyValue("CharWeight"); + //changing the default value + xPropSet->setPropertyValue("CharWeight", uno::Any(float(awt::FontWeight::BOLD))); + CPPUNIT_ASSERT_EQUAL(uno::Any(float(awt::FontWeight::BOLD)), + xPropSet->getPropertyValue("CharWeight")); + //resetting the value to default + xPropState->setPropertyToDefault("CharWeight"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharWeight"), aCharWeight); + //testing CharUnderline from style::CharacterProperties + uno::Any aCharUnderline = xPropSet->getPropertyValue("CharUnderline"); + //changing the default value + xPropSet->setPropertyValue("CharUnderline", uno::Any(sal_Int16(awt::FontUnderline::SINGLE))); + CPPUNIT_ASSERT_EQUAL(uno::Any(sal_Int16(awt::FontUnderline::SINGLE)), + xPropSet->getPropertyValue("CharUnderline")); + //resetting the value to default + xPropState->setPropertyToDefault("CharUnderline"); + CPPUNIT_ASSERT_EQUAL(xPropSet->getPropertyValue("CharUnderline"), aCharUnderline); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTableBackgroundColor) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwInsertTableOptions TableOpt(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(TableOpt, 3, 3); //Inserting Table + //Checking Rows and Columns of Inserted Table + uno::Reference xTable(getParagraphOrTable(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTable->getColumns()->getCount()); + pWrtShell->StartOfSection(); + pWrtShell->SelTableRow(); //Selecting First Row + pWrtShell->ClearMark(); + //Modifying the color of Table Box + pWrtShell->SetBoxBackground( + SvxBrushItem(Color(sal_Int32(0xFF00FF)), sal_Int16(RES_BACKGROUND))); + //Checking cells for background color only A1 should be modified + uno::Reference xCell; + xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT_EQUAL(Color(0xFF00FF), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("A2"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("A3"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("B1"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("B2"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("B3"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("C1"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("C2"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); + xCell = xTable->getCellByName("C3"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xCell, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf88899) +{ + createSwDoc(); + uno::Reference xDocumentPropertiesSupplier( + mxComponent, uno::UNO_QUERY); + uno::Reference xProps( + xDocumentPropertiesSupplier->getDocumentProperties()); + uno::Reference xUserProps = xProps->getUserDefinedProperties(); + css::util::DateTime aDateTime + = { sal_uInt32(1234567), sal_uInt16(3), sal_uInt16(3), sal_uInt16(3), + sal_uInt16(10), sal_uInt16(11), sal_uInt16(2014), true }; + xUserProps->addProperty("dateTime", sal_Int16(beans::PropertyAttribute::OPTIONAL), + uno::Any(aDateTime)); + uno::Reference xFact(mxComponent, uno::UNO_QUERY); + uno::Reference xTextField( + xFact->createInstance("com.sun.star.text.textfield.docinfo.Custom"), uno::UNO_QUERY); + //Setting Name Property + uno::Reference xPropSet(xTextField, uno::UNO_QUERY_THROW); + xPropSet->setPropertyValue("Name", uno::Any(OUString("dateTime"))); + //Setting NumberFormat + uno::Reference xNumberFormatsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference xNumFormat(xNumberFormatsSupplier->getNumberFormats(), + uno::UNO_QUERY); + css::lang::Locale alocale; + alocale.Language = "en"; + alocale.Country = "US"; + sal_Int16 key = xNumFormat->getStandardFormat(util::NumberFormat::DATETIME, alocale); + xPropSet->setPropertyValue("NumberFormat", uno::Any(key)); + //Inserting Text Content + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextRange = xTextDocument->getText(); + uno::Reference xText = xTextRange->getText(); + xText->insertTextContent(xTextRange, xTextField, true); + //Retrieving the contents for verification + CPPUNIT_ASSERT_EQUAL(OUString("11/10/14 03:03 AM"), xTextField->getPresentation(false)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf151605) +{ + createSwDoc("tdf151605.odt"); + + // disable IncludeHiddenText + std::shared_ptr batch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Writer::FilterFlags::ASCII::IncludeHiddenText::set(false, batch); + officecfg::Office::Writer::Content::Display::ShowWarningHiddenSection::set(false, batch); + batch->commit(); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + + uno::Sequence aPropertyValues = comphelper::InitPropertySequence( + { { "SelectedFormat", uno::Any(static_cast(SotClipboardFormatId::STRING)) } }); + + // Paste as Unformatted text + dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aPropertyValues); + + CPPUNIT_ASSERT_EQUAL(OUString("Before"), getParagraph(1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("After"), getParagraph(2)->getString()); + + // re-enable it + officecfg::Office::Writer::FilterFlags::ASCII::IncludeHiddenText::set(true, batch); + officecfg::Office::Writer::Content::Display::ShowWarningHiddenSection::set(true, batch); + batch->commit(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf90362) +{ + createSwDoc("tdf90362.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + // Ensure correct initial setting + std::shared_ptr batch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(false, batch); + batch->commit(); + // First check if the end of the second paragraph is indeed protected. + pWrtShell->EndPara(); + pWrtShell->Down(/*bSelect=*/false); + CPPUNIT_ASSERT_EQUAL(true, pWrtShell->HasReadonlySel()); + + // Then enable ignoring of protected areas and make sure that this time the cursor is read-write. + officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(true, batch); + batch->commit(); + CPPUNIT_ASSERT_EQUAL(false, pWrtShell->HasReadonlySel()); + // Clean up, otherwise following tests will have that option set + officecfg::Office::Writer::Cursor::Option::IgnoreProtectedArea::set(false, batch); + batch->commit(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUndoDelAsCharTdf107512) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + sw::UndoManager& rUndoManager(pDoc->GetUndoManager()); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + SwCursorShell* pShell(pDoc->GetEditShell()); + SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items); + SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items); + rIDCO.InsertString(*pShell->GetCursor(), "foo"); + pShell->ClearMark(); + SwFormatAnchor anchor(RndStdIds::FLY_AS_CHAR); + frameSet.Put(anchor); + Graphic grf; + pShell->SttEndDoc(true); + CPPUNIT_ASSERT(rIDCO.InsertGraphic(*pShell->GetCursor(), OUString(), OUString(), &grf, + &frameSet, &grfSet, nullptr)); + pShell->SttEndDoc(false); + CPPUNIT_ASSERT(rIDCO.InsertGraphic(*pShell->GetCursor(), OUString(), OUString(), &grf, + &frameSet, &grfSet, nullptr)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + SvxCharHiddenItem hidden(true, RES_CHRATR_HIDDEN); + pShell->SelectTextModel(1, 4); + rIDCO.InsertPoolItem(*pShell->GetCursor(), hidden); + // now we have "\1foo\1" with the "foo" hidden + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); + SfxPoolItem const* pItem; + SfxItemSet query(pDoc->GetAttrPool(), svl::Items); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + + // delete from the start + pShell->SelectTextModel(0, 4); + rIDCO.DeleteAndJoin(*pShell->GetCursor()); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Redo(); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 0, 1); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + + // delete from the end + pShell->SelectTextModel(1, 5); + rIDCO.DeleteAndJoin(*pShell->GetCursor()); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Redo(); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + rUndoManager.Undo(); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 0, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->GetTextAttrForCharAt( + 4, RES_TXTATR_FLYCNT)); + CPPUNIT_ASSERT_EQUAL(size_t(2), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + CPPUNIT_ASSERT_EQUAL( + OUString(OUStringChar(CH_TXTATR_BREAKWORD) + u"foo" + OUStringChar(CH_TXTATR_BREAKWORD)), + pShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 4, 5); + CPPUNIT_ASSERT_EQUAL(SfxItemState::DEFAULT, + query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + query.ClearItem(RES_CHRATR_HIDDEN); + pShell->GetCursor()->GetPointNode().GetTextNode()->GetParaAttr(query, 1, 4); + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, query.GetItemState(RES_CHRATR_HIDDEN, false, &pItem)); + CPPUNIT_ASSERT(static_cast(pItem)->GetValue()); + query.ClearItem(RES_CHRATR_HIDDEN); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUndoCharAttribute) +{ + // Create a new empty Writer document + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + // Insert some text + rIDCO.InsertString(*pCursor, "This will be bolded"); + // Position of word 9876543210 + // Use cursor to select part of text + pCursor->SetMark(); + for (int i = 0; i < 9; i++) + { + pCursor->Move(fnMoveBackward); + } + // Check that correct text was selected + CPPUNIT_ASSERT_EQUAL(OUString("be bolded"), pCursor->GetText()); + // Apply a "Bold" attribute to selection + SvxWeightItem aWeightItem(WEIGHT_BOLD, RES_CHRATR_WEIGHT); + rIDCO.InsertPoolItem(*pCursor, aWeightItem); + SfxItemSet aSet(pDoc->GetAttrPool(), svl::Items); + // Adds selected text's attributes to aSet + pCursor->GetPointNode().GetTextNode()->GetParaAttr(aSet, 10, 19); + SfxPoolItem const* pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); + // Check that bold is active on the selection; checks if it's in aSet + CPPUNIT_ASSERT_EQUAL(true, (*pPoolItem == aWeightItem)); + // Invoke Undo + rUndoManager.Undo(); + // Check that bold is no longer active + aSet.ClearItem(RES_CHRATR_WEIGHT); + pCursor->GetPointNode().GetTextNode()->GetParaAttr(aSet, 10, 19); + pPoolItem = aSet.GetItem(RES_CHRATR_WEIGHT); + CPPUNIT_ASSERT_EQUAL(false, (*pPoolItem == aWeightItem)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUndoDelAsChar) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + sw::UndoManager& rUndoManager(pDoc->GetUndoManager()); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + SwCursorShell* pShell(pDoc->GetEditShell()); + SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items); + SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items); + SwFormatAnchor anchor(RndStdIds::FLY_AS_CHAR); + frameSet.Put(anchor); + Graphic grf; + CPPUNIT_ASSERT(rIDCO.InsertGraphic(*pShell->GetCursor(), OUString(), OUString(), &grf, + &frameSet, &grfSet, nullptr)); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + pShell->SetMark(); + pShell->Left(1, SwCursorSkipMode::Chars); + rIDCO.DeleteAndJoin(*pShell->GetCursor()); + CPPUNIT_ASSERT_EQUAL(size_t(0), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(!pShell->GetCursor()->GetPointNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + rUndoManager.Redo(); + CPPUNIT_ASSERT_EQUAL(size_t(0), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(!pShell->GetCursor()->GetPointNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); + rUndoManager.Undo(); + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetFlyCount(FLYCNTTYPE_GRF)); + CPPUNIT_ASSERT(pShell->GetCursor()->GetPointNode().GetTextNode()->HasHints()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), pShell->GetCursor()->GetPointNode().GetTextNode()->Len()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf86639) +{ + createSwDoc("tdf86639.rtf"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwTextFormatColl* pColl = pDoc->FindTextFormatCollByName(u"Heading"_ustr); + pWrtShell->SetTextFormatColl(pColl); + OUString aExpected = pColl->GetAttrSet().GetFont().GetFamilyName(); + // This was Calibri, should be Liberation Sans. + CPPUNIT_ASSERT_EQUAL(aExpected, + getProperty(getRun(getParagraph(1), 1), "CharFontName")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf90883TableBoxGetCoordinates) +{ + createSwDoc("tdf90883.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Down(true); + SwSelBoxes aBoxes; + ::GetTableSel(*pWrtShell, aBoxes); + CPPUNIT_ASSERT_EQUAL(2, static_cast(aBoxes.size())); + Point pos(aBoxes[0]->GetCoordinates()); + CPPUNIT_ASSERT_EQUAL(1, static_cast(pos.X())); + CPPUNIT_ASSERT_EQUAL(1, static_cast(pos.Y())); + pos = aBoxes[1]->GetCoordinates(); + CPPUNIT_ASSERT_EQUAL(1, static_cast(pos.X())); + CPPUNIT_ASSERT_EQUAL(2, static_cast(pos.Y())); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testEmbeddedDataSource) +{ + // Initially no data source. + uno::Reference xComponentContext( + comphelper::getProcessComponentContext()); + uno::Reference xDatabaseContext + = sdb::DatabaseContext::create(xComponentContext); + CPPUNIT_ASSERT(!xDatabaseContext->hasByName("calc-data-source")); + + // Load: should have a component and a data source, too. + // Path with "#" must not cause issues + createSwDoc("hash%23path/embedded-data-source.odt"); + CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source")); + + // Data source has a table named Sheet1. + uno::Reference xDataSource(xDatabaseContext->getByName("calc-data-source"), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xDataSource.is()); + auto xConnection = xDataSource->getConnection("", ""); + uno::Reference xTables + = css::uno::Reference(xConnection, uno::UNO_QUERY_THROW) + ->getTables(); + CPPUNIT_ASSERT(xTables.is()); + CPPUNIT_ASSERT(xTables->hasByName("Sheet1")); + xConnection->close(); + + // Reload: should still have a component and a data source, too. + saveAndReload("writer8"); + CPPUNIT_ASSERT(mxComponent.is()); + CPPUNIT_ASSERT(xDatabaseContext->hasByName("calc-data-source")); + + // Data source has a table named Sheet1 after saving to a different directory. + xDataSource.set(xDatabaseContext->getByName("calc-data-source"), uno::UNO_QUERY); + CPPUNIT_ASSERT(xDataSource.is()); + xConnection = xDataSource->getConnection("", ""); + xTables = css::uno::Reference(xConnection, uno::UNO_QUERY_THROW) + ->getTables(); + CPPUNIT_ASSERT(xTables.is()); + CPPUNIT_ASSERT(xTables->hasByName("Sheet1")); + xConnection->close(); + + // Close: should not have a data source anymore. + mxComponent->dispose(); + mxComponent.clear(); + CPPUNIT_ASSERT(!xDatabaseContext->hasByName("calc-data-source")); + + // Now open again the saved result, and instead of 'save as', just 'save'. + mxComponent = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument"); + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + xStorable->store(); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUnoCursorPointer) +{ + auto xDocComponent( + loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument")); + auto pxDocDocument(dynamic_cast(xDocComponent.get())); + CPPUNIT_ASSERT(pxDocDocument); + SwDoc* const pDoc(pxDocDocument->GetDocShell()->GetDoc()); + std::unique_ptr pIdx(new SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1)); + std::unique_ptr pPos(new SwPosition(*pIdx)); + sw::UnoCursorPointer pCursor(pDoc->CreateUnoCursor(*pPos)); + CPPUNIT_ASSERT(static_cast(pCursor)); + pPos.reset(); // we need to kill the SwPosition before disposing + pIdx.reset(); // we need to kill the SwNodeIndex before disposing + xDocComponent->dispose(); + CPPUNIT_ASSERT(!static_cast(pCursor)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTextTableCellNames) +{ + sal_Int32 nCol, nRow2; + SwXTextTable::GetCellPosition(u"z1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(51), nCol); + SwXTextTable::GetCellPosition(u"AA1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(52), nCol); + SwXTextTable::GetCellPosition(u"AB1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(53), nCol); + SwXTextTable::GetCellPosition(u"BB1", nCol, nRow2); + CPPUNIT_ASSERT_EQUAL(static_cast(105), nCol); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testShapeAnchorUndo) +{ + createSwDoc("draw-anchor-undo.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + SdrObject* pObject = pPage->GetObj(0); + tools::Rectangle aOrigLogicRect(pObject->GetLogicRect()); + + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + rUndoManager.StartUndo(SwUndoId::START, nullptr); + + pWrtShell->SelectObj(Point(), 0, pObject); + + pWrtShell->GetDrawView()->MoveMarkedObj(Size(100, 100)); + pWrtShell->ChgAnchor(RndStdIds::FLY_AT_PARA, true); + + rUndoManager.EndUndo(SwUndoId::END, nullptr); + + CPPUNIT_ASSERT(aOrigLogicRect != pObject->GetLogicRect()); + + rUndoManager.Undo(); + + CPPUNIT_ASSERT_EQUAL(pObject->GetLogicRect(), aOrigLogicRect); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf127635) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + + SwXTextDocument* pXTextDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXTextDocument); + emulateTyping(*pXTextDocument, u"a b"); + + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + + //Select 'a' + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 1, /*bBasicCall=*/false); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // hide + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + emulateTyping(*pXTextDocument, u"c d"); + + SwEditShell* const pEditShell(pDoc->GetEditShell()); + // accept all redlines + while (pEditShell->GetRedlineCount()) + pEditShell->AcceptRedline(0); + + // Without the fix in place, this test would have failed with + // - Expected: C d b + // - Actual : Cd b + CPPUNIT_ASSERT_EQUAL(OUString("C d b"), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testDde) +{ +#if HAVE_FEATURE_UI + // Type asdf and copy it. + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("asdf"); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 4, /*bBasicCall=*/false); + uno::Sequence aPropertyValues; + dispatchCommand(mxComponent, ".uno:Copy", aPropertyValues); + + // Go before the selection and paste as a DDE link. + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + aPropertyValues = comphelper::InitPropertySequence( + { { "SelectedFormat", uno::Any(static_cast(SotClipboardFormatId::LINK)) } }); + dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aPropertyValues); + + // Make sure that the document starts with a field now, and its expanded string value contains asdf. + const uno::Reference xField = getRun(getParagraph(1), 1); + CPPUNIT_ASSERT_EQUAL(OUString("TextField"), getProperty(xField, "TextPortionType")); + CPPUNIT_ASSERT(xField->getString().endsWith("asdf")); +#endif +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testDocModState) +{ + //creating a new writer document via the XDesktop(to have more shells etc.) + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + //checking the state of the document via IDocumentState + IDocumentState& rState(pDoc->getIDocumentState()); + //the state should not be modified + CPPUNIT_ASSERT(!(rState.IsModified())); + //checking the state of the document via SfxObjectShell + SwDocShell* pShell(pDoc->GetDocShell()); + CPPUNIT_ASSERT(!(pShell->IsModified())); + + IdleTask::waitUntilIdleDispatched(); + + //again checking for the state via IDocumentState + CPPUNIT_ASSERT(!(rState.IsModified())); + //again checking for the state via SfxObjectShell + CPPUNIT_ASSERT(!(pShell->IsModified())); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf94804) +{ + //create new writer document + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + //get cursor for making bookmark at a particular location + SwPaM* pCrsr = pDoc->GetEditShell()->GetCursor(); + IDocumentMarkAccess* pIDMAccess(pDoc->getIDocumentMarkAccess()); + //make first bookmark, CROSSREF_HEADING, with *empty* name + sw::mark::IMark* pMark1( + pIDMAccess->makeMark(*pCrsr, "", IDocumentMarkAccess::MarkType::CROSSREF_HEADING_BOOKMARK, + ::sw::mark::InsertMode::New)); + //get the new(autogenerated) bookmark name + OUString bookmark1name = pMark1->GetName(); + //match the bookmark name, it should be like "__RefHeading__**" + CPPUNIT_ASSERT(bookmark1name.match("__RefHeading__")); + //make second bookmark, CROSSREF_NUMITEM, with *empty* name + sw::mark::IMark* pMark2( + pIDMAccess->makeMark(*pCrsr, "", IDocumentMarkAccess::MarkType::CROSSREF_NUMITEM_BOOKMARK, + ::sw::mark::InsertMode::New)); + //get the new(autogenerated) bookmark name + OUString bookmark2name = pMark2->GetName(); + //match the bookmark name, it should be like "__RefNumPara__**" + CPPUNIT_ASSERT(bookmark2name.match("__RefNumPara__")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testUnicodeNotationToggle) +{ + createSwDoc("unicodeAltX.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + OUString sOriginalDocString; + OUString sDocString; + OUString sExpectedString; + uno::Sequence aPropertyValues; + + pWrtShell->EndPara(); + sOriginalDocString = pWrtShell->GetCursor()->GetPointNode().GetTextNode()->GetText(); + CPPUNIT_ASSERT_EQUAL(OUString("uU+002b"), sOriginalDocString); + + dispatchCommand(mxComponent, ".uno:UnicodeNotationToggle", aPropertyValues); + sExpectedString = "u+"; + sDocString = pWrtShell->GetCursor()->GetPointNode().GetTextNode()->GetText(); + CPPUNIT_ASSERT_EQUAL(sDocString, sExpectedString); + + dispatchCommand(mxComponent, ".uno:UnicodeNotationToggle", aPropertyValues); + sDocString = pWrtShell->GetCursor()->GetPointNode().GetTextNode()->GetText(); + CPPUNIT_ASSERT_EQUAL(sDocString, sOriginalDocString); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf34957) +{ + createSwDoc("tdf34957.odt"); + // table with "keep with next" always started on a new page if the table was large, + // regardless of whether it was already kept with the previous paragraph, + // or whether the following paragraph actually fit on the same page (MAB 3.6 - 5.0) + CPPUNIT_ASSERT_EQUAL(OUString("Row 1"), + parseDump("/root/page[2]/body/tab[1]/row[2]/cell[1]/txt"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Row 1"), + parseDump("/root/page[4]/body/tab[1]/row[2]/cell[1]/txt"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf89954) +{ + createSwDoc("tdf89954.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->EndPara(); + SwXTextDocument* pXTextDocument = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pXTextDocument); + emulateTyping(*pXTextDocument, u"test."); + + SwNodeIndex aNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1); + // Placeholder character for the comment anchor was ^A (CH_TXTATR_BREAKWORD), not (CH_TXTATR_INWORD). + // As a result, autocorrect did not turn the 't' input into 'T'. + CPPUNIT_ASSERT_EQUAL(u"Tes\uFFF9t. Test."_ustr, aNodeIndex.GetNode().GetTextNode()->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf89720) +{ + createSwDoc("tdf89720.odt"); + SwDoc* pDoc = getSwDoc(); + SwView* pView = pDoc->GetDocShell()->GetView(); + SwPostItMgr* pPostItMgr = pView->GetPostItMgr(); + for (std::unique_ptr const& pItem : *pPostItMgr) + { + if (pItem->mpPostIt->IsFollow()) + // This was non-0: reply comments had a text range overlay, + // resulting in unexpected dark color. + CPPUNIT_ASSERT(!pItem->mpPostIt->TextRange()); + } +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf88986) +{ + // Create a text shell. + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwView* pView = pDoc->GetDocShell()->GetView(); + SwTextShell aShell(*pView); + + // Create the item set that is normally passed to the insert frame dialog. + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwFlyFrameAttrMgr aMgr(true, pWrtShell, Frmmgr_Type::TEXT, nullptr); + SfxItemSet aSet = aShell.CreateInsertFrameItemSet(aMgr); + + // This was missing along with the gradient and other tables. + CPPUNIT_ASSERT(aSet.HasItem(SID_COLOR_TABLE)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf78150) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("foobar"); + + CPPUNIT_ASSERT_EQUAL(OUString("foobar"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:DelToStartOfWord", {}); + + // Without the fix, test fails with: + // equality assertion failed + // - Expected: + // - Actual : f + CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf138873) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->Insert("A B C"); + + CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); + + // Select B + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 2, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 1, /*bBasicCall=*/false); + + pWrtShell->Insert("DDD"); + + CPPUNIT_ASSERT_EQUAL(OUString("A DDD C"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); + + // Select B and C + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 2, /*bBasicCall=*/false); + + dispatchCommand(mxComponent, ".uno:Copy", {}); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + // Without the fix in place, this test would have failed with + // - Expected: A B C + // - Actual : A CB CB + CPPUNIT_ASSERT_EQUAL(OUString("A B C"), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf87922) +{ + // Create an SwDrawTextInfo. + createSwDoc("tdf87922.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwScriptInfo* pScriptInfo = nullptr; + // Get access to the single paragraph in the document. + SwNodeIndex aNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1); + const OUString& rText = aNodeIndex.GetNode().GetTextNode()->GetText(); + sal_Int32 nLength = rText.getLength(); + SwDrawTextInfo aDrawTextInfo(pWrtShell, *pWrtShell->GetOut(), pScriptInfo, rText, + TextFrameIndex(0), TextFrameIndex(nLength)); + // Root -> page -> body -> text. + SwTextFrame* pTextFrame + = static_cast(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()); + aDrawTextInfo.SetFrame(pTextFrame); + + // If no color background color is found, assume white. + Color* pColor = sw::GetActiveRetoucheColor(); + *pColor = COL_WHITE; + + // Make sure that automatic color on black background is white, not black. + vcl::Font aFont; + aDrawTextInfo.ApplyAutoColor(&aFont); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, aFont.GetColor()); +} + +#if HAVE_MORE_FONTS +namespace +{ +struct PortionItem +{ + PortionItem(OUString const& sItemType, sal_Int32 nLength, PortionType nTextType) + : msItemType(sItemType) + , mnLength(nLength) + , mnTextType(nTextType) + { + } + + OUString msItemType; + sal_Int32 mnLength; + PortionType mnTextType; +}; + +class PortionHandler : public SwPortionHandler +{ +public: + std::vector mPortionItems; + explicit PortionHandler() + : SwPortionHandler() + { + } + + void clear() { mPortionItems.clear(); } + + virtual void Text(TextFrameIndex nLength, PortionType nType) override + { + mPortionItems.emplace_back("text", sal_Int32(nLength), nType); + } + + virtual void Special(TextFrameIndex nLength, const OUString& /*rText*/, + PortionType nType) override + { + mPortionItems.emplace_back("special", sal_Int32(nLength), nType); + } + + virtual void LineBreak() override + { + mPortionItems.emplace_back("line_break", 0, PortionType::NONE); + } + + virtual void Skip(TextFrameIndex nLength) override + { + mPortionItems.emplace_back("skip", sal_Int32(nLength), PortionType::NONE); + } + + virtual void Finish() override { mPortionItems.emplace_back("finish", 0, PortionType::NONE); } +}; +} +#endif + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf77014) +{ +#if HAVE_MORE_FONTS + // The problem described in the bug tdf#77014 is that the input + // field text ("ThisIsAllOneWord") is broken up on linebreak, but + // it should be in one piece (like normal text). + + // This test checks that the input field is in one piece and if the + // input field has more words, it is broken up at the correct place. + + createSwDoc("tdf77014.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + SwTextFrame* pTextFrame + = static_cast(pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()); + + PortionHandler aHandler; + pTextFrame->VisitPortions(aHandler); + + { + // Input Field - "One Two Three Four Five" = 25 chars + CPPUNIT_ASSERT_EQUAL(OUString("text"), aHandler.mPortionItems[0].msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(25), aHandler.mPortionItems[0].mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, aHandler.mPortionItems[0].mnTextType); + + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), aHandler.mPortionItems[1].msItemType); + + CPPUNIT_ASSERT_EQUAL(OUString("finish"), aHandler.mPortionItems[2].msItemType); + } + + aHandler.clear(); + + pTextFrame = static_cast(pTextFrame->GetNext()); + pTextFrame->VisitPortions(aHandler); + + { + // Input Field - "ThisIsAllOneWord" = 18 chars + CPPUNIT_ASSERT_EQUAL(OUString("text"), aHandler.mPortionItems[0].msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(18), aHandler.mPortionItems[0].mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, aHandler.mPortionItems[0].mnTextType); + + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), aHandler.mPortionItems[1].msItemType); + + CPPUNIT_ASSERT_EQUAL(OUString("finish"), aHandler.mPortionItems[2].msItemType); + } + + aHandler.clear(); + + // skip empty paragraph + pTextFrame = static_cast(pTextFrame->GetNext()); + + pTextFrame = static_cast(pTextFrame->GetNext()); + pTextFrame->VisitPortions(aHandler); + + { + // Text "The purpose of this report is to summarize the results of the existing bug in the LO suite" + // = 91 chars + auto& rPortionItem = aHandler.mPortionItems[0]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(91), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[1]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + // Input Field: "ThisIsAllOneWord" = 18 chars + // which is 16 chars + 2 hidden chars (start & end input field) = 18 chars + // If this is correct then the input field is in one piece + rPortionItem = aHandler.mPortionItems[2]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(18), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); + + // Text "." + rPortionItem = aHandler.mPortionItems[3]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[4]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + rPortionItem = aHandler.mPortionItems[5]; + CPPUNIT_ASSERT_EQUAL(OUString("finish"), rPortionItem.msItemType); + } + + aHandler.clear(); + + pTextFrame = static_cast(pTextFrame->GetNext()); + pTextFrame->VisitPortions(aHandler); + { + printf("Portions:\n"); + + for (const auto& rPortionItem : aHandler.mPortionItems) + { + printf("-- Type: %s length: %" SAL_PRIdINT32 " text type: %d\n", + rPortionItem.msItemType.toUtf8().getStr(), rPortionItem.mnLength, + sal_uInt16(rPortionItem.mnTextType)); + } + + // Text "The purpose of this report is to summarize the results of the existing bug in the LO suite" + // 91 chars + auto& rPortionItem = aHandler.mPortionItems[0]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(91), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // The input field here has more words ("One Two Three Four Five") + // and it should break after "Two". + // Input Field: "One Two" = 7 chars + 1 start input field hidden character = 8 chars + rPortionItem = aHandler.mPortionItems[1]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); + + rPortionItem = aHandler.mPortionItems[2]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Hole, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[3]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + // Input Field: "Three Four Five" = 16 chars + 1 end input field hidden character = 16 chars + rPortionItem = aHandler.mPortionItems[4]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(16), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::InputField, rPortionItem.mnTextType); + + // Text "." + rPortionItem = aHandler.mPortionItems[5]; + CPPUNIT_ASSERT_EQUAL(OUString("text"), rPortionItem.msItemType); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), rPortionItem.mnLength); + CPPUNIT_ASSERT_EQUAL(PortionType::Text, rPortionItem.mnTextType); + + // NEW LINE + rPortionItem = aHandler.mPortionItems[6]; + CPPUNIT_ASSERT_EQUAL(OUString("line_break"), rPortionItem.msItemType); + + rPortionItem = aHandler.mPortionItems[7]; + CPPUNIT_ASSERT_EQUAL(OUString("finish"), rPortionItem.msItemType); + } +#endif +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf92648) +{ + createSwDoc("tdf92648.docx"); + SwDoc* pDoc = getSwDoc(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + // Make sure we have ten draw shapes. + // Yes, we have if the left/right pages have different header/footer, + // but if not we have only nine of them: + CPPUNIT_ASSERT_EQUAL(sal_Int32(9), SwTextBoxHelper::getCount(pPage)); + // and the text boxes haven't got zero height + sal_Int32 nCount = 0; + for (const SwFrameFormat* pFormat : *pDoc->GetSpzFrameFormats()) + { + if (!SwTextBoxHelper::isTextBox(pFormat, RES_FLYFRMFMT)) + continue; + SwFormatFrameSize aSize(pFormat->GetFrameSize()); + CPPUNIT_ASSERT(aSize.GetHeight() != 0); + ++nCount; + } + // and we have had five of them. + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), nCount); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf103978_backgroundTextShape) +{ + createSwDoc("tdf103978_backgroundTextShape.docx"); + SwDoc* pDoc = getSwDoc(); + + // there is only one shape. It has an attached textbox + bool bShapeIsOpaque = getProperty(getShape(1), "Opaque"); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape is in the foreground", false, bShapeIsOpaque); + sal_Int32 nCount = 0; + for (const SwFrameFormat* pFormat : *pDoc->GetSpzFrameFormats()) + { + if (!SwTextBoxHelper::isTextBox(pFormat, RES_FLYFRMFMT)) + continue; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Textbox syncs the shape's transparency", bShapeIsOpaque, + pFormat->GetOpaque().GetValue()); + ++nCount; + } + //ensure that we don't skip the for loop without an error + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of TextBoxes", sal_Int32(1), nCount); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf117225) +{ + // Test that saving a document with an embedded object does not leak + // tempfiles in the directory of the target file. + OUString aTargetDirectory + = m_directories.getURLFromWorkdir(u"/CppunitTest/sw_uiwriter7.test.user/"); + OUString aTargetFile = aTargetDirectory + "tdf117225.odt"; + OUString aSourceFile = createFileURL(u"tdf117225.odt"); + osl::File::copy(aSourceFile, aTargetFile); + mxComponent = loadFromDesktop(aTargetFile); + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + int nExpected = CountFilesInDirectory(aTargetDirectory); + xStorable->store(); + int nActual = CountFilesInDirectory(aTargetDirectory); + // nActual was nExpected + 1, i.e. we leaked a tempfile. + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); + + OUString aTargetFileSaveAs = aTargetDirectory + "tdf117225-save-as.odt"; + xStorable->storeAsURL(aTargetFileSaveAs, {}); + ++nExpected; + nActual = CountFilesInDirectory(aTargetDirectory); + // nActual was nExpected + 1, i.e. we leaked a tempfile. + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf149184) +{ + createSwDoc("simplefooter.docx"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // Removing the footer for all styles + pWrtShell->ChangeHeaderOrFooter(u"", false, false, false); + + // export to simplefooter.doc + + // Without the fix in place, the test fails with: + // [CUT] sw_uiwriter7 + // Segmentation fault (core dumped) + // [_RUN_____] testTdf149184::TestBody + save("MS Word 97"); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest7, testTdf149089) +{ + createSwDoc("tdf149089.odt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nPorLen1 = getXPath(pXmlDoc, "(//SwLinePortion)[1]"_ostr, "length"_ostr).toInt32(); + sal_Int32 nPorLen2 = getXPath(pXmlDoc, "(//SwLinePortion)[2]"_ostr, "length"_ostr).toInt32(); + sal_Int32 nPorLen3 = getXPath(pXmlDoc, "(//SwLinePortion)[3]"_ostr, "length"_ostr).toInt32(); + // Two SwTextPortion and one SwKernPortion + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nPorLen1); // SwTextPortion "一一 " + CPPUNIT_ASSERT_EQUAL(sal_Int32(12), nPorLen2); // SwTextPortion "BUG 11111111" + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nPorLen3); // SwKernPortion + + sal_Int32 nPorWidth1 = getXPath(pXmlDoc, "(//SwLinePortion)[1]"_ostr, "width"_ostr).toInt32(); + sal_Int32 nPorWidth2 = getXPath(pXmlDoc, "(//SwLinePortion)[2]"_ostr, "width"_ostr).toInt32(); + sal_Int32 nPorWidth3 = getXPath(pXmlDoc, "(//SwLinePortion)[3]"_ostr, "width"_ostr).toInt32(); + sal_Int32 nGridWidth1 = nPorWidth1 / 3; + sal_Int32 nGridWidth2 = (nPorWidth2 + nPorWidth3) / 7; + CPPUNIT_ASSERT_EQUAL(nGridWidth1, nGridWidth2); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/uiwriter/uiwriter8.cxx b/sw/qa/extras/uiwriter/uiwriter8.cxx new file mode 100644 index 0000000000..4fa027b051 --- /dev/null +++ b/sw/qa/extras/uiwriter/uiwriter8.cxx @@ -0,0 +1,2922 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// 8th set of tests asserting the behavior of Writer user interface shells. +class SwUiWriterTest8 : public SwModelTestBase +{ +public: + SwUiWriterTest8() + : SwModelTestBase("/sw/qa/extras/uiwriter/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf131684) +{ + createSwDoc("tdf131684.docx"); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + //Use selectAll 3 times in a row + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + // without the fix, it crashes + dispatchCommand(mxComponent, ".uno:Undo", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + // check that the text frame has the correct upper + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + OUString const sectionId = getXPath(pXmlDoc, "/root/page[1]/body/section[7]"_ostr, "id"_ostr); + OUString const sectionLower + = getXPath(pXmlDoc, "/root/page[1]/body/section[7]"_ostr, "lower"_ostr); + OUString const textId + = getXPath(pXmlDoc, "/root/page[1]/body/section[7]/txt[1]"_ostr, "id"_ostr); + OUString const textUpper + = getXPath(pXmlDoc, "/root/page[1]/body/section[7]/txt[1]"_ostr, "upper"_ostr); + CPPUNIT_ASSERT_EQUAL(textId, sectionLower); + CPPUNIT_ASSERT_EQUAL(sectionId, textUpper); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf132420) +{ + createSwDoc("tdf132420.odt"); + + CPPUNIT_ASSERT_EQUAL(12, getShapes()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + //Without the fix in place, 1 frame and 1 image would be gone and getShapes would return 10 + CPPUNIT_ASSERT_EQUAL(12, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf132744) +{ + createSwDoc("tdf132744.odt"); + SwDoc* pDoc = getSwDoc(); + + // disable change tracking to cut the table + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + + CPPUNIT_ASSERT_MESSAGE("redlining should be off", + !pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + //Without the fix in place, the image wouldn't be pasted + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf146622) +{ + createSwDoc("TC-table-del-add.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTables->getCount()); + uno::Reference xTableNames = xTablesSupplier->getTextTables(); + CPPUNIT_ASSERT(xTableNames->hasByName("Table1")); + uno::Reference xTable1(xTableNames->getByName("Table1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); + + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + + // This was 3 (deleting the already deleted row with change tracking) + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + // This was 2 (deleting the already deleted table with change tracking) + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTable1->getRows()->getCount()); + + // check that the first table was deleted with change tracking + dispatchCommand(mxComponent, ".uno:AcceptAllTrackedChanges", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + // Undo AcceptAllTrackedChanges and DeleteRows + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + + // now only the second table deleted by AcceptAllTrackedChanges + dispatchCommand(mxComponent, ".uno:AcceptAllTrackedChanges", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf146962) +{ + // load a 2-row table, set Hide Changes mode and delete the first row with change tracking + createSwDoc("tdf116789.fodt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + // hide changes + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + + // Without the fix in place, the deleted row would be visible + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 2 + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 1); + + // check it in Show Changes mode + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines()); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // 2 rows are visible now + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); + + // check it in Hide Changes mode again + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // only a single row is visible again + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 1); + + // tdf#148227 check Undo of tracked table row deletion + + dispatchCommand(mxComponent, ".uno:Undo", {}); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // This was 1 + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf159026) +{ + // load a floating table (tables in DOCX footnotes + // imported as floating tables in Writer) + createSwDoc("tdf159026.docx"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + // hide changes + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + // select table with SelectionSupplier + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xSelSupplier(xModel->getCurrentController(), + uno::UNO_QUERY_THROW); + // select floating table (table in a frame) + xSelSupplier->select(xIndexAccess->getByIndex(0)); + + // delete table with track changes + dispatchCommand(mxComponent, ".uno:DeleteTable", {}); + + // tracked table deletion + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + // hidden table + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "//tab"_ostr, 0); + + // delete frame + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess2(xTextFramesSupplier->getTextFrames(), + uno::UNO_QUERY); + xSelSupplier->select(xIndexAccess2->getByIndex(0)); + dispatchCommand(mxComponent, ".uno:Delete", {}); + + // undo frame deletion + dispatchCommand(mxComponent, ".uno:Undo", {}); + + // undo tracked table deletion + + // This resulted crashing + dispatchCommand(mxComponent, ".uno:Undo", {}); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf147347) +{ + // load a 2-row table, set Hide Changes mode and delete the table with change tracking + createSwDoc("tdf116789.fodt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + // hide changes + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + dispatchCommand(mxComponent, ".uno:DeleteTable", {}); + + // Without the fix in place, the deleted row would be visible + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 1 + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 0); + + // check it in Show Changes mode + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines()); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // 2 rows are visible now + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); + + // check it in Hide Changes mode again + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // no visible row again + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 0); + + // tdf#148228 check Undo of tracked table deletion + + dispatchCommand(mxComponent, ".uno:Undo", {}); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // This was 0 + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf153819) +{ + // copy a table before a deleted table in Hide Changes mode + createSwDoc("tdf153819.fodt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // hide changes + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + dispatchCommand(mxComponent, ".uno:GoDown", {}); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:Paste", {}); + + // FIXME: Show Changes, otherwise ~SwTableNode() would have crashed + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf148345) +{ + // load a 2-row table, set Hide Changes mode and delete the first row with change tracking + createSwDoc("tdf116789.fodt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + // hide changes + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + + // Without the fix in place, the deleted row would be visible + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // This was 2 + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 1); + + // check it in Show Changes mode + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(!pWrtShell->GetLayout()->IsHideRedlines()); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // 2 rows are visible now + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); + + // check it in Hide Changes mode again + + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // only a single row is visible again + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 1); + + // tdf#148227 check Reject All of tracked table row deletion + + dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {}); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // This was 1 + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf141391) +{ + // table insertion in the first paragraph of the cell + // overwrites the row content, instead of inserting a nested table + + // load a 2-row table + createSwDoc("tdf116789.fodt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // select the table, and copy it into at paragraph start of cell "A2" + + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + // remove the selection and positionate the cursor at beginning of A2 + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + dispatchCommand(mxComponent, ".uno:Paste", {}); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // 3-row, overwriting cells of the second row and inserting a new row + // with the 2-row clipboard table content + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 3); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[2]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); + + // Undo + + dispatchCommand(mxComponent, ".uno:Undo", {}); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // 2 rows again, no copied text content + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/SwParaPortion"_ostr, 0); + + // insert the 2-row table into the second paragraph of cell "A2" as a nested table + // For this it's enough to positionate the text cursor not in the first paragraph + + // insert some text and an empty paragraph + pWrtShell->Insert("Some text..."); + pWrtShell->SplitNode(); + Scheduler::ProcessEventsToIdle(); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt"_ostr, 2); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[2]/cell[1]/txt[1]/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "Some text..."); + // the empty paragraph in A2 + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/txt[2]/SwParaPortion"_ostr, 0); + + // insert the table, as a nested one in cell "A2" + dispatchCommand(mxComponent, ".uno:Paste", {}); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/tab"_ostr, 1); + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row[2]/cell[1]/tab/row"_ostr, 2); + + // Undo + + dispatchCommand(mxComponent, ".uno:Undo", {}); + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // 2 rows again, no copied text content + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 2); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[2]/cell[1]/txt[1]/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "Some text..."); + + // copy the 2-row table into the fist paragraph of cell "A2", + // but not at paragraph start (changed behaviour) + + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->Insert("and some text again in the first paragraph to be sure..."); + dispatchCommand(mxComponent, ".uno:Paste", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + + // 3-row, overwriting cells of the second row and inserting a new row + // with the 2-row clipboard table content + + // This was 2 (nested table) + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 3); + // This was "Some text..." with a nested table + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[2]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf148791) +{ + // test Paste as Rows Above with centered table alignment + + // load a 2-row table + createSwDoc("tdf116789.fodt"); + SwDoc* pDoc = getSwDoc(); + CPPUNIT_ASSERT(pDoc); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // select and copy the table, and Paste As Rows Above + + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + // remove the selection and positionate the cursor at beginning of A2 + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->Up(/*bSelect=*/false); + dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); + + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // Paste as Rows Above results 4-row table with default table alignment + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 4); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[1]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[3]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); + + // set table alignment to center, select and copy the table again + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + + // Default table alignment + CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::FULL, + getProperty(xTextTable, "HoriOrient")); + + //CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xTextTable, "TableTemplateName")); + uno::Reference xTableProps(xTextTable, uno::UNO_QUERY_THROW); + + xTableProps->setPropertyValue("HoriOrient", uno::Any(text::HoriOrientation::CENTER)); + + CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::CENTER, + getProperty(xTextTable, "HoriOrient")); + + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + // remove the selection and positionate the cursor at beginning of A2 + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + pWrtShell->Up(/*bSelect=*/false); + pWrtShell->Up(/*bSelect=*/false); + pWrtShell->Up(/*bSelect=*/false); + dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // This was 5 (inserting only a single row for the 4-row clipboard content, and + // overwriting 3 existing rows) + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 8); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[1]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[3]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[5]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); + assertXPath(pXmlDoc, + "/root/page[1]/body/tab/row[7]/cell[1]/txt/SwParaPortion/SwLineLayout"_ostr, + "portion"_ostr, "hello"); + + // tdf#64902 add a test case for nested tables + + // insert a nested table, and copy as paste as rows above the whole table with it + dispatchCommand(mxComponent, ".uno:PasteNestedTable", {}); + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + // remove the selection and positionate the cursor at beginning of A2 + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + // skip 7 table rows plus 4 rows of the nested table + for (int i = 0; i < 7 + 4; ++i) + pWrtShell->Up(/*bSelect=*/false); + dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // rows of the nested table doesn't effect row number of the main table + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 16); + // there are two nested tables after the paste + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell/tab"_ostr, 2); + + // tdf#64902 add a test case for repeated table headings + + xTableProps->setPropertyValue("RepeatHeadline", uno::Any(true)); + CPPUNIT_ASSERT(getProperty(xTextTable, "RepeatHeadline")); + + xTableProps->setPropertyValue("HeaderRowCount", uno::Any(sal_Int32(3))); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), getProperty(xTextTable, "HeaderRowCount")); + + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + // remove the selection and positionate the cursor at beginning of A2 + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + // skip 15 table rows plus 4 * 2 rows of the nested tables + for (int i = 0; i < 15 + 4 * 2; ++i) + pWrtShell->Up(/*bSelect=*/false); + dispatchCommand(mxComponent, ".uno:PasteRowsBefore", {}); + + discardDumpedLayout(); + pXmlDoc = parseLayoutDump(); + // repeating table header (and its thead/tbody indentation) doesn't effect row number + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 32); + // there are two nested tables after the paste + assertXPath(pXmlDoc, "/root/page[1]/body/tab/row/cell/tab"_ostr, 4); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf135014) +{ + createSwDoc(); + + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(sal_Int32(0)) } })); + + // Toggle Numbering List + dispatchCommand(mxComponent, ".uno:DefaultBullet", aArgs); + + uno::Sequence aArgs2(comphelper::InitPropertySequence( + { { "Param", uno::Any(OUString("NewNumberingStyle")) }, + { "Family", uno::Any(static_cast(SfxStyleFamily::Pseudo)) } })); + + // New Style from selection + dispatchCommand(mxComponent, ".uno:StyleNewByExample", aArgs2); + + // Without the fix in place, this test would have failed here + saveAndReload("Office Open XML Text"); + + xmlDocUniquePtr pXmlStyles = parseExport("word/styles.xml"); + assertXPath(pXmlStyles, "/w:styles/w:style[@w:styleId='NewNumberingStyle']/w:qFormat"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf130629) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + uno::Sequence aArgs( + comphelper::InitPropertySequence({ { "KeyModifier", uno::Any(KEY_MOD1) } })); + + dispatchCommand(mxComponent, ".uno:BasicShapes.diamond", aArgs); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + // Undo twice + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + // Shape toolbar is active, use ESC before inserting a new shape + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_ESCAPE); + Scheduler::ProcessEventsToIdle(); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:BasicShapes.diamond", aArgs); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf145584) +{ + std::shared_ptr pPDFium = vcl::pdf::PDFiumLibrary::get(); + if (!pPDFium) + { + return; + } + createSwDoc(); + SwDoc* const pDoc = getSwDoc(); + SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtSh); + + pWrtSh->Insert("Hello World"); + + // Select 'World' + pWrtSh->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 5, /*bBasicCall=*/false); + + // Save as PDF. + uno::Sequence aFilterData( + comphelper::InitPropertySequence({ { "Selection", uno::Any(true) } })); + + uno::Sequence aDescriptor(comphelper::InitPropertySequence( + { { "FilterName", uno::Any(OUString("writer_pdf_Export")) }, + { "FilterData", uno::Any(aFilterData) }, + { "URL", uno::Any(maTempFile.GetURL()) } })); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:ExportToPDF", aDescriptor); + + std::unique_ptr pPdfDocument = parsePDFExport(); + CPPUNIT_ASSERT_EQUAL(1, pPdfDocument->getPageCount()); + std::unique_ptr pPdfPage = pPdfDocument->openPage(/*nIndex=*/0); + CPPUNIT_ASSERT(pPdfPage); + CPPUNIT_ASSERT_EQUAL(1, pPdfPage->getObjectCount()); + std::unique_ptr pPdfTextPage = pPdfPage->getTextPage(); + CPPUNIT_ASSERT(pPdfTextPage); + + std::unique_ptr pPageObject = pPdfPage->getObject(0); + OUString sText = pPageObject->getText(pPdfTextPage); + CPPUNIT_ASSERT_EQUAL(OUString("World"), sText); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf152575) +{ + std::shared_ptr pPDFium = vcl::pdf::PDFiumLibrary::get(); + if (!pPDFium) + return; + + createSwDoc("152575.fodt"); + + // Save as PDF. + uno::Sequence aFilterData( + comphelper::InitPropertySequence({ { "ExportNotesInMargin", uno::Any(true) } })); + + uno::Sequence aDescriptor(comphelper::InitPropertySequence( + { { "FilterName", uno::Any(OUString("writer_pdf_Export")) }, + { "FilterData", uno::Any(aFilterData) }, + { "URL", uno::Any(maTempFile.GetURL()) } })); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:ExportToPDF", aDescriptor); + + std::unique_ptr pPdfDocument = parsePDFExport(); + CPPUNIT_ASSERT_EQUAL(3, pPdfDocument->getPageCount()); + std::unique_ptr pPdfPage = pPdfDocument->openPage(/*nIndex=*/1); + CPPUNIT_ASSERT(pPdfPage); + // Without the fix for tdf#152575 this would be only 42 objects + CPPUNIT_ASSERT_EQUAL(51, pPdfPage->getObjectCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf140731) +{ + createSwDoc(); + SwDoc* const pDoc = getSwDoc(); + SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtSh); + + pWrtSh->Insert("Lorem"); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F3); + Scheduler::ProcessEventsToIdle(); + + // generating a big text with ~60k words and several paragraphs + for (sal_Int32 i = 0; i < 8; ++i) + { + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Copy", {}); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + } + + dispatchCommand(mxComponent, ".uno:GoToStartOfDoc", {}); + + // Format->Text operations on small selections (which would generate <~500 redlines) + // changetracking still working + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + + SwCursorShell* pShell(pDoc->GetEditShell()); + + pShell->SelectTextModel(1, 500); + + dispatchCommand(mxComponent, ".uno:ChangeCaseToTitleCase", {}); + + SwEditShell* const pEditShell(pDoc->GetEditShell()); + CPPUNIT_ASSERT_EQUAL(static_cast(120), + pEditShell->GetRedlineCount()); + + //Removing all the redlines. + dispatchCommand(mxComponent, ".uno:RejectAllTrackedChanges", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(0), pEditShell->GetRedlineCount()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:ChangeCaseToTitleCase", {}); + + // Without the fix in place, on big selections writer would freeze. Now it ignores change tracking. + CPPUNIT_ASSERT_EQUAL(static_cast(0), pEditShell->GetRedlineCount()); + + // The patch has no effects on the Format->Text operations + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("Lorem Ipsum Dolor Sit Amet")); + + dispatchCommand(mxComponent, ".uno:ChangeCaseToUpper", {}); + + CPPUNIT_ASSERT(getParagraph(1)->getString().startsWith("LOREM IPSUM DOLOR SIT AMET")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf116315) +{ + createSwDoc(); + SwDoc* const pDoc = getSwDoc(); + SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtSh); + + pWrtSh->Insert("This is a test"); + pWrtSh->Left(SwCursorSkipMode::Chars, /*bSelect=*/true, 4, /*bBasicCall=*/false); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + for (sal_Int32 i = 0; i < 5; ++i) + { + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); + Scheduler::ProcessEventsToIdle(); + + // Title Case + CPPUNIT_ASSERT_EQUAL(OUString("This is a Test"), getParagraph(1)->getString()); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); + Scheduler::ProcessEventsToIdle(); + + // Sentence Case + // Without the fix in place, this test would have failed with + // - Expected: This is a Test + // - Actual : This is a TEST + CPPUNIT_ASSERT_EQUAL(OUString("This is a Test"), getParagraph(1)->getString()); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); + Scheduler::ProcessEventsToIdle(); + + // Upper Case + CPPUNIT_ASSERT_EQUAL(OUString("This is a TEST"), getParagraph(1)->getString()); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_F3); + Scheduler::ProcessEventsToIdle(); + + // Lower Case + CPPUNIT_ASSERT_EQUAL(OUString("This is a test"), getParagraph(1)->getString()); + } +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf144364) +{ + createSwDoc(); + SwDoc* const pDoc = getSwDoc(); + SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtSh); + + // expands autotext (via F3) + pWrtSh->Insert("AR"); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_F3); + Scheduler::ProcessEventsToIdle(); + + // was ...'letter of ' + CPPUNIT_ASSERT_EQUAL( + OUString("We hereby acknowledge the receipt of your letter of ."), + getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf146248) +{ + createSwDoc("tdf146248.docx"); + + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPageStyle, "HeaderIsOn")); + + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // Delete the header + pWrtShell->ChangeHeaderOrFooter(u"Default Page Style", true, false, false); + + CPPUNIT_ASSERT_EQUAL(false, getProperty(xPageStyle, "HeaderIsOn")); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPageStyle, "HeaderIsOn")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf152964) +{ + createSwDoc(); + + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); + + SwDoc* pDoc = getSwDoc(); + SwEditShell* const pEditShell(pDoc->GetEditShell()); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pEditShell->GetRedlineCount()); + dispatchCommand(mxComponent, ".uno:GoDown", {}); + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(2), pEditShell->GetRedlineCount()); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(1), pEditShell->GetRedlineCount()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(0), pEditShell->GetRedlineCount()); + + dispatchCommand(mxComponent, ".uno:Redo", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(1), pEditShell->GetRedlineCount()); + dispatchCommand(mxComponent, ".uno:Redo", {}); + + CPPUNIT_ASSERT_EQUAL(static_cast(2), pEditShell->GetRedlineCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf107427) +{ + createSwDoc(); + + dispatchCommand(mxComponent, + ".uno:InsertPageHeader?PageStyle:string=Default%20Page%20Style&On:bool=true", + {}); + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + xmlDocUniquePtr pLayout = parseLayoutDump(); + assertXPath(pLayout, "/root/page[1]/header/tab/row"_ostr, 2); + + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + // Delete the header + pWrtShell->ChangeHeaderOrFooter(u"Default Page Style", true, false, false); + + discardDumpedLayout(); + pLayout = parseLayoutDump(); + assertXPath(pLayout, "/root/page[1]/header"_ostr, 0); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + discardDumpedLayout(); + pLayout = parseLayoutDump(); + assertXPath(pLayout, "/root/page[1]/header/tab/row"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf141613) +{ + createSwDoc(); + SwDoc* const pDoc = getSwDoc(); + SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtSh); + + pWrtSh->Insert("Test"); + + dispatchCommand(mxComponent, + ".uno:InsertPageHeader?PageStyle:string=Default%20Page%20Style&On:bool=true", + {}); + + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPageStyle, "HeaderIsOn")); + CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(false, getProperty(xPageStyle, "HeaderIsOn")); + CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(1)->getString()); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:Undo", {}); + CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf107494) +{ + createSwDoc(); + + // Create a graphic object, but don't insert it yet. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xTextGraphic( + xFactory->createInstance("com.sun.star.text.TextGraphicObject"), uno::UNO_QUERY); + + uno::Reference xTextContent(xTextGraphic, uno::UNO_QUERY); + + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + + xPageStyle->setPropertyValue("HeaderIsOn", uno::Any(true)); + + uno::Reference xHeader( + getProperty>(xPageStyle, "HeaderText")); + CPPUNIT_ASSERT(xHeader.is()); + uno::Reference xHeaderCursor(xHeader->createTextCursor()); + + xHeader->insertTextContent(xHeaderCursor, xTextContent, false); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + xPageStyle->setPropertyValue("HeaderIsOn", uno::Any(false)); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + xPageStyle->setPropertyValue("FooterIsOn", uno::Any(true)); + + uno::Reference xFooter( + getProperty>(xPageStyle, "FooterText")); + CPPUNIT_ASSERT(xFooter.is()); + uno::Reference xFooterCursor(xFooter->createTextCursor()); + + xTextGraphic.set(xFactory->createInstance("com.sun.star.text.TextGraphicObject"), + uno::UNO_QUERY); + + xTextContent.set(xTextGraphic, uno::UNO_QUERY); + + xFooter->insertTextContent(xFooterCursor, xTextContent, false); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + xPageStyle->setPropertyValue("FooterIsOn", uno::Any(false)); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf133358) +{ + createSwDoc(); + SwDoc* const pDoc = getSwDoc(); + SwWrtShell* const pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtSh); + + pWrtSh->Insert("Test"); + + CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(1)->getString()); + + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xParagraph, "ParaLeftMargin")); + + dispatchCommand(mxComponent, ".uno:IncrementIndent", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1251), getProperty(xParagraph, "ParaLeftMargin")); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xParagraph, "ParaLeftMargin")); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:Redo", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1251), getProperty(xParagraph, "ParaLeftMargin")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf131771) +{ + createSwDoc(); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xTextTable, "TableTemplateName")); + uno::Reference xTableProps(xTextTable, uno::UNO_QUERY_THROW); + xTableProps->setPropertyValue("TableTemplateName", uno::Any(OUString("Default Style"))); + + CPPUNIT_ASSERT_EQUAL(OUString("Default Style"), + getProperty(xTextTable, "TableTemplateName")); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + dispatchCommand(mxComponent, ".uno:GoDown", {}); + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); + + CPPUNIT_ASSERT_EQUAL(OUString("Default Style"), + getProperty(xTextTable, "TableTemplateName")); + + uno::Reference xTextTable2(xIndexAccess->getByIndex(1), uno::UNO_QUERY); + + // Without the fix in place, this test would have failed with + // - Expected: Default Style + // - Actual : + CPPUNIT_ASSERT_EQUAL(OUString("Default Style"), + getProperty(xTextTable2, "TableTemplateName")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf80663) +{ + createSwDoc(); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(2)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); + + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf130805) +{ + createSwDoc("tdf130805.odt"); + SwDoc* pDoc = getSwDoc(); + + const auto& rFrmFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); + auto pShape = rFrmFormats.front(); + CPPUNIT_ASSERT(pShape); + + SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); + auto pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); + CPPUNIT_ASSERT(pTxBxFrm); + + const SwNode* pTxAnch = pTxBxFrm->GetAnchor().GetAnchorNode(); + const SwNode* pShpAnch = pShape->GetAnchor().GetAnchorNode(); + CPPUNIT_ASSERT(pTxAnch); + CPPUNIT_ASSERT(pShpAnch); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("The textbox got apart!", pTxAnch->GetIndex(), + pShpAnch->GetIndex()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf107893) +{ + //Open the sample doc + createSwDoc("tdf107893.odt"); + SwDoc* pDoc = getSwDoc(); + + //Get the format of the shape + const auto& rFrmFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); + auto pShape = rFrmFormats.front(); + CPPUNIT_ASSERT(pShape); + + //Add a textbox + SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); + SwFrameFormat* pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); + CPPUNIT_ASSERT(pTxBxFrm); + + //Remove the textbox using Undo + dispatchCommand(mxComponent, ".uno:Undo", {}); + + //Add again + SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); + pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); + + //This was nullptr because of unsuccessful re-adding + CPPUNIT_ASSERT_MESSAGE("Textbox cannot be readd after Undo!", pTxBxFrm); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf121031) +{ + createSwDoc(); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(3)) }, { "Columns", uno::Any(sal_Int32(3)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + dispatchCommand(mxComponent, ".uno:DeleteTable", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + + // Without the fix in place, the table would be hidden + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, TestTextBoxCrashAfterLineDel) +{ + // Open the desired file + createSwDoc("txbx_crash.odt"); + SwDoc* pDoc = getSwDoc(); + + // Get the format of the shape + const auto& rFrmFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); + auto pShape = rFrmFormats.front(); + CPPUNIT_ASSERT(pShape); + + // Add a textbox + SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); + SwFrameFormat* pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); + CPPUNIT_ASSERT(pTxBxFrm); + + // remove the last paragraph + auto xCursor = getParagraph(1)->getText()->createTextCursor(); + xCursor->gotoEnd(false); + xCursor->goLeft(3, true); + + // This caused crash before, now it should pass with the patch. + xCursor->setString(OUString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf121546) +{ + createSwDoc("tdf121546.odt"); + + CPPUNIT_ASSERT_EQUAL(OUString("xxxxxxxxxxxxxxxxxxxx"), getParagraph(2)->getString()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); + + // Create a new document + createSwDoc(); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(OUString("xxxxxxxxxxxxxxxxxxxx"), getParagraph(2)->getString()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(OUString("xxxxxxxxxxxxxxxxxxxx"), getParagraph(2)->getString()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + // Without the fix in place, this test would have crashed here + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(2, getParagraphs()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf145621) +{ + createSwDoc("tdf145621.odt"); + + CPPUNIT_ASSERT_EQUAL(OUString("AAAAAA"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); + + // Without the fix in place, this test would have crashed + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(OUString("AAAAAA"), getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf134626) +{ + createSwDoc("tdf134626.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + CPPUNIT_ASSERT_EQUAL(OUString("Apple"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Copy", {}); + + // Create a new document + createSwDoc(); + pDoc = getSwDoc(); + pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // Without the fix in place, this test would have crashed here + for (sal_Int32 i = 0; i < 5; ++i) + { + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(OUString("Apple"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(OUString("AppleApple"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(OUString("Apple"), getParagraph(1)->getString()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(OUString(""), getParagraph(1)->getString()); + } +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf139566) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(1)) }, { "Columns", uno::Any(sal_Int32(1)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + // Move the cursor outside the table + pWrtSh->Down(/*bSelect=*/false); + + pWrtSh->Insert("Test"); + + CPPUNIT_ASSERT_EQUAL(OUString("Test"), getParagraph(2)->getString()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + uno::Reference xFrames = mxDesktop->getFrames(); + sal_Int32 nFrames = xFrames->getCount(); + + // Create a second window so the first window looses focus + dispatchCommand(mxComponent, ".uno:NewWindow", {}); + + CPPUNIT_ASSERT_EQUAL(nFrames + 1, xFrames->getCount()); + + dispatchCommand(mxComponent, ".uno:CloseWin", {}); + + CPPUNIT_ASSERT_EQUAL(nFrames, xFrames->getCount()); + + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xSelections(xModel->getCurrentSelection(), + uno::UNO_QUERY); + + // Without the fix in place, this test would have failed here + CPPUNIT_ASSERT(xSelections.is()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf96067) +{ + createSwDoc(); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(3)) }, { "Columns", uno::Any(sal_Int32(3)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); + + dispatchCommand(mxComponent, ".uno:SelectTable", {}); + dispatchCommand(mxComponent, ".uno:InsertRowsBefore", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf87199) +{ + createSwDoc(); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(2)) }, { "Columns", uno::Any(sal_Int32(1)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); + + uno::Reference xCellA1(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + xCellA1->setString("test1"); + + uno::Reference xCellA2(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + xCellA2->setString("test2"); + + dispatchCommand(mxComponent, ".uno:EntireColumn", {}); + dispatchCommand(mxComponent, ".uno:MergeCells", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); + + CPPUNIT_ASSERT(xCellA1->getString().endsWith("test2")); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); + + xCellA1.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + + CPPUNIT_ASSERT(xCellA1->getString().endsWith("test1")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf39828) +{ + createSwDoc("tdf39828.fodt"); + SwDoc* pDoc = getSwDoc(); + + // show changes + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + CPPUNIT_ASSERT_MESSAGE("redlining should be off", + !pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE( + "redlines should be visible", + IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); + + uno::Reference xCellA1(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + // deleted "1", inserted "2" + CPPUNIT_ASSERT_EQUAL(OUString("12"), xCellA1->getString()); + uno::Reference xCellA3(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + // This was 14 (bad sum: 2 + A1, where A1 was 12 instead of the correct 2) + CPPUNIT_ASSERT_EQUAL(OUString("4"), xCellA3->getString()); + uno::Reference xCellA4(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + // This was 28 (bad sum: 2 + A1 + A3, where A1 was 12 and A3 was 14) + CPPUNIT_ASSERT_EQUAL(OUString("8"), xCellA4->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf146573) +{ + createSwDoc("tdf39828.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // remove redlines, add a footnote, and change the value + // of the cell with the footnote + dispatchCommand(mxComponent, ".uno:AcceptAllTrackedChanges", {}); + pWrtShell->Right(SwCursorSkipMode::Cells, /*bSelect=*/false, /*nCount=*/1, + /*bBasicCall=*/false); + dispatchCommand(mxComponent, ".uno:InsertFootnote", {}); + dispatchCommand(mxComponent, ".uno:PageUp", {}); // leave footnote + pWrtShell->Left(SwCursorSkipMode::Cells, /*bSelect=*/false, /*nCount=*/1, /*bBasicCall=*/false); + pWrtShell->Left(SwCursorSkipMode::Cells, /*bSelect=*/true, /*nCount=*/1, /*bBasicCall=*/false); + pWrtShell->Insert("100"); + + // trigger recalculation by leaving the cell + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); + + uno::Reference xCellA1(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + // value "100" and footnote index "1" + CPPUNIT_ASSERT_EQUAL(OUString("1001"), xCellA1->getString()); + uno::Reference xCellA3(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + // This was 4 (missing recalculation) + CPPUNIT_ASSERT_EQUAL(OUString("102"), xCellA3->getString()); + uno::Reference xCellA4(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + // This was 8 (missing recalculation) + CPPUNIT_ASSERT_EQUAL(OUString("204"), xCellA4->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf157132) +{ + createSwDoc("tdf157132.odt"); + + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // Go to cell A2 + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + + // Select A2 and A3 and copy + pWrtShell->Down(/*bSelect=*/true, /*nCount=*/1); + + dispatchCommand(mxComponent, ".uno:Copy", {}); + + // Go to A4 and paste + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTables->getCount()); + + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + + uno::Reference xCellA2(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2"), xCellA2->getString()); + uno::Reference xCellA3(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("3"), xCellA3->getString()); + uno::Reference xCellA4(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + + // Without the fix in place, this test would have failed with + // - Expected: 6 + // - Actual : 2 + CPPUNIT_ASSERT_EQUAL(OUString("6"), xCellA4->getString()); + uno::Reference xCellA5(xTextTable->getCellByName("A5"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("7"), xCellA5->getString()); + + xTextTable.set(xTables->getByIndex(1), uno::UNO_QUERY); + + xCellA2.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + + // tdf#158336: Without the fix in place, this test would have failed with + // - Expected: 2 + // - Actual : ** Expression is faulty ** + CPPUNIT_ASSERT_EQUAL(OUString("2"), xCellA2->getString()); + xCellA3.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("3"), xCellA3->getString()); + xCellA4.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("6"), xCellA4->getString()); + xCellA5.set(xTextTable->getCellByName("A5"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("7"), xCellA5->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf147938) +{ + createSwDoc("tdf147938.fodt"); + + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); + CPPUNIT_ASSERT_EQUAL(OUString("Bar\nbaz "), + pDoc->getIDocumentRedlineAccess().GetRedlineTable()[0]->GetText()); + + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + pWrtShell->TableToText('\t'); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); + CPPUNIT_ASSERT_EQUAL(OUString("Bar\nbaz "), + pDoc->getIDocumentRedlineAccess().GetRedlineTable()[0]->GetText()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + SwInsertTableOptions const opts(SwInsertTableFlags::NONE, 0); + pWrtShell->TextToTable(opts, '\t', nullptr); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); + CPPUNIT_ASSERT_EQUAL(OUString("Bar\nbaz "), + pDoc->getIDocumentRedlineAccess().GetRedlineTable()[0]->GetText()); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); + CPPUNIT_ASSERT_EQUAL(OUString("Bar\nbaz "), + pDoc->getIDocumentRedlineAccess().GetRedlineTable()[0]->GetText()); + + pWrtShell->Redo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); + CPPUNIT_ASSERT_EQUAL(OUString("Bar\nbaz "), + pDoc->getIDocumentRedlineAccess().GetRedlineTable()[0]->GetText()); + + pWrtShell->Redo(); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); + CPPUNIT_ASSERT_EQUAL(OUString("Bar\nbaz "), + pDoc->getIDocumentRedlineAccess().GetRedlineTable()[0]->GetText()); + + pWrtShell->Undo(); + + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->getIDocumentRedlineAccess().GetRedlineTable().size()); + CPPUNIT_ASSERT_EQUAL(OUString("Bar\nbaz "), + pDoc->getIDocumentRedlineAccess().GetRedlineTable()[0]->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf148799) +{ + // load a document with table formulas with comma delimiter, + // but with a document language with default point delimiter + createSwDoc("tdf148799.docx"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // check formula update + + // put cursor in the first table row + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getRows()->getCount()); + + // These were "** Expression is faulty **" + + uno::Reference xCellA1(xTextTable->getCellByName("D3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2.3"), xCellA1->getString()); + uno::Reference xCellA3(xTextTable->getCellByName("D4"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2345"), xCellA3->getString()); + uno::Reference xCellA4(xTextTable->getCellByName("D5"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("23684.5"), xCellA4->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf151993) +{ + // load a document with table formulas with comma delimiter + // (with a document language with default comma delimiter) + createSwDoc("tdf151993.docx"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // check formula update + + // put cursor in the first table row + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); + + // This was 0 + uno::Reference xCellA1(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("30"), xCellA1->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf148849) +{ + // load a document with a table and an empty paragraph before the table + createSwDoc("tdf148849.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // record changes + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + // hide changes + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + // put cursor in the first table row + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/1); + + // delete a table row + pWrtShell->DeleteRow(); + + // check cursor position + + // This was "", because the text cursor jumped to the start of the document + // after deleting a table row instead of remaining in the next table row + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode.GetTextNode()->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf150576) +{ + // load a document with a table and an empty paragraph before the table + createSwDoc("tdf148849.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // record changes + pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete + | RedlineFlags::ShowInsert); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + // hide changes + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + CPPUNIT_ASSERT(pWrtShell->GetLayout()->IsHideRedlines()); + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + // Check deletion of the first row, if the second row deleted already + + // put cursor in the second table row + pWrtShell->Down(/*bSelect=*/false, /*nCount=*/2); + SwNode& rNode = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode.GetTextNode()->GetText()); + + // delete the second table row + pWrtShell->DeleteRow(); + + // check cursor position (row 3) + SwNode& rNode2 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode2.GetTextNode()->GetText()); + + // put cursor in the first row + pWrtShell->Up(/*bSelect=*/false, /*nCount=*/1); + SwNode& rNode3 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("12"), rNode3.GetTextNode()->GetText()); + + // delete the first row + pWrtShell->DeleteRow(); + + // This was empty (cursor jumped in the start of the document instead of + // the next not deleted row) + SwNode& rNode4 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode4.GetTextNode()->GetText()); + + // Check skipping previous lines + + // restore deleted rows + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + SwNode& rNode5 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 2"), rNode5.GetTextNode()->GetText()); + + // delete the second row + pWrtShell->DeleteRow(); + SwNode& rNode7 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + CPPUNIT_ASSERT_EQUAL(OUString("Row 3"), rNode7.GetTextNode()->GetText()); + + // delete the third, i.e. last row + pWrtShell->DeleteRow(); + SwNode& rNode8 = pWrtShell->GetCursor()->GetPoint()->GetNode(); + + // This was empty (cursor jumped in the start of the document instead of + // the previous not deleted row) + CPPUNIT_ASSERT_EQUAL(OUString("12"), rNode8.GetTextNode()->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf132603) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + uno::Sequence aPropertyValues + = comphelper::InitPropertySequence({ { "Text", uno::Any(OUString("Comment")) } }); + + dispatchCommand(mxComponent, ".uno:InsertAnnotation", aPropertyValues); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + // Without the fix in place, it would crash here + dispatchCommand(mxComponent, ".uno:Copy", {}); + + tools::JsonWriter aJsonWriter; + pTextDoc->getPostIts(aJsonWriter); + OString pChar = aJsonWriter.finishAndGetAsOString(); + std::stringstream aStream((std::string(pChar))); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + for (const boost::property_tree::ptree::value_type& rValue : aTree.get_child("comments")) + { + const boost::property_tree::ptree& rComment = rValue.second; + + OString aText(rComment.get("text")); + CPPUNIT_ASSERT_EQUAL("Comment"_ostr, aText); + } +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf117601) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + uno::Sequence aArgs(comphelper::InitPropertySequence( + { { "Rows", uno::Any(sal_Int32(5)) }, { "Columns", uno::Any(sal_Int32(3)) } })); + + dispatchCommand(mxComponent, ".uno:InsertTable", aArgs); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); + + uno::Reference xCellB1(xTextTable->getCellByName("B1"), uno::UNO_QUERY); + xCellB1->setString("test1"); + + uno::Reference xCellB2(xTextTable->getCellByName("B2"), uno::UNO_QUERY); + xCellB2->setString("test2"); + + //go to middle row + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_UP); + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RIGHT); + Scheduler::ProcessEventsToIdle(); + + dispatchCommand(mxComponent, ".uno:EntireColumn", {}); + dispatchCommand(mxComponent, ".uno:MergeCells", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); + + CPPUNIT_ASSERT(xCellB1->getString().endsWith("test2")); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xTextTable->getColumns()->getCount()); + + CPPUNIT_ASSERT(xCellB1->getString().endsWith("test1")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf138130) +{ + createSwDoc("tdf138130.docx"); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + uno::Reference xShape = getShape(1); + + awt::Point aPos = xShape->getPosition(); + + //select shape and change the anchor + selectShape(1); + + // Without the fix in place, this test would have crashed here + dispatchCommand(mxComponent, ".uno:SetAnchorToPage", {}); + + //position has changed + CPPUNIT_ASSERT(aPos.X < xShape->getPosition().X); + CPPUNIT_ASSERT(aPos.Y < xShape->getPosition().Y); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(aPos.X, xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos.Y, xShape->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf136385) +{ + createSwDoc("tdf136385.odt"); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + uno::Reference xShape = getShape(1); + + awt::Point aPos = xShape->getPosition(); + + //select shape and change the anchor + selectShape(1); + + dispatchCommand(mxComponent, ".uno:SetAnchorToPage", {}); + + //position has changed + CPPUNIT_ASSERT(aPos.X < xShape->getPosition().X); + CPPUNIT_ASSERT(aPos.Y < xShape->getPosition().Y); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + //Without the fix in place, this test would have failed with + //- Expected: 2447 + //- Actual : 446 + CPPUNIT_ASSERT_EQUAL(aPos.X, xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos.Y, xShape->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf145207) +{ + createSwDoc("tdf145207.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + + //select one shape and use the TAB key to iterate over the different shapes + selectShape(1); + + for (sal_Int32 i = 0; i < 10; ++i) + { + // Without the fix in place, this test would have crashed here + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); + Scheduler::ProcessEventsToIdle(); + } +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf128782) +{ + createSwDoc("tdf128782.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + uno::Reference xShape1 = getShape(1); + uno::Reference xShape2 = getShape(2); + + awt::Point aPos[2]; + aPos[0] = xShape1->getPosition(); + aPos[1] = xShape2->getPosition(); + + //select shape 2 and move it down + selectShape(2); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); + //Y position in shape 2 has changed + CPPUNIT_ASSERT(aPos[1].Y < xShape2->getPosition().Y); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); + // Shape2 has come back to the original position + // without the fix in place, it would have failed + CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf135623) +{ + createSwDoc("tdf135623.docx"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + uno::Reference xShape1 = getShape(1); + uno::Reference xShape2 = getShape(2); + + awt::Point aPos[2]; + aPos[0] = xShape1->getPosition(); + aPos[1] = xShape2->getPosition(); + + //select shape 1 and move it down + selectShape(1); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_DOWN); + Scheduler::ProcessEventsToIdle(); + + CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); + //Y position in shape 1 has changed + CPPUNIT_ASSERT(aPos[0].Y < xShape1->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); + + // Without the fix in place, this test would have failed here + // - Expected: 1351 + // - Actual : 2233 + CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); + + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf133490) +{ + createSwDoc("tdf133490.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + + uno::Reference xShape1 = getShape(1); + uno::Reference xShape2 = getShape(2); + + awt::Point aPos[2]; + aPos[0] = xShape1->getPosition(); + aPos[1] = xShape2->getPosition(); + + //select shape 2 and move it to the right + selectShape(2); + + for (sal_Int32 i = 0; i < 5; ++i) + { + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RIGHT); + Scheduler::ProcessEventsToIdle(); + } + + CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); + //X position in shape 2 has changed + CPPUNIT_ASSERT(aPos[1].X < xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); + + for (sal_Int32 i = 0; i < 4; ++i) + { + dispatchCommand(mxComponent, ".uno:Undo", {}); + + // Without the fix in place, undo action would have changed shape1's position + // and this test would have failed with + // - Expected: -139 + // - Actual : 1194 + CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); + CPPUNIT_ASSERT(aPos[1].X < xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); + } + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(aPos[0].X, xShape1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[0].Y, xShape1->getPosition().Y); + // Shape 2 has come back to the original position + CPPUNIT_ASSERT_EQUAL(aPos[1].X, xShape2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(aPos[1].Y, xShape2->getPosition().Y); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf132637_protectTrackChanges) +{ + createSwDoc("tdf132637_protectTrackChanges.doc"); + SwDoc* pDoc = getSwDoc(); + + // The password should only prevent turning off track changes, not open as read-only + CPPUNIT_ASSERT(!pDoc->GetDocShell()->IsReadOnly()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf127652) +{ + createSwDoc("tdf127652.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* const pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // get a page cursor + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTextViewCursorSupplier( + xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xCursor(xTextViewCursorSupplier->getViewCursor(), + uno::UNO_QUERY); + + // go to the start of page 4 + xCursor->jumpToPage(4); + xCursor->jumpToStartOfPage(); + + // mark a section that overlaps multiple pages + pWrtShell->Down(false, 2); + pWrtShell->Up(true, 5); + + // delete the marked section + pWrtShell->DelRight(); + + // go to the start of page 4 + xCursor->jumpToPage(4); + xCursor->jumpToStartOfPage(); + + // move up to page 3 + pWrtShell->Up(false, 5); + + // check that we are on the third page + // in the bug one issue was that the cursor was placed incorrectly, so + // moving up to the previous page would not work any more + sal_uInt16 assertPage = 3; + SwCursorShell* pShell(pDoc->GetEditShell()); + sal_uInt16 currentPage = pShell->GetPageNumSeqNonEmpty(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("We are on the wrong page!", assertPage, currentPage); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, AtPageTextBoxCrash) +{ + // Load sample file + createSwDoc("AtPageTextBoxCrash.odt"); + SwDoc* pDoc = getSwDoc(); + + // Get the format of the shape + const auto& rFrmFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); + auto pShape = rFrmFormats.front(); + CPPUNIT_ASSERT(pShape); + + // Add a textbox to the shape + SwTextBoxHelper::create(pShape, pShape->FindRealSdrObject()); + auto pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); + CPPUNIT_ASSERT(pTxBxFrm); + + // Change its anchor to page + uno::Reference xShpProps(getShape(1), uno::UNO_QUERY_THROW); + xShpProps->setPropertyValue( + "AnchorType", uno::Any(text::TextContentAnchorType::TextContentAnchorType_AT_PAGE)); + + // The page anchored objects must not have content anchor + // unless this will lead to crash later, for example on + // removing the paragraph where it is anchored to... + CPPUNIT_ASSERT_EQUAL(RndStdIds::FLY_AT_PAGE, pTxBxFrm->GetAnchor().GetAnchorId()); + CPPUNIT_ASSERT(!pTxBxFrm->GetAnchor().GetAnchorNode()); + + // Remove the paragraph where the textframe should be anchored + // before. Now with the patch it must not crash... + auto xPara = getParagraph(1); + xPara->getText()->setString(OUString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf135661) +{ + createSwDoc("tdf135661.odt"); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3424), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1545), xShape->getPosition().Y); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(0, getShapes()); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + xShape.set(getShape(1), uno::UNO_QUERY); + + //Without the fix in place, the shape position would have been 0,0 + CPPUNIT_ASSERT_EQUAL(sal_Int32(3424), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1545), xShape->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf133477) +{ + if (getDefaultDeviceBitCount() < 24) + return; + createSwDoc("tdf133477.fodt"); + + // Save the shape to a BMP. + uno::Reference xGraphicExporter + = drawing::GraphicExportFilter::create(mxComponentContext); + uno::Reference xSourceDoc(getShape(1), uno::UNO_QUERY); + xGraphicExporter->setSourceDocument(xSourceDoc); + + SvMemoryStream aStream; + uno::Reference xOutputStream(new utl::OStreamWrapper(aStream)); + uno::Sequence aDescriptor( + comphelper::InitPropertySequence({ { "OutputStream", uno::Any(xOutputStream) }, + { "FilterName", uno::Any(OUString("BMP")) } })); + xGraphicExporter->filter(aDescriptor); + aStream.Seek(STREAM_SEEK_TO_BEGIN); + + // Read it back and check the color of the first pixel. + // (Actually check at one-pixel offset, because imprecise shape positioning may + // result in blending with background for the first pixel). + Graphic aGraphic; + TypeSerializer aSerializer(aStream); + aSerializer.readGraphic(aGraphic); + + BitmapEx aBitmap = aGraphic.GetBitmapEx(); + CPPUNIT_ASSERT_EQUAL(Color(0, 102, 204), aBitmap.GetPixelColor(1, 1)); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf137964) +{ + createSwDoc("tdf137964.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + uno::Reference xShape(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3579), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4090), xShape->getPosition().Y); + + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + SdrObject* pObject = pPage->GetObj(1); + SwContact* pTextBox = static_cast(pObject->GetUserCall()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(RES_FLYFRMFMT), pTextBox->GetFormat()->Which()); + + pWrtShell->SelectObj(Point(), 0, pObject); + + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_UP); + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_SHIFT | KEY_LEFT); + Scheduler::ProcessEventsToIdle(); + + // Without the fix in place, the shape would have stayed where it was + CPPUNIT_ASSERT_EQUAL(sal_Int32(2579), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3090), xShape->getPosition().Y); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf143244) +{ + createSwDoc("tdf143244.odt"); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); + + uno::Reference xCell(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x009353), getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A5"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A6"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xbee3d3), getProperty(xCell, "BackColor")); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Cut", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xIndexAccess->getCount()); + + dispatchCommand(mxComponent, ".uno:Paste", {}); + + xTextTable.set(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); + + dispatchCommand(mxComponent, ".uno:GoUp", {}); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + for (sal_Int32 i = 0; i < 6; ++i) + { + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_TAB); + Scheduler::ProcessEventsToIdle(); + } + + for (sal_Int32 i = 0; i < 5; ++i) + { + dispatchCommand(mxComponent, ".uno:Undo", {}); + } + + xTextTable.set(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); + + for (sal_Int32 i = 0; i < 5; ++i) + { + dispatchCommand(mxComponent, ".uno:Redo", {}); + } + + xTextTable.set(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(9), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getColumns()->getCount()); + + xCell.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0x009353), getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A5"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A6"), uno::UNO_QUERY); + + // Without the fix in place, this test would have failed with + // - Expected: Color: R:255 G:255 B:255 A:255 + // - Actual : Color: R:190 G:227 B:211 A:0 + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A7"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xdddddd), getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A8"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xCell, "BackColor")); + + xCell.set(xTextTable->getCellByName("A9"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xbee3d3), getProperty(xCell, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf136715) +{ + createSwDoc("tdf136715.odt"); + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTextTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xIndexAccess->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); + + uno::Reference xCell(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xPara, "CharWeight")); + + xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty(xPara, "CharWeight")); + + xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty(xPara, "CharWeight")); + + xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xPara, "CharWeight")); + + dispatchCommand(mxComponent, ".uno:GoDown", {}); + dispatchCommand(mxComponent, ".uno:GoDown", {}); + dispatchCommand(mxComponent, ".uno:LineDownSel", {}); + dispatchCommand(mxComponent, ".uno:DeleteRows", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); + + xCell.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xPara, "CharWeight")); + + xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xPara, "CharWeight")); + + dispatchCommand(mxComponent, ".uno:Undo", {}); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), xTextTable->getRows()->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTextTable->getColumns()->getCount()); + + xCell.set(xTextTable->getCellByName("A1"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xPara, "CharWeight")); + + xCell.set(xTextTable->getCellByName("A2"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + + // Without the fix in place, this test would have failed with + // - Expected: 100 + // - Actual : 150 + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty(xPara, "CharWeight")); + + xCell.set(xTextTable->getCellByName("A3"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::NORMAL, getProperty(xPara, "CharWeight")); + + xCell.set(xTextTable->getCellByName("A4"), uno::UNO_QUERY); + xParaEnumAccess.set(xCell->getText(), uno::UNO_QUERY); + xParaEnum.set(xParaEnumAccess->createEnumeration()); + xPara.set(xParaEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(xPara, "CharWeight")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf138897) +{ + createSwDoc("tdf100018-1.odt"); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Cut", {}); + dispatchCommand(mxComponent, ".uno:Paste", {}); + // this was crashing + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Redo", {}); + dispatchCommand(mxComponent, ".uno:Undo", {}); + dispatchCommand(mxComponent, ".uno:Redo", {}); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf136740) +{ + createSwDoc(); + css::uno::Reference xFact(mxComponent, + css::uno::UNO_QUERY_THROW); + css::uno::Reference xTextDefaults( + xFact->createInstance("com.sun.star.text.Defaults"), css::uno::UNO_QUERY_THROW); + const css::uno::Any aOrig = xTextDefaults->getPropertyValue("TabStopDistance"); + sal_Int32 nDefTab = aOrig.get(); + CPPUNIT_ASSERT(nDefTab != 0); + + css::uno::Reference const xParagraph(getParagraphOrTable(1), + css::uno::UNO_QUERY_THROW); + xParagraph->setString("Foo"); + + CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); + CPPUNIT_ASSERT_EQUAL(OUString("Foo"), xParagraph->getString()); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:Copy", {}); + dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {}); + + const css::uno::Any aNew(nDefTab * 2); + xTextDefaults->setPropertyValue("TabStopDistance", aNew); + // it may become slightly different because of conversions, so get the actual value + const css::uno::Any aNewCorrected = xTextDefaults->getPropertyValue("TabStopDistance"); + CPPUNIT_ASSERT_DOUBLES_EQUAL(nDefTab * 2, aNewCorrected.get(), 1); + + // Paste special as RTF + const auto aPropertyValues = comphelper::InitPropertySequence( + { { "SelectedFormat", + css::uno::Any(static_cast(SotClipboardFormatId::RTF)) } }); + dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aPropertyValues); + + CPPUNIT_ASSERT_EQUAL(1, getParagraphs()); + CPPUNIT_ASSERT_EQUAL(OUString("FooFoo"), xParagraph->getString()); + + // Without the fix in place, this would fail with + // equality assertion failed + // - Expected: + // - Actual : + // i.e., pasting RTF would reset the modified default tab stop distance to hardcoded default + CPPUNIT_ASSERT_EQUAL(aNewCorrected, xTextDefaults->getPropertyValue("TabStopDistance")); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf128106) +{ + createSwDoc("cross_reference_demo_bmk.odt"); + + const auto aPropertyValues + = comphelper::InitPropertySequence({ { "FileName", css::uno::Any(maTempFile.GetURL()) } }); + dispatchCommand(mxComponent, ".uno:NewGlobalDoc", aPropertyValues); + + mxComponent = loadFromDesktop(maTempFile.GetURL()); + + SwWrtShell* pWrtShell = getSwDoc()->GetDocShell()->GetWrtShell(); + SwDoc* const pMasterDoc(pWrtShell->GetDoc()); + CPPUNIT_ASSERT_EQUAL( + size_t(2), + pMasterDoc->getIDocumentLinksAdministration().GetLinkManager().GetLinks().size()); + // no way to set SwDocShell::m_nUpdateDocMode away from NO_UPDATE ? + // pMasterDoc->getIDocumentLinksAdministration().UpdateLinks(); + pMasterDoc->getIDocumentLinksAdministration().GetLinkManager().UpdateAllLinks(false, false, + nullptr); + // note: this has called SwGetRefFieldType::UpdateGetReferences() + SwFieldType const* const pType( + pMasterDoc->getIDocumentFieldsAccess().GetSysFieldType(SwFieldIds::GetRef)); + std::vector fields; + pType->GatherFields(fields); + CPPUNIT_ASSERT_EQUAL(size_t(6), fields.size()); + std::sort(fields.begin(), fields.end(), [](auto const* const pA, auto const* const pB) { + SwTextField const* const pHintA(pA->GetTextField()); + SwTextField const* const pHintB(pB->GetTextField()); + // in this document: only 1 field per node + CPPUNIT_ASSERT(pA == pB || &pHintA->GetTextNode() != &pHintB->GetTextNode()); + return pHintA->GetTextNode().GetIndex() < pHintB->GetTextNode().GetIndex(); + }); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[0]->GetField()->GetSubType()); + CPPUNIT_ASSERT_EQUAL(OUString("bookmarkchapter1_text"), + static_cast(fields[0]->GetField())->GetSetRefName()); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), static_cast(fields[0]->GetField()) + ->GetExpandedTextOfReferencedTextNode( + *pWrtShell->GetLayout(), nullptr, nullptr)); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[1]->GetField()->GetSubType()); + CPPUNIT_ASSERT( + static_cast(fields[1]->GetField())->IsRefToHeadingCrossRefBookmark()); + CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), + static_cast(fields[1]->GetField())->GetPar2()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[2]->GetField()->GetSubType()); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmarkchapter1"), + static_cast(fields[2]->GetField())->GetSetRefName()); + CPPUNIT_ASSERT_EQUAL(OUString("Chapter 1"), + static_cast(fields[2]->GetField())->GetPar2()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[3]->GetField()->GetSubType()); + CPPUNIT_ASSERT_EQUAL(OUString("bookmarkchapter1_text"), + static_cast(fields[3]->GetField())->GetSetRefName()); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + static_cast(fields[3]->GetField())->GetPar2()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[4]->GetField()->GetSubType()); + CPPUNIT_ASSERT( + static_cast(fields[4]->GetField())->IsRefToHeadingCrossRefBookmark()); + CPPUNIT_ASSERT_EQUAL(OUString("Chapter 1.1"), + static_cast(fields[4]->GetField())->GetPar2()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(REF_BOOKMARK), fields[5]->GetField()->GetSubType()); + CPPUNIT_ASSERT( + static_cast(fields[5]->GetField())->IsRefToHeadingCrossRefBookmark()); + CPPUNIT_ASSERT_EQUAL(OUString("Chapter 2"), + static_cast(fields[5]->GetField())->GetPar2()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf103612) +{ + createSwGlobalDoc("DUMMY.odm"); + SwDoc* pGlobalDoc = getSwDoc(); + CPPUNIT_ASSERT_EQUAL( + size_t(1), + pGlobalDoc->getIDocumentLinksAdministration().GetLinkManager().GetLinks().size()); + pGlobalDoc->getIDocumentLinksAdministration().GetLinkManager().UpdateAllLinks(false, false, + nullptr); + + xmlDocUniquePtr pLayout = parseLayoutDump(); + + assertXPath(pLayout, "/root/page[1]/body/section[1]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "Text before section"); + // the inner section and its content was hidden + assertXPath(pLayout, "/root/page[1]/body/section[2]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "Text inside section before ToC"); + assertXPath(pLayout, "/root/page[1]/body/section[3]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "Table of Contents"); + assertXPath(pLayout, "/root/page[1]/body/section[4]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "First header*1"); + assertXPath(pLayout, "/root/page[1]/body/section[4]/txt[2]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "Second header*1"); + assertXPath(pLayout, "/root/page[1]/body/section[5]/txt[2]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "Text inside section after ToC"); + assertXPath(pLayout, "/root/page[1]/body/section[6]/txt[1]/SwParaPortion/SwLineLayout[1]"_ostr, + "portion"_ostr, "Text after section"); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf97899) +{ + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwPaM* pCursor = pDoc->GetEditShell()->GetCursor(); + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + + // Create an Ordered List + rIDCO.InsertString(*pCursor, "\ta"); + pWrtShell->SplitNode(); + rIDCO.InsertString(*pCursor, " b"); + pWrtShell->SplitNode(); + rIDCO.InsertString(*pCursor, " \t c"); + + dispatchCommand(mxComponent, ".uno:SelectAll", {}); + dispatchCommand(mxComponent, ".uno:DefaultNumbering", {}); + + // tdf#109285: RemoveLeadingWhiteSpace from all numbered paragraphs + getParagraph(1, "a"); + getParagraph(2, "b"); + getParagraph(3, "c"); + + // Save it as DOCX & load it again + saveAndReload("Office Open XML Text"); + uno::Reference xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + CPPUNIT_ASSERT(xNumberingRules->getCount()); + uno::Sequence aNumbering; + xNumberingRules->getByIndex(0) >>= aNumbering; + OUString sCharStyleName; + for (const auto& prop : aNumbering) + { + if (prop.Name == "CharStyleName") + { + prop.Value >>= sCharStyleName; + break; + } + } + CPPUNIT_ASSERT(!sCharStyleName.isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf40142) +{ + createSwDoc("tdf40142.odt"); + dispatchCommand(mxComponent, ".uno:UpdateAllIndexes", {}); + + xmlDocUniquePtr pLayout = parseLayoutDump(); + // Without the fix in place, this test would have failed with + // - Expected: 2 + // - Actual : 4 + assertXPath(pLayout, "/root/page[1]/body/section[2]/txt"_ostr, 2); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf151462) +{ + createSwDoc("tdf151462.odt"); + dispatchCommand(mxComponent, ".uno:UpdateAllIndexes", {}); + + xmlDocUniquePtr pLayout = parseLayoutDump(); + // Without the fix in place, there would be just the first index entry + assertXPath(pLayout, + "/root/page[1]/body/txt[2]/anchored/fly/section/txt[1]/SwParaPortion/" + "SwLineLayout[1]/SwLinePortion[1]"_ostr, + "portion"_ostr, "sub one"); + assertXPath(pLayout, + "/root/page[1]/body/txt[2]/anchored/fly/section/txt[2]/SwParaPortion/" + "SwLineLayout[1]/SwLinePortion[1]"_ostr, + "portion"_ostr, "sub two"); + assertXPath(pLayout, + "/root/page[1]/body/txt[2]/anchored/fly/section/txt[3]/SwParaPortion/" + "SwLineLayout[1]/SwLinePortion[1]"_ostr, + "portion"_ostr, "sub three"); + + // Without the fix in place, there would be just the first index entry + assertXPath(pLayout, + "/root/page[1]/body/txt[6]/anchored/fly/section/txt[1]/SwParaPortion/" + "SwLineLayout[1]/SwLinePortion[1]"_ostr, + "portion"_ostr, "another sub one"); + assertXPath(pLayout, + "/root/page[1]/body/txt[6]/anchored/fly/section/txt[2]/SwParaPortion/" + "SwLineLayout[1]/SwLinePortion[1]"_ostr, + "portion"_ostr, "another sub two"); + assertXPath(pLayout, + "/root/page[1]/body/txt[6]/anchored/fly/section/txt[3]/SwParaPortion/" + "SwLineLayout[1]/SwLinePortion[1]"_ostr, + "portion"_ostr, "another sub three"); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf151801) +{ + Resetter resetter([]() { + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::AutoCorrect::SingleQuoteAtStart::set(0, pBatch); + officecfg::Office::Common::AutoCorrect::SingleQuoteAtEnd::set(0, pBatch); + return pBatch->commit(); + }); + // Set Single Quotes › and ‹ + std::shared_ptr pBatch( + comphelper::ConfigurationChanges::create()); + officecfg::Office::Common::AutoCorrect::SingleQuoteAtStart::set(8250, pBatch); + officecfg::Office::Common::AutoCorrect::SingleQuoteAtEnd::set(8249, pBatch); + pBatch->commit(); + + createSwDoc("tdf151801.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + // Single starting quote: 'word -> ›word + emulateTyping(*pTextDoc, u"'word"); + OUString sReplaced(u"\u203Aword"_ustr); + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // Single ending quote: ›word' -> ›word‹ + emulateTyping(*pTextDoc, u"'"); + sReplaced += u"\u2039"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); + // Use apostrophe without preceding starting quote: word' -> word’ + emulateTyping(*pTextDoc, u" word'"); + sReplaced += u" word\u2019"; + CPPUNIT_ASSERT_EQUAL(sReplaced, getParagraph(1)->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testCursorPositionAfterUndo) +{ + createSwDoc("cursor_position_after_undo.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + // switch on "Outline Folding" mode + dispatchCommand(mxComponent, ".uno:ShowOutlineContentVisibilityButton", {}); + CPPUNIT_ASSERT(pWrtShell->GetViewOptions()->IsShowOutlineContentVisibilityButton()); + + // move the cursor to the beginning of the 3rd word in the 3rd paragraph, "tincidunt" + pWrtShell->FwdPara(); + pWrtShell->FwdPara(); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/false, 16, /*bBasicCall=*/false); + + // select the word + dispatchCommand(mxComponent, ".uno:SelectWord", {}); + + // check the word is select + SwShellCursor* pShellCursor = pWrtShell->getShellCursor(false); + CPPUNIT_ASSERT_EQUAL(OUString("tincidunt"), pShellCursor->GetText()); + + // remember the cursor position for comparison + SwPosition aCursorPos(*pWrtShell->GetCursor()->GetPoint()); + + // delete the selected word + pWrtShell->Delete(); + + // undo delete + dispatchCommand(mxComponent, ".uno:Undo", {}); + + // without the fix in place, the cursor would have been set to the start of the outline node + // - Expected: SwPosition (node 11, offset 25) + // - Actual : SwPosition (node 9, offset 0) + CPPUNIT_ASSERT_EQUAL(aCursorPos, *pWrtShell->GetCursor()->GetPoint()); + + // switch off "Outline Folding" mode + dispatchCommand(mxComponent, ".uno:ShowOutlineContentVisibilityButton", {}); + CPPUNIT_ASSERT(!pWrtShell->GetViewOptions()->IsShowOutlineContentVisibilityButton()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf73483) +{ + // Given a document with a first paragraph having a manually set page break with page style + createSwDoc("pageBreakWithPageStyle.fodt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), pWrtShell->GetCurPageStyle()); + + dispatchCommand(mxComponent, ".uno:ResetAttributes", {}); // Ctrl+M "Clear Direct Formatting" + // Make sure that clearing direct formatting doesn't clear the page style + CPPUNIT_ASSERT_EQUAL(OUString("Right Page"), pWrtShell->GetCurPageStyle()); + + // Make sure that the page break with page style survives ODF save-and-reload + saveAndReload("writer8"); + + xmlDocUniquePtr pXml = parseExport("content.xml"); + CPPUNIT_ASSERT(pXml); + OUString para_style_name = getXPath( + pXml, "/office:document-content/office:body/office:text/text:p"_ostr, "style-name"_ostr); + // Without the fix in place, this would fail + CPPUNIT_ASSERT(!para_style_name.equalsIgnoreAsciiCase("Standard")); + + OString para_style_path + = "/office:document-content/office:automatic-styles/style:style[@style:name='" + + para_style_name.toUtf8() + "']"; + assertXPath(pXml, para_style_path, "family"_ostr, "paragraph"); + // Without the fix in place, the autostyle had no parent + assertXPath(pXml, para_style_path, "parent-style-name"_ostr, "Standard"); + assertXPath(pXml, para_style_path, "master-page-name"_ostr, "Right_20_Page"); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf62032ApplyStyle) +{ + createSwDoc("tdf62032_apply_style.odt"); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtSh = pDoc->GetDocShell()->GetWrtShell(); + + pWrtSh->Down(/*bSelect=*/false); + + uno::Sequence aPropertyValues = comphelper::InitPropertySequence({ + { "Style", uno::Any(OUString("A 2")) }, + { "FamilyName", uno::Any(OUString("ParagraphStyles")) }, + }); + dispatchCommand(mxComponent, ".uno:StyleApply", aPropertyValues); + + // Without the fix in place, it fails with: + // - Expected: 1.1 + // - Actual : 2 + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), + getProperty(getParagraph(2), "ListLabelString").trim()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf156560) +{ + createSwDoc("tdf156560.docx"); + + uno::Reference xPageStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xPageStyle, "HeaderIsOn")); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_MOD1 | KEY_PAGEUP); + + // Insert header + // Without the fix in place, this test would have got SIGABRT here + dispatchCommand(mxComponent, ".uno:InsertHeader", {}); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf158459) +{ + createSwDoc("tdf158459_tracked_changes_across_nodes.fodt"); + SwDoc* pDoc = getSwDoc(); + + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + pWrtShell->FwdPara(); // Skip first paragraph + pWrtShell->EndOfSection(true); // Select everything to the end + + SwDoc aClipboard; + pWrtShell->Copy(aClipboard); // This must not crash + + pWrtShell->SelAll(); + pWrtShell->Delete(); + pWrtShell->Paste(aClipboard); // Replace everything with the copied stuff + + SwNodes& rNodes = pDoc->GetNodes(); + SwNodeIndex aIdx(rNodes.GetEndOfExtras()); + SwContentNode* pContentNode = rNodes.GoNext(&aIdx); + CPPUNIT_ASSERT(pContentNode); + SwTextNode* pTextNode = pContentNode->GetTextNode(); + CPPUNIT_ASSERT(pTextNode); + // Check that deleted parts (paragraph break, "c", "e") haven't been pasted + CPPUNIT_ASSERT_EQUAL(OUString("abdf"), pTextNode->GetText()); +} + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest8, testTdf158703) +{ + // Given a document with French text, consisting of a word and several spaces: + createSwDoc("tdf158703.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + dispatchCommand(mxComponent, ".uno:GoToEndOfDoc", {}); + + // Typing ":" after the spaces should start auto-correction, which is expected to + // remove the spaces, and insert an NBSP instead. It must not crash. + emulateTyping(*pTextDoc, u":"); + CPPUNIT_ASSERT_EQUAL(u"Foo\u00A0:"_ustr, getParagraph(1)->getString()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/uiwriter/uiwriter9.cxx b/sw/qa/extras/uiwriter/uiwriter9.cxx new file mode 100644 index 0000000000..b6dea5a8e7 --- /dev/null +++ b/sw/qa/extras/uiwriter/uiwriter9.cxx @@ -0,0 +1,74 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ +class SwUiWriterTest9 : public SwModelTestBase +{ +public: + SwUiWriterTest9() + : SwModelTestBase("/sw/qa/extras/uiwriter/data/") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf158785) +{ + // given a document with a hyperlink surrounded by N-dashes (–www.dordt.edu–) + createSwDoc("tdf158785_hyperlink.fodt"); + SwDoc& rDoc = *getSwDoc(); + SwWrtShell* pWrtShell = rDoc.GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + + // go to the end of the hyperlink + pWrtShell->SttEndDoc(/*bStart=*/false); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); + // get last point that will be part of the hyperlink (current position 1pt wide). + Point aLogicL(pWrtShell->GetCharRect().Center()); + Point aLogicR(aLogicL); + + // sanity check - we really are right by the hyperlink + aLogicL.AdjustX(-1); + SwContentAtPos aContentAtPos(IsAttrAtPos::InetAttr); + pWrtShell->GetContentAtPos(aLogicL, aContentAtPos); + CPPUNIT_ASSERT_EQUAL(IsAttrAtPos::InetAttr, aContentAtPos.eContentAtPos); + + // The test: the position of the N-dash should not indicate hyperlink properties + // cursor pos would NOT be considered part of the hyperlink, but increase for good measure... + aLogicR.AdjustX(1); + pWrtShell->GetContentAtPos(aLogicR, aContentAtPos); + CPPUNIT_ASSERT_EQUAL(IsAttrAtPos::NONE, aContentAtPos.eContentAtPos); +} + +} // end of anonymouse namespace +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/unowriter/data/bookmarkintable.fodt b/sw/qa/extras/unowriter/data/bookmarkintable.fodt new file mode 100644 index 0000000000..641200fef9 --- /dev/null +++ b/sw/qa/extras/unowriter/data/bookmarkintable.fodt @@ -0,0 +1,82 @@ + + + 2020-11-24T13:16:34.2483766402020-11-24T14:47:04.359492742PT2M22S2LibreOfficeDev/7.1.0.0.alpha1$Linux_X86_64 LibreOffice_project/a871df849fad8f923db945cf0606f30603380ef7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + afoob + + + + + + + diff --git a/sw/qa/extras/unowriter/data/image-comment-at-char.odt b/sw/qa/extras/unowriter/data/image-comment-at-char.odt new file mode 100644 index 0000000000..ba959d68ac Binary files /dev/null and b/sw/qa/extras/unowriter/data/image-comment-at-char.odt differ diff --git a/sw/qa/extras/unowriter/data/renderable-page-position.odt b/sw/qa/extras/unowriter/data/renderable-page-position.odt new file mode 100644 index 0000000000..3baddaf21f Binary files /dev/null and b/sw/qa/extras/unowriter/data/renderable-page-position.odt differ diff --git a/sw/qa/extras/unowriter/data/selection-in-table-enum.odt b/sw/qa/extras/unowriter/data/selection-in-table-enum.odt new file mode 100644 index 0000000000..bef9b0ea71 Binary files /dev/null and b/sw/qa/extras/unowriter/data/selection-in-table-enum.odt differ diff --git a/sw/qa/extras/unowriter/data/table-line-spacing.docx b/sw/qa/extras/unowriter/data/table-line-spacing.docx new file mode 100644 index 0000000000..60621f03ca Binary files /dev/null and b/sw/qa/extras/unowriter/data/table-line-spacing.docx differ diff --git a/sw/qa/extras/unowriter/data/tdf134250.fodt b/sw/qa/extras/unowriter/data/tdf134250.fodt new file mode 100644 index 0000000000..86aaa140c9 --- /dev/null +++ b/sw/qa/extras/unowriter/data/tdf134250.fodt @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foo + + + + bar + + + + diff --git a/sw/qa/extras/unowriter/data/tdf134252.fodt b/sw/qa/extras/unowriter/data/tdf134252.fodt new file mode 100644 index 0000000000..6e19ac847d --- /dev/null +++ b/sw/qa/extras/unowriter/data/tdf134252.fodt @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bar + + + + + baz + + + + + + foo + + + + diff --git a/sw/qa/extras/unowriter/data/tdf134252_onlytable_protected.fodt b/sw/qa/extras/unowriter/data/tdf134252_onlytable_protected.fodt new file mode 100644 index 0000000000..f588fdba05 --- /dev/null +++ b/sw/qa/extras/unowriter/data/tdf134252_onlytable_protected.fodt @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + baz + + + + + foo + + + diff --git a/sw/qa/extras/unowriter/data/test.jpg b/sw/qa/extras/unowriter/data/test.jpg new file mode 100644 index 0000000000..12b393569e Binary files /dev/null and b/sw/qa/extras/unowriter/data/test.jpg differ diff --git a/sw/qa/extras/unowriter/data/view-cursor-page-style.fodt b/sw/qa/extras/unowriter/data/view-cursor-page-style.fodt new file mode 100644 index 0000000000..c386e72c94 --- /dev/null +++ b/sw/qa/extras/unowriter/data/view-cursor-page-style.fodt @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + 01020304050607080910111213141516 + + + diff --git a/sw/qa/extras/unowriter/data/xautotextgroup.odt b/sw/qa/extras/unowriter/data/xautotextgroup.odt new file mode 100644 index 0000000000..e1cb9e7ea0 Binary files /dev/null and b/sw/qa/extras/unowriter/data/xautotextgroup.odt differ diff --git a/sw/qa/extras/unowriter/unowriter.cxx b/sw/qa/extras/unowriter/unowriter.cxx new file mode 100644 index 0000000000..8bcadbaf42 --- /dev/null +++ b/sw/qa/extras/unowriter/unowriter.cxx @@ -0,0 +1,1206 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +namespace +{ +/// Listener implementation for testPasteListener. +class PasteListener : public cppu::WeakImplHelper +{ + OUString m_aString; + uno::Reference m_xTextGraphicObject; + +public: + void SAL_CALL notifyPasteEvent(const uno::Sequence& rEvent) override; + + OUString& GetString(); + uno::Reference& GetTextGraphicObject(); +}; + +void PasteListener::notifyPasteEvent(const uno::Sequence& rEvent) +{ + comphelper::SequenceAsHashMap aMap(rEvent); + auto it = aMap.find("TextRange"); + if (it != aMap.end()) + { + auto xTextRange = it->second.get>(); + if (xTextRange.is()) + m_aString = xTextRange->getString(); + return; + } + + it = aMap.find("TextGraphicObject"); + if (it != aMap.end()) + { + auto xTextGraphicObject = it->second.get>(); + if (xTextGraphicObject.is()) + m_xTextGraphicObject = xTextGraphicObject; + } +} + +OUString& PasteListener::GetString() { return m_aString; } + +uno::Reference& PasteListener::GetTextGraphicObject() +{ + return m_xTextGraphicObject; +} +} + +/// Test to assert UNO API call results of Writer. +class SwUnoWriter : public SwModelTestBase +{ +public: + SwUnoWriter() + : SwModelTestBase("/sw/qa/extras/unowriter/data/", "writer8") + { + } +}; + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testDefaultCharStyle) +{ + // Create a new document, type a character, set its char style to Emphasis + // and assert the style was set. + createSwDoc(); + + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + xBodyText->insertString(xBodyText->getStart(), "x", false); + + uno::Reference xCursor(xBodyText->createTextCursor()); + xCursor->goLeft(1, true); + + uno::Reference xCursorProps(xCursor, uno::UNO_QUERY); + xCursorProps->setPropertyValue("CharStyleName", uno::Any(OUString("Emphasis"))); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, + getProperty(xCursorProps, "CharPosture")); + + // Now reset the char style and assert that the font slant is back to none. + // This resulted in a lang.IllegalArgumentException, Standard was not + // mapped to 'Default Style'. + xCursorProps->setPropertyValue("CharStyleName", uno::Any(OUString("Standard"))); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, + getProperty(xCursorProps, "CharPosture")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testInsertStringExpandsHints) +{ + createSwDoc(); + uno::Reference const xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference const xText(xTextDocument->getText()); + uno::Reference const xCursor(xText->createTextCursor()); + uno::Reference const xProps(xCursor, uno::UNO_QUERY); + + xText->insertString(xCursor, "ab", false); + xCursor->gotoStart(false); + xCursor->goRight(1, true); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xProps, "CharPosture")); + xProps->setPropertyValue("CharPosture", uno::Any(awt::FontSlant_ITALIC)); + xCursor->collapseToEnd(); + xText->insertString(xCursor, "x", false); + xCursor->goLeft(1, true); + CPPUNIT_ASSERT_EQUAL(OUString("x"), xCursor->getString()); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, getProperty(xProps, "CharPosture")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testInsertTextPortionNotExpandsHints) +{ + createSwDoc(); + uno::Reference const xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference const xText(xTextDocument->getText()); + uno::Reference const xTextA(xText, uno::UNO_QUERY); + uno::Reference const xCursor(xText->createTextCursor()); + uno::Reference const xProps(xCursor, uno::UNO_QUERY); + + xText->insertString(xCursor, "ab", false); + xCursor->gotoStart(false); + xCursor->goRight(1, true); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xProps, "CharPosture")); + xProps->setPropertyValue("CharPosture", uno::Any(awt::FontSlant_ITALIC)); + xCursor->collapseToEnd(); + xTextA->insertTextPortion("x", uno::Sequence(), xCursor); + xCursor->goLeft(1, true); + CPPUNIT_ASSERT_EQUAL(OUString("x"), xCursor->getString()); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xProps, "CharPosture")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testInsertTextContentExpandsHints) +{ + createSwDoc(); + uno::Reference const xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference const xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference const xText(xTextDocument->getText()); + uno::Reference const xCursor(xText->createTextCursor()); + uno::Reference const xProps(xCursor, uno::UNO_QUERY); + + xText->insertString(xCursor, "ab", false); + xCursor->gotoStart(false); + xCursor->goRight(1, true); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xProps, "CharPosture")); + xProps->setPropertyValue("CharPosture", uno::Any(awt::FontSlant_ITALIC)); + xCursor->collapseToEnd(); + uno::Reference const xContent( + xFactory->createInstance("com.sun.star.text.Footnote"), uno::UNO_QUERY); + xText->insertTextContent(xCursor, xContent, false); + xCursor->goLeft(1, true); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xCursor->getString()); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_ITALIC, getProperty(xProps, "CharPosture")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testInsertTextContentWithPropertiesNotExpandsHints) +{ + createSwDoc(); + uno::Reference const xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference const xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference const xText(xTextDocument->getText()); + uno::Reference const xTextA(xText, uno::UNO_QUERY); + uno::Reference const xCursor(xText->createTextCursor()); + uno::Reference const xProps(xCursor, uno::UNO_QUERY); + + xText->insertString(xCursor, "ab", false); + xCursor->gotoStart(false); + xCursor->goRight(1, true); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xProps, "CharPosture")); + xProps->setPropertyValue("CharPosture", uno::Any(awt::FontSlant_ITALIC)); + xCursor->collapseToEnd(); + uno::Reference const xContent( + xFactory->createInstance("com.sun.star.text.Footnote"), uno::UNO_QUERY); + xTextA->insertTextContentWithProperties(xContent, uno::Sequence(), + xCursor); + xCursor->goLeft(1, true); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xCursor->getString()); + CPPUNIT_ASSERT_EQUAL(awt::FontSlant_NONE, getProperty(xProps, "CharPosture")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testGraphicDescriptorURL) +{ + createSwDoc(); + + // Create a graphic object, but don't insert it yet. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xTextGraphic( + xFactory->createInstance("com.sun.star.text.TextGraphicObject"), uno::UNO_QUERY); + + // Set a URL on it. + xTextGraphic->setPropertyValue("GraphicURL", uno::Any(createFileURL(u"test.jpg"))); + xTextGraphic->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + + // Insert it. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + uno::Reference xCursor(xBodyText->createTextCursor()); + uno::Reference xTextContent(xTextGraphic, uno::UNO_QUERY); + xBodyText->insertTextContent(xCursor, xTextContent, false); + + // This failed, the graphic object had no graphic. + auto xGraphic = getProperty>(getShape(1), "Graphic"); + CPPUNIT_ASSERT(xGraphic.is()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testGraphicDescriptorURLBitmap) +{ + createSwDoc(); + + // Load a bitmap into the bitmap table. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xBitmaps( + xFactory->createInstance("com.sun.star.drawing.BitmapTable"), uno::UNO_QUERY); + xBitmaps->insertByName("test", uno::Any(createFileURL(u"test.jpg"))); + + // Create a graphic. + uno::Reference xTextGraphic( + xFactory->createInstance("com.sun.star.text.TextGraphicObject"), uno::UNO_QUERY); + xTextGraphic->setPropertyValue("GraphicURL", xBitmaps->getByName("test")); + xTextGraphic->setPropertyValue("AnchorType", + uno::Any(text::TextContentAnchorType_AT_CHARACTER)); + + // Insert it. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + uno::Reference xCursor(xBodyText->createTextCursor()); + uno::Reference xTextContent(xTextGraphic, uno::UNO_QUERY); + xBodyText->insertTextContent(xCursor, xTextContent, false); + + // This failed: setting GraphicURL to the result of getByName() did not + // work anymore. + auto xGraphic = getProperty>(getShape(1), "Graphic"); + CPPUNIT_ASSERT(xGraphic.is()); +} + +static bool ensureAutoTextExistsByTitle(const uno::Reference& autoTextGroup, + std::u16string_view autoTextName) +{ + const uno::Sequence aTitles(autoTextGroup->getTitles()); + for (const auto& rTitle : aTitles) + { + if (rTitle == autoTextName) + return true; + } + return false; +} + +static bool ensureAutoTextExistsByName(const uno::Reference& autoTextGroup, + std::u16string_view autoTextName) +{ + const uno::Sequence aTitles(autoTextGroup->getElementNames()); + for (const auto& rTitle : aTitles) + { + if (rTitle == autoTextName) + return true; + } + return false; +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testXAutoTextGroup) +{ + createSwDoc("xautotextgroup.odt"); + uno::Reference xAutoTextContainer + = text::AutoTextContainer::create(comphelper::getProcessComponentContext()); + + uno::Reference xTextRange = getRun(getParagraph(1), 1); + + static constexpr OUString sGroupName = u"TestGroup*1"_ustr; + static constexpr OUString sTextName = u"TEST"_ustr; + static constexpr OUString sTextNameNew = u"TESTRENAMED"_ustr; + static constexpr OUString sTextTitle = u"Test Auto Text"_ustr; + static constexpr OUString sTextTitleNew = u"Test Auto Text Renamed"_ustr; + + // Create new temporary group + uno::Reference xAutoTextGroup + = xAutoTextContainer->insertNewByName(sGroupName); + CPPUNIT_ASSERT_MESSAGE("AutoTextGroup was not found!", xAutoTextGroup.is()); + + // Insert new element and ensure it exists + uno::Reference xAutoTextEntry + = xAutoTextGroup->insertNewByName(sTextName, sTextTitle, xTextRange); + CPPUNIT_ASSERT_MESSAGE("AutoText was not inserted!", xAutoTextEntry.is()); + CPPUNIT_ASSERT_MESSAGE("Can't find newly created AutoText by title!", + ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitle)); + CPPUNIT_ASSERT_MESSAGE("Can't find newly created AutoText by name!", + ensureAutoTextExistsByName(xAutoTextGroup, sTextName)); + + // Insert once again the same should throw an exception + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on insertion of same AutoText", + xAutoTextGroup->insertNewByName(sTextName, sTextTitle, xTextRange), + container::ElementExistException); + + // Rename it & ensure everything is ok + xAutoTextGroup->renameByName(sTextName, sTextNameNew, sTextTitleNew); + CPPUNIT_ASSERT_MESSAGE("Can't find renamed AutoText by title!", + ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitleNew)); + CPPUNIT_ASSERT_MESSAGE("Can't find renamed AutoText by name!", + ensureAutoTextExistsByName(xAutoTextGroup, sTextNameNew)); + // Not found by old names + CPPUNIT_ASSERT_MESSAGE("Found AutoText by old title!", + !ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitle)); + CPPUNIT_ASSERT_MESSAGE("Found AutoText by old name!", + !ensureAutoTextExistsByName(xAutoTextGroup, sTextName)); + + // Rename not existing should throw an exception + CPPUNIT_ASSERT_THROW_MESSAGE( + "We expect an exception on renaming not-existing AutoText", + xAutoTextGroup->renameByName(sTextName, sTextNameNew, sTextTitleNew), + container::ElementExistException); + + // Remove it and ensure it does not exist + xAutoTextGroup->removeByName(sTextNameNew); + CPPUNIT_ASSERT_MESSAGE("AutoText was not removed!", + !ensureAutoTextExistsByTitle(xAutoTextGroup, sTextTitleNew)); + CPPUNIT_ASSERT_MESSAGE("AutoText was not removed!", + !ensureAutoTextExistsByName(xAutoTextGroup, sTextNameNew)); + + // Remove non-existing element should throw an exception + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on removing not-existing AutoText", + xAutoTextGroup->removeByName(sTextName), + container::NoSuchElementException); + + // Remove our temporary group + xAutoTextContainer->removeByName(sGroupName); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testSectionAnchorCopyTableAtStart) +{ + // this contains a section that starts with a table + createSwDoc("tdf134250.fodt"); + + uno::Reference const xTextTablesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference const xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + uno::Reference const xTextSectionsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference const xSections( + xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + + uno::Reference const xSection(xSections->getByIndex(0), uno::UNO_QUERY); + uno::Reference const xAnchor(xSection->getAnchor()); + CPPUNIT_ASSERT_EQUAL(OUString("foo" SAL_NEWLINE_STRING "bar"), xAnchor->getString()); + + // copy the content of the section to a clipboard document + uno::Reference const xTS( + uno::Reference(mxComponent, uno::UNO_QUERY_THROW)->getCurrentController(), + uno::UNO_QUERY); + uno::Reference const xTTS(xTS, uno::UNO_QUERY); + uno::Reference const xTransferable( + xTTS->getTransferableForTextRange(xAnchor)); + + // check this doesn't throw + CPPUNIT_ASSERT(xAnchor->getText().is()); + CPPUNIT_ASSERT(xAnchor->getStart().is()); + CPPUNIT_ASSERT(xAnchor->getEnd().is()); + + // replace section content + xAnchor->setString("quux"); + + // table in section was deleted, but not section itself + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + CPPUNIT_ASSERT_EQUAL(OUString("\"" + "quux" /*SAL_NEWLINE_STRING*/ "\""), + OUString("\"" + xAnchor->getString() + "\"")); + + // now paste it + uno::Reference const xTVCS(xTS, uno::UNO_QUERY); + uno::Reference const xCursor(xTVCS->getViewCursor()); + xCursor->gotoEnd(false); + xTS->insertTransferable(xTransferable); + + // table in section was pasted, but not section itself + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + xCursor->gotoStart(true); + CPPUNIT_ASSERT_EQUAL(OUString("quux" SAL_NEWLINE_STRING "foo" SAL_NEWLINE_STRING "bar"), + xCursor->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testSectionAnchorCopyTableAtEnd) +{ + // this contains a section that ends with a table (plus another section) + createSwDoc("tdf134252.fodt"); + + uno::Reference const xTextTablesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference const xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + uno::Reference const xTextSectionsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference const xSections( + xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount()); + + uno::Reference const xSection(xSections->getByIndex(0), uno::UNO_QUERY); + uno::Reference const xAnchor(xSection->getAnchor()); + CPPUNIT_ASSERT_EQUAL(OUString("bar" SAL_NEWLINE_STRING "baz" SAL_NEWLINE_STRING), + xAnchor->getString()); + + // copy the content of the section to a clipboard document + uno::Reference const xTS( + uno::Reference(mxComponent, uno::UNO_QUERY_THROW)->getCurrentController(), + uno::UNO_QUERY); + uno::Reference const xTTS(xTS, uno::UNO_QUERY); + uno::Reference const xTransferable( + xTTS->getTransferableForTextRange(xAnchor)); + + // check this doesn't throw + CPPUNIT_ASSERT(xAnchor->getText().is()); + CPPUNIT_ASSERT(xAnchor->getStart().is()); + CPPUNIT_ASSERT(xAnchor->getEnd().is()); + + // replace section content + xAnchor->setString("quux"); + + // table in section was deleted, but not section itself + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount()); + CPPUNIT_ASSERT_EQUAL(OUString("\"" + "quux" /*SAL_NEWLINE_STRING*/ "\""), + OUString("\"" + xAnchor->getString() + "\"")); + + // now paste it + uno::Reference const xTVCS(xTS, uno::UNO_QUERY); + uno::Reference const xCursor(xTVCS->getViewCursor()); + xCursor->gotoEnd(false); + xTS->insertTransferable(xTransferable); + + // table in section was pasted, but not section itself + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xSections->getCount()); + // note: this selects the 2nd section because it calls StartOfSection() + // not SttEndDoc() like it should? + xCursor->gotoStart(true); + CPPUNIT_ASSERT_EQUAL(OUString(/*"quux" SAL_NEWLINE_STRING */ + "foobar" SAL_NEWLINE_STRING "baz" SAL_NEWLINE_STRING), + xCursor->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testSectionAnchorCopyTable) +{ + // this contains a section that ends with a table (plus another section) + createSwDoc("tdf134252_onlytable_protected.fodt"); + + uno::Reference const xTextTablesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference const xTables(xTextTablesSupplier->getTextTables(), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + + uno::Reference const xTextSectionsSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference const xSections( + xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + + uno::Reference const xSection(xSections->getByIndex(0), uno::UNO_QUERY); + uno::Reference const xAnchor(xSection->getAnchor()); + CPPUNIT_ASSERT_EQUAL(OUString("baz" SAL_NEWLINE_STRING), xAnchor->getString()); + + // copy the content of the section to a clipboard document + uno::Reference const xTS( + uno::Reference(mxComponent, uno::UNO_QUERY_THROW)->getCurrentController(), + uno::UNO_QUERY); + uno::Reference const xTTS(xTS, uno::UNO_QUERY); + uno::Reference const xTransferable( + xTTS->getTransferableForTextRange(xAnchor)); + + // check this doesn't throw + CPPUNIT_ASSERT(xAnchor->getText().is()); + CPPUNIT_ASSERT(xAnchor->getStart().is()); + CPPUNIT_ASSERT(xAnchor->getEnd().is()); + + // replace section content + xAnchor->setString("quux"); + + // table in section was deleted, but not section itself + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + CPPUNIT_ASSERT_EQUAL(OUString("\"" + "quux" /*SAL_NEWLINE_STRING*/ "\""), + OUString("\"" + xAnchor->getString() + "\"")); + + // now paste it + uno::Reference const xTVCS(xTS, uno::UNO_QUERY); + uno::Reference const xCursor(xTVCS->getViewCursor()); + xCursor->gotoEnd(false); + xTS->insertTransferable(xTransferable); + + // table in section was pasted, but not section itself + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSections->getCount()); + xCursor->gotoStart(true); + CPPUNIT_ASSERT_EQUAL( + OUString("quux" SAL_NEWLINE_STRING "foo" SAL_NEWLINE_STRING "baz" SAL_NEWLINE_STRING), + xCursor->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTextRangeInTable) +{ + createSwDoc("bookmarkintable.fodt"); + + uno::Reference const xBS(mxComponent, uno::UNO_QUERY); + uno::Reference const xMarks(xBS->getBookmarks()); + uno::Reference const xMark(xMarks->getByName("Bookmark 1"), uno::UNO_QUERY); + uno::Reference const xAnchor(xMark->getAnchor(), uno::UNO_QUERY); + uno::Reference const xEnum(xAnchor->createEnumeration()); + uno::Reference const xPara(xEnum->nextElement(), uno::UNO_QUERY); + // not the top-level table! + CPPUNIT_ASSERT(!xPara->supportsService("com.sun.star.text.TextTable")); + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); + uno::Reference const xParaEA(xPara, uno::UNO_QUERY); + uno::Reference const xPortions(xParaEA->createEnumeration()); + uno::Reference const xP1(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xP1, "TextPortionType")); + uno::Reference const xP2(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), getProperty(xP2, "TextPortionType")); + uno::Reference const xP2R(xP2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("foo"), xP2R->getString()); + uno::Reference const xP3(xPortions->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Bookmark"), getProperty(xP3, "TextPortionType")); + CPPUNIT_ASSERT(!xPortions->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testXURI) +{ + uno::Reference xContext(::comphelper::getProcessComponentContext()); + + // createKnown() + uno::Reference xURIcreateKnown( + rdf::URI::createKnown(xContext, rdf::URIs::ODF_PREFIX), uno::UNO_SET_THROW); + CPPUNIT_ASSERT(xURIcreateKnown.is()); + CPPUNIT_ASSERT_EQUAL(OUString("http://docs.oasis-open.org/ns/office/1.2/meta/odf#"), + xURIcreateKnown->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("prefix"), xURIcreateKnown->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://docs.oasis-open.org/ns/office/1.2/meta/odf#prefix"), + xURIcreateKnown->getStringValue()); + + // createKnown() with invalid constant + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid constant", + rdf::URI::createKnown(xContext, 12345), + lang::IllegalArgumentException); + + // create() + uno::Reference xURIcreate( + rdf::URI::create(xContext, "http://example.com/url#somedata"), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#"), xURIcreate->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("somedata"), xURIcreate->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#somedata"), xURIcreate->getStringValue()); + + // create() without local name split with "/" + uno::Reference xURIcreate2(rdf::URI::create(xContext, "http://example.com/url"), + uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), xURIcreate2->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("url"), xURIcreate2->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url"), xURIcreate2->getStringValue()); + + // create() without prefix + uno::Reference xURIcreate3(rdf::URI::create(xContext, "#somedata"), + uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("#"), xURIcreate3->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("somedata"), xURIcreate3->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("#somedata"), xURIcreate3->getStringValue()); + + // create() with invalid URI + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid URI", + rdf::URI::create(xContext, "some junk and not URI"), + lang::IllegalArgumentException); + + // createNS() + uno::Reference xURIcreateNS( + rdf::URI::createNS(xContext, "http://example.com/url#", "somedata"), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#"), xURIcreateNS->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("somedata"), xURIcreateNS->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/url#somedata"), + xURIcreateNS->getStringValue()); + + // TODO: What's going on here? Is such usecase valid? + uno::Reference xURIcreateNS2( + rdf::URI::createNS(xContext, "http://example.com/url", "somedata"), uno::UNO_SET_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/"), xURIcreateNS2->getNamespace()); + CPPUNIT_ASSERT_EQUAL(OUString("urlsomedata"), xURIcreateNS2->getLocalName()); + CPPUNIT_ASSERT_EQUAL(OUString("http://example.com/urlsomedata"), + xURIcreateNS2->getStringValue()); + + // createNS() some invalid cases + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid URI", + rdf::URI::createNS(xContext, "bla", "bla"), + lang::IllegalArgumentException); + + CPPUNIT_ASSERT_THROW_MESSAGE("We expect an exception on invalid URI", + rdf::URI::createNS(xContext, OUString(), OUString()), + lang::IllegalArgumentException); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testSetPagePrintSettings) +{ + // Create an empty new document with a single char + createSwDoc(); + + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + xBodyText->insertString(xBodyText->getStart(), "x", false); + + uno::Reference xPagePrintable(mxComponent, uno::UNO_QUERY); + + // set some stuff, try to get it back + uno::Sequence aProps{ + comphelper::makePropertyValue("PageColumns", sal_Int16(2)), + comphelper::makePropertyValue("IsLandscape", true) + }; + + xPagePrintable->setPagePrintSettings(aProps); + const comphelper::SequenceAsHashMap aMap(xPagePrintable->getPagePrintSettings()); + + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), aMap.getValue("PageColumns").get()); + CPPUNIT_ASSERT_EQUAL(true, aMap.getValue("IsLandscape").get()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testDeleteFlyAtCharAtStart) +{ + createSwDoc(); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* const pWrtShell(pTextDoc->GetDocShell()->GetWrtShell()); + SwDoc* const pDoc(pWrtShell->GetDoc()); + + // insert some text + IDocumentContentOperations& rIDCO(pDoc->getIDocumentContentOperations()); + rIDCO.InsertString(*pWrtShell->GetCursor(), "foo bar baz"); + + // insert fly anchored at start of body text + pWrtShell->ClearMark(); + pWrtShell->SttEndDoc(true); + SfxItemSet frameSet(pDoc->GetAttrPool(), svl::Items); + SfxItemSet grfSet(pDoc->GetAttrPool(), svl::Items); + SwFormatAnchor anchor(RndStdIds::FLY_AT_CHAR); + frameSet.Put(anchor); + Graphic grf; + CPPUNIT_ASSERT(rIDCO.InsertGraphic(*pWrtShell->GetCursor(), OUString(), OUString(), &grf, + &frameSet, &grfSet, nullptr)); + + // check fly + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + uno::Reference const xShape(getShape(1), uno::UNO_QUERY); + // anchored at start of body text? + uno::Reference const xText(pTextDoc->getText()); + uno::Reference const xTextRC(xText, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), + xTextRC->compareRegionStarts(xText->getStart(), xShape->getAnchor())); + + // delete 1st character + uno::Reference const xCursor(xText->createTextCursor()); + xCursor->goRight(1, true); + xCursor->setString(""); + + // there is exactly one fly + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + // select entire body text + xCursor->gotoStart(true); + xCursor->gotoEnd(true); + xCursor->setString(""); + + // there is no fly + CPPUNIT_ASSERT_EQUAL(0, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testSelectionInTableEnum) +{ + createSwDoc("selection-in-table-enum.odt"); + // Select the A1 cell's text. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + pWrtShell->Down(/*bSelect=*/false); + pWrtShell->EndPara(/*bSelect=*/true); + CPPUNIT_ASSERT_EQUAL(OUString("A1"), + pWrtShell->GetCursor()->GetPointNode().GetTextNode()->GetText()); + + // Access the selection. + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xModel.is()); + uno::Reference xSelections(xModel->getCurrentSelection(), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xSelections.is()); + uno::Reference xSelection(xSelections->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xSelection.is()); + + // Enumerate paragraphs in the selection. + uno::Reference xCursor( + xSelection->getText()->createTextCursorByRange(xSelection), uno::UNO_QUERY); + CPPUNIT_ASSERT(xCursor.is()); + uno::Reference xEnum = xCursor->createEnumeration(); + xEnum->nextElement(); + // Without the accompanying fix in place, this test would have failed: i.e. + // the enumeration contained a second paragraph, even if the cell has only + // one paragraph. + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testSelectionInTableEnumEnd) +{ + createSwDoc("selection-in-table-enum.odt"); + // Select from "Before" till the table end. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + pWrtShell->Down(/*bSelect=*/true); + + // Access the selection. + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xModel.is()); + uno::Reference xSelections(xModel->getCurrentSelection(), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xSelections.is()); + uno::Reference xSelection(xSelections->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT(xSelection.is()); + CPPUNIT_ASSERT_EQUAL(OUString("Before" SAL_NEWLINE_STRING "A1" SAL_NEWLINE_STRING + "B1" SAL_NEWLINE_STRING "C2" SAL_NEWLINE_STRING + "A2" SAL_NEWLINE_STRING "B2" SAL_NEWLINE_STRING + "C2" SAL_NEWLINE_STRING), + xSelection->getString()); + + // Enumerate paragraphs in the selection. + uno::Reference xCursor( + xSelection->getText()->createTextCursorByRange(xSelection), uno::UNO_QUERY); + CPPUNIT_ASSERT(xCursor.is()); + uno::Reference xEnum = xCursor->createEnumeration(); + // Before. + xEnum->nextElement(); + // Table. + xEnum->nextElement(); + // Without the accompanying fix in place, this test would have failed: i.e. + // the enumeration contained the paragraph after the table, but no part of + // that paragraph was part of the selection. + CPPUNIT_ASSERT(!xEnum->hasMoreElements()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testRenderablePagePosition) +{ + createSwDoc("renderable-page-position.odt"); + // Make sure that the document has 2 pages. + uno::Reference xRenderable(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(mxComponent.is()); + + uno::Any aSelection(mxComponent); + + uno::Reference xToolkit = VCLUnoHelper::CreateToolkit(); + uno::Reference xDevice(xToolkit->createScreenCompatibleDevice(32, 32)); + + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xController = xModel->getCurrentController(); + + beans::PropertyValues aRenderOptions = { + comphelper::makePropertyValue("IsPrinter", true), + comphelper::makePropertyValue("RenderDevice", xDevice), + comphelper::makePropertyValue("View", xController), + comphelper::makePropertyValue("RenderToGraphic", true), + }; + + sal_Int32 nPages = xRenderable->getRendererCount(aSelection, aRenderOptions); + CPPUNIT_ASSERT_EQUAL(static_cast(2), nPages); + + // Make sure that the first page has some offset. + comphelper::SequenceAsHashMap aRenderer1( + xRenderable->getRenderer(0, aSelection, aRenderOptions)); + // Without the accompanying fix in place, this test would have failed: i.e. + // there was no PagePos key in this map. + awt::Point aPosition1 = aRenderer1["PagePos"].get(); + CPPUNIT_ASSERT_GREATER(static_cast(0), aPosition1.X); + CPPUNIT_ASSERT_GREATER(static_cast(0), aPosition1.Y); + + // Make sure that the second page is below the first one. + comphelper::SequenceAsHashMap aRenderer2( + xRenderable->getRenderer(1, aSelection, aRenderOptions)); + awt::Point aPosition2 = aRenderer2["PagePos"].get(); + CPPUNIT_ASSERT_GREATER(static_cast(0), aPosition2.X); + CPPUNIT_ASSERT_GREATER(aPosition1.Y, aPosition2.Y); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testPasteListener) +{ + createSwDoc(); + + // Insert initial string. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + xBodyText->insertString(xBodyText->getStart(), "ABCDEF", false); + + // Add paste listener. + uno::Reference xBroadcaster(mxComponent, uno::UNO_QUERY); + uno::Reference xListener(new PasteListener); + auto pListener = static_cast(xListener.get()); + xBroadcaster->addPasteEventListener(xListener); + + // Cut "DE" and then paste it. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtShell); + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 3, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 2, /*bBasicCall=*/false); + rtl::Reference pTransfer = new SwTransferable(*pWrtShell); + pTransfer->Cut(); + TransferableDataHelper aHelper(pTransfer); + SwTransferable::Paste(*pWrtShell, aHelper); + // Without working listener registration in place, this test would have + // failed with 'Expected: DE; Actual:', i.e. the paste listener was not + // invoked. + CPPUNIT_ASSERT_EQUAL(OUString("DE"), pListener->GetString()); + + // Make sure that paste did not overwrite anything. + CPPUNIT_ASSERT_EQUAL(OUString("ABCDEF"), xBodyText->getString()); + + // Paste again, this time overwriting "BC". + pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 4, /*bBasicCall=*/false); + pWrtShell->Right(SwCursorSkipMode::Chars, /*bSelect=*/true, 2, /*bBasicCall=*/false); + pListener->GetString().clear(); + SwTransferable::Paste(*pWrtShell, aHelper); + CPPUNIT_ASSERT_EQUAL(OUString("DE"), pListener->GetString()); + + // Make sure that paste overwrote "BC". + CPPUNIT_ASSERT_EQUAL(OUString("ADEDEF"), xBodyText->getString()); + + // Test image paste. + SwView& rView = pWrtShell->GetView(); + rView.InsertGraphic(createFileURL(u"test.jpg"), OUString(), /*bAsLink=*/false, + &GraphicFilter::GetGraphicFilter()); + + // Test that the pasted image is anchored as-char. + SwFlyFrame* pFly = pWrtShell->GetSelectedFlyFrame(); + CPPUNIT_ASSERT(pFly); + SwFrameFormat* pFlyFormat = pFly->GetFormat(); + CPPUNIT_ASSERT(pFlyFormat); + RndStdIds eFlyAnchor = pFlyFormat->GetAnchor().GetAnchorId(); + // Without the working image listener in place, this test would have + // failed, eFlyAnchor was FLY_AT_PARA. + CPPUNIT_ASSERT_EQUAL(RndStdIds::FLY_AT_CHAR, eFlyAnchor); + + pTransfer->Cut(); + pListener->GetString().clear(); + SwTransferable::Paste(*pWrtShell, aHelper); + // Without the working image listener in place, this test would have + // failed, the listener was not invoked in case of a graphic paste. + CPPUNIT_ASSERT(pListener->GetTextGraphicObject().is()); + CPPUNIT_ASSERT(pListener->GetString().isEmpty()); + + // Deregister paste listener, make sure it's not invoked. + xBroadcaster->removePasteEventListener(xListener); + pListener->GetString().clear(); + SwTransferable::Paste(*pWrtShell, aHelper); + CPPUNIT_ASSERT(pListener->GetString().isEmpty()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testImageCommentAtChar) +{ + // Load a document with an at-char image in it (and a comment on the image). + createSwDoc("image-comment-at-char.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + + // Verify that we have an annotation mark (comment with a text range) in the document. + // Without the accompanying fix in place, this test would have failed, as comments lost their + // ranges on load when their range only covered the placeholder character of the comment (which + // is also the anchor position of the image). + IDocumentMarkAccess* pMarks = pDoc->getIDocumentMarkAccess(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), pMarks->getAnnotationMarksCount()); + + uno::Reference xPara = getParagraph(1); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + getProperty(getRun(xPara, 1), "TextPortionType")); + // Without the accompanying fix in place, this test would have failed with 'Expected: + // Annotation; Actual: Frame', i.e. the comment-start portion was after the commented image. + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), + getProperty(getRun(xPara, 2), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), + getProperty(getRun(xPara, 3), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), + getProperty(getRun(xPara, 4), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + getProperty(getRun(xPara, 5), "TextPortionType")); + + // Without the accompanying fix in place, this test would have failed with 'Expected: + // 5892; Actual: 1738', i.e. the anchor pos was between the "aaa" and "bbb" portions, not at the + // center of the page (horizontally) where the image is. On macOS, though, with the fix in + // place the actual value consistently is even greater with 6283 now instead of 5892, for + // whatever reason. + SwView* pView = pDoc->GetDocShell()->GetView(); + SwPostItMgr* pPostItMgr = pView->GetPostItMgr(); + for (const auto& pItem : *pPostItMgr) + { + const SwRect& rAnchor = pItem->mpPostIt->GetAnchorRect(); + CPPUNIT_ASSERT_GREATEREQUAL(static_cast(5892), rAnchor.Left()); + } +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testChapterNumberingCharStyle) +{ + createSwDoc(); + + uno::Reference xDoc(mxComponent, uno::UNO_QUERY); + uno::Reference xStyle( + xDoc->createInstance("com.sun.star.style.CharacterStyle"), uno::UNO_QUERY); + uno::Reference xStyleN(xStyle, uno::UNO_QUERY); + xStyle->setPropertyValue("CharColor", uno::Any(COL_LIGHTRED)); + uno::Reference xSFS(mxComponent, uno::UNO_QUERY); + uno::Reference xStyles( + xSFS->getStyleFamilies()->getByName("CharacterStyles"), uno::UNO_QUERY); + xStyles->insertByName("red", uno::Any(xStyle)); + + uno::Reference xCNS(mxComponent, uno::UNO_QUERY); + uno::Reference xOutline(xCNS->getChapterNumberingRules()); + { + comphelper::SequenceAsHashMap hashMap(xOutline->getByIndex(0)); + hashMap["CharStyleName"] <<= OUString("red"); + uno::Sequence props; + hashMap >> props; + xOutline->replaceByIndex(0, uno::Any(props)); + } + // now rename the style + xStyleN->setName("reddishred"); + { + comphelper::SequenceAsHashMap hashMap(xOutline->getByIndex(0)); + + // tdf#137810 this failed, was old value "red" + CPPUNIT_ASSERT_EQUAL(OUString("reddishred"), hashMap["CharStyleName"].get()); + } +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testViewCursorPageStyle) +{ + // Load a document with 2 pages, but a single paragraph. + createSwDoc("view-cursor-page-style.fodt"); + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT(xModel.is()); + uno::Reference xController(xModel->getCurrentController(), + uno::UNO_QUERY); + CPPUNIT_ASSERT(xController.is()); + uno::Reference xViewCursor(xController->getViewCursor(), uno::UNO_QUERY); + CPPUNIT_ASSERT(xViewCursor.is()); + + // Go to the first page, which has an explicit page style. + xViewCursor->jumpToPage(1); + OUString aActualPageStyleName = getProperty(xViewCursor, "PageStyleName"); + CPPUNIT_ASSERT_EQUAL(OUString("First Page"), aActualPageStyleName); + + // Go to the second page, which is still the first paragraph, but the page style is different, + // as the explicit 'First Page' page style has a next style defined (Standard). + xViewCursor->jumpToPage(2); + aActualPageStyleName = getProperty(xViewCursor, "PageStyleName"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Standard + // - Actual : First Page + // i.e. the cursor position was determined only based on the node index, ignoring the content + // index. + CPPUNIT_ASSERT_EQUAL(OUString("Standard"), aActualPageStyleName); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testXTextCursor_setPropertyValues) +{ + // Create a new document, type a character, pass a set of property/value pairs consisting of one + // unknown property and CharStyleName, assert that it threw UnknownPropertyException (actually + // wrapped into WrappedTargetException), and assert the style was set, not discarded. + createSwDoc(); + + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xBodyText = xTextDocument->getText(); + xBodyText->insertString(xBodyText->getStart(), "x", false); + + uno::Reference xCursor(xBodyText->createTextCursor()); + xCursor->goLeft(1, true); + + uno::Reference xCursorProps(xCursor, uno::UNO_QUERY); + uno::Sequence aPropNames = { "OneUnknownProperty", "CharStyleName" }; + uno::Sequence aPropValues = { uno::Any(), uno::Any(OUString("Emphasis")) }; + CPPUNIT_ASSERT_THROW(xCursorProps->setPropertyValues(aPropNames, aPropValues), + lang::WrappedTargetException); + CPPUNIT_ASSERT_EQUAL(OUString("Emphasis"), + getProperty(xCursorProps, "CharStyleName")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testShapeAllowOverlap) +{ + // Test the AllowOverlap frame/shape property. + + // Create a new document and insert a rectangle. + createSwDoc(); + uno::Reference xDocument(mxComponent, uno::UNO_QUERY); + awt::Point aPoint(1000, 1000); + awt::Size aSize(10000, 10000); + uno::Reference xShape( + xDocument->createInstance("com.sun.star.drawing.RectangleShape"), uno::UNO_QUERY); + xShape->setPosition(aPoint); + xShape->setSize(aSize); + uno::Reference xDrawPageSupplier(xDocument, uno::UNO_QUERY); + xDrawPageSupplier->getDrawPage()->add(xShape); + + // The property is on by default, turn it off & verify. + uno::Reference xShapeProperties(xShape, uno::UNO_QUERY); + xShapeProperties->setPropertyValue("AllowOverlap", uno::Any(false)); + CPPUNIT_ASSERT(!getProperty(xShapeProperties, "AllowOverlap")); + + // Turn it back to on & verify. + xShapeProperties->setPropertyValue("AllowOverlap", uno::Any(true)); + CPPUNIT_ASSERT(getProperty(xShapeProperties, "AllowOverlap")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTextConvertToTableLineSpacing) +{ + // Load a document which has a table with a single cell. + // The cell has both a table style and a paragraph style, with different line spacing + // heights. + createSwDoc("table-line-spacing.docx"); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), + uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A1"); + uno::Reference xCellText(xCell, uno::UNO_QUERY); + uno::Reference xParagraph = getParagraphOfText(1, xCellText); + style::LineSpacing aLineSpacing + = getProperty(xParagraph, "ParaLineSpacing"); + // Make sure that we take the line spacing from the paragraph style, not from the table style. + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 388 + // - Actual : 635 + // I.e. the 360 twips line spacing was taken from the table style, not the 220 twips one from + // the paragraph style. + CPPUNIT_ASSERT_EQUAL(static_cast(convertTwipToMm100(220)), aLineSpacing.Height); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testMultiSelect) +{ + // Create a new document and add a text with several repeated sequences. + createSwDoc(); + uno::Reference xTextDocument(mxComponent, css::uno::UNO_QUERY_THROW); + auto xSimpleText = xTextDocument->getText(); + xSimpleText->insertString(xSimpleText->getStart(), "Abc aBc abC", false); + + // Create a search descriptor and find all occurencies of search string + css::uno::Reference xSearchable(mxComponent, css::uno::UNO_QUERY_THROW); + auto xSearchDescriptor = xSearchable->createSearchDescriptor(); + xSearchDescriptor->setPropertyValue("SearchStyles", css::uno::Any(false)); + xSearchDescriptor->setPropertyValue("SearchCaseSensitive", css::uno::Any(false)); + xSearchDescriptor->setPropertyValue("SearchBackwards", css::uno::Any(true)); + xSearchDescriptor->setPropertyValue("SearchRegularExpression", css::uno::Any(false)); + xSearchDescriptor->setSearchString("abc"); + auto xSearchResult = xSearchable->findAll(xSearchDescriptor); + + // Select them all + auto xController = xTextDocument->getCurrentController(); + css::uno::Reference xSelectionSupplier( + xController, css::uno::UNO_QUERY_THROW); + xSelectionSupplier->select(css::uno::Any(xSearchResult)); + css::uno::Reference xSelection(xSelectionSupplier->getSelection(), + css::uno::UNO_QUERY_THROW); + // Now check that they all are selected in the reverse order ("SearchBackwards"). + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), xSelection->getCount()); + css::uno::Reference xTextRange(xSelection->getByIndex(0), + css::uno::UNO_QUERY_THROW); + // For #0, result was empty (cursor was put before the last occurrence without selection) + CPPUNIT_ASSERT_EQUAL(OUString("abC"), xTextRange->getString()); + xTextRange.set(xSelection->getByIndex(1), css::uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("aBc"), xTextRange->getString()); + xTextRange.set(xSelection->getByIndex(2), css::uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(OUString("Abc"), xTextRange->getString()); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTransparentText) +{ + // Test the CharTransparence text portion property. + + // Create a new document. + createSwDoc(); + + // Set a custom transparency. + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + sal_Int16 nExpected = 42; + xParagraph->setPropertyValue("CharTransparence", uno::Any(nExpected)); + + // Get the transparency & verify. + CPPUNIT_ASSERT_EQUAL(nExpected, getProperty(xParagraph, "CharTransparence")); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTdf129839) +{ + // Create a new document and add a table + createSwDoc(); + css::uno::Reference xTextDocument(mxComponent, + css::uno::UNO_QUERY_THROW); + css::uno::Reference xFac(xTextDocument, + css::uno::UNO_QUERY_THROW); + css::uno::Reference xTable( + xFac->createInstance("com.sun.star.text.TextTable"), css::uno::UNO_QUERY_THROW); + xTable->initialize(4, 4); + auto xSimpleText = xTextDocument->getText(); + xSimpleText->insertTextContent(xSimpleText->createTextCursor(), xTable, true); + css::uno::Reference xTableCellRange(xTable, css::uno::UNO_QUERY_THROW); + // Get instance of SwXCellRange + css::uno::Reference xCellRange( + xTableCellRange->getCellRangeByPosition(0, 0, 1, 1), css::uno::UNO_QUERY_THROW); + // Test retrieval of VertOrient property - this crashed + css::uno::Any aOrient = xCellRange->getPropertyValue("VertOrient"); + CPPUNIT_ASSERT_EQUAL(css::uno::Any(css::text::VertOrientation::NONE), aOrient); +} + +CPPUNIT_TEST_FIXTURE(SwUnoWriter, testTdf129841) +{ + // Create a new document and add a table + createSwDoc(); + css::uno::Reference xTextDocument(mxComponent, + css::uno::UNO_QUERY_THROW); + css::uno::Reference xFac(xTextDocument, + css::uno::UNO_QUERY_THROW); + css::uno::Reference xTable( + xFac->createInstance("com.sun.star.text.TextTable"), css::uno::UNO_QUERY_THROW); + xTable->initialize(4, 4); + auto xSimpleText = xTextDocument->getText(); + xSimpleText->insertTextContent(xSimpleText->createTextCursor(), xTable, true); + // Get SwXTextTableCursor + css::uno::Reference xTableCursor(xTable->createCursorByCellName("A1"), + css::uno::UNO_QUERY_THROW); + css::uno::Reference xTableCellRange(xTable, css::uno::UNO_QUERY_THROW); + // Get SwXCellRange for the same cell + css::uno::Reference xCellRange( + xTableCellRange->getCellRangeByName("A1:A1"), css::uno::UNO_QUERY_THROW); + static constexpr OUString sBackColor = u"BackColor"_ustr; + // Apply background color to table cursor, and read background color from cell range + css::uno::Any aRefColor(COL_LIGHTRED); + xTableCursor->setPropertyValue(sBackColor, aRefColor); + css::uno::Any aColor = xCellRange->getPropertyValue(sBackColor); + // This failed + CPPUNIT_ASSERT_EQUAL(aRefColor, aColor); + // Now the other way round + aRefColor <<= COL_LIGHTGREEN; + xCellRange->setPropertyValue(sBackColor, aRefColor); + aColor = xTableCursor->getPropertyValue(sBackColor); + CPPUNIT_ASSERT_EQUAL(aRefColor, aColor); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ww8export/data/all_gaps_word.doc b/sw/qa/extras/ww8export/data/all_gaps_word.doc new file mode 100644 index 0000000000..d5c61a6c44 Binary files /dev/null and b/sw/qa/extras/ww8export/data/all_gaps_word.doc differ diff --git a/sw/qa/extras/ww8export/data/arabic-zero-numbering.doc b/sw/qa/extras/ww8export/data/arabic-zero-numbering.doc new file mode 100644 index 0000000000..c198c4aa44 Binary files /dev/null and b/sw/qa/extras/ww8export/data/arabic-zero-numbering.doc differ diff --git a/sw/qa/extras/ww8export/data/bnc636128.doc b/sw/qa/extras/ww8export/data/bnc636128.doc new file mode 100644 index 0000000000..5f92c3e2ec Binary files /dev/null and b/sw/qa/extras/ww8export/data/bnc636128.doc differ diff --git a/sw/qa/extras/ww8export/data/bnc787942.doc b/sw/qa/extras/ww8export/data/bnc787942.doc new file mode 100644 index 0000000000..06b2c39f2f Binary files /dev/null and b/sw/qa/extras/ww8export/data/bnc787942.doc differ diff --git a/sw/qa/extras/ww8export/data/bnc821208.doc b/sw/qa/extras/ww8export/data/bnc821208.doc new file mode 100644 index 0000000000..cfe76806ef Binary files /dev/null and b/sw/qa/extras/ww8export/data/bnc821208.doc differ diff --git a/sw/qa/extras/ww8export/data/bnc863018b.doc b/sw/qa/extras/ww8export/data/bnc863018b.doc new file mode 100644 index 0000000000..c9744b856d Binary files /dev/null and b/sw/qa/extras/ww8export/data/bnc863018b.doc differ diff --git a/sw/qa/extras/ww8export/data/bordercolours.doc b/sw/qa/extras/ww8export/data/bordercolours.doc new file mode 100644 index 0000000000..c442223ead Binary files /dev/null and b/sw/qa/extras/ww8export/data/bordercolours.doc differ diff --git a/sw/qa/extras/ww8export/data/bordercolours.odt b/sw/qa/extras/ww8export/data/bordercolours.odt new file mode 100644 index 0000000000..f34d595f37 Binary files /dev/null and b/sw/qa/extras/ww8export/data/bordercolours.odt differ diff --git a/sw/qa/extras/ww8export/data/btlr-cell.doc b/sw/qa/extras/ww8export/data/btlr-cell.doc new file mode 100644 index 0000000000..f99e9e67e4 Binary files /dev/null and b/sw/qa/extras/ww8export/data/btlr-cell.doc differ diff --git a/sw/qa/extras/ww8export/data/btlr-frame.odt b/sw/qa/extras/ww8export/data/btlr-frame.odt new file mode 100644 index 0000000000..31cb03849c Binary files /dev/null and b/sw/qa/extras/ww8export/data/btlr-frame.odt differ diff --git a/sw/qa/extras/ww8export/data/cell-bg-color.odt b/sw/qa/extras/ww8export/data/cell-bg-color.odt new file mode 100644 index 0000000000..3565f40c21 Binary files /dev/null and b/sw/qa/extras/ww8export/data/cell-bg-color.odt differ diff --git a/sw/qa/extras/ww8export/data/charborder.odt b/sw/qa/extras/ww8export/data/charborder.odt new file mode 100644 index 0000000000..0829c0348f Binary files /dev/null and b/sw/qa/extras/ww8export/data/charborder.odt differ diff --git a/sw/qa/extras/ww8export/data/checkbox_control.odt b/sw/qa/extras/ww8export/data/checkbox_control.odt new file mode 100644 index 0000000000..b5281b30ee Binary files /dev/null and b/sw/qa/extras/ww8export/data/checkbox_control.odt differ diff --git a/sw/qa/extras/ww8export/data/cjklist30.doc b/sw/qa/extras/ww8export/data/cjklist30.doc new file mode 100644 index 0000000000..48f22cf79a Binary files /dev/null and b/sw/qa/extras/ww8export/data/cjklist30.doc differ diff --git a/sw/qa/extras/ww8export/data/cjklist31.doc b/sw/qa/extras/ww8export/data/cjklist31.doc new file mode 100644 index 0000000000..4a7d3e7e13 Binary files /dev/null and b/sw/qa/extras/ww8export/data/cjklist31.doc differ diff --git a/sw/qa/extras/ww8export/data/cjklist34.doc b/sw/qa/extras/ww8export/data/cjklist34.doc new file mode 100644 index 0000000000..551fc89527 Binary files /dev/null and b/sw/qa/extras/ww8export/data/cjklist34.doc differ diff --git a/sw/qa/extras/ww8export/data/cjklist35.doc b/sw/qa/extras/ww8export/data/cjklist35.doc new file mode 100644 index 0000000000..33d247029a Binary files /dev/null and b/sw/qa/extras/ww8export/data/cjklist35.doc differ diff --git a/sw/qa/extras/ww8export/data/clearing-break.doc b/sw/qa/extras/ww8export/data/clearing-break.doc new file mode 100644 index 0000000000..87b51128db Binary files /dev/null and b/sw/qa/extras/ww8export/data/clearing-break.doc differ diff --git a/sw/qa/extras/ww8export/data/comment-export.odt b/sw/qa/extras/ww8export/data/comment-export.odt new file mode 100644 index 0000000000..66873d869a Binary files /dev/null and b/sw/qa/extras/ww8export/data/comment-export.odt differ diff --git a/sw/qa/extras/ww8export/data/commented-table.doc b/sw/qa/extras/ww8export/data/commented-table.doc new file mode 100644 index 0000000000..049c7e3a4b Binary files /dev/null and b/sw/qa/extras/ww8export/data/commented-table.doc differ diff --git a/sw/qa/extras/ww8export/data/comments-nested.doc b/sw/qa/extras/ww8export/data/comments-nested.doc new file mode 100644 index 0000000000..339a15b11f Binary files /dev/null and b/sw/qa/extras/ww8export/data/comments-nested.doc differ diff --git a/sw/qa/extras/ww8export/data/continuous-sections.doc b/sw/qa/extras/ww8export/data/continuous-sections.doc new file mode 100644 index 0000000000..cf466c9e72 Binary files /dev/null and b/sw/qa/extras/ww8export/data/continuous-sections.doc differ diff --git a/sw/qa/extras/ww8export/data/cp1000044.doc b/sw/qa/extras/ww8export/data/cp1000044.doc new file mode 100644 index 0000000000..ea30cc0024 Binary files /dev/null and b/sw/qa/extras/ww8export/data/cp1000044.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo36868.doc b/sw/qa/extras/ww8export/data/fdo36868.doc new file mode 100644 index 0000000000..382c6b267d Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo36868.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo42144.odt b/sw/qa/extras/ww8export/data/fdo42144.odt new file mode 100644 index 0000000000..be9490079e Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo42144.odt differ diff --git a/sw/qa/extras/ww8export/data/fdo45724.odt b/sw/qa/extras/ww8export/data/fdo45724.odt new file mode 100644 index 0000000000..45c6d9a58a Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo45724.odt differ diff --git a/sw/qa/extras/ww8export/data/fdo46020.odt b/sw/qa/extras/ww8export/data/fdo46020.odt new file mode 100644 index 0000000000..478c931b22 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo46020.odt differ diff --git a/sw/qa/extras/ww8export/data/fdo53985.doc b/sw/qa/extras/ww8export/data/fdo53985.doc new file mode 100644 index 0000000000..0c8f278dcf Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo53985.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo56513.doc b/sw/qa/extras/ww8export/data/fdo56513.doc new file mode 100644 index 0000000000..f5be1c3cd9 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo56513.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo59530.doc b/sw/qa/extras/ww8export/data/fdo59530.doc new file mode 100644 index 0000000000..90bd4ce041 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo59530.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo66304-1.odt b/sw/qa/extras/ww8export/data/fdo66304-1.odt new file mode 100644 index 0000000000..c3fb9bcfa2 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo66304-1.odt differ diff --git a/sw/qa/extras/ww8export/data/fdo68963.doc b/sw/qa/extras/ww8export/data/fdo68963.doc new file mode 100644 index 0000000000..b31741f7c5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo68963.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo68967.doc b/sw/qa/extras/ww8export/data/fdo68967.doc new file mode 100644 index 0000000000..05271c3d86 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo68967.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo77454.doc b/sw/qa/extras/ww8export/data/fdo77454.doc new file mode 100644 index 0000000000..4e2d7b2ad2 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo77454.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo77844.doc b/sw/qa/extras/ww8export/data/fdo77844.doc new file mode 100644 index 0000000000..cd7368d5d6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo77844.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo80333.doc b/sw/qa/extras/ww8export/data/fdo80333.doc new file mode 100644 index 0000000000..773a922bad Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo80333.doc differ diff --git a/sw/qa/extras/ww8export/data/fdo81102.doc b/sw/qa/extras/ww8export/data/fdo81102.doc new file mode 100644 index 0000000000..e8a550768f Binary files /dev/null and b/sw/qa/extras/ww8export/data/fdo81102.doc differ diff --git a/sw/qa/extras/ww8export/data/gutter-left.doc b/sw/qa/extras/ww8export/data/gutter-left.doc new file mode 100644 index 0000000000..0d76e87486 Binary files /dev/null and b/sw/qa/extras/ww8export/data/gutter-left.doc differ diff --git a/sw/qa/extras/ww8export/data/gutter-top.doc b/sw/qa/extras/ww8export/data/gutter-top.doc new file mode 100644 index 0000000000..07ffa3945a Binary files /dev/null and b/sw/qa/extras/ww8export/data/gutter-top.doc differ diff --git a/sw/qa/extras/ww8export/data/i120158.doc b/sw/qa/extras/ww8export/data/i120158.doc new file mode 100644 index 0000000000..6adf3ec13d Binary files /dev/null and b/sw/qa/extras/ww8export/data/i120158.doc differ diff --git a/sw/qa/extras/ww8export/data/image-comment-at-char.doc b/sw/qa/extras/ww8export/data/image-comment-at-char.doc new file mode 100644 index 0000000000..e0d5e2cba4 Binary files /dev/null and b/sw/qa/extras/ww8export/data/image-comment-at-char.doc differ diff --git a/sw/qa/extras/ww8export/data/inlinePageBreakFirstLine.doc b/sw/qa/extras/ww8export/data/inlinePageBreakFirstLine.doc new file mode 100644 index 0000000000..4f339511d6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/inlinePageBreakFirstLine.doc differ diff --git a/sw/qa/extras/ww8export/data/list-nolevel.doc b/sw/qa/extras/ww8export/data/list-nolevel.doc new file mode 100644 index 0000000000..04e34996fe Binary files /dev/null and b/sw/qa/extras/ww8export/data/list-nolevel.doc differ diff --git a/sw/qa/extras/ww8export/data/mailmerge.doc b/sw/qa/extras/ww8export/data/mailmerge.doc new file mode 100644 index 0000000000..6ed882769e Binary files /dev/null and b/sw/qa/extras/ww8export/data/mailmerge.doc differ diff --git a/sw/qa/extras/ww8export/data/msobrightnesscontrast.doc b/sw/qa/extras/ww8export/data/msobrightnesscontrast.doc new file mode 100644 index 0000000000..675d6d3702 Binary files /dev/null and b/sw/qa/extras/ww8export/data/msobrightnesscontrast.doc differ diff --git a/sw/qa/extras/ww8export/data/n325936.doc b/sw/qa/extras/ww8export/data/n325936.doc new file mode 100644 index 0000000000..23d0f6025d Binary files /dev/null and b/sw/qa/extras/ww8export/data/n325936.doc differ diff --git a/sw/qa/extras/ww8export/data/n652364.doc b/sw/qa/extras/ww8export/data/n652364.doc new file mode 100644 index 0000000000..f7a0fe0d57 Binary files /dev/null and b/sw/qa/extras/ww8export/data/n652364.doc differ diff --git a/sw/qa/extras/ww8export/data/n750255.doc b/sw/qa/extras/ww8export/data/n750255.doc new file mode 100644 index 0000000000..c0475c4ede Binary files /dev/null and b/sw/qa/extras/ww8export/data/n750255.doc differ diff --git a/sw/qa/extras/ww8export/data/n757118.doc b/sw/qa/extras/ww8export/data/n757118.doc new file mode 100644 index 0000000000..2c69485212 Binary files /dev/null and b/sw/qa/extras/ww8export/data/n757118.doc differ diff --git a/sw/qa/extras/ww8export/data/n757905.doc b/sw/qa/extras/ww8export/data/n757905.doc new file mode 100644 index 0000000000..0fb7b097cd Binary files /dev/null and b/sw/qa/extras/ww8export/data/n757905.doc differ diff --git a/sw/qa/extras/ww8export/data/n757910.doc b/sw/qa/extras/ww8export/data/n757910.doc new file mode 100644 index 0000000000..49a0e59f84 Binary files /dev/null and b/sw/qa/extras/ww8export/data/n757910.doc differ diff --git a/sw/qa/extras/ww8export/data/n760294.doc b/sw/qa/extras/ww8export/data/n760294.doc new file mode 100644 index 0000000000..04960d060b Binary files /dev/null and b/sw/qa/extras/ww8export/data/n760294.doc differ diff --git a/sw/qa/extras/ww8export/data/n816603.doc b/sw/qa/extras/ww8export/data/n816603.doc new file mode 100644 index 0000000000..9186f628ff Binary files /dev/null and b/sw/qa/extras/ww8export/data/n816603.doc differ diff --git a/sw/qa/extras/ww8export/data/n823651.doc b/sw/qa/extras/ww8export/data/n823651.doc new file mode 100644 index 0000000000..51b383c42d Binary files /dev/null and b/sw/qa/extras/ww8export/data/n823651.doc differ diff --git a/sw/qa/extras/ww8export/data/new-page-styles.doc b/sw/qa/extras/ww8export/data/new-page-styles.doc new file mode 100644 index 0000000000..c3886fd6bf Binary files /dev/null and b/sw/qa/extras/ww8export/data/new-page-styles.doc differ diff --git a/sw/qa/extras/ww8export/data/nonInlinePageBreakFirstLine.doc b/sw/qa/extras/ww8export/data/nonInlinePageBreakFirstLine.doc new file mode 100644 index 0000000000..5351a9edec Binary files /dev/null and b/sw/qa/extras/ww8export/data/nonInlinePageBreakFirstLine.doc differ diff --git a/sw/qa/extras/ww8export/data/object_cross_reference.odt b/sw/qa/extras/ww8export/data/object_cross_reference.odt new file mode 100644 index 0000000000..ee6849dc5a Binary files /dev/null and b/sw/qa/extras/ww8export/data/object_cross_reference.odt differ diff --git a/sw/qa/extras/ww8export/data/ooo92948-1.doc b/sw/qa/extras/ww8export/data/ooo92948-1.doc new file mode 100644 index 0000000000..f355eaa267 Binary files /dev/null and b/sw/qa/extras/ww8export/data/ooo92948-1.doc differ diff --git a/sw/qa/extras/ww8export/data/page-border.doc b/sw/qa/extras/ww8export/data/page-border.doc new file mode 100644 index 0000000000..c2dec4fede Binary files /dev/null and b/sw/qa/extras/ww8export/data/page-border.doc differ diff --git a/sw/qa/extras/ww8export/data/redline-export-1.odt b/sw/qa/extras/ww8export/data/redline-export-1.odt new file mode 100644 index 0000000000..31aacce472 Binary files /dev/null and b/sw/qa/extras/ww8export/data/redline-export-1.odt differ diff --git a/sw/qa/extras/ww8export/data/redline-export-2.odt b/sw/qa/extras/ww8export/data/redline-export-2.odt new file mode 100644 index 0000000000..2aca5eee4c Binary files /dev/null and b/sw/qa/extras/ww8export/data/redline-export-2.odt differ diff --git a/sw/qa/extras/ww8export/data/redline-export-3.odt b/sw/qa/extras/ww8export/data/redline-export-3.odt new file mode 100644 index 0000000000..6d0d80a080 Binary files /dev/null and b/sw/qa/extras/ww8export/data/redline-export-3.odt differ diff --git a/sw/qa/extras/ww8export/data/rtl-gutter.doc b/sw/qa/extras/ww8export/data/rtl-gutter.doc new file mode 100644 index 0000000000..37cbf8707c Binary files /dev/null and b/sw/qa/extras/ww8export/data/rtl-gutter.doc differ diff --git a/sw/qa/extras/ww8export/data/shapes-line-ellipse.doc b/sw/qa/extras/ww8export/data/shapes-line-ellipse.doc new file mode 100644 index 0000000000..184881c00a Binary files /dev/null and b/sw/qa/extras/ww8export/data/shapes-line-ellipse.doc differ diff --git a/sw/qa/extras/ww8export/data/table_cross_reference.odt b/sw/qa/extras/ww8export/data/table_cross_reference.odt new file mode 100644 index 0000000000..95f33139c5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/table_cross_reference.odt differ diff --git a/sw/qa/extras/ww8export/data/table_cross_reference_custom_format.odt b/sw/qa/extras/ww8export/data/table_cross_reference_custom_format.odt new file mode 100644 index 0000000000..1c41e364c6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/table_cross_reference_custom_format.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf100961_fixedDateTime.doc b/sw/qa/extras/ww8export/data/tdf100961_fixedDateTime.doc new file mode 100644 index 0000000000..86f0e478d4 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf100961_fixedDateTime.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf101826_xattrTextBoxFill.doc b/sw/qa/extras/ww8export/data/tdf101826_xattrTextBoxFill.doc new file mode 100644 index 0000000000..206f483095 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf101826_xattrTextBoxFill.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf102334.doc b/sw/qa/extras/ww8export/data/tdf102334.doc new file mode 100644 index 0000000000..d007257cfb Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf102334.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc b/sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc new file mode 100644 index 0000000000..dc8f65e76d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104239_chapterNumberTortureTest.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104239_chapterNumbering.doc b/sw/qa/extras/ww8export/data/tdf104239_chapterNumbering.doc new file mode 100644 index 0000000000..2e237b2e33 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104239_chapterNumbering.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104239_chapterNumberingLevels.doc b/sw/qa/extras/ww8export/data/tdf104239_chapterNumberingLevels.doc new file mode 100644 index 0000000000..8a7583c325 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104239_chapterNumberingLevels.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104239_numbering.doc b/sw/qa/extras/ww8export/data/tdf104239_numbering.doc new file mode 100644 index 0000000000..ee8ad09e4b Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104239_numbering.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104239_sharedOutlineNumId.doc b/sw/qa/extras/ww8export/data/tdf104239_sharedOutlineNumId.doc new file mode 100644 index 0000000000..c5deb4857f Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104239_sharedOutlineNumId.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104334.doc b/sw/qa/extras/ww8export/data/tdf104334.doc new file mode 100644 index 0000000000..877caff0c5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104334.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104596_wrapInHeaderTable.doc b/sw/qa/extras/ww8export/data/tdf104596_wrapInHeaderTable.doc new file mode 100644 index 0000000000..17fba79453 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104596_wrapInHeaderTable.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf104704_mangledFooter.odt b/sw/qa/extras/ww8export/data/tdf104704_mangledFooter.odt new file mode 100644 index 0000000000..2bd8c10f9c Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104704_mangledFooter.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf104805.doc b/sw/qa/extras/ww8export/data/tdf104805.doc new file mode 100644 index 0000000000..a2dd81dd0d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf104805.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf105570.doc b/sw/qa/extras/ww8export/data/tdf105570.doc new file mode 100644 index 0000000000..1bace7709f Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf105570.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf106062_nonHangingFootnote.odt b/sw/qa/extras/ww8export/data/tdf106062_nonHangingFootnote.odt new file mode 100644 index 0000000000..af5e225ea0 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf106062_nonHangingFootnote.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf106174_rtlParaAlign.docx b/sw/qa/extras/ww8export/data/tdf106174_rtlParaAlign.docx new file mode 100644 index 0000000000..a222f58814 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf106174_rtlParaAlign.docx differ diff --git a/sw/qa/extras/ww8export/data/tdf106291.doc b/sw/qa/extras/ww8export/data/tdf106291.doc new file mode 100644 index 0000000000..893004d461 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf106291.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf106541_cancelOutline.doc b/sw/qa/extras/ww8export/data/tdf106541_cancelOutline.doc new file mode 100644 index 0000000000..6b3f016f3a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf106541_cancelOutline.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumbering.doc b/sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumbering.doc new file mode 100644 index 0000000000..f56b9d6b6e Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumbering.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumberingB.doc b/sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumberingB.doc new file mode 100644 index 0000000000..0ff47ca3e6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf106541_inheritChapterNumberingB.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf106541_inheritOutlineNumbering.doc b/sw/qa/extras/ww8export/data/tdf106541_inheritOutlineNumbering.doc new file mode 100644 index 0000000000..2fe243fe80 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf106541_inheritOutlineNumbering.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf107773.doc b/sw/qa/extras/ww8export/data/tdf107773.doc new file mode 100644 index 0000000000..31c7b7c5c1 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf107773.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf108072.doc b/sw/qa/extras/ww8export/data/tdf108072.doc new file mode 100644 index 0000000000..03e8b2a532 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf108072.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf108448_endNote.odt b/sw/qa/extras/ww8export/data/tdf108448_endNote.odt new file mode 100644 index 0000000000..bc4a751a89 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf108448_endNote.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf108518_CRnumformatting.doc b/sw/qa/extras/ww8export/data/tdf108518_CRnumformatting.doc new file mode 100644 index 0000000000..536e92fd47 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf108518_CRnumformatting.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf111480.doc b/sw/qa/extras/ww8export/data/tdf111480.doc new file mode 100644 index 0000000000..8881260666 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf111480.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf112074_RTLtableJustification.doc b/sw/qa/extras/ww8export/data/tdf112074_RTLtableJustification.doc new file mode 100644 index 0000000000..64ea6521e8 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf112074_RTLtableJustification.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf112118.doc b/sw/qa/extras/ww8export/data/tdf112118.doc new file mode 100644 index 0000000000..f1aaa9b54d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf112118.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf112346.doc b/sw/qa/extras/ww8export/data/tdf112346.doc new file mode 100644 index 0000000000..af0cca219a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf112346.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf112517_maxSprms.doc b/sw/qa/extras/ww8export/data/tdf112517_maxSprms.doc new file mode 100644 index 0000000000..95de03d3b0 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf112517_maxSprms.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf112535.doc b/sw/qa/extras/ww8export/data/tdf112535.doc new file mode 100644 index 0000000000..4eea19ecd5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf112535.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf112618_textbox_no_bg.doc b/sw/qa/extras/ww8export/data/tdf112618_textbox_no_bg.doc new file mode 100644 index 0000000000..c7d9823b0d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf112618_textbox_no_bg.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf114308.doc b/sw/qa/extras/ww8export/data/tdf114308.doc new file mode 100644 index 0000000000..36e6c7ec69 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf114308.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf115896_layoutInCell.doc b/sw/qa/extras/ww8export/data/tdf115896_layoutInCell.doc new file mode 100644 index 0000000000..c7e6fc6809 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf115896_layoutInCell.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf116194.doc b/sw/qa/extras/ww8export/data/tdf116194.doc new file mode 100644 index 0000000000..ca1edf68d5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf116194.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf116436_tableBackground.odt b/sw/qa/extras/ww8export/data/tdf116436_tableBackground.odt new file mode 100644 index 0000000000..1ae65f788d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf116436_tableBackground.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf116570_exportFootnote.odt b/sw/qa/extras/ww8export/data/tdf116570_exportFootnote.odt new file mode 100644 index 0000000000..c1598eb71c Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf116570_exportFootnote.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt b/sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt new file mode 100644 index 0000000000..bbb1eaab3c Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf117217_largeTableBackgrounds.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf117503.docx b/sw/qa/extras/ww8export/data/tdf117503.docx new file mode 100644 index 0000000000..f817f035b5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf117503.docx differ diff --git a/sw/qa/extras/ww8export/data/tdf117885.doc b/sw/qa/extras/ww8export/data/tdf117885.doc new file mode 100644 index 0000000000..bf8d0ef03d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf117885.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf117994_CRnumformatting.doc b/sw/qa/extras/ww8export/data/tdf117994_CRnumformatting.doc new file mode 100644 index 0000000000..99744382a8 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf117994_CRnumformatting.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf118133.docx b/sw/qa/extras/ww8export/data/tdf118133.docx new file mode 100644 index 0000000000..613aa1bd73 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf118133.docx differ diff --git a/sw/qa/extras/ww8export/data/tdf118375_240degClockwise.doc b/sw/qa/extras/ww8export/data/tdf118375_240degClockwise.doc new file mode 100644 index 0000000000..99d15e20ce Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf118375_240degClockwise.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf118412.doc b/sw/qa/extras/ww8export/data/tdf118412.doc new file mode 100644 index 0000000000..ef9b26cb3a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf118412.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf118564.doc b/sw/qa/extras/ww8export/data/tdf118564.doc new file mode 100644 index 0000000000..4040e05e27 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf118564.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf119232_startEvenPage.doc b/sw/qa/extras/ww8export/data/tdf119232_startEvenPage.doc new file mode 100644 index 0000000000..c50bf46c0b Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf119232_startEvenPage.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf120003.doc b/sw/qa/extras/ww8export/data/tdf120003.doc new file mode 100644 index 0000000000..c544fa5a96 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf120003.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf120225_textControlCrossRef.doc b/sw/qa/extras/ww8export/data/tdf120225_textControlCrossRef.doc new file mode 100644 index 0000000000..713cdc336b Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf120225_textControlCrossRef.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf120394.doc b/sw/qa/extras/ww8export/data/tdf120394.doc new file mode 100644 index 0000000000..2ee9058a59 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf120394.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf120412_proportionalEscapement.odt b/sw/qa/extras/ww8export/data/tdf120412_proportionalEscapement.odt new file mode 100644 index 0000000000..ecd5841a8e Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf120412_proportionalEscapement.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf120711.doc b/sw/qa/extras/ww8export/data/tdf120711.doc new file mode 100644 index 0000000000..90e7c05cec Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf120711.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf121110_absJustify.doc b/sw/qa/extras/ww8export/data/tdf121110_absJustify.doc new file mode 100644 index 0000000000..0b9f581d41 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf121110_absJustify.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf121111_fillStyleNone.docx b/sw/qa/extras/ww8export/data/tdf121111_fillStyleNone.docx new file mode 100644 index 0000000000..434d182eb7 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf121111_fillStyleNone.docx differ diff --git a/sw/qa/extras/ww8export/data/tdf122425_2.doc b/sw/qa/extras/ww8export/data/tdf122425_2.doc new file mode 100644 index 0000000000..8debcddc16 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf122425_2.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf122429_header.doc b/sw/qa/extras/ww8export/data/tdf122429_header.doc new file mode 100644 index 0000000000..37afc067b0 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf122429_header.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf122460_header.odt b/sw/qa/extras/ww8export/data/tdf122460_header.odt new file mode 100644 index 0000000000..420121dc9a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf122460_header.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf123433_fillStyleStop.doc b/sw/qa/extras/ww8export/data/tdf123433_fillStyleStop.doc new file mode 100644 index 0000000000..f8321e96ee Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf123433_fillStyleStop.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf124937.doc b/sw/qa/extras/ww8export/data/tdf124937.doc new file mode 100644 index 0000000000..eb1ab2d9e0 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf124937.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf126708_containsemf.odt b/sw/qa/extras/ww8export/data/tdf126708_containsemf.odt new file mode 100644 index 0000000000..31b0fab8d0 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf126708_containsemf.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf127166_prstDash_Word97.doc b/sw/qa/extras/ww8export/data/tdf127166_prstDash_Word97.doc new file mode 100644 index 0000000000..21cd47a4ce Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf127166_prstDash_Word97.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf127316_autoEscapement.odt b/sw/qa/extras/ww8export/data/tdf127316_autoEscapement.odt new file mode 100644 index 0000000000..95987d4562 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf127316_autoEscapement.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf127316_autoEscapement2.odt b/sw/qa/extras/ww8export/data/tdf127316_autoEscapement2.odt new file mode 100644 index 0000000000..d98fae0ad4 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf127316_autoEscapement2.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf127862_pageFillStyle.odt b/sw/qa/extras/ww8export/data/tdf127862_pageFillStyle.odt new file mode 100644 index 0000000000..c382c9aa67 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf127862_pageFillStyle.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf128501.doc b/sw/qa/extras/ww8export/data/tdf128501.doc new file mode 100644 index 0000000000..3313e397a9 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf128501.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf128605.doc b/sw/qa/extras/ww8export/data/tdf128605.doc new file mode 100644 index 0000000000..2bbfe6b730 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf128605.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf128608_fillStyleNoneB.odt b/sw/qa/extras/ww8export/data/tdf128608_fillStyleNoneB.odt new file mode 100644 index 0000000000..917dc96d40 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf128608_fillStyleNoneB.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf128608_tableParaBackColor.doc b/sw/qa/extras/ww8export/data/tdf128608_tableParaBackColor.doc new file mode 100644 index 0000000000..d9b16ca53a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf128608_tableParaBackColor.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf128700_relativeTableWidth.doc b/sw/qa/extras/ww8export/data/tdf128700_relativeTableWidth.doc new file mode 100644 index 0000000000..9fa798ea32 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf128700_relativeTableWidth.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf129247.docx b/sw/qa/extras/ww8export/data/tdf129247.docx new file mode 100644 index 0000000000..a5ea1c1c16 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf129247.docx differ diff --git a/sw/qa/extras/ww8export/data/tdf129522_removeShadowStyle.odt b/sw/qa/extras/ww8export/data/tdf129522_removeShadowStyle.odt new file mode 100644 index 0000000000..7ced9fc647 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf129522_removeShadowStyle.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf130262.doc b/sw/qa/extras/ww8export/data/tdf130262.doc new file mode 100644 index 0000000000..fb60beacd7 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf130262.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf132094_transparentPageImage.doc b/sw/qa/extras/ww8export/data/tdf132094_transparentPageImage.doc new file mode 100644 index 0000000000..1b8a29e0ec Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf132094_transparentPageImage.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf132726.odt b/sw/qa/extras/ww8export/data/tdf132726.odt new file mode 100644 index 0000000000..c8106c2b54 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf132726.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf133453_realFontSize.doc b/sw/qa/extras/ww8export/data/tdf133453_realFontSize.doc new file mode 100644 index 0000000000..6fa5036808 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf133453_realFontSize.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf133504_wrapNotBeside.doc b/sw/qa/extras/ww8export/data/tdf133504_wrapNotBeside.doc new file mode 100644 index 0000000000..865023e344 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf133504_wrapNotBeside.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf134264.docx b/sw/qa/extras/ww8export/data/tdf134264.docx new file mode 100644 index 0000000000..5acb4cf4e6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf134264.docx differ diff --git a/sw/qa/extras/ww8export/data/tdf134570.doc b/sw/qa/extras/ww8export/data/tdf134570.doc new file mode 100644 index 0000000000..17f7842d70 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf134570.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf134948.odt b/sw/qa/extras/ww8export/data/tdf134948.odt new file mode 100644 index 0000000000..a6227fb5e7 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf134948.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf135672_tableGrows.doc b/sw/qa/extras/ww8export/data/tdf135672_tableGrows.doc new file mode 100644 index 0000000000..a2ae57def0 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf135672_tableGrows.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf136620.odt b/sw/qa/extras/ww8export/data/tdf136620.odt new file mode 100644 index 0000000000..bb8536ec94 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf136620.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf136814.odt b/sw/qa/extras/ww8export/data/tdf136814.odt new file mode 100644 index 0000000000..2318de04b7 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf136814.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf138302_restartNumbering.odt b/sw/qa/extras/ww8export/data/tdf138302_restartNumbering.odt new file mode 100644 index 0000000000..8c99963616 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf138302_restartNumbering.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf138345_paraCharHighlight.doc b/sw/qa/extras/ww8export/data/tdf138345_paraCharHighlight.doc new file mode 100644 index 0000000000..3da7e9286b Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf138345_paraCharHighlight.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf139495_tinyHeader.doc b/sw/qa/extras/ww8export/data/tdf139495_tinyHeader.doc new file mode 100644 index 0000000000..c45a6c25fd Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf139495_tinyHeader.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf141649_conditionalText.doc b/sw/qa/extras/ww8export/data/tdf141649_conditionalText.doc new file mode 100644 index 0000000000..9e4ec49e38 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf141649_conditionalText.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf142760.doc b/sw/qa/extras/ww8export/data/tdf142760.doc new file mode 100644 index 0000000000..1e90532fe8 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf142760.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf142840.odt b/sw/qa/extras/ww8export/data/tdf142840.odt new file mode 100644 index 0000000000..27af4cdb5e Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf142840.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf147861_customField.doc b/sw/qa/extras/ww8export/data/tdf147861_customField.doc new file mode 100644 index 0000000000..f18d65f405 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf147861_customField.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf148380_createField.doc b/sw/qa/extras/ww8export/data/tdf148380_createField.doc new file mode 100644 index 0000000000..79c5e59c5e Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf148380_createField.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf148380_fldLocked.doc b/sw/qa/extras/ww8export/data/tdf148380_fldLocked.doc new file mode 100644 index 0000000000..cee6982ee6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf148380_fldLocked.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf150197_anlv2ListFormat.doc b/sw/qa/extras/ww8export/data/tdf150197_anlv2ListFormat.doc new file mode 100644 index 0000000000..93d21046d6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf150197_anlv2ListFormat.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf151548_formFieldMacros.doc b/sw/qa/extras/ww8export/data/tdf151548_formFieldMacros.doc new file mode 100644 index 0000000000..4ea915f0af Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf151548_formFieldMacros.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf155465_paraAdjustDistribute.doc b/sw/qa/extras/ww8export/data/tdf155465_paraAdjustDistribute.doc new file mode 100644 index 0000000000..5a661cd837 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf155465_paraAdjustDistribute.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.doc b/sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.doc new file mode 100644 index 0000000000..f7afd41915 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf36117_verticalAdjustment.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf36711_inlineFrames.doc b/sw/qa/extras/ww8export/data/tdf36711_inlineFrames.doc new file mode 100644 index 0000000000..80a7d64cc8 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf36711_inlineFrames.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf37153_considerWrapOnObjPos.doc b/sw/qa/extras/ww8export/data/tdf37153_considerWrapOnObjPos.doc new file mode 100644 index 0000000000..08ba2f9d52 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf37153_considerWrapOnObjPos.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf37778_readonlySection.doc b/sw/qa/extras/ww8export/data/tdf37778_readonlySection.doc new file mode 100644 index 0000000000..5e4fcdd760 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf37778_readonlySection.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf38778_properties_in_run_for_field.doc b/sw/qa/extras/ww8export/data/tdf38778_properties_in_run_for_field.doc new file mode 100644 index 0000000000..960fe50dae Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf38778_properties_in_run_for_field.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf41542_borderlessPadding.odt b/sw/qa/extras/ww8export/data/tdf41542_borderlessPadding.odt new file mode 100644 index 0000000000..9585041de3 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf41542_borderlessPadding.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf41542_imagePadding.odt b/sw/qa/extras/ww8export/data/tdf41542_imagePadding.odt new file mode 100644 index 0000000000..019e19f247 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf41542_imagePadding.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf46441-2.odt b/sw/qa/extras/ww8export/data/tdf46441-2.odt new file mode 100644 index 0000000000..ed73406c5a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf46441-2.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf49102_mergedCellNumbering.doc b/sw/qa/extras/ww8export/data/tdf49102_mergedCellNumbering.doc new file mode 100644 index 0000000000..747136d47d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf49102_mergedCellNumbering.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf55427_footnote2endnote.odt b/sw/qa/extras/ww8export/data/tdf55427_footnote2endnote.odt new file mode 100644 index 0000000000..7f77f6d39e Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf55427_footnote2endnote.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf55528_relativeTableWidth.doc b/sw/qa/extras/ww8export/data/tdf55528_relativeTableWidth.doc new file mode 100644 index 0000000000..367f7873d7 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf55528_relativeTableWidth.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf56321_flipImage_both.doc b/sw/qa/extras/ww8export/data/tdf56321_flipImage_both.doc new file mode 100644 index 0000000000..a5293f29f5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf56321_flipImage_both.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf59896.doc b/sw/qa/extras/ww8export/data/tdf59896.doc new file mode 100644 index 0000000000..a3c7242992 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf59896.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf60378_mergedBorders.doc b/sw/qa/extras/ww8export/data/tdf60378_mergedBorders.doc new file mode 100644 index 0000000000..3278f46310 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf60378_mergedBorders.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf70838.odt b/sw/qa/extras/ww8export/data/tdf70838.odt new file mode 100644 index 0000000000..65d20ecb65 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf70838.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf70838b_verticalRotation.odt b/sw/qa/extras/ww8export/data/tdf70838b_verticalRotation.odt new file mode 100644 index 0000000000..556f2564c7 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf70838b_verticalRotation.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf73056_cellMargins.doc b/sw/qa/extras/ww8export/data/tdf73056_cellMargins.doc new file mode 100644 index 0000000000..7ae12d452e Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf73056_cellMargins.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf74328.doc b/sw/qa/extras/ww8export/data/tdf74328.doc new file mode 100644 index 0000000000..a82978547b Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf74328.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf75539_relativeWidth.doc b/sw/qa/extras/ww8export/data/tdf75539_relativeWidth.doc new file mode 100644 index 0000000000..ac811a8f35 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf75539_relativeWidth.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf75748_inheritChapterNumberingC.doc b/sw/qa/extras/ww8export/data/tdf75748_inheritChapterNumberingC.doc new file mode 100644 index 0000000000..7f393612ca Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf75748_inheritChapterNumberingC.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc b/sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc new file mode 100644 index 0000000000..95bc59807f Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf76349_textboxMargins.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf77964.doc b/sw/qa/extras/ww8export/data/tdf77964.doc new file mode 100644 index 0000000000..6ef50ab158 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf77964.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf79186_noLayoutInCell.odt b/sw/qa/extras/ww8export/data/tdf79186_noLayoutInCell.odt new file mode 100644 index 0000000000..e512f09072 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf79186_noLayoutInCell.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx b/sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx new file mode 100644 index 0000000000..55d1a1f229 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf79435_legacyInputFields.docx differ diff --git a/sw/qa/extras/ww8export/data/tdf79553_lineNumbers.doc b/sw/qa/extras/ww8export/data/tdf79553_lineNumbers.doc new file mode 100644 index 0000000000..260f5ce18b Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf79553_lineNumbers.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf79639.doc b/sw/qa/extras/ww8export/data/tdf79639.doc new file mode 100644 index 0000000000..1a996b62b0 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf79639.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf80635_marginLeft.doc b/sw/qa/extras/ww8export/data/tdf80635_marginLeft.doc new file mode 100644 index 0000000000..ad70ff6410 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf80635_marginLeft.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf80635_marginRightRTL.doc b/sw/qa/extras/ww8export/data/tdf80635_marginRightRTL.doc new file mode 100644 index 0000000000..6e509a1907 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf80635_marginRightRTL.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf80635_pageLeft.doc b/sw/qa/extras/ww8export/data/tdf80635_pageLeft.doc new file mode 100644 index 0000000000..16f32e3e3b Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf80635_pageLeft.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf80635_pageRightRTL.doc b/sw/qa/extras/ww8export/data/tdf80635_pageRightRTL.doc new file mode 100644 index 0000000000..71f9adf4a8 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf80635_pageRightRTL.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf81705_outlineLevel.doc b/sw/qa/extras/ww8export/data/tdf81705_outlineLevel.doc new file mode 100644 index 0000000000..55d188356a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf81705_outlineLevel.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf89377_tableWithBreakBeforeParaStyle.doc b/sw/qa/extras/ww8export/data/tdf89377_tableWithBreakBeforeParaStyle.doc new file mode 100644 index 0000000000..ef6415f161 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf89377_tableWithBreakBeforeParaStyle.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf90408.doc b/sw/qa/extras/ww8export/data/tdf90408.doc new file mode 100644 index 0000000000..2335e73ea2 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf90408.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf90408B.doc b/sw/qa/extras/ww8export/data/tdf90408B.doc new file mode 100644 index 0000000000..d0e0df59a6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf90408B.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf91083.odt b/sw/qa/extras/ww8export/data/tdf91083.odt new file mode 100644 index 0000000000..e4f55e58ac Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf91083.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf91083_tableKeep2.odt b/sw/qa/extras/ww8export/data/tdf91083_tableKeep2.odt new file mode 100644 index 0000000000..19a1ac843a Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf91083_tableKeep2.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf91083_tableKeep3.odt b/sw/qa/extras/ww8export/data/tdf91083_tableKeep3.odt new file mode 100644 index 0000000000..d3a13baf49 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf91083_tableKeep3.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf91687.doc b/sw/qa/extras/ww8export/data/tdf91687.doc new file mode 100644 index 0000000000..d1c1e0a0c3 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf91687.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf92281.doc b/sw/qa/extras/ww8export/data/tdf92281.doc new file mode 100644 index 0000000000..2893eb37ab Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf92281.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf94009_zeroPgMargin.odt b/sw/qa/extras/ww8export/data/tdf94009_zeroPgMargin.odt new file mode 100644 index 0000000000..e3143ec049 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf94009_zeroPgMargin.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf94326_notOutlineNumbering.doc b/sw/qa/extras/ww8export/data/tdf94326_notOutlineNumbering.doc new file mode 100644 index 0000000000..2df22e9317 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf94326_notOutlineNumbering.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf94386.odt b/sw/qa/extras/ww8export/data/tdf94386.odt new file mode 100644 index 0000000000..0e8d0bd0d5 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf94386.odt differ diff --git a/sw/qa/extras/ww8export/data/tdf95321.doc b/sw/qa/extras/ww8export/data/tdf95321.doc new file mode 100644 index 0000000000..8b85472b56 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf95321.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf95576.doc b/sw/qa/extras/ww8export/data/tdf95576.doc new file mode 100644 index 0000000000..a8a601885f Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf95576.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf96277.doc b/sw/qa/extras/ww8export/data/tdf96277.doc new file mode 100644 index 0000000000..904b2da132 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf96277.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf98620_rtlJustify.doc b/sw/qa/extras/ww8export/data/tdf98620_rtlJustify.doc new file mode 100644 index 0000000000..c643b96a4d Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf98620_rtlJustify.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf99100.doc b/sw/qa/extras/ww8export/data/tdf99100.doc new file mode 100644 index 0000000000..6352ae3559 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf99100.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf99120.doc b/sw/qa/extras/ww8export/data/tdf99120.doc new file mode 100644 index 0000000000..a93721c573 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf99120.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf99197_defaultLTR.doc b/sw/qa/extras/ww8export/data/tdf99197_defaultLTR.doc new file mode 100644 index 0000000000..721b688827 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf99197_defaultLTR.doc differ diff --git a/sw/qa/extras/ww8export/data/tdf99474.odt b/sw/qa/extras/ww8export/data/tdf99474.odt new file mode 100644 index 0000000000..7530488bb6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf99474.odt differ diff --git a/sw/qa/extras/ww8export/data/testTdf107931_KERN_DocEnabled_disabledDefStyle.doc b/sw/qa/extras/ww8export/data/testTdf107931_KERN_DocEnabled_disabledDefStyle.doc new file mode 100644 index 0000000000..101b02a0b6 Binary files /dev/null and b/sw/qa/extras/ww8export/data/testTdf107931_KERN_DocEnabled_disabledDefStyle.doc differ diff --git a/sw/qa/extras/ww8export/data/testTdf107931_KERN_enabledDefStyle.doc b/sw/qa/extras/ww8export/data/testTdf107931_KERN_enabledDefStyle.doc new file mode 100644 index 0000000000..35f6371fbc Binary files /dev/null and b/sw/qa/extras/ww8export/data/testTdf107931_KERN_enabledDefStyle.doc differ diff --git a/sw/qa/extras/ww8export/data/transparent-text.doc b/sw/qa/extras/ww8export/data/transparent-text.doc new file mode 100644 index 0000000000..b458db29cc Binary files /dev/null and b/sw/qa/extras/ww8export/data/transparent-text.doc differ diff --git a/sw/qa/extras/ww8export/data/tscp.doc b/sw/qa/extras/ww8export/data/tscp.doc new file mode 100644 index 0000000000..9830b288c1 Binary files /dev/null and b/sw/qa/extras/ww8export/data/tscp.doc differ diff --git a/sw/qa/extras/ww8export/data/zoom.doc b/sw/qa/extras/ww8export/data/zoom.doc new file mode 100644 index 0000000000..70548966db Binary files /dev/null and b/sw/qa/extras/ww8export/data/zoom.doc differ diff --git a/sw/qa/extras/ww8export/data/zoomtype.doc b/sw/qa/extras/ww8export/data/zoomtype.doc new file mode 100644 index 0000000000..8823754169 Binary files /dev/null and b/sw/qa/extras/ww8export/data/zoomtype.doc differ diff --git a/sw/qa/extras/ww8export/ww8export.cxx b/sw/qa/extras/ww8export/ww8export.cxx new file mode 100644 index 0000000000..89d57de6e6 --- /dev/null +++ b/sw/qa/extras/ww8export/ww8export.cxx @@ -0,0 +1,1567 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ww8export/data/", "MS Word 97") {} +}; + +DECLARE_WW8EXPORT_TEST(testN757910, "n757910.doc") +{ + // The internal margin was larger than 0.28cm + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + uno::Reference xPropertySet(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nValue = 0; + xPropertySet->getPropertyValue("LeftBorderDistance") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int32(280), nValue); + + // The border width was zero + table::BorderLine2 aBorder; + xPropertySet->getPropertyValue("LeftBorder") >>= aBorder; + CPPUNIT_ASSERT(aBorder.LineWidth > 0); +} + +DECLARE_WW8EXPORT_TEST(testN760294, "n760294.doc") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + table::TableBorder aTableBorder; + xTable->getPropertyValue("TableBorder") >>= aTableBorder; + CPPUNIT_ASSERT_EQUAL(aTableBorder.TopLine.InnerLineWidth, aTableBorder.TopLine.OuterLineWidth); + CPPUNIT_ASSERT_EQUAL(aTableBorder.TopLine.InnerLineWidth, aTableBorder.TopLine.LineDistance); +} + +DECLARE_WW8EXPORT_TEST(testN750255, "n750255.doc") +{ +/* +Column break without columns on the page is a page break, so check those paragraphs +are on page 2 (page style 'Convert 1') and page 3 (page style 'Convert 2') +enum = ThisComponent.Text.createEnumeration +enum.nextElement +para1 = enum.nextElement +xray para1.String +xray para1.PageStyleName +para2 = enum.nextElement +xray para2.String +xray para2.PageStyleName +*/ + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference paraEnumAccess(textDocument->getText(), uno::UNO_QUERY); + // list of paragraphs + uno::Reference paraEnum = paraEnumAccess->createEnumeration(); + // go to 1st paragraph + (void) paraEnum->nextElement(); + // get the 2nd and 3rd paragraph + uno::Reference paragraph1(paraEnum->nextElement(), uno::UNO_QUERY); + uno::Reference paragraph2(paraEnum->nextElement(), uno::UNO_QUERY); + uno::Reference text1(paragraph1, uno::UNO_QUERY); + uno::Reference text2(paragraph2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( OUString( "one" ), text1->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "two" ), text2->getString()); + uno::Reference paragraphProperties1(paragraph1, uno::UNO_QUERY); + uno::Reference paragraphProperties2(paragraph2, uno::UNO_QUERY); + OUString pageStyle1, pageStyle2; + paragraphProperties1->getPropertyValue( "PageStyleName" ) >>= pageStyle1; + paragraphProperties2->getPropertyValue( "PageStyleName" ) >>= pageStyle2; + CPPUNIT_ASSERT_EQUAL( OUString( "Convert 1" ), pageStyle1 ); + CPPUNIT_ASSERT_EQUAL( OUString( "Convert 2" ), pageStyle2 ); + +} + +DECLARE_WW8EXPORT_TEST(testN652364, "n652364.doc") +{ +/* +Related to 750255 above, column break with columns on the page however should be a column break. +enum = ThisComponent.Text.createEnumeration +enum.nextElement +para1 = enum.nextElement +xray para1.String +xray para1.PageStyleName +enum.nextElement +para2 = enum.nextElement +xray para2.String +xray para2.PageStyleName +*/ + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference paraEnumAccess(textDocument->getText(), uno::UNO_QUERY); + // list of paragraphs + uno::Reference paraEnum = paraEnumAccess->createEnumeration(); + // get the 2nd and 4th paragraph + (void) paraEnum->nextElement(); + uno::Reference paragraph1(paraEnum->nextElement(), uno::UNO_QUERY); + (void) paraEnum->nextElement(); + uno::Reference paragraph2(paraEnum->nextElement(), uno::UNO_QUERY); + uno::Reference text1(paragraph1, uno::UNO_QUERY); + uno::Reference text2(paragraph2, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( OUString( "text1" ), text1->getString()); + CPPUNIT_ASSERT_EQUAL( OUString( "text2" ), text2->getString()); + uno::Reference paragraphProperties1(paragraph1, uno::UNO_QUERY); + uno::Reference paragraphProperties2(paragraph2, uno::UNO_QUERY); + OUString pageStyle1, pageStyle2; + paragraphProperties1->getPropertyValue( "PageStyleName" ) >>= pageStyle1; + paragraphProperties2->getPropertyValue( "PageStyleName" ) >>= pageStyle2; + // "Standard" is the style for the first page (2nd is "Convert 1"). + CPPUNIT_ASSERT_EQUAL( OUString( "Standard" ), pageStyle1 ); + CPPUNIT_ASSERT_EQUAL( OUString( "Standard" ), pageStyle2 ); +} + +DECLARE_WW8EXPORT_TEST(testN757118, "n757118.doc") +{ +/* +Two pairs of horizontal rules (one absolute width, one relative width) +have the same width (full page width, half page width). +xray ThisComponent.DrawPage.getByIndex(0).BoundRect +*/ + uno::Reference rule1 = getShape(1), rule2 = getShape(2), rule3 = getShape(3), rule4 = getShape(4); + uno::Reference ruleProperties1(rule1, uno::UNO_QUERY); + uno::Reference ruleProperties2(rule2, uno::UNO_QUERY); + uno::Reference ruleProperties3(rule3, uno::UNO_QUERY); + uno::Reference ruleProperties4(rule4, uno::UNO_QUERY); + awt::Rectangle boundRect1, boundRect2, boundRect3, boundRect4; + ruleProperties1->getPropertyValue( "BoundRect" ) >>= boundRect1; + ruleProperties2->getPropertyValue( "BoundRect" ) >>= boundRect2; + ruleProperties3->getPropertyValue( "BoundRect" ) >>= boundRect3; + ruleProperties4->getPropertyValue( "BoundRect" ) >>= boundRect4; + // compare, allow for < 5 differences because of rounding errors + CPPUNIT_ASSERT( abs( boundRect1.Width - boundRect3.Width ) < 5 ); + CPPUNIT_ASSERT( abs( boundRect2.Width - boundRect4.Width ) < 5 ); +} + +DECLARE_WW8EXPORT_TEST(testTdf75539_relativeWidth, "tdf75539_relativeWidth.doc") +{ + //divide everything by 10 to give a margin of error for rounding etc. + sal_Int32 pageWidth = parseDump("/root/page[1]/body/infos/bounds"_ostr, "width"_ostr).toInt32()/10; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Page width", sal_Int32(9354/10), pageWidth); + CPPUNIT_ASSERT_EQUAL_MESSAGE("100% width line", pageWidth, parseDump("/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion"_ostr, "width"_ostr).toInt32()/10); + CPPUNIT_ASSERT_EQUAL_MESSAGE("50% width line", pageWidth/2, parseDump("/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion"_ostr, "width"_ostr).toInt32()/10); + CPPUNIT_ASSERT_EQUAL_MESSAGE("25% width line", pageWidth/4, parseDump("/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion"_ostr, "width"_ostr).toInt32()/10); + CPPUNIT_ASSERT_EQUAL_MESSAGE("10% width line", pageWidth/10, parseDump("/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion"_ostr, "width"_ostr).toInt32()/10); +} + +DECLARE_WW8EXPORT_TEST(testN757905, "n757905.doc") +{ + // The problem was that the paragraph had only a single fly + // (as-character-anchored), and the height of that was smaller than the + // paragraph height. When in Word-compat mode, we should take the max of + // the two, not just the height of the fly. + + OUString aHeight = parseDump("/root/page/body/txt/infos/bounds"_ostr, "height"_ostr); + CPPUNIT_ASSERT(sal_Int32(31) < aHeight.toInt32()); +} + +DECLARE_WW8EXPORT_TEST(testAllGapsWord, "all_gaps_word.doc") +{ + BorderTest borderTest; + BorderTest::testTheBorders(mxComponent, true); +} + +DECLARE_WW8EXPORT_TEST(testI120158, "i120158.doc") +{ + // See https://bz.apache.org/ooo/show_bug.cgi?id=120158 + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference paraEnumAccess(textDocument->getText(), uno::UNO_QUERY); + // list of paragraphs + uno::Reference paraEnum = paraEnumAccess->createEnumeration(); + // get contents of 1st paragraph as text + uno::Reference paragraph0(paraEnum->nextElement(), uno::UNO_QUERY); + uno::Reference text0(paragraph0, uno::UNO_QUERY); + OUString sFieldResult = text0->getString(); + CPPUNIT_ASSERT(sFieldResult.endsWith("AM") || sFieldResult.endsWith("PM")); +} + +DECLARE_WW8EXPORT_TEST(testN816603, "n816603.doc") +{ + // Bugdoc was 5 pages in Word, 1 in Writer due to pointlessly wrapping the + // table in a frame. Exact layout may depend on fonts available, etc. -- + // but at least make sure that our table spans over multiple pages now. + CPPUNIT_ASSERT(getPages() > 1); +} + +DECLARE_WW8EXPORT_TEST(testPageBorder, "page-border.doc") +{ + // Page border was missing (LineWidth was 0), due to wrong interpretation of pgbApplyTo. + table::BorderLine2 aBorder = getProperty(getStyles("PageStyles")->getByName("Standard"), "TopBorder"); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(convertTwipToMm100(6 * 20)), aBorder.LineWidth); +} + +DECLARE_WW8EXPORT_TEST(testN823651, "n823651.doc") +{ + // Character height was 10pt instead of 7.5pt in the header. + uno::Reference xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + uno::Reference xText = getProperty< uno::Reference >(xStyle, "HeaderTextFirst")->getText(); + CPPUNIT_ASSERT_EQUAL(7.5f, getProperty(getParagraphOfText(1, xText), "CharHeight")); +} + +DECLARE_WW8EXPORT_TEST(testFdo36868, "fdo36868.doc") +{ + OUString aText = parseDump("/root/page/body/txt[3]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr); + // This was 1.1. + CPPUNIT_ASSERT_EQUAL(OUString("2.1"), aText); +} + +DECLARE_WW8EXPORT_TEST(testListNolevel, "list-nolevel.doc") +{ + // Similar to fdo#36868, numbering portions had wrong values. + OUString aText = parseDump("/root/page/body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr); + // PortionType::Number was completely missing. + CPPUNIT_ASSERT_EQUAL(OUString("1."), aText); +} + +DECLARE_WW8EXPORT_TEST(testHeaderApoTable, "ooo92948-1.doc") +{ + // the problem was that a table anchored in the header was split across + // 3 text frames and quite messed up + + uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); + uno::Reference xFrame(xIndexAccess->getByIndex(1), uno::UNO_QUERY); + +// uno::Reference xHeaderText = getProperty>(getStyles("PageStyles")->getByName("Standard"), "HeaderTextFirst"); +// uno::Reference xPara(getParagraphOfText(9, xHeaderText)); +//TODO why does this not work +// uno::Reference xFrame(getParagraphAnchoredObject(1, xPara)); + + uno::Reference xTable(getParagraphOrTable(1, xFrame)); + getCell(xTable, "A1", "Aan" SAL_NEWLINE_STRING "Recipient" SAL_NEWLINE_STRING "Recipient" SAL_NEWLINE_STRING); + getCell(xTable, "A2", "Kopie aan" SAL_NEWLINE_STRING); + getCell(xTable, "A3", "Datum" SAL_NEWLINE_STRING "31 juli 2008"); + getCell(xTable, "A4", "Locatie" SAL_NEWLINE_STRING "Locationr"); + getCell(xTable, "A5", "Van" SAL_NEWLINE_STRING "Sender "); + getCell(xTable, "A6", "Directie" SAL_NEWLINE_STRING "Department"); + getCell(xTable, "A7", "Telefoon" SAL_NEWLINE_STRING "Phone"); +} + +DECLARE_WW8EXPORT_TEST(testBnc821208, "bnc821208.doc") +{ + // WW8Num1z0 earned a Symbol font, turning numbers into rectangles. + uno::Reference xPropertyState(getStyles("CharacterStyles")->getByName("WW8Num1z0"), uno::UNO_QUERY); + beans::PropertyState ePropertyState = xPropertyState->getPropertyState("CharFontName"); + // This was beans::PropertyState_DIRECT_VALUE. + CPPUNIT_ASSERT_EQUAL(beans::PropertyState_DEFAULT_VALUE, ePropertyState); + + // Background of the numbering itself should have been the default, was yellow (0xffff00). + CPPUNIT_ASSERT_EQUAL(sal_Int32(-1), getProperty(xPropertyState, "CharBackColor")); +} + +DECLARE_WW8EXPORT_TEST(testCp1000044, "cp1000044.doc") +{ + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + // It wasn't possible to fill out this form. + CPPUNIT_ASSERT_EQUAL(false, bool(xStorable->isReadonly())); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT_EQUAL( true, pDoc->getIDocumentSettingAccess().get( DocumentSettingId::PROTECT_FORM ) ); + + uno::Sequence aGrabBag = getProperty< uno::Sequence >(mxComponent, "InteropGrabBag"); + sal_Int32 nPasswordHash = 0; + for ( sal_Int32 i = 0; i < aGrabBag.getLength(); ++i ) + { + if ( aGrabBag[i].Name == "FormPasswordHash" ) + aGrabBag[i].Value >>= nPasswordHash; + } + CPPUNIT_ASSERT_EQUAL_MESSAGE("Password Hash", sal_Int32(609995782), nPasswordHash); +} + +DECLARE_WW8EXPORT_TEST(testBorderColours, "bordercolours.doc") +{ + // The following 6 colours can only be represented with WW9 (Word 2000) + // BRC (BoRder Control) structures. We can tell that they have been + // exported/imported using a WW8 (Word '97) BRC if they instead come + // through as one of the 16 colours listed at this link: + // http://msdn.microsoft.com/en-us/library/dd773060.aspx + table::BorderLine2 expectedTop(0xFA670C, 0, 53, 0, 1, 53); + table::BorderLine2 expectedLeft(0xD99594, 0, 79, 0, 0, 79); + table::BorderLine2 expectedRight(0xB2A1C7, 53, 53, 53, 3, 159); + table::BorderLine2 expectedBottom(0xB6DDE8, 0, 106, 0, 14, 106); + table::BorderLine2 expectedDashedRed(0xFA670C, 0, 53, 0, 2, 53); + table::BorderLine2 expectedDoubleGreen(0xC2D69B, 26, 106, 26, 4, 159); + + // Paragraph border + uno::Reference bookmarksSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference bookmarks = + bookmarksSupplier->getBookmarks(); + uno::Reference bookmark( + bookmarks->getByName("ParagraphBorder"), uno::UNO_QUERY); + uno::Reference anchor(bookmark->getAnchor()); + table::BorderLine2 border; + border = getProperty(anchor, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); + border = getProperty(anchor, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(anchor, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); + + // Page border + OUString pageStyleName = getProperty(anchor, "PageStyleName"); + uno::Reference pageStyle( + getStyles("PageStyles")->getByName(pageStyleName), uno::UNO_QUERY); + border = getProperty(pageStyle, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(pageStyle, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); + border = getProperty(pageStyle, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(pageStyle, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); + + // Character border + bookmark.set(bookmarks->getByName("CharBorder"), uno::UNO_QUERY); + anchor = bookmark->getAnchor(); + border = getProperty(anchor, "CharTopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "CharLeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "CharRightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "CharBottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + + // Table border + uno::Reference tablesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference tables = + tablesSupplier->getTextTables(); + uno::Reference table( + tables->getByName("Table1"), uno::UNO_QUERY); + table::TableBorder2 tableBorder = getProperty( + table, "TableBorder2"); + CPPUNIT_ASSERT_EQUAL(expectedTop.Color, tableBorder.TopLine.Color); + CPPUNIT_ASSERT_EQUAL(expectedLeft.Color, tableBorder.LeftLine.Color); + CPPUNIT_ASSERT_EQUAL(expectedRight.Color, tableBorder.RightLine.Color); + CPPUNIT_ASSERT_EQUAL(expectedBottom.Color, tableBorder.BottomLine.Color); + + // Table cells + uno::Reference cell = + table->getCellByName("A2"); + border = getProperty(cell, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(cell, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); + border = getProperty(cell, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); + + cell = table->getCellByName("B2"); + border = getProperty(cell, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + border = getProperty(cell, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(cell, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + + cell = table->getCellByName("C2"); + border = getProperty(cell, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + border = getProperty(cell, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDashedRed, border); + border = getProperty(cell, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(cell, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + + // Picture border + // (#if'd out as they are not yet imported with correct colours) +#if 0 + bookmark.set(bookmarks->getByName("PictureBorder"),uno::UNO_QUERY); + anchor = bookmark->getAnchor(); + border = getProperty(anchor, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); + border = getProperty(anchor, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(anchor, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); +#endif +} + +DECLARE_WW8EXPORT_TEST(testMsoBrightnessContrast, "msobrightnesscontrast.doc") +{ + uno::Reference image = getShape(1); + uno::Reference imageProperties(image, uno::UNO_QUERY); + uno::Reference graphic; + imageProperties->getPropertyValue( "Graphic" ) >>= graphic; + Graphic vclGraphic(graphic); + BitmapEx bitmap(vclGraphic.GetBitmapEx()); + CPPUNIT_ASSERT_EQUAL( tools::Long(58), bitmap.GetSizePixel().Width()); + CPPUNIT_ASSERT_EQUAL( tools::Long(320), bitmap.GetSizePixel().Height()); + CPPUNIT_ASSERT_EQUAL( Color(206,206,206), bitmap.GetPixelColor(16,27)); + CPPUNIT_ASSERT_EQUAL( Color(206,206,206), bitmap.GetPixelColor(22,48)); +} + +DECLARE_WW8EXPORT_TEST(testTdf95321, "tdf95321.doc") +{ + // The problem was that there should be content in the second cell + // but there wasn't. + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xIndexAccess->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Second Column"), uno::Reference(xTable->getCellByName("B1"), uno::UNO_QUERY_THROW)->getString()); +} + +DECLARE_WW8EXPORT_TEST(testFdo77844, "fdo77844.doc") +{ + uno::Reference pageStyles = getStyles("PageStyles"); + + // get a page cursor + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTextViewCursorSupplier( + xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xCursor( + xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY); + + // check that the first page has no header + xCursor->jumpToFirstPage(); + OUString pageStyleName = getProperty(xCursor, "PageStyleName"); + uno::Reference pageStyle( + pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + bool headerIsOn = getProperty(pageStyle, "HeaderIsOn"); + CPPUNIT_ASSERT(!headerIsOn); + + // check that the second page has a header + xCursor->jumpToPage(2); + pageStyleName = getProperty(xCursor, "PageStyleName"); + pageStyle.set( + pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + headerIsOn = getProperty(pageStyle, "HeaderIsOn"); + CPPUNIT_ASSERT(headerIsOn); + + // check that the third page has a header + xCursor->jumpToPage(3); + pageStyleName = getProperty(xCursor, "PageStyleName"); + pageStyle.set( + pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + headerIsOn = getProperty(pageStyle, "HeaderIsOn"); + CPPUNIT_ASSERT(headerIsOn); + + // check that the fourth page has no header + // (#if'd out as this is not yet imported correctly) +#if 0 + xCursor->jumpToPage(4); + pageStyleName = getProperty(xCursor, "PageStyleName"); + pageStyle.set( + pageStyles->getByName(pageStyleName), uno::UNO_QUERY); + headerIsOn = getProperty(pageStyle, "HeaderIsOn"); + CPPUNIT_ASSERT(!headerIsOn); +#endif +} + +DECLARE_WW8EXPORT_TEST(testFdp80333, "fdo80333.doc") +{ + // Despite there is no character border, border shadow was imported + uno::Reference xRun(getRun(getParagraph(1),1), uno::UNO_QUERY); + const table::ShadowFormat aShadow = getProperty(xRun, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_NONE, aShadow.Location); +} + +DECLARE_WW8EXPORT_TEST(testFdo81102, "fdo81102.doc") +{ + // get page style at beginning of document + uno::Reference textDocument( + mxComponent, uno::UNO_QUERY); + uno::Reference start = + textDocument->getText()->getStart(); + OUString pageStyleName = getProperty(start, "PageStyleName"); + uno::Reference pageStyle( + getStyles("PageStyles")->getByName(pageStyleName), uno::UNO_QUERY); + + // check that left and right pages do not share the same header + bool headerIsShared = getProperty(pageStyle, "HeaderIsShared"); + CPPUNIT_ASSERT(!headerIsShared); +} + +DECLARE_WW8EXPORT_TEST(testBnc787942, "bnc787942.doc") +{ + // The frame ended up on the second page instead of first. + // this is on page 1 in Word + parseDump("/root/page[1]/body/txt[4]/anchored"_ostr); + + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_PARALLEL, getProperty(getShape(1), "Surround")); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(getShape(1), "HoriOrientRelation")); +} + +DECLARE_WW8EXPORT_TEST(testTdf133504_wrapNotBeside, "tdf133504_wrapNotBeside.doc") +{ + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_NONE, getProperty(getShape(1), "Surround")); +} + +DECLARE_WW8EXPORT_TEST(testTdf36711_inlineFrames, "tdf36711_inlineFrames.doc") +{ + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::FRAME, getProperty(getShape(1), "VertOrientRelation")); +} + +DECLARE_WW8EXPORT_TEST(testLayoutHanging, "fdo68967.doc") +{ + // This must not hang in layout +} + +#if HAVE_MORE_FONTS +DECLARE_WW8EXPORT_TEST(testfdo68963, "fdo68963.doc") +{ + // The problem was that the text was not displayed. + CPPUNIT_ASSERT ( !parseDump("/root/page/body/tab/row[2]/cell[1]/txt/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr).isEmpty() ); + CPPUNIT_ASSERT_EQUAL( OUString("Topic 1"), parseDump("/root/page/body/tab/row[2]/cell[1]/txt/SwParaPortion/SwLineLayout/SwFieldPortion"_ostr, "expand"_ostr) ); + // all crossreference bookmarks should have a target. Shouldn't be any "Reference source not found" in the xml + CPPUNIT_ASSERT_EQUAL(static_cast(-1), parseDump("/root/page/body/txt[24]/SwParaPortion/SwLineLayout/SwFieldPortion[2]"_ostr,"expand"_ostr).indexOf("Reference source not found")); +} +#endif + +DECLARE_WW8EXPORT_TEST(testTdf99100, "tdf99100.doc") +{ + uno::Reference xHeaderText = getProperty< uno::Reference >(getStyles("PageStyles")->getByName("Standard"), "HeaderText"); + auto xField = getProperty< uno::Reference >(getRun(getParagraphOfText(1, xHeaderText), 2), "TextField"); + // This failed: the second text portion wasn't a field. + CPPUNIT_ASSERT(xField.is()); + CPPUNIT_ASSERT(xField->supportsService("com.sun.star.text.textfield.Chapter")); +} + +DECLARE_WW8EXPORT_TEST(testTdf74328, "tdf74328.doc") +{ +/* +reading page numbers at sections > 255, in this case 256 +*/ + uno::Reference textDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextCursor = textDocument->getText()->createTextCursor( ); + uno::Reference xProps(xTextCursor, uno::UNO_QUERY); + uno::Any aOffset = xProps->getPropertyValue("PageNumberOffset"); + sal_Int16 nOffset = 0; + aOffset >>= nOffset; + CPPUNIT_ASSERT_EQUAL(sal_Int16(256), nOffset); +} + +DECLARE_WW8EXPORT_TEST(testTdf95576, "tdf95576.doc") +{ + // The first three paragraphs in this document (which are headings) + // should have zero indent and first line indent + for (int nPara = 1; nPara <= 3; ++nPara) { + std::cout << "nPara = " << nPara << "\n"; + auto xPara = getParagraph(nPara); + + // get the numbering rules effective at this paragraph + uno::Reference xNumRules = + getProperty< uno::Reference >( + xPara, "NumberingRules"); + + // get the numbering level of this paragraph, and the properties + // associated with that numbering level + int numLevel = getProperty(xPara, "NumberingLevel"); + uno::Sequence< beans::PropertyValue > aPropertyValues; + xNumRules->getByIndex(numLevel) >>= aPropertyValues; + + // Now look through these properties for the indent and + // first line indent settings + sal_Int32 nIndentAt = -1; + sal_Int32 nFirstLineIndent = -1; + for(int j = 0 ; j< aPropertyValues.getLength() ; ++j) + { + auto aProp = aPropertyValues[j]; + std::cout << "Prop.Name: " << aProp.Name << "\n"; + if (aProp.Name == "FirstLineIndent") { + nFirstLineIndent = aProp.Value.get(); + } else if (aProp.Name == "IndentAt") { + nIndentAt = aProp.Value.get(); + } + } + + // The indent and first line indent should be zero + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nIndentAt); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nFirstLineIndent); + } +} + +DECLARE_WW8EXPORT_TEST(testTdf59896, "tdf59896.doc") +{ + // This was awt::FontWeight::NORMAL, i.e. the first run wasn't bold, when it should be bold + CPPUNIT_ASSERT_EQUAL(awt::FontWeight::BOLD, getProperty(getRun(getParagraph(1), 1), "CharWeight")); +} + +DECLARE_WW8EXPORT_TEST(testTdf102334, "tdf102334.doc") +{ + // This was false, i.e. the first run wasn't hidden, when it should have been + CPPUNIT_ASSERT_EQUAL(true, getProperty(getRun(getParagraph(7), 1), "CharHidden")); +} + +DECLARE_WW8EXPORT_TEST(testTdf128605, "tdf128605.doc") +{ + OUString aPara1PageStyleName = getProperty(getParagraph(1), "PageStyleName"); + OUString aPara2PageStyleName = getProperty(getParagraph(2), "PageStyleName"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: Standard + // - Actual : Convert 1 + // i.e. the continuous section break resulted in an unwanted page break. + CPPUNIT_ASSERT_EQUAL(aPara1PageStyleName, aPara2PageStyleName); +} + +DECLARE_WW8EXPORT_TEST(testTdf112535, "tdf112535.doc") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc->GetSpzFrameFormats()); + + auto& rFormats = *pDoc->GetSpzFrameFormats(); + CPPUNIT_ASSERT(!rFormats.empty()); + + const auto pFormat = rFormats[0]; + CPPUNIT_ASSERT(pFormat); + + // Without the accompanying fix in place, this test would have failed: auto-contour was enabled + // in Writer, but not in Word. + CPPUNIT_ASSERT(!pFormat->GetSurround().IsContour()); +} + +DECLARE_WW8EXPORT_TEST(testTdf106291, "tdf106291.doc") +{ + // Table cell was merged vertically instead of horizontally -> had incorrect dimensions + OUString cellWidth = parseDump("/root/page[1]/body/tab/row/cell[1]/infos/bounds"_ostr, "width"_ostr); + OUString cellHeight = parseDump("/root/page[1]/body/tab/row/cell[1]/infos/bounds"_ostr, "height"_ostr); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8650), cellWidth.toInt32()); + CPPUNIT_ASSERT(cellHeight.toInt32() > 200); // height might depend on font size +} + +DECLARE_WW8EXPORT_TEST(testTransparentText, "transparent-text.doc") +{ + uno::Reference xHeaderText = getProperty>( + getStyles("PageStyles")->getByName("Standard"), "HeaderText"); + uno::Reference xParagraph = getParagraphOfText(3, xHeaderText); + // Without the accompanying fix in place, this test would have failed: transparency was set to + // 100%, so the text was not readable. + sal_Int32 nExpected(COL_BLACK); + sal_Int32 nActual(getProperty(xParagraph, "CharTransparence")); + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); +} + +DECLARE_WW8EXPORT_TEST( testTdf105570, "tdf105570.doc" ) +{ + /***** + * MS-DOC specification ( https://msdn.microsoft.com/en-us/library/cc313153 ) + * ch. 2.6.3, sprmTTableHeader: + * A Bool8 value that specifies that the current table row is a header row. + * If the value is 0x01 but sprmTTableHeader is not applied with a value of 0x01 + * for a previous row in the same table, then this property MUST be ignored. + * + * The document have three tables with three rows. + * Table 1 has { 1, 0, 0 } values of the "repeat as header row" property for each row + * Table 2 has { 1, 1, 0 } + * Table 3 has { 0, 1, 1 } + ****/ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + SwShellCursor* pShellCursor = pWrtShell->getShellCursor( false ); + SwNodeIndex aIdx( pShellCursor->Start()->GetNode() ); + + // Find first table + SwTableNode* pTableNd = aIdx.GetNode().FindTableNode(); + + CPPUNIT_ASSERT_EQUAL( sal_uInt16(1), pTableNd->GetTable().GetRowsToRepeat() ); + + // Go to next table + aIdx.Assign( *pTableNd->EndOfSectionNode(), 1 ); + while ( nullptr == (pTableNd = aIdx.GetNode().GetTableNode()) ) ++aIdx; + + CPPUNIT_ASSERT_EQUAL( sal_uInt16(2), pTableNd->GetTable().GetRowsToRepeat() ); + + // Go to next table + aIdx.Assign( *pTableNd->EndOfSectionNode(), 1 ); + while ( nullptr == (pTableNd = aIdx.GetNode().GetTableNode()) ) ++aIdx; + + // As first row hasn't sprmTTableHeader set, all following must be ignored, so no rows must be repeated + CPPUNIT_ASSERT_EQUAL( sal_uInt16(0), pTableNd->GetTable().GetRowsToRepeat() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf112346) +{ + auto verify = [this]() { + // Multi-page table was imported as a single page. + CPPUNIT_ASSERT_EQUAL(2, getPages()); + }; + createSwDoc("tdf112346.doc"); + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +DECLARE_WW8EXPORT_TEST(testTdf79639, "tdf79639.doc") +{ + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1 + // - Actual : 0 + // as the floating table in the header wasn't converted to a TextFrame. + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +DECLARE_WW8EXPORT_TEST(testTdf122425_2, "tdf122425_2.doc") +{ + // This is for graphic objects in headers/footers + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwPosFlyFrames aPosFlyFrames = pDoc->GetAllFlyFormats(nullptr, false); + // There is one fly frame in the document: the text box + CPPUNIT_ASSERT_EQUAL(size_t(1), aPosFlyFrames.size()); + for (const SwPosFlyFrame& rPosFlyFrame : aPosFlyFrames) + { + const SwFrameFormat& rFormat = rPosFlyFrame.GetFormat(); + const SfxPoolItem* pItem = nullptr; + + // Check for correct explicitly-set values of UL spacings. Previously this was "DEFAULT", + // and resulted in inherited values (114 = 2 mm) used. + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, rFormat.GetItemState(RES_UL_SPACE, false, &pItem)); + auto pUL = static_cast(pItem); + CPPUNIT_ASSERT(pUL); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pUL->GetUpper()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pUL->GetLower()); + } +} + +DECLARE_WW8EXPORT_TEST(testTdf130262, "tdf130262.doc") +{ + // We had an infinite layout loop +} + +DECLARE_WW8EXPORT_TEST(testTdf38778, "tdf38778_properties_in_run_for_field.doc") +{ + CPPUNIT_ASSERT_EQUAL(10.0f, getProperty(getRun(getParagraph(1), 1), "CharHeight")); + CPPUNIT_ASSERT_EQUAL(OUString("Courier New"), getProperty(getRun(getParagraph(1), 1), "CharFontName")); +} + +DECLARE_WW8EXPORT_TEST(testN325936, "n325936.doc") +{ + /* + * The problem was that the transparent background of the drawing in the + * header was exported as non-transparent. + * + * xray ThisComponent.DrawPage(0).BackColorTransparency + */ + + CPPUNIT_ASSERT_EQUAL(Color(0x000064), getProperty< Color >(getShape(1), "BackColorTransparency")); +} + +DECLARE_WW8EXPORT_TEST(testTscp, "tscp.doc") +{ + uno::Reference xComponentContext(comphelper::getProcessComponentContext()); + uno::Reference xType = rdf::URI::create(xComponentContext, "urn:bails"); + uno::Reference xDocumentMetadataAccess(mxComponent, uno::UNO_QUERY); + uno::Sequence< uno::Reference > aGraphNames = xDocumentMetadataAccess->getMetadataGraphsWithType(xType); + // This failed, no graphs had the urn:bails type. + CPPUNIT_ASSERT_EQUAL(static_cast(1), aGraphNames.getLength()); + uno::Reference xGraphName = aGraphNames[0]; + uno::Reference xGraph = xDocumentMetadataAccess->getRDFRepository()->getGraph(xGraphName); + + // No RDF statement on the first paragraph. + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + uno::Reference xStatements = xGraph->getStatements(xParagraph, uno::Reference(), uno::Reference()); + CPPUNIT_ASSERT_EQUAL(false, static_cast(xStatements->hasMoreElements())); + + // 3 RDF statements on the second paragraph. + xParagraph.set(getParagraph(2), uno::UNO_QUERY); + std::map aExpectedStatements = + { + {"urn:bails:ExportControl:BusinessAuthorization:Identifier", "urn:example:tscp:1"}, + {"urn:bails:ExportControl:BusinessAuthorizationCategory:Identifier", "urn:example:tscp:1:confidential"}, + {"urn:bails:ExportControl:Authorization:StartValidity", "2015-11-27"} + }; + std::map aActualStatements; + xStatements = xGraph->getStatements(xParagraph, uno::Reference(), uno::Reference()); + while (xStatements->hasMoreElements()) + { + rdf::Statement aStatement = xStatements->nextElement().get(); + aActualStatements[aStatement.Predicate->getNamespace() + aStatement.Predicate->getLocalName()] = aStatement.Object->getStringValue(); + } + CPPUNIT_ASSERT(bool(aExpectedStatements == aActualStatements)); + + // No RDF statement on the third paragraph. + xParagraph.set(getParagraph(3), uno::UNO_QUERY); + xStatements = xGraph->getStatements(xParagraph, uno::Reference(), uno::Reference()); + CPPUNIT_ASSERT_EQUAL(false, static_cast(xStatements->hasMoreElements())); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo45724) +{ + loadAndReload("fdo45724.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The text and background color of the control shape was not correct. + uno::Reference xControlShape(getShape(1), uno::UNO_QUERY); + uno::Reference xComponent(xControlShape->getControl(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(xComponent, "BackgroundColor")); + CPPUNIT_ASSERT_EQUAL(OUString("xxx"), xComponent->getCurrentValue().get()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136620) +{ + loadAndReload("tdf136620.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + uno::Reference xShape = getShape(1); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(5636), xShape->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1826), xShape->getPosition().Y); + CPPUNIT_ASSERT_EQUAL(sal_Int32(6630), xShape->getSize().Height); + + // Without the fix in place, this test would have failed with + // - Expected: 5853 + // - Actual : 850 + CPPUNIT_ASSERT_EQUAL(sal_Int32(5853), xShape->getSize().Width); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo46020) +{ + loadAndReload("fdo46020.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The footnote in that document wasn't exported, check that it is actually exported + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xFootnotes->getCount()); +} + +DECLARE_WW8EXPORT_TEST(testZoom, "zoom.doc") +{ + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xViewSettingsSupplier(xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xPropertySet(xViewSettingsSupplier->getViewSettings()); + sal_Int16 nValue = 0; + xPropertySet->getPropertyValue("ZoomValue") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(42), nValue); +} + +DECLARE_WW8EXPORT_TEST(testZoomType, "zoomtype.doc") +{ + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xViewSettingsSupplier(xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xPropertySet(xViewSettingsSupplier->getViewSettings()); + sal_Int16 nValue = 0; + xPropertySet->getPropertyValue("ZoomType") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(view::DocumentZoomType::PAGE_WIDTH), nValue); +} + +DECLARE_WW8EXPORT_TEST(test56513, "fdo56513.doc") +{ + CPPUNIT_ASSERT_EQUAL(OUString("This is the header of the first section"), parseDump("/root/page[1]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("This is the first page header of the second section"), parseDump("/root/page[2]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("This is the non-first-page header of the second section"), parseDump("/root/page[3]/header/txt/text()"_ostr)); +} + +DECLARE_WW8EXPORT_TEST(testNewPageStylesTable, "new-page-styles.doc") +{ + CPPUNIT_ASSERT_EQUAL(OUString("Sigma Space Performance Goals and Results (Page 1)*"), parseDump("/root/page[1]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Sigma Space Performance Assessment (Page 2)****"), parseDump("/root/page[2]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Sigma Space Performance Goals: Next Year (Page 3)*******"), parseDump("/root/page[3]/header/txt/text()"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testFdo42144) +{ + loadAndReload("fdo42144.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Footer wasn't disabled -- instead empty footer was exported. + uno::Reference xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xStyle, "FooterIsOn")); +} + +CPPUNIT_TEST_FIXTURE(Test, testCharacterBorder) +{ + loadAndReload("charborder.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xRun(getRun(getParagraph(1),1), uno::UNO_QUERY); + // WW8 has just one border attribute (sprmCBrc) for text border so all side has + // the same border + // Border + { + const table::BorderLine2 aTopBorder = getProperty(xRun,"CharTopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(table::BorderLine2(0xFF3333,0,318,0,0,318), aTopBorder); + CPPUNIT_ASSERT_BORDER_EQUAL(aTopBorder, getProperty(xRun,"CharLeftBorder")); + CPPUNIT_ASSERT_BORDER_EQUAL(aTopBorder, getProperty(xRun,"CharBottomBorder")); + CPPUNIT_ASSERT_BORDER_EQUAL(aTopBorder, getProperty(xRun,"CharRightBorder")); + } + + // Padding (dptSpace) it is constant 0 + { + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xRun,"CharTopBorderDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xRun,"CharLeftBorderDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xRun,"CharBottomBorderDistance")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xRun,"CharRightBorderDistance")); + } + + // Shadow (fShadow) + /* WW8 use just one bool value for shadow so the next conversions + are made during an export-import round + color: any -> black + location: any -> bottom-right + width: any -> border width */ + { + const table::ShadowFormat aShadow = getProperty(xRun, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(COL_BLACK, Color(ColorTransparency, aShadow.Color)); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + CPPUNIT_ASSERT_EQUAL(sal_Int16(318), aShadow.ShadowWidth); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf41542_imagePadding) +{ + loadAndReload("tdf41542_imagePadding.odt"); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // borderlessImage - image WITHOUT BORDERS : simulate padding with -crop + text::GraphicCrop crop = getProperty(getShape(2), "GraphicCrop"); + CPPUNIT_ASSERT( crop.Left != 0 ); + CPPUNIT_ASSERT( crop.Right != 0 ); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Top ); + CPPUNIT_ASSERT_EQUAL( crop.Right, crop.Bottom ); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Right ); + + // borderedImage - image WITH BORDERS : simulate padding with -crop + crop = getProperty(getShape(3), "GraphicCrop"); + CPPUNIT_ASSERT( crop.Left != 0 ); + CPPUNIT_ASSERT( crop.Right != 0 ); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Top ); + CPPUNIT_ASSERT_EQUAL( crop.Right, crop.Bottom ); + CPPUNIT_ASSERT_EQUAL( crop.Left, crop.Right ); +} + +DECLARE_WW8EXPORT_TEST(testFdo77454, "fdo77454.doc") +{ + { + // check negative crops round-trip (with border/padding of 1) + text::GraphicCrop const crop = + getProperty(getShape(1), "GraphicCrop"); + CPPUNIT_ASSERT(abs(sal_Int32( -439) - crop.Left) <= 2); + CPPUNIT_ASSERT(abs(sal_Int32(-7040) - crop.Right) <= 2); + CPPUNIT_ASSERT(abs(sal_Int32( -220) - crop.Top) <= 2); + CPPUNIT_ASSERT(abs(sal_Int32(-7040) - crop.Bottom) <= 2); + } + + { + // check positive crops round-trip (with padding of 1) + text::GraphicCrop const crop = + getProperty(getShape(2), "GraphicCrop"); + CPPUNIT_ASSERT(abs(sal_Int32( 326) - crop.Left) <= 3); + CPPUNIT_ASSERT(abs(sal_Int32(1208) - crop.Right) <= 3); + CPPUNIT_ASSERT(abs(sal_Int32(1635) - crop.Top) <= 3); + CPPUNIT_ASSERT(abs(sal_Int32( 95) - crop.Bottom) <= 3); + } +} + +DECLARE_WW8EXPORT_TEST(testFdo59530, "fdo59530.doc") +{ + // See ooxmlexport's testFdo38244(). + // Test comment range feature. + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty(xPropertySet, "TextPortionType")); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty(xPropertySet, "TextPortionType")); + + // Test initials. + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty(xPropertySet, "Initials")); + + // Test commented text range which spans over more text nodes + // Comment starts in the second paragraph + xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), getProperty(xPropertySet, "TextPortionType")); + // Comment ends in the third paragraph + xRunEnumAccess.set(xParaEnum->nextElement(), uno::UNO_QUERY); + xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), getProperty(xPropertySet, "TextPortionType")); +} + +DECLARE_WW8EXPORT_TEST(testCommentsNested, "comments-nested.doc") +{ + uno::Reference xOuter = getProperty< uno::Reference >(getRun(getParagraph(1), 2), "TextField"); + CPPUNIT_ASSERT_EQUAL(OUString("Outer"), getProperty(xOuter, "Content")); + + uno::Reference xInner = getProperty< uno::Reference >(getRun(getParagraph(1), 4), "TextField"); + CPPUNIT_ASSERT_EQUAL(OUString("Inner"), getProperty(xInner, "Content")); +} + +CPPUNIT_TEST_FIXTURE(Test, testBorderColoursExport) +{ + loadAndReload("bordercolours.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // This is very close to testBorderColours in ww8import.cxx, but for export + + // The following 6 colours can only be represented with WW9 (Word 2000) + // BRC (BoRder Control) structures. We can tell that they have been + // exported/imported using a WW8 (Word '97) BRC if they instead come + // through as one of the 16 colours listed at this link: + // http://msdn.microsoft.com/en-us/library/dd773060.aspx + table::BorderLine2 expectedTop(0xFA670C, 0, 53, 0, 1, 53); + table::BorderLine2 expectedLeft(0xD99594, 0, 79, 0, 0, 79); + table::BorderLine2 expectedRight(0xB2A1C7, 53, 53, 53, 3, 159); + table::BorderLine2 expectedBottom(0xB6DDE8, 0, 106, 0, 14, 106); + table::BorderLine2 expectedDashedRed(0xFA670C, 0, 53, 0, 2, 53); + table::BorderLine2 expectedDoubleGreen(0xC2D69B, 26, 106, 26, 4, 159); + + // Paragraph border + uno::Reference bookmarksSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference bookmarks = + bookmarksSupplier->getBookmarks(); + uno::Reference bookmark( + bookmarks->getByName("ParagraphBorder"), uno::UNO_QUERY); + uno::Reference anchor(bookmark->getAnchor()); + table::BorderLine2 border; + border = getProperty(anchor, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); + border = getProperty(anchor, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(anchor, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); + + // Page border + OUString pageStyleName = getProperty(anchor, "PageStyleName"); + uno::Reference pageStyle( + getStyles("PageStyles")->getByName(pageStyleName), uno::UNO_QUERY); + border = getProperty(pageStyle, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(pageStyle, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); + border = getProperty(pageStyle, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(pageStyle, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); + + // Character border + bookmark.set(bookmarks->getByName("CharBorder"), uno::UNO_QUERY); + anchor = bookmark->getAnchor(); + border = getProperty(anchor, "CharTopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "CharLeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "CharRightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "CharBottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + + // Table border + uno::Reference tablesSupplier(mxComponent, + uno::UNO_QUERY); + uno::Reference tables = + tablesSupplier->getTextTables(); + uno::Reference table( + tables->getByName("Table1"), uno::UNO_QUERY); + table::TableBorder2 tableBorder = getProperty( + table, "TableBorder2"); + CPPUNIT_ASSERT_EQUAL(expectedTop.Color, tableBorder.TopLine.Color); + CPPUNIT_ASSERT_EQUAL(expectedLeft.Color, tableBorder.LeftLine.Color); + CPPUNIT_ASSERT_EQUAL(expectedRight.Color, tableBorder.RightLine.Color); +#if 0 + // #if'd out because the "fine dashed" border line style for table borders + // does not seem to save or load correctly in odt format at present + CPPUNIT_ASSERT_EQUAL(expectedBottom.Color, tableBorder.BottomLine.Color); +#endif + + // Table cells + uno::Reference cell = + table->getCellByName("A2"); + border = getProperty(cell, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(cell, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); +#if 0 + // #if'd out because the "fine dashed" border line style for table borders + // does not seem to save or load correctly in odt format at present + border = getProperty(cell, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); +#endif + + cell = table->getCellByName("B2"); + border = getProperty(cell, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + border = getProperty(cell, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(cell, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + + cell = table->getCellByName("C2"); + border = getProperty(cell, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + border = getProperty(cell, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDashedRed, border); + border = getProperty(cell, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(cell, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedDoubleGreen, border); + + // Picture border + // (#if'd out as they are not yet exported with correct colours) +#if 0 + bookmark.set(bookmarks->getByName("PictureBorder"),uno::UNO_QUERY); + anchor = bookmark->getAnchor(); + border = getProperty(anchor, "TopBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedTop, border); + border = getProperty(anchor, "LeftBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedLeft, border); + border = getProperty(anchor, "RightBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedRight, border); + border = getProperty(anchor, "BottomBorder"); + CPPUNIT_ASSERT_BORDER_EQUAL(expectedBottom, border); +#endif +} + +CPPUNIT_TEST_FIXTURE(Test, testRedlineExport1) +{ + loadAndReload("redline-export-1.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xParagraph = getParagraph(1); + uno::Reference xRunEnumAccess(xParagraph, uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + //there must be no redline information on the first line before and after reloading + while (xRunEnum->hasMoreElements()) + { + uno::Reference xRun(xRunEnum->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(false, hasProperty(xRun, "RedlineType")); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testRedlineExport2) +{ + loadAndReload("redline-export-2.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //there must be redline information on the first portion of the third paragraph before and after reloading + CPPUNIT_ASSERT_EQUAL(true, hasProperty(getRun(getParagraph(3), 1), "RedlineType")); +} + +CPPUNIT_TEST_FIXTURE(Test, testRedlineExport3) +{ + loadAndReload("redline-export-3.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //there must be redline information just on the para-break boundary between para one and two + CPPUNIT_ASSERT_EQUAL(false, hasProperty(getRun(getParagraph(1), 1), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(true, hasProperty(getRun(getParagraph(1), 2), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(true, hasProperty(getRun(getParagraph(2), 1), "RedlineType")); + CPPUNIT_ASSERT_EQUAL(false, hasProperty(getRun(getParagraph(2), 2), "RedlineType")); +} + +CPPUNIT_TEST_FIXTURE(Test, testCellBgColor) +{ + loadAndReload("cell-bg-color.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xCC0000), getProperty(xTable->getCellByName("A1"), "BackColor")); +} + +DECLARE_WW8EXPORT_TEST(testBnc636128, "bnc636128.doc") +{ + // Import / export of FFData.cch was missing. + uno::Reference xFormField = getProperty< uno::Reference >(getRun(getParagraph(1), 2), "Bookmark"); + uno::Reference xParameters = xFormField->getParameters(); + // This resulted in a container.NoSuchElementException. + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), xParameters->getByName("MaxLength").get()); +} + + +DECLARE_WW8EXPORT_TEST(testWw8Cjklist30, "cjklist30.doc") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::TIAN_GAN_ZH, numFormat); +} + +DECLARE_WW8EXPORT_TEST(testWw8Cjklist31, "cjklist31.doc") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::DI_ZI_ZH, numFormat); +} + +DECLARE_WW8EXPORT_TEST(testWw8Cjklist34, "cjklist34.doc") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::NUMBER_UPPER_ZH_TW, numFormat); +} + +DECLARE_WW8EXPORT_TEST(testWw8Cjklist35, "cjklist35.doc") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(1); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::NUMBER_LOWER_ZH, numFormat); +} + +DECLARE_WW8EXPORT_TEST(testTdf118564, "tdf118564.doc") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(3); + CPPUNIT_ASSERT_EQUAL(style::NumberingType::NUMBER_LOWER_ZH, numFormat); +} + +DECLARE_WW8EXPORT_TEST(testTdf92281, "tdf92281.doc") +{ + uno::Reference xRun(getRun(getParagraph(1),1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), getProperty(xRun, "CharFontName")); + CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), getProperty(xRun, "CharFontNameAsian")); + CPPUNIT_ASSERT_EQUAL(OUString("Wingdings"), getProperty(xRun, "CharFontNameComplex")); + + uno::Reference xXText = getParagraph(1)->getText(); + uno::Reference xCursor = xXText->createTextCursor(); + + xCursor->goRight( 5 , false ); + uno::Reference< beans::XPropertySet > xPropSet(xCursor, uno::UNO_QUERY); + static constexpr OUStringLiteral aFontname = u"\u65B0\u7D30\u660E\u9AD4;PMingLiU"; + CPPUNIT_ASSERT_EQUAL(OUString("Calibri"), getProperty(xPropSet, "CharFontName")); + CPPUNIT_ASSERT_EQUAL(OUString(aFontname), getProperty(xPropSet, "CharFontNameAsian")); + CPPUNIT_ASSERT_EQUAL(OUString("Times New Roman"), getProperty(xPropSet, "CharFontNameComplex")); +} + +DECLARE_WW8EXPORT_TEST(testCommentedTable, "commented-table.doc") +{ + // Document has a non-trivial commented text range, as the range contains a table. + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // After first import, there was an off-by-one during import, so this was "efore.\nA1\nB1\nAfte". (Notice the additional "e" prefix.) + // After export and import, things got worse, this was "\nA1\nB1\nAfte". + CPPUNIT_ASSERT_EQUAL(OUString("fore." SAL_NEWLINE_STRING "A1" SAL_NEWLINE_STRING "B1" SAL_NEWLINE_STRING "Afte"), xField->getAnchor()->getString()); +} + +DECLARE_WW8EXPORT_TEST(testTextVerticalAdjustment, "tdf36117_verticalAdjustment.doc") +{ + //Preserve the page vertical alignment setting for .doc + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + + SwPageDesc* pDesc = &pDoc->GetPageDesc( 0 ); + drawing::TextVerticalAdjust nVA = pDesc->GetVerticalAdjustment(); + CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_CENTER, nVA ); + + pDesc = &pDoc->GetPageDesc( 1 ); + nVA = pDesc->GetVerticalAdjustment(); + CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_TOP, nVA ); + + pDesc = &pDoc->GetPageDesc( 2 ); + nVA = pDesc->GetVerticalAdjustment(); + CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_BOTTOM, nVA ); + + pDesc = &pDoc->GetPageDesc( 3 ); + nVA = pDesc->GetVerticalAdjustment(); + CPPUNIT_ASSERT_EQUAL( drawing::TextVerticalAdjust_BLOCK, nVA ); +} + +DECLARE_WW8EXPORT_TEST(testRES_MIRROR_GRAPH_BOTH, "tdf56321_flipImage_both.doc") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + + for (SwNodeOffset n(0); ; n++) + { + SwNode* pNode = pDoc->GetNodes()[ n ]; + if (SwGrfNode *pGrfNode = pNode->GetGrfNode()) + { + CPPUNIT_ASSERT_EQUAL(int(MirrorGraph::Both), static_cast(pGrfNode->GetSwAttrSet().GetMirrorGrf().GetValue())); + break; + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testCommentExport) +{ + loadAndReload("comment-export.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + struct TextPortionInfo { + OUString sKind; + OUString sText; + int nAnnotationID; + }; + + const TextPortionInfo aTextPortions[] = { + {OUString("Annotation"), OUString("Comment on [A...A]"), 0}, + {OUString("Text"), OUString("[A xx "), 0}, + {OUString("Annotation"), OUString("Comment on [B...B]"), 1}, + {OUString("Text"), OUString("[B x "), 0}, + {OUString("Annotation"), OUString("Comment on [C..C]"), 2}, + {OUString("Text"), OUString("[C x B]"), 0}, + {OUString("AnnotationEnd"), OUString(), 1}, + {OUString("Text"), OUString(" x C]"), 0}, + {OUString("AnnotationEnd"), OUString(), 2}, + {OUString("Text"), OUString(" xx A]"), 0}, + {OUString("AnnotationEnd"), OUString(), 0}, + {OUString("Text"), OUString(" Comment on a point"), 0}, + {OUString("Annotation"), OUString("Comment on point"), 3}, + {OUString("Text"), OUString("x "), 0}, + {OUString("Annotation"), OUString("Comment on AA...BB"), 4}, + {OUString("Annotation"), OUString("Comment on AAAAAA"), 5}, + {OUString("Text"), OUString("AAAAAA"), 0}, + {OUString("AnnotationEnd"), OUString(), 5}, + {OUString("Text"), OUString(" BBBBBB"), 0}, + {OUString("AnnotationEnd"), OUString(), 4} + }; + + OUString sNames[6]; + + const int nNumberOfTextPortions = SAL_N_ELEMENTS(aTextPortions); + + uno::Reference xPara = getParagraph(1); + + for (int i = 0; i < nNumberOfTextPortions; ++i) + { + OUString sKind = aTextPortions[i].sKind; + uno::Reference xRun = getRun(xPara, i + 1); + uno::Reference xPropertySet(xRun, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sKind, getProperty(xPropertySet, "TextPortionType")); + + if (sKind == "Text") + { + // Check if textportion has the correct text + CPPUNIT_ASSERT_EQUAL(aTextPortions[i].sText, xRun->getString()); + } + else if (sKind == "Annotation") + { + // Check if the comment text is correct and save the name of the comment + uno::Reference xComment = getProperty< uno::Reference >(xRun, "TextField"); + CPPUNIT_ASSERT_EQUAL(aTextPortions[i].sText, getProperty(xComment, "Content")); + sNames[aTextPortions[i].nAnnotationID] = getProperty(xComment, "Name"); + } + else // if (sKind == OUString("AnnotationEnd")) + { + // Check if the correct Annotation ends here (by Name) + uno::Reference xBookmark(getProperty< uno::Reference >(xRun, "Bookmark"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sNames[aTextPortions[i].nAnnotationID], xBookmark->getName()); + } + } + + // tdf#139759 import character highlight and shade for comment text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + uno::Reference xText = getProperty>(xField, "TextRange"); + uno::Reference xParagraph = getParagraphOfText(1, xText); + CPPUNIT_ASSERT_EQUAL(COL_WHITE, getProperty(getRun(xParagraph, 1), "CharBackColor")); +} + +#if HAVE_MORE_FONTS +CPPUNIT_TEST_FIXTURE(Test, testTableKeep) +{ + loadAndReload("tdf91083.odt"); + CPPUNIT_ASSERT_EQUAL(7, getPages()); + //emulate table "keep with next" -do not split table + CPPUNIT_ASSERT_EQUAL( OUString("Row 1"), parseDump("/root/page[3]/body/tab[1]/row[2]/cell[1]/txt[1]"_ostr) ); + CPPUNIT_ASSERT_EQUAL( OUString("Row 1"), parseDump("/root/page[6]/body/tab[1]/row[2]/cell[1]/txt[1]"_ostr) ); +} +#endif + +CPPUNIT_TEST_FIXTURE(Test, tesTdf91083_tableKeep2) +{ + loadAndReload("tdf91083_tableKeep2.odt"); + //emulate table "keep with next" - split large row in order to keep with previous paragraph + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table doesn't split, so it starts on page 2", + OUString("0"), parseDump("count(//page[1]//tab)"_ostr) ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Page 2 starts with a paragraph/title, not a table", + OUString("KeepWithNext"), parseDump("//page[2]/body/txt[1]"_ostr) ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table sticks with previous paragraph, so it starts on page 2", + OUString("1"), parseDump("count(//page[2]//tab)"_ostr) ); + CPPUNIT_ASSERT_MESSAGE("Row itself splits, not the table at a row boundary", + "Cell 2" != parseDump("//page[3]//tab//row[2]/cell[1]/txt[1]"_ostr) ); +} + +CPPUNIT_TEST_FIXTURE(Test, tesTdf91083_tableKeep3) +{ + loadAndReload("tdf91083_tableKeep3.odt"); + CPPUNIT_ASSERT_EQUAL(3, getPages()); + //emulate table "keep with next" - split single row table in order to keep with previous paragraph + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table doesn't split, so it starts on page 2", + OUString("0"), parseDump("count(//page[1]//tab)"_ostr) ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table sticks with previous paragraph, so it starts on page 2", + OUString("1"), parseDump("count(//page[2]//tab)"_ostr) ); +} + +DECLARE_WW8EXPORT_TEST(testTdf76349_textboxMargins, "tdf76349_textboxMargins.doc") +{ + // textboxes without borders were losing their spacing items in round-tripping + CPPUNIT_ASSERT( 0 < parseDump("/root/page/body/txt/anchored/fly/infos/prtBounds"_ostr, "left"_ostr).toInt32() ); + + uno::Reference xShape = getShape(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Textbox background color", Color(0xD8, 0xD8, 0xD8), getProperty(xShape, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testMoveRange) +{ + loadAndReload("fdo66304-1.odt"); + //the save must survive without asserting +} + +CPPUNIT_TEST_FIXTURE(Test, testClearFramePams) +{ + loadAndReload("tdf46441-2.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + //the save must survive without asserting +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf94386) +{ + createSwDoc("tdf94386.odt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + + // emulate the behavior from tdf#94386 - insert an envelope to the + // document + { + SfxItemSet aSet(pWrtShell->GetView().GetCurShell()->GetPool(), svl::Items); + aSet.Put(SwEnvItem()); + SfxRequest aRequest(FN_ENVELOP, SfxCallMode::SYNCHRON, aSet); + SW_MOD()->ExecOther(aRequest); + } + saveAndReload("MS Word 97"); + + // check that the first and next page use different page styles + uno::Reference xModel(mxComponent, uno::UNO_QUERY); + uno::Reference xTextViewCursorSupplier( + xModel->getCurrentController(), uno::UNO_QUERY); + uno::Reference xCursor( + xTextViewCursorSupplier->getViewCursor(), uno::UNO_QUERY); + + xCursor->jumpToFirstPage(); + OUString firstPageStyleName = getProperty(xCursor, "PageStyleName"); + xCursor->jumpToLastPage(); + OUString lastPageStyleName = getProperty(xCursor, "PageStyleName"); + CPPUNIT_ASSERT(firstPageStyleName != lastPageStyleName); + + uno::Reference xFirstPropertySet(getStyles("PageStyles")->getByName(firstPageStyleName), uno::UNO_QUERY); + awt::Size fSize; + xFirstPropertySet->getPropertyValue("Size") >>= fSize; + + uno::Reference xNextPropertySet(getStyles("PageStyles")->getByName(lastPageStyleName), uno::UNO_QUERY); + awt::Size lSize; + xNextPropertySet->getPropertyValue("Size") >>= lSize; + + CPPUNIT_ASSERT((fSize.Width != lSize.Width)); + CPPUNIT_ASSERT((fSize.Height != lSize.Height)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf99474) +{ + loadAndReload("tdf99474.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // The bullet colour of paragraph #3 should be COL_AUTO + auto xPara = getParagraph(3); + uno::Reference xNumRules = + getProperty< uno::Reference >( + xPara, "NumberingRules"); + + int numLevel = getProperty(xPara, "NumberingLevel"); + uno::Sequence< beans::PropertyValue > aPropertyValues; + xNumRules->getByIndex(numLevel) >>= aPropertyValues; + OUString charStyleName; + for(int j = 0 ; j< aPropertyValues.getLength() ; ++j) + { + auto aProp = aPropertyValues[j]; + if (aProp.Name == "CharStyleName") { + charStyleName = aProp.Value.get(); + break; + } + } + CPPUNIT_ASSERT(charStyleName.getLength()); + uno::Reference xStyle( + getStyles("CharacterStyles")->getByName(charStyleName), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xStyle, "CharColor")); +} + +DECLARE_WW8EXPORT_TEST(testContinuousSectionsNoPageBreak, "continuous-sections.doc") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT(pDoc); + + // Continuous section breaks should not add new pages + CPPUNIT_ASSERT_EQUAL(size_t(1), pDoc->GetPageDescCnt()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ww8export/ww8export2.cxx b/sw/qa/extras/ww8export/ww8export2.cxx new file mode 100644 index 0000000000..0a86934893 --- /dev/null +++ b/sw/qa/extras/ww8export/ww8export2.cxx @@ -0,0 +1,1163 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ww8export/data/", "MS Word 97") {} +}; + +DECLARE_WW8EXPORT_TEST(testTdf99120, "tdf99120.doc") +{ + CPPUNIT_ASSERT_EQUAL(OUString("Section 1, odd."), parseDump("/root/page[1]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Section 1, even."), parseDump("/root/page[2]/header/txt/text()"_ostr)); + // This failed: the header was empty on the 3rd page, as the first page header was shown. + CPPUNIT_ASSERT_EQUAL(OUString("Section 2, odd."), parseDump("/root/page[3]/header/txt/text()"_ostr)); + CPPUNIT_ASSERT_EQUAL(OUString("Section 2, even."), parseDump("/root/page[4]/header/txt/text()"_ostr)); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf41542_borderlessPadding) +{ + loadAndReload("tdf41542_borderlessPadding.odt"); + // the page style's borderless padding should force this to 3 pages, not 1 + CPPUNIT_ASSERT_EQUAL( 3, getPages() ); +} + +DECLARE_WW8EXPORT_TEST(testTdf60378_mergedBorders, "tdf60378_mergedBorders.doc") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // The border width was zero + table::BorderLine2 aBorder = getProperty(xTable->getCellByName("B2"), "RightBorder"); + CPPUNIT_ASSERT(aBorder.LineWidth > 0); +} + +DECLARE_WW8EXPORT_TEST(testTdf55528_relativeTableWidth, "tdf55528_relativeTableWidth.doc") +{ + + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Table relative width percent", sal_Int16(98), getProperty(xTable, "RelativeWidth")); + } + +CPPUNIT_TEST_FIXTURE(Test, testTdf128700_relativeTableWidth) +{ + auto verify = [this]() { + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + // Since the table has been converted into a floating frame, the relative width either needed to be transferred + // onto the frame, or else just thrown out. Otherwise it becomes relative to the size of the frame. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Floated table can't use relative width", sal_Int16(0), getProperty(xTable, "RelativeWidth")); + }; + // This also resulted in a layout loop when flys were allowed to split in footers. + createSwDoc("tdf128700_relativeTableWidth.doc"); + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf116436_tableBackground) +{ + loadAndReload("tdf116436_tableBackground.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell = xTable->getCellByName("A1"); + CPPUNIT_ASSERT_EQUAL(Color(0xF8DF7C), getProperty(xCell, "BackColor")); + xCell.set(xTable->getCellByName("A6")); + CPPUNIT_ASSERT_EQUAL(Color(0x81D41A), getProperty(xCell, "BackColor")); + xCell.set(xTable->getCellByName("B6")); + CPPUNIT_ASSERT_EQUAL(Color(0xFFFBCC), getProperty(xCell, "BackColor")); +} + +DECLARE_WW8EXPORT_TEST(testTdf37153, "tdf37153_considerWrapOnObjPos.doc") +{ + CPPUNIT_ASSERT_EQUAL(text::WrapTextMode_THROUGH, getProperty(getShape(1), "Surround")); + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::VertOrientation::BOTTOM, getProperty(xTable->getCellByName("A1"), "VertOrient")); + + //For MSO compatibility, the image should be at the top of the cell, not at the bottom - despite VertOrientation::BOTTOM + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + sal_Int32 nFlyTop = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[1]/txt/anchored/fly/infos/bounds"_ostr, "top"_ostr).toInt32(); + CPPUNIT_ASSERT_MESSAGE("FlyTop should be 3820, not 6623", nFlyTop < 4000); + sal_Int32 nTextTop = getXPath(pXmlDoc, "/root/page/body/tab/row/cell[2]/txt[1]/infos/bounds"_ostr, "top"_ostr).toInt32(); + CPPUNIT_ASSERT_MESSAGE("TextTop should be 5388", nTextTop > 4000); +} + +DECLARE_WW8EXPORT_TEST(testTdf49102_mergedCellNumbering, "tdf49102_mergedCellNumbering.doc") +{ + CPPUNIT_ASSERT_EQUAL( OUString("2."), parseDump("/root/page/body/tab/row[4]/cell/txt/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr) ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf55427_footnote2endnote) +{ + loadAndReload("tdf55427_footnote2endnote.odt"); + uno::Reference xPageStyle(getStyles("ParagraphStyles")->getByName("Footnote"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Footnote style is rose color", Color(0xFF007F), getProperty< Color >(xPageStyle, "CharColor")); + xPageStyle.set(getStyles("ParagraphStyles")->getByName("Endnote"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Endnote style is cyan3 color", Color(0x2BD0D2), getProperty< Color >(xPageStyle, "CharColor")); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + // The footnote numbering type of ARABIC will not transfer over when those footnotes are converted to endnotes. + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Footnote numbering type", SVX_NUM_ARABIC, pDoc->GetFootnoteInfo().m_aFormat.GetNumberingType() ); + // The original document has a real endnote using ROMAN_LOWER numbering, so that setting MUST remain unchanged. + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Endnote numbering type", SVX_NUM_ROMAN_LOWER, pDoc->GetEndNoteInfo().m_aFormat.GetNumberingType() ); + + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + + uno::Reference xEndnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xEndnotes = xEndnotesSupplier->getEndnotes(); + uno::Reference xEndnote; + xEndnotes->getByIndex(0) >>= xEndnote; + uno::Reference xEndnoteText; + xEndnotes->getByIndex(0) >>= xEndnoteText; + + // ODT footnote-at-document-end's closest DOC match is an endnote, so the two imports will not exactly match by design. + if (!isExported()) + { + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original footnote count", sal_Int32(5), xFootnotes->getCount() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original endnote count", sal_Int32(1), xEndnotes->getCount() ); + + uno::Reference xFootnote; + xFootnotes->getByIndex(0) >>= xFootnote; + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original footnote's number", OUString("1"), xFootnote->getAnchor()->getString() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original endnote's number", OUString("i"), xEndnote->getAnchor()->getString() ); + + uno::Reference xFootnoteText; + xFootnotes->getByIndex(0) >>= xFootnoteText; + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original footnote style", OUString("Footnote"), getProperty(getParagraphOfText(1, xFootnoteText), "ParaStyleName") ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original endnote style", OUString("Endnote"), getProperty(getParagraphOfText(1, xEndnoteText), "ParaStyleName") ); + } + else + { + // These asserted items are major differences in the conversion from footnote to endnote, NOT necessary conditions for a proper functioning document. + CPPUNIT_ASSERT_EQUAL_MESSAGE( "At-Document-End footnotes were converted into endnotes", sal_Int32(0), xFootnotes->getCount() ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "At-Document-End footnotes became endnotes", sal_Int32(6), xEndnotes->getCount() ); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( "converted footnote's number", OUString("i"), xEndnote->getAnchor()->getString() ); + xEndnotes->getByIndex(4) >>= xEndnote; + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original endnote's new number", OUString("v"), xEndnote->getAnchor()->getString() ); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( "retained footnote style", OUString("Footnote"), getProperty(getParagraphOfText(1, xEndnoteText), "ParaStyleName") ); + xEndnotes->getByIndex(4) >>= xEndnoteText; + CPPUNIT_ASSERT_EQUAL_MESSAGE( "original endnote style", OUString("Endnote"), getProperty(getParagraphOfText(1, xEndnoteText), "ParaStyleName") ); + } +} + +DECLARE_WW8EXPORT_TEST(testTdf107931_KERN_DocEnabled_disabledDefStyle, "testTdf107931_KERN_DocEnabled_disabledDefStyle.doc") +{ + // Paragraph 3: the default style has kerning disabled + CPPUNIT_ASSERT(!getProperty(getRun(getParagraph(3), 1), "CharAutoKerning")); + // Paragraph 4: style with kerning disabled + CPPUNIT_ASSERT(!getProperty(getRun(getParagraph(4), 1), "CharAutoKerning")); + // Paragraph 5: style with kerning enabled + CPPUNIT_ASSERT(getProperty(getRun(getParagraph(5), 1), "CharAutoKerning")); + // Paragraph 6: directly applied character properties: kerning disabled + CPPUNIT_ASSERT(!getProperty(getRun(getParagraph(6), 1), "CharAutoKerning")); + // Paragraph 7: directly applied character properties: kerning enabled + CPPUNIT_ASSERT(getProperty(getRun(getParagraph(7), 1), "CharAutoKerning")); +} + +DECLARE_WW8EXPORT_TEST(testTdf107931_KERN_enabledDefStyle, "testTdf107931_KERN_enabledDefStyle.doc") +{ + // Paragraph 3: the default style has kerning enabled + CPPUNIT_ASSERT(getProperty(getRun(getParagraph(3), 1), "CharAutoKerning")); + // Paragraph 4: style with kerning disabled + CPPUNIT_ASSERT(!getProperty(getRun(getParagraph(4), 1), "CharAutoKerning")); + // Paragraph 5: style with kerning enabled + CPPUNIT_ASSERT(getProperty(getRun(getParagraph(5), 1), "CharAutoKerning")); + // Paragraph 6: directly applied character properties: kerning disabled + CPPUNIT_ASSERT(!getProperty(getRun(getParagraph(6), 1), "CharAutoKerning")); + // Paragraph 7: directly applied character properties: kerning enabled + CPPUNIT_ASSERT(getProperty(getRun(getParagraph(7), 1), "CharAutoKerning")); +} + +DECLARE_WW8EXPORT_TEST(testTdf89377, "tdf89377_tableWithBreakBeforeParaStyle.doc") +{ + // the paragraph style should set table's text-flow break-before-page + CPPUNIT_ASSERT_EQUAL( 2, getPages() ); +} + +DECLARE_WW8EXPORT_TEST(testTdf96277, "tdf96277.doc") +{ + // mismatch between anchoring at paragraph and ULSpacing to Page + CPPUNIT_ASSERT_EQUAL( 1, getPages() ); +} + +DECLARE_WW8EXPORT_TEST(testBnc863018b, "bnc863018b.doc") +{ + // The whitespace above the table should allow text to flow between the table anchor and the table. + // Since it doesn't, don't add the whitespace. + CPPUNIT_ASSERT_EQUAL( 1, getPages() ); +} + +DECLARE_WW8EXPORT_TEST(testTdf112517_maxSprms, "tdf112517_maxSprms.doc") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL( sal_Int32(28), xTable->getRows()->getCount() ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf108448_endNote) +{ + loadAndReload("tdf108448_endNote.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xEndnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xEndnotes = xEndnotesSupplier->getEndnotes(); + uno::Reference xEndnote; + xEndnotes->getByIndex(0) >>= xEndnote; + + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of paragraphs in Endnote i", 1, getParagraphs(xEndnote) ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf106062_nonHangingFootnote) +{ + loadAndReload("tdf106062_nonHangingFootnote.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xTextRange(xFootnotes->getByIndex(0), uno::UNO_QUERY); + // This failed, tab between the footnote number and the footnote content was lost on import. + CPPUNIT_ASSERT_MESSAGE( "Footnote starts with a tab", xTextRange->getString().startsWith("\t") ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf116570_exportFootnote) +{ + loadAndReload("tdf116570_exportFootnote.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xFootnoteText; + xFootnotes->getByIndex(0) >>= xFootnoteText; + + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Number of paragraphs in first footnote", 2, getParagraphs(xFootnoteText) ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf80635_pageRightRTL) +{ + auto verify = [this]() { + // tdf#80635 - assert horizontal position of the table. + uno::Reference xFly = getShape(1); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xFly, "HoriOrientRelation")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Horizontal Orientation", text::HoriOrientation::RIGHT, getProperty(xFly, "HoriOrient")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("text probably does not wrap here", 1, getPages()); + }; + createSwDoc("tdf80635_pageRightRTL.doc"); + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf80635_marginRTL) +{ + auto verify = [this]() { + // tdf#80635 - assert the horizontal orientation of the table. + uno::Reference xFly = getShape(1); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Horizontal Orientation", text::HoriOrientation::RIGHT, getProperty(xFly, "HoriOrient")); + }; + createSwDoc("tdf80635_marginRightRTL.doc"); + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf80635_marginLeft) +{ + auto verify = [this]() { + // tdf#80635 - assert horizontal position of the table. + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Table Indent", tools::Long(0), getProperty(xTable, "LeftMargin"), 100); + uno::Reference xFly = getShape(1); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-2958), getProperty(xFly, "HoriOrientPosition")); + }; + createSwDoc("tdf80635_marginLeft.doc"); + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf80635_pageLeft) +{ + auto verify = [this]() { + // tdf#80635 - assert horizontal orient relation of the table. + uno::Reference xFly = getShape(1); + CPPUNIT_ASSERT_EQUAL(text::RelOrientation::PAGE_FRAME, getProperty(xFly, "HoriOrientRelation")); + CPPUNIT_ASSERT_EQUAL(text::HoriOrientation::NONE, getProperty(xFly, "HoriOrient")); + CPPUNIT_ASSERT_EQUAL(sal_Int32(-189), getProperty(xFly, "HoriOrientPosition")); + }; + createSwDoc("tdf80635_pageLeft.doc"); + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +DECLARE_WW8EXPORT_TEST(testTdf99197_defaultLTR, "tdf99197_defaultLTR.doc") +{ + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Default Paragraph style, LTR", + text::WritingMode2::LR_TB, getProperty(getParagraph(1), "WritingMode") ); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( "myDefaultStyle - no base style, LTR", + text::WritingMode2::LR_TB, getProperty(getParagraph(2), "WritingMode") ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf107773) +{ + auto verify = [this]() { + // This failed, multi-page table was imported as a non-split frame. + SwDoc* pDoc = getSwDoc(); + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + auto pPage1 = dynamic_cast(pLayout->Lower()); + CPPUNIT_ASSERT(pPage1); + // pPage1 has no sorted (floating) objections. + CPPUNIT_ASSERT(pPage1->GetSortedObjs()); + const SwSortedObjs& rPage1Objs = *pPage1->GetSortedObjs(); + CPPUNIT_ASSERT_EQUAL(static_cast(1), rPage1Objs.size()); + auto pPage1Fly = dynamic_cast(rPage1Objs[0]); + CPPUNIT_ASSERT(pPage1Fly); + auto pTab1 = dynamic_cast(pPage1Fly->GetLower()); + CPPUNIT_ASSERT(pTab1); + // This failed, the split fly containing a table was exported back to DOC as shape+table, + // which can't split. + CPPUNIT_ASSERT(pTab1->HasFollow()); + + // tdf#80635 - assert the horizontal orientation. + const SwFormatHoriOrient& rFormatHoriOrient = pPage1Fly->GetFormat()->GetHoriOrient(); + CPPUNIT_ASSERT_EQUAL(css::text::HoriOrientation::CENTER, rFormatHoriOrient.GetHoriOrient()); + }; + createSwDoc("tdf107773.doc"); + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +DECLARE_WW8EXPORT_TEST(testTdf112074_RTLtableJustification, "tdf112074_RTLtableJustification.doc") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("Right To Left writing mode", text::WritingMode2::RL_TB, getProperty(xTable, "WritingMode")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Horizontal Orientation", text::HoriOrientation::LEFT_AND_WIDTH, getProperty(xTable, "HoriOrient")); + CPPUNIT_ASSERT_MESSAGE("Table Indent", getProperty(xTable, "LeftMargin") > 3000); + CPPUNIT_ASSERT_MESSAGE("Table Indent is 3750", getProperty(xTable, "LeftMargin") < 4000 ); + CPPUNIT_ASSERT_EQUAL( style::ParagraphAdjust_RIGHT, static_cast(getProperty(getParagraphOrTable(2), "ParaAdjust")) ); +} + +DECLARE_WW8EXPORT_TEST(testTdf98620_rtlJustify, "tdf98620_rtlJustify.doc") +{ + CPPUNIT_ASSERT_EQUAL( style::ParagraphAdjust_RIGHT, static_cast(getProperty(getParagraph(1), "ParaAdjust")) ); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Right To Left style", text::WritingMode2::RL_TB, getProperty(getParagraph(1), "WritingMode")); +} + +DECLARE_WW8EXPORT_TEST(testTdf121110_absJustify, "tdf121110_absJustify.doc") +{ + CPPUNIT_ASSERT_EQUAL( style::ParagraphAdjust_RIGHT, static_cast(getProperty(getParagraph(1), "ParaAdjust")) ); + CPPUNIT_ASSERT_EQUAL( style::ParagraphAdjust_LEFT, static_cast(getProperty(getParagraph(3), "ParaAdjust")) ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf106174_rtlParaAlign) +{ + loadAndReload("tdf106174_rtlParaAlign.docx"); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_CENTER), getProperty(getParagraph(1), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_CENTER), getProperty(getParagraph(2), "ParaAdjust")); + uno::Reference xPropertySet(getStyles("ParagraphStyles")->getByName("Another paragraph aligned to right"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(xPropertySet, "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(3), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(4), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(5), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(6), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(7), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(8), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(9), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(10), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(11), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(12), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_LEFT), getProperty(getParagraph(13), "ParaAdjust")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(style::ParagraphAdjust_RIGHT), getProperty(getParagraph(14), "ParaAdjust")); +} + +DECLARE_WW8EXPORT_TEST(testTdf119232_startEvenPage, "tdf119232_startEvenPage.doc") +{ + CPPUNIT_ASSERT_EQUAL(sal_Int16(2), getProperty(getParagraph(1), "PageNumberOffset")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104805, "tdf104805.doc") +{ + // Prefix was "." instead of empty, so the second paragraph was + // rendered as ".1" instead of "1.". + // Unittest modified due to Prefix/Suffix support obsolete + uno::Reference xPara(getParagraph(2), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104334, "tdf104334.doc") +{ + // This failed with a container::NoSuchElementException: STYLEREF was + // mapped to SwChapterField, and the field result was "This is a Heading 1" + // instead of just "1". + CPPUNIT_ASSERT_EQUAL(OUString("1"), getRun(getParagraph(2), 4)->getString()); +} + +DECLARE_WW8EXPORT_TEST(testTdf108072, "tdf108072.doc") +{ + // The property IsSplitAllowed was imported from an obsolete property, sprmTFCantSplit90 + // instead of sprmTFCantSplit. sprmTFCantSplit90 is set to true for merged rows, so + // for merged rows incorrect settings were imported, which prevented them from breaking over pages. + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xTableRows = xTable->getRows(); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xTableRows->getByIndex(0), "IsSplitAllowed")); +} + +DECLARE_WW8EXPORT_TEST(testTdf123321, "shapes-line-ellipse.doc") +{ + // These are the 3 lines in which 1st and 3rd one were disappearing before + uno::Reference l1 = getShape(7); + uno::Reference l2 = getShape(8); + uno::Reference l3 = getShape(9); + + // first line (smallest) + // Fails without the fix: Expected: 423, Actual: 2 + CPPUNIT_ASSERT_EQUAL(sal_Int32(423), l1->getSize().Height); + // Fails without the fix: Expected: 0, Actual: 2 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), l1->getSize().Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7908), l1->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(37), l1->getPosition().Y); + + // second line (larger) + CPPUNIT_ASSERT_EQUAL(sal_Int32(2542), l2->getSize().Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), l2->getSize().Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7916), l2->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(289), l2->getPosition().Y); + + // third line (largest) + // Fails without the fix: Expected: 7027, Actual: 2 + CPPUNIT_ASSERT_EQUAL(sal_Int32(7027), l3->getSize().Height); + // Fails without the fix: Expected: 0, Actual: 2 + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), l3->getSize().Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(7911), l3->getPosition().X); + CPPUNIT_ASSERT_EQUAL(sal_Int32(231), l3->getPosition().Y); +} + +DECLARE_WW8EXPORT_TEST(testTdf91687, "tdf91687.doc") +{ + // Exported Watermarks were resized + uno::Reference xWatermark = getShape(1); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(5172), xWatermark->getSize().Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(18105), xWatermark->getSize().Width); +} + +DECLARE_WW8EXPORT_TEST(testTdf114308, "tdf114308.doc") +{ + // Watermark with no additional padding + uno::Reference xWatermark = getShape(1); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(8729), xWatermark->getSize().Height); +} + +DECLARE_WW8EXPORT_TEST(testTdf111480, "tdf111480.doc") +{ + // Circular text was imported horizontally + uno::Reference xText = getShape(1); + + CPPUNIT_ASSERT(xText->getSize().Height > 11000); + CPPUNIT_ASSERT(xText->getSize().Width > 11000); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf70838) +{ + loadAndReload("tdf70838.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + tools::Rectangle aRect = pPage->GetObj(0)->GetSnapRect(); + CPPUNIT_ASSERT(aRect.GetHeight() > aRect.GetWidth()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf70838b_verticalRotation) +{ + loadAndReload("tdf70838b_verticalRotation.odt"); + CPPUNIT_ASSERT_EQUAL(3, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SdrPage* pPage = pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage(0); + tools::Rectangle aGroupShape = pPage->GetObj(0)->GetSnapRect(); + tools::Rectangle aLine = pPage->GetObj(2)->GetSnapRect(); + + CPPUNIT_ASSERT_MESSAGE("Smiley faces are round", aGroupShape.GetHeight() > aGroupShape.GetWidth()); + CPPUNIT_ASSERT_MESSAGE("Line is taller, not wider", aLine.GetHeight() > aLine.GetWidth()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129247) +{ + loadAndReload("tdf129247.docx"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Without the fix in place, the checkbox wouldn't be exported + CPPUNIT_ASSERT_EQUAL(1, getShapes()); +} + +CPPUNIT_TEST_FIXTURE(Test, testActiveXCheckbox) +{ + loadAndReload("checkbox_control.odt"); + CPPUNIT_ASSERT_EQUAL(2, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // First check box anchored as a floating object + uno::Reference xControlShape; + if(!isExported()) + xControlShape.set(getShape(1), uno::UNO_QUERY); + else + xControlShape.set(getShape(2), uno::UNO_QUERY); + CPPUNIT_ASSERT(xControlShape.is()); + + // Check whether we have the right control + uno::Reference xPropertySet(xControlShape->getControl(), uno::UNO_QUERY); + uno::Reference xServiceInfo(xPropertySet, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService( "com.sun.star.form.component.CheckBox"))); + CPPUNIT_ASSERT_EQUAL(OUString("Floating Checkbox"), getProperty(xPropertySet, "Label")); + + // Check anchor type + uno::Reference xPropertySet2(xControlShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER,getProperty(xPropertySet2,"AnchorType")); + + // Second check box anchored inline / as character + if(!isExported()) + xControlShape.set(getShape(2), uno::UNO_QUERY); + else + xControlShape.set(getShape(1), uno::UNO_QUERY); + + // Check whether we have the right control + xPropertySet.set(xControlShape->getControl(), uno::UNO_QUERY); + xServiceInfo.set(xPropertySet, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(true, bool(xServiceInfo->supportsService("com.sun.star.form.component.CheckBox"))); + CPPUNIT_ASSERT_EQUAL(OUString("Inline Checkbox"), getProperty(xPropertySet, "Label")); + + // Check anchor type + xPropertySet2.set(xControlShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER,getProperty(xPropertySet2,"AnchorType")); +} + +DECLARE_WW8EXPORT_TEST( testTdf115896_layoutInCell, "tdf115896_layoutInCell.doc" ) +{ + // Check anchor type - was anchored to page because of unknown version of Word + uno::Reference xPropertySet(getShape(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER,getProperty(xPropertySet,"AnchorType")); +} + +DECLARE_WW8EXPORT_TEST(testTdf67207_MERGEFIELD, "mailmerge.doc") +{ + uno::Reference xTextField = getProperty< uno::Reference >(getRun(getParagraph(1), 2), "TextField"); + CPPUNIT_ASSERT(xTextField.is()); + uno::Reference xServiceInfo(xTextField, uno::UNO_QUERY_THROW); + uno::Reference xDependent(xTextField, uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.Database")); + OUString sValue; + xTextField->getPropertyValue("Content") >>= sValue; + CPPUNIT_ASSERT_EQUAL(u"«Name»"_ustr, sValue); + + uno::Reference xFiledMaster = xDependent->getTextFieldMaster(); + uno::Reference xFiledMasterServiceInfo(xFiledMaster, uno::UNO_QUERY_THROW); + + CPPUNIT_ASSERT(xFiledMasterServiceInfo->supportsService("com.sun.star.text.fieldmaster.Database")); + + // Defined properties: DataBaseName, Name, DataTableName, DataColumnName, DependentTextFields, DataCommandType, InstanceName, DataBaseURL + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("Name") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("Name"), sValue); + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("DataColumnName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("Name"), sValue); + CPPUNIT_ASSERT(xFiledMaster->getPropertyValue("InstanceName") >>= sValue); + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.text.fieldmaster.DataBase.Name"), sValue); +} + +DECLARE_OOXMLEXPORT_TEST( testTableCrossReference, "table_cross_reference.odt" ) +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // tdf#42346: Cross references to tables were not saved + // MSO uses simple bookmarks for referencing table caption, so we do the same by export + if (!isExported()) + return; + + // Check whether we have all the necessary bookmarks exported and imported back + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(4), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_number_only")); + + // Check bookmark text ranges + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 1: Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 1"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + + // Check reference fields + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + + sal_uInt16 nIndex = 0; + while (xFields->hasMoreElements()) + { + uno::Reference xServiceInfo(xFields->nextElement(), uno::UNO_QUERY); + uno::Reference xPropertySet(xServiceInfo, uno::UNO_QUERY); + switch (nIndex) + { + // Full reference to table caption + case 0: + { + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Table 1: Table caption"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to table number + case 1: + { + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_number_only"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to caption only + case 2: + { + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_caption_only"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to category and number + case 3: + { + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Table 1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_label_and_number"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Reference to page of the table + case 4: + { + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Page style reference / exported as simple page reference + case 5: + { + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("1"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + // Above / below reference + case 6: + { + CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextField.GetReference")); + OUString sValue; + sal_Int16 nValue; + xPropertySet->getPropertyValue("CurrentPresentation") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("above"), sValue); + xPropertySet->getPropertyValue("SourceName") >>= sValue; + CPPUNIT_ASSERT_EQUAL(OUString("Ref_Table0_full"), sValue); + xPropertySet->getPropertyValue("SequenceNumber") >>= nValue; + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), nValue); + break; + } + default: + break; + } + ++nIndex; + } + CPPUNIT_ASSERT_EQUAL(sal_uInt16(8), nIndex); +} + +CPPUNIT_TEST_FIXTURE(Test, testTableCrossReferenceCustomFormat) +{ + loadAndReload("table_cross_reference_custom_format.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // tdf#42346: Cross references to tables were not saved + // Check also captions with custom formatting + if (!isExported()) + return; + + // Check whether we have all the necessary bookmarks exported and imported back + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(16), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table1_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table2_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Table3_number_only")); + + // Check bookmark text ranges + // First table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1. Table: Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1. Table"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + // Second table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table1_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("2. TableTable caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table1_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("2. Table"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table1_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table1_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("2"), xRange->getString()); + } + // Third table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table2_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("3) Table Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table2_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("3) Table"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table2_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table2_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("3"), xRange->getString()); + } + // Fourth table's caption + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table3_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 4- Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table3_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table 4"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table3_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Table caption"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Table3_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("4"), xRange->getString()); + } +} + +DECLARE_OOXMLEXPORT_TEST( testObjectCrossReference, "object_cross_reference.odt" ) +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); + // tdf#42346: Cross references to objects were not saved + // MSO uses simple bookmarks for referencing table caption, so we do the same by export + if (!isExported()) + return; + + // Check whether we have all the necessary bookmarks exported and imported back + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(15), xBookmarksByIdx->getCount()); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Drawing1_full")); + + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Illustration1_caption_only")); + + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_full")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_label_and_number")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_caption_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text0_number_only")); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Ref_Text1_label_and_number")); + + // Check bookmark text ranges + // Cross references to shapes + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Drawing0_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 1: A rectangle"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Drawing0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 1"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Drawing0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("A rectangle"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Drawing0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Drawing1_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Drawing 2: a circle"), xRange->getString()); + } + + // Cross references to pictures + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Illustration0_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Illustration 1: A picture"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Illustration0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Illustration 1"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Illustration0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("A picture"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Illustration0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Illustration1_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("another image"), xRange->getString()); + } + + // Cross references to text frames + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Text0_full"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Text 1: A frame"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Text0_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Text 1"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Text0_caption_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("A frame"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Text0_number_only"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("1"), xRange->getString()); + } + { + uno::Reference xContent(xBookmarksByName->getByName("Ref_Text1_label_and_number"), uno::UNO_QUERY); + uno::Reference xRange = xContent->getAnchor(); + CPPUNIT_ASSERT_EQUAL(OUString("Text 2"), xRange->getString()); + } +} + +DECLARE_WW8EXPORT_TEST(testTdf112118_DOC, "tdf112118.doc") +{ + static const struct { + const char* styleName; + struct { + const char* sideName; + sal_Int32 nMargin; + sal_Int32 nBorderDistance; + sal_Int32 nBorderWidth; + } sideParams[4]; + } styleParams[] = { // Margin (MS-style), border distance, border width + { + "Standard", + { + { "Top", 496, 847, 159 }, // 851 twip, 24 pt (from text), 4.5 pt + { "Left", 2083, 706, 212 }, // 1701 twip, 20 pt (from text), 6.0 pt + { "Bottom", 1401, 564, 35 }, // 1134 twip, 16 pt (from text), 1.0 pt + { "Right", 3471, 423, 106 } // 2268 twip, 12 pt (from text), 3.0 pt + } + }, + { + "Convert 1", + { + { "Top", 847, 496, 159 }, // 851 twip, 24 pt (from edge), 4.5 pt + { "Left", 706, 2083, 212 }, // 1701 twip, 20 pt (from edge), 6.0 pt + { "Bottom", 564, 1401, 35 }, // 1134 twip, 16 pt (from edge), 1.0 pt + { "Right", 423, 3471, 106 } // 2268 twip, 12 pt (from edge), 3.0 pt + } + } + }; + auto xStyles = getStyles("PageStyles"); + + for (const auto& style : styleParams) + { + const OUString sName = OUString::createFromAscii(style.styleName); + uno::Reference xStyle(xStyles->getByName(sName), uno::UNO_QUERY_THROW); + for (const auto& side : style.sideParams) + { + const OUString sSide = OUString::createFromAscii(side.sideName); + const OString sStage = style.styleName + OString::Concat(" ") + side.sideName; + + sal_Int32 nMargin = getProperty(xStyle, sSide + "Margin"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " margin width").getStr(), + side.nMargin, nMargin); + + sal_Int32 nBorderDistance = getProperty(xStyle, sSide + "BorderDistance"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border distance").getStr(), + side.nBorderDistance, nBorderDistance); + + table::BorderLine aBorder = getProperty(xStyle, sSide + "Border"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border width").getStr(), + side.nBorderWidth, + sal_Int32(aBorder.OuterLineWidth + aBorder.InnerLineWidth + aBorder.LineDistance)); + + // Check that AUTO border color is imported as black + CPPUNIT_ASSERT_EQUAL_MESSAGE(OString(sStage + " border color").getStr(), + sal_Int32(COL_BLACK), aBorder.Color); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf117503) +{ + loadAndReload("tdf117503.docx"); + // This was 3, first page + standard page styles were not merged together + // on export. + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_WW8EXPORT_TEST(testTdf117885, "tdf117885.doc") +{ + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + /* Get the vertical position of the paragraph containing the text "Start" */ + sal_Int32 nParaA_Top = getXPath(pXmlDoc, + "/root/page/body/column[1]/body/txt[text()='Start']/infos/bounds"_ostr, "top"_ostr + ).toInt32(); + + /* Get the vertical position of the paragraph containing the text "Top B" */ + sal_Int32 nParaB_Top = getXPath(pXmlDoc, + "/root/page/body/column[2]/body/txt[text()='Top B']/infos/bounds"_ostr, "top"_ostr + ).toInt32(); + + /* These two paragraphs are supposed to be at the top of the left + * and right columns respectively. Check that they actually line up: */ + CPPUNIT_ASSERT_EQUAL(nParaA_Top, nParaB_Top); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf118133) +{ + loadAndReload("tdf118133.docx"); + // This was 0, doc import + doc export resulted in lost image due to broken + // lazy-loading of tiff images. + CPPUNIT_ASSERT_EQUAL(static_cast(15240), getShape(1)->getSize().Width); +} + +DECLARE_WW8EXPORT_TEST(testTdf118412, "tdf118412.doc") +{ + /* Check that the first page's bottom margin is 1.251cm (not 2.540cm) */ + OUString sPageStyleName = getProperty(getParagraph(1), "PageStyleName"); + uno::Reference xPageStyle( + getStyles("PageStyles")->getByName(sPageStyleName), uno::UNO_QUERY); + sal_Int32 nBottomMargin = getProperty(xPageStyle, "BottomMargin"); + CPPUNIT_ASSERT_EQUAL(static_cast(1251), nBottomMargin); +} + +CPPUNIT_TEST_FIXTURE(Test, testContentControlExport) +{ + // Given a document with a (rich text) content control: + createSwDoc(); + uno::Reference xMSF(mxComponent, uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xText = xTextDocument->getText(); + uno::Reference xCursor = xText->createTextCursor(); + xText->insertString(xCursor, "test", /*bAbsorb=*/false); + xCursor->gotoStart(/*bExpand=*/false); + xCursor->gotoEnd(/*bExpand=*/true); + uno::Reference xContentControl( + xMSF->createInstance("com.sun.star.text.ContentControl"), uno::UNO_QUERY); + xText->insertTextContent(xCursor, xContentControl, /*bAbsorb=*/true); + + // When saving that document to DOC and loading it back: + saveAndReload("MS Word 97"); + + // Then make sure the dummy character at the end is filtered out: + OUString aBodyText = getBodyText(); + // Without the accompanying fix in place, this test would have failed: + // - Expected: test + // - Actual : test + // i.e. the CH_TXTATR_BREAKWORD at the end was written, then the import replaced that with a + // space. + CPPUNIT_ASSERT_EQUAL(OUString("test"), aBodyText); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ww8export/ww8export3.cxx b/sw/qa/extras/ww8export/ww8export3.cxx new file mode 100644 index 0000000000..97ea979d01 --- /dev/null +++ b/sw/qa/extras/ww8export/ww8export3.cxx @@ -0,0 +1,1124 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ww8export/data/", "MS Word 97") + { + } +}; + +DECLARE_WW8EXPORT_TEST(testTdf37778_readonlySection, "tdf37778_readonlySection.doc") +{ + uno::Reference xStorable(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT( xStorable->isReadonly() ); + + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + // The problem was that section protection was being enabled in addition to being read-only. + // This created an explicit section with protection. There should be just the default, non-explicit section. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Number of Sections", sal_Int32(0), xSections->getCount()); + + // tdf#127862: page fill color (in this case white) was lost + uno::Reference xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT(drawing::FillStyle_NONE != getProperty(xStyle, "FillStyle")); + + // tdf#136983 + uno::Reference xDPS(mxComponent, uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Last printed date", sal_Int16(2009), xDPS->getDocumentProperties()->getPrintDate().Year); +} + +DECLARE_WW8EXPORT_TEST(testTdf100961_fixedDateTime, "tdf100961_fixedDateTime.doc") +{ + // This should be a fixed date/time field, not the current time. + getParagraph(1, "05.01.19 04:06:08"); + + css::uno::Reference xSupplier(mxComponent, + css::uno::UNO_QUERY_THROW); + auto xFieldsAccess(xSupplier->getTextFields()); + auto xFields(xFieldsAccess->createEnumeration()); + + css::uno::Reference xField(xFields->nextElement(), css::uno::UNO_QUERY); + // Check fixed property was imported and date value was parsed correctly + CPPUNIT_ASSERT_EQUAL(true, getProperty(xField, "IsFixed")); + CPPUNIT_ASSERT_EQUAL(true, getProperty(xField, "IsDate")); + auto datetime = getProperty(xField, "DateTimeValue"); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(5), datetime.Day); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(1), datetime.Month); + CPPUNIT_ASSERT_EQUAL(sal_Int16(2019), datetime.Year); + + xField.set(xFields->nextElement(), css::uno::UNO_QUERY); + // Check fixed property was imported and time value was parsed correctly + CPPUNIT_ASSERT_EQUAL(true, getProperty(xField, "IsFixed")); + CPPUNIT_ASSERT_EQUAL(false, getProperty(xField, "IsDate")); + datetime = getProperty(xField, "DateTimeValue"); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(4), datetime.Hours); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(6), datetime.Minutes); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(8), datetime.Seconds); +} + +DECLARE_WW8EXPORT_TEST(testTdf147861_customField, "tdf147861_customField.doc") +{ + // These should each be specific values, not a shared DocProperty + getParagraph(1, "CustomEditedTitle"); // edited + // A couple of \x0\x0 at the end of the import variable thwart an equality comparison + CPPUNIT_ASSERT(getParagraph(2)->getString().startsWith(" INSERT Custom Title here")); + getParagraph(3, "My Title"); // edited + + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("CustomEditedTitle"), xField->getPresentation(false)); + // The " (fixed)" part is unnecessary, but it must be consistent across a round-trip + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Title (fixed)"), xField->getPresentation(true)); +} + +DECLARE_WW8EXPORT_TEST(testTdf148380_createField, "tdf148380_createField.doc") +{ + // Verify that these are fields, and not just plain text + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // This should NOT be "Lorenzo Chavez", or a real date since the user hand-modified the result. + CPPUNIT_ASSERT_EQUAL(OUString("Myself - that's who"), xField->getPresentation(false)); + xField.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("yesterday at noon"), xField->getPresentation(false)); +} + +DECLARE_WW8EXPORT_TEST(testTdf148380_fldLocked, "tdf148380_fldLocked.doc") +{ + getParagraph(2, "4/5/2022 4:29:00 PM"); + getParagraph(4, "1/23/4567 8:9:10 PM"); + + // Verify that these are fields, and not just plain text + // (import only, since export thankfully just dumps these fixed fields as plain text + if (isExported()) + return; + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + auto xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + uno::Reference xField(xFields->nextElement(), uno::UNO_QUERY); + // This should NOT be updated at FILEOPEN to match the last modified time - it is locked. + CPPUNIT_ASSERT_EQUAL(OUString("4/5/2022 4:29:00 PM"), xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Modified (fixed)"), xField->getPresentation(true)); + xField.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1/23/4567 8:9:10 PM"), xField->getPresentation(false)); + CPPUNIT_ASSERT_EQUAL(OUString("DocInformation:Last printed (fixed)"), xField->getPresentation(true)); +} + +DECLARE_WW8EXPORT_TEST(testTdf138345_paraCharHighlight, "tdf138345_paraCharHighlight.doc") +{ + uno::Reference xRun(getRun(getParagraph(9), 1, "A side benefit is that "), uno::UNO_QUERY_THROW); + // Paragraph style paraNoCharBackground cancel paraCharBackground using COL_TRANSPARENT. + // Before this fix, the paragraph was by default covered with a yellow CharHighlight. + CPPUNIT_ASSERT_EQUAL(static_cast(COL_AUTO), getProperty(xRun, "CharHighlight")); + CPPUNIT_ASSERT_EQUAL(static_cast(COL_AUTO), getProperty(xRun, "CharBackColor")); + + xRun.set(getRun(getParagraph(9), 2), uno::UNO_QUERY_THROW); + // Character style formatting must not contain a highlight setting at all. + CPPUNIT_ASSERT_EQUAL(static_cast(COL_AUTO), getProperty(xRun, "CharHighlight")); + CPPUNIT_ASSERT_EQUAL(static_cast(COL_AUTO), getProperty(xRun, "CharBackColor")); + + //tdf#118711 - don't explicitly specify the default page style at the beginning of the document + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL(uno::Any(), xPara->getPropertyValue("PageDescName")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104596_wrapInHeaderTable, "tdf104596_wrapInHeaderTable.doc") +{ + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + + sal_Int32 nRowHeight = getXPath(pXmlDoc, "//header/tab/row[1]/infos/bounds"_ostr, "height"_ostr).toInt32(); + // The fly is supposed to be no-wrap, so the text should come underneath it, not wrap-through, + // thus making the row much higher. Before, height was 706. Now it is 1067. + CPPUNIT_ASSERT_MESSAGE("Text must wrap under green box", nRowHeight > 1000); +} + +DECLARE_WW8EXPORT_TEST(testGutterLeft, "gutter-left.doc") +{ + uno::Reference xPageStyle; + getStyles("PageStyles")->getByName("Standard") >>= xPageStyle; + sal_Int32 nGutterMargin{}; + xPageStyle->getPropertyValue("GutterMargin") >>= nGutterMargin; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 1270 + // - Actual : 0 + // i.e. gutter margin was lost. + CPPUNIT_ASSERT_EQUAL(static_cast(1270), nGutterMargin); +} + +CPPUNIT_TEST_FIXTURE(Test, testGutterTop) +{ + createSwDoc("gutter-top.doc"); + saveAndReload("MS Word 97"); + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xSettings( + xFactory->createInstance("com.sun.star.document.Settings"), uno::UNO_QUERY); + bool bGutterAtTop{}; + xSettings->getPropertyValue("GutterAtTop") >>= bGutterAtTop; + // Without the accompanying fix in place, this test would have failed, because the gutter was + // at the left. + CPPUNIT_ASSERT(bGutterAtTop); +} + +DECLARE_WW8EXPORT_TEST(testArabicZeroNumbering, "arabic-zero-numbering.doc") +{ + auto xNumberingRules + = getProperty>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 64 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO. + CPPUNIT_ASSERT_EQUAL(o3tl::narrowing(style::NumberingType::ARABIC_ZERO), + aMap["NumberingType"].get()); +} + +DECLARE_WW8EXPORT_TEST(testTdf128501, "tdf128501.doc") +{ + if (!isExported()) + { + uno::Reference xShapeDescriptor = getShape(1); + CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.CustomShape"), xShapeDescriptor->getShapeType()); + } + else + { + uno::Reference xShapeDescriptor = getShape(1); + // Without the fix in place, this test would have failed with + // - Expected: FrameShape + // - Actual : com.sun.star.drawing.CustomShape + CPPUNIT_ASSERT_EQUAL(OUString("FrameShape"), xShapeDescriptor->getShapeType()); + } +} + +CPPUNIT_TEST_FIXTURE(SwModelTestBase, testArabicZeroNumberingFootnote) +{ + // Create a document, set footnote numbering type to ARABIC_ZERO. + createSwDoc(); + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnoteSettings + = xFootnotesSupplier->getFootnoteSettings(); + sal_uInt16 nNumberingType = style::NumberingType::ARABIC_ZERO; + xFootnoteSettings->setPropertyValue("NumberingType", uno::Any(nNumberingType)); + + // Insert a footnote. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnote( + xFactory->createInstance("com.sun.star.text.Footnote"), uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextContentAppend(xTextDocument->getText(), + uno::UNO_QUERY); + xTextContentAppend->appendTextContent(xFootnote, {}); + + saveAndReload("MS Word 97"); + xFootnotesSupplier.set(mxComponent, uno::UNO_QUERY); + sal_uInt16 nExpected = style::NumberingType::ARABIC_ZERO; + auto nActual = getProperty(xFootnotesSupplier->getFootnoteSettings(), "NumberingType"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 64 + // - Actual : 4 + // i.e. the numbering type was ARABIC, not ARABIC_ZERO. + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); +} + +CPPUNIT_TEST_FIXTURE(SwModelTestBase, testChicagoNumberingFootnote) +{ + // Create a document, set footnote numbering type to SYMBOL_CHICAGO. + createSwDoc(); + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnoteSettings + = xFootnotesSupplier->getFootnoteSettings(); + sal_uInt16 nNumberingType = style::NumberingType::SYMBOL_CHICAGO; + xFootnoteSettings->setPropertyValue("NumberingType", uno::Any(nNumberingType)); + + // Insert a footnote. + uno::Reference xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnote( + xFactory->createInstance("com.sun.star.text.Footnote"), uno::UNO_QUERY); + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xTextContentAppend(xTextDocument->getText(), + uno::UNO_QUERY); + xTextContentAppend->appendTextContent(xFootnote, {}); + + saveAndReload("MS Word 97"); + xFootnotesSupplier.set(mxComponent, uno::UNO_QUERY); + sal_uInt16 nExpected = style::NumberingType::SYMBOL_CHICAGO; + auto nActual = getProperty(xFootnotesSupplier->getFootnoteSettings(), "NumberingType"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 63 + // - Actual : 4 + // i.e. the numbering type was ARABIC, not SYMBOL_CHICAGO. + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); +} + +DECLARE_WW8EXPORT_TEST(testHyperLinkURLSaving, "tdf120003.doc") +{ + OUString URL = getProperty(getShape(1), "HyperLinkURL"); + // Without the fix in place, this test would have failed with + // - Expected: https://www.libreoffice.org/ + // - Actual : tps://www.libreoffice.org/ + CPPUNIT_ASSERT_EQUAL(OUString("https://www.libreoffice.org/"), URL); +} + +DECLARE_WW8EXPORT_TEST(testdf79553_lineNumbers, "tdf79553_lineNumbers.doc") +{ + bool bValue = false; + sal_Int32 nValue = -1; + + uno::Reference< text::XTextDocument > xtextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference< text::XLineNumberingProperties > xLineProperties( xtextDocument, uno::UNO_QUERY_THROW ); + uno::Reference< beans::XPropertySet > xPropertySet = xLineProperties->getLineNumberingProperties(); + + xPropertySet->getPropertyValue("IsOn") >>= bValue; + CPPUNIT_ASSERT_EQUAL(true, bValue); + + xPropertySet->getPropertyValue("Distance") >>= nValue; + CPPUNIT_ASSERT_MESSAGE("automatic distance", nValue > 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf138302_restartNumbering) +{ + loadAndReload("tdf138302_restartNumbering.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPara(getParagraph(8), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); + + + // tdf#143982: automatic tables should export as something better than just left-and-size + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + + CPPUNIT_ASSERT(getProperty(xTable, "IsWidthRelative")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty(xTable, "RelativeWidth")); +} + +DECLARE_WW8EXPORT_TEST(testTdf122429_header, "tdf122429_header.doc") +{ + uno::Reference pageStyles = getStyles("PageStyles"); + uno::Reference pageStyle(pageStyles->getByName("Default Page Style"), uno::UNO_QUERY); + bool headerIsOn = getProperty(pageStyle, "HeaderIsOn"); + CPPUNIT_ASSERT(headerIsOn); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf122460_header) +{ + loadAndReload("tdf122460_header.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference pageStyles = getStyles("PageStyles"); + uno::Reference pageStyle(pageStyles->getByName("Default Page Style"), uno::UNO_QUERY); + bool headerIsOn = getProperty(pageStyle, "HeaderIsOn"); + CPPUNIT_ASSERT(headerIsOn); +} + +DECLARE_WW8EXPORT_TEST(testTdf139495_tinyHeader, "tdf139495_tinyHeader.doc") +{ + // In Word 2003, this is one page, but definitely not six pages. + CPPUNIT_ASSERT(getPages() < 3); +} + +DECLARE_WW8EXPORT_TEST(testTdf124937, "tdf124937.doc") +{ + // Check it doesn't crash at import time + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); +} + +DECLARE_WW8EXPORT_TEST(testFdo53985, "fdo53985.doc") +{ + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTables->getCount()); // Only 4 tables were imported. + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Compatibility: Protect form", true, pDoc->getIDocumentSettingAccess().get( DocumentSettingId::PROTECT_FORM ) ); + + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xSections->getCount()); // The first paragraph wasn't counted as a section. + + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", true, getProperty(xSect, "IsProtected")); + xSect.set(xSections->getByIndex(3), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Section4 is protected", false, getProperty(xSect, "IsProtected")); +} + +DECLARE_WW8EXPORT_TEST(testTdf73056_cellMargins, "tdf73056_cellMargins.doc") +{ + uno::Reference< text::XTextTablesSupplier > xTablesSupplier( mxComponent, uno::UNO_QUERY ); + uno::Reference< container::XIndexAccess > xTables( xTablesSupplier->getTextTables(), uno::UNO_QUERY ); + uno::Reference< text::XTextTable > xTable1( xTables->getByIndex( 0 ), uno::UNO_QUERY ); + uno::Reference< table::XCell > xCell = xTable1->getCellByName( "B4" ); + + // only the first cell with specific margins was processed, leaving the rest at table defaults. Was 0. + uno::Reference< beans::XPropertySet > xPropSet( xCell, uno::UNO_QUERY_THROW ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "bottom cell spacing to contents", + sal_Int32(101), getProperty(xPropSet, "BottomBorderDistance" ) ); +} + +DECLARE_WW8EXPORT_TEST(testTdf135672_tableGrows, "tdf135672_tableGrows.doc") +{ + auto const xTable(getParagraphOrTable(1)); + // This would shift left every round-trip. First time was -259, next -418. + CPPUNIT_ASSERT_EQUAL(sal_Int32(-101), getProperty(xTable, "LeftMargin")); + + // This would grow every round-trip. First time was 11118, next 11435 + CPPUNIT_ASSERT_EQUAL(sal_Int32(10800), getProperty(xTable, "Width")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf79435_legacyInputFields) +{ + loadAndReload("tdf79435_legacyInputFields.docx"); + //using .docx input file to verify cross-format compatibility. + uno::Reference xFormField = getProperty< uno::Reference >(getRun(getParagraph(5), 3), "Bookmark"); + uno::Reference xParameters(xFormField->getParameters()); + + OUString sTmp; + // Too often the string reader can fail during import - fix that first to prevent round-tripping garbage. + // (for example BR-1010B.doc from tdf#48097) + //xParameters->getByName("EntryMacro") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + //xParameters->getByName("Help") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("F1Help"), sTmp); + //xParameters->getByName("ExitMacro") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("test"), sTmp); + xParameters->getByName("Description") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("StatusHelp"), sTmp); + //xParameters->getByName("Content") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("Camelcase"), sTmp); + //xParameters->getByName("Format") >>= sTmp; + //CPPUNIT_ASSERT_EQUAL(OUString("TITLE CASE"), sTmp); + + sal_uInt16 nMaxLength = 0; + xParameters->getByName("MaxLength") >>= nMaxLength; + CPPUNIT_ASSERT_EQUAL_MESSAGE("Max Length", sal_uInt16(10), nMaxLength); + + // too bad this is based on character runs - just found try trial and error. + xFormField = getProperty< uno::Reference >(getRun(getParagraph(6), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("calculated"), sTmp); + + xFormField = getProperty< uno::Reference >(getRun(getParagraph(7), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentDate"), sTmp); + + xFormField = getProperty< uno::Reference >(getRun(getParagraph(7), 7), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("currentTime"), sTmp); + + xFormField = getProperty< uno::Reference >(getRun(getParagraph(8), 2), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("number"), sTmp); + + xFormField = getProperty< uno::Reference >(getRun(getParagraph(8), 7), "Bookmark"); + xParameters.set(xFormField->getParameters()); + xParameters->getByName("Type") >>= sTmp; + CPPUNIT_ASSERT_EQUAL(OUString("date"), sTmp); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134264) +{ + loadAndReload("tdf134264.docx"); + // Without the fix in place, ADDRESSBLOCK fields would have been lost after RT + CPPUNIT_ASSERT_EQUAL(OUString("MF"), getParagraph(1)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("M19"), getParagraph(2)->getString()); + CPPUNIT_ASSERT_EQUAL(OUString("1815"), getParagraph(3)->getString()); +} + +DECLARE_WW8EXPORT_TEST(testTdf120225_textControlCrossRef, "tdf120225_textControlCrossRef.doc") +{ + uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); + uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); + xRunEnum->nextElement(); + uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); + + CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty(xPropertySet, "TextPortionType")); + uno::Reference xBookmark(getProperty< uno::Reference >(xPropertySet, "Bookmark"), uno::UNO_QUERY_THROW); + + // Critical test: does TextField's bookmark name match cross-reference? + const OUString& sTextFieldName( xBookmark->getName() ); + uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); + uno::Reference xFields(xFieldsAccess->createEnumeration()); + CPPUNIT_ASSERT(xFields->hasMoreElements()); + xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sTextFieldName, getProperty(xPropertySet, "SourceName")); + + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + // TextFields should not be turned into real bookmarks. + CPPUNIT_ASSERT_EQUAL(static_cast(0), xBookmarksByIdx->getCount()); + + // The actual name isn't critical, but if it fails, it is worth asking why. + CPPUNIT_ASSERT_EQUAL(OUString("Text1"), sTextFieldName); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf134948) +{ + loadAndReload("tdf134948.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Only 1 paragraph", 1, getParagraphs()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf132726) +{ + loadAndReload("tdf132726.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xRun = getRun(getParagraph(1), 1, "What sentence has a yellow background? "); + CPPUNIT_ASSERT_EQUAL( COL_AUTO, getProperty(xRun, "CharBackColor")); + + xRun = getRun(getParagraph(1), 2, "Why, this sentence of course"); + CPPUNIT_ASSERT_EQUAL( COL_YELLOW, getProperty(xRun, "CharBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127316_autoEscapement) +{ + loadAndReload("tdf127316_autoEscapement.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPara = getParagraph(2); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1, "Normal text "), "CharEscapement"), 0); + // Negative escapements (subscripts) were decreasing by 1% every round-trip due to bad manual rounding. + // This should be roughly .2*35% of the ORIGINAL (non-reduced) size. However, during export the + // proportional height has to be changed into direct formatting, which then changes the relative percent. + // In this case, a 24pt font, proportional at 65% becomes roughly a 16pt font. + // Thus an escapement of 7% (1.68pt) becomes roughly 10.5% for the 16pt font. + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Subscript", -10.f, getProperty(getRun(xPara, 2), "CharEscapement"), 1); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127316_autoEscapement2) +{ + loadAndReload("tdf127316_autoEscapement2.odt"); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + uno::Reference xPara = getParagraph(1); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1, "Base1"), "CharEscapement"), 0); + // Font is 80% of 40pt or 32pt, original escapement is 6.4pt, so round-trip escapement is 20%. + CPPUNIT_ASSERT_DOUBLES_EQUAL(20.f, getProperty(getRun(xPara, 2,"AutoSuperscript"), "CharEscapement"), 1); + xPara.set( getParagraph(3) ); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 1, "Base3"), "CharEscapement"), 0); + // font is 20% of 40pt or 8pt, original escapement is 25.6pt, so round-trip escapement is 320%. + CPPUNIT_ASSERT_DOUBLES_EQUAL(320.f, getProperty(getRun(xPara, 2,"AutoSuperscript"), "CharEscapement"), 3); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf120412_proportionalEscapement) +{ + loadAndReload("tdf120412_proportionalEscapement.odt"); + uno::Reference xPara = getParagraph(2); + CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.f, getProperty(getRun(xPara, 2, "Base"), "CharEscapement"), 0); + // Import was limiting to 100%. And export based the position on the original height, not the proportional height. + CPPUNIT_ASSERT_DOUBLES_EQUAL( 150.f, getProperty(getRun(xPara, 3,"Super"), "CharEscapement"), 2); + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +DECLARE_WW8EXPORT_TEST(testTdf133453_realFontSize, "tdf133453_realFontSize.doc") +{ + CPPUNIT_ASSERT_EQUAL( -95.f, getProperty(getRun(getParagraph(1), 2, "2"), "CharEscapement") ); +} + +DECLARE_WW8EXPORT_TEST(testTdf116194, "tdf116194.doc") +{ + CPPUNIT_ASSERT_EQUAL( Color(0xc00000), getProperty(getRun(getParagraph(1), 1), "CharColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121111_fillStyleNone) +{ + loadAndReload("tdf121111_fillStyleNone.docx"); + uno::Reference xStyle(getStyles("ParagraphStyles")->getByName("Numbering - First level"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(Color(0xb8cce4), getProperty(xStyle, "ParaBackColor"));//R:184 G:204 B:228 + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, getProperty(xStyle, "FillStyle")); + + uno::Reference xText(getParagraph(12)); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xText, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("No fill", drawing::FillStyle_NONE, getProperty(xText, "FillStyle")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf128608_fillStyleNoneB) +{ + loadAndReload("tdf128608_fillStyleNoneB.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xText(getParagraph(1)); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xText, "ParaBackColor")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("No fill", drawing::FillStyle_NONE, getProperty(xText, "FillStyle")); +} + +DECLARE_WW8EXPORT_TEST(testTdf132094_transparentPageImage, "tdf132094_transparentPageImage.doc") +{ + uno::Reference image (getShape(1), uno::UNO_QUERY); + // Don't add fillstyle when none is set. + // Well, ok, at least make it transparent if you do uselessly set a solid color... + const bool bFillNone = drawing::FillStyle_NONE == getProperty(image, "FillStyle"); + const bool bTransparent = sal_Int16(0) != getProperty(image, "FillTransparence"); + CPPUNIT_ASSERT_MESSAGE("no background fill", bTransparent || bFillNone); +} + +DECLARE_WW8EXPORT_TEST(testTdf112618_textbox_no_bg, "tdf112618_textbox_no_bg.doc") +{ + Color nTransparence = getProperty(getShape(2), "FillTransparence"); + CPPUNIT_ASSERT_EQUAL(Color(0x000064), nTransparence); + CPPUNIT_ASSERT_EQUAL(nTransparence, getProperty(getShape(2), "BackColorTransparency")); +} + +DECLARE_WW8EXPORT_TEST(testTdf101826_xattrTextBoxFill, "tdf101826_xattrTextBoxFill.doc") +{ + //Basic 1 Color Fill: gradient from yellow(FFFF00) to brown(767600) currently saves as mid-color + CPPUNIT_ASSERT_MESSAGE("background color", Color(0xFF, 0xFF, 0x00) != getProperty(getShape(1), "BackColor")); + //Basic 2 Color Fill: gradient from yellow(FFFF00) to green(00B050) currently saves as mid-color + CPPUNIT_ASSERT_MESSAGE("background color", Color(0xFF, 0xFF, 0x00) != getProperty(getShape(4), "BackColor")); + //Basic Picture Fill: Tux image + CPPUNIT_ASSERT_EQUAL_MESSAGE("background image", drawing::FillStyle_BITMAP, getProperty(getShape(5), "FillStyle")); +} + +DECLARE_WW8EXPORT_TEST(testTdf123433_fillStyleStop, "tdf123433_fillStyleStop.doc") +{ + uno::Reference xText(getParagraph(12)); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, getProperty(xText, "FillStyle")); + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xText, "ParaBackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf127862_pageFillStyle) +{ + loadAndReload("tdf127862_pageFillStyle.odt"); + CPPUNIT_ASSERT_EQUAL(6, getPages()); + uno::Reference xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT(drawing::FillStyle_NONE != getProperty(xStyle, "FillStyle")); +} + +DECLARE_WW8EXPORT_TEST(testTdf128608_tableParaBackColor, "tdf128608_tableParaBackColor.doc") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A4"), uno::UNO_QUERY); + + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + // ParaBackColor doesn't seem to be used in this case, but keep it here to make sure it stays as AUTO. + CPPUNIT_ASSERT_EQUAL(COL_AUTO, getProperty(xPara, "ParaBackColor")); + // No paragraph background colour/fill. (The cell background colour should be used.) + CPPUNIT_ASSERT_EQUAL_MESSAGE("No fillstyle", drawing::FillStyle_NONE, getProperty(xPara, "FillStyle")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf117217_largeTableBackgrounds) +{ + loadAndReload("tdf117217_largeTableBackgrounds.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + // Cell 22: light-red == 16711680 + uno::Reference xCell(xTable->getCellByName("V1"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("light red", Color(0xE0C2CD), getProperty(xCell, "BackColor")); + xCell.set(xTable->getCellByName("Z1"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("light red", Color(0xE0C2CD), getProperty(xCell, "BackColor")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf94009_zeroPgMargin) +{ + loadAndReload("tdf94009_zeroPgMargin.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference defaultStyle(getStyles("PageStyles")->getByName("Standard"), + uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(defaultStyle, "TopMargin")); +} + +DECLARE_WW8EXPORT_TEST(testTdf108518_CRnumformatting, "tdf108518_CRnumformatting.doc") +{ + CPPUNIT_ASSERT_EQUAL(OUString("6.2.3."), parseDump("//body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr)); + //Without this fix in place, it would become 200 (and non-bold). + CPPUNIT_ASSERT_EQUAL(OUString("220"), parseDump("//body/txt[4]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']/SwFont"_ostr, "height"_ostr)); +} + +DECLARE_WW8EXPORT_TEST(testTdf120711_joinedParagraphWithChangeTracking, "tdf120711.doc") +{ + sal_Int16 numFormat = getNumberingTypeOfParagraph(5); + // last paragraph is not a list item + CPPUNIT_ASSERT(style::NumberingType::CHAR_SPECIAL != numFormat); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf129522_removeShadowStyle) +{ + loadAndReload("tdf129522_removeShadowStyle.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference< container::XNameAccess > paragraphStyles = getStyles("ParagraphStyles"); + uno::Reference< beans::XPropertySet > xStyleProps(paragraphStyles->getByName("Shadow"), uno::UNO_QUERY_THROW); + table::ShadowFormat aShadow = getProperty(xStyleProps, "ParaShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + + // Shadows were inherited regardless of whether the style disabled them. + xStyleProps.set(paragraphStyles->getByName("Shadow-removed"), uno::UNO_QUERY_THROW); + aShadow = getProperty(xStyleProps, "ParaShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_NONE, aShadow.Location); + + uno::Reference< container::XNameAccess > characterStyles = getStyles("CharacterStyles"); + xStyleProps.set(characterStyles->getByName("CharShadow"), uno::UNO_QUERY_THROW); + aShadow = getProperty(xStyleProps, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_BOTTOM_RIGHT, aShadow.Location); + + xStyleProps.set(characterStyles->getByName("CharShadow-removed"), uno::UNO_QUERY_THROW); + aShadow = getProperty(xStyleProps, "CharShadowFormat"); + CPPUNIT_ASSERT_EQUAL(table::ShadowLocation_NONE, aShadow.Location); +} + +DECLARE_WW8EXPORT_TEST(testTdf81705_outlineLevel, "tdf81705_outlineLevel.doc") +{ + // direct formatting resets outline level to body text (0) + CPPUNIT_ASSERT_EQUAL_MESSAGE("Paragraph C", sal_uInt16(0), getProperty(getParagraph(3), "OutlineLevel")); + // myStyle sets outline level to 1. + CPPUNIT_ASSERT_EQUAL_MESSAGE("Paragraph D", sal_uInt16(1), getProperty(getParagraph(4), "OutlineLevel")); +} + +DECLARE_WW8EXPORT_TEST(testBtlrCell, "btlr-cell.doc") +{ + // Without the accompanying fix in place, this test would have failed, as + // the btlr text direction in the A1 cell was lost on DOC import and + // export. + uno::Reference xSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables = xSupplier->getTextTables(); + uno::Reference xTable(xTables->getByName("Table1"), uno::UNO_QUERY); + uno::Reference xA1(xTable->getCellByName("A1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::BT_LR, getProperty(xA1, "WritingMode")); + + uno::Reference xB1(xTable->getCellByName("B1"), uno::UNO_QUERY); + auto nActual = getProperty(xB1, "WritingMode"); + CPPUNIT_ASSERT(nActual == text::WritingMode2::LR_TB || nActual == text::WritingMode2::CONTEXT); + + uno::Reference xC1(xTable->getCellByName("C1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(text::WritingMode2::TB_RL, getProperty(xC1, "WritingMode")); +} + +DECLARE_WW8EXPORT_TEST(testTdf118375export, "tdf118375_240degClockwise.doc") +{ + // The input document has one custom shape, which is rotated 240deg. Check + // that it has the same position as in Word. + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get XDrawPagesSupplier", xDrawPagesSupplier.is()); + uno::Reference xDrawPages(xDrawPagesSupplier->getDrawPages()); + uno::Reference xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get xDrawPage", xDrawPage.is()); + uno::Reference xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Could not get xShape", xShape.is()); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Could not get the shape properties", xShapeProps.is()); + sal_Int32 nPosX = {}, nPosY = {}; + CPPUNIT_ASSERT(xShapeProps->getPropertyValue("HoriOrientPosition") >>= nPosX); + CPPUNIT_ASSERT(xShapeProps->getPropertyValue("VertOrientPosition") >>= nPosY); + // Allow some tolerance because rounding errors through integer arithmetic + // in rotation. + CPPUNIT_ASSERT_DOUBLES_EQUAL(5200.0, static_cast(nPosX), 1.0); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1152.0, static_cast(nPosY), 1.0); +} + +DECLARE_WW8EXPORT_TEST(testImageCommentAtChar, "image-comment-at-char.doc") +{ + uno::Reference xPara = getParagraph(1); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + getProperty(getRun(xPara, 1), "TextPortionType")); + // Without the accompanying fix in place, this test would have failed with 'Expected: + // Annotation; Actual: Frame', i.e. the comment start before the image was lost. + CPPUNIT_ASSERT_EQUAL(OUString("Annotation"), + getProperty(getRun(xPara, 2), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Frame"), + getProperty(getRun(xPara, 3), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("AnnotationEnd"), + getProperty(getRun(xPara, 4), "TextPortionType")); + CPPUNIT_ASSERT_EQUAL(OUString("Text"), + getProperty(getRun(xPara, 5), "TextPortionType")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf126708emf) +{ + loadAndReload("tdf126708_containsemf.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + auto xShape = getShape(1); + // First check the size of the EMF graphic contained in the shape. + auto xGraphic = getProperty< uno::Reference >( + xShape, "Graphic"); + auto xSize = getProperty(xGraphic, "Size100thMM"); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8501), xSize.Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(18939), xSize.Width); + + // Now check that the shape itself has a decent size. + // This size varies slightly when round tripping through doc format. + xSize = getProperty(xShape, "Size"); + CPPUNIT_ASSERT(abs(xSize.Height - 7629) <= 6); + CPPUNIT_ASSERT(abs(xSize.Width - 17000) <= 6); +} + +CPPUNIT_TEST_FIXTURE(Test, testBtlrFrame) +{ + loadAndReload("btlr-frame.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + if (!isExported()) + { + return; + } + + // Without the accompanying fix in place, this test would have failed with a + // beans.UnknownPropertyException, as the writing direction was lost, so the default direction + // resulted in a conversion to a Writer text frame. + uno::Reference xFrame(getShape(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(9000), getProperty(xFrame, "RotateAngle")); +} + +DECLARE_WW8EXPORT_TEST(testPresetDash, "tdf127166_prstDash_Word97.doc") +{ + // Error was, that the 'sys' preset dash styles were neither imported not + // exported, the mixed styles had wrong dash-dot order, they were imported + // with absolute values. + const drawing::LineDash dashParams[] = + { + {drawing::DashStyle_RECTRELATIVE, 1, 400, 0, 0, 300}, // dash + {drawing::DashStyle_RECTRELATIVE, 1, 400, 1, 100, 300}, // dashDot + {drawing::DashStyle_RECTRELATIVE, 1, 100, 0, 0, 300}, // dot + {drawing::DashStyle_RECTRELATIVE, 1, 800, 0, 0, 300}, // lgDash + {drawing::DashStyle_RECTRELATIVE, 1, 800, 1, 100, 300}, // lgDashDot + {drawing::DashStyle_RECTRELATIVE, 1, 800, 2, 100, 300}, // lgDashDotDot + {drawing::DashStyle_RECTRELATIVE, 1, 300, 0, 0, 100}, // sysDash + {drawing::DashStyle_RECTRELATIVE, 1, 300, 1, 100, 100}, // sysDashDot + {drawing::DashStyle_RECTRELATIVE, 1, 300, 2, 100, 100}, // sysDashDotDot + {drawing::DashStyle_RECTRELATIVE, 1, 100, 0, 0, 100} // sysDot + }; + drawing::LineDash aPresetLineDash; + drawing::LineDash aShapeLineDash; + for (sal_uInt16 i = 0; i < 10; i++) + { + aPresetLineDash = dashParams[i]; + uno::Reference xShape = getShape(i+1); + aShapeLineDash = getProperty(xShape, "LineDash"); + bool bIsEqual = aPresetLineDash.Style == aShapeLineDash.Style + && aPresetLineDash.Dots == aShapeLineDash.Dots + && aPresetLineDash.DotLen == aShapeLineDash.DotLen + && aPresetLineDash.Dashes == aShapeLineDash.Dashes + && aPresetLineDash.DashLen == aShapeLineDash.DashLen + && aPresetLineDash.Distance == aShapeLineDash.Distance; + CPPUNIT_ASSERT_MESSAGE("LineDash differ", bIsEqual); + } + + const auto& pLayout = parseLayoutDump(); + // Ensure that there is no tabstop in the first paragraph (despite chapter numbering's setting) + // This is a pre-emptive test to ensure something visibly correct is not broken. + assertXPath(pLayout, "//body/txt[1]//SwFixPortion"_ostr, 0); +} + +CPPUNIT_TEST_FIXTURE(Test, testRtlGutter) +{ + auto verify = [this]() { + uno::Reference xStandard( + getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + CPPUNIT_ASSERT(getProperty(xStandard, "RtlGutter")); + }; + + // Given a document with RTL gutter, when loading it: + createSwDoc("rtl-gutter.doc"); + // Then make sure the section's gutter is still RTL: + // Without the accompanying fix in place, this test would have failed as the SPRM was missing. + verify(); + saveAndReload("MS Word 97"); + verify(); +} + +DECLARE_WW8EXPORT_TEST(testTdf94326_notOutlineNumbering, "tdf94326_notOutlineNumbering.doc") +{ + // The directly applied numbering list must not be lost. + uno::Reference xPara(getParagraph(2, u"ОБЩИЕ ПОЛОЖЕНИЯ"_ustr), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf106541_cancelOutline, "tdf106541_cancelOutline.doc") +{ + // The ability to cancel numbering must not be lost. + uno::Reference xPara(getParagraph(1, "Cancelled by style"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(2, "Cancelled by inherited style"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(4, "Cancelled by direct paragraph formatting"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104239_chapterNumbering, "tdf104239_chapterNumbering.doc") +{ + uno::Reference xNumberingSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xNumberingRules = xNumberingSupplier->getChapterNumberingRules(); + + comphelper::SequenceAsHashMap hashMap(xNumberingRules->getByIndex(0)); + CPPUNIT_ASSERT(hashMap["HeadingStyleName"].get().match("Heading 1")); + sal_uInt16 nNumberingType = style::NumberingType::CHARS_UPPER_LETTER_N; + CPPUNIT_ASSERT_EQUAL(nNumberingType, hashMap["NumberingType"].get()); + + hashMap = xNumberingRules->getByIndex(5); + CPPUNIT_ASSERT(hashMap["HeadingStyleName"].get().match("Heading 6")); + nNumberingType = style::NumberingType::ARABIC; + CPPUNIT_ASSERT_EQUAL(nNumberingType, hashMap["NumberingType"].get()); +} + +DECLARE_WW8EXPORT_TEST(testTdf106541_inheritChapterNumbering, "tdf106541_inheritChapterNumbering.doc") +{ + // The level and numbering are inherited from Heading 1. + uno::Reference xPara(getParagraph(3, "Letter A"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("a."), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf106541_inheritChapterNumberingB, "tdf106541_inheritChapterNumberingB.doc") +{ + // The level and numbering are inherited from Heading 1. + uno::Reference xPara(getParagraph(1, "Chapter 1, level 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(2, "Chapter 1, level 2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf75748_inheritChapterNumberingC, "tdf75748_inheritChapterNumberingC.doc") +{ + uno::Reference xPara(getParagraph(5, "Inherited from Heading 3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("II.B.1."), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104239_numbering, "tdf104239_numbering.doc") +{ + // The paragraph starts with "paraksta Pieņemšanas". [Roundtrip by Word 2016 avoids the problem.] + uno::Reference xPara(getParagraph(51), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("3.3.1."), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104239_chapterNumberingLevels, "tdf104239_chapterNumberingLevels.doc") +{ + uno::Reference xPara(getParagraph(1, "Heading 1"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("Article I."), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(2, "Heading 2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(3, "Heading 3"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("First"), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(4, "Heading 4"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(8, "Heading 9"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1.1.1.1.1.1.1.1."), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104239_chapterNumberTortureTest, "tdf104239_chapterNumberTortureTest.doc") +{ + // There is no point in identifying what the wrong values where in this test, + //because EVERYTHING was wrong, and MANY different fixes are required to solve the problems. + uno::Reference xPara(getParagraph(1, "No numId in style or paragraph"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(2, "Paragraph cancels numbering(0)"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(3, "First numbered line"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1st.i.a.1.I"), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(7, "inheritOnly: inherit outlineLvl and listLvl."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2nd.ii"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(1), getProperty(xPara, "NumberingLevel")); // Level 2 + xPara.set(getParagraph(9, "outline with Body listLvl(9)."), uno::UNO_QUERY); + if (!isExported()) + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(10, "outline with Body listLvl(9) #2."), uno::UNO_QUERY); + if (!isExported()) + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(11, "direct formatting - Body listLvl(9)."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); + xPara.set(getParagraph(12, "direct numId, inherit listLvl."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("2nd.ii.a.1.I"), getProperty(xPara, "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(sal_Int16(4), getProperty(xPara, "NumberingLevel")); // Level 5 + xPara.set(getParagraph(13, "Style numId0 cancels inherited numbering."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString(""), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf106541_inheritOutlineNumbering, "tdf106541_inheritOutlineNumbering.doc") +{ + // The level and numbering are inherited from Level2. + uno::Reference xPara(getParagraph(2, "This should be a sub-point."), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(OUString("1.1"), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf104239_sharedOutlineNumId, "tdf104239_sharedOutlineNumId.doc") +{ + uno::Reference xPara(getParagraph(5, "Principes"), uno::UNO_QUERY); + // This was ".1." previously. + CPPUNIT_ASSERT_EQUAL(OUString("2.1."), getProperty(xPara, "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf120394, "tdf120394.doc") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + { + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1.1.1"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(5), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(0), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(8), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(9), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1.1.2"), getProperty(xPara, "ListLabelString")); + } + { + uno::Reference xPara(getParagraph(10), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(2), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString(), getProperty(xPara, "ListLabelString")); + } +} + +DECLARE_WW8EXPORT_TEST(testTdf142760, "tdf142760.doc") +{ + // Without the fix in place, this test would have failed with + // - Expected: 2 + // - Actual : 6 + CPPUNIT_ASSERT_EQUAL(2, getPages()); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + + uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xTables->getCount()); +} + +DECLARE_WW8EXPORT_TEST(testTdf134570, "tdf134570.doc") +{ + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xPara(getParagraph(1), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(static_cast(1), getProperty(xPara, "NumberingLevel")); + CPPUNIT_ASSERT_EQUAL(OUString("1"), getProperty(xPara, "ListLabelString")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf136814) +{ + loadAndReload("tdf136814.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + uno::Reference xStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY); + sal_Int32 nBorderDistance = static_cast(106); + + CPPUNIT_ASSERT_EQUAL(nBorderDistance, getProperty(xStyle, "TopBorderDistance")); + CPPUNIT_ASSERT_EQUAL(nBorderDistance, getProperty(xStyle, "RightBorderDistance")); + CPPUNIT_ASSERT_EQUAL(nBorderDistance, getProperty(xStyle, "BottomBorderDistance")); + CPPUNIT_ASSERT_EQUAL(nBorderDistance, getProperty(xStyle, "LeftBorderDistance")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf79186_noLayoutInCell) +{ + loadAndReload("tdf79186_noLayoutInCell.odt"); + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + CPPUNIT_ASSERT(!getProperty(getShape(1), "IsFollowingTextFlow")); + CPPUNIT_ASSERT(getProperty(getShape(1), "SurroundContour")); // tdf#140508 +} + +CPPUNIT_TEST_FIXTURE(Test, testClearingBreak) +{ + auto verify = [this]() { + uno::Reference xParagraph(getParagraph(1), uno::UNO_QUERY); + uno::Reference xPortions = xParagraph->createEnumeration(); + xPortions->nextElement(); + xPortions->nextElement(); + // Without the accompanying fix in place, this test would have failed with: + // An uncaught exception of type com.sun.star.container.NoSuchElementException + // i.e. the first para was just a fly + text portion, the clearing break was lost. + uno::Reference xPortion(xPortions->nextElement(), uno::UNO_QUERY); + OUString aPortionType; + xPortion->getPropertyValue("TextPortionType") >>= aPortionType; + CPPUNIT_ASSERT_EQUAL(OUString("LineBreak"), aPortionType); + uno::Reference xLineBreak; + xPortion->getPropertyValue("LineBreak") >>= xLineBreak; + sal_Int16 eClear{}; + uno::Reference xLineBreakProps(xLineBreak, uno::UNO_QUERY); + xLineBreakProps->getPropertyValue("Clear") >>= eClear; + CPPUNIT_ASSERT_EQUAL(static_cast(SwLineBreakClear::ALL), eClear); + }; + + // Given a document with a clearing break: + // When loading that file: + createSwDoc("clearing-break.doc"); + // Then make sure that the clear property of the break is not ignored: + verify(); + saveAndReload("MS Word 97"); + // Make sure that the clear property of the break is not ignored during export: + verify(); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142840) +{ + loadAndReload("tdf142840.odt"); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + + uno::Reference xBookmarksSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xBookmarksByIdx(xBookmarksSupplier->getBookmarks(), uno::UNO_QUERY); + uno::Reference xBookmarksByName = xBookmarksSupplier->getBookmarks(); + + // Ensure space are replaced by underscore in bookmark name (it was working before, but ensure this) + CPPUNIT_ASSERT_EQUAL(static_cast(1), xBookmarksByIdx->getCount()); + CPPUNIT_ASSERT(xBookmarksByName->hasByName("Chapter_1")); + CPPUNIT_ASSERT(!xBookmarksByName->hasByName("Chapter 1")); + + // And hyperlink is referring bookmark with underscore also (this was broken) + CPPUNIT_ASSERT_EQUAL(OUString("#Chapter_1"), getProperty(getRun(getParagraph(1), 1), "HyperLinkURL")); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ww8export/ww8export4.cxx b/sw/qa/extras/ww8export/ww8export4.cxx new file mode 100644 index 0000000000..d47c934d9d --- /dev/null +++ b/sw/qa/extras/ww8export/ww8export4.cxx @@ -0,0 +1,263 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Test : public SwModelTestBase +{ +public: + Test() + : SwModelTestBase("/sw/qa/extras/ww8export/data/", "MS Word 97") + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testTdf77964) +{ + loadAndReload("tdf77964.doc"); + // both images were loading as AT_PARA instead of AS_CHAR. Image2 visually had text wrapping. + CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AS_CHARACTER, getProperty(getShapeByName(u"Image2"), "AnchorType")); +} + +DECLARE_WW8EXPORT_TEST(testTdf150197_anlv2ListFormat, "tdf150197_anlv2ListFormat.doc") +{ + CPPUNIT_ASSERT_EQUAL(OUString("1."), getProperty(getParagraph(2), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL(OUString("2."), getProperty(getParagraph(3), "ListLabelString")); + CPPUNIT_ASSERT_EQUAL_MESSAGE("Did you fix me? I should be 2.1", OUString("4.1"), + getProperty(getParagraph(4), "ListLabelString")); +} + +DECLARE_WW8EXPORT_TEST(testTdf117994_CRnumformatting, "tdf117994_CRnumformatting.doc") +{ + CPPUNIT_ASSERT_EQUAL(OUString("1."), parseDump("//body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']"_ostr, "expand"_ostr)); + //Without this fix in place, it would become 200 (and non-bold). + CPPUNIT_ASSERT_EQUAL(OUString("160"), parseDump("//body/txt[1]/SwParaPortion/SwLineLayout/child::*[@type='PortionType::Number']/SwFont"_ostr, "height"_ostr)); +} + +DECLARE_WW8EXPORT_TEST(testTdf151548_formFieldMacros, "tdf151548_formFieldMacros.doc") +{ + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + IDocumentMarkAccess* pMarkAccess = pDoc->getIDocumentMarkAccess(); + for(auto aIter = pMarkAccess->getFieldmarksBegin(); aIter != pMarkAccess->getFieldmarksEnd(); ++aIter) + { + const OUString sName = (*aIter)->GetName(); + CPPUNIT_ASSERT(sName == "Check1" || sName == "Check2" || sName == "Text1" || sName == "Dropdown1"); + } +} + +DECLARE_WW8EXPORT_TEST(testTdf141649_conditionalText, "tdf141649_conditionalText.doc") +{ + // In MS Word, the IF field is editable and requires manual update, so the most correct + // result is "manual refresh with F9" inside a text field, + // but for our purposes, a single instance of "trueResult" is appropriate. + getParagraph(1, "trueResult"); +} + +DECLARE_WW8EXPORT_TEST(testTdf90408, "tdf90408.doc") +{ + uno::Reference xRun(getRun(getParagraph(1), 1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("checkbox is 16pt", 16.f, getProperty(xRun, "CharHeight")); + xRun.set(getRun(getParagraph(1), 2, "unchecked"), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("text is 12pt", 12.f, getProperty(xRun, "CharHeight")); +} + +DECLARE_WW8EXPORT_TEST(testTdf90408B, "tdf90408B.doc") +{ + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xTables(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + uno::Reference xTable(xTables->getByIndex(0), uno::UNO_QUERY); + uno::Reference xCell(xTable->getCellByName("A1"), uno::UNO_QUERY); + + uno::Reference xParaEnumAccess(xCell->getText(), uno::UNO_QUERY); + uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); + uno::Reference xPara(xParaEnum->nextElement(), uno::UNO_QUERY); + + uno::Reference xRun(getRun(xPara, 1), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("checkbox is 28pt", 28.f, getProperty(xRun, "CharHeight")); + xRun.set(getRun(xPara, 2, u" Κατάψυξη, "_ustr), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE("text is 10pt", 10.f, getProperty(xRun, "CharHeight")); +} + +DECLARE_WW8EXPORT_TEST(testTdf155465_paraAdjustDistribute, "tdf155465_paraAdjustDistribute.doc") +{ + // Without the accompanying fix in place, this test would have failed with + // 'Expected: 2; Actual : 0', i.e. the first paragraph's ParaAdjust was left, not block. + const style::ParagraphAdjust eBlock = style::ParagraphAdjust_BLOCK; + auto nAdjust = getProperty(getParagraph(1), "ParaAdjust"); + CPPUNIT_ASSERT_EQUAL(eBlock, static_cast(nAdjust)); + + nAdjust = getProperty(getParagraph(1), "ParaLastLineAdjust"); + CPPUNIT_ASSERT_EQUAL(eBlock, static_cast(nAdjust)); + + nAdjust = getProperty(getParagraph(2), "ParaAdjust"); + CPPUNIT_ASSERT_EQUAL(eBlock, static_cast(nAdjust)); + + nAdjust = getProperty(getParagraph(2), "ParaLastLineAdjust"); + CPPUNIT_ASSERT_EQUAL(style::ParagraphAdjust_LEFT, static_cast(nAdjust)); +} + +CPPUNIT_TEST_FIXTURE(Test, testDontBreakWrappedTables) +{ + // Given a document with the DO_NOT_BREAK_WRAPPED_TABLES compat mode enabled: + createSwDoc(); + { + SwDoc* pDoc = getSwDoc(); + IDocumentSettingAccess& rIDSA = pDoc->getIDocumentSettingAccess(); + rIDSA.set(DocumentSettingId::DO_NOT_BREAK_WRAPPED_TABLES, true); + } + + // When saving to doc: + saveAndReload("MS Word 97"); + + // Then make sure the compat flag is serialized: + SwDoc* pDoc = getSwDoc(); + IDocumentSettingAccess& rIDSA = pDoc->getIDocumentSettingAccess(); + bool bDontBreakWrappedTables = rIDSA.get(DocumentSettingId::DO_NOT_BREAK_WRAPPED_TABLES); + // Without the accompanying fix in place, this test would have failed, the compat flag was not + // set. + CPPUNIT_ASSERT(bDontBreakWrappedTables); +} + +CPPUNIT_TEST_FIXTURE(Test, testFloattableOverlapNeverDOCExport) +{ + // Given a document with a floating table, overlap is not allowed: + { + createSwDoc(); + SwDoc* pDoc = getSwDoc(); + SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell(); + pWrtShell->Insert2("before table"); + // Insert a table: + SwInsertTableOptions aTableOptions(SwInsertTableFlags::DefaultBorder, 0); + pWrtShell->InsertTable(aTableOptions, /*nRows=*/1, /*nCols=*/1); + pWrtShell->MoveTable(GotoPrevTable, fnTableStart); + // Select table: + pWrtShell->SelAll(); + // Wrap the table in a text frame: + SwFlyFrameAttrMgr aMgr(true, pWrtShell, Frmmgr_Type::TEXT, nullptr); + pWrtShell->StartAllAction(); + aMgr.InsertFlyFrame(RndStdIds::FLY_AT_PARA, aMgr.GetPos(), aMgr.GetSize()); + pWrtShell->EndAllAction(); + // Allow the text frame to split: + pWrtShell->StartAllAction(); + sw::FrameFormats* pFlys = pDoc->GetSpzFrameFormats(); + sw::SpzFrameFormat* pFly = (*pFlys)[0]; + SwAttrSet aSet(pFly->GetAttrSet()); + aSet.Put(SwFormatFlySplit(true)); + // Don't allow overlap: + SwFormatWrapInfluenceOnObjPos aInfluence; + aInfluence.SetAllowOverlap(false); + aSet.Put(aInfluence); + pDoc->SetAttr(aSet, *pFly); + pWrtShell->EndAllAction(); + } + + // When saving to DOC: + saveAndReload("MS Word 97"); + + // Then make sure that the overlap=never markup is written: + SwDoc* pDoc = getSwDoc(); + sw::FrameFormats* pFlys = pDoc->GetSpzFrameFormats(); + sw::SpzFrameFormat* pFly = (*pFlys)[0]; + // Without the accompanying fix in place, this test would have failed, i.e. TFNoAllowOverlap was + // not written. + CPPUNIT_ASSERT(!pFly->GetAttrSet().GetWrapInfluenceOnObjPos().GetAllowOverlap()); +} + +static bool IsFirstLine(const SwTextNode* pTextNode) +{ + const SfxPoolItem* pItem = pTextNode->GetNoCondAttr(RES_MARGIN_FIRSTLINE, false); + return !!pItem; +} + +DECLARE_WW8EXPORT_TEST(testInlinePageBreakFirstLine, "inlinePageBreakFirstLine.doc") +{ + SwDoc* pDoc = getSwDoc(); + const SwNodes& rNodes = pDoc->GetNodes(); + + std::vector aTextNodes; + + for (SwNodeOffset nNode(0); nNode < rNodes.Count(); ++nNode) + { + SwNode* pNode = pDoc->GetNodes()[nNode]; + SwTextNode* pTextNode = pNode->GetTextNode(); + if (!pTextNode) + continue; + aTextNodes.push_back(pTextNode); + } + + CPPUNIT_ASSERT_EQUAL(size_t(3), aTextNodes.size()); + CPPUNIT_ASSERT_EQUAL(OUString("First line"), aTextNodes[0]->GetText()); + CPPUNIT_ASSERT(IsFirstLine(aTextNodes[0])); + // Here exists an inline pagebreak (a pagebreak without a paragraph before it) + // This text node is not indented because it is not the first line of the paragraph + CPPUNIT_ASSERT_EQUAL(OUString("Should not be indented"), aTextNodes[1]->GetText()); + CPPUNIT_ASSERT(!IsFirstLine(aTextNodes[1])); + // Here is the actual second paragraph + CPPUNIT_ASSERT_EQUAL(OUString("Should be indented"), aTextNodes[2]->GetText()); + CPPUNIT_ASSERT(IsFirstLine(aTextNodes[2])); +} + +DECLARE_WW8EXPORT_TEST(testNonInlinePageBreakFirstLine, "nonInlinePageBreakFirstLine.doc") +{ + SwDoc* pDoc = getSwDoc(); + const SwNodes& rNodes = pDoc->GetNodes(); + + std::vector aTextNodes; + + for (SwNodeOffset nNode(0); nNode < rNodes.Count(); ++nNode) + { + SwNode* pNode = pDoc->GetNodes()[nNode]; + SwTextNode* pTextNode = pNode->GetTextNode(); + if (!pTextNode) + continue; + aTextNodes.push_back(pTextNode); + } + + CPPUNIT_ASSERT_EQUAL(size_t(2), aTextNodes.size()); + CPPUNIT_ASSERT_EQUAL(OUString("First line"), aTextNodes[0]->GetText()); + CPPUNIT_ASSERT(IsFirstLine(aTextNodes[0])); + // Here exists a pagebreak after a paragraph + // This text node is indented because it is the first line of a paragraph + CPPUNIT_ASSERT_EQUAL(OUString("Should be indented"), aTextNodes[1]->GetText()); + CPPUNIT_ASSERT(IsFirstLine(aTextNodes[1])); +} + +DECLARE_WW8EXPORT_TEST(testTdf104704_mangledFooter, "tdf104704_mangledFooter.odt") +{ + CPPUNIT_ASSERT_EQUAL(2, getPages()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/ww8import/data/bnc875715.doc b/sw/qa/extras/ww8import/data/bnc875715.doc new file mode 100644 index 0000000000..af15e1434e Binary files /dev/null and b/sw/qa/extras/ww8import/data/bnc875715.doc differ diff --git a/sw/qa/extras/ww8import/data/changes-in-footnote.doc b/sw/qa/extras/ww8import/data/changes-in-footnote.doc new file mode 100644 index 0000000000..789795eb0b Binary files /dev/null and b/sw/qa/extras/ww8import/data/changes-in-footnote.doc differ diff --git a/sw/qa/extras/ww8import/data/floating-table-section-columns.doc b/sw/qa/extras/ww8import/data/floating-table-section-columns.doc new file mode 100644 index 0000000000..6471ded397 Binary files /dev/null and b/sw/qa/extras/ww8import/data/floating-table-section-columns.doc differ diff --git a/sw/qa/extras/ww8import/data/image-lazy-read-0size.doc b/sw/qa/extras/ww8import/data/image-lazy-read-0size.doc new file mode 100644 index 0000000000..80306cb1de Binary files /dev/null and b/sw/qa/extras/ww8import/data/image-lazy-read-0size.doc differ diff --git a/sw/qa/extras/ww8import/data/image-lazy-read.doc b/sw/qa/extras/ww8import/data/image-lazy-read.doc new file mode 100644 index 0000000000..95017d2ac8 Binary files /dev/null and b/sw/qa/extras/ww8import/data/image-lazy-read.doc differ diff --git a/sw/qa/extras/ww8import/data/n816593.doc b/sw/qa/extras/ww8import/data/n816593.doc new file mode 100644 index 0000000000..71cb9c4861 Binary files /dev/null and b/sw/qa/extras/ww8import/data/n816593.doc differ diff --git a/sw/qa/extras/ww8import/data/tdf106799.doc b/sw/qa/extras/ww8import/data/tdf106799.doc new file mode 100644 index 0000000000..0637e8cce6 Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf106799.doc differ diff --git a/sw/qa/extras/ww8import/data/tdf110987 b/sw/qa/extras/ww8import/data/tdf110987 new file mode 100644 index 0000000000..16195c0e15 Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf110987 differ diff --git a/sw/qa/extras/ww8import/data/tdf120761_zOrder.dot b/sw/qa/extras/ww8import/data/tdf120761_zOrder.dot new file mode 100644 index 0000000000..b70a7d840b Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf120761_zOrder.dot differ diff --git a/sw/qa/extras/ww8import/data/tdf121734.doc b/sw/qa/extras/ww8import/data/tdf121734.doc new file mode 100644 index 0000000000..11a9bf503c Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf121734.doc differ diff --git a/sw/qa/extras/ww8import/data/tdf122425_1.doc b/sw/qa/extras/ww8import/data/tdf122425_1.doc new file mode 100644 index 0000000000..f0e5b148d3 Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf122425_1.doc differ diff --git a/sw/qa/extras/ww8import/data/tdf124601.doc b/sw/qa/extras/ww8import/data/tdf124601.doc new file mode 100644 index 0000000000..a07bae1f01 Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf124601.doc differ diff --git a/sw/qa/extras/ww8import/data/tdf125281.doc b/sw/qa/extras/ww8import/data/tdf125281.doc new file mode 100644 index 0000000000..15146f9e3d Binary files /dev/null and b/sw/qa/extras/ww8import/data/tdf125281.doc differ diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx new file mode 100644 index 0000000000..58c2bcfbf1 --- /dev/null +++ b/sw/qa/extras/ww8import/ww8import.cxx @@ -0,0 +1,282 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// tests should only be added to ww8IMPORT *if* they fail round-tripping in ww8EXPORT + +class Test : public SwModelTestBase +{ +public: + Test() : SwModelTestBase("/sw/qa/extras/ww8import/data/", "MS Word 97") + { + } +}; + +CPPUNIT_TEST_FIXTURE(Test, testN816593) +{ + createSwDoc("n816593.doc"); + uno::Reference xTextTablesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xIndexAccess(xTextTablesSupplier->getTextTables(), uno::UNO_QUERY); + // Make sure that even if we import the two tables as non-floating, we + // still consider them different, and not merge them. + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), xIndexAccess->getCount()); +} + +CPPUNIT_TEST_FIXTURE(Test, testBnc875715) +{ + createSwDoc("bnc875715.doc"); + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + // Was incorrectly set as -1270. + CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(xSections->getByIndex(0), "SectionLeftMargin")); +} + +CPPUNIT_TEST_FIXTURE(Test, testFloatingTableSectionColumns) +{ + createSwDoc("floating-table-section-columns.doc"); + OUString tableWidth = parseDump("/root/page[1]/body/section/column[2]/body/txt/anchored/fly/tab/infos/bounds"_ostr, "width"_ostr); + // table width was restricted by a column + CPPUNIT_ASSERT( tableWidth.toInt32() > 10000 ); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf124601) +{ + createSwDoc("tdf124601.doc"); + // Without the accompanying fix in place, this test would have failed, as the importer lost the + // fLayoutInCell shape property for wrap-though shapes. + CPPUNIT_ASSERT(getProperty(getShapeByName(u"Grafik 18"), "IsFollowingTextFlow")); + CPPUNIT_ASSERT(getProperty(getShapeByName(u"Grafik 19"), "IsFollowingTextFlow")); +} + +CPPUNIT_TEST_FIXTURE(Test, testImageLazyRead) +{ + createSwDoc("image-lazy-read.doc"); + auto xGraphic = getProperty>(getShape(1), "Graphic"); + Graphic aGraphic(xGraphic); + // This failed, import loaded the graphic, it wasn't lazy-read. + CPPUNIT_ASSERT(!aGraphic.isAvailable()); +} + +CPPUNIT_TEST_FIXTURE(Test, testImageLazyRead0size) +{ + createSwDoc("image-lazy-read-0size.doc"); + // Load a document with a single bitmap in it: it's declared as a WMF one, but actually a TGA + // bitmap. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwNode* pNode = pDoc->GetNodes()[SwNodeOffset(6)]; + SwGrfNode* pGrfNode = pNode->GetGrfNode(); + CPPUNIT_ASSERT(pGrfNode); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 7590x10440 + // - Actual : 0x0 + // i.e. the size was 0, even if the actual bitmap had a non-0 size. + CPPUNIT_ASSERT_EQUAL(Size(7590, 10440), pGrfNode->GetTwipSize()); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf106799) +{ + createSwDoc("tdf106799.doc"); + // Ensure that all text portions are calculated before testing. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwViewShell* pViewShell + = pTextDoc->GetDocShell()->GetDoc()->getIDocumentLayoutAccess().GetCurrentViewShell(); + CPPUNIT_ASSERT(pViewShell); + pViewShell->Reformat(); + + sal_Int32 const nCellWidths[3][4] = { { 9528, 0, 0, 0 },{ 2382, 2382, 2382, 2382 },{ 2382, 2382, 2382, 2382 } }; + sal_Int32 const nCellTxtLns[3][4] = { { 1, 0, 0, 0 },{ 1, 0, 0, 0},{ 1, 1, 1, 1 } }; + // Table was distorted because of missing sprmPFInnerTableCell at paragraph marks (0x0D) with sprmPFInnerTtp + for (sal_Int32 nRow : { 0, 1, 2 }) + for (sal_Int32 nCell : { 0, 1, 2, 3 }) + { + OString cellXPath("/root/page/body/tab/row/cell/tab/row[" + OString::number(nRow+1) + "]/cell[" + OString::number(nCell+1) + "]/"); + CPPUNIT_ASSERT_EQUAL_MESSAGE(cellXPath.getStr(), nCellWidths[nRow][nCell], parseDump(cellXPath + "infos/bounds", "width"_ostr).toInt32()); + if (nCellTxtLns[nRow][nCell] != 0) + CPPUNIT_ASSERT_EQUAL_MESSAGE(cellXPath.getStr(), nCellTxtLns[nRow][nCell], parseDump(cellXPath + "txt/SwParaPortion/SwLineLayout", "length"_ostr).toInt32()); + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf121734) +{ + createSwDoc("tdf121734.doc"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwPosFlyFrames aPosFlyFrames = pDoc->GetAllFlyFormats(nullptr, false); + // There is only one fly frame in the document: the one with the imported floating table + CPPUNIT_ASSERT_EQUAL(size_t(1), aPosFlyFrames.size()); + for (const SwPosFlyFrame& rPosFlyFrame : aPosFlyFrames) + { + const SwFrameFormat& rFormat = rPosFlyFrame.GetFormat(); + const SfxPoolItem* pItem = nullptr; + + // The LR and UL spacings and borders must all be set explicitly; + // spacings and border distances must be 0; borders must be absent. + + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, rFormat.GetItemState(RES_LR_SPACE, false, &pItem)); + auto pLR = static_cast(pItem); + CPPUNIT_ASSERT(pLR); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pLR->GetLeft()); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pLR->GetRight()); + + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, rFormat.GetItemState(RES_UL_SPACE, false, &pItem)); + auto pUL = static_cast(pItem); + CPPUNIT_ASSERT(pUL); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pUL->GetUpper()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pUL->GetLower()); + + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, rFormat.GetItemState(RES_BOX, false, &pItem)); + auto pBox = static_cast(pItem); + CPPUNIT_ASSERT(pBox); + for (auto eLine : { SvxBoxItemLine::TOP, SvxBoxItemLine::BOTTOM, + SvxBoxItemLine::LEFT, SvxBoxItemLine::RIGHT }) + { + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), pBox->GetDistance(eLine)); + CPPUNIT_ASSERT(!pBox->GetLine(eLine)); + } + } +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf125281) +{ + createSwDoc("tdf125281.doc"); +#if !defined(_WIN32) + // Windows fails with actual == 26171 for some reason; also lazy load isn't lazy in Windows + // debug builds, reason is not known at the moment. + + // Load a .doc file which has an embedded .emf image. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwNode* pNode = pDoc->GetNodes()[SwNodeOffset(6)]; + CPPUNIT_ASSERT(pNode->IsGrfNode()); + SwGrfNode* pGrfNode = pNode->GetGrfNode(); + const Graphic& rGraphic = pGrfNode->GetGrf(); + + // Without the accompanying fix in place, this test would have failed, as pref size was 0 till + // an actual Paint() was performed (and even then, it was wrong). + tools::Long nExpected = 25664; + CPPUNIT_ASSERT_EQUAL(nExpected, rGraphic.GetPrefSize().getWidth()); + + // Without the accompanying fix in place, this test would have failed, as setting the pref size + // swapped the image in. + CPPUNIT_ASSERT(!rGraphic.isAvailable()); +#endif +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf122425_1) +{ + createSwDoc("tdf122425_1.doc"); + // This is for header text in case we use a hack for fixed-height headers + // (see SwWW8ImplReader::Read_HdFtTextAsHackedFrame) + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + SwPosFlyFrames aPosFlyFrames = pDoc->GetAllFlyFormats(nullptr, false); + // There are two fly frames in the document: for first page's header, and for other pages' + CPPUNIT_ASSERT_EQUAL(size_t(2), aPosFlyFrames.size()); + for (const SwPosFlyFrame& rPosFlyFrame : aPosFlyFrames) + { + const SwFrameFormat& rFormat = rPosFlyFrame.GetFormat(); + const SfxPoolItem* pItem = nullptr; + + // The LR and UL spacings and borders must all be set explicitly; + // spacings and border distances must be 0; borders must be absent + + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, rFormat.GetItemState(RES_LR_SPACE, false, &pItem)); + auto pLR = static_cast(pItem); + CPPUNIT_ASSERT(pLR); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pLR->GetLeft()); + CPPUNIT_ASSERT_EQUAL(tools::Long(0), pLR->GetRight()); + + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, rFormat.GetItemState(RES_UL_SPACE, false, &pItem)); + auto pUL = static_cast(pItem); + CPPUNIT_ASSERT(pUL); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pUL->GetUpper()); + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pUL->GetLower()); + + CPPUNIT_ASSERT_EQUAL(SfxItemState::SET, rFormat.GetItemState(RES_BOX, false, &pItem)); + auto pBox = static_cast(pItem); + CPPUNIT_ASSERT(pBox); + for (auto eLine : { SvxBoxItemLine::TOP, SvxBoxItemLine::BOTTOM, + SvxBoxItemLine::LEFT, SvxBoxItemLine::RIGHT }) + { + CPPUNIT_ASSERT_EQUAL(sal_Int16(0), pBox->GetDistance(eLine)); + CPPUNIT_ASSERT(!pBox->GetLine(eLine)); + } + } + + //tdf#139495: without the fix, a negative number was converted into a uInt16, overflowing to 115501 + auto nDist = getProperty(getStyles("PageStyles")->getByName("Standard"), "HeaderBodyDistance"); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), nDist); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf110987) +{ + createSwDoc("tdf110987"); + // The input document is an empty .doc, but without file name + // extension. Check that it was loaded as a normal .doc document, + // and not a template. + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + OUString sFilterName = pTextDoc->GetDocShell()->GetMedium()->GetFilter()->GetFilterName(); + CPPUNIT_ASSERT(sFilterName != "MS Word 97 Vorlage"); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf120761_zOrder) +{ + createSwDoc("tdf120761_zOrder.dot"); + //The blue shape was covering everything (highest zorder = 2) instead of the lowest(0) + uno::Reference xShape(getShapeByName(u"Picture 2"), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL(sal_uInt32(0), getProperty(xShape, "ZOrder")); +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf142003) +{ + createSwDoc("changes-in-footnote.doc"); + + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + SwEditShell* const pEditShell(pTextDoc->GetDocShell()->GetDoc()->GetEditShell()); + pEditShell->AcceptRedline(0); + + //The changes were offset from where they should have been + uno::Reference xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xFootnotes = xFootnotesSupplier->getFootnotes(); + uno::Reference xParagraph(xFootnotes->getByIndex(0), uno::UNO_QUERY); + //before change was incorrect, Loren ipsum , doconsectetur ... + CPPUNIT_ASSERT(xParagraph->getString().startsWith("Lorem ipsum , consectetur adipiscing elit.")); +} + +// tests should only be added to ww8IMPORT *if* they fail round-tripping in ww8EXPORT + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3