sw/qa/extras/ooxmlexport/ooxmlexport14.cxx | 11 +++++++++++ sw/source/filter/ww8/docxexport.cxx | 4 ++++ sw/source/writerfilter/dmapper/SettingsTable.cxx | 15 +++++++++++++++ sw/source/writerfilter/dmapper/SettingsTable.hxx | 1 + 4 files changed, 31 insertions(+)
New commits: commit 64365dfa67d5a1d8fbc710238a4ea9c492645de4 Author: László Németh <nem...@numbertext.org> AuthorDate: Wed Jun 19 00:14:21 2024 +0200 Commit: László Németh <nem...@numbertext.org> CommitDate: Wed Jun 19 09:08:56 2024 +0200 tdf#161643 sw DOCX import/export of maximum consecutive hyphenated lines Fix line break interoperability by importing w:consecutiveHyphenLimit to ParaHyphenationMaxHyphens, and exporting ParaHyphenationMacHyphens to w:consecutiveHyphenLimit in OOXML import/export filters. Change-Id: I5f40bcff34ebebeabc0de9898955abda4dc34cde Reviewed-on: https://gerrit.libreoffice.org/c/core/+/169127 Tested-by: Jenkins Reviewed-by: László Németh <nem...@numbertext.org> diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx index d1e3647b9826..9a19ca827700 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx @@ -801,6 +801,17 @@ DECLARE_OOXMLEXPORT_TEST(testTdf161628, "tdf132599_frames_on_right_pages_no_hyph CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int16>(0), getProperty<sal_Int16>(xStyle, u"ParaHyphenationZone"_ustr)); } +CPPUNIT_TEST_FIXTURE(Test, testTdf161643) +{ + loadAndSave("fdo76163.docx"); + xmlDocUniquePtr pXmlSettings = parseExport(u"word/settings.xml"_ustr); + assertXPath(pXmlSettings, "/w:settings/w:consecutiveHyphenLimit"_ostr, "val"_ostr, u"1"_ustr); + + uno::Reference<beans::XPropertySet> xStyle(getStyles(u"ParagraphStyles"_ustr)->getByName(u"Standard"_ustr), uno::UNO_QUERY); + // This was false (value 0) + CPPUNIT_ASSERT_EQUAL( static_cast<sal_Int16>(1), getProperty<sal_Int16>(xStyle, u"ParaHyphenationMaxHyphens"_ustr)); +} + CPPUNIT_TEST_FIXTURE(Test, testTdf121658) { loadAndSave("tdf121658.docx"); diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx index 149c52f4d6fa..911b2cddc50f 100644 --- a/sw/source/filter/ww8/docxexport.cxx +++ b/sw/source/filter/ww8/docxexport.cxx @@ -1220,6 +1220,10 @@ void DocxExport::WriteSettings() bHyphenationZone = true; } + if ( sal_Int16 nMaxHyphens = pZoneItem->GetMaxHyphens() ) + pFS->singleElementNS(XML_w, XML_consecutiveHyphenLimit, FSNS(XML_w, XML_val), + OString::number(nMaxHyphens)); + if ( pZoneItem->IsKeep() && pZoneItem->GetKeepType() ) bHyphenationKeep = true; } diff --git a/sw/source/writerfilter/dmapper/SettingsTable.cxx b/sw/source/writerfilter/dmapper/SettingsTable.cxx index 5d4642f0cb33..fa67518ced65 100644 --- a/sw/source/writerfilter/dmapper/SettingsTable.cxx +++ b/sw/source/writerfilter/dmapper/SettingsTable.cxx @@ -93,6 +93,7 @@ struct SettingsTable_Impl bool m_bAutoHyphenation; bool m_bNoHyphenateCaps; sal_Int16 m_nHyphenationZone; + sal_Int16 m_nConsecutiveHyphenLimit; sal_Int16 m_nUseWord2013TrackBottomHyphenation; sal_Int16 m_nAllowHyphenationAtTrackBottom; bool m_bWidowControl; @@ -142,6 +143,7 @@ struct SettingsTable_Impl , m_bAutoHyphenation(false) , m_bNoHyphenateCaps(false) , m_nHyphenationZone( 360 ) // default is 1/4 in + , m_nConsecutiveHyphenLimit(0) , m_nUseWord2013TrackBottomHyphenation(-1) , m_nAllowHyphenationAtTrackBottom(-1) , m_bWidowControl(false) @@ -298,6 +300,9 @@ void SettingsTable::lcl_sprm(Sprm& rSprm) case NS_ooxml::LN_CT_Settings_hyphenationZone: // 92508; m_pImpl->m_nHyphenationZone = nIntValue; break; + case NS_ooxml::LN_CT_Settings_consecutiveHyphenLimit: + m_pImpl->m_nConsecutiveHyphenLimit = nIntValue; + break; case NS_ooxml::LN_CT_Compat_useFELayout: // 92422; // useFELayout (Do Not Bypass East Asian/Complex Script Layout Code - support of old versions of Word - ignored) break; @@ -556,6 +561,11 @@ sal_Int16 SettingsTable::GetHyphenationZone() const return m_pImpl->m_nHyphenationZone; } +sal_Int16 SettingsTable::GetConsecutiveHyphenLimit() const +{ + return m_pImpl->m_nConsecutiveHyphenLimit; +} + bool SettingsTable::GetHyphenationKeep() const { // if allowHyphenationAtTrackBottom is not true and useWord2013TrackBottomHyphenation is @@ -716,6 +726,11 @@ void SettingsTable::ApplyProperties(rtl::Reference<SwXTextDocument> const& xDoc) uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY); xPropertySet->setPropertyValue(u"ParaHyphenationZone"_ustr, uno::Any(GetHyphenationZone())); } + if (m_pImpl->m_nConsecutiveHyphenLimit) + { + uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY); + xPropertySet->setPropertyValue(u"ParaHyphenationMaxHyphens"_ustr, uno::Any(GetConsecutiveHyphenLimit())); + } if (m_pImpl->m_bWidowControl && lcl_isDefault(xPropertyState, u"ParaWidows"_ustr) && lcl_isDefault(xPropertyState, u"ParaOrphans"_ustr)) { uno::Reference<beans::XPropertySet> xPropertySet(xDefault, uno::UNO_QUERY); diff --git a/sw/source/writerfilter/dmapper/SettingsTable.hxx b/sw/source/writerfilter/dmapper/SettingsTable.hxx index c71f4bddf081..e8fd9c3a38d0 100644 --- a/sw/source/writerfilter/dmapper/SettingsTable.hxx +++ b/sw/source/writerfilter/dmapper/SettingsTable.hxx @@ -79,6 +79,7 @@ public: bool GetNoLeading() const; bool GetNoHyphenateCaps() const; sal_Int16 GetHyphenationZone() const; + sal_Int16 GetConsecutiveHyphenLimit() const; bool GetHyphenationKeep() const; const OUString& GetDecimalSymbol() const;