diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2018-01-17 12:41:41 +0300 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2018-01-30 16:14:19 +0100 |
commit | ba30faa87a9b3550103cfe5372640f928c47d8d3 (patch) | |
tree | 657d25ac957c8f540507fef83eecf7a0cb27f4b5 | |
parent | c776937723113937def7410268dcd1208fbaf12d (diff) |
tdf#115013: quote columns with spaces and properly escape characters
Unit test updated
Change-Id: If36c90c0ff372ce45666674d2487e6edf2536dbf
Reviewed-on: https://gerrit.libreoffice.org/48038
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/48082
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
-rw-r--r-- | sw/qa/extras/uiwriter/data/datasource.ods | bin | 8038 -> 9596 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter.cxx | 8 | ||||
-rw-r--r-- | sw/source/filter/ww8/ww8atr.cxx | 43 |
3 files changed, 47 insertions, 4 deletions
diff --git a/sw/qa/extras/uiwriter/data/datasource.ods b/sw/qa/extras/uiwriter/data/datasource.ods Binary files differindex 076659679575..81d78440656e 100644 --- a/sw/qa/extras/uiwriter/data/datasource.ods +++ b/sw/qa/extras/uiwriter/data/datasource.ods diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx index 80ba1a9a371b..e175d53a26e4 100644 --- a/sw/qa/extras/uiwriter/uiwriter.cxx +++ b/sw/qa/extras/uiwriter/uiwriter.cxx @@ -5651,7 +5651,9 @@ void SwUiWriterTest::testTdf115065() void SwUiWriterTest::testTdf115013() { - //create new writer document + const OUString sColumnName("Name with spaces, \"quotes\" and \\backslashes"); + + //create new writer document SwDoc* pDoc = createDoc(); { @@ -5667,7 +5669,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 @@ -5690,7 +5692,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); diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 80b620207195..252e5dfde4ce 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -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; |