diff options
author | Justin Luth <justin.luth@collabora.com> | 2020-11-19 19:58:16 +0300 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2020-11-27 12:15:18 +0100 |
commit | 5951a867b87cbb88886968c1e2059f2cf461d11c (patch) | |
tree | d510b71dd30c0f040b283ec141bbd02937e5d323 | |
parent | 60ec1659924be692de2985d2b1a5363976db6ca1 (diff) |
tdf#138345 sw ms export: Char highlight: no export to char-style
MS Word ignores w:highlight in a character style.
It only accepts it as direct formatting or in para-styles.
So never export the character background as w:highlight,
but always as w:shd for character styles.
Change-Id: I7c9f4f00d957a8add848746051d3c4b1522d1520
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106182
Tested-by: Jenkins
Reviewed-by: Justin Luth <justin_luth@sil.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r-- | sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt | bin | 0 -> 13304 bytes | |||
-rw-r--r-- | sw/qa/extras/globalfilter/globalfilter.cxx | 46 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8atr.cxx | 7 |
3 files changed, 53 insertions, 0 deletions
diff --git a/sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt b/sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt Binary files differnew file mode 100644 index 000000000000..6886ed8f71c6 --- /dev/null +++ b/sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx index a2ef4d318ca6..bb9521823783 100644 --- a/sw/qa/extras/globalfilter/globalfilter.cxx +++ b/sw/qa/extras/globalfilter/globalfilter.cxx @@ -48,6 +48,7 @@ public: void testCharHighlight(); void testCharHighlightODF(); void testCharHighlightBody(); + void testCharStyleHighlight(); void testMSCharBackgroundEditing(); void testCharBackgroundToHighlighting(); #if !defined(_WIN32) @@ -574,16 +575,61 @@ void Test::testCharHighlightBody() } } +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) + { + if (mxComponent.is()) + mxComponent->dispose(); + mxComponent = loadFromDesktop(m_directories.getURLFromSrc("/sw/qa/extras/globalfilter/data/tdf138345_charstyle_highlight.odt"), + "com.sun.star.text.TextDocument"); + + const OString sFailedMessage = OStringLiteral("Failed on filter: ") + rFilterName.toUtf8(); + + // Export the document and import again for a check + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); + + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= rFilterName; + + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + xStorable->storeToURL(aTempFile.GetURL(), aMediaDescriptor.getAsConstPropertyValueList()); + uno::Reference< lang::XComponent > xComponent(xStorable, uno::UNO_QUERY); + xComponent->dispose(); + mxComponent = loadFromDesktop(aTempFile.GetURL(), "com.sun.star.text.TextDocument"); + + uno::Reference<beans::XPropertySet> xCharStyle; + getStyles("CharacterStyles")->getByName("charBackground") >>= xCharStyle; + const sal_Int32 nBackColor(0xFFDBB6); //orange-y + + // Always export character style's background colour as shading, never as highlighting. + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(COL_TRANSPARENT), getProperty<sal_Int32>(xCharStyle,"CharHighlight")); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), nBackColor, getProperty<sal_Int32>(xCharStyle,"CharBackColor")); + } +} + void Test::testCharHighlight() { SvtFilterOptions& rOpt = SvtFilterOptions::Get(); rOpt.SetCharBackground2Shading(); testCharHighlightBody(); + testCharStyleHighlight(); rOpt.SetCharBackground2Highlighting(); testCharHighlightBody(); + testCharStyleHighlight(); } void Test::testCharHighlightODF() diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 0da5f1fb4c1c..ef5ea8b38ae6 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -5556,6 +5556,13 @@ void AttributeOutputBase::CharBackgroundBase( const SvxBrushItem& rBrush ) bool bConvertToShading = SvtFilterOptions::Get().IsCharBackground2Shading(); bool bHasShadingMarker = false; + // MS Word doesn't support highlight in character styles. Always export those as shading. + if ( !bConvertToShading && GetExport().m_bStyDef ) + { + const SwFormat* pFormat = dynamic_cast<const SwFormat*>( GetExport().m_pOutFormatNode ); + bConvertToShading = pFormat && pFormat->Which() == RES_CHRFMT; + } + // Check shading marker const SfxPoolItem* pItem = GetExport().HasItem(RES_CHRATR_GRABBAG); if( pItem ) |