summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Kosiorek <gang65@poczta.onet.pl>2019-07-04 09:42:40 +0200
committerMiklos Vajna <vmiklos@collabora.com>2019-07-08 09:28:24 +0200
commitf96f3ee3a44d6c7af28e1eb67c8da9d36012b113 (patch)
tree4aa6b6029ff84e9d1fecbd5d9dbcb2880290e119
parentd410b9bd6c763ec0037031b6b5913f754264beca (diff)
tdf#76829 tdf#98291 Visio: Fix number conversion to string
The method 'doubleToString' is copied from librevenge: https://sourceforge.net/p/libwpd/librevenge/ci/master/tree/src/lib/RVNGProperty.cpp#l35 Method duplication allows to do not break ABI of librevenge. Change-Id: Ie1bce018cf2e1fd38af07db4d19445d1bffe9005 Reviewed-on: https://gerrit.libreoffice.org/75070 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Miklos Vajna <vmiklos@collabora.com>
-rw-r--r--src/lib/VSDFieldList.cpp68
-rw-r--r--src/test/data/tdf76829-datetime-format.vsdbin161280 -> 165888 bytes
-rw-r--r--src/test/data/tdf76829-numeric-format.vsdbin77312 -> 45568 bytes
-rw-r--r--src/test/importtest.cpp10
4 files changed, 60 insertions, 18 deletions
diff --git a/src/lib/VSDFieldList.cpp b/src/lib/VSDFieldList.cpp
index 05482d0..f6fc62d 100644
--- a/src/lib/VSDFieldList.cpp
+++ b/src/lib/VSDFieldList.cpp
@@ -68,6 +68,33 @@ librevenge::RVNGString libvisio::VSDNumericField::datetimeToString(const char *f
return result;
}
+// This method is copied from:
+// https://sourceforge.net/p/libwpd/librevenge/ci/master/tree/src/lib/RVNGProperty.cpp#l35
+// to avoid ABI breakage. If upstream file was modified, please update method accordingly.
+static librevenge::RVNGString doubleToString(const double value, const char* format)
+{
+ librevenge::RVNGString tempString;
+ if (value < 0.0001 && value > -0.0001)
+ tempString.sprintf(format, 0.0);
+ else
+ tempString.sprintf(format, value);
+#ifndef __ANDROID__
+ std::string decimalPoint(localeconv()->decimal_point);
+#else
+ std::string decimalPoint(".");
+#endif
+ if ((decimalPoint.size() == 0) || (decimalPoint == "."))
+ return tempString;
+ std::string stringValue(tempString.cstr());
+ if (!stringValue.empty())
+ {
+ std::string::size_type pos;
+ while ((pos = stringValue.find(decimalPoint)) != std::string::npos)
+ stringValue.replace(pos,decimalPoint.size(),".");
+ }
+ return librevenge::RVNGString(stringValue.c_str());
+}
+
librevenge::RVNGString libvisio::VSDNumericField::getString(const std::map<unsigned, librevenge::RVNGString> &)
{
if (m_format == VSD_FIELD_FORMAT_Unknown)
@@ -79,16 +106,7 @@ librevenge::RVNGString libvisio::VSDNumericField::getString(const std::map<unsig
{
// 0 Format string: 0.#### Example: 30060.9167
// 1 Format string: 0.#### u Example: 30060.9167 cm
- //TODO We need to implement number of digits support after decimal separator in librevenge
- double intpart;
- // If there is no decimal value, then treat number as Integer
- if (std::modf(m_number, &intpart) == 0.0)
- {
- std::unique_ptr<librevenge::RVNGProperty> pProp{librevenge::RVNGPropertyFactory::newIntProp(m_number)};
- return pProp ? pProp->getStr() : librevenge::RVNGString();
- }
- std::unique_ptr<librevenge::RVNGProperty> pProp{librevenge::RVNGPropertyFactory::newDoubleProp(m_number)};
- return pProp ? pProp->getStr() : librevenge::RVNGString();
+ return doubleToString(m_number, "%.4g");
}
case VSD_FIELD_FORMAT_0PlNoUnits:
case VSD_FIELD_FORMAT_0PlDefUnits:
@@ -98,12 +116,30 @@ librevenge::RVNGString libvisio::VSDNumericField::getString(const std::map<unsig
std::unique_ptr<librevenge::RVNGProperty> pProp{librevenge::RVNGPropertyFactory::newIntProp(m_number)};
return pProp ? pProp->getStr() : librevenge::RVNGString();
}
- //TODO VSD_FIELD_FORMAT_1PlNoUnits 4 Format string: 0.0
- //TODO VSD_FIELD_FORMAT_1PlDefUnits 5 Format string: 0.0 u
- //TODO VSD_FIELD_FORMAT_2PlNoUnits 6 Format string: 0.00
- //TODO VSD_FIELD_FORMAT_2PlDefUnits 7 Format string: 0.00 u
- //TODO VSD_FIELD_FORMAT_3PlNoUnits 8 Format string: 0.000
- //TODO VSD_FIELD_FORMAT_3PlDefUnits 9 Format string: 0.000 u
+
+ case VSD_FIELD_FORMAT_1PlNoUnits:
+ case VSD_FIELD_FORMAT_1PlDefUnits:
+ {
+ // 4 Format string: 0.0 Example: 30060.9
+ // 5 Format string: 0.0 u Example: 30060.9 cm
+ return doubleToString(m_number, "%.1f");
+ }
+
+ case VSD_FIELD_FORMAT_2PlNoUnits:
+ case VSD_FIELD_FORMAT_2PlDefUnits:
+ {
+ // 6 Format string: 0.00 Example: 30061.92
+ // 7 Format string: 0.00 u Example: 30061.92 cm
+ return doubleToString(m_number, "%.2f");
+ }
+
+ case VSD_FIELD_FORMAT_3PlNoUnits:
+ case VSD_FIELD_FORMAT_3PlDefUnits:
+ {
+ // 8 Format string: 0.000 Example: 30061.916
+ // 9 Format string: 0.000 u Example: 30061.916 cm
+ return doubleToString(m_number, "%.3f");
+ }
//TODO VSD_FIELD_FORMAT_FeetAndInches 10 Format string: <,FEET/INCH>0.000 u
//TODO VSD_FIELD_FORMAT_Radians 11 Format string: <,rad>0.#### u
//TODO VSD_FIELD_FORMAT_Degrees 12 Format string: <,deg>0.# u
diff --git a/src/test/data/tdf76829-datetime-format.vsd b/src/test/data/tdf76829-datetime-format.vsd
index c9237fe..f6eed7c 100644
--- a/src/test/data/tdf76829-datetime-format.vsd
+++ b/src/test/data/tdf76829-datetime-format.vsd
Binary files differ
diff --git a/src/test/data/tdf76829-numeric-format.vsd b/src/test/data/tdf76829-numeric-format.vsd
index a1c24cc..db9596d 100644
--- a/src/test/data/tdf76829-numeric-format.vsd
+++ b/src/test/data/tdf76829-numeric-format.vsd
Binary files differ
diff --git a/src/test/importtest.cpp b/src/test/importtest.cpp
index 13b665f..100338d 100644
--- a/src/test/importtest.cpp
+++ b/src/test/importtest.cpp
@@ -317,8 +317,14 @@ void ImportTest::testVsdTextBlockWithoutBgColor()
void ImportTest::testVsdNumericFormat()
{
m_doc = parse("tdf76829-numeric-format.vsd", m_buffer);
- assertXPathContent(m_doc, "/document/page[1]/textObject[1]/paragraph[1]/span/insertText", "Zeichenblatt 1 ");
- assertXPathContent(m_doc, "/document/page[2]/textObject[1]/paragraph[1]/span/insertText", "Zeichenblatt 2 ");
+ assertXPathContent(m_doc, "/document/page[1]/textObject[1]/paragraph[1]/span/insertText", "Number of lines, generic format: 1");
+ assertXPathContent(m_doc, "/document/page[1]/textObject[2]/paragraph[1]/span/insertText", "Number of lines, Number decimal places:: 1.00");
+ assertXPathContent(m_doc, "/document/page[1]/textObject[4]/paragraph[1]/span/insertText", "Creation date, generic: 07/06/2019");
+ assertXPathContent(m_doc, "/document/page[1]/textObject[6]/paragraph[1]/span/insertText", "Creation date, {{dd.MM.yyyy}}/Polish custom format: 07/06/2019");
+
+ //TODO Add support for custom formatting:
+ //assertXPathContent(m_doc, "/document/page[1]/textObject[3]/paragraph[1]/span/insertText", "Number of lines, percentage format: 100.00%");
+ //assertXPathContent(m_doc, "/document/page[1]/textObject[7]/paragraph[1]/span/insertText", "Creation date, {{dd.MM.yyyy}} German format:: 07.06.2019");
}
void ImportTest::testVsdDateTimeFormatting()