cui/source/inc/paragrph.hxx | 2 cui/source/tabpages/paragrph.cxx | 12 cui/uiconfig/ui/textflowpage.ui | 55 ++- editeng/source/items/paraitem.cxx | 13 include/editeng/editrids.hrc | 1 include/editeng/hyphenzoneitem.hxx | 6 include/editeng/memberids.h | 3 include/linguistic/lngprophelp.hxx | 4 include/sfx2/msg.hxx | 2 include/unotools/linguprops.hxx | 4 include/xmloff/xmltoken.hxx | 1 lingucomponent/source/hyphenator/hyphen/hyphenimp.cxx | 82 ++++ linguistic/source/lngprophelp.cxx | 14 offapi/com/sun/star/style/ParagraphProperties.idl | 16 schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng | 17 svx/sdi/svxitems.sdi | 1 sw/inc/inspectorproperties.hrc | 1 sw/inc/unoprnms.hxx | 2 sw/qa/extras/layout/data/tdf158885_compound-remain.fodt | 1 sw/qa/extras/layout/data/tdf158885_not_compound-remain.fodt | 1 sw/qa/extras/layout/data/tdf170177_compound-push.fodt | 206 ++++++++++++ sw/qa/extras/layout/data/tdf170177_not_compound-push.fodt | 196 +++++++++++ sw/qa/extras/layout/layout2.cxx | 86 +++++ sw/qa/uitest/styleInspector/styleInspector.py | 20 - sw/qa/uitest/styleInspector/tdf137513.py | 2 sw/source/core/text/guess.cxx | 4 sw/source/core/text/inftxt.cxx | 44 +- sw/source/core/unocore/unomapproperties.hxx | 2 sw/source/uibase/sidebar/WriterInspectorTextPanel.cxx | 2 xmloff/inc/xmlprop.hxx | 2 xmloff/source/core/xmltoken.cxx | 1 xmloff/source/text/txtprmap.cxx | 3 xmloff/source/token/tokens.txt | 1 33 files changed, 747 insertions(+), 60 deletions(-)
New commits: commit 391ea3bcb54698461bfb0f7be996cf95b91ebb0f Author: László Németh <[email protected]> AuthorDate: Mon Dec 29 10:46:49 2025 +0100 Commit: László Németh <[email protected]> CommitDate: Wed Dec 31 22:54:05 2025 +0100 tdf#170177 cui offapi sw xmloff: hyphenate at constituent boundaries Add new minimum character limit paragraph property to limit hyphenation left to the compound constituent boundaries: com::sun::star::text::ParaHyphenationCompoundMinTrailingChars – With the previous option for the hyphenation right to the constituent boundary, this new option allow to limit or disable hyphenation completely inside the compound constituents, or hyphenate only at constituent boundaries, with or without inside the suffix of the word or constituents; – xmloff: add "no-limit" to loext:hyphenation-compound-push-char-count and loext:hyphenation-compound-push-char-count; – "no-limit" values of this and the *LeadingChars option mean a maximum value. When both *LeadingChars and *TrailingChars got "no-limit", hyphenation before and inside the suffixes are forbidden, i.e. it is allowed only at constituent boundaries; – textflowpage.ui: set max character count to 99, in both options; – fix ParaHyphenationCompoundMinLeadingChars implementation for compound words with multiple constituents, when the middle word(s) are shorter, than the limit (e.g. Hungarian "tűz|kő|pattintás" wasn't hyphenated as "tűzkő-pattintás", only as "tűz-kőpattintás"). Follow-up to commit 3a332d9f1cacb3c6f81fcf6c08afa51d091ddff4 "tdf#158885 cui offapi sw xmloff: fix hyphenation at stem boundary" and commit c899d3608d30f3ab4c2bc193c1fcd765221614a4 "tdf#158885 sw: don't hyphenate right after a stem boundary". Change-Id: I0b71562727332217364f9ace85e8ac6ea3abc8b1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196345 Reviewed-by: László Németh <[email protected]> Tested-by: Jenkins diff --git a/cui/source/inc/paragrph.hxx b/cui/source/inc/paragrph.hxx index 8ab678c83f6f..9d634d879ca2 100644 --- a/cui/source/inc/paragrph.hxx +++ b/cui/source/inc/paragrph.hxx @@ -266,6 +266,8 @@ private: std::unique_ptr<weld::SpinButton> m_xExtHyphenAfterBox; std::unique_ptr<weld::Label> m_xCompoundBeforeText; std::unique_ptr<weld::SpinButton> m_xExtCompoundHyphenBeforeBox; + std::unique_ptr<weld::Label> m_xCompoundAfterText; + std::unique_ptr<weld::SpinButton> m_xExtCompoundHyphenAfterBox; std::unique_ptr<weld::Label> m_xMaxHyphenLabel; std::unique_ptr<weld::SpinButton> m_xMaxHyphenEdit; std::unique_ptr<weld::Label> m_xMinWordLabel; diff --git a/cui/source/tabpages/paragrph.cxx b/cui/source/tabpages/paragrph.cxx index 3ed39ff47ac6..7133dd5017ad 100644 --- a/cui/source/tabpages/paragrph.cxx +++ b/cui/source/tabpages/paragrph.cxx @@ -1868,6 +1868,7 @@ bool SvxExtParagraphTabPage::FillItemSet( SfxItemSet* rOutSet ) m_xExtHyphenBeforeBox->get_value_changed_from_saved() || m_xExtHyphenAfterBox->get_value_changed_from_saved() || m_xExtCompoundHyphenBeforeBox->get_value_changed_from_saved() || + m_xExtCompoundHyphenAfterBox->get_value_changed_from_saved() || m_xMaxHyphenEdit->get_value_changed_from_saved() || m_xMinWordLength->get_value_changed_from_saved() || m_aHyphenZone.get_value_changed_from_saved() || @@ -1892,6 +1893,7 @@ bool SvxExtParagraphTabPage::FillItemSet( SfxItemSet* rOutSet ) aHyphen.GetMinLead() = static_cast<sal_uInt8>(m_xExtHyphenBeforeBox->get_value()); aHyphen.GetMinTrail() = static_cast<sal_uInt8>(m_xExtHyphenAfterBox->get_value()); aHyphen.GetCompoundMinLead() = static_cast<sal_uInt8>(m_xExtCompoundHyphenBeforeBox->get_value()); + aHyphen.GetCompoundMinTrail() = static_cast<sal_uInt8>(m_xExtCompoundHyphenAfterBox->get_value()); aHyphen.GetMinWordLength() = static_cast<sal_uInt8>(m_xMinWordLength->get_value()); } aHyphen.GetMaxHyphens() = static_cast<sal_uInt8>(m_xMaxHyphenEdit->get_value()); @@ -2152,6 +2154,7 @@ void SvxExtParagraphTabPage::Reset( const SfxItemSet* rSet ) m_xExtHyphenBeforeBox->set_value(rHyphen.GetMinLead()); m_xExtHyphenAfterBox->set_value(rHyphen.GetMinTrail()); m_xExtCompoundHyphenBeforeBox->set_value(rHyphen.GetCompoundMinLead()); + m_xExtCompoundHyphenAfterBox->set_value(rHyphen.GetCompoundMinTrail()); m_xMaxHyphenEdit->set_value(rHyphen.GetMaxHyphens()); m_xMinWordLength->set_value(rHyphen.GetMinWordLength()); m_aHyphenZone.SetFieldUnit(eFUnit); @@ -2200,9 +2203,11 @@ void SvxExtParagraphTabPage::Reset( const SfxItemSet* rSet ) m_xExtHyphenBeforeBox->set_sensitive(bEnable); m_xExtHyphenAfterBox->set_sensitive(bEnable); m_xExtCompoundHyphenBeforeBox->set_sensitive(bEnable); + m_xExtCompoundHyphenAfterBox->set_sensitive(bEnable); m_xBeforeText->set_sensitive(bEnable); m_xAfterText->set_sensitive(bEnable); m_xCompoundBeforeText->set_sensitive(bEnable); + m_xCompoundAfterText->set_sensitive(bEnable); m_xMaxHyphenLabel->set_sensitive(bEnable); m_xMaxHyphenEdit->set_sensitive(bEnable); m_xMinWordLabel->set_sensitive(bEnable); @@ -2499,6 +2504,7 @@ void SvxExtParagraphTabPage::ChangesApplied() m_xExtHyphenBeforeBox->save_value(); m_xExtHyphenAfterBox->save_value(); m_xExtCompoundHyphenBeforeBox->save_value(); + m_xExtCompoundHyphenAfterBox->save_value(); m_xMaxHyphenEdit->save_value(); m_xMinWordLength->save_value(); m_aHyphenZone.save_value(); @@ -2560,6 +2566,8 @@ SvxExtParagraphTabPage::SvxExtParagraphTabPage(weld::Container* pPage, weld::Dia , m_xExtHyphenAfterBox(m_xBuilder->weld_spin_button(u"spinLineBegin"_ustr)) , m_xCompoundBeforeText(m_xBuilder->weld_label(u"labelCompoundLineEnd"_ustr)) , m_xExtCompoundHyphenBeforeBox(m_xBuilder->weld_spin_button(u"spinCompoundLineEnd"_ustr)) + , m_xCompoundAfterText(m_xBuilder->weld_label(u"labelCompoundLineBegin"_ustr)) + , m_xExtCompoundHyphenAfterBox(m_xBuilder->weld_spin_button(u"spinCompoundLineBegin"_ustr)) , m_xMaxHyphenLabel(m_xBuilder->weld_label(u"labelMaxNum"_ustr)) , m_xMaxHyphenEdit(m_xBuilder->weld_spin_button(u"spinMaxNum"_ustr)) , m_xMinWordLabel(m_xBuilder->weld_label(u"labelMinLen"_ustr)) @@ -2652,7 +2660,9 @@ SvxExtParagraphTabPage::SvxExtParagraphTabPage(weld::Container* pPage, weld::Dia m_xAfterText->set_sensitive(false); m_xExtHyphenAfterBox->set_sensitive(false); m_xCompoundBeforeText->set_sensitive(false); + m_xCompoundAfterText->set_sensitive(false); m_xExtCompoundHyphenBeforeBox->set_sensitive(false); + m_xExtCompoundHyphenAfterBox->set_sensitive(false); m_xMaxHyphenLabel->set_sensitive(false); m_xMaxHyphenEdit->set_sensitive(false); m_xMinWordLabel->set_sensitive(false); @@ -2804,7 +2814,9 @@ void SvxExtParagraphTabPage::HyphenClickHdl() m_xAfterText->set_sensitive(bEnable); m_xExtHyphenAfterBox->set_sensitive(bEnable); m_xCompoundBeforeText->set_sensitive(bEnable); + m_xCompoundAfterText->set_sensitive(bEnable); m_xExtCompoundHyphenBeforeBox->set_sensitive(bEnable); + m_xExtCompoundHyphenAfterBox->set_sensitive(bEnable); m_xMaxHyphenLabel->set_sensitive(bEnable); m_xMaxHyphenEdit->set_sensitive(bEnable); m_xMinWordLabel->set_sensitive(bEnable); diff --git a/cui/uiconfig/ui/textflowpage.ui b/cui/uiconfig/ui/textflowpage.ui index 99dd498d15d3..c61e3b96871d 100644 --- a/cui/uiconfig/ui/textflowpage.ui +++ b/cui/uiconfig/ui/textflowpage.ui @@ -54,8 +54,8 @@ <property name="page-increment">10</property> </object> <object class="GtkAdjustment" id="adjustment9"> - <property name="lower">2</property> - <property name="upper">9</property> + <property name="lower">0</property> + <property name="upper">99</property> <property name="value">2</property> <property name="step-increment">1</property> <property name="page-increment">10</property> @@ -80,6 +80,13 @@ <property name="step-increment">1</property> <property name="page-increment">10</property> </object> + <object class="GtkAdjustment" id="adjustment14"> + <property name="lower">0</property> + <property name="upper">99</property> + <property name="value">2</property> + <property name="step-increment">1</property> + <property name="page-increment">10</property> + </object> <!-- n-columns=2 n-rows=2 --> <object class="GtkGrid" id="TextFlowPage"> <property name="visible">True</property> @@ -141,7 +148,7 @@ </object> <packing> <property name="left-attach">0</property> - <property name="top-attach">5</property> + <property name="top-attach">6</property> </packing> </child> <child> @@ -161,7 +168,7 @@ </object> <packing> <property name="left-attach">0</property> - <property name="top-attach">4</property> + <property name="top-attach">5</property> </packing> </child> <child> @@ -175,7 +182,7 @@ <property name="truncate-multiline">True</property> <child internal-child="accessible"> <object class="AtkObject" id="spinCompoundLineEnd-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="textflowpage|extended_tip|spinCompoundLineEnd">Enter the minimum number of characters of a compound word to leave at the end of the line before a hyphen is inserted.</property> + <property name="AtkObject::accessible-description" translatable="yes" context="textflowpage|extended_tip|spinCompoundLineEnd">Enter the minimum number of characters of a compound word constituent to leave at the end of the line before a hyphen is inserted.</property> </object> </child> </object> @@ -184,6 +191,26 @@ <property name="top-attach">3</property> </packing> </child> + <child> + <object class="GtkSpinButton" id="spinCompoundLineBegin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="halign">start</property> + <property name="margin-start">25</property> + <property name="activates_default">True</property> + <property name="adjustment">adjustment14</property> + <property name="truncate-multiline">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="spinCompoundLineBegin-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="textflowpage|extended_tip|spinCompoundLineBegin">Enter the minimum number of characters of a compound word constituent that must appear at the beginning of the line after the hyphen.</property> + </object> + </child> + </object> + <packing> + <property name="left-attach">0</property> + <property name="top-attach">4</property> + </packing> + </child> <child> <object class="GtkSpinButton" id="spinLineBegin"> <property name="visible">True</property> @@ -266,6 +293,20 @@ <property name="top_attach">3</property> </packing> </child> + <child> + <object class="GtkLabel" id="labelCompoundLineBegin"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">start</property> + <property name="label" translatable="yes" context="textflowpage|labelCompoundLineBegin">C_ompound characters at line begin</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">spinCompoundLineBegin</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">4</property> + </packing> + </child> <child> <object class="GtkLabel" id="labelMaxNum"> <property name="visible">True</property> @@ -277,7 +318,7 @@ </object> <packing> <property name="left-attach">1</property> - <property name="top-attach">4</property> + <property name="top-attach">5</property> </packing> </child> <child> @@ -291,7 +332,7 @@ </object> <packing> <property name="left-attach">1</property> - <property name="top-attach">5</property> + <property name="top-attach">6</property> </packing> </child> <child> diff --git a/editeng/source/items/paraitem.cxx b/editeng/source/items/paraitem.cxx index 885ad3c9172f..fccc0aa00fcf 100644 --- a/editeng/source/items/paraitem.cxx +++ b/editeng/source/items/paraitem.cxx @@ -630,7 +630,8 @@ SvxHyphenZoneItem::SvxHyphenZoneItem( const bool bHyph, const sal_uInt16 nId ) : nTextHyphenZoneSpread(0), nKeepType(css::text::ParagraphHyphenationKeepType::COLUMN), bKeepLine(false), - nCompoundMinLead(0) + nCompoundMinLead(2), + nCompoundMinTrail(2) { } @@ -688,6 +689,9 @@ bool SvxHyphenZoneItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) con case MID_HYPHEN_COMPOUND_MIN_LEAD: rVal <<= static_cast<sal_Int16>(nCompoundMinLead); break; + case MID_HYPHEN_COMPOUND_MIN_TRAIL: + rVal <<= static_cast<sal_Int16>(nCompoundMinTrail); + break; } return true; } @@ -755,6 +759,9 @@ bool SvxHyphenZoneItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) case MID_HYPHEN_COMPOUND_MIN_LEAD: nCompoundMinLead = static_cast<sal_uInt8>(nNewVal); break; + case MID_HYPHEN_COMPOUND_MIN_TRAIL: + nCompoundMinTrail = static_cast<sal_uInt8>(nNewVal); + break; } return true; } @@ -772,6 +779,7 @@ bool SvxHyphenZoneItem::operator==( const SfxPoolItem& rAttr ) const && rItem.nMinLead == nMinLead && rItem.nMinTrail == nMinTrail && rItem.nCompoundMinLead == nCompoundMinLead + && rItem.nCompoundMinTrail == nCompoundMinTrail && rItem.nMaxHyphens == nMaxHyphens && rItem.nMinWordLength == nMinWordLength && rItem.nTextHyphenZone == nTextHyphenZone @@ -808,6 +816,7 @@ bool SvxHyphenZoneItem::GetPresentation OUString::number( nMinLead ) + cpDelimTmp + OUString::number( nMinTrail ) + cpDelimTmp + OUString::number( nCompoundMinLead ) + cpDelimTmp + + OUString::number( nCompoundMinTrail ) + cpDelimTmp + OUString::number( nMaxHyphens ) + cpDelimTmp + OUString::number( nMinWordLength ) + cpDelimTmp + GetMetricText( nTextHyphenZone, eCoreUnit, ePresUnit, &rIntl ) + @@ -856,6 +865,8 @@ bool SvxHyphenZoneItem::GetPresentation cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_COMPOUND_MINLEAD).replaceAll("%1", OUString::number(nCompoundMinLead)) + cpDelimTmp + + EditResId(RID_SVXITEMS_HYPHEN_COMPOUND_MINTRAIL).replaceAll("%1", OUString::number(nCompoundMinTrail)) + + cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_MAX).replaceAll("%1", OUString::number(nMaxHyphens)) + cpDelimTmp + EditResId(RID_SVXITEMS_HYPHEN_MINWORDLEN).replaceAll("%1", OUString::number(nMinWordLength)); diff --git a/include/editeng/editrids.hrc b/include/editeng/editrids.hrc index 83713f7d15cd..7990ae9a1e10 100644 --- a/include/editeng/editrids.hrc +++ b/include/editeng/editrids.hrc @@ -242,6 +242,7 @@ #define RID_SVXITEMS_HYPHEN_MINLEAD NC_("RID_SVXITEMS_HYPHEN_MINLEAD", "%1 characters at end of line") #define RID_SVXITEMS_HYPHEN_MINTRAIL NC_("RID_SVXITEMS_HYPHEN_MINTRAIL", "%1 characters at beginning of line") #define RID_SVXITEMS_HYPHEN_COMPOUND_MINLEAD NC_("RID_SVXITEMS_HYPHEN_COMPOUND_MINLEAD", "%1 compound word characters at end of line") +#define RID_SVXITEMS_HYPHEN_COMPOUND_MINTRAIL NC_("RID_SVXITEMS_HYPHEN_COMPOUND_MINTRAIL", "%1 compound word characters at beginning of line") #define RID_SVXITEMS_HYPHEN_MAX NC_("RID_SVXITEMS_HYPHEN_MAX", "%1 hyphens") #define RID_SVXITEMS_HYPHEN_NO_CAPS_TRUE NC_("RID_SVXITEMS_HYPHEN_NO_CAPS_TRUE", "Not hyphenated CAPS") #define RID_SVXITEMS_HYPHEN_LAST_WORD_TRUE NC_("RID_SVXITEMS_HYPHEN_NO_CAPS_FALSE", "Not hyphenated last word") diff --git a/include/editeng/hyphenzoneitem.hxx b/include/editeng/hyphenzoneitem.hxx index 84f4ac333ecc..5e57f73ee156 100644 --- a/include/editeng/hyphenzoneitem.hxx +++ b/include/editeng/hyphenzoneitem.hxx @@ -47,7 +47,8 @@ class EDITENG_DLLPUBLIC SvxHyphenZoneItem final : public SfxPoolItem sal_uInt16 nTextHyphenZoneSpread; // don't force hyphenation at spread end, allow this extra white space sal_uInt8 nKeepType; // avoid hyphenation across page etc., see ParagraphHyphenationKeep bool bKeepLine : 1; // if bKeep, shift the hyphenated word (true), or the full line - sal_uInt8 nCompoundMinLead; // min. characters between compound word boundary and hyphenation + sal_uInt8 nCompoundMinLead; // min. characters between left compound word boundary and hyphenation + sal_uInt8 nCompoundMinTrail; // min. characters between hyphenation and right compound word boundary public: static SfxPoolItem* CreateDefault(); @@ -88,6 +89,9 @@ public: sal_uInt8 &GetCompoundMinLead() { return nCompoundMinLead; } sal_uInt8 GetCompoundMinLead() const { return nCompoundMinLead; } + sal_uInt8 &GetCompoundMinTrail() { return nCompoundMinTrail; } + sal_uInt8 GetCompoundMinTrail() const { return nCompoundMinTrail; } + sal_uInt8 &GetMaxHyphens() { return nMaxHyphens; } sal_uInt8 GetMaxHyphens() const { return nMaxHyphens; } diff --git a/include/editeng/memberids.h b/include/editeng/memberids.h index 944664bc0ecf..3fc273b9fc9b 100644 --- a/include/editeng/memberids.h +++ b/include/editeng/memberids.h @@ -58,7 +58,8 @@ #define MID_HYPHEN_KEEP 12 #define MID_HYPHEN_KEEP_TYPE 13 #define MID_HYPHEN_COMPOUND_MIN_LEAD 14 -#define MID_HYPHEN_KEEP_LINE 15 +#define MID_HYPHEN_COMPOUND_MIN_TRAIL 15 +#define MID_HYPHEN_KEEP_LINE 16 // SvxBoxInfoItem #define MID_HORIZONTAL 1 diff --git a/include/linguistic/lngprophelp.hxx b/include/linguistic/lngprophelp.hxx index 19bef926c243..e28897e09e63 100644 --- a/include/linguistic/lngprophelp.hxx +++ b/include/linguistic/lngprophelp.hxx @@ -239,6 +239,7 @@ class PropertyHelper_Hyphen final : sal_Int16 nHyphMinLeading, nHyphMinTrailing, nHyphCompoundMinLeading, + nHyphCompoundMinTrailing, nHyphMinWordLength, nHyphTextHyphenZone; bool bNoHyphenateCaps; @@ -247,6 +248,7 @@ class PropertyHelper_Hyphen final : sal_Int16 nResHyphMinLeading, nResHyphMinTrailing, nResHyphCompoundMinLeading, + nResHyphCompoundMinTrailing, nResHyphMinWordLength, nResHyphTextHyphenZone; bool bResNoHyphenateCaps; @@ -275,6 +277,7 @@ public: sal_Int16 GetMinLeading() const { return nResHyphMinLeading; } sal_Int16 GetMinTrailing() const { return nResHyphMinTrailing; } sal_Int16 GetCompoundMinLeading() const { return nResHyphCompoundMinLeading; } + sal_Int16 GetCompoundMinTrailing() const { return nResHyphCompoundMinTrailing; } sal_Int16 GetMinWordLength() const { return nResHyphMinWordLength; } bool IsNoHyphenateCaps() const { return bResNoHyphenateCaps; } }; @@ -299,6 +302,7 @@ public: sal_Int16 GetMinLeading() const; sal_Int16 GetMinTrailing() const; sal_Int16 GetCompoundMinLeading() const; + sal_Int16 GetCompoundMinTrailing() const; sal_Int16 GetMinWordLength() const; bool IsNoHyphenateCaps() const; /// @throws css::uno::RuntimeException diff --git a/include/sfx2/msg.hxx b/include/sfx2/msg.hxx index 21e108a4b2e3..7d6a39ef88e6 100644 --- a/include/sfx2/msg.hxx +++ b/include/sfx2/msg.hxx @@ -138,12 +138,12 @@ SFX_DECL_TYPE(5); SFX_DECL_TYPE(6); SFX_DECL_TYPE(7); SFX_DECL_TYPE(8); -SFX_DECL_TYPE(9); // for SvxHyphenZoneItem SFX_DECL_TYPE(10); // for SfxDocInfoItem SFX_DECL_TYPE(11); SFX_DECL_TYPE(13); // for SwAddPrinterItem, Sd... SFX_DECL_TYPE(14); +SFX_DECL_TYPE(15); // for SvxHyphenZoneItem SFX_DECL_TYPE(16); // for SwDocDisplayItem SFX_DECL_TYPE(17); // for SvxAddressItem SFX_DECL_TYPE(23); // for SvxSearchItem diff --git a/include/unotools/linguprops.hxx b/include/unotools/linguprops.hxx index dd57dc089d05..3130157a5a3b 100644 --- a/include/unotools/linguprops.hxx +++ b/include/unotools/linguprops.hxx @@ -38,6 +38,7 @@ inline constexpr OUString UPN_IS_SPELL_WITH_DIGITS = u"IsSpellWithDig inline constexpr OUString UPN_HYPH_MIN_LEADING = u"HyphMinLeading"_ustr; inline constexpr OUString UPN_HYPH_MIN_TRAILING = u"HyphMinTrailing"_ustr; inline constexpr OUString UPN_HYPH_COMPOUND_MIN_LEADING = u"HyphCompoundMinLeading"_ustr; +inline constexpr OUString UPN_HYPH_COMPOUND_MIN_TRAILING = u"HyphCompoundMinTrailing"_ustr; inline constexpr OUString UPN_HYPH_MIN_WORD_LENGTH = u"HyphMinWordLength"_ustr; inline constexpr OUString UPN_HYPH_NO_CAPS = u"HyphNoCaps"_ustr; inline constexpr OUString UPN_HYPH_NO_LAST_WORD = u"HyphNoLastWord"_ustr; @@ -122,7 +123,8 @@ inline constexpr OUString UPN_IS_GRAMMAR_INTERACTIVE = u"IsInteractiveG #define UPH_HYPH_KEEP 38 #define UPH_HYPH_KEEP_TYPE 39 #define UPH_HYPH_COMPOUND_MIN_LEADING 40 -#define UPH_HYPH_KEEP_LINE 41 +#define UPH_HYPH_COMPOUND_MIN_TRAILING 41 +#define UPH_HYPH_KEEP_LINE 42 #ifdef __GNUC__ #pragma GCC diagnostic pop diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx index 1a1e23730e8f..18d855cb5a6d 100644 --- a/include/xmloff/xmltoken.hxx +++ b/include/xmloff/xmltoken.hxx @@ -1075,6 +1075,7 @@ namespace xmloff::token { XML_HYPHENATION_ZONE_PAGE, XML_HYPHENATION_ZONE_SPREAD, XML_HYPHENATION_COMPOUND_REMAIN_CHAR_COUNT, + XML_HYPHENATION_COMPOUND_PUSH_CHAR_COUNT, XML_I, XML_ICON, XML_ICON_SET, diff --git a/lingucomponent/source/hyphenator/hyphen/hyphenimp.cxx b/lingucomponent/source/hyphenator/hyphen/hyphenimp.cxx index c447451bc981..4d6d4b1e6719 100644 --- a/lingucomponent/source/hyphenator/hyphen/hyphenimp.cxx +++ b/lingucomponent/source/hyphenator/hyphen/hyphenimp.cxx @@ -346,6 +346,7 @@ hyphenation_result getHyphens(std::u16string_view word, const HDInfo& hdInfo, sa HyphenDict* dict = hdInfo.aPtr; const bool failed = 0 != hnj_hyphen_hyphenate3( dict, encWord.getStr(), n, hyphens.get(), nullptr, &rep, &pos, &cut, minLead, minTrail, + // TODO add "no-limit"/0 clh/crh support to libhyphen, also add minCompoundLead/Trail support std::max<sal_Int16>(dict->clhmin, 2) + std::max(0, minLead - std::max<sal_Int16>(dict->lhmin, 2)), std::max<sal_Int16>(dict->crhmin, 2) + std::max(0, minTrail - std::max<sal_Int16>(dict->rhmin, 2)) ); return { n, failed, rep, pos, cut, std::move(hyphens) }; // buffers will free in dtor @@ -390,6 +391,7 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo sal_Int16 minTrail = rHelper.GetMinTrailing(); sal_Int16 minLead = rHelper.GetMinLeading(); sal_Int16 minCompoundLead = rHelper.GetCompoundMinLeading(); + sal_Int16 minCompoundTrail = rHelper.GetCompoundMinTrailing(); sal_Int16 minLen = rHelper.GetMinWordLength(); bool bNoHyphenateCaps = rHelper.IsNoHyphenateCaps(); @@ -399,6 +401,10 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo int nHyphenationPos = -1; int nHyphenationPosAlt = -1; int nHyphenationPosAltHyph = -1; + int nPrevHyphenationPos = -1; + int nPrevHyphenationPosAlt = -1; + int nPrevHyphenationPosAltHyph = -1; + int nCompoundHyphenationPos = -1; // hyphenate the word with that dictionary rtl_TextEncoding eEnc = pHDInfo->eEnc; @@ -432,6 +438,8 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo { int leftrep = 0; bool hit = (result.n >= minLen); + bool compoundhit = (result.n >= 1) && (result.hyphens[i] & 1);; + bool bPrevCompound = false; if (!result.rep || !result.rep[i]) { hit = hit && (result.hyphens[i] & 1) && (i < Leading); @@ -455,11 +463,22 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo hit = hit && ((i + leftrep - result.pos[i]) >= (minLead-1) ); hit = hit && ((result.n - i - 1 + sal::static_int_cast< sal_sSize >(strlen(result.rep[i])) - leftrep - 1) >= minTrail); } - if (hit) + if (hit || compoundhit) { - // skip hyphenation right after stem boundaries in compound words + // skip hyphenation inside compound constituents right after constituent boundaries in compound words // if minCompoundLead > 2 (default value: less than n=minCompoundLead character distance) - if ( bCompoundHyphenation && minCompoundLead > 2 && nHyphenationPos > -1 && i - nHyphenationPos < minCompoundLead ) + // or always skip hyphenation inside compound constituents, if minCompoundLead == 0, + // also skip hyphenation inside compound constituents right before constituent boundaries in compound words + // or always skip hyphenation inside compound consituents, if minCompoundTrail == 0 + // if both minCompoundLead and minCompoundTrail == 0, don't hyphenate inside suffixes, too + if ( bCompoundHyphenation && (nCompoundHyphenationPos > -1 || minCompoundLead == 0 || minCompoundTrail > 2 || minCompoundTrail == 0 ) && + // check minimal distance from the left constituent boundary + ( ( minCompoundLead > 2 && i - nCompoundHyphenationPos < minCompoundLead ) || + // check minimal distance from the right constituent boundary + ( minCompoundTrail > 2 && i - nCompoundHyphenationPos < minCompoundTrail ) || + // special value: zero compound limit means forbidden hyphenation + // inside (stems of) compound constituents + minCompoundLead == 0 || minCompoundTrail == 0 ) ) { uno::Reference< XLinguServiceManager2 > xLngSvcMgr( GetLngSvcMgr_Impl() ); uno::Reference< XSpellChecker1 > xSpell; @@ -575,6 +594,7 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo { sal_Int32 nLetters = 0; // count not separator characters sal_Int32 nSepPos = -1; // position of last character | used for stem boundaries + sal_Int32 nSepLetterPos = -1; // letter position of the character associated to nSepPos bool bWeightedSep = false; // double separator || = weighted stem boundary sal_Int32 j = 0; for (; j < sStems.getLength() && nLetters <= i; j++) @@ -583,26 +603,55 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo { bWeightedSep = nSepPos > -1 && (j - 1 == nSepPos); nSepPos = j; + nSepLetterPos = nLetters; } else if ( sStems[j] != '-' && sStems[j] != '=' && sStems[j] != '*' ) ++nLetters; } - // skip break points near stem boundaries - if ( + // skip break points near after the stem boundaries + if ( hit && + // too close to the left break point or special case? + ( i - nCompoundHyphenationPos < minCompoundLead || minCompoundLead == 0 ) && // there is a stem boundary before the actual break point nSepPos > -1 && // and the break point is within a stem, i.e. not in the - // suffix of the last stem - i < aWord.getLength() - nSuffixLen - 1 && + // suffix of the last stem or both minCompoundLead and + // minCompoundTrail == 0, i.e. hyphenation is allowed only + // at compound constituent boundaries + ( i < aWord.getLength() - nSuffixLen - 1 || + ( minCompoundLead == 0 && minCompoundTrail == 0) ) && // and it is not another stem boundary j + 1 < sStems.getLength() && - ( sStems[j + 1] != u'|' || + ( sStems[j] != u'|' || // except if it's only the previous was a weighted one - ( bWeightedSep && ( j + 2 == sStems.getLength() || - sStems[j + 2] != u'|' ) ) ) ) + ( bWeightedSep && ( j + 1 == sStems.getLength() || + sStems[j + 1] != u'|' ) ) ) ) { continue; } + // skip break points near before the stem boundaries + // (hit is not mandatory, only compondhit, because the + // compound boundary can be after the lead limit) + if (!hit && + // too close to the right break point? + ( i - nCompoundHyphenationPos < minCompoundTrail || minCompoundTrail == 0 ) && + // and the break point is within a stem, i.e. not in the + // suffix of the last stem suffix or both minCompoundLead and + // minCompoundTrail == 0, i.e. hyphenation is allowed only + // at compound constituent boundaries + ( i < aWord.getLength() - nSuffixLen - 1 || + ( minCompoundLead == 0 && minCompoundTrail == 0) ) && + // and it is a stem boundary + j + 1 < sStems.getLength() && sStems[j+1] == u'|' && + // the previous break point is not a boundary + (nSepPos == -1 || nCompoundHyphenationPos != nSepLetterPos - 1 ) ) + { + nHyphenationPos = nPrevHyphenationPos; + nHyphenationPosAlt = nPrevHyphenationPosAlt; + nHyphenationPosAltHyph = nPrevHyphenationPosAltHyph; + continue; + } + bPrevCompound = nSepPos == j || nSepPos == j - 1; } else // not a compound word @@ -613,9 +662,20 @@ Reference< XHyphenatedWord > SAL_CALL Hyphenator::hyphenate( const OUString& aWo bCompoundHyphenation = false; } - nHyphenationPos = i; + nCompoundHyphenationPos = i; + if (hit) + { + if ( bPrevCompound ) + nPrevHyphenationPos = nHyphenationPos; + nHyphenationPos = i; + } if (result.rep && result.rep[i]) { + if ( bPrevCompound ) + { + nPrevHyphenationPosAlt = nHyphenationPosAlt; + nPrevHyphenationPosAltHyph = nHyphenationPosAltHyph; + } nHyphenationPosAlt = i - result.pos[i]; nHyphenationPosAltHyph = i + leftrep - result.pos[i]; } diff --git a/linguistic/source/lngprophelp.cxx b/linguistic/source/lngprophelp.cxx index 6cd56c11f5d7..833edabcc96c 100644 --- a/linguistic/source/lngprophelp.cxx +++ b/linguistic/source/lngprophelp.cxx @@ -492,6 +492,7 @@ void PropertyHelper_Hyphen::SetDefaultValues() nResHyphMinLeading = nHyphMinLeading = 2; nResHyphMinTrailing = nHyphMinTrailing = 2; nResHyphCompoundMinLeading = nHyphCompoundMinLeading = 2; + nResHyphCompoundMinTrailing = nHyphCompoundMinTrailing = 2; nResHyphMinWordLength = nHyphMinWordLength = 0; nResHyphTextHyphenZone = nHyphTextHyphenZone = 0; bResNoHyphenateCaps = bNoHyphenateCaps = false; @@ -528,6 +529,11 @@ void PropertyHelper_Hyphen::GetCurrentValues() pnVal = &nHyphCompoundMinLeading; pnResVal = &nResHyphCompoundMinLeading; } + if ( rPropName == UPN_HYPH_COMPOUND_MIN_TRAILING ) + { + pnVal = &nHyphCompoundMinTrailing; + pnResVal = &nResHyphCompoundMinTrailing; + } else if ( rPropName == UPN_HYPH_MIN_WORD_LENGTH ) { pnVal = &nHyphMinWordLength; @@ -571,6 +577,7 @@ bool PropertyHelper_Hyphen::propertyChange_Impl( const PropertyChangeEvent& rEvt case UPH_HYPH_MIN_LEADING : pnVal = &nHyphMinLeading; break; case UPH_HYPH_MIN_TRAILING : pnVal = &nHyphMinTrailing; break; case UPH_HYPH_COMPOUND_MIN_LEADING : pnVal = &nHyphCompoundMinLeading; break; + case UPH_HYPH_COMPOUND_MIN_TRAILING : pnVal = &nHyphCompoundMinTrailing; break; case UPH_HYPH_MIN_WORD_LENGTH : pnVal = &nHyphMinWordLength; break; case UPH_HYPH_ZONE : pnVal = &nHyphTextHyphenZone; break; case UPH_HYPH_NO_CAPS : pbVal = &bNoHyphenateCaps; break; @@ -626,6 +633,8 @@ void PropertyHelper_Hyphen::SetTmpPropVals( const PropertyValues &rPropVals ) pnResVal = &nResHyphMinTrailing; if ( rVal.Name == UPN_HYPH_COMPOUND_MIN_LEADING ) pnResVal = &nResHyphCompoundMinLeading; + if ( rVal.Name == UPN_HYPH_COMPOUND_MIN_TRAILING ) + pnResVal = &nResHyphCompoundMinTrailing; else if ( rVal.Name == UPN_HYPH_MIN_WORD_LENGTH ) pnResVal = &nResHyphMinWordLength; else if ( rVal.Name == UPN_HYPH_ZONE ) @@ -718,6 +727,11 @@ sal_Int16 PropertyHelper_Hyphenation::GetCompoundMinLeading() const return mxPropHelper->GetCompoundMinLeading(); } +sal_Int16 PropertyHelper_Hyphenation::GetCompoundMinTrailing() const +{ + return mxPropHelper->GetCompoundMinTrailing(); +} + sal_Int16 PropertyHelper_Hyphenation::GetMinWordLength() const { return mxPropHelper->GetMinWordLength(); diff --git a/offapi/com/sun/star/style/ParagraphProperties.idl b/offapi/com/sun/star/style/ParagraphProperties.idl index c18217a1bf79..6e391ee56096 100644 --- a/offapi/com/sun/star/style/ParagraphProperties.idl +++ b/offapi/com/sun/star/style/ParagraphProperties.idl @@ -563,7 +563,7 @@ published service ParagraphProperties @see ParaLetterSpacingMaximum - @since LibreOffice 26.3 + @since LibreOffice 26.2 */ [optional, property] long ParaLetterSpacingMinimum; @@ -577,7 +577,7 @@ published service ParagraphProperties @see ParaLetterSpacingMininum - @since LibreOffice 26.3 + @since LibreOffice 26.2 */ [optional, property] long ParaLetterSpacingMaximum; @@ -591,7 +591,7 @@ published service ParagraphProperties @see ParaScaleWidthMaximum - @since LibreOffice 26.3 + @since LibreOffice 26.2 */ [optional, property] long ParaScaleWidthMinimum; @@ -605,9 +605,17 @@ published service ParagraphProperties @see ParaScaleWidthMininum - @since LibreOffice 26.3 + @since LibreOffice 26.2 */ [optional, property] long ParaScaleWidthMaximum; + + /** specifies the minimum number of characters of the compound word part + that must appear at the beginning of the line after the hyphen character + (when hyphenation is applied). + + @since LibreOffice 26.8 + */ + [optional, property] short ParaHyphenationCompoundMinTrailingChars; }; diff --git a/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng b/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng index 0721512cbf7b..a3c7eb909c84 100644 --- a/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng +++ b/schema/libreoffice/OpenDocument-v1.4+libreoffice-schema.rng @@ -3087,7 +3087,22 @@ xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1. <rng:define name="style-text-properties-attlist" combine="interleave"> <rng:optional> <rng:attribute name="loext:hyphenation-compound-remain-char-count"> - <rng:ref name="positiveInteger"/> + <rng:choice> + <rng:value>no-limit</rng:value> + <rng:ref name="positiveInteger"/> + </rng:choice> + </rng:attribute> + </rng:optional> + </rng:define> + + <!-- TODO no proposal --> + <rng:define name="style-text-properties-attlist" combine="interleave"> + <rng:optional> + <rng:attribute name="loext:hyphenation-compound-push-char-count"> + <rng:choice> + <rng:value>no-limit</rng:value> + <rng:ref name="positiveInteger"/> + </rng:choice> </rng:attribute> </rng:optional> </rng:define> diff --git a/svx/sdi/svxitems.sdi b/svx/sdi/svxitems.sdi index fca1b739b832..c8f298648760 100644 --- a/svx/sdi/svxitems.sdi +++ b/svx/sdi/svxitems.sdi @@ -290,6 +290,7 @@ struct SvxHyphenZone INT16 HyphenKeepType MID_HYPHEN_KEEP_TYPE; BOOL HyphenKeepLine MID_HYPHEN_KEEP_LINE; INT16 MinLead MID_HYPHEN_COMPOUND_MIN_LEAD; + INT16 MinTrail MID_HYPHEN_COMPOUND_MIN_TRAIL; }; item SvxHyphenZone SvxHyphenZoneItem; diff --git a/sw/inc/inspectorproperties.hrc b/sw/inc/inspectorproperties.hrc index f4b42273de8e..8fc10dc5071b 100644 --- a/sw/inc/inspectorproperties.hrc +++ b/sw/inc/inspectorproperties.hrc @@ -207,6 +207,7 @@ #define RID_PARA_HYPHENATION_MAX_LEADING_CHARS NC_("RID_ATTRIBUTE_NAMES_MAP", "Para Hyphenation Min Leading Chars") #define RID_PARA_HYPHENATION_MAX_TRAILING_CHARS NC_("RID_ATTRIBUTE_NAMES_MAP", "Para Hyphenation Min Trailing Chars") #define RID_PARA_HYPHENATION_COMPOUND_MIN_LEADING_CHARS NC_("RID_ATTRIBUTE_NAMES_MAP", "Para Hyphenation Compound Min Leading Chars") +#define RID_PARA_HYPHENATION_COMPOUND_MIN_TRAILING_CHARS NC_("RID_ATTRIBUTE_NAMES_MAP", "Para Hyphenation Compound Min Trailing Chars") #define RID_PARA_HYPHENATION_NO_CAPS NC_("RID_ATTRIBUTE_NAMES_MAP", "Para Hyphenation No Caps") #define RID_PARA_HYPHENATION_NO_LAST_WORD NC_("RID_ATTRIBUTE_NAMES_MAP", "Para Hyphenation No Last Word") #define RID_PARA_HYPHENATION_MIN_WORD_LENGTH NC_("RID_ATTRIBUTE_NAMES_MAP", "Para Hyphenation Min Word Length") diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx index 27981e05db01..08b08cc85307 100644 --- a/sw/inc/unoprnms.hxx +++ b/sw/inc/unoprnms.hxx @@ -74,6 +74,8 @@ inline constexpr OUString UNO_NAME_PARA_HYPHENATION_MAX_TRAILING_CHARS = u"ParaHyphenationMaxTrailingChars"_ustr; inline constexpr OUString UNO_NAME_PARA_HYPHENATION_COMPOUND_MIN_LEADING_CHARS = u"ParaHyphenationCompoundMinLeadingChars"_ustr; +inline constexpr OUString UNO_NAME_PARA_HYPHENATION_COMPOUND_MIN_TRAILING_CHARS + = u"ParaHyphenationCompoundMinTrailingChars"_ustr; inline constexpr OUString UNO_NAME_PARA_HYPHENATION_MAX_HYPHENS = u"ParaHyphenationMaxHyphens"_ustr; inline constexpr OUString UNO_NAME_PARA_HYPHENATION_MIN_WORD_LENGTH = u"ParaHyphenationMinWordLength"_ustr; diff --git a/sw/qa/extras/layout/data/tdf158885_compound-remain.fodt b/sw/qa/extras/layout/data/tdf158885_compound-remain.fodt index 7fbf782319dc..6c0366fab902 100644 --- a/sw/qa/extras/layout/data/tdf158885_compound-remain.fodt +++ b/sw/qa/extras/layout/data/tdf158885_compound-remain.fodt @@ -190,6 +190,7 @@ <office:body> <office:text> <text:p text:style-name="P1">emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes </text:p> + <text:p text:style-name="P1">kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat,,, kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat</text:p> </office:text> </office:body> </office:document> diff --git a/sw/qa/extras/layout/data/tdf158885_not_compound-remain.fodt b/sw/qa/extras/layout/data/tdf158885_not_compound-remain.fodt index bd53db4e9ee6..6ba2c290e395 100644 --- a/sw/qa/extras/layout/data/tdf158885_not_compound-remain.fodt +++ b/sw/qa/extras/layout/data/tdf158885_not_compound-remain.fodt @@ -190,6 +190,7 @@ <office:body> <office:text> <text:p text:style-name="P1">emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes </text:p> + <text:p text:style-name="P1">kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat,,, kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat</text:p> </office:text> </office:body> </office:document> diff --git a/sw/qa/extras/layout/data/tdf170177_compound-push.fodt b/sw/qa/extras/layout/data/tdf170177_compound-push.fodt new file mode 100644 index 000000000000..ccebc5b14f5c --- /dev/null +++ b/sw/qa/extras/layout/data/tdf170177_compound-push.fodt @@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:c alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns: meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:meta><meta:creation-date>2024-03-18T08:37:10.032919314</meta:creation-date><dc:date>2024-03-18T12:28:13.103241731</dc:date><meta:editing-duration>PT9M33S</meta:editing-duration><meta:editing-cycles>6</meta:editing-cycles><meta:generator>LibreOfficeDev/24.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/1650efbb077010d595860a707cf5bfb7df50f8f4</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="1" meta:word-count="21" meta:character-count="273" meta:non-whitespace-character-count="252"/></office:meta> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaWidth" config:type="long">40748</config:config-item> + <config:config-item config:name="ViewAreaHeight" config:type="long">13866</config:config-item> + <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item> + <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item> + <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintSingleJobs" config:type="boolean">true</config:config-item> + <config:config-item config:name="JustifyLinesWithShrinking" config:type="boolean">false</config:config-item> + <config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">true</config:config-item> + <config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item> + <config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item> + <config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item> + <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintFaxName" config:type="string"/> + <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item> + <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item> + <config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">false</config:config-item> + <config:config-item config:name="FloattableNomargins" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseVariableWidthNBSP" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="RsidRoot" config:type="int">1001492</config:config-item> + <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="Rsid" config:type="int">1360405</config:config-item> + <config:config-item config:name="FootnoteInColumnToPageEnd" config:type="boolean">true</config:config-item> + <config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item> + <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddParaLineSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item> + <config:config-item config:name="HyphenateURLs" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item> + <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary"/> + <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item> + <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item> + <config:config-item config:name="DropCapPunctuation" config:type="boolean">true</config:config-item> + <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrinterName" config:type="string"/> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item> + <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item> + <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintPageBackground" config:type="boolean">false</config:config-item> + <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> + <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item> + <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/> + <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item> + <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">true</config:config-item> + <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item> + <config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item> + <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item> + <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item> + <config:config-item config:name="GutterAtTop" config:type="boolean">false</config:config-item> + <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item> + <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item> + <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommand" config:type="string"/> + <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item> + </config:config-item-set> + </office:settings> + <office:scripts> + <office:script script:language="ooo:Basic"> + <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </office:script> + </office:scripts> + <office:font-face-decls> + <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss"/> + <style:font-face style:name="DejaVu Sans" svg:font-family="'DejaVu Sans'" style:font-family-generic="swiss"/> + </office:font-face-decls> + <office:styles> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="8.5pt" draw:shadow-offset-y="8.5pt" draw:start-line-spacing-horizontal="8.02pt" draw:start-line-spacing-vertical="8.02pt" draw:end-line-spacing-horizontal="8.02pt" draw:end-line-spacing-vertical="8.02pt" style:writing-mode="lr-tb" style:flow-with-text="false"/> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0pt" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="DejaVu Sans" fo:font-size="12pt" fo:language="hu" fo:country="HU" style:letter-kerning="true"/> + </style:default-style> + <style:default-style style:family="paragraph"> + <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="35.46pt" style:writing-mode="page"/> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="DejaVu Sans" fo:font-size="12pt" fo:language="hu" fo:country="HU" style:letter-kerning="true" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/> + </style:default-style> + <style:default-style style:family="table"> + <style:table-properties table:border-model="collapsing"/> + </style:default-style> + <style:default-style style:family="table-row"> + <style:table-row-properties fo:keep-together="auto"/> + </style:default-style> + <style:style style:name="Standard" style:family="paragraph" style:class="text"/> + <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text"> + <style:paragraph-properties fo:margin-top="11.99pt" fo:margin-bottom="6.01pt" style:contextual-spacing="false" fo:keep-with-next="always"/> + <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" fo:font-size="14pt"/> + </style:style> + <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties fo:margin-top="0pt" fo:margin-bottom="7pt" style:contextual-spacing="false" fo:line-height="115%"/> + </style:style> + <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list"> + <style:text-properties style:font-name="DejaVu Sans" fo:font-family="'DejaVu Sans'" style:font-family-generic="swiss"/> + </style:style> + <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:margin-top="6.01pt" fo:margin-bottom="6.01pt" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/> + <style:text-properties style:font-name="DejaVu Sans" fo:font-family="'DejaVu Sans'" style:font-family-generic="swiss" fo:font-size="12pt" fo:font-style="italic"/> + </style:style> + <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index"> + <style:paragraph-properties text:number-lines="false" text:line-number="0"/> + <style:text-properties style:font-name="DejaVu Sans" fo:font-family="'DejaVu Sans'" style:font-family-generic="swiss"/> + </style:style> + </office:styles> + <office:automatic-styles> + <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard" style:master-page-name=""> + <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" style:page-number="auto"/> + <style:text-properties officeooo:rsid="000f4814" officeooo:paragraph-rsid="000f4814" fo:hyphenate="true" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="3" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit" loext:hyphenation-compound-remain-char-count="3" loext:hyphenation-compound-push-char-count="4"/> + </style:style> + <style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard" style:master-page-name=""> + <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" style:page-number="auto"/> + <style:text-properties officeooo:rsid="000f4814" officeooo:paragraph-rsid="000f4814" fo:hyphenate="true" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="3" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit" loext:hyphenation-compound-remain-char-count="no-limit" loext:hyphenation-compound-push-char-count="no-limit"/> + </style:style> + <style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard" style:master-page-name=""> + <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" style:page-number="auto"/> + <style:text-properties officeooo:rsid="000f4814" officeooo:paragraph-rsid="000f4814" fo:hyphenate="true" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="3" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit" loext:hyphenation-compound-remain-char-count="99" loext:hyphenation-compound-push-char-count="no-limit"/> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties fo:page-width="595.3pt" fo:page-height="841.89pt" style:num-format="1" style:print-orientation="portrait" fo:margin-top="56.69pt" fo:margin-bottom="56.69pt" fo:margin-left="56.69pt" fo:margin-right="56.69pt" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="20.01pt" style:layout-grid-ruby-height="10.01pt" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0pt" loext:margin-gutter="0pt"> + <style:footnote-sep style:width="0.51pt" style:distance-before-sep="2.86pt" style:distance-after-sep="2.86pt" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + </style:page-layout> + <style:style style:name="dp1" style:family="drawing-page"> + <style:drawing-page-properties draw:background-size="full"/> + </style:style> + </office:automatic-styles> + <office:master-styles> + <style:master-page style:name="Standard" style:page-layout-name="pm1" draw:style-name="dp1"/> + </office:master-styles> + <office:body> + <office:text> + <text:p text:style-name="P1">,,,,emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes </text:p> + <text:p text:style-name="P1">vasemberellenes vasemberellenes vasemberellenes vasemberellenes vasemberellenes vasemberellenes</text:p> + <text:p text:style-name="P2">,,,,,,,,,vizsgálattal balalajkavizsgálattal balalajkavizsgálattal balalajkavizsgálattal balalajkavizsgálattal</text:p> + <text:p text:style-name="P3">,,,,,,,,,vizsgálattal balalajkavizsgálattal balalajkavizsgálattal balalajkavizsgálattal balalajkavizsgálattal</text:p> + </office:text> + </office:body> +</office:document> diff --git a/sw/qa/extras/layout/data/tdf170177_not_compound-push.fodt b/sw/qa/extras/layout/data/tdf170177_not_compound-push.fodt new file mode 100644 index 000000000000..ec9d2a8afdcc --- /dev/null +++ b/sw/qa/extras/layout/data/tdf170177_not_compound-push.fodt @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:c alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns: meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:meta><meta:creation-date>2024-03-18T08:37:10.032919314</meta:creation-date><dc:date>2024-03-18T12:28:13.103241731</dc:date><meta:editing-duration>PT9M33S</meta:editing-duration><meta:editing-cycles>6</meta:editing-cycles><meta:generator>LibreOfficeDev/24.2.0.0.alpha0$Linux_X86_64 LibreOffice_project/1650efbb077010d595860a707cf5bfb7df50f8f4</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="1" meta:word-count="21" meta:character-count="273" meta:non-whitespace-character-count="252"/></office:meta> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaWidth" config:type="long">40748</config:config-item> + <config:config-item config:name="ViewAreaHeight" config:type="long">13866</config:config-item> + <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item> + <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item> + <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintSingleJobs" config:type="boolean">true</config:config-item> + <config:config-item config:name="JustifyLinesWithShrinking" config:type="boolean">false</config:config-item> + <config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">true</config:config-item> + <config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item> + <config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item> + <config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item> + <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintFaxName" config:type="string"/> + <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item> + <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item> + <config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">false</config:config-item> + <config:config-item config:name="FloattableNomargins" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseVariableWidthNBSP" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="RsidRoot" config:type="int">1001492</config:config-item> + <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="Rsid" config:type="int">1360405</config:config-item> + <config:config-item config:name="FootnoteInColumnToPageEnd" config:type="boolean">true</config:config-item> + <config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item> + <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddParaLineSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item> + <config:config-item config:name="HyphenateURLs" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item> + <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary"/> + <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item> + <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item> + <config:config-item config:name="DropCapPunctuation" config:type="boolean">true</config:config-item> + <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrinterName" config:type="string"/> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item> + <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item> + <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintPageBackground" config:type="boolean">false</config:config-item> + <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> + <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item> + <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/> + <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item> + <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">true</config:config-item> + <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item> + <config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item> + <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item> + <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item> + <config:config-item config:name="GutterAtTop" config:type="boolean">false</config:config-item> + <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item> + <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item> + <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommand" config:type="string"/> + <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item> + </config:config-item-set> + </office:settings> + <office:scripts> + <office:script script:language="ooo:Basic"> + <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </office:script> + </office:scripts> + <office:font-face-decls> + <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss"/> + <style:font-face style:name="DejaVu Sans" svg:font-family="'DejaVu Sans'" style:font-family-generic="swiss"/> + </office:font-face-decls> + <office:styles> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="8.5pt" draw:shadow-offset-y="8.5pt" draw:start-line-spacing-horizontal="8.02pt" draw:start-line-spacing-vertical="8.02pt" draw:end-line-spacing-horizontal="8.02pt" draw:end-line-spacing-vertical="8.02pt" style:writing-mode="lr-tb" style:flow-with-text="false"/> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0pt" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="DejaVu Sans" fo:font-size="12pt" fo:language="hu" fo:country="HU" style:letter-kerning="true"/> + </style:default-style> + <style:default-style style:family="paragraph"> + <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="35.46pt" style:writing-mode="page"/> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="DejaVu Sans" fo:font-size="12pt" fo:language="hu" fo:country="HU" style:letter-kerning="true" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/> + </style:default-style> + <style:default-style style:family="table"> + <style:table-properties table:border-model="collapsing"/> + </style:default-style> + <style:default-style style:family="table-row"> + <style:table-row-properties fo:keep-together="auto"/> + </style:default-style> + <style:style style:name="Standard" style:family="paragraph" style:class="text"/> + <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text"> + <style:paragraph-properties fo:margin-top="11.99pt" fo:margin-bottom="6.01pt" style:contextual-spacing="false" fo:keep-with-next="always"/> + <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" fo:font-size="14pt"/> + </style:style> + <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties fo:margin-top="0pt" fo:margin-bottom="7pt" style:contextual-spacing="false" fo:line-height="115%"/> + </style:style> + <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list"> + <style:text-properties style:font-name="DejaVu Sans" fo:font-family="'DejaVu Sans'" style:font-family-generic="swiss"/> + </style:style> + <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:margin-top="6.01pt" fo:margin-bottom="6.01pt" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/> + <style:text-properties style:font-name="DejaVu Sans" fo:font-family="'DejaVu Sans'" style:font-family-generic="swiss" fo:font-size="12pt" fo:font-style="italic"/> + </style:style> + <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index"> + <style:paragraph-properties text:number-lines="false" text:line-number="0"/> + <style:text-properties style:font-name="DejaVu Sans" fo:font-family="'DejaVu Sans'" style:font-family-generic="swiss"/> + </style:style> + </office:styles> + <office:automatic-styles> + <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard" style:master-page-name=""> + <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" style:page-number="auto"/> + <style:text-properties officeooo:rsid="000f4814" officeooo:paragraph-rsid="000f4814" fo:hyphenate="true" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="3" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit" loext:hyphenation-compound-remain-char-count="2" loext:hyphenation-compound-push-char-count="2"/> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties fo:page-width="595.3pt" fo:page-height="841.89pt" style:num-format="1" style:print-orientation="portrait" fo:margin-top="56.69pt" fo:margin-bottom="56.69pt" fo:margin-left="56.69pt" fo:margin-right="56.69pt" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="20.01pt" style:layout-grid-ruby-height="10.01pt" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0pt" loext:margin-gutter="0pt"> + <style:footnote-sep style:width="0.51pt" style:distance-before-sep="2.86pt" style:distance-after-sep="2.86pt" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + </style:page-layout> + <style:style style:name="dp1" style:family="drawing-page"> + <style:drawing-page-properties draw:background-size="full"/> + </style:style> + </office:automatic-styles> + <office:master-styles> + <style:master-page style:name="Standard" style:page-layout-name="pm1" draw:style-name="dp1"/> + </office:master-styles> + <office:body> + <office:text> + <text:p text:style-name="P1">,,,,emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes emberellenes </text:p> + <text:p text:style-name="P1">vasemberellenes vasemberellenes vasemberellenes vasemberellenes vasemberellenes vasemberellenes</text:p> + </office:text> + </office:body> +</office:document> diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx index 5a7cbd6873a7..1c7eecdffb36 100644 --- a/sw/qa/extras/layout/layout2.cxx +++ b/sw/qa/extras/layout/layout2.cxx @@ -1250,6 +1250,15 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf158885_compound_remain) u"emberellenes emberellenes emberellenes emberellenes emberellenes ember"); assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]", "portion", u"ellenes emberellenes emberellenes emberellenes emberellenes emberellenes "); + + // tdf#170177 fix hyphenation at the end of the middle constituent + // shorter than the minCompoundLead + // This was "kova=kőbányászat" (now "kovakő=bányászat) + // (allowed hyphenations: ko=va=kő=bányá=szat) + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]", "portion", + u"kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat kovakő"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout[2]", "portion", + u"bányászat,,, kovakőbányászat kovakőbányászat kovakőbányászat kovakő"); } CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf158885_not_compound_remain) @@ -1273,6 +1282,83 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf158885_not_compound_remain) u"emberellenes emberellenes emberellenes emberellenes emberellenes emberel"); assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]", "portion", u"lenes emberellenes emberellenes emberellenes emberellenes emberellenes "); + + // tdf#170177 fix hyphenation at the end of the middle constituent + // shorter than the minCompoundLead + // These are "kovakő=bányászat" and "kovakőbá=nyászat + // (all hyphenations are allowed: ko=va=kő=bá=nyá=szat) + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]", "portion", + u"kovakőbányászat kovakőbányászat kovakőbányászat kovakőbányászat kovakő"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout[2]", "portion", + u"bányászat,,, kovakőbányászat kovakőbányászat kovakőbányászat kovakőbá"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf170177_compound_push) +{ + uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale(u"hu"_ustr, u"HU"_ustr, OUString()))) + return; + + uno::Reference<linguistic2::XSpellChecker1> xSpell = LinguMgr::GetSpellChecker(); + LanguageType eLang + = LanguageTag::convertToLanguageType(lang::Locale(u"hu"_ustr, u"HU"_ustr, OUString())); + if (!xSpell.is() || !xSpell->hasLanguage(static_cast<sal_uInt16>(eLang))) + return; + + createSwDoc("tdf170177_compound-push.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // hyphenate compound word with 3- or more character distance from the stem boundary + // This was "em=berellenes" (now "emberellenes", i.e. no hyphenation) + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]", "portion", + u",,,,emberellenes emberellenes emberellenes emberellenes emberellenes "); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]", "portion", + u"emberellenes emberellenes emberellenes emberellenes emberellenes ember"); + + // This was "vasem=berellenes" (now "vas=emberellenes") + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]", "portion", + u"vasemberellenes vasemberellenes vasemberellenes vasemberellenes vas"); + + // special value: no-limit, if both -remain and -push values are not limited, there + // is hyphenation only at compound constituent boundaries (not in the suffixes, and + // not inside the first constituent + // balalajka=vizsgálattal, not balalajkavizsgálat=tal + assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout[1]", "portion", + u",,,,,,,,,vizsgálattal balalajkavizsgálattal balalajkavizsgálattal balalajka"); + + // no-limit -push value, while -remain = 99 (~no-limit, but hyphenation before and + // in the suffix is allowed) + assertXPath( + pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout[1]", "portion", + u",,,,,,,,,vizsgálattal balalajkavizsgálattal balalajkavizsgálattal balalajkavizsgálat"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout[2]", "portion", + u"tal balalajkavizsgálattal"); +} + +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf170177_not_compound_push) +{ + uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator(); + if (!xHyphenator->hasLocale(lang::Locale(u"hu"_ustr, u"HU"_ustr, OUString()))) + return; + + uno::Reference<linguistic2::XSpellChecker1> xSpell = LinguMgr::GetSpellChecker(); + LanguageType eLang + = LanguageTag::convertToLanguageType(lang::Locale(u"hu"_ustr, u"HU"_ustr, OUString())); + if (!xSpell.is() || !xSpell->hasLanguage(static_cast<sal_uInt16>(eLang))) + return; + + createSwDoc("tdf170177_not_compound-push.fodt"); + xmlDocUniquePtr pXmlDoc = parseLayoutDump(); + // hyphenate compound word with 3-character distance from the stem boundary, + // resulting less readable hyphenation "em=berellenes" (instead of + // "emberellenes" or "ember=ellenes") + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]", "portion", + u",,,,emberellenes emberellenes emberellenes emberellenes emberellenes em"); + assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]", "portion", + u"berellenes emberellenes emberellenes emberellenes emberellenes emberelle"); + + // (all hyphenations are allowed: vas=em=ber=elle=nes) + assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout[1]", "portion", + u"vasemberellenes vasemberellenes vasemberellenes vasemberellenes vasem"); } // TODO: move this test to the lingucomponent project diff --git a/sw/qa/uitest/styleInspector/styleInspector.py b/sw/qa/uitest/styleInspector/styleInspector.py index 1f044dfc4dec..70554e5307c1 100644 --- a/sw/qa/uitest/styleInspector/styleInspector.py +++ b/sw/qa/uitest/styleInspector/styleInspector.py @@ -26,7 +26,7 @@ class styleNavigator(UITestCase): # The cursor is on text without formatting and default style self.assertEqual(1, len(xListBox.getChild('0').getChildren())) self.assertEqual("Default Paragraph Style ", get_state_as_dict(xListBox.getChild('0').getChild('0'))['Text']) - self.assertEqual(156, len(xListBox.getChild('0').getChild('0').getChildren())) + self.assertEqual(157, len(xListBox.getChild('0').getChild('0').getChildren())) self.assertEqual(0, len(xListBox.getChild('1').getChildren())) self.assertEqual(0, len(xListBox.getChild('2').getChildren())) self.assertEqual(0, len(xListBox.getChild('3').getChildren())) @@ -36,7 +36,7 @@ class styleNavigator(UITestCase): # The cursor is on text with direct formatting self.assertEqual(1, len(xListBox.getChild('0').getChildren())) self.assertEqual("Default Paragraph Style ", get_state_as_dict(xListBox.getChild('0').getChild('0'))['Text']) - self.assertEqual(156, len(xListBox.getChild('0').getChild('0').getChildren())) + self.assertEqual(157, len(xListBox.getChild('0').getChild('0').getChildren())) self.assertEqual(0, len(xListBox.getChild('1').getChildren())) self.assertEqual(0, len(xListBox.getChild('2').getChildren())) @@ -54,7 +54,7 @@ class styleNavigator(UITestCase): # The cursor is on text with paragraph direct formatting self.assertEqual(1, len(xListBox.getChild('0').getChildren())) self.assertEqual("Default Paragraph Style ", get_state_as_dict(xListBox.getChild('0').getChild('0'))['Text']) - self.assertEqual(156, len(xListBox.getChild('0').getChild('0').getChildren())) + self.assertEqual(157, len(xListBox.getChild('0').getChild('0').getChildren())) xParDirFormatting = xListBox.getChild('1') self.assertEqual(7, len(xParDirFormatting.getChildren())) @@ -75,7 +75,7 @@ class styleNavigator(UITestCase): xParStyle = xListBox.getChild('0') self.assertEqual(3, len(xParStyle.getChildren())) self.assertEqual("Default Paragraph Style ", get_state_as_dict(xParStyle.getChild('0'))['Text']) - self.assertEqual(156, len(xParStyle.getChild('0').getChildren())) + self.assertEqual(157, len(xParStyle.getChild('0').getChildren())) self.assertEqual("Heading ", get_state_as_dict(xParStyle.getChild('1'))['Text']) self.assertEqual(28, len(xParStyle.getChild('1').getChildren())) @@ -116,7 +116,7 @@ class styleNavigator(UITestCase): xParStyle = xListBox.getChild('0') self.assertEqual(3, len(xParStyle.getChildren())) self.assertEqual("Default Paragraph Style ", get_state_as_dict(xParStyle.getChild('0'))['Text']) - self.assertEqual(156, len(xParStyle.getChild('0').getChildren())) + self.assertEqual(157, len(xParStyle.getChild('0').getChildren())) -e ... etc. - the rest is truncated
