Add new paragraph justification option "Split compound words" for
custom compound-based "smart" hyphenation. Add compound-based "smart"
hyphenation support for Danish, Dutch, Esperanto, Estonian, German,
Norwegian, Swedish (and potentially, Icelandic, Finnish and
Latvian) languages by fixing Hunspell morphological analysis and the
associated lingucomponent code. (Previously compound-based "smart"
hyphenation was enabled only for Hungarian.)
With the new option it's possible to keep MSO/MS-DOCX interoperability,
also introducing a better hyphenation algorithm for several languages.
Details:
* Add check box to Alignment in paragraph formatting dialog window;
* Store properties in paragraph model:
css::style::ParagraphProperties::ParaIsCompoundBased
* Implement it by checking the new option in the previously
added commit f9f694f5d9f39c5801bc5fec45867252c293bbcb;
* Add ODF import/export (loext:compound-based);
* Add ODF unit tests by the new tdf173389_smart_hyphenation_nl.odt
and tdf173389_smart_hyphenation_hu.odt. Now use the previous
tdf119908_smart_hyphenation_hu for disabled compound-based "smart"
hyphenation, also the new tdf119908_smart_hyphenation_nl.odt.
Note: the Dutch test document results better compound-based
hyphenation in two positions.
* Add Hunspell patch to fix Danish, Dutch, Esperanto, Estonian,
German, Norwegian, Swedish (and future Icelandic, Latvian,
Finnish) morphological analysis for compound word constituents;
* hyphenimp.cxx hyphenate(): fix tokenization for consecutive
pa: elements, like resulted in the fixed Hunspell dictionaries.
Follow-up to commit f9f694f5d9
"tdf#173389 sw: add compound-based “smart” hyphenation for readability".
Change-Id: I4414bd588646ecf6dc86b77642833ac9c7820a98
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/211341
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
257 lines
6.8 KiB
C++
257 lines
6.8 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* This file incorporates work covered by the following license notice:
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
* with this work for additional information regarding copyright
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
*/
|
|
#ifndef INCLUDED_EDITENG_ADJUSTITEM_HXX
|
|
#define INCLUDED_EDITENG_ADJUSTITEM_HXX
|
|
|
|
#include <svl/poolitem.hxx>
|
|
#include <editeng/svxenum.hxx>
|
|
#include <editeng/editengdllapi.h>
|
|
|
|
// class SvxAdjustItem ---------------------------------------------------
|
|
|
|
/*
|
|
[Description]
|
|
This item describes the row orientation.
|
|
*/
|
|
constexpr sal_uInt16 ADJUST_LASTBLOCK_VERSION = 0x0001;
|
|
|
|
class EDITENG_DLLPUBLIC SvxAdjustItem final : public SfxPoolItem
|
|
{
|
|
bool bLeft : 1;
|
|
bool bRight : 1;
|
|
bool bCenter : 1;
|
|
bool bBlock : 1;
|
|
bool bStart : 1;
|
|
bool bEnd : 1;
|
|
|
|
// only active when bBlock
|
|
bool bOneBlock : 1;
|
|
bool bLastCenter : 1;
|
|
bool bLastBlock : 1;
|
|
|
|
// desired, minimum and maximum word spacing values in percent of
|
|
// the width of space character in justified text
|
|
sal_uInt16 nPropWordSpacing;
|
|
sal_uInt16 nPropWordSpacingMinimum;
|
|
sal_uInt16 nPropWordSpacingMaximum;
|
|
|
|
// minimum and maximum letter spacing values in percent of
|
|
// the width of space character in justified text
|
|
sal_Int16 nPropLetterSpacingMinimum;
|
|
sal_Int16 nPropLetterSpacingMaximum;
|
|
|
|
// minimum and maximum glyph scaling values in percent
|
|
sal_Int16 nPropScaleWidthMinimum;
|
|
sal_Int16 nPropScaleWidthMaximum;
|
|
|
|
// paragraph composer
|
|
bool bParagraphComposer : 1;
|
|
|
|
// compound-based hyphenation
|
|
bool bCompoundBased : 1;
|
|
|
|
protected:
|
|
virtual ItemInstanceManager* getItemInstanceManager() const override;
|
|
|
|
public:
|
|
static SfxPoolItem* CreateDefault();
|
|
|
|
DECLARE_ITEM_TYPE_FUNCTION(SvxAdjustItem)
|
|
SvxAdjustItem( const SvxAdjust eAdjst /*= SvxAdjust::Left*/,
|
|
const sal_uInt16 nId );
|
|
|
|
// "pure virtual Methods" from SfxPoolItem
|
|
virtual bool operator==( const SfxPoolItem& ) const override;
|
|
virtual bool supportsHashCode() const override { return true; }
|
|
virtual size_t hashCode() const override;
|
|
|
|
virtual bool QueryValue( css::uno::Any& rVal, sal_uInt8 nMemberId = 0 ) const override;
|
|
virtual bool PutValue( const css::uno::Any& rVal, sal_uInt8 nMemberId ) override;
|
|
|
|
virtual bool GetPresentation( SfxItemPresentation ePres,
|
|
MapUnit eCoreMetric,
|
|
MapUnit ePresMetric,
|
|
OUString &rText, const IntlWrapper& ) const override;
|
|
static OUString GetValueTextByPos( sal_uInt16 nPos );
|
|
virtual SvxAdjustItem* Clone( SfxItemPool *pPool = nullptr ) const override;
|
|
|
|
void SetOneWord( const SvxAdjust eType )
|
|
{
|
|
ASSERT_CHANGE_REFCOUNTED_ITEM;
|
|
bOneBlock = eType == SvxAdjust::Block;
|
|
}
|
|
|
|
void SetLastBlock( const SvxAdjust eType )
|
|
{
|
|
ASSERT_CHANGE_REFCOUNTED_ITEM;
|
|
bLastBlock = eType == SvxAdjust::Block;
|
|
bLastCenter = eType == SvxAdjust::Center;
|
|
}
|
|
|
|
void SetAdjust( const SvxAdjust eType )
|
|
{
|
|
ASSERT_CHANGE_REFCOUNTED_ITEM;
|
|
bLeft = eType == SvxAdjust::Left;
|
|
bRight = eType == SvxAdjust::Right;
|
|
bCenter = eType == SvxAdjust::Center;
|
|
bBlock = eType == SvxAdjust::Block;
|
|
bStart = eType == SvxAdjust::ParaStart;
|
|
bEnd = eType == SvxAdjust::ParaEnd;
|
|
}
|
|
|
|
SvxAdjust GetLastBlock() const
|
|
{
|
|
SvxAdjust eRet = SvxAdjust::Left;
|
|
|
|
if ( bLastBlock )
|
|
eRet = SvxAdjust::Block;
|
|
else if( bLastCenter )
|
|
eRet = SvxAdjust::Center;
|
|
return eRet;
|
|
}
|
|
|
|
SvxAdjust GetOneWord() const
|
|
{
|
|
SvxAdjust eRet = SvxAdjust::Left;
|
|
|
|
if ( bBlock && bOneBlock )
|
|
eRet = SvxAdjust::Block;
|
|
return eRet;
|
|
}
|
|
|
|
SvxAdjust GetAdjust() const
|
|
{
|
|
SvxAdjust eRet = SvxAdjust::Left;
|
|
|
|
if ( bRight )
|
|
eRet = SvxAdjust::Right;
|
|
else if ( bCenter )
|
|
eRet = SvxAdjust::Center;
|
|
else if ( bBlock )
|
|
eRet = SvxAdjust::Block;
|
|
else if ( bStart )
|
|
eRet = SvxAdjust::ParaStart;
|
|
else if ( bEnd )
|
|
eRet = SvxAdjust::ParaEnd;
|
|
return eRet;
|
|
}
|
|
|
|
bool GetParagraphComposer() const
|
|
{
|
|
return bParagraphComposer;
|
|
}
|
|
|
|
void SetParagraphComposer( const bool bValue )
|
|
{
|
|
ASSERT_CHANGE_REFCOUNTED_ITEM;
|
|
bParagraphComposer = bValue;
|
|
}
|
|
|
|
|
|
bool GetCompoundBased() const
|
|
{
|
|
return bCompoundBased;
|
|
}
|
|
|
|
void SetCompoundBased( const bool bValue )
|
|
{
|
|
ASSERT_CHANGE_REFCOUNTED_ITEM;
|
|
bCompoundBased = bValue;
|
|
}
|
|
|
|
|
|
sal_uInt16 GetPropWordSpacing() const
|
|
{
|
|
return nPropWordSpacing;
|
|
}
|
|
|
|
void SetPropWordSpacing( sal_uInt16 nVal )
|
|
{
|
|
nPropWordSpacing = nVal;
|
|
}
|
|
|
|
|
|
sal_uInt16 GetPropWordSpacingMinimum() const
|
|
{
|
|
return nPropWordSpacingMinimum;
|
|
}
|
|
|
|
void SetPropWordSpacingMinimum( sal_uInt16 nVal )
|
|
{
|
|
nPropWordSpacingMinimum = nVal;
|
|
}
|
|
|
|
|
|
sal_uInt16 GetPropWordSpacingMaximum() const
|
|
{
|
|
return nPropWordSpacingMaximum;
|
|
}
|
|
|
|
void SetPropWordSpacingMaximum( sal_uInt16 nVal )
|
|
{
|
|
nPropWordSpacingMaximum = nVal;
|
|
}
|
|
|
|
sal_Int16 GetPropLetterSpacingMinimum() const
|
|
{
|
|
return nPropLetterSpacingMinimum;
|
|
}
|
|
|
|
void SetPropLetterSpacingMinimum( sal_Int16 nVal )
|
|
{
|
|
nPropLetterSpacingMinimum = nVal;
|
|
}
|
|
|
|
|
|
sal_Int16 GetPropLetterSpacingMaximum() const
|
|
{
|
|
return nPropLetterSpacingMaximum;
|
|
}
|
|
|
|
void SetPropLetterSpacingMaximum( sal_Int16 nVal )
|
|
{
|
|
nPropLetterSpacingMaximum = nVal;
|
|
}
|
|
|
|
|
|
sal_Int16 GetPropScaleWidthMaximum() const
|
|
{
|
|
return nPropScaleWidthMaximum;
|
|
}
|
|
|
|
void SetPropScaleWidthMaximum( sal_Int16 nVal )
|
|
{
|
|
nPropScaleWidthMaximum = nVal;
|
|
}
|
|
|
|
sal_Int16 GetPropScaleWidthMinimum() const
|
|
{
|
|
return nPropScaleWidthMinimum;
|
|
}
|
|
|
|
void SetPropScaleWidthMinimum( sal_Int16 nVal )
|
|
{
|
|
nPropScaleWidthMinimum = nVal;
|
|
}
|
|
};
|
|
|
|
#endif
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|