use FastParser in linguistic

Change-Id: Iee2254dc13ccc31d266009ba1eb00f2517484cc7
Reviewed-on: https://gerrit.libreoffice.org/79814
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
Noel Grandin 2019-09-29 19:40:09 +02:00 committed by Noel Grandin
parent be634d0212
commit 36c965311f
6 changed files with 142 additions and 106 deletions

View File

@ -105,6 +105,8 @@ namespace xmloff { namespace token {
XML_N_FORM,
XML_NP_SCRIPT,
XML_N_SCRIPT,
XML_NP_TCD,
XML_N_TCD,
XML_NP_XFORMS_1_0,
XML_N_XFORMS_1_0,
XML_NP_XSD,
@ -486,6 +488,7 @@ namespace xmloff { namespace token {
XML_CONTRAST,
XML_CONTROL,
XML_CONVERSION_MODE,
XML_CONVERSION_TYPE,
XML_COPY_BACK,
XML_COPY_FORMULAS,
XML_COPY_OUTLINE_LEVELS,
@ -716,6 +719,7 @@ namespace xmloff { namespace token {
XML_ENDNOTE_REF,
XML_ENDNOTES_CONFIGURATION,
XML_ENGRAVED,
XML_ENTRY,
XML_EQ,
XML_EQUAL_AUTHOR,
XML_EQUAL_COMMENT,
@ -1095,6 +1099,7 @@ namespace xmloff { namespace token {
XML_LABEL_STROKE_WIDTH,
XML_LAMBDA,
XML_LANDSCAPE,
XML_LANG,
XML_LANGUAGE,
XML_LANGUAGE_ASIAN,
XML_LANGUAGE_COMPLEX,
@ -1107,6 +1112,7 @@ namespace xmloff { namespace token {
XML_LEADER_CHAR,
XML_LEFT,
XML_LEFT_OUTSIDE,
XML_LEFT_TEXT,
XML_LEFT_TOP_POSITION,
XML_LEFTARC,
XML_LEFTCIRCLE,
@ -1557,6 +1563,7 @@ namespace xmloff { namespace token {
XML_RIDGE,
XML_RIGHT,
XML_RIGHT_OUTSIDE,
XML_RIGHT_TEXT,
XML_RIGHTARC,
XML_RIGHTCIRCLE,
XML_RING,
@ -1869,6 +1876,7 @@ namespace xmloff { namespace token {
XML_TEXT_COMBINE_END_CHAR,
XML_TEXT_COMBINE_START_CHAR,
XML_TEXT_CONTENT,
XML_TEXT_CONVERSION_DICTIONARY,
XML_TEXT_CROSSING_OUT,
XML_TEXT_EMPHASIZE,
XML_TEXT_GLOBAL,

View File

@ -38,6 +38,7 @@ $(eval $(call gb_Library_use_libraries,lng,\
cppuhelper \
i18nlangtag \
sal \
sax \
svl \
tl \
ucbhelper \

View File

@ -82,10 +82,8 @@ class ConvDicXMLImportContext :
public SvXMLImportContext
{
public:
ConvDicXMLImportContext(
ConvDicXMLImport &rImport,
sal_uInt16 nPrfx, const OUString& rLName ) :
SvXMLImportContext( rImport, nPrfx, rLName )
ConvDicXMLImportContext( ConvDicXMLImport &rImport ) :
SvXMLImportContext( rImport )
{
}
@ -96,7 +94,8 @@ public:
// SvXMLImportContext
virtual void Characters( const OUString &rChars ) override;
virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList) override;
virtual css::uno::Reference<XFastContextHandler> SAL_CALL createFastChildContext(
sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
};
@ -107,17 +106,17 @@ class ConvDicXMLDictionaryContext_Impl :
sal_Int16 nConversionType;
public:
ConvDicXMLDictionaryContext_Impl( ConvDicXMLImport &rImport,
sal_uInt16 nPrefix, const OUString& rLName) :
ConvDicXMLImportContext( rImport, nPrefix, rLName )
ConvDicXMLDictionaryContext_Impl( ConvDicXMLImport &rImport ) :
ConvDicXMLImportContext( rImport )
{
nLanguage = LANGUAGE_NONE;
nConversionType = -1;
}
// SvXMLImportContext
virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList ) override;
virtual void SAL_CALL startFastElement( sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs ) override;
virtual css::uno::Reference<XFastContextHandler> SAL_CALL createFastChildContext(
sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
};
@ -127,16 +126,15 @@ class ConvDicXMLEntryTextContext_Impl :
OUString aLeftText;
public:
ConvDicXMLEntryTextContext_Impl(
ConvDicXMLImport &rImport,
sal_uInt16 nPrefix, const OUString& rLName ) :
ConvDicXMLImportContext( rImport, nPrefix, rLName )
ConvDicXMLEntryTextContext_Impl( ConvDicXMLImport &rImport ) :
ConvDicXMLImportContext( rImport )
{
}
// SvXMLImportContext
virtual void StartElement( const css::uno::Reference< css::xml::sax::XAttributeList >& xAttrList ) override;
virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList ) override;
virtual void SAL_CALL startFastElement( sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs ) override;
virtual css::uno::Reference<XFastContextHandler> SAL_CALL createFastChildContext(
sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
const OUString & GetLeftText() const { return aLeftText; }
};
@ -151,16 +149,14 @@ class ConvDicXMLRightTextContext_Impl :
public:
ConvDicXMLRightTextContext_Impl(
ConvDicXMLImport &rImport,
sal_uInt16 nPrefix, const OUString& rLName,
ConvDicXMLEntryTextContext_Impl &rParentContext ) :
ConvDicXMLImportContext( rImport, nPrefix, rLName ),
ConvDicXMLImportContext( rImport ),
rEntryContext( rParentContext )
{
}
// SvXMLImportContext
virtual void EndElement() override;
virtual SvXMLImportContextRef CreateChildContext( sal_uInt16 nPrefix, const OUString& rLocalName, const uno::Reference< xml::sax::XAttributeList > &rxAttrList ) override;
virtual void SAL_CALL endFastElement( sal_Int32 nElement ) override;
virtual void Characters( const OUString &rChars ) override;
const OUString & GetRightText() const { return aRightText; }
@ -180,99 +176,95 @@ void ConvDicXMLImportContext::Characters(const OUString & /*rChars*/)
}
SvXMLImportContextRef ConvDicXMLImportContext::CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ )
css::uno::Reference<XFastContextHandler> ConvDicXMLImportContext::createFastChildContext(
sal_Int32 Element,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & /*xAttrList*/ )
{
SvXMLImportContext *pContext = nullptr;
if ( nPrefix == XML_NAMESPACE_TCD && rLocalName == "text-conversion-dictionary" )
pContext = new ConvDicXMLDictionaryContext_Impl( GetConvDicImport(), nPrefix, rLocalName );
if ( Element == ConvDicXMLToken::TEXT_CONVERSION_DICTIONARY )
return new ConvDicXMLDictionaryContext_Impl( GetConvDicImport() );
else
pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
return pContext;
return new SvXMLImportContext( GetImport() );
}
void ConvDicXMLDictionaryContext_Impl::StartElement(
const uno::Reference< xml::sax::XAttributeList > &rxAttrList )
void ConvDicXMLDictionaryContext_Impl::startFastElement( sal_Int32 /*nElement*/,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& rxAttrList )
{
sal_Int16 nAttrCount = rxAttrList.is() ? rxAttrList->getLength() : 0;
for (sal_Int16 i = 0; i < nAttrCount; ++i)
if ( rxAttrList.is() )
{
OUString aAttrName = rxAttrList->getNameByIndex(i);
OUString aLocalName;
sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
GetKeyByAttrName( aAttrName, &aLocalName );
OUString aValue = rxAttrList->getValueByIndex(i);
sax_fastparser::FastAttributeList *pAttribList =
sax_fastparser::FastAttributeList::castToFastAttributeList( rxAttrList );
if ( nPrefix == XML_NAMESPACE_TCD && aLocalName == "lang" )
nLanguage = LanguageTag::convertToLanguageType( aValue );
else if ( nPrefix == XML_NAMESPACE_TCD && aLocalName == "conversion-type" )
nConversionType = GetConversionTypeFromText( aValue );
for (auto &aIter : *pAttribList)
{
switch (aIter.getToken())
{
case XML_NAMESPACE_TCD | XML_LANG:
nLanguage = LanguageTag::convertToLanguageType( aIter.toString() );
break;
case XML_NAMESPACE_TCD | XML_CONVERSION_TYPE:
nConversionType = GetConversionTypeFromText( aIter.toString() );
break;
default:
;
}
}
}
GetConvDicImport().SetLanguage( nLanguage );
GetConvDicImport().SetConversionType( nConversionType );
}
SvXMLImportContextRef ConvDicXMLDictionaryContext_Impl::CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ )
css::uno::Reference<XFastContextHandler> ConvDicXMLDictionaryContext_Impl::createFastChildContext(
sal_Int32 Element,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & /*xAttrList*/ )
{
SvXMLImportContext *pContext = nullptr;
if ( nPrefix == XML_NAMESPACE_TCD && rLocalName == "entry" )
pContext = new ConvDicXMLEntryTextContext_Impl( GetConvDicImport(), nPrefix, rLocalName );
if ( Element == ConvDicXMLToken::ENTRY )
return new ConvDicXMLEntryTextContext_Impl( GetConvDicImport() );
else
pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
return pContext;
return new SvXMLImportContext(GetImport());
}
SvXMLImportContextRef ConvDicXMLEntryTextContext_Impl::CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ )
css::uno::Reference<XFastContextHandler> ConvDicXMLEntryTextContext_Impl::createFastChildContext(
sal_Int32 Element,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & /*xAttrList*/ )
{
SvXMLImportContext *pContext = nullptr;
if ( nPrefix == XML_NAMESPACE_TCD && rLocalName == "right-text" )
pContext = new ConvDicXMLRightTextContext_Impl( GetConvDicImport(), nPrefix, rLocalName, *this );
if ( Element == ConvDicXMLToken::RIGHT_TEXT )
return new ConvDicXMLRightTextContext_Impl( GetConvDicImport(), *this );
else
pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
return pContext;
return new SvXMLImportContext(GetImport());
}
void ConvDicXMLEntryTextContext_Impl::StartElement(
const uno::Reference< xml::sax::XAttributeList >& rxAttrList )
void ConvDicXMLEntryTextContext_Impl::startFastElement(
sal_Int32 /*Element*/,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& rxAttrList )
{
sal_Int16 nAttrCount = rxAttrList.is() ? rxAttrList->getLength() : 0;
for (sal_Int16 i = 0; i < nAttrCount; ++i)
if ( rxAttrList.is() )
{
OUString aAttrName = rxAttrList->getNameByIndex(i);
OUString aLocalName;
sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
GetKeyByAttrName( aAttrName, &aLocalName );
OUString aValue = rxAttrList->getValueByIndex(i);
sax_fastparser::FastAttributeList *pAttribList =
sax_fastparser::FastAttributeList::castToFastAttributeList( rxAttrList );
if ( nPrefix == XML_NAMESPACE_TCD && aLocalName == "left-text" )
aLeftText = aValue;
for (auto &aIter : *pAttribList)
{
switch (aIter.getToken())
{
case XML_NAMESPACE_TCD | XML_LEFT_TEXT:
aLeftText = aIter.toString();
break;
default:
;
}
}
}
}
SvXMLImportContextRef ConvDicXMLRightTextContext_Impl::CreateChildContext(
sal_uInt16 nPrefix, const OUString& rLocalName,
const uno::Reference< xml::sax::XAttributeList > & /*rxAttrList*/ )
{
// leaf: return default (empty) context
SvXMLImportContext *pContext = new SvXMLImportContext( GetImport(), nPrefix, rLocalName );
return pContext;
}
void ConvDicXMLRightTextContext_Impl::Characters( const OUString &rChars )
{
aRightText += rChars;
}
void ConvDicXMLRightTextContext_Impl::EndElement()
void ConvDicXMLRightTextContext_Impl::endFastElement( sal_Int32 /*nElement*/ )
{
ConvDic *pDic = GetConvDicImport().GetDic();
if (pDic)
@ -359,25 +351,24 @@ void ConvDicXMLExport::ExportContent_()
}
}
void SAL_CALL ConvDicXMLImport::startDocument()
//!! see comment for pDic member
ConvDicXMLImport::ConvDicXMLImport( ConvDic *pConvDic ) :
SvXMLImport ( comphelper::getProcessComponentContext(), "com.sun.star.lingu2.ConvDicXMLImport", SvXMLImportFlags::ALL ),
pDic ( pConvDic )
{
// register namespace at first possible opportunity
GetNamespaceMap().Add( "tcd",
XML_NAMESPACE_TCD_STRING, XML_NAMESPACE_TCD );
SvXMLImport::startDocument();
nLanguage = LANGUAGE_NONE;
nConversionType = -1;
GetNamespaceMap().Add( GetXMLToken(XML_NP_TCD), GetXMLToken(XML_N_TCD), XML_NAMESPACE_TCD);
}
SvXMLImportContext * ConvDicXMLImport::CreateDocumentContext(
sal_uInt16 nPrefix,
const OUString &rLocalName,
const uno::Reference < xml::sax::XAttributeList > & /*rxAttrList*/ )
SvXMLImportContext * ConvDicXMLImport::CreateFastContext(
sal_Int32 Element,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList )
{
SvXMLImportContext *pContext = nullptr;
if ( nPrefix == XML_NAMESPACE_TCD && rLocalName == "text-conversion-dictionary" )
pContext = new ConvDicXMLDictionaryContext_Impl( *this, nPrefix, rLocalName );
if( Element == ConvDicXMLToken::TEXT_CONVERSION_DICTIONARY )
return new ConvDicXMLDictionaryContext_Impl( *this );
else
pContext = new SvXMLImportContext( *this, nPrefix, rLocalName );
return pContext;
return SvXMLImport::CreateFastContext( Element, xAttrList );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@ -24,9 +24,12 @@
#include <com/sun/star/util/MeasureUnit.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
#include <com/sun/star/xml/sax/FastToken.hpp>
#include <comphelper/processfactory.hxx>
#include <xmloff/xmlexp.hxx>
#include <xmloff/xmlimp.hxx>
#include <xmloff/xmltoken.hxx>
#include <xmloff/xmlnmspe.hxx>
#include <cppuhelper/interfacecontainer.h>
#include <rtl/ustring.hxx>
#include <linguistic/misc.hxx>
@ -34,6 +37,8 @@
class ConvDic;
using namespace css::xml::sax;
using namespace ::xmloff::token;
class ConvDicXMLExport : public SvXMLExport
@ -62,6 +67,29 @@ public:
};
enum ConvDicXMLToken : sal_Int32
{
TEXT_CONVERSION_DICTIONARY = FastToken::NAMESPACE | XML_NAMESPACE_TCD | XML_BLOCK_LIST,
RIGHT_TEXT = FastToken::NAMESPACE | XML_NAMESPACE_TCD | XML_RIGHT_TEXT,
ENTRY = FastToken::NAMESPACE | XML_NAMESPACE_TCD | XML_ENTRY,
};
class ConvDicXMLTokenHandler : public
cppu::WeakImplHelper< css::xml::sax::XFastTokenHandler >,
public sax_fastparser::FastTokenHandlerBase
{
public:
explicit ConvDicXMLTokenHandler();
virtual ~ConvDicXMLTokenHandler() override;
//XFastTokenHandler
virtual sal_Int32 SAL_CALL getTokenFromUTF8( const css::uno::Sequence< sal_Int8 >& Identifier ) override;
virtual css::uno::Sequence< sal_Int8 > SAL_CALL getUTF8Identifier( sal_Int32 Token ) override;
// Much faster direct C++ shortcut to the method that matters
virtual sal_Int32 getTokenDirect( const char *pToken, sal_Int32 nLength ) const override;
};
class ConvDicXMLImport : public SvXMLImport
{
ConvDic *pDic; // conversion dictionary to be used
@ -77,19 +105,7 @@ class ConvDicXMLImport : public SvXMLImport
public:
//!! see comment for pDic member
explicit ConvDicXMLImport( ConvDic *pConvDic ) :
SvXMLImport ( comphelper::getProcessComponentContext(), "com.sun.star.lingu2.ConvDicXMLImport", SvXMLImportFlags::ALL ),
pDic ( pConvDic )
{
nLanguage = LANGUAGE_NONE;
nConversionType = -1;
}
virtual void SAL_CALL startDocument() override;
virtual SvXMLImportContext * CreateDocumentContext(
sal_uInt16 nPrefix, const OUString &rLocalName,
const css::uno::Reference < css::xml::sax::XAttributeList > &rxAttrList ) override;
explicit ConvDicXMLImport( ConvDic *pConvDic );
ConvDic * GetDic() { return pDic; }
LanguageType GetLanguage() const { return nLanguage; }
@ -97,6 +113,10 @@ public:
void SetLanguage( LanguageType nLang ) { nLanguage = nLang; }
void SetConversionType( sal_Int16 nType ) { nConversionType = nType; }
private:
virtual SvXMLImportContext *CreateFastContext( sal_Int32 Element,
const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList ) override;
};

View File

@ -109,6 +109,8 @@ namespace xmloff { namespace token {
TOKEN( "urn:oasis:names:tc:opendocument:xmlns:form:1.0", XML_N_FORM ),
TOKEN( "script", XML_NP_SCRIPT ),
TOKEN( "urn:oasis:names:tc:opendocument:xmlns:script:1.0", XML_N_SCRIPT ),
TOKEN( "tcd", XML_NP_TCD ),
TOKEN( "http://openoffice.org/2003/text-conversion-dictionary", XML_N_TCD ),
TOKEN( "xforms", XML_NP_XFORMS_1_0 ),
TOKEN( "http://www.w3.org/2002/xforms", XML_N_XFORMS_1_0 ),
TOKEN( "xsd", XML_NP_XSD ),
@ -487,6 +489,7 @@ namespace xmloff { namespace token {
TOKEN( "contrast", XML_CONTRAST ),
TOKEN( "control", XML_CONTROL ),
TOKEN( "conversion-mode", XML_CONVERSION_MODE ),
TOKEN( "conversion-type", XML_CONVERSION_TYPE ),
TOKEN( "copy-back", XML_COPY_BACK ),
TOKEN( "copy-formulas", XML_COPY_FORMULAS ),
TOKEN( "copy-outline-levels", XML_COPY_OUTLINE_LEVELS ),
@ -717,6 +720,7 @@ namespace xmloff { namespace token {
TOKEN( "endnote-ref", XML_ENDNOTE_REF ),
TOKEN( "endnotes-configuration", XML_ENDNOTES_CONFIGURATION ),
TOKEN( "engraved", XML_ENGRAVED ),
TOKEN( "entry", XML_ENTRY ),
TOKEN( "eq", XML_EQ ),
TOKEN( "equal-author", XML_EQUAL_AUTHOR ),
TOKEN( "equal-comment", XML_EQUAL_COMMENT ),
@ -1097,6 +1101,7 @@ namespace xmloff { namespace token {
TOKEN( "label-stroke-width", XML_LABEL_STROKE_WIDTH ),
TOKEN( "lambda", XML_LAMBDA ),
TOKEN( "landscape", XML_LANDSCAPE ),
TOKEN( "lang", XML_LANG ),
TOKEN( "language", XML_LANGUAGE ),
TOKEN( "language-asian", XML_LANGUAGE_ASIAN ),
TOKEN( "language-complex", XML_LANGUAGE_COMPLEX ),
@ -1109,6 +1114,7 @@ namespace xmloff { namespace token {
TOKEN( "leader-char", XML_LEADER_CHAR ),
TOKEN( "left", XML_LEFT ),
TOKEN( "left-outside", XML_LEFT_OUTSIDE ),
TOKEN( "left-text", XML_LEFT_TEXT ),
TOKEN( "left-top-position", XML_LEFT_TOP_POSITION ),
TOKEN( "left-arc", XML_LEFTARC ),
TOKEN( "left-circle", XML_LEFTCIRCLE ),
@ -1559,6 +1565,7 @@ namespace xmloff { namespace token {
TOKEN( "ridge", XML_RIDGE ),
TOKEN( "right", XML_RIGHT ),
TOKEN( "right-outside", XML_RIGHT_OUTSIDE ),
TOKEN( "right-text", XML_RIGHT_TEXT ),
TOKEN( "right-arc", XML_RIGHTARC ),
TOKEN( "right-circle", XML_RIGHTCIRCLE ),
TOKEN( "ring", XML_RING ),
@ -1871,6 +1878,7 @@ namespace xmloff { namespace token {
TOKEN( "text-combine-end-char", XML_TEXT_COMBINE_END_CHAR ),
TOKEN( "text-combine-start-char", XML_TEXT_COMBINE_START_CHAR ),
TOKEN( "text-content", XML_TEXT_CONTENT ),
TOKEN( "text-conversion-dictionary", XML_TEXT_CONVERSION_DICTIONARY ),
TOKEN( "text-crossing-out", XML_TEXT_CROSSING_OUT ),
TOKEN( "text-emphasize", XML_TEXT_EMPHASIZE ),
TOKEN( "text-global", XML_TEXT_GLOBAL ),

View File

@ -52,6 +52,8 @@ NP_FORM_DUMMY
N_FORM_DUMMY
NP_SCRIPT_DUMMY
N_SCRIPT_DUMMY
tcd
N_TCD_DUMMY
xforms
N_XFORMS_1_0_DUMMY
xsd
@ -410,6 +412,7 @@ contour-polygon
contrast
control
conversion-mode
conversion-type
copy-back
copy-formulas
copy-outline-levels
@ -640,6 +643,7 @@ endnote-citation
endnote-ref
endnotes-configuration
engraved
entry
eq
equal-author
equal-comment
@ -1015,6 +1019,7 @@ label-stroke-opacity
label-stroke-width
lambda
landscape
lang
language
language-asian
language-complex
@ -1027,6 +1032,7 @@ layer-set
leader-char
left
left-outside
left-text
left-top-position
left-arc
left-circle
@ -1477,6 +1483,7 @@ revision
ridge
right
right-outside
right-text
right-arc
right-circle
ring
@ -1789,6 +1796,7 @@ text-combine
text-combine-end-char
text-combine-start-char
text-content
text-conversion-dictionary
text-crossing-out
text-emphasize
text-global