summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2015-12-07 23:00:32 +1000
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-12-08 08:16:35 +0000
commite4d5b5efac71ed2a08dcd09877078a6cf6bde0d2 (patch)
treee7622e97d813924f60a73196d76497575d0d45ba /writerfilter
parentc321b6182a31cd2e5d6f74e404797bd4c63e537a (diff)
tdf#54584: adjust skip-slash condition, allow unterminated quote
Experimenting with different non-alpha characters in front of field, most of them aren't allowed and result in field not recognized by MS Word: #$%&'()*+,-./:;<>?@[]^_`{|}~ Besides, if backslash "\" is followed by another backslash or space, it is illegal, too. This patch takes care of it. On the other side, not closing quotes is allowed by MS Word. This patch allows this, too. The patch does not handle another allowed field code "=2+2". This should be done in another commit. Change-Id: I842fe59c026b68977e61a7ae0b5495c02803ad83 Reviewed-on: https://gerrit.libreoffice.org/20435 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/qa/cppunittests/misc/misc.cxx20
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx18
2 files changed, 29 insertions, 9 deletions
diff --git a/writerfilter/qa/cppunittests/misc/misc.cxx b/writerfilter/qa/cppunittests/misc/misc.cxx
index 49e5e1b393c6..522dc19ee685 100644
--- a/writerfilter/qa/cppunittests/misc/misc.cxx
+++ b/writerfilter/qa/cppunittests/misc/misc.cxx
@@ -160,6 +160,26 @@ void WriterfilterMiscTest::testFieldParameters()
CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
CPPUNIT_ASSERT_EQUAL(OUString("\\A"), boost::get<2>(result)[2]);
CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<2>(result)[3]);
+
+ for (auto prefix : {"#", "$", "%", "&", "'", "(", ")", "*", "+", ",",
+ "-", ".", "/", ":", ";", "<", ">", "?", "@", "[",
+ "]", "^", "_", "`", "{", "|", "}", "~"})
+ {
+ OUString test(OUString::createFromAscii(prefix) + OUString("PAGE"));
+ result = lcl_SplitFieldCommand(test + OUString(" "));
+ CPPUNIT_ASSERT_EQUAL(test, boost::get<0>(result));
+ }
+ result = lcl_SplitFieldCommand("\\PAGE ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), boost::get<0>(result));
+ result = lcl_SplitFieldCommand("\\ PAGE ");
+ CPPUNIT_ASSERT_EQUAL(OUString("\\ "), boost::get<0>(result));
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), boost::get<1>(result)[0]);
+ result = lcl_SplitFieldCommand("\\\\PAGE ");
+ CPPUNIT_ASSERT_EQUAL(OUString("\\PAGE"), boost::get<0>(result));
+ result = lcl_SplitFieldCommand("\"PAGE\" ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), boost::get<0>(result));
+ result = lcl_SplitFieldCommand("\"PAGE ");
+ CPPUNIT_ASSERT_EQUAL(OUString("PAGE "), boost::get<0>(result));
}
CPPUNIT_TEST_SUITE_REGISTRATION(WriterfilterMiscTest);
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 8e079ea04acc..ec4304b54f70 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -2274,15 +2274,12 @@ static OUString lcl_ExtractToken(OUString const& rCommand,
assert(rIndex == rCommand.getLength());
if (bQuoted)
{
+ // MS Word allows this, so just emit a debug message
SAL_INFO("writerfilter.dmapper",
"field argument with unterminated quote");
- return OUString();
- }
- else
- {
- rHaveToken = !token.isEmpty();
- return token.makeStringAndClear();
}
+ rHaveToken = !token.isEmpty();
+ return token.makeStringAndClear();
}
boost::tuple<OUString, std::vector<OUString>, std::vector<OUString> >
@@ -2292,10 +2289,13 @@ lcl_SplitFieldCommand(const OUString& rCommand)
std::vector<OUString> arguments;
std::vector<OUString> switches;
sal_Int32 nStartIndex(0);
- // tdf#54584: Field may be prepended by a backslash - skip it
+ // tdf#54584: Field may be prepended by a backslash
+ // This is not an escapement, but already escaped literal "\"
+ // MS Word allows this, so just skip it
if ((rCommand.getLength() >= nStartIndex + 2) &&
- (rCommand[nStartIndex] == '\\') &&
- (rCommand[nStartIndex + 1] != '\\'))
+ (rCommand[nStartIndex] == L'\\') &&
+ (rCommand[nStartIndex + 1] != L'\\') &&
+ (rCommand[nStartIndex + 1] != L' '))
{
++nStartIndex;
}