diff options
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport18.cxx | 13 | ||||
-rw-r--r-- | sw/source/filter/ww8/styles.cxx | 1 | ||||
-rw-r--r-- | sw/source/filter/ww8/wrtw8sty.cxx | 13 | ||||
-rw-r--r-- | writerfilter/source/dmapper/StyleSheetTable.cxx | 232 |
4 files changed, 142 insertions, 117 deletions
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx index 92e13b4b7d3b..7b7213e0f019 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx @@ -264,17 +264,12 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf152425) // Check that "List Number" and "List 5" styles don't get merged const OUString Para3Style = getProperty<OUString>(getParagraph(3), "ParaStyleName"); - CPPUNIT_ASSERT_EQUAL(OUString("List Number"), Para3Style); + CPPUNIT_ASSERT_EQUAL(OUString("Numbering 1"), Para3Style); const OUString Para4Style = getProperty<OUString>(getParagraph(4), "ParaStyleName"); - // Eventually, we need to check this: - // CPPUNIT_ASSERT_EQUAL(OUString("List 5"), Para4Style); - // But for now, just make sure that the style names differ - CPPUNIT_ASSERT(Para4Style != Para3Style); + 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<OUString>(getParagraph(5), "ParaStyleName"); - // Eventually, we need to check this: - // CPPUNIT_ASSERT_EQUAL(OUString("List Bullet 5"), Para5Style); - // But for now, just make sure that the style names differ - CPPUNIT_ASSERT(Para5Style != Para4Style); + CPPUNIT_ASSERT_EQUAL(OUString("List 5"), Para5Style); } CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/ww8/styles.cxx b/sw/source/filter/ww8/styles.cxx index c7a28e77e60b..33d0ad3dec5f 100644 --- a/sw/source/filter/ww8/styles.cxx +++ b/sw/source/filter/ww8/styles.cxx @@ -23,6 +23,7 @@ namespace { + // Keep in sync with StyleSheetTable::ConvertStyleName const char **GetStiNames() noexcept { // Matches enum ww::sti in sw/source/filter/inc/wwstyles.hxx diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx index 9f534b1b55d2..72fca1b3696f 100644 --- a/sw/source/filter/ww8/wrtw8sty.cxx +++ b/sw/source/filter/ww8/wrtw8sty.cxx @@ -200,6 +200,7 @@ static sal_uInt16 BuildGetSlot(const SwFormat& rFormat) } +// Keep in sync with StyleSheetTable::ConvertStyleName sal_uInt16 MSWordStyles::GetWWId( const SwFormat& rFormat ) { sal_uInt16 nRet = ww::stiUser; // user style as default @@ -319,6 +320,14 @@ void MSWordStyles::BuildStylesTable() } } +// StyleSheetTable::ConvertStyleName appends the suffix do disambiguate conflicting style names +static OUString StripWWSuffix(const OUString& s) +{ + OUString ret = s; + ret.endsWith(" (WW)", &ret); + return ret; +} + void MSWordStyles::BuildWwNames() { std::unordered_set<OUString> aUsed; @@ -363,9 +372,9 @@ void MSWordStyles::BuildWwNames() if (!entry.ww_name.isEmpty()) continue; if (entry.format) - entry.ww_name = entry.format->GetName(); + entry.ww_name = StripWWSuffix(entry.format->GetName()); else if (entry.num_rule) - entry.ww_name = entry.num_rule->GetName(); + entry.ww_name = StripWWSuffix(entry.num_rule->GetName()); else continue; makeUniqueName(entry.ww_name); diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx index 9641a2a032bd..963ff9c907b6 100644 --- a/writerfilter/source/dmapper/StyleSheetTable.cxx +++ b/writerfilter/source/dmapper/StyleSheetTable.cxx @@ -1420,129 +1420,141 @@ OUString StyleSheetTable::ConvertStyleName( const OUString& rWWName, bool bExten //search for the rWWName in the IdentifierD of the existing styles and convert the sStyleName member auto findIt = m_pImpl->m_aStyleSheetEntriesMap.find(rWWName); if (findIt != m_pImpl->m_aStyleSheetEntriesMap.end()) + { + if (!findIt->second->sConvertedStyleName.isEmpty()) + return findIt->second->sConvertedStyleName; sRet = findIt->second->sStyleName; + } } // create a map only once + // This maps Word's special style manes to Writer's (the opposite to what MSWordStyles::GetWWId + // and ww::GetEnglishNameFromSti do on export). The mapping gives a Writer's style name, which + // will point to a style with specific RES_POOL* in its m_nPoolFormatId. Then on export, the + // pool format id will map to a ww::sti enum value, and finally to a Word style name. Keep this + // part in sync with the export functions mentioned above! + // In addition to "standard" names, some case variations are handled here; and also there are + // a number of strange mappings like "BodyTextIndentItalic" -> "Text body indent italic", which + // map something unused in Word to something unused in Writer :-/ static const std::map< OUString, OUString> StyleNameMap { - { "Normal", "Standard" }, - { "heading 1", "Heading 1" }, - { "heading 2", "Heading 2" }, - { "heading 3", "Heading 3" }, - { "heading 4", "Heading 4" }, - { "heading 5", "Heading 5" }, - { "heading 6", "Heading 6" }, - { "heading 7", "Heading 7" }, - { "heading 8", "Heading 8" }, - { "heading 9", "Heading 9" }, - { "Heading 1", "Heading 1" }, - { "Heading 2", "Heading 2" }, - { "Heading 3", "Heading 3" }, - { "Heading 4", "Heading 4" }, - { "Heading 5", "Heading 5" }, - { "Heading 6", "Heading 6" }, - { "Heading 7", "Heading 7" }, - { "Heading 8", "Heading 8" }, - { "Heading 9", "Heading 9" }, - { "Index 1", "Index 1" }, - { "Index 2", "Index 2" }, - { "Index 3", "Index 3" }, + { "Normal", "Standard" }, // RES_POOLCOLL_STANDARD + { "heading 1", "Heading 1" }, // RES_POOLCOLL_HEADLINE1 + { "heading 2", "Heading 2" }, // RES_POOLCOLL_HEADLINE2 + { "heading 3", "Heading 3" }, // RES_POOLCOLL_HEADLINE3 + { "heading 4", "Heading 4" }, // RES_POOLCOLL_HEADLINE4 + { "heading 5", "Heading 5" }, // RES_POOLCOLL_HEADLINE5 + { "heading 6", "Heading 6" }, // RES_POOLCOLL_HEADLINE6 + { "heading 7", "Heading 7" }, // RES_POOLCOLL_HEADLINE7 + { "heading 8", "Heading 8" }, // RES_POOLCOLL_HEADLINE8 + { "heading 9", "Heading 9" }, // RES_POOLCOLL_HEADLINE9 + { "Heading 1", "Heading 1" }, // RES_POOLCOLL_HEADLINE1 + { "Heading 2", "Heading 2" }, // RES_POOLCOLL_HEADLINE2 + { "Heading 3", "Heading 3" }, // RES_POOLCOLL_HEADLINE3 + { "Heading 4", "Heading 4" }, // RES_POOLCOLL_HEADLINE4 + { "Heading 5", "Heading 5" }, // RES_POOLCOLL_HEADLINE5 + { "Heading 6", "Heading 6" }, // RES_POOLCOLL_HEADLINE6 + { "Heading 7", "Heading 7" }, // RES_POOLCOLL_HEADLINE7 + { "Heading 8", "Heading 8" }, // RES_POOLCOLL_HEADLINE8 + { "Heading 9", "Heading 9" }, // RES_POOLCOLL_HEADLINE9 + { "Index 1", "Index 1" }, // RES_POOLCOLL_TOX_IDX1 + { "Index 2", "Index 2" }, // RES_POOLCOLL_TOX_IDX2 + { "Index 3", "Index 3" }, // RES_POOLCOLL_TOX_IDX3 // { "Index 4", "" }, // { "Index 5", "" }, // { "Index 6", "" }, // { "Index 7", "" }, // { "Index 8", "" }, // { "Index 9", "" }, - { "TOC 1", "Contents 1" }, - { "TOC 2", "Contents 2" }, - { "TOC 3", "Contents 3" }, - { "TOC 4", "Contents 4" }, - { "TOC 5", "Contents 5" }, - { "TOC 6", "Contents 6" }, - { "TOC 7", "Contents 7" }, - { "TOC 8", "Contents 8" }, - { "TOC 9", "Contents 9" }, - { "TOC Heading", "Contents Heading" }, - { "TOCHeading", "Contents Heading" }, - { "toc 1", "Contents 1" }, - { "toc 2", "Contents 2" }, - { "toc 3", "Contents 3" }, - { "toc 4", "Contents 4" }, - { "toc 5", "Contents 5" }, - { "toc 6", "Contents 6" }, - { "toc 7", "Contents 7" }, - { "toc 8", "Contents 8" }, - { "toc 9", "Contents 9" }, - { "TOC1", "Contents 1" }, - { "TOC2", "Contents 2" }, - { "TOC3", "Contents 3" }, - { "TOC4", "Contents 4" }, - { "TOC5", "Contents 5" }, - { "TOC6", "Contents 6" }, - { "TOC7", "Contents 7" }, - { "TOC8", "Contents 8" }, - { "TOC9", "Contents 9" }, + { "TOC 1", "Contents 1" }, // RES_POOLCOLL_TOX_CNTNT1 + { "TOC 2", "Contents 2" }, // RES_POOLCOLL_TOX_CNTNT2 + { "TOC 3", "Contents 3" }, // RES_POOLCOLL_TOX_CNTNT3 + { "TOC 4", "Contents 4" }, // RES_POOLCOLL_TOX_CNTNT4 + { "TOC 5", "Contents 5" }, // RES_POOLCOLL_TOX_CNTNT5 + { "TOC 6", "Contents 6" }, // RES_POOLCOLL_TOX_CNTNT6 + { "TOC 7", "Contents 7" }, // RES_POOLCOLL_TOX_CNTNT7 + { "TOC 8", "Contents 8" }, // RES_POOLCOLL_TOX_CNTNT8 + { "TOC 9", "Contents 9" }, // RES_POOLCOLL_TOX_CNTNT9 + { "TOC Heading", "Contents Heading" }, // RES_POOLCOLL_TOX_CNTNTH + { "TOCHeading", "Contents Heading" }, // RES_POOLCOLL_TOX_CNTNTH + { "toc 1", "Contents 1" }, // RES_POOLCOLL_TOX_CNTNT1 + { "toc 2", "Contents 2" }, // RES_POOLCOLL_TOX_CNTNT2 + { "toc 3", "Contents 3" }, // RES_POOLCOLL_TOX_CNTNT3 + { "toc 4", "Contents 4" }, // RES_POOLCOLL_TOX_CNTNT4 + { "toc 5", "Contents 5" }, // RES_POOLCOLL_TOX_CNTNT5 + { "toc 6", "Contents 6" }, // RES_POOLCOLL_TOX_CNTNT6 + { "toc 7", "Contents 7" }, // RES_POOLCOLL_TOX_CNTNT7 + { "toc 8", "Contents 8" }, // RES_POOLCOLL_TOX_CNTNT8 + { "toc 9", "Contents 9" }, // RES_POOLCOLL_TOX_CNTNT9 + { "TOC1", "Contents 1" }, // RES_POOLCOLL_TOX_CNTNT1 + { "TOC2", "Contents 2" }, // RES_POOLCOLL_TOX_CNTNT2 + { "TOC3", "Contents 3" }, // RES_POOLCOLL_TOX_CNTNT3 + { "TOC4", "Contents 4" }, // RES_POOLCOLL_TOX_CNTNT4 + { "TOC5", "Contents 5" }, // RES_POOLCOLL_TOX_CNTNT5 + { "TOC6", "Contents 6" }, // RES_POOLCOLL_TOX_CNTNT6 + { "TOC7", "Contents 7" }, // RES_POOLCOLL_TOX_CNTNT7 + { "TOC8", "Contents 8" }, // RES_POOLCOLL_TOX_CNTNT8 + { "TOC9", "Contents 9" }, // RES_POOLCOLL_TOX_CNTNT9 // { "Normal Indent", "" }, - { "footnote text", "Footnote" }, - { "Footnote Text", "Footnote" }, -// { "Annotation Text", "" }, - { "Header", "Header" }, - { "header", "Header" }, - { "Footer", "Footer" }, - { "footer", "Footer" }, - { "Index Heading", "Index Heading" }, -// { "Caption", "" }, -// { "Table of Figures", "" }, - { "Envelope Address", "Addressee" }, - { "Envelope Return", "Sender" }, - { "footnote reference", "Footnote Symbol" }, - { "Footnote Reference", "Footnote Symbol" }, + { "footnote text", "Footnote" }, // RES_POOLCOLL_FOOTNOTE + { "Footnote Text", "Footnote" }, // RES_POOLCOLL_FOOTNOTE + { "Annotation Text", "Marginalia" }, // RES_POOLCOLL_MARGINAL + { "Header", "Header" }, // RES_POOLCOLL_HEADER + { "header", "Header" }, // RES_POOLCOLL_HEADER + { "Footer", "Footer" }, // RES_POOLCOLL_FOOTER + { "footer", "Footer" }, // RES_POOLCOLL_FOOTER + { "Index Heading", "Index Heading" }, // RES_POOLCOLL_TOX_IDXH + { "Caption", "Caption" }, // RES_POOLCOLL_LABEL + { "Table of Figures", "Drawing" }, // RES_POOLCOLL_LABEL_DRAWING + { "Envelope Address", "Addressee" }, // RES_POOLCOLL_ENVELOPE_ADDRESS + { "Envelope Return", "Sender" }, // RES_POOLCOLL_SEND_ADDRESS + { "footnote reference", "Footnote Symbol" }, // RES_POOLCHR_FOOTNOTE; tdf#82173 + { "Footnote Reference", "Footnote Symbol" }, // RES_POOLCHR_FOOTNOTE; tdf#82173 // { "Annotation Reference", "" }, - { "Line Number", "Line numbering" }, - { "Page Number", "Page Number" }, - { "endnote reference", "Endnote Symbol" }, - { "Endnote Reference", "Endnote Symbol" }, - { "endnote text", "Endnote" }, - { "Endnote Text", "Endnote" }, -// { "Table of Authorities", "" }, + { "Line Number", "Line numbering" }, // RES_POOLCHR_LINENUM + { "Page Number", "Page Number" }, // RES_POOLCHR_PAGENO + { "endnote reference", "Endnote Symbol" }, // RES_POOLCHR_ENDNOTE; tdf#82173 + { "Endnote Reference", "Endnote Symbol" }, // RES_POOLCHR_ENDNOTE; tdf#82173 + { "endnote text", "Endnote" }, // RES_POOLCOLL_ENDNOTE + { "Endnote Text", "Endnote" }, // RES_POOLCOLL_ENDNOTE + { "Table of Authorities", "Bibliography Heading" }, // RES_POOLCOLL_TOX_AUTHORITIESH // { "Macro Text", "" }, // { "TOA Heading", "" }, - { "List", "List" }, + { "List", "List" }, // RES_POOLCOLL_NUMBER_BULLET_BASE // { "List 2", "" }, // { "List 3", "" }, // { "List 4", "" }, // { "List 5", "" }, -// { "List Bullet", "" }, -// { "List Bullet 2", "" }, -// { "List Bullet 3", "" }, -// { "List Bullet 4", "" }, -// { "List Bullet 5", "" }, -// { "List Number", "" }, -// { "List Number 2", "" }, -// { "List Number 3", "" }, -// { "List Number 4", "" }, -// { "List Number 5", "" }, - { "Title", "Title" }, -// { "Closing", "" }, - { "Signature", "Signature" }, + { "List Bullet", "List 1" }, // RES_POOLCOLL_BULLET_LEVEL1 + { "List Bullet 2", "List 2" }, // RES_POOLCOLL_BULLET_LEVEL2 + { "List Bullet 3", "List 3" }, // RES_POOLCOLL_BULLET_LEVEL3 + { "List Bullet 4", "List 4" }, // RES_POOLCOLL_BULLET_LEVEL4 + { "List Bullet 5", "List 5" }, // RES_POOLCOLL_BULLET_LEVEL5 + { "List Number", "Numbering 1" }, // RES_POOLCOLL_NUM_LEVEL1 + { "List Number 2", "Numbering 2" }, // RES_POOLCOLL_NUM_LEVEL2 + { "List Number 3", "Numbering 3" }, // RES_POOLCOLL_NUM_LEVEL3 + { "List Number 4", "Numbering 4" }, // RES_POOLCOLL_NUM_LEVEL4 + { "List Number 5", "Numbering 5" }, // RES_POOLCOLL_NUM_LEVEL5 + { "Title", "Title" }, // RES_POOLCOLL_DOC_TITLE + { "Closing", "Appendix" }, // RES_POOLCOLL_DOC_APPENDIX + { "Signature", "Signature" }, // RES_POOLCOLL_SIGNATURE // { "Default Paragraph Font", "" }, { "DefaultParagraphFont", "Default Paragraph Font" }, - { "Body Text", "Text body" }, - { "BodyText", "Text body" }, + { "Body Text", "Text body" }, // RES_POOLCOLL_TEXT + { "BodyText", "Text body" }, // RES_POOLCOLL_TEXT { "BodyTextIndentItalic", "Text body indent italic" }, - { "Body Text Indent", "Text body indent" }, - { "BodyTextIndent", "Text body indent" }, + { "Body Text Indent", "Text body indent" }, // RES_POOLCOLL_TEXT_MOVE + { "BodyTextIndent", "Text body indent" }, // RES_POOLCOLL_TEXT_MOVE { "BodyTextIndent2", "Text body indent2" }, -// { "List Continue", "" }, -// { "List Continue 2", "" }, -// { "List Continue 3", "" }, -// { "List Continue 4", "" }, -// { "List Continue 5", "" }, + { "List Continue", "List 1 Cont." }, // RES_POOLCOLL_BULLET_NONUM1 + { "List Continue 2", "List 2 Cont." }, // RES_POOLCOLL_BULLET_NONUM2 + { "List Continue 3", "List 3 Cont." }, // RES_POOLCOLL_BULLET_NONUM3 + { "List Continue 4", "List 4 Cont." }, // RES_POOLCOLL_BULLET_NONUM4 + { "List Continue 5", "List 5 Cont." }, // RES_POOLCOLL_BULLET_NONUM5 // { "Message Header", "" }, - { "Subtitle", "Subtitle" }, -// { "Salutation", "" }, + { "Subtitle", "Subtitle" }, // RES_POOLCOLL_DOC_SUBTITLE + { "Salutation", "Salutation" }, // RES_POOLCOLL_GREETING // { "Date", "" }, - { "Body Text First Indent", "Body Text Indent" }, + { "Body Text First Indent", "First line indent" }, // RES_POOLCOLL_TEXT_IDENT // { "Body Text First Indent 2", "" }, // { "Note Heading", "" }, // { "Body Text 2", "" }, @@ -1550,15 +1562,16 @@ OUString StyleSheetTable::ConvertStyleName( const OUString& rWWName, bool bExten // { "Body Text Indent 2", "" }, // { "Body Text Indent 3", "" }, // { "Block Text", "" }, - { "Hyperlink", "Internet link" }, - { "FollowedHyperlink", "Visited Internet Link" }, - { "Emphasis", "Emphasis" }, + { "Hyperlink", "Internet link" }, // RES_POOLCHR_INET_NORMAL + { "FollowedHyperlink", "Visited Internet Link" }, // RES_POOLCHR_INET_VISIT + { "Strong", "Strong Emphasis" }, // RES_POOLCHR_HTML_STRONG + { "Emphasis", "Emphasis" }, // RES_POOLCHR_HTML_EMPHASIS // { "Document Map", "" }, // { "Plain Text", "" }, { "NoList", "No List" }, { "AbstractHeading", "Abstract Heading" }, { "AbstractBody", "Abstract Body" }, - { "PageNumber", "page number" }, + { "PageNumber", "Page Number" }, // RES_POOLCHR_PAGENO { "TableNormal", "Normal Table" }, { "DocumentMap", "Document Map" }, }; @@ -1577,10 +1590,17 @@ OUString StyleSheetTable::ConvertStyleName( const OUString& rWWName, bool bExten set.insert(pair.second); return set; }(); - // SwStyleNameMapper doc says: If the UI style name equals a - // programmatic name, then it must append " (user)" to the end. - if (ReservedStyleNames.find(sRet) != ReservedStyleNames.end()) - sRet += " (user)"; + // Similar to SwStyleNameMapper convention (where a " (user)" suffix is used to + // disambiguate user styles with reserved names in localization where respective + // built-in styles have different UI names), we add a " (WW)" suffix here. Unlike + // the " (user)" suffix, it is not hidden from the UI; it will be handled when + // exported to Word formats - see MSWordStyles::BuildWwNames. + // We can't use the " (user)" suffix, because that system is built upon the assumption + // that UI names of respective built-in styles are different from the user style name. + // That is not necessarily true here, since the current localization may not change + // the UI names of built-in styles. + if (ReservedStyleNames.find(sRet) != ReservedStyleNames.end() || sRet.endsWith(" (WW)")) + sRet += " (WW)"; } return sRet; |