parent
a4d8ed3aa8
commit
602fff2940
@ -0,0 +1,132 @@
|
|||||||
|
From a8a0334dfc94432f22f0e1452dfaf2dabf2fe780 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stephan Bergmann <sbergman@redhat.com>
|
||||||
|
Date: Fri, 7 Oct 2016 15:02:47 +0200
|
||||||
|
Subject: [PATCH] rhbz#1382401: Support surrogate pairs in HTMLOutFuncs
|
||||||
|
|
||||||
|
(cherry picked from commit 375b99cad4a79d26a6cbcd0f71bc12b312d95818)
|
||||||
|
Conflicts:
|
||||||
|
svtools/source/svhtml/htmlout.cxx
|
||||||
|
plus cherry-pick of 6131bf9c96fb2ae37decf13e453f27304707271b "Minor performance
|
||||||
|
improvement of previous patch"
|
||||||
|
|
||||||
|
Change-Id: Ib578f758e4f5f355a79a014c2ad4660924dd34a4
|
||||||
|
---
|
||||||
|
include/svtools/htmlout.hxx | 2 +-
|
||||||
|
svtools/source/svhtml/htmlout.cxx | 40 +++++++++++++++++++++++++++------------
|
||||||
|
2 files changed, 29 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/svtools/htmlout.hxx b/include/svtools/htmlout.hxx
|
||||||
|
index 715f0ba..e8a5d50 100644
|
||||||
|
--- a/include/svtools/htmlout.hxx
|
||||||
|
+++ b/include/svtools/htmlout.hxx
|
||||||
|
@@ -60,7 +60,7 @@ struct HTMLOutFuncs
|
||||||
|
SVT_DLLPUBLIC static SvStream& Out_AsciiTag( SvStream&, const sal_Char* pStr,
|
||||||
|
bool bOn = true,
|
||||||
|
rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252);
|
||||||
|
- SVT_DLLPUBLIC static SvStream& Out_Char( SvStream&, sal_Unicode cChar,
|
||||||
|
+ SVT_DLLPUBLIC static SvStream& Out_Char( SvStream&, sal_uInt32 cChar,
|
||||||
|
HTMLOutContext& rContext,
|
||||||
|
OUString *pNonConvertableChars = nullptr );
|
||||||
|
SVT_DLLPUBLIC static SvStream& Out_String( SvStream&, const OUString&,
|
||||||
|
diff --git a/svtools/source/svhtml/htmlout.cxx b/svtools/source/svhtml/htmlout.cxx
|
||||||
|
index 99d9e38..4305338 100644
|
||||||
|
--- a/svtools/source/svhtml/htmlout.cxx
|
||||||
|
+++ b/svtools/source/svhtml/htmlout.cxx
|
||||||
|
@@ -55,7 +55,7 @@ HTMLOutContext::~HTMLOutContext()
|
||||||
|
rtl_destroyUnicodeToTextConverter( m_hConv );
|
||||||
|
}
|
||||||
|
|
||||||
|
-static const sal_Char *lcl_svhtml_GetEntityForChar( sal_Unicode c,
|
||||||
|
+static const sal_Char *lcl_svhtml_GetEntityForChar( sal_uInt32 c,
|
||||||
|
rtl_TextEncoding eDestEnc )
|
||||||
|
{
|
||||||
|
const sal_Char* pStr = nullptr;
|
||||||
|
@@ -388,10 +388,12 @@ static const sal_Char *lcl_svhtml_GetEntityForChar( sal_Unicode c,
|
||||||
|
return pStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static OString lcl_ConvertCharToHTML( sal_Unicode c,
|
||||||
|
+static OString lcl_ConvertCharToHTML( sal_uInt32 c,
|
||||||
|
HTMLOutContext& rContext,
|
||||||
|
OUString *pNonConvertableChars )
|
||||||
|
{
|
||||||
|
+ assert(rtl::isUnicodeCodePoint(c));
|
||||||
|
+
|
||||||
|
OStringBuffer aDest;
|
||||||
|
DBG_ASSERT( RTL_TEXTENCODING_DONTKNOW != rContext.m_eDestEnc,
|
||||||
|
"wrong destination encoding" );
|
||||||
|
@@ -439,8 +441,18 @@ static OString lcl_ConvertCharToHTML( sal_Unicode c,
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
+ sal_Unicode utf16[2];
|
||||||
|
+ sal_Size n;
|
||||||
|
+ if (c < 0x10000) {
|
||||||
|
+ utf16[0] = c;
|
||||||
|
+ n = 1;
|
||||||
|
+ } else {
|
||||||
|
+ utf16[0] = rtl::getHighSurrogate(c);
|
||||||
|
+ utf16[1] = rtl::getLowSurrogate(c);
|
||||||
|
+ n = 2;
|
||||||
|
+ }
|
||||||
|
sal_Size nLen = rtl_convertUnicodeToText( rContext.m_hConv,
|
||||||
|
- rContext.m_hContext, &c, 1,
|
||||||
|
+ rContext.m_hContext, utf16, n,
|
||||||
|
cBuffer, TXTCONV_BUFFER_SIZE,
|
||||||
|
nFlags,
|
||||||
|
&nInfo, &nSrcChars );
|
||||||
|
@@ -466,11 +478,15 @@ static OString lcl_ConvertCharToHTML( sal_Unicode c,
|
||||||
|
while( nLen-- )
|
||||||
|
aDest.append(*pBuffer++);
|
||||||
|
|
||||||
|
- aDest.append('&').append('#').append(static_cast<sal_Int64>(c))
|
||||||
|
+ aDest.append('&').append('#').append(static_cast<sal_Int32>(c))
|
||||||
|
+ // Unicode code points guaranteed to fit into sal_Int32
|
||||||
|
.append(';');
|
||||||
|
- if( pNonConvertableChars &&
|
||||||
|
- -1 == pNonConvertableChars->indexOf( c ) )
|
||||||
|
- (*pNonConvertableChars) += OUString(c);
|
||||||
|
+ if( pNonConvertableChars )
|
||||||
|
+ {
|
||||||
|
+ OUString cs(&c, 1);
|
||||||
|
+ if( -1 == pNonConvertableChars->indexOf( cs ) )
|
||||||
|
+ (*pNonConvertableChars) += cs;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aDest.makeStringAndClear();
|
||||||
|
@@ -505,9 +521,9 @@ OString HTMLOutFuncs::ConvertStringToHTML( const OUString& rSrc,
|
||||||
|
{
|
||||||
|
HTMLOutContext aContext( eDestEnc );
|
||||||
|
OStringBuffer aDest;
|
||||||
|
- for( sal_Int32 i=0, nLen = rSrc.getLength(); i < nLen; i++ )
|
||||||
|
+ for( sal_Int32 i=0, nLen = rSrc.getLength(); i < nLen; )
|
||||||
|
aDest.append(lcl_ConvertCharToHTML(
|
||||||
|
- rSrc[i], aContext, pNonConvertableChars));
|
||||||
|
+ rSrc.iterateCodePoints(&i), aContext, pNonConvertableChars));
|
||||||
|
aDest.append(lcl_FlushToAscii(aContext));
|
||||||
|
return aDest.makeStringAndClear();
|
||||||
|
}
|
||||||
|
@@ -525,7 +541,7 @@ SvStream& HTMLOutFuncs::Out_AsciiTag( SvStream& rStream, const sal_Char *pStr,
|
||||||
|
return rStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
-SvStream& HTMLOutFuncs::Out_Char( SvStream& rStream, sal_Unicode c,
|
||||||
|
+SvStream& HTMLOutFuncs::Out_Char( SvStream& rStream, sal_uInt32 c,
|
||||||
|
HTMLOutContext& rContext,
|
||||||
|
OUString *pNonConvertableChars )
|
||||||
|
{
|
||||||
|
@@ -540,8 +556,8 @@ SvStream& HTMLOutFuncs::Out_String( SvStream& rStream, const OUString& rOUStr,
|
||||||
|
{
|
||||||
|
HTMLOutContext aContext( eDestEnc );
|
||||||
|
sal_Int32 nLen = rOUStr.getLength();
|
||||||
|
- for( sal_Int32 n = 0; n < nLen; n++ )
|
||||||
|
- HTMLOutFuncs::Out_Char( rStream, rOUStr[n],
|
||||||
|
+ for( sal_Int32 n = 0; n < nLen; )
|
||||||
|
+ HTMLOutFuncs::Out_Char( rStream, rOUStr.iterateCodePoints(&n),
|
||||||
|
aContext, pNonConvertableChars );
|
||||||
|
HTMLOutFuncs::FlushToAscii( rStream, aContext );
|
||||||
|
return rStream;
|
||||||
|
--
|
||||||
|
2.7.4
|
||||||
|
|
Loading…
Reference in new issue