Kaydet (Commit) ba43d4c5 authored tarafından Mike Kaganski's avatar Mike Kaganski

tdf#115013: quote columns with spaces and properly escape characters

Unit test updated

Change-Id: If36c90c0ff372ce45666674d2487e6edf2536dbf
Reviewed-on: https://gerrit.libreoffice.org/48038Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst db55054a
......@@ -5761,7 +5761,9 @@ void SwUiWriterTest::testTdf113481()
void SwUiWriterTest::testTdf115013()
{
//create new writer document
const OUString sColumnName("Name with spaces, \"quotes\" and \\backslashes");
//create new writer document
SwDoc* pDoc = createDoc();
{
......@@ -5777,7 +5779,7 @@ void SwUiWriterTest::testTdf115013()
SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
CPPUNIT_ASSERT(pWrtShell);
SwDBFieldType* pFieldType = static_cast<SwDBFieldType*>(pWrtShell->InsertFieldType(
SwDBFieldType(pDoc, "Name", aDBData)));
SwDBFieldType(pDoc, sColumnName, aDBData)));
CPPUNIT_ASSERT(pFieldType);
// Insert the field into document
......@@ -5800,7 +5802,7 @@ void SwUiWriterTest::testTdf115013()
CPPUNIT_ASSERT(pField);
OUString sColumn = static_cast<SwDBFieldType*>(pField->GetTyp())->GetColumnName();
// The column name must come correct after round trip
CPPUNIT_ASSERT_EQUAL(OUString("Name"), sColumn);
CPPUNIT_ASSERT_EQUAL(sColumnName, sColumn);
}
CPPUNIT_TEST_SUITE_REGISTRATION(SwUiWriterTest);
......
......@@ -2680,6 +2680,46 @@ void WW8AttributeOutput::WriteExpand( const SwField* pField )
SwWW8Writer::WriteString16( m_rWW8Export.Strm(), sExpand, false );
}
namespace
{
// Escapes a token string for storing in Word formats. Its import counterpart
// is lcl_ExtractToken in writerfilter/source/dmapper/DomainMapper_Impl.cxx
OUString EscapeToken(const OUString& rCommand)
{
bool bWasEscaped = false;
const int nBufferLen = rCommand.getLength()*1.5;
OUStringBuffer sResult(nBufferLen);
sResult.append('"'); // opening quote
for (sal_Int32 i = 0; i < rCommand.getLength(); ++i)
{
sal_Unicode ch = rCommand[i];
switch (ch)
{
case '\\':
case '"':
// Backslashes and doublequotes must be escaped
bWasEscaped = true;
sResult.append('\\');
break;
case ' ':
// Spaces require quotation
bWasEscaped = true;
break;
}
sResult.append(ch);
}
if (bWasEscaped)
{
sResult.append('"'); // closing quote
return sResult.makeStringAndClear();
}
// No escapement/quotation was required
return rCommand;
}
}
void AttributeOutputBase::TextField( const SwFormatField& rField )
{
const SwField* pField = rField.GetField();
......@@ -2757,7 +2797,8 @@ void AttributeOutputBase::TextField( const SwFormatField& rField )
break;
case SwFieldIds::Database:
{
OUString sStr = FieldString(ww::eMERGEFIELD) + static_cast<SwDBFieldType *>(pField->GetTyp())->GetColumnName() + " ";
OUString sStr = FieldString(ww::eMERGEFIELD)
+ EscapeToken(static_cast<SwDBFieldType *>(pField->GetTyp())->GetColumnName()) + " ";
GetExport().OutputField(pField, ww::eMERGEFIELD, sStr);
}
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment