summaryrefslogtreecommitdiffstats
path: root/svtools/source/svrtf
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
commited5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch)
tree7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /svtools/source/svrtf
parentInitial commit. (diff)
downloadlibreoffice-cb75148ebd0135178ff46f89a30139c44f8d2040.tar.xz
libreoffice-cb75148ebd0135178ff46f89a30139c44f8d2040.zip
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'svtools/source/svrtf')
-rw-r--r--svtools/source/svrtf/parrtf.cxx689
-rw-r--r--svtools/source/svrtf/rtfkeywd.cxx1202
-rw-r--r--svtools/source/svrtf/rtfout.cxx192
-rw-r--r--svtools/source/svrtf/svparser.cxx671
4 files changed, 2754 insertions, 0 deletions
diff --git a/svtools/source/svrtf/parrtf.cxx b/svtools/source/svrtf/parrtf.cxx
new file mode 100644
index 000000000..69fdb9508
--- /dev/null
+++ b/svtools/source/svrtf/parrtf.cxx
@@ -0,0 +1,689 @@
+/* -*- 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 .
+ */
+
+#include <sal/config.h>
+#include <sal/log.hxx>
+
+#include <comphelper/scopeguard.hxx>
+
+#include <rtl/character.hxx>
+#include <rtl/strbuf.hxx>
+#include <rtl/tencinfo.h>
+#include <rtl/ustrbuf.hxx>
+#include <tools/stream.hxx>
+#include <tools/debug.hxx>
+#include <svtools/rtftoken.h>
+#include <svtools/parrtf.hxx>
+
+const int MAX_STRING_LEN = 1024;
+
+#define RTF_ISDIGIT( c ) rtl::isAsciiDigit(c)
+#define RTF_ISALPHA( c ) rtl::isAsciiAlpha(c)
+
+SvRTFParser::SvRTFParser( SvStream& rIn, sal_uInt8 nStackSize )
+ : SvParser<int>( rIn, nStackSize )
+ , nOpenBrackets(0)
+ , eCodeSet(RTL_TEXTENCODING_MS_1252)
+ , nUCharOverread(1)
+{
+ // default is ANSI-CodeSet
+ SetSrcEncoding( RTL_TEXTENCODING_MS_1252 );
+ bRTF_InTextRead = false;
+}
+
+SvRTFParser::~SvRTFParser()
+{
+}
+
+
+int SvRTFParser::GetNextToken_()
+{
+ int nRet = 0;
+ do {
+ bool bNextCh = true;
+ switch( nNextCh )
+ {
+ case '\\':
+ {
+ // control characters
+ nNextCh = GetNextChar();
+ switch( nNextCh )
+ {
+ case '{':
+ case '}':
+ case '\\':
+ case '+': // I found it in a RTF-file
+ case '~': // nonbreaking space
+ case '-': // optional hyphen
+ case '_': // nonbreaking hyphen
+ case '\'': // HexValue
+ nNextCh = '\\';
+ rInput.SeekRel( -1 );
+ ScanText();
+ nRet = RTF_TEXTTOKEN;
+ bNextCh = 0 == nNextCh;
+ break;
+
+ case '*': // ignoreflag
+ nRet = RTF_IGNOREFLAG;
+ break;
+ case ':': // subentry in an index entry
+ nRet = RTF_SUBENTRYINDEX;
+ break;
+ case '|': // formula-character
+ nRet = RTF_FORMULA;
+ break;
+
+ case 0x0a:
+ case 0x0d:
+ nRet = RTF_PAR;
+ break;
+
+ default:
+ if( RTF_ISALPHA( nNextCh ) )
+ {
+ aToken = "\\";
+ {
+ do {
+ aToken.appendUtf32(nNextCh);
+ nNextCh = GetNextChar();
+ } while( RTF_ISALPHA( nNextCh ) );
+ }
+
+ // minus before numeric parameters
+ bool bNegValue = false;
+ if( '-' == nNextCh )
+ {
+ bNegValue = true;
+ nNextCh = GetNextChar();
+ }
+
+ // possible numeric parameter
+ if( RTF_ISDIGIT( nNextCh ) )
+ {
+ OUStringBuffer aNumber;
+ do {
+ aNumber.append(static_cast<sal_Unicode>(nNextCh));
+ nNextCh = GetNextChar();
+ } while( RTF_ISDIGIT( nNextCh ) );
+ nTokenValue = OUString::unacquired(aNumber).toInt32();
+ if( bNegValue )
+ nTokenValue = -nTokenValue;
+ bTokenHasValue=true;
+ }
+ else if( bNegValue ) // restore minus
+ {
+ nNextCh = '-';
+ rInput.SeekRel( -1 );
+ }
+ if( ' ' == nNextCh ) // blank is part of token!
+ nNextCh = GetNextChar();
+
+ // search for the token in the table:
+ if( 0 == (nRet = GetRTFToken( aToken )) )
+ // Unknown Control
+ nRet = RTF_UNKNOWNCONTROL;
+
+ // bug 76812 - unicode token handled as normal text
+ bNextCh = false;
+ switch( nRet )
+ {
+ case RTF_UC:
+ if( 0 <= nTokenValue )
+ {
+ nUCharOverread = static_cast<sal_uInt8>(nTokenValue);
+ if (!aParserStates.empty())
+ {
+ //cmc: other ifdef breaks #i3584
+ aParserStates.top().nUCharOverread = nUCharOverread;
+ }
+ }
+ aToken.setLength( 0 ); // #i47831# erase token to prevent the token from being treated as text
+ // read next token
+ nRet = 0;
+ break;
+
+ case RTF_UPR:
+ if (!_inSkipGroup) {
+ // UPR - overread the group with the ansi
+ // information
+ int nNextToken;
+ do
+ {
+ nNextToken = GetNextToken_();
+ }
+ while (nNextToken != '{' && nNextToken != sal_Unicode(EOF));
+
+ SkipGroup();
+ GetNextToken_(); // overread the last bracket
+ nRet = 0;
+ }
+ break;
+
+ case RTF_U:
+ if( !bRTF_InTextRead )
+ {
+ nRet = RTF_TEXTTOKEN;
+ aToken = OUStringChar( static_cast<sal_Unicode>(nTokenValue) );
+
+ // overread the next n "RTF" characters. This
+ // can be also \{, \}, \'88
+ for( sal_uInt8 m = 0; m < nUCharOverread; ++m )
+ {
+ sal_uInt32 cAnsi = nNextCh;
+ while( 0xD == cAnsi )
+ cAnsi = GetNextChar();
+ while( 0xA == cAnsi )
+ cAnsi = GetNextChar();
+
+ if( '\\' == cAnsi &&
+ '\'' == GetNextChar() )
+ // skip HexValue
+ GetHexValue();
+ nNextCh = GetNextChar();
+ }
+ ScanText();
+ bNextCh = 0 == nNextCh;
+ }
+ break;
+ }
+ }
+ else if( SvParserState::Pending != eState )
+ {
+ // Bug 34631 - "\ " read on - Blank as character
+ // eState = SvParserState::Error;
+ bNextCh = false;
+ }
+ break;
+ }
+ }
+ break;
+
+ case sal_Unicode(EOF):
+ eState = SvParserState::Accepted;
+ nRet = nNextCh;
+ break;
+
+ case '{':
+ {
+ if( 0 <= nOpenBrackets )
+ {
+ RtfParserState_Impl aState( nUCharOverread, GetSrcEncoding() );
+ aParserStates.push( aState );
+ }
+ ++nOpenBrackets;
+ DBG_ASSERT(
+ static_cast<size_t>(nOpenBrackets) == aParserStates.size(),
+ "ParserStateStack unequal to bracket count" );
+ nRet = nNextCh;
+ }
+ break;
+
+ case '}':
+ --nOpenBrackets;
+ if( 0 <= nOpenBrackets )
+ {
+ aParserStates.pop();
+ if( !aParserStates.empty() )
+ {
+ const RtfParserState_Impl& rRPS =
+ aParserStates.top();
+ nUCharOverread = rRPS.nUCharOverread;
+ SetSrcEncoding( rRPS.eCodeSet );
+ }
+ else
+ {
+ nUCharOverread = 1;
+ SetSrcEncoding( GetCodeSet() );
+ }
+ }
+ DBG_ASSERT(
+ static_cast<size_t>(nOpenBrackets) == aParserStates.size(),
+ "ParserStateStack unequal to bracket count" );
+ nRet = nNextCh;
+ break;
+
+ case 0x0d:
+ case 0x0a:
+ break;
+
+ default:
+ // now normal text follows
+ ScanText();
+ nRet = RTF_TEXTTOKEN;
+ bNextCh = 0 == nNextCh;
+ break;
+ }
+
+ if( bNextCh )
+ nNextCh = GetNextChar();
+
+ } while( !nRet && SvParserState::Working == eState );
+ return nRet;
+}
+
+
+sal_Unicode SvRTFParser::GetHexValue()
+{
+ // collect Hex values
+ int n;
+ sal_Unicode nHexVal = 0;
+
+ for( n = 0; n < 2; ++n )
+ {
+ nHexVal *= 16;
+ nNextCh = GetNextChar();
+ if( nNextCh >= '0' && nNextCh <= '9' )
+ nHexVal += (nNextCh - 48);
+ else if( nNextCh >= 'a' && nNextCh <= 'f' )
+ nHexVal += (nNextCh - 87);
+ else if( nNextCh >= 'A' && nNextCh <= 'F' )
+ nHexVal += (nNextCh - 55);
+ }
+ return nHexVal;
+}
+
+void SvRTFParser::ScanText()
+{
+ const sal_Unicode cBreak = 0;
+ OUStringBuffer aStrBuffer;
+ bool bContinue = true;
+ while( bContinue && IsParserWorking() && aStrBuffer.getLength() < MAX_STRING_LEN)
+ {
+ bool bNextCh = true;
+ switch( nNextCh )
+ {
+ case '\\':
+ {
+ nNextCh = GetNextChar();
+ switch (nNextCh)
+ {
+ case '\'':
+ {
+
+ OStringBuffer aByteString;
+ while (true)
+ {
+ char c = static_cast<char>(GetHexValue());
+ /*
+ * Note: \'00 is a valid internal character in a
+ * string in RTF. OStringBuffer supports
+ * appending nulls fine
+ */
+ aByteString.append(c);
+
+ bool bBreak = false;
+ bool bEOF = false;
+ char nSlash = '\\';
+ while (!bBreak)
+ {
+ auto next = GetNextChar();
+ if (sal_Unicode(EOF) == next)
+ {
+ bEOF = true;
+ break;
+ }
+ if (next>0xFF) // fix for #i43933# and #i35653#
+ {
+ if (!aByteString.isEmpty())
+ aStrBuffer.append( OStringToOUString(aByteString.makeStringAndClear(), GetSrcEncoding()) );
+ aStrBuffer.append(static_cast<sal_Unicode>(next));
+
+ continue;
+ }
+ nSlash = static_cast<char>(next);
+ while (nSlash == 0xD || nSlash == 0xA)
+ nSlash = static_cast<char>(GetNextChar());
+
+ switch (nSlash)
+ {
+ case '{':
+ case '}':
+ case '\\':
+ bBreak = true;
+ break;
+ default:
+ aByteString.append(nSlash);
+ break;
+ }
+ }
+
+ if (bEOF)
+ {
+ bContinue = false; // abort, string together
+ break;
+ }
+
+ nNextCh = GetNextChar();
+
+ if (nSlash != '\\' || nNextCh != '\'')
+ {
+ rInput.SeekRel(-1);
+ nNextCh = static_cast<unsigned char>(nSlash);
+ break;
+ }
+ }
+
+ bNextCh = false;
+
+ if (!aByteString.isEmpty())
+ aStrBuffer.append( OStringToOUString(aByteString.makeStringAndClear(), GetSrcEncoding()) );
+ }
+ break;
+ case '\\':
+ case '}':
+ case '{':
+ case '+': // I found in a RTF file
+ aStrBuffer.append(sal_Unicode(nNextCh));
+ break;
+ case '~': // nonbreaking space
+ aStrBuffer.append(u'\x00A0');
+ break;
+ case '-': // optional hyphen
+ aStrBuffer.append(u'\x00AD');
+ break;
+ case '_': // nonbreaking hyphen
+ aStrBuffer.append(u'\x2011');
+ break;
+
+ case 'u':
+ // read UNI-Code characters
+ {
+ nNextCh = GetNextChar();
+ rInput.SeekRel( -2 );
+
+ if( '-' == nNextCh || RTF_ISDIGIT( nNextCh ) )
+ {
+ bRTF_InTextRead = true;
+
+ OUString sSave( aToken ); // GetNextToken_() overwrites this
+ nNextCh = '\\';
+ int nToken = GetNextToken_();
+ DBG_ASSERT( RTF_U == nToken, "still not a UNI-Code character" );
+ // don't convert symbol chars
+ aStrBuffer.append(static_cast< sal_Unicode >(nTokenValue));
+
+ // overread the next n "RTF" characters. This
+ // can be also \{, \}, \'88
+ for( sal_uInt8 m = 0; m < nUCharOverread; ++m )
+ {
+ sal_Unicode cAnsi = nNextCh;
+ while( 0xD == cAnsi )
+ cAnsi = GetNextChar();
+ while( 0xA == cAnsi )
+ cAnsi = GetNextChar();
+
+ if( '\\' == cAnsi &&
+ '\'' == GetNextChar() )
+ // skip HexValue
+ GetHexValue();
+ nNextCh = GetNextChar();
+ }
+ bNextCh = false;
+ aToken = sSave;
+ bRTF_InTextRead = false;
+ }
+ else if ( 'c' == nNextCh )
+ {
+ // Prevent text breaking into multiple tokens.
+ rInput.SeekRel( 2 );
+ nNextCh = GetNextChar();
+ if (RTF_ISDIGIT( nNextCh ))
+ {
+ sal_uInt8 nNewOverread = 0 ;
+ do {
+ nNewOverread *= 10;
+ nNewOverread += nNextCh - '0';
+ nNextCh = GetNextChar();
+ } while ( RTF_ISDIGIT( nNextCh ) );
+ nUCharOverread = nNewOverread;
+ if (!aParserStates.empty())
+ aParserStates.top().nUCharOverread = nNewOverread;
+ }
+ bNextCh = 0x20 == nNextCh;
+ }
+ else
+ {
+ nNextCh = '\\';
+ bContinue = false; // abort, string together
+ }
+ }
+ break;
+
+ default:
+ rInput.SeekRel( -1 );
+ nNextCh = '\\';
+ bContinue = false; // abort, string together
+ break;
+ }
+ }
+ break;
+
+ case sal_Unicode(EOF):
+ eState = SvParserState::Error;
+ [[fallthrough]];
+ case '{':
+ case '}':
+ bContinue = false;
+ break;
+
+ case 0x0a:
+ case 0x0d:
+ break;
+
+ default:
+ if( nNextCh == cBreak || aStrBuffer.getLength() >= MAX_STRING_LEN)
+ bContinue = false;
+ else
+ {
+ do {
+ // all other characters end up in the text
+ aStrBuffer.appendUtf32(nNextCh);
+
+ if (sal_Unicode(EOF) == (nNextCh = GetNextChar()))
+ {
+ if (!aStrBuffer.isEmpty())
+ aToken.append( aStrBuffer );
+ return;
+ }
+ } while
+ (
+ (RTF_ISALPHA(nNextCh) || RTF_ISDIGIT(nNextCh)) &&
+ (aStrBuffer.getLength() < MAX_STRING_LEN)
+ );
+ bNextCh = false;
+ }
+ }
+
+ if( bContinue && bNextCh )
+ nNextCh = GetNextChar();
+ }
+
+ if (!aStrBuffer.isEmpty())
+ aToken.append( aStrBuffer );
+}
+
+
+short SvRTFParser::_inSkipGroup=0;
+
+void SvRTFParser::SkipGroup()
+{
+ short nBrackets=1;
+ if (_inSkipGroup>0)
+ return;
+ _inSkipGroup++;
+//#i16185# faking \bin keyword
+ do
+ {
+ switch (nNextCh)
+ {
+ case '{':
+ ++nBrackets;
+ break;
+ case '}':
+ if (!--nBrackets) {
+ _inSkipGroup--;
+ return;
+ }
+ break;
+ }
+ int nToken = GetNextToken_();
+ if (nToken == RTF_BIN)
+ {
+ rInput.SeekRel(-1);
+ SAL_WARN_IF(nTokenValue < 0, "svtools", "negative value argument for rtf \\bin keyword");
+ if (nTokenValue > 0)
+ rInput.SeekRel(nTokenValue);
+ nNextCh = GetNextChar();
+ }
+ while (nNextCh==0xa || nNextCh==0xd)
+ {
+ nNextCh = GetNextChar();
+ }
+ } while (sal_Unicode(EOF) != nNextCh && IsParserWorking());
+
+ if( SvParserState::Pending != eState && '}' != nNextCh )
+ eState = SvParserState::Error;
+ _inSkipGroup--;
+}
+
+void SvRTFParser::ReadUnknownData() { SkipGroup(); }
+void SvRTFParser::ReadBitmapData() { SkipGroup(); }
+
+
+SvParserState SvRTFParser::CallParser()
+{
+ char cFirstCh(0);
+ nNextChPos = rInput.Tell();
+ rInput.ReadChar( cFirstCh );
+ nNextCh = static_cast<unsigned char>(cFirstCh);
+ eState = SvParserState::Working;
+ nOpenBrackets = 0;
+ eCodeSet = RTL_TEXTENCODING_MS_1252;
+ SetSrcEncoding( eCodeSet );
+
+ // the first two tokens should be '{' and \\rtf !!
+ if( '{' == GetNextToken() && RTF_RTF == GetNextToken() )
+ {
+ AddFirstRef();
+ // call ReleaseRef at end of this scope, even in the face of exceptions
+ comphelper::ScopeGuard g([this] {
+ if( SvParserState::Pending != eState )
+ ReleaseRef(); // now parser is not needed anymore
+ });
+ Continue( 0 );
+ }
+ else
+ eState = SvParserState::Error;
+
+ return eState;
+}
+
+void SvRTFParser::Continue( int nToken )
+{
+// DBG_ASSERT( SVPAR_CS_DONTKNOW == GetCharSet(),
+// "Characterset was changed." );
+
+ if( !nToken )
+ nToken = GetNextToken();
+
+ bool bLooping = false;
+
+ while (IsParserWorking() && !bLooping)
+ {
+ auto nCurrentTokenIndex = m_nTokenIndex;
+ auto nCurrentToken = nToken;
+
+ SaveState( nToken );
+ switch( nToken )
+ {
+ case '}':
+ if( nOpenBrackets )
+ goto NEXTTOKEN;
+ eState = SvParserState::Accepted;
+ break;
+
+ case '{':
+ // an unknown group ?
+ {
+ if( RTF_IGNOREFLAG != GetNextToken() )
+ nToken = SkipToken();
+ else if( RTF_UNKNOWNCONTROL != GetNextToken() )
+ nToken = SkipToken( -2 );
+ else
+ {
+ // filter immediately
+ ReadUnknownData();
+ nToken = GetNextToken();
+ if( '}' != nToken )
+ eState = SvParserState::Error;
+ break; // move to next token!!
+ }
+ }
+ goto NEXTTOKEN;
+
+ case RTF_UNKNOWNCONTROL:
+ break; // skip unknown token
+ case RTF_NEXTTYPE:
+ case RTF_ANSITYPE:
+ eCodeSet = RTL_TEXTENCODING_MS_1252;
+ SetSrcEncoding( eCodeSet );
+ break;
+ case RTF_MACTYPE:
+ eCodeSet = RTL_TEXTENCODING_APPLE_ROMAN;
+ SetSrcEncoding( eCodeSet );
+ break;
+ case RTF_PCTYPE:
+ eCodeSet = RTL_TEXTENCODING_IBM_437;
+ SetSrcEncoding( eCodeSet );
+ break;
+ case RTF_PCATYPE:
+ eCodeSet = RTL_TEXTENCODING_IBM_850;
+ SetSrcEncoding( eCodeSet );
+ break;
+ case RTF_ANSICPG:
+ eCodeSet = rtl_getTextEncodingFromWindowsCodePage(nTokenValue);
+ SetSrcEncoding(eCodeSet);
+ break;
+ default:
+NEXTTOKEN:
+ NextToken( nToken );
+ break;
+ }
+ if( IsParserWorking() )
+ SaveState( 0 ); // processed till here,
+ // continue with new token!
+ nToken = GetNextToken();
+ bLooping = nCurrentTokenIndex == m_nTokenIndex && nToken == nCurrentToken;
+ }
+ if( SvParserState::Accepted == eState && 0 < nOpenBrackets )
+ eState = SvParserState::Error;
+}
+
+void SvRTFParser::SetEncoding( rtl_TextEncoding eEnc )
+{
+ if (eEnc == RTL_TEXTENCODING_DONTKNOW)
+ eEnc = GetCodeSet();
+
+ if (!aParserStates.empty())
+ aParserStates.top().eCodeSet = eEnc;
+ SetSrcEncoding(eEnc);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/svrtf/rtfkeywd.cxx b/svtools/source/svrtf/rtfkeywd.cxx
new file mode 100644
index 000000000..e4864d7ed
--- /dev/null
+++ b/svtools/source/svrtf/rtfkeywd.cxx
@@ -0,0 +1,1202 @@
+/* -*- 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 .
+ */
+
+#include <o3tl/string_view.hxx>
+#include <rtl/ustring.hxx>
+#include <svtools/rtfkeywd.hxx>
+#include <svtools/rtftoken.h>
+
+#include <algorithm>
+#include <string_view>
+
+namespace {
+
+// the table is still to be sorted
+struct RTF_TokenEntry
+{
+ std::u16string_view sToken;
+ int nToken;
+};
+
+}
+
+// Flag: RTF-token table has been sorted
+static bool bSortKeyWords = false;
+
+static RTF_TokenEntry aRTFTokenTab[] = {
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_IGNORE), RTF_IGNOREFLAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RTF), RTF_RTF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ANSI), RTF_ANSITYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MAC), RTF_MACTYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PC), RTF_PCTYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PCA), RTF_PCATYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NEXTCSET), RTF_NEXTTYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_STYLESHEET), RTF_STYLESHEET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SBASEDON), RTF_SBASEDON},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SNEXT), RTF_SNEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FONTTBL), RTF_FONTTBL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DEFF), RTF_DEFF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FNIL), RTF_FNIL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FROMAN), RTF_FROMAN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FSWISS), RTF_FSWISS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FMODERN), RTF_FMODERN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FSCRIPT), RTF_FSCRIPT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FDECOR), RTF_FDECOR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTECH), RTF_FTECH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FCHARSET), RTF_FCHARSET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FALT), RTF_FALT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FPRQ), RTF_FPRQ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COLORTBL), RTF_COLORTBL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RED), RTF_RED},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GREEN), RTF_GREEN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BLUE), RTF_BLUE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CF), RTF_CF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CB), RTF_CB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_INFO), RTF_INFO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TITLE), RTF_TITLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SUBJECT), RTF_SUBJECT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AUTHOR), RTF_AUTHOR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OPERATOR), RTF_OPERATOR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_KEYWORDS), RTF_KEYWORDS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COMMENT), RTF_COMMENT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VERSION), RTF_VERSION},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOCCOMM), RTF_DOCCOMM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VERN), RTF_VERN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CREATIM), RTF_CREATIM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVTIM), RTF_REVTIM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PRINTIM), RTF_PRINTIM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BUPTIM), RTF_BUPTIM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EDMINS), RTF_EDMINS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOFPAGES), RTF_NOFPAGES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOFWORDS), RTF_NOFWORDS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOFCHARS), RTF_NOFCHARS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ID), RTF_ID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_YR), RTF_YR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MO), RTF_MO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DY), RTF_DY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HR), RTF_HR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MIN), RTF_MIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ANNOTATION), RTF_ANNOTATION},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ATNID), RTF_ATNID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTNOTE), RTF_FOOTNOTE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTER), RTF_FOOTER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERL), RTF_FOOTERL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERR), RTF_FOOTERR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERF), RTF_FOOTERF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADER), RTF_HEADER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERL), RTF_HEADERL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERR), RTF_HEADERR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERF), RTF_HEADERF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_XE), RTF_XE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BXE), RTF_BXE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_IXE), RTF_IXE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RXE), RTF_RXE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TXE), RTF_TXE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TC), RTF_TC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TCF), RTF_TCF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TCL), RTF_TCL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BKMKSTART), RTF_BKMKSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BKMKEND), RTF_BKMKEND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICT), RTF_PICT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICW), RTF_PICW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICH), RTF_PICH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WBMBITSPIXEL), RTF_WBMBITSPIXEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WBMPLANES), RTF_WBMPLANES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WBMWIDTHBYTES), RTF_WBMWIDTHBYTES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICWGOAL), RTF_PICWGOAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICHGOAL), RTF_PICHGOAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BIN), RTF_BIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICSCALEX), RTF_PICSCALEX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICSCALEY), RTF_PICSCALEY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICSCALED), RTF_PICSCALED},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WBITMAP), RTF_WBITMAP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WMETAFILE), RTF_WMETAFILE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MACPICT), RTF_MACPICT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICCROPT), RTF_PICCROPT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICCROPB), RTF_PICCROPB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICCROPL), RTF_PICCROPL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICCROPR), RTF_PICCROPR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FIELD), RTF_FIELD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDDIRTY), RTF_FLDDIRTY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDEDIT), RTF_FLDEDIT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDLOCK), RTF_FLDLOCK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDPRIV), RTF_FLDPRIV},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDINST), RTF_FLDINST},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDRSLT), RTF_FLDRSLT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PAPERW), RTF_PAPERW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PAPERH), RTF_PAPERH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGL), RTF_MARGL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGR), RTF_MARGR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGT), RTF_MARGT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGB), RTF_MARGB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FACINGP), RTF_FACINGP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GUTTER), RTF_GUTTER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DEFTAB), RTF_DEFTAB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WIDOWCTRL), RTF_WIDOWCTRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHHOTZ), RTF_HYPHHOTZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNSEP), RTF_FTNSEP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNSEPC), RTF_FTNSEPC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNCN), RTF_FTNCN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ENDNOTES), RTF_ENDNOTES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ENDDOC), RTF_ENDDOC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNTJ), RTF_FTNTJ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNBJ), RTF_FTNBJ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNSTART), RTF_FTNSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNRESTART), RTF_FTNRESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNSTART), RTF_PGNSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINESTART), RTF_LINESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LANDSCAPE), RTF_LANDSCAPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FRACWIDTH), RTF_FRACWIDTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NEXTFILE), RTF_NEXTFILE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TEMPLATE), RTF_TEMPLATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MAKEBACKUP), RTF_MAKEBACKUP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DEFFORMAT), RTF_DEFFORMAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVISIONS), RTF_REVISIONS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGMIRROR), RTF_MARGMIRROR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVPROP), RTF_REVPROP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVBAR), RTF_REVBAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTD), RTF_SECTD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SBKNONE), RTF_SBKNONE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SBKCOL), RTF_SBKCOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SBKPAGE), RTF_SBKPAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SBKEVEN), RTF_SBKEVEN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SBKODD), RTF_SBKODD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNSTARTS), RTF_PGNSTARTS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNCONT), RTF_PGNCONT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNRESTART), RTF_PGNRESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNDEC), RTF_PGNDEC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNUCRM), RTF_PGNUCRM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNLCRM), RTF_PGNLCRM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNUCLTR), RTF_PGNUCLTR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNLCLTR), RTF_PGNLCLTR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNX), RTF_PGNX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNY), RTF_PGNY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERY), RTF_HEADERY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERY), RTF_FOOTERY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINEMOD), RTF_LINEMOD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINEX), RTF_LINEX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINESTARTS), RTF_LINESTARTS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINERESTART), RTF_LINERESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINEPPAGE), RTF_LINEPAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINECONT), RTF_LINECONT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VERTALT), RTF_VERTALT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VERTALB), RTF_VERTALB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VERTALC), RTF_VERTALC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VERTALJ), RTF_VERTALJ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COLS), RTF_COLS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COLSX), RTF_COLSX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COLNO), RTF_COLNO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COLSR), RTF_COLSR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COLW), RTF_COLW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINEBETCOL), RTF_LINEBETCOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ENDNHERE), RTF_ENDNHERE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TITLEPG), RTF_TITLEPG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PARD), RTF_PARD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_S), RTF_S},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_QL), RTF_QL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_QR), RTF_QR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_QJ), RTF_QJ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_QC), RTF_QC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FI), RTF_FI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LI), RTF_LI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LIN), RTF_LIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RI), RTF_RI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RIN), RTF_RIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SB), RTF_SB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SA), RTF_SA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SL), RTF_SL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_INTBL), RTF_INTBL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_KEEP), RTF_KEEP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_KEEPN), RTF_KEEPN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVEL), RTF_LEVEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SBYS), RTF_SBYS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PAGEBB), RTF_PAGEBB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOLINE), RTF_NOLINE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TX), RTF_TX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TQL), RTF_TQL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TQR), RTF_TQR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TQC), RTF_TQC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TQDEC), RTF_TQDEC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TB), RTF_TB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRT), RTF_BRDRT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRB), RTF_BRDRB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRL), RTF_BRDRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRR), RTF_BRDRR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BOX), RTF_BOX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRS), RTF_BRDRS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTH), RTF_BRDRTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRSH), RTF_BRDRSH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRDB), RTF_BRDRDB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRDOT), RTF_BRDRDOT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRHAIR), RTF_BRDRHAIR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRSP), RTF_BRSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TLDOT), RTF_TLDOT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TLHYPH), RTF_TLHYPH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TLUL), RTF_TLUL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TLTH), RTF_TLTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSX), RTF_POSX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSXC), RTF_POSXC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSXI), RTF_POSXI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSXL), RTF_POSXL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSXO), RTF_POSXO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSXR), RTF_POSXR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSY), RTF_POSY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSYIL), RTF_POSYIL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSYT), RTF_POSYT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSYC), RTF_POSYC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSYB), RTF_POSYB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ABSW), RTF_ABSW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DXFRTEXT), RTF_DXFRTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PVMRG), RTF_PVMRG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PVPG), RTF_PVPG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PHMRG), RTF_PHMRG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PHPG), RTF_PHPG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PHCOL), RTF_PHCOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBRDRB), RTF_CLBRDRB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBRDRT), RTF_CLBRDRT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBRDRL), RTF_CLBRDRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBRDRR), RTF_CLBRDRR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADL), RTF_CLPADL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADT), RTF_CLPADT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADB), RTF_CLPADB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADR), RTF_CLPADR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADFL), RTF_CLPADFL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADFT), RTF_CLPADFT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADFB), RTF_CLPADFB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLPADFR), RTF_CLPADFR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TROWD), RTF_TROWD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRQL), RTF_TRQL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRQR), RTF_TRQR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRQC), RTF_TRQC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRGAPH), RTF_TRGAPH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRRH), RTF_TRRH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRLEFT), RTF_TRLEFT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CELLX), RTF_CELLX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLMGF), RTF_CLMGF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLMRG), RTF_CLMRG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PLAIN), RTF_PLAIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_B), RTF_B},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_I), RTF_I},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_STRIKE), RTF_STRIKE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OUTL), RTF_OUTL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHAD), RTF_SHAD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SCAPS), RTF_SCAPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CAPS), RTF_CAPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_V), RTF_V},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_F), RTF_F},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FS), RTF_FS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EXPND), RTF_EXPND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EXPNDTW), RTF_EXPNDTW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_KERNING), RTF_KERNING},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_UL), RTF_UL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULW), RTF_ULW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULD), RTF_ULD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULDB), RTF_ULDB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULNONE), RTF_ULNONE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_UP), RTF_UP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DN), RTF_DN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVISED), RTF_REVISED},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SUB), RTF_SUB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOSUPERSUB), RTF_NOSUPERSUB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SUPER), RTF_SUPER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHDATE), RTF_CHDATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHTIME), RTF_CHTIME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHPGN), RTF_CHPGN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHFTN), RTF_CHFTN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHATN), RTF_CHATN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHFTNSEP), RTF_CHFTNSEP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHFTNSEPC), RTF_CHFTNSEPC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FORMULA), RTF_FORMULA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOBREAK), RTF_NONBREAKINGSPACE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OPTHYPH), RTF_OPTIONALHYPHEN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOBRKHYPH), RTF_NONBREAKINGHYPHEN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEXCHAR), RTF_HEX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CELL), RTF_CELL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ROW), RTF_ROW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PAR), RTF_PAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECT), RTF_SECT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PAGE), RTF_PAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COLUMN), RTF_COLUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINE), RTF_LINE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TAB), RTF_TAB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SUBENTRY), RTF_SUBENTRYINDEX},
+
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DEFLANG), RTF_DEFLANG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LANG), RTF_LANG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PMMETAFILE), RTF_OSMETAFILE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DIBITMAP), RTF_DIBITMAP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_KEYCODE), RTF_KEYCODE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FN), RTF_FNKEY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ALT), RTF_ALTKEY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHIFT), RTF_SHIFTKEY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CTRL), RTF_CTRLKEY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHDPL), RTF_CHDATEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHDPA), RTF_CHDATEA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EMDASH), RTF_EMDASH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ENDASH), RTF_ENDASH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BULLET), RTF_BULLET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LQUOTE), RTF_LQUOTE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RQUOTE), RTF_RQUOTE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LDBLQUOTE), RTF_LDBLQUOTE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RDBLQUOTE), RTF_RDBLQUOTE},
+
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BKMKCOLF), RTF_BKMKCOLF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BKMKCOLL), RTF_BKMKCOLL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PSOVER), RTF_PSOVER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOCTEMP), RTF_DOCTEMP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BINFSXN), RTF_BINFSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BINSXN), RTF_BINSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGWSXN), RTF_PGWSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGHSXN), RTF_PGHSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGLSXN), RTF_MARGLSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGRSXN), RTF_MARGRSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGTSXN), RTF_MARGTSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MARGBSXN), RTF_MARGBSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GUTTERSXN), RTF_GUTTERSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LNDSCPSXN), RTF_LNDSCPSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FACPGSXN), RTF_FACPGSXN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TLEQ), RTF_TLEQ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRBTW), RTF_BRDRBTW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRBAR), RTF_BRDRBAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRW), RTF_BRDRW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRCF), RTF_BRDRCF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ABSH), RTF_ABSH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PVPARA), RTF_PVPARA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOWRAP), RTF_NOWRAP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRMTXTX), RTF_DFRMTXTX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRMTXTY), RTF_DFRMTXTY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DROPCAPLI), RTF_DROPCAPLI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DROPCAPT), RTF_DROPCAPT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ABSNOOVRLP), RTF_ABSNOOVRLP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSNEGX), RTF_POSNEGX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSNEGY), RTF_POSNEGY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DELETED), RTF_DELETED},
+
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHADING), RTF_SHADING},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGHORIZ), RTF_BGHORIZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGVERT), RTF_BGVERT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGFDIAG), RTF_BGFDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGBDIAG), RTF_BGBDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGCROSS), RTF_BGCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGDCROSS), RTF_BGDCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGDKHORIZ), RTF_BGDKHORIZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGDKVERT), RTF_BGDKVERT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGDKFDIAG), RTF_BGDKFDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGDKBDIAG), RTF_BGDKBDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGDKCROSS), RTF_BGDKCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BGDKDCROSS), RTF_BGDKDCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CFPAT), RTF_CFPAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CBPAT), RTF_CBPAT},
+
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLSHDNG), RTF_CLSHDNG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGHORIZ), RTF_CLBGHORIZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGVERT), RTF_CLBGVERT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGFDIAG), RTF_CLBGFDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGBDIAG), RTF_CLBGBDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGCROSS), RTF_CLBGCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGDCROSS), RTF_CLBGDCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGDKHOR), RTF_CLBGDKHOR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGDKVERT), RTF_CLBGDKVERT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGDKFDIAG), RTF_CLBGDKFDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGDKBDIAG), RTF_CLBGDKBDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGDKCROSS), RTF_CLBGDKCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLBGDKDCROSS), RTF_CLBGDKDCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLCFPAT), RTF_CLCFPAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLCBPAT), RTF_CLCBPAT},
+
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AB), RTF_AB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ACAPS), RTF_ACAPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ACF), RTF_ACF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ADDITIVE), RTF_ADDITIVE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ADN), RTF_ADN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AENDDOC), RTF_AENDDOC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AENDNOTES), RTF_AENDNOTES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AEXPND), RTF_AEXPND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AF), RTF_AF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFS), RTF_AFS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNBJ), RTF_AFTNBJ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNCN), RTF_AFTNCN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNALC), RTF_AFTNNALC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNAR), RTF_AFTNNAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNAUC), RTF_AFTNNAUC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNCHI), RTF_AFTNNCHI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNRLC), RTF_AFTNNRLC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNRUC), RTF_AFTNNRUC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNRESTART), RTF_AFTNRESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNRSTCONT), RTF_AFTNRSTCONT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNSEP), RTF_AFTNSEP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNSEPC), RTF_AFTNSEPC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNSTART), RTF_AFTNSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNTJ), RTF_AFTNTJ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AI), RTF_AI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ALANG), RTF_ALANG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ALLPROT), RTF_ALLPROT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ANNOTPROT), RTF_ANNOTPROT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AOUTL), RTF_AOUTL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ASCAPS), RTF_ASCAPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ASHAD), RTF_ASHAD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ASTRIKE), RTF_ASTRIKE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ATNAUTHOR), RTF_ATNAUTHOR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ATNICN), RTF_ATNICN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ATNREF), RTF_ATNREF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ATNTIME), RTF_ATNTIME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ATRFEND), RTF_ATRFEND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ATRFSTART), RTF_ATRFSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AUL), RTF_AUL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AULD), RTF_AULD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AULDB), RTF_AULDB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AULNONE), RTF_AULNONE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AULW), RTF_AULW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AUP), RTF_AUP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BKMKPUB), RTF_BKMKPUB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRDASH), RTF_BRDRDASH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRKFRM), RTF_BRKFRM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CCHS), RTF_CCHS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CPG), RTF_CPG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CS), RTF_CS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CVMME), RTF_CVMME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DATAFIELD), RTF_DATAFIELD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DO), RTF_DO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOBXCOLUMN), RTF_DOBXCOLUMN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOBXMARGIN), RTF_DOBXMARGIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOBXPAGE), RTF_DOBXPAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOBYMARGIN), RTF_DOBYMARGIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOBYPAGE), RTF_DOBYPAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOBYPARA), RTF_DOBYPARA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DODHGT), RTF_DODHGT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOLOCK), RTF_DOLOCK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPAENDHOL), RTF_DPAENDHOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPAENDL), RTF_DPAENDL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPAENDSOL), RTF_DPAENDSOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPAENDW), RTF_DPAENDW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPARC), RTF_DPARC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPARCFLIPX), RTF_DPARCFLIPX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPARCFLIPY), RTF_DPARCFLIPY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPASTARTHOL), RTF_DPASTARTHOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPASTARTL), RTF_DPASTARTL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPASTARTSOL), RTF_DPASTARTSOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPASTARTW), RTF_DPASTARTW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCALLOUT), RTF_DPCALLOUT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOA), RTF_DPCOA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOACCENT), RTF_DPCOACCENT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOBESTFIT), RTF_DPCOBESTFIT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOBORDER), RTF_DPCOBORDER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCODABS), RTF_DPCODABS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCODBOTTOM), RTF_DPCODBOTTOM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCODCENTER), RTF_DPCODCENTER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCODTOP), RTF_DPCODTOP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOLENGTH), RTF_DPCOLENGTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOMINUSX), RTF_DPCOMINUSX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOMINUSY), RTF_DPCOMINUSY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOOFFSET), RTF_DPCOOFFSET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOSMARTA), RTF_DPCOSMARTA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOTDOUBLE), RTF_DPCOTDOUBLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOTRIGHT), RTF_DPCOTRIGHT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOTSINGLE), RTF_DPCOTSINGLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOTTRIPLE), RTF_DPCOTTRIPLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCOUNT), RTF_DPCOUNT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPELLIPSE), RTF_DPELLIPSE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPENDGROUP), RTF_DPENDGROUP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLBGCB), RTF_DPFILLBGCB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLBGCG), RTF_DPFILLBGCG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLBGCR), RTF_DPFILLBGCR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLBGGRAY), RTF_DPFILLBGGRAY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLBGPAL), RTF_DPFILLBGPAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLFGCB), RTF_DPFILLFGCB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLFGCG), RTF_DPFILLFGCG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLFGCR), RTF_DPFILLFGCR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLFGGRAY), RTF_DPFILLFGGRAY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLFGPAL), RTF_DPFILLFGPAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPFILLPAT), RTF_DPFILLPAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPGROUP), RTF_DPGROUP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINE), RTF_DPLINE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINECOB), RTF_DPLINECOB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINECOG), RTF_DPLINECOG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINECOR), RTF_DPLINECOR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEDADO), RTF_DPLINEDADO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEDADODO), RTF_DPLINEDADODO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEDASH), RTF_DPLINEDASH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEDOT), RTF_DPLINEDOT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEGRAY), RTF_DPLINEGRAY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEHOLLOW), RTF_DPLINEHOLLOW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEPAL), RTF_DPLINEPAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINESOLID), RTF_DPLINESOLID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPLINEW), RTF_DPLINEW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPPOLYCOUNT), RTF_DPPOLYCOUNT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPPOLYGON), RTF_DPPOLYGON},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPPOLYLINE), RTF_DPPOLYLINE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPPTX), RTF_DPPTX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPPTY), RTF_DPPTY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPRECT), RTF_DPRECT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPROUNDR), RTF_DPROUNDR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPSHADOW), RTF_DPSHADOW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPSHADX), RTF_DPSHADX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPSHADY), RTF_DPSHADY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPTXBX), RTF_DPTXBX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPTXBXMAR), RTF_DPTXBXMAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPTXBXTEXT), RTF_DPTXBXTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPX), RTF_DPX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPXSIZE), RTF_DPXSIZE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPY), RTF_DPY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPYSIZE), RTF_DPYSIZE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DS), RTF_DS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EMSPACE), RTF_EMSPACE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ENSPACE), RTF_ENSPACE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FBIDI), RTF_FBIDI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FET), RTF_FET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FID), RTF_FID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FILE), RTF_FILE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FILETBL), RTF_FILETBL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDALT), RTF_FLDALT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FNETWORK), RTF_FNETWORK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FONTEMB), RTF_FONTEMB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FONTFILE), RTF_FONTFILE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FORMDISP), RTF_FORMDISP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FORMPROT), RTF_FORMPROT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FORMSHADE), RTF_FORMSHADE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOSNUM), RTF_FOSNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FRELATIVE), RTF_FRELATIVE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNALT), RTF_FTNALT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNIL), RTF_FTNIL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNALC), RTF_FTNNALC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNAR), RTF_FTNNAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNAUC), RTF_FTNNAUC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNCHI), RTF_FTNNCHI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNRLC), RTF_FTNNRLC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNRUC), RTF_FTNNRUC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNRSTCONT), RTF_FTNRSTCONT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNRSTPG), RTF_FTNRSTPG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTTRUETYPE), RTF_FTTRUETYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FVALIDDOS), RTF_FVALIDDOS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FVALIDHPFS), RTF_FVALIDHPFS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FVALIDMAC), RTF_FVALIDMAC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FVALIDNTFS), RTF_FVALIDNTFS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHAUTO), RTF_HYPHAUTO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHCAPS), RTF_HYPHCAPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHCONSEC), RTF_HYPHCONSEC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHPAR), RTF_HYPHPAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINKSELF), RTF_LINKSELF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINKSTYLES), RTF_LINKSTYLES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LTRCH), RTF_LTRCH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LTRDOC), RTF_LTRDOC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LTRMARK), RTF_LTRMARK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LTRPAR), RTF_LTRPAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LTRROW), RTF_LTRROW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LTRSECT), RTF_LTRSECT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOCOLBAL), RTF_NOCOLBAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOEXTRASPRL), RTF_NOEXTRASPRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOTABIND), RTF_NOTABIND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOWIDCTLPAR), RTF_NOWIDCTLPAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJALIAS), RTF_OBJALIAS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJALIGN), RTF_OBJALIGN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJAUTLINK), RTF_OBJAUTLINK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJCLASS), RTF_OBJCLASS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJCROPB), RTF_OBJCROPB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJCROPL), RTF_OBJCROPL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJCROPR), RTF_OBJCROPR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJCROPT), RTF_OBJCROPT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJDATA), RTF_OBJDATA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJECT), RTF_OBJECT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJEMB), RTF_OBJEMB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJH), RTF_OBJH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJICEMB), RTF_OBJICEMB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJLINK), RTF_OBJLINK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJLOCK), RTF_OBJLOCK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJNAME), RTF_OBJNAME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJPUB), RTF_OBJPUB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJSCALEX), RTF_OBJSCALEX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJSCALEY), RTF_OBJSCALEY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJSECT), RTF_OBJSECT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJSETSIZE), RTF_OBJSETSIZE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJSUB), RTF_OBJSUB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJTIME), RTF_OBJTIME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJTRANSY), RTF_OBJTRANSY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJUPDATE), RTF_OBJUPDATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJW), RTF_OBJW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OTBLRUL), RTF_OTBLRUL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNHN), RTF_PGNHN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNHNSC), RTF_PGNHNSC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNHNSH), RTF_PGNHNSH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNHNSM), RTF_PGNHNSM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNHNSN), RTF_PGNHNSN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNHNSP), RTF_PGNHNSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICBMP), RTF_PICBMP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICBPP), RTF_PICBPP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PN), RTF_PN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNACROSS), RTF_PNACROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNB), RTF_PNB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNCAPS), RTF_PNCAPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNCARD), RTF_PNCARD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNCF), RTF_PNCF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNDEC), RTF_PNDEC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNF), RTF_PNF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNFS), RTF_PNFS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNHANG), RTF_PNHANG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNI), RTF_PNI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNINDENT), RTF_PNINDENT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNLCLTR), RTF_PNLCLTR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNLCRM), RTF_PNLCRM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNLVL), RTF_PNLVL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNLVLBLT), RTF_PNLVLBLT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNLVLBODY), RTF_PNLVLBODY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNLVLCONT), RTF_PNLVLCONT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNNUMONCE), RTF_PNNUMONCE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNORD), RTF_PNORD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNORDT), RTF_PNORDT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNPREV), RTF_PNPREV},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNQC), RTF_PNQC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNQL), RTF_PNQL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNQR), RTF_PNQR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRESTART), RTF_PNRESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNSCAPS), RTF_PNSCAPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNSECLVL), RTF_PNSECLVL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNSP), RTF_PNSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNSTART), RTF_PNSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNSTRIKE), RTF_PNSTRIKE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNTEXT), RTF_PNTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNTXTA), RTF_PNTXTA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNTXTB), RTF_PNTXTB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNUCLTR), RTF_PNUCLTR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNUCRM), RTF_PNUCRM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNUL), RTF_PNUL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNULD), RTF_PNULD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNULDB), RTF_PNULDB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNULNONE), RTF_PNULNONE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNULW), RTF_PNULW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PRCOLBL), RTF_PRCOLBL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PRINTDATA), RTF_PRINTDATA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PSZ), RTF_PSZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PUBAUTO), RTF_PUBAUTO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RESULT), RTF_RESULT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVAUTH), RTF_REVAUTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVDTTM), RTF_REVDTTM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVPROT), RTF_REVPROT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVTBL), RTF_REVTBL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RSLTBMP), RTF_RSLTBMP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RSLTMERGE), RTF_RSLTMERGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RSLTPICT), RTF_RSLTPICT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RSLTRTF), RTF_RSLTRTF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RSLTTXT), RTF_RSLTTXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RTLCH), RTF_RTLCH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RTLDOC), RTF_RTLDOC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RTLMARK), RTF_RTLMARK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RTLPAR), RTF_RTLPAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RTLROW), RTF_RTLROW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_RTLSECT), RTF_RTLSECT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SEC), RTF_SEC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTNUM), RTF_SECTNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTUNLOCKED), RTF_SECTUNLOCKED},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SLMULT), RTF_SLMULT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SOFTCOL), RTF_SOFTCOL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SOFTLHEIGHT), RTF_SOFTLHEIGHT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SOFTLINE), RTF_SOFTLINE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SOFTPAGE), RTF_SOFTPAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SPRSSPBF), RTF_SPRSSPBF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SPRSTSP), RTF_SPRSTSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SUBDOCUMENT), RTF_SUBDOCUMENT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SWPBDR), RTF_SWPBDR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TCN), RTF_TCN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRANSMF), RTF_TRANSMF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRBRDRB), RTF_TRBRDRB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRBRDRH), RTF_TRBRDRH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRBRDRL), RTF_TRBRDRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRBRDRR), RTF_TRBRDRR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRBRDRT), RTF_TRBRDRT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRBRDRV), RTF_TRBRDRV},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRHDR), RTF_TRHDR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRKEEP), RTF_TRKEEP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDB), RTF_TRPADDB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDL), RTF_TRPADDL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDR), RTF_TRPADDR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDT), RTF_TRPADDT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDFB), RTF_TRPADDFB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDFL), RTF_TRPADDFL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDFR), RTF_TRPADDFR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRPADDFT), RTF_TRPADDFT},
+
+
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WRAPTRSP), RTF_WRAPTRSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_XEF), RTF_XEF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ZWJ), RTF_ZWJ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ZWNJ), RTF_ZWNJ},
+
+
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ABSLOCK), RTF_ABSLOCK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ADJUSTRIGHT), RTF_ADJUSTRIGHT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNCHOSUNG), RTF_AFTNNCHOSUNG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNCNUM), RTF_AFTNNCNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNDBAR), RTF_AFTNNDBAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNDBNUM), RTF_AFTNNDBNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNDBNUMD), RTF_AFTNNDBNUMD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNDBNUMK), RTF_AFTNNDBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNDBNUMT), RTF_AFTNNDBNUMT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNGANADA), RTF_AFTNNGANADA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNGBNUM), RTF_AFTNNGBNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNGBNUMD), RTF_AFTNNGBNUMD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNGBNUMK), RTF_AFTNNGBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNGBNUML), RTF_AFTNNGBNUML},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNZODIAC), RTF_AFTNNZODIAC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNZODIACD), RTF_AFTNNZODIACD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_AFTNNZODIACL), RTF_AFTNNZODIACL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ANIMTEXT), RTF_ANIMTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ANSICPG), RTF_ANSICPG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BACKGROUND), RTF_BACKGROUND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BDBFHDR), RTF_BDBFHDR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BLIPTAG), RTF_BLIPTAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BLIPUID), RTF_BLIPUID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BLIPUPI), RTF_BLIPUPI},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRART), RTF_BRDRART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRDASHD), RTF_BRDRDASHD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRDASHDD), RTF_BRDRDASHDD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRDASHDOTSTR),RTF_BRDRDASHDOTSTR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRDASHSM), RTF_BRDRDASHSM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRINSET), RTF_BRDRINSET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDROUTSET), RTF_BRDROUTSET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDREMBOSS), RTF_BRDREMBOSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRENGRAVE), RTF_BRDRENGRAVE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRFRAME), RTF_BRDRFRAME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTHTNLG), RTF_BRDRTHTNLG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTHTNMG), RTF_BRDRTHTNMG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTHTNSG), RTF_BRDRTHTNSG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTNTHLG), RTF_BRDRTNTHLG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTNTHMG), RTF_BRDRTNTHMG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTNTHSG), RTF_BRDRTNTHSG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTNTHTNLG), RTF_BRDRTNTHTNLG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTNTHTNMG), RTF_BRDRTNTHTNMG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTNTHTNSG), RTF_BRDRTNTHTNSG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRTRIPLE), RTF_BRDRTRIPLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRWAVY), RTF_BRDRWAVY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDRWAVYDB), RTF_BRDRWAVYDB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CATEGORY), RTF_CATEGORY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CGRID), RTF_CGRID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHARSCALEX), RTF_CHARSCALEX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGBDIAG), RTF_CHBGBDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGCROSS), RTF_CHBGCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGDCROSS), RTF_CHBGDCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGDKBDIAG), RTF_CHBGDKBDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGDKCROSS), RTF_CHBGDKCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGDKDCROSS), RTF_CHBGDKDCROSS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGDKFDIAG), RTF_CHBGDKFDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGDKHORIZ), RTF_CHBGDKHORIZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGDKVERT), RTF_CHBGDKVERT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGFDIAG), RTF_CHBGFDIAG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGHORIZ), RTF_CHBGHORIZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBGVERT), RTF_CHBGVERT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHBRDR), RTF_CHBRDR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHCBPAT), RTF_CHCBPAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHCFPAT), RTF_CHCFPAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CHSHDNG), RTF_CHSHDNG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLTXLRTB), RTF_CLTXLRTB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLTXTBRL), RTF_CLTXTBRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLVERTALB), RTF_CLVERTALB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLVERTALC), RTF_CLVERTALC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLVERTALT), RTF_CLVERTALT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLVMGF), RTF_CLVMGF},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLVMRG), RTF_CLVMRG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLTXTBRLV), RTF_CLTXTBRLV},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLTXBTLR), RTF_CLTXBTLR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CLTXLRTBV), RTF_CLTXLRTBV},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_COMPANY), RTF_COMPANY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CRAUTH), RTF_CRAUTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_CRDATE), RTF_CRDATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DATE), RTF_DATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DEFLANGFE), RTF_DEFLANGFE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRAUTH), RTF_DFRAUTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRDATE), RTF_DFRDATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRSTART), RTF_DFRSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRSTOP), RTF_DFRSTOP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRXST), RTF_DFRXST},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DGMARGIN), RTF_DGMARGIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DNTBLNSBDB), RTF_DNTBLNSBDB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOCTYPE), RTF_DOCTYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DOCVAR), RTF_DOCVAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DPCODESCENT), RTF_DPCODESCENT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EMBO), RTF_EMBO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EMFBLIP), RTF_EMFBLIP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_EXPSHRTN), RTF_EXPSHRTN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FAAUTO), RTF_FAAUTO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FBIAS), RTF_FBIAS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFDEFRES), RTF_FFDEFRES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFDEFTEXT), RTF_FFDEFTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFENTRYMCR), RTF_FFENTRYMCR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFEXITMCR), RTF_FFEXITMCR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFFORMAT), RTF_FFFORMAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFHASLISTBOX), RTF_FFHASLISTBOX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFHELPTEXT), RTF_FFHELPTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFHPS), RTF_FFHPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFL), RTF_FFL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFMAXLEN), RTF_FFMAXLEN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFNAME), RTF_FFNAME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFOWNHELP), RTF_FFOWNHELP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFOWNSTAT), RTF_FFOWNSTAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFPROT), RTF_FFPROT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFRECALC), RTF_FFRECALC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFRES), RTF_FFRES},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFSIZE), RTF_FFSIZE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFSTATTEXT), RTF_FFSTATTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFTYPE), RTF_FFTYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FFTYPETXT), RTF_FFTYPETXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLDTYPE), RTF_FLDTYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FNAME), RTF_FNAME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FORMFIELD), RTF_FORMFIELD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FROMTEXT), RTF_FROMTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNCHOSUNG), RTF_FTNNCHOSUNG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNCNUM), RTF_FTNNCNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNDBAR), RTF_FTNNDBAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNDBNUM), RTF_FTNNDBNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNDBNUMD), RTF_FTNNDBNUMD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNDBNUMK), RTF_FTNNDBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNDBNUMT), RTF_FTNNDBNUMT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNGANADA), RTF_FTNNGANADA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNGBNUM), RTF_FTNNGBNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNGBNUMD), RTF_FTNNGBNUMD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNGBNUMK), RTF_FTNNGBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNGBNUML), RTF_FTNNGBNUML},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNZODIAC), RTF_FTNNZODIAC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNZODIACD), RTF_FTNNZODIACD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FTNNZODIACL), RTF_FTNNZODIACL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_G), RTF_G},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GCW), RTF_GCW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GRIDTBL), RTF_GRIDTBL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HIGHLIGHT), RTF_HIGHLIGHT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HLFR), RTF_HLFR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HLINKBASE), RTF_HLINKBASE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HLLOC), RTF_HLLOC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HLSRC), RTF_HLSRC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ILVL), RTF_ILVL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_IMPR), RTF_IMPR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_JPEGBLIP), RTF_JPEGBLIP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELFOLLOW), RTF_LEVELFOLLOW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELINDENT), RTF_LEVELINDENT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELJC), RTF_LEVELJC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELLEGAL), RTF_LEVELLEGAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELNFC), RTF_LEVELNFC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELNORESTART),RTF_LEVELNORESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELNUMBERS), RTF_LEVELNUMBERS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELOLD), RTF_LEVELOLD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELPREV), RTF_LEVELPREV},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELPREVSPACE),RTF_LEVELPREVSPACE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELSPACE), RTF_LEVELSPACE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELSTARTAT), RTF_LEVELSTARTAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LEVELTEXT), RTF_LEVELTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LINKVAL), RTF_LINKVAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LIST), RTF_LIST},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTID), RTF_LISTID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTLEVEL), RTF_LISTLEVEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTNAME), RTF_LISTNAME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTOVERRIDE), RTF_LISTOVERRIDE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTOVERRIDECOUNT), RTF_LISTOVERRIDECOUNT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTOVERRIDEFORMAT), RTF_LISTOVERRIDEFORMAT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTOVERRIDESTART), RTF_LISTOVERRIDESTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTOVERRIDETABLE), RTF_LISTOVERRIDETABLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTRESTARTHDN),RTF_LISTRESTARTHDN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTSIMPLE), RTF_LISTSIMPLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTTABLE), RTF_LISTTABLE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTTEMPLATEID),RTF_LISTTEMPLATEID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LISTTEXT), RTF_LISTTEXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LS), RTF_LS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LYTEXCTTP), RTF_LYTEXCTTP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LYTPRTMET), RTF_LYTPRTMET},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MANAGER), RTF_MANAGER},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_MSMCAP), RTF_MSMCAP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOFCHARSWS), RTF_NOFCHARSWS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOLEAD), RTF_NOLEAD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NONSHPPICT), RTF_NONSHPPICT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOSECTEXPAND), RTF_NOSECTEXPAND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOSNAPLINEGRID),RTF_NOSNAPLINEGRID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOSPACEFORUL), RTF_NOSPACEFORUL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOULTRLSPC), RTF_NOULTRLSPC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOXLATTOYEN), RTF_NOXLATTOYEN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJATTPH), RTF_OBJATTPH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJHTML), RTF_OBJHTML},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OBJOCX), RTF_OBJOCX},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLDLINEWRAP), RTF_OLDLINEWRAP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OUTLINELEVEL), RTF_OUTLINELEVEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OVERLAY), RTF_OVERLAY},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PANOSE), RTF_PANOSE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDRB), RTF_PGBRDRB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDRFOOT), RTF_PGBRDRFOOT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDRHEAD), RTF_PGBRDRHEAD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDRL), RTF_PGBRDRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDROPT), RTF_PGBRDROPT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDRR), RTF_PGBRDRR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDRSNAP), RTF_PGBRDRSNAP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRDRT), RTF_PGBRDRT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNCHOSUNG), RTF_PGNCHOSUNG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNCNUM), RTF_PGNCNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNDBNUMK), RTF_PGNDBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNDBNUMT), RTF_PGNDBNUMT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNGANADA), RTF_PGNGANADA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNGBNUM), RTF_PGNGBNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNGBNUMD), RTF_PGNGBNUMD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNGBNUMK), RTF_PGNGBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNGBNUML), RTF_PGNGBNUML},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNZODIAC), RTF_PGNZODIAC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNZODIACD), RTF_PGNZODIACD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGNZODIACL), RTF_PGNZODIACL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PICPROP), RTF_PICPROP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNAIUEO), RTF_PNAIUEO},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNAIUEOD), RTF_PNAIUEOD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNCHOSUNG), RTF_PNCHOSUNG},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNDBNUMD), RTF_PNDBNUMD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNDBNUMK), RTF_PNDBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNDBNUML), RTF_PNDBNUML},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNDBNUMT), RTF_PNDBNUMT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNGANADA), RTF_PNGANADA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNGBLIP), RTF_PNGBLIP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNGBNUM), RTF_PNGBNUM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNGBNUMD), RTF_PNGBNUMD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNGBNUMK), RTF_PNGBNUMK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNGBNUML), RTF_PNGBNUML},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRAUTH), RTF_PNRAUTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRDATE), RTF_PNRDATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRNFC), RTF_PNRNFC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRNOT), RTF_PNRNOT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRPNBR), RTF_PNRPNBR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRRGB), RTF_PNRRGB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRSTART), RTF_PNRSTART},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRSTOP), RTF_PNRSTOP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNRXST), RTF_PNRXST},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNZODIAC), RTF_PNZODIAC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNZODIACD), RTF_PNZODIACD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PNZODIACL), RTF_PNZODIACL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LFOLEVEL), RTF_LFOLEVEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSYIN), RTF_POSYIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_POSYOUT), RTF_POSYOUT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PRIVATE), RTF_PRIVATE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PROPNAME), RTF_PROPNAME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PROPTYPE), RTF_PROPTYPE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVAUTHDEL), RTF_REVAUTHDEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_REVDTTMDEL), RTF_REVDTTMDEL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SAUTOUPD), RTF_SAUTOUPD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTDEFAULTCL), RTF_SECTDEFAULTCL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTEXPAND), RTF_SECTEXPAND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTLINEGRID), RTF_SECTLINEGRID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTSPECIFYCL), RTF_SECTSPECIFYCL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SECTSPECIFYL), RTF_SECTSPECIFYL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHIDDEN), RTF_SHIDDEN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPBOTTOM), RTF_SHPBOTTOM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPBXCOLUMN), RTF_SHPBXCOLUMN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPBXMARGIN), RTF_SHPBXMARGIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPBXPAGE), RTF_SHPBXPAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPBYMARGIN), RTF_SHPBYMARGIN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPBYPAGE), RTF_SHPBYPAGE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPBYPARA), RTF_SHPBYPARA},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPFBLWTXT), RTF_SHPFBLWTXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPFHDR), RTF_SHPFHDR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPGRP), RTF_SHPGRP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPINST), RTF_SHPINST},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPLEFT), RTF_SHPLEFT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPLID), RTF_SHPLID},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPLOCKANCHOR), RTF_SHPLOCKANCHOR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPPICT), RTF_SHPPICT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPRIGHT), RTF_SHPRIGHT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPRSLT), RTF_SHPRSLT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPTOP), RTF_SHPTOP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPTXT), RTF_SHPTXT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPWRK), RTF_SHPWRK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPWR), RTF_SHPWR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHPZ), RTF_SHPZ},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SPRSBSP), RTF_SPRSBSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SPRSLNSP), RTF_SPRSLNSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SPRSTSM), RTF_SPRSTSM},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_STATICVAL), RTF_STATICVAL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_STEXTFLOW), RTF_STEXTFLOW},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_STRIKED), RTF_STRIKED},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SUBFONTBYSIZE), RTF_SUBFONTBYSIZE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TCELLD), RTF_TCELLD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TIME), RTF_TIME},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TRUNCATEFONTHEIGHT), RTF_TRUNCATEFONTHEIGHT},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_UC), RTF_UC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_UD), RTF_UD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULDASH), RTF_ULDASH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULDASHD), RTF_ULDASHD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULDASHDD), RTF_ULDASHDD},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULTH), RTF_ULTH},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULWAVE), RTF_ULWAVE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULC), RTF_ULC},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_U), RTF_U},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_UPR), RTF_UPR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_USERPROPS), RTF_USERPROPS},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VIEWKIND), RTF_VIEWKIND},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VIEWSCALE), RTF_VIEWSCALE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_VIEWZK), RTF_VIEWZK},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WIDCTLPAR), RTF_WIDCTLPAR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WINDOWCAPTION), RTF_WINDOWCAPTION},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WPEQN), RTF_WPEQN},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WPJST), RTF_WPJST},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_WPSP), RTF_WPSP},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_YXE), RTF_YXE},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FRMTXLRTB), RTF_FRMTXLRTB},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FRMTXTBRL), RTF_FRMTXTBRL},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FRMTXBTLR), RTF_FRMTXBTLR},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FRMTXLRTBV), RTF_FRMTXLRTBV},
+{std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FRMTXTBRLV), RTF_FRMTXTBRLV},
+
+// MS-2000 Tokens
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULTHD), RTF_ULTHD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULTHDASH), RTF_ULTHDASH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULLDASH), RTF_ULLDASH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULTHLDASH), RTF_ULTHLDASH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULTHDASHD), RTF_ULTHDASHD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULTHDASHDD), RTF_ULTHDASHDD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULHWAVE), RTF_ULHWAVE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ULULDBWAVE), RTF_ULULDBWAVE},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LOCH), RTF_LOCH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HICH), RTF_HICH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DBCH), RTF_DBCH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_LANGFE), RTF_LANGFE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ADEFLANG), RTF_ADEFLANG},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ADEFF), RTF_ADEFF},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ACCNONE), RTF_ACCNONE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ACCDOT), RTF_ACCDOT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ACCCOMMA), RTF_ACCCOMMA},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TWOINONE), RTF_TWOINONE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HORZVERT), RTF_HORZVERT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FAHANG), RTF_FAHANG},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FAVAR), RTF_FAVAR},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FACENTER), RTF_FACENTER},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FAROMAN), RTF_FAROMAN},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FAFIXED), RTF_FAFIXED},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOCWRAP), RTF_NOCWRAP},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_NOOVERFLOW), RTF_NOOVERFLOW},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_ASPALPHA), RTF_ASPALPHA},
+
+// SWG specific attributes
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GRFALIGNV), RTF_GRF_ALIGNV},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GRFALIGNH), RTF_GRF_ALIGNH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_GRFMIRROR), RTF_GRF_MIRROR},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERYB), RTF_HEADER_YB},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERXL), RTF_HEADER_XL},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERXR), RTF_HEADER_XR},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERYT), RTF_FOOTER_YT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERXL), RTF_FOOTER_XL},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERXR), RTF_FOOTER_XR},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HEADERYH), RTF_HEADER_YH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FOOTERYH), RTF_FOOTER_YH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BALANCEDCOLUMN),RTF_BALANCED_COLUMN},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_UPDNPROP), RTF_SWG_ESCPROP},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PRTDATA), RTF_SWG_PRTDATA},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BKMKKEY), RTF_BKMK_KEY},
+
+// Attributes for fly frames
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYPRINT), RTF_FLYPRINT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYOPAQUE), RTF_FLYOPAQUE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYPRTCTD), RTF_FLYPRTCTD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYMAINCNT), RTF_FLYMAINCNT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYVERT), RTF_FLYVERT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYHORZ), RTF_FLYHORZ},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRMTXTL), RTF_FLYOUTLEFT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRMTXTR), RTF_FLYOUTRIGHT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRMTXTU), RTF_FLYOUTUPPER},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_DFRMTXTW), RTF_FLYOUTLOWER},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYANCHOR), RTF_FLYANCHOR},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYCNTNT), RTF_FLY_CNTNT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYCOLUMN), RTF_FLY_COLUMN},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYPAGE), RTF_FLY_PAGE},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDBOX), RTF_BRDBOX},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDLNCOL), RTF_BRDLINE_COL},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDLNIN), RTF_BRDLINE_IN},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDLNOUT), RTF_BRDLINE_OUT},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_BRDLNDIST), RTF_BRDLINE_DIST},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHADOW), RTF_SHADOW},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHDWDIST), RTF_SHDW_DIST},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHDWSTYLE), RTF_SHDW_STYLE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHDWCOL), RTF_SHDW_COL},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHDWFCOL), RTF_SHDW_FCOL},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_FLYINPARA), RTF_FLY_INPARA},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGDSCTBL), RTF_PGDSCTBL},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGDSC), RTF_PGDSC},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGDSCUSE), RTF_PGDSCUSE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGDSCNXT), RTF_PGDSCNXT},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHEN), RTF_HYPHEN},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHLEAD), RTF_HYPHLEAD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHTRAIL), RTF_HYPHTRAIL},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_HYPHMAX), RTF_HYPHMAX},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_TLSWG), RTF_TLSWG},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGBRK), RTF_PGBRK},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_PGDSCNO), RTF_PGDSCNO},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SOUTLVL), RTF_SOUTLVL},
+
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SHP), RTF_SHP},
+ /*
+ {OUStringLiteral(OOO_STRING_SVTOOLS_RTF_SHPLEFT), RTF_SHPLEFT}
+ {OUStringLiteral(OOO_STRING_SVTOOLS_RTF_SHPTOP), RTF_SHPTOP}
+ {OUStringLiteral(OOO_STRING_SVTOOLS_RTF_SHPBOTTOM), RTF_SHPBOTTOM}
+ {OUStringLiteral(OOO_STRING_SVTOOLS_RTF_SHPRIGHT), RTF_SHPRIGHT}
+ */
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SN), RTF_SN},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SV), RTF_SV},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_SP), RTF_SP},
+
+// Support for overline attributes
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OL), RTF_OL},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLW), RTF_OLW},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLD), RTF_OLD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLDB), RTF_OLDB},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLNONE), RTF_OLNONE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLDASH), RTF_OLDASH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLDASHD), RTF_OLDASHD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLDASHDD), RTF_OLDASHDD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLTH), RTF_OLTH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLWAVE), RTF_OLWAVE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLC), RTF_OLC},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLTHD), RTF_OLTHD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLTHDASH), RTF_OLTHDASH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLLDASH), RTF_OLLDASH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLTHLDASH), RTF_OLTHLDASH},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLTHDASHD), RTF_OLTHDASHD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLTHDASHDD), RTF_OLTHDASHDD},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLHWAVE), RTF_OLHWAVE},
+ {std::u16string_view(u"" OOO_STRING_SVTOOLS_RTF_OLOLDBWAVE), RTF_OLOLDBWAVE}
+};
+
+
+int GetRTFToken( std::u16string_view rSearch )
+{
+ if( !bSortKeyWords )
+ {
+ std::sort( std::begin(aRTFTokenTab), std::end(aRTFTokenTab),
+ [](const RTF_TokenEntry & lhs, const RTF_TokenEntry & rhs)
+ {
+ return lhs.sToken < rhs.sToken;
+ } );
+ bSortKeyWords = true;
+ }
+
+ auto findCompare = [](const RTF_TokenEntry & lhs, std::u16string_view s)
+ {
+ return o3tl::compareToIgnoreAsciiCase(s, lhs.sToken) > 0;
+ };
+ auto findIt = std::lower_bound( std::begin(aRTFTokenTab), std::end(aRTFTokenTab), rSearch, findCompare);
+ if (findIt != std::end(aRTFTokenTab) && o3tl::compareToIgnoreAsciiCase(rSearch, findIt->sToken)==0)
+ return findIt->nToken;
+
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/svrtf/rtfout.cxx b/svtools/source/svrtf/rtfout.cxx
new file mode 100644
index 000000000..b06a04eed
--- /dev/null
+++ b/svtools/source/svrtf/rtfout.cxx
@@ -0,0 +1,192 @@
+/* -*- 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 .
+ */
+
+#include <tools/debug.hxx>
+#include <tools/stream.hxx>
+#include <tools/solar.h>
+#include <rtl/string.hxx>
+#include <svtools/rtfkeywd.hxx>
+#include <svtools/rtfout.hxx>
+
+namespace {
+
+SvStream& Out_Hex( SvStream& rStream, sal_uLong nHex, sal_uInt8 nLen )
+{
+ char aNToABuf[] = "0000000000000000";
+
+ DBG_ASSERT( nLen < sizeof(aNToABuf), "too many places" );
+ if( nLen >= sizeof(aNToABuf) )
+ nLen = (sizeof(aNToABuf)-1);
+
+ // set pointer to end of buffer
+ char* pStr = aNToABuf + (sizeof(aNToABuf)-1);
+ for( sal_uInt8 n = 0; n < nLen; ++n )
+ {
+ *(--pStr) = static_cast<char>(nHex & 0xf ) + 48;
+ if( *pStr > '9' )
+ *pStr += 39;
+ nHex >>= 4;
+ }
+ return rStream.WriteCharPtr( pStr );
+}
+
+// Ideally, this function should work on (sal_uInt32) Unicode scalar values
+// instead of (sal_Unicode) UTF-16 code units. However, at least "Rich Text
+// Format (RTF) Specification Version 1.9.1" available at
+// <https://www.microsoft.com/en-us/download/details.aspx?id=10725> does not
+// look like it allows non-BMP Unicode characters >= 0x10000 in the \uN notation
+// (it only talks about "Unicode character", but then explains how values of N
+// greater than 32767 will be expressed as negative signed 16-bit numbers, so
+// that smells like \uN is limited to BMP).
+// However the "Mathematics" section has an example that shows the code point
+// U+1D44E being encoded as UTF-16 surrogate pair "\u-10187?\u-9138?", so
+// sal_Unicode actually works fine here.
+SvStream& Out_Char(SvStream& rStream, sal_Unicode c,
+ int *pUCMode, rtl_TextEncoding eDestEnc)
+{
+ const char* pStr = nullptr;
+ switch (c)
+ {
+ case 0x1:
+ case 0x2:
+ // this are control character of our textattributes and will never be
+ // written
+ break;
+ case 0xA0:
+ rStream.WriteCharPtr( "\\~" );
+ break;
+ case 0xAD:
+ rStream.WriteCharPtr( "\\-" );
+ break;
+ case 0x2011:
+ rStream.WriteCharPtr( "\\_" );
+ break;
+ case '\n':
+ pStr = OOO_STRING_SVTOOLS_RTF_LINE;
+ break;
+ case '\t':
+ pStr = OOO_STRING_SVTOOLS_RTF_TAB;
+ break;
+ default:
+ switch(c)
+ {
+ case 149:
+ pStr = OOO_STRING_SVTOOLS_RTF_BULLET;
+ break;
+ case 150:
+ pStr = OOO_STRING_SVTOOLS_RTF_ENDASH;
+ break;
+ case 151:
+ pStr = OOO_STRING_SVTOOLS_RTF_EMDASH;
+ break;
+ case 145:
+ pStr = OOO_STRING_SVTOOLS_RTF_LQUOTE;
+ break;
+ case 146:
+ pStr = OOO_STRING_SVTOOLS_RTF_RQUOTE;
+ break;
+ case 147:
+ pStr = OOO_STRING_SVTOOLS_RTF_LDBLQUOTE;
+ break;
+ case 148:
+ pStr = OOO_STRING_SVTOOLS_RTF_RDBLQUOTE;
+ break;
+ }
+
+ if (pStr)
+ break;
+
+ switch (c)
+ {
+ case '\\':
+ case '}':
+ case '{':
+ rStream.WriteChar( '\\' ).WriteChar( char(c) );
+ break;
+ default:
+ if (c >= ' ' && c <= '~')
+ rStream.WriteChar( char(c) );
+ else
+ {
+ //If we can't convert to the dest encoding, or if
+ //it's an uncommon multibyte sequence which most
+ //readers won't be able to handle correctly, then
+ //export as unicode
+ OUString sBuf(&c, 1);
+ OString sConverted;
+ sal_uInt32 const nFlags =
+ RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR |
+ RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR;
+ bool bWriteAsUnicode = !(sBuf.convertToString(&sConverted,
+ eDestEnc, nFlags))
+ || (RTL_TEXTENCODING_UTF8==eDestEnc); // #i43933# do not export UTF-8 chars in RTF;
+ if (bWriteAsUnicode)
+ {
+ (void)sBuf.convertToString(&sConverted,
+ eDestEnc, OUSTRING_TO_OSTRING_CVTFLAGS);
+ }
+ const sal_Int32 nLen = sConverted.getLength();
+
+ if (bWriteAsUnicode && pUCMode)
+ {
+ // then write as unicode - character
+ if (*pUCMode != nLen)
+ {
+ // #i47831# add an additional whitespace, so that
+ // "document whitespaces" are not ignored.;
+ rStream.WriteCharPtr( "\\uc" )
+ .WriteOString( OString::number(nLen) ).WriteCharPtr( " " );
+ *pUCMode = nLen;
+ }
+ rStream.WriteCharPtr( "\\u" )
+ .WriteCharPtr( OString::number(
+ static_cast<sal_Int32>(c)).getStr() );
+ }
+
+ for (sal_Int32 nI = 0; nI < nLen; ++nI)
+ {
+ rStream.WriteCharPtr( "\\'" );
+ Out_Hex(rStream, sConverted[nI], 2);
+ }
+ }
+ break;
+ }
+ break;
+ }
+
+ if (pStr)
+ rStream.WriteCharPtr( pStr ).WriteChar( ' ' );
+
+ return rStream;
+}
+
+}
+
+SvStream& RTFOutFuncs::Out_String( SvStream& rStream, const OUString& rStr,
+ rtl_TextEncoding eDestEnc)
+{
+ int nUCMode = 1;
+ for (sal_Int32 n = 0; n < rStr.getLength(); ++n)
+ Out_Char(rStream, rStr[n], &nUCMode, eDestEnc);
+ if (nUCMode != 1)
+ rStream.WriteCharPtr( "\\uc1" ).WriteCharPtr( " " ); // #i47831# add an additional whitespace, so that "document whitespaces" are not ignored.;
+ return rStream;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/svrtf/svparser.cxx b/svtools/source/svrtf/svparser.cxx
new file mode 100644
index 000000000..d4b22fe13
--- /dev/null
+++ b/svtools/source/svrtf/svparser.cxx
@@ -0,0 +1,671 @@
+/* -*- 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 .
+ */
+
+#include <svtools/svparser.hxx>
+#include <svtools/htmltokn.h>
+#include <tools/stream.hxx>
+#include <tools/debug.hxx>
+#include <rtl/textcvt.h>
+#include <rtl/tencinfo.h>
+#include <rtl/character.hxx>
+#include <sal/log.hxx>
+#include <unicode/ucsdet.h>
+
+#include <vector>
+
+// structure to store the actual data
+template<typename T>
+struct SvParser_Impl
+{
+ OUString aToken; // gescanntes Token
+ sal_uInt64 nFilePos; // actual position in stream
+ sal_uInt32 nlLineNr; // actual line number
+ sal_uInt32 nlLinePos; // actual column number
+ tools::Long nTokenValue; // extra value (RTF)
+ bool bTokenHasValue; // indicates whether nTokenValue is valid
+ T nToken; // actual Token
+ sal_uInt32 nNextCh; // actual character
+ T nSaveToken; // the token from Continue
+
+ rtl_TextToUnicodeConverter hConv;
+ rtl_TextToUnicodeContext hContext;
+
+ SvParser_Impl()
+ : nFilePos(0)
+ , nlLineNr(0)
+ , nlLinePos(0)
+ , nTokenValue(0)
+ , bTokenHasValue(false)
+ , nToken(static_cast<T>(0))
+ , nNextCh(0)
+ , nSaveToken(static_cast<T>(0))
+ , hConv( nullptr )
+ , hContext( reinterpret_cast<rtl_TextToUnicodeContext>(1) )
+ {
+ }
+
+};
+
+
+template<typename T>
+SvParser<T>::TokenStackType::TokenStackType()
+ : nTokenValue(0)
+ , bTokenHasValue(false)
+ , nTokenId(static_cast<T>(0))
+{
+}
+
+// Constructor
+template<typename T>
+SvParser<T>::SvParser( SvStream& rIn, sal_uInt8 nStackSize )
+ : rInput( rIn )
+ , nlLineNr( 1 )
+ , nlLinePos( 1 )
+ , pImplData( nullptr )
+ , m_nTokenIndex(0)
+ , nTokenValue( 0 )
+ , bTokenHasValue( false )
+ , eState( SvParserState::NotStarted )
+ , eSrcEnc( RTL_TEXTENCODING_DONTKNOW )
+ , nNextChPos(0)
+ , nNextCh(0)
+ , bSwitchToUCS2(false)
+ , bRTF_InTextRead(false)
+ , nTokenStackSize( nStackSize )
+ , nTokenStackPos( 0 )
+{
+ eState = SvParserState::NotStarted;
+ if( nTokenStackSize < 3 )
+ nTokenStackSize = 3;
+ pTokenStack.reset(new TokenStackType[ nTokenStackSize ]);
+ pTokenStackPos = pTokenStack.get();
+}
+
+template<typename T>
+SvParser<T>::~SvParser()
+{
+ if( pImplData && pImplData->hConv )
+ {
+ rtl_destroyTextToUnicodeContext( pImplData->hConv,
+ pImplData->hContext );
+ rtl_destroyTextToUnicodeConverter( pImplData->hConv );
+ }
+
+ pTokenStack.reset();
+}
+
+template<typename T> SvParserState SvParser<T>::GetStatus() const { return eState; }
+template<typename T> sal_uInt32 SvParser<T>::GetLineNr() const { return nlLineNr; }
+template<typename T> sal_uInt32 SvParser<T>::GetLinePos() const { return nlLinePos; }
+template<typename T> void SvParser<T>::IncLineNr() { ++nlLineNr; }
+template<typename T> sal_uInt32 SvParser<T>::IncLinePos() { return ++nlLinePos; }
+template<typename T> void SvParser<T>::SetLineNr( sal_uInt32 nlNum ) { nlLineNr = nlNum; }
+template<typename T> void SvParser<T>::SetLinePos( sal_uInt32 nlPos ) { nlLinePos = nlPos; }
+template<typename T> bool SvParser<T>::IsParserWorking() const { return SvParserState::Working == eState; }
+template<typename T> rtl_TextEncoding SvParser<T>::GetSrcEncoding() const { return eSrcEnc; }
+template<typename T> void SvParser<T>::SetSwitchToUCS2( bool bSet ) { bSwitchToUCS2 = bSet; }
+template<typename T> bool SvParser<T>::IsSwitchToUCS2() const { return bSwitchToUCS2; }
+template<typename T> sal_uInt16 SvParser<T>::GetCharSize() const { return (RTL_TEXTENCODING_UCS2 == eSrcEnc) ? 2 : 1; }
+template<typename T> Link<LinkParamNone*,void> SvParser<T>::GetAsynchCallLink() const
+{
+ return LINK( const_cast<SvParser*>(this), SvParser, NewDataRead );
+}
+
+template<typename T>
+void SvParser<T>::ClearTxtConvContext()
+{
+ if( pImplData && pImplData->hConv )
+ rtl_resetTextToUnicodeContext( pImplData->hConv, pImplData->hContext );
+}
+
+template<typename T>
+void SvParser<T>::SetSrcEncoding( rtl_TextEncoding eEnc )
+{
+ if( eEnc == eSrcEnc )
+ return;
+
+ if( pImplData && pImplData->hConv )
+ {
+ rtl_destroyTextToUnicodeContext( pImplData->hConv,
+ pImplData->hContext );
+ rtl_destroyTextToUnicodeConverter( pImplData->hConv );
+ pImplData->hConv = nullptr;
+ pImplData->hContext = reinterpret_cast<rtl_TextToUnicodeContext>(1);
+ }
+
+ if( rtl_isOctetTextEncoding(eEnc) ||
+ RTL_TEXTENCODING_UCS2 == eEnc )
+ {
+ eSrcEnc = eEnc;
+ if( !pImplData )
+ pImplData.reset(new SvParser_Impl<T>);
+ pImplData->hConv = rtl_createTextToUnicodeConverter( eSrcEnc );
+ DBG_ASSERT( pImplData->hConv,
+ "SvParser::SetSrcEncoding: no converter for source encoding" );
+ if( !pImplData->hConv )
+ eSrcEnc = RTL_TEXTENCODING_DONTKNOW;
+ else
+ pImplData->hContext =
+ rtl_createTextToUnicodeContext( pImplData->hConv );
+ }
+ else
+ {
+ SAL_WARN( "svtools",
+ "SvParser::SetSrcEncoding: invalid source encoding" );
+ eSrcEnc = RTL_TEXTENCODING_DONTKNOW;
+ }
+}
+
+template<typename T>
+void SvParser<T>::RereadLookahead()
+{
+ rInput.Seek(nNextChPos);
+ nNextCh = GetNextChar();
+}
+
+template<typename T>
+sal_uInt32 SvParser<T>::GetNextChar()
+{
+ sal_uInt32 c = 0U;
+
+ // When reading multiple bytes, we don't have to care about the file
+ // position when we run into the pending state. The file position is
+ // maintained by SaveState/RestoreState.
+ if( bSwitchToUCS2 && 0 == rInput.Tell() )
+ {
+ rInput.StartReadingUnicodeText(RTL_TEXTENCODING_DONTKNOW);
+ if (rInput.good())
+ {
+ sal_uInt64 nPos = rInput.Tell();
+ if (nPos == 2)
+ eSrcEnc = RTL_TEXTENCODING_UCS2;
+ else if (nPos == 3)
+ SetSrcEncoding(RTL_TEXTENCODING_UTF8);
+ else // Try to detect encoding without BOM
+ {
+ std::vector<char> buf(65535); // Arbitrarily chosen 64KiB buffer
+ const size_t nSize = rInput.ReadBytes(buf.data(), buf.size());
+ rInput.Seek(0);
+ if (nSize > 0)
+ {
+ UErrorCode uerr = U_ZERO_ERROR;
+ UCharsetDetector* ucd = ucsdet_open(&uerr);
+ ucsdet_setText(ucd, buf.data(), nSize, &uerr);
+ if (const UCharsetMatch* match = ucsdet_detect(ucd, &uerr))
+ {
+ const char* pEncodingName = ucsdet_getName(match, &uerr);
+
+ if (U_SUCCESS(uerr))
+ {
+ if (strcmp("UTF-8", pEncodingName) == 0)
+ {
+ SetSrcEncoding(RTL_TEXTENCODING_UTF8);
+ }
+ else if (strcmp("UTF-16LE", pEncodingName) == 0)
+ {
+ eSrcEnc = RTL_TEXTENCODING_UCS2;
+ rInput.SetEndian(SvStreamEndian::LITTLE);
+ }
+ else if (strcmp("UTF-16BE", pEncodingName) == 0)
+ {
+ eSrcEnc = RTL_TEXTENCODING_UCS2;
+ rInput.SetEndian(SvStreamEndian::BIG);
+ }
+ }
+ }
+
+ ucsdet_close(ucd);
+ }
+ }
+ }
+ bSwitchToUCS2 = false;
+ }
+
+ bool bErr;
+ nNextChPos = rInput.Tell();
+
+ if( RTL_TEXTENCODING_UCS2 == eSrcEnc )
+ {
+ sal_Unicode cUC;
+ rInput.ReadUtf16(cUC);
+ bErr = !rInput.good();
+ if( !bErr )
+ {
+ c = cUC;
+ if (rtl::isHighSurrogate(cUC))
+ {
+ const sal_uInt64 nPos = rInput.Tell();
+ rInput.ReadUtf16(cUC);
+ if (rtl::isLowSurrogate(cUC)) // can only be true when ReadUtf16 succeeded
+ c = rtl::combineSurrogates(c, cUC);
+ else
+ rInput.Seek(nPos); // process lone high surrogate
+ }
+ }
+ }
+ else
+ {
+ sal_Size nChars = 0;
+ do
+ {
+ char c1; // signed, that's the text converter expects
+ rInput.ReadChar( c1 );
+ bErr = !rInput.good();
+ if( !bErr )
+ {
+ if (
+ RTL_TEXTENCODING_DONTKNOW == eSrcEnc ||
+ RTL_TEXTENCODING_SYMBOL == eSrcEnc
+ )
+ {
+ // no conversion shall take place
+ c = reinterpret_cast<unsigned char&>( c1 );
+ nChars = 1;
+ }
+ else
+ {
+ assert(pImplData && pImplData->hConv && "no text converter!");
+
+ sal_Unicode cUC;
+ sal_uInt32 nInfo = 0;
+ sal_Size nCvtBytes;
+ nChars = rtl_convertTextToUnicode(
+ pImplData->hConv, pImplData->hContext,
+ &c1, 1, &cUC, 1,
+ RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR|
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR|
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR,
+ &nInfo, &nCvtBytes);
+ if( (nInfo&RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL) != 0 )
+ {
+ // The conversion wasn't successful because we haven't
+ // read enough characters.
+ if( pImplData->hContext != reinterpret_cast<rtl_TextToUnicodeContext>(1) )
+ {
+ sal_Unicode sCh[2];
+ while( (nInfo&RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL) != 0 )
+ {
+ rInput.ReadChar( c1 );
+ bErr = !rInput.good();
+ if( bErr )
+ break;
+
+ nChars = rtl_convertTextToUnicode(
+ pImplData->hConv, pImplData->hContext,
+ &c1, 1, sCh , 2,
+ RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR|
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR|
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR,
+ &nInfo, &nCvtBytes);
+ }
+ if( !bErr )
+ {
+ if( 1 == nChars && 0 == nInfo )
+ {
+ c = sal_uInt32( sCh[0] );
+ }
+ else if( 2 == nChars && 0 == nInfo )
+ {
+ c = rtl::combineSurrogates( sCh[0], sCh[1] );
+ }
+ else if( 0 != nChars || 0 != nInfo )
+ {
+ DBG_ASSERT( (nInfo&RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL) == 0,
+ "source buffer is too small" );
+ DBG_ASSERT( (nInfo&~(RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL)) == 0,
+ "there is a conversion error" );
+ DBG_ASSERT( 0 == nChars,
+ "there is a converted character, but an error" );
+ // There are still errors, but nothing we can
+ // do
+ c = '?';
+ nChars = 1;
+ }
+ }
+ }
+ else
+ {
+ char sBuffer[10];
+ sBuffer[0] = c1;
+ sal_uInt16 nLen = 1;
+ while( (nInfo&RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL) != 0 &&
+ nLen < 10 )
+ {
+ rInput.ReadChar( c1 );
+ bErr = !rInput.good();
+ if( bErr )
+ break;
+
+ sBuffer[nLen++] = c1;
+ nChars = rtl_convertTextToUnicode(
+ pImplData->hConv, nullptr, sBuffer, nLen, &cUC, 1,
+ RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR|
+ RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR|
+ RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR,
+ &nInfo, &nCvtBytes);
+ }
+ if( !bErr )
+ {
+ if( 1 == nChars && 0 == nInfo )
+ {
+ DBG_ASSERT( nCvtBytes == nLen,
+ "no all bytes have been converted!" );
+ c = cUC;
+ }
+ else
+ {
+ DBG_ASSERT( (nInfo&RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL) == 0,
+ "source buffer is too small" );
+ DBG_ASSERT( (nInfo&~(RTL_TEXTTOUNICODE_INFO_SRCBUFFERTOOSMALL)) == 0,
+ "there is a conversion error" );
+ DBG_ASSERT( 0 == nChars,
+ "there is a converted character, but an error" );
+
+ // There are still errors, so we use the first
+ // character and restart after that.
+ c = reinterpret_cast<unsigned char&>( sBuffer[0] );
+ rInput.SeekRel( -(nLen-1) );
+ nChars = 1;
+ }
+ }
+ }
+ }
+ else if( 1 == nChars && 0 == nInfo )
+ {
+ // The conversion was successful
+ DBG_ASSERT( nCvtBytes == 1,
+ "no all bytes have been converted!" );
+ c = cUC;
+ }
+ else if( 0 != nChars || 0 != nInfo )
+ {
+ DBG_ASSERT( 0 == nChars,
+ "there is a converted character, but an error" );
+ DBG_ASSERT( 0 != nInfo,
+ "there is no converted character and no error" );
+ // #73398#: If the character could not be converted,
+ // because a conversion is not available, do no conversion at all.
+ c = reinterpret_cast<unsigned char&>( c1 );
+ nChars = 1;
+
+ }
+ }
+ }
+ }
+ while( 0 == nChars && !bErr );
+ }
+
+ if ( ! rtl::isUnicodeScalarValue( c ) )
+ c = '?' ;
+
+ if( bErr )
+ {
+ if( ERRCODE_IO_PENDING == rInput.GetError() )
+ {
+ eState = SvParserState::Pending;
+ return c;
+ }
+ else
+ return sal_Unicode(EOF);
+ }
+
+ if( c == '\n' )
+ {
+ IncLineNr();
+ SetLinePos( 1 );
+ }
+ else
+ IncLinePos();
+
+ return c;
+}
+
+template<typename T>
+T SvParser<T>::GetNextToken()
+{
+ T nRet = static_cast<T>(0);
+
+ if( !nTokenStackPos )
+ {
+ aToken.setLength( 0 ); // empty token buffer
+ nTokenValue = -1; // marker for no value read
+ bTokenHasValue = false;
+
+ nRet = GetNextToken_();
+ if( SvParserState::Pending == eState )
+ return nRet;
+ }
+
+ ++pTokenStackPos;
+ if( pTokenStackPos == pTokenStack.get() + nTokenStackSize )
+ pTokenStackPos = pTokenStack.get();
+
+ // pop from stack ??
+ if( nTokenStackPos )
+ {
+ --nTokenStackPos;
+ nTokenValue = pTokenStackPos->nTokenValue;
+ bTokenHasValue = pTokenStackPos->bTokenHasValue;
+ aToken = pTokenStackPos->sToken;
+ nRet = pTokenStackPos->nTokenId;
+ ++m_nTokenIndex;
+ }
+ // no, now push actual value on stack
+ else if( SvParserState::Working == eState )
+ {
+ pTokenStackPos->sToken = aToken;
+ pTokenStackPos->nTokenValue = nTokenValue;
+ pTokenStackPos->bTokenHasValue = bTokenHasValue;
+ pTokenStackPos->nTokenId = nRet;
+ ++m_nTokenIndex;
+ }
+ else if( SvParserState::Accepted != eState && SvParserState::Pending != eState )
+ eState = SvParserState::Error; // an error occurred
+
+ return nRet;
+}
+
+template<typename T>
+T SvParser<T>::SkipToken( short nCnt ) // "skip" n Tokens backward
+{
+ pTokenStackPos = GetStackPtr( nCnt );
+ short nTmp = nTokenStackPos - nCnt;
+ if( nTmp < 0 )
+ nTmp = 0;
+ else if( nTmp > nTokenStackSize )
+ nTmp = nTokenStackSize;
+ nTokenStackPos = sal_uInt8(nTmp);
+
+ m_nTokenIndex -= nTmp;
+
+ // restore values
+ aToken = pTokenStackPos->sToken;
+ nTokenValue = pTokenStackPos->nTokenValue;
+ bTokenHasValue = pTokenStackPos->bTokenHasValue;
+
+ return pTokenStackPos->nTokenId;
+}
+
+template<typename T>
+typename SvParser<T>::TokenStackType* SvParser<T>::GetStackPtr( short nCnt )
+{
+ sal_uInt8 nCurrentPos = sal_uInt8(pTokenStackPos - pTokenStack.get());
+ if( nCnt > 0 )
+ {
+ if( nCnt >= nTokenStackSize )
+ nCnt = (nTokenStackSize-1);
+ if( nCurrentPos + nCnt < nTokenStackSize )
+ nCurrentPos = sal::static_int_cast< sal_uInt8 >(nCurrentPos + nCnt);
+ else
+ nCurrentPos = sal::static_int_cast< sal_uInt8 >(
+ nCurrentPos + (nCnt - nTokenStackSize));
+ }
+ else if( nCnt < 0 )
+ {
+ if( -nCnt >= nTokenStackSize )
+ nCnt = -nTokenStackSize+1;
+ if( -nCnt <= nCurrentPos )
+ nCurrentPos = sal::static_int_cast< sal_uInt8 >(nCurrentPos + nCnt);
+ else
+ nCurrentPos = sal::static_int_cast< sal_uInt8 >(
+ nCurrentPos + (nCnt + nTokenStackSize));
+ }
+ return pTokenStack.get() + nCurrentPos;
+}
+
+// to read asynchronous from SvStream
+
+template<typename T>
+T SvParser<T>::GetSaveToken() const
+{
+ return pImplData ? pImplData->nSaveToken : static_cast<T>(0);
+}
+
+template<typename T>
+void SvParser<T>::SaveState( T nToken )
+{
+ // save actual status
+ if( !pImplData )
+ {
+ pImplData.reset(new SvParser_Impl<T>);
+ pImplData->nSaveToken = static_cast<T>(0);
+ }
+
+ pImplData->nFilePos = rInput.Tell();
+ pImplData->nToken = nToken;
+
+ pImplData->aToken = aToken;
+ pImplData->nlLineNr = nlLineNr;
+ pImplData->nlLinePos = nlLinePos;
+ pImplData->nTokenValue= nTokenValue;
+ pImplData->bTokenHasValue = bTokenHasValue;
+ pImplData->nNextCh = nNextCh;
+}
+
+template<typename T>
+void SvParser<T>::RestoreState()
+{
+ // restore old status
+ if( !pImplData )
+ return;
+
+ if( ERRCODE_IO_PENDING == rInput.GetError() )
+ rInput.ResetError();
+ aToken = pImplData->aToken;
+ nlLineNr = pImplData->nlLineNr;
+ nlLinePos = pImplData->nlLinePos;
+ nTokenValue= pImplData->nTokenValue;
+ bTokenHasValue=pImplData->bTokenHasValue;
+ nNextCh = pImplData->nNextCh;
+
+ pImplData->nSaveToken = pImplData->nToken;
+
+ rInput.Seek( pImplData->nFilePos );
+}
+
+template<typename T>
+void SvParser<T>::Continue( T )
+{
+}
+
+
+// expanded out version of
+// IMPL_LINK_NOARG( SvParser, NewDataRead, LinkParamNone*, void )
+// since it can't cope with template methods
+template<typename T>
+void SvParser<T>::LinkStubNewDataRead(void * instance, LinkParamNone* data) {
+ return static_cast<SvParser<T> *>(instance)->NewDataRead(data);
+}
+template<typename T>
+void SvParser<T>::NewDataRead(SAL_UNUSED_PARAMETER LinkParamNone*)
+{
+ switch( eState )
+ {
+ case SvParserState::Pending:
+ eState = SvParserState::Working;
+ RestoreState();
+
+ Continue( pImplData->nToken );
+
+ if( ERRCODE_IO_PENDING == rInput.GetError() )
+ rInput.ResetError();
+
+ if( SvParserState::Pending != eState )
+ ReleaseRef(); // ready otherwise!
+ break;
+
+ case SvParserState::NotStarted:
+ case SvParserState::Working:
+ break;
+
+ default:
+ ReleaseRef(); // ready otherwise!
+ break;
+ }
+}
+
+template class SVT_DLLPUBLIC SvParser<int>;
+template class SVT_DLLPUBLIC SvParser<HtmlTokenId>;
+
+/*========================================================================
+ *
+ * SvKeyValueIterator.
+ *
+ *======================================================================*/
+
+typedef std::vector<SvKeyValue> SvKeyValueList_Impl;
+
+struct SvKeyValueIterator::Impl
+{
+ SvKeyValueList_Impl maList;
+ sal_uInt16 mnPos;
+
+ Impl() : mnPos(0) {}
+};
+
+SvKeyValueIterator::SvKeyValueIterator() : mpImpl(new Impl) {}
+
+SvKeyValueIterator::~SvKeyValueIterator() = default;
+
+bool SvKeyValueIterator::GetFirst (SvKeyValue &rKeyVal)
+{
+ mpImpl->mnPos = mpImpl->maList.size();
+ return GetNext (rKeyVal);
+}
+
+bool SvKeyValueIterator::GetNext (SvKeyValue &rKeyVal)
+{
+ if (mpImpl->mnPos > 0)
+ {
+ rKeyVal = mpImpl->maList[--mpImpl->mnPos];
+ return true;
+ }
+ else
+ {
+ // Nothing to do.
+ return false;
+ }
+}
+
+void SvKeyValueIterator::Append (const SvKeyValue &rKeyVal)
+{
+ mpImpl->maList.push_back(rKeyVal);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */