From 7d4ad3fa74674fff06f52eec0abc8dc7691a89b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= Date: Mon, 12 May 2025 20:29:47 +0200 Subject: [PATCH] tdf#155707 sw DOCX: fix Kashida justification import/export/layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix missing import/export of DOCX w:jc=lowKashida/mediumKashida/ highKashida justification settings. Add visualization support using 133%, 200% and 300% word spacing for them. Kashida justification allows typesetting less compressed Arabic text, but this layout lost in Writer, also lost in DOCX/Word completely at DOCX export of Writer (the settings weren't grab-bagged). Note: instead of grab-bagging (which applied only at table properties yet in the case of w:jc), these minimum = desired = maximum word spacing values carry the Kashida justification setting. (DOCX cannot support custom word spacing, so this doesn't interfere with the other settings.) Follow-up to commit 5a48070f5904c51dc9e7bbad4213d802fd4bc89b "tdf#126154 sw offapi xmloff cui: add min/max word spacing", and commit 7d6696757dcdfa3cee481ac7795a91b2b47da363 "tdf#159923 sw cui offapi xmloff: add custom word spacing". Change-Id: Icc41a69742ae604d091c6429441261742fe6f763 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185233 Reviewed-by: László Németh Tested-by: Jenkins --- sw/qa/extras/ooxmlexport/data/tdf155707.docx | Bin 0 -> 13012 bytes sw/qa/extras/ooxmlexport/ooxmlexport14.cxx | 12 ++++++++++ sw/source/core/text/portxt.cxx | 6 ++++- sw/source/filter/ww8/docxattributeoutput.cxx | 19 +++++++++++++++ .../writerfilter/dmapper/DomainMapper.cxx | 22 ++++++++++++++++++ .../writerfilter/dmapper/PropertyIds.cxx | 3 +++ .../writerfilter/dmapper/PropertyIds.hxx | 3 +++ 7 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 sw/qa/extras/ooxmlexport/data/tdf155707.docx diff --git a/sw/qa/extras/ooxmlexport/data/tdf155707.docx b/sw/qa/extras/ooxmlexport/data/tdf155707.docx new file mode 100644 index 0000000000000000000000000000000000000000..47c4d4664c56a329938f52e3686450c1332f2d48 GIT binary patch literal 13012 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 literal 0 HcmV?d00001 diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx index f8293de0e2c5..3f0b7fb53d54 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx @@ -757,6 +757,18 @@ DECLARE_OOXMLEXPORT_TEST(testTdf161628, "tdf132599_frames_on_right_pages_no_hyph CPPUNIT_ASSERT_EQUAL( static_cast(0), getProperty(xStyle, u"ParaHyphenationZone"_ustr)); } +CPPUNIT_TEST_FIXTURE(Test, testTdf155707) +{ + loadAndSave("tdf155707.docx"); + + xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr); + CPPUNIT_ASSERT(pXmlDoc); + // Without the accompanying fix in place, this test would have failed + assertXPath(pXmlDoc, "/w:document/w:body/w:p[13]/w:pPr/w:jc", "val", u"lowKashida"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[15]/w:pPr/w:jc", "val", u"mediumKashida"); + assertXPath(pXmlDoc, "/w:document/w:body/w:p[17]/w:pPr/w:jc", "val", u"highKashida"); +} + CPPUNIT_TEST_FIXTURE(Test, testTdf161643) { loadAndSave("fdo76163.docx"); diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx index 7ee01437ebf3..be365fef2d64 100644 --- a/sw/source/core/text/portxt.cxx +++ b/sw/source/core/text/portxt.cxx @@ -369,7 +369,11 @@ bool SwTextPortion::Format_( SwTextFormatInfo &rInf ) pGuess->BreakPos() != TextFrameIndex(COMPLETE_STRING); bool bInteropSmartJustify = bFullJustified && rInf.GetTextFrame()->GetDoc().getIDocumentSettingAccess().get( - DocumentSettingId::JUSTIFY_LINES_WITH_SHRINKING); + DocumentSettingId::JUSTIFY_LINES_WITH_SHRINKING) && + // support different Kashida etc. values + aAdjustItem.GetPropWordSpacing() == 100 && + aAdjustItem.GetPropWordSpacingMinimum() == 100 && + aAdjustItem.GetPropWordSpacingMaximum() == 100; bool bWordSpacing = bFullJustified && !bInteropSmartJustify && aAdjustItem.GetPropWordSpacing() != 100; bool bWordSpacingMaximum = bFullJustified && !bInteropSmartJustify && diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 899d6fdbf5dc..8e9177170c7f 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -9076,11 +9076,30 @@ void DocxAttributeOutput::ParaAdjust( const SvxAdjustItem& rAdjust ) break; case SvxAdjust::BlockLine: case SvxAdjust::Block: + { if (rAdjust.GetLastBlock() == SvxAdjust::Block) pAdjustString = "distribute"; else pAdjustString = "both"; + switch ( rAdjust.GetPropWordSpacingMinimum() ) + { + case 133: + if ( rAdjust.GetPropWordSpacingMaximum() == 133 ) + pAdjustString = "lowKashida"; + break; + case 200: + if ( rAdjust.GetPropWordSpacingMaximum() == 200 ) + pAdjustString = "mediumKashida"; + break; + case 300: + if ( rAdjust.GetPropWordSpacingMaximum() == 300 ) + pAdjustString = "highKashida"; + break; + default: + break; + } break; + } case SvxAdjust::Center: pAdjustString = "center"; break; diff --git a/sw/source/writerfilter/dmapper/DomainMapper.cxx b/sw/source/writerfilter/dmapper/DomainMapper.cxx index a1018b9c65c1..fc8cc458a262 100644 --- a/sw/source/writerfilter/dmapper/DomainMapper.cxx +++ b/sw/source/writerfilter/dmapper/DomainMapper.cxx @@ -4880,6 +4880,7 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::to style::ParagraphAdjust nAdjust = style::ParagraphAdjust_LEFT; style::ParagraphAdjust nLastLineAdjust = style::ParagraphAdjust_LEFT; OUString aStringValue = u"left"_ustr; + sal_uInt16 nWordSpacing = 100; switch(nIntValue) { case NS_ooxml::LN_Value_ST_Jc_center: @@ -4898,6 +4899,21 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::to nAdjust = style::ParagraphAdjust_BLOCK; aStringValue = "both"; break; + case NS_ooxml::LN_Value_ST_Jc_lowKashida: + nAdjust = style::ParagraphAdjust_BLOCK; + // modify this value also in sw/source/filter/ww8/docxattributeoutput.cxx + nWordSpacing = 133; + break; + case NS_ooxml::LN_Value_ST_Jc_mediumKashida: + nAdjust = style::ParagraphAdjust_BLOCK; + // modify this value also in sw/source/filter/ww8/docxattributeoutput.cxx + nWordSpacing = 200; + break; + case NS_ooxml::LN_Value_ST_Jc_highKashida: + nAdjust = style::ParagraphAdjust_BLOCK; + // modify this value also in sw/source/filter/ww8/docxattributeoutput.cxx + nWordSpacing = 300; + break; case NS_ooxml::LN_Value_ST_Jc_left: case NS_ooxml::LN_Value_ST_Jc_start: default: @@ -4906,6 +4922,12 @@ void DomainMapper::handleParaJustification(const sal_Int32 nIntValue, const ::to } rContext->Insert( PROP_PARA_ADJUST, uno::Any( nAdjust ) ); rContext->Insert( PROP_PARA_LAST_LINE_ADJUST, uno::Any( nLastLineAdjust ) ); + if ( nWordSpacing > 100 ) + { + rContext->Insert( PROP_PARA_WORD_SPACING, uno::Any( nWordSpacing ) ); + rContext->Insert( PROP_PARA_WORD_SPACING_MINIMUM, uno::Any( nWordSpacing ) ); + rContext->Insert( PROP_PARA_WORD_SPACING_MAXIMUM, uno::Any( nWordSpacing ) ); + } m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, u"jc"_ustr, aStringValue); } diff --git a/sw/source/writerfilter/dmapper/PropertyIds.cxx b/sw/source/writerfilter/dmapper/PropertyIds.cxx index 1049295a4aec..b3ca6ce2d6fa 100644 --- a/sw/source/writerfilter/dmapper/PropertyIds.cxx +++ b/sw/source/writerfilter/dmapper/PropertyIds.cxx @@ -123,6 +123,9 @@ const OUString & getPropertyName( PropertyIds eId ) { PROP_PARA_RIGHT_BORDER_DISTANCE, u"ParaRightBorderDistance"_ustr}, { PROP_PARA_BORDER_RIGHT_COMPLEX_COLOR, u"ParaRightBorderComplexColor"_ustr}, { PROP_PARA_WIDOWS, u"ParaWidows"_ustr}, + { PROP_PARA_WORD_SPACING, u"ParaWordSpacing"_ustr}, + { PROP_PARA_WORD_SPACING_MAXIMUM, u"ParaWordSpacingMaximum"_ustr}, + { PROP_PARA_WORD_SPACING_MINIMUM, u"ParaWordSpacingMinimum"_ustr}, { PROP_PARA_ORPHANS, u"ParaOrphans"_ustr}, { PROP_PARA_LINE_NUMBER_START_VALUE, u"ParaLineNumberStartValue"_ustr}, { PROP_NUMBERING_LEVEL, u"NumberingLevel"_ustr}, diff --git a/sw/source/writerfilter/dmapper/PropertyIds.hxx b/sw/source/writerfilter/dmapper/PropertyIds.hxx index f9d5cb52806f..80dcafcb8501 100644 --- a/sw/source/writerfilter/dmapper/PropertyIds.hxx +++ b/sw/source/writerfilter/dmapper/PropertyIds.hxx @@ -280,6 +280,9 @@ enum PropertyIds ,PROP_PARA_RIGHT_BORDER_DISTANCE ,PROP_PARA_BORDER_RIGHT_COMPLEX_COLOR ,PROP_PARA_WIDOWS + ,PROP_PARA_WORD_SPACING + ,PROP_PARA_WORD_SPACING_MAXIMUM + ,PROP_PARA_WORD_SPACING_MINIMUM ,PROP_PAPER_TRAY ,PROP_PARENT_NUMBERING ,PROP_POSITION_AND_SPACE_MODE