svgio/inc/svgtools.hxx                      |    5 +--
 svgio/qa/cppunit/SvgImportTest.cxx          |   21 ++++++++++++++++
 svgio/qa/cppunit/data/textXmlSpace.svg      |   12 +++++++++
 svgio/source/svgreader/svgcharacternode.cxx |    4 +--
 svgio/source/svgreader/svgtools.cxx         |   36 +++++++---------------------
 5 files changed, 47 insertions(+), 31 deletions(-)

New commits:
commit ddf695db44bcb23dc2f1459fd439f93c0b6d5f2a
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Thu Sep 22 10:59:29 2022 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Sep 22 13:43:59 2022 +0200

    tdf#151118: svg: fix handling of xml:space="preserve"
    
    This allows the code to be simplified a bit
    
    Change-Id: If42dd9d3ebd7860ece9ff78cb090ff1b07e1b432
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140404
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/svgio/inc/svgtools.hxx b/svgio/inc/svgtools.hxx
index a5a0b3aa418b..0a4e200c746b 100644
--- a/svgio/inc/svgtools.hxx
+++ b/svgio/inc/svgtools.hxx
@@ -125,10 +125,9 @@ namespace svgio::svgreader
 
         void readImageLink(const OUString& rCandidate, OUString& rXLink, 
OUString& rUrl, OUString& rMimeType, OUString& rData);
 
-        OUString convert(const OUString& rCandidate, sal_Unicode nPattern, 
sal_Unicode nNew, bool bRemove);
+        OUString convert(const OUString& rCandidate, sal_Unicode nPattern, 
sal_Unicode nNew);
         OUString consolidateContiguousSpace(const OUString& rCandidate);
-        OUString whiteSpaceHandlingDefault(const OUString& rCandidate);
-        OUString whiteSpaceHandlingPreserve(const OUString& rCandidate);
+        OUString xmlSpaceHandling(const OUString& rCandidate, bool bIsDefault);
 
         // #125325# removes block comment of the general form '/* ... */', 
returns
         // an adapted string or the original if no comments included
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx 
b/svgio/qa/cppunit/SvgImportTest.cxx
index 07a98f4a5a2f..23734777cf2c 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -48,6 +48,7 @@ class Test : public test::BootstrapFixture, public 
XmlTestTools
     void testMarkerOrient();
     void testMarkerInPresentation();
     void testMarkerInCssStyle();
+    void testTextXmlSpace();
     void testTdf45771();
     void testTdf97941();
     void testTdf104339();
@@ -97,6 +98,7 @@ public:
     CPPUNIT_TEST(testMarkerOrient);
     CPPUNIT_TEST(testMarkerInPresentation);
     CPPUNIT_TEST(testMarkerInCssStyle);
+    CPPUNIT_TEST(testTextXmlSpace);
     CPPUNIT_TEST(testTdf45771);
     CPPUNIT_TEST(testTdf97941);
     CPPUNIT_TEST(testTdf104339);
@@ -420,6 +422,25 @@ void Test::testMarkerInCssStyle()
     assertXPath(pDocument, 
"/primitive2D/transform/transform[1]/polypolygonstroke/line", "linecap", 
"BUTT");
 }
 
+void Test::testTextXmlSpace()
+{
+    //Check tspan fontsize when using relative units
+    Primitive2DSequence aSequenceTdf97941 = 
parseSvg(u"/svgio/qa/cppunit/data/textXmlSpace.svg");
+    CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequenceTdf97941.getLength()));
+
+    drawinglayer::Primitive2dXmlDump dumper;
+    xmlDocUniquePtr pDocument = dumper.dumpAndParse(aSequenceTdf97941);
+
+    CPPUNIT_ASSERT (pDocument);
+
+    assertXPath(pDocument, "/primitive2D/transform/mask/textsimpleportion[1]", 
"text", "a b");
+    assertXPath(pDocument, "/primitive2D/transform/mask/textsimpleportion[2]", 
"text", "a b");
+    assertXPath(pDocument, "/primitive2D/transform/mask/textsimpleportion[3]", 
"text", "a b");
+    assertXPath(pDocument, "/primitive2D/transform/mask/textsimpleportion[4]", 
"text", "a  b");
+    assertXPath(pDocument, "/primitive2D/transform/mask/textsimpleportion[5]", 
"text", "a b");
+    assertXPath(pDocument, "/primitive2D/transform/mask/textsimpleportion[6]", 
"text", "a   b");
+}
+
 void Test::testTdf45771()
 {
     //Check text fontsize when using relative units
diff --git a/svgio/qa/cppunit/data/textXmlSpace.svg 
b/svgio/qa/cppunit/data/textXmlSpace.svg
new file mode 100644
index 000000000000..606e2eb7a306
--- /dev/null
+++ b/svgio/qa/cppunit/data/textXmlSpace.svg
@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg"; version="1.1"
+   viewBox="0 0 250 250">
+  <text y="10" xml:space="default">a  b</text>
+  <text y="30" xml:space="default">a   b</text>
+  <text y="50" xml:space="default">a
+  b</text>
+  <text y="70" xml:space="preserve">a  b</text>
+  <text y="90" xml:space="preserve">a  b</text>
+  <text y="110" xml:space="preserve">a
+  b</text>
+</svg>
+
diff --git a/svgio/source/svgreader/svgcharacternode.cxx 
b/svgio/source/svgreader/svgcharacternode.cxx
index 31376ee179a8..456a3abc8013 100644
--- a/svgio/source/svgreader/svgcharacternode.cxx
+++ b/svgio/source/svgreader/svgcharacternode.cxx
@@ -541,11 +541,11 @@ namespace svgio::svgreader
         {
             if (XmlSpace::Default == getXmlSpace())
             {
-                maText = whiteSpaceHandlingDefault(maText);
+                maText = xmlSpaceHandling(maText, true);
             }
             else
             {
-                maText = whiteSpaceHandlingPreserve(maText);
+                maText = xmlSpaceHandling(maText, false);
             }
         }
 
diff --git a/svgio/source/svgreader/svgtools.cxx 
b/svgio/source/svgreader/svgtools.cxx
index 5e56ee83b19e..92b2ecab3fb3 100644
--- a/svgio/source/svgreader/svgtools.cxx
+++ b/svgio/source/svgreader/svgtools.cxx
@@ -1375,7 +1375,7 @@ namespace svgio::svgreader
             }
         }
 
-        OUString convert(const OUString& rCandidate, sal_Unicode nPattern, 
sal_Unicode nNew, bool bRemove)
+        OUString convert(const OUString& rCandidate, sal_Unicode nPattern, 
sal_Unicode nNew)
         {
             const sal_Int32 nLen(rCandidate.getLength());
 
@@ -1392,11 +1392,7 @@ namespace svgio::svgreader
                     if(nPattern == aChar)
                     {
                         bChanged = true;
-
-                        if(!bRemove)
-                        {
-                            aBuffer.append(nNew);
-                        }
+                        aBuffer.append(nNew);
                     }
                     else
                     {
@@ -1513,42 +1509,30 @@ namespace svgio::svgreader
             return rCandidate;
         }
 
-        OUString whiteSpaceHandlingDefault(const OUString& rCandidate)
+        OUString xmlSpaceHandling(const OUString& rCandidate, bool bIsDefault)
         {
             const sal_Unicode aNewline('\n');
             const sal_Unicode aTab('\t');
             const sal_Unicode aSpace(' ');
 
             // remove all newline characters
-            OUString aRetval(convert(rCandidate, aNewline, aNewline, true));
+            OUString aRetval(convert(rCandidate, aNewline, aSpace));
 
             // convert tab to space
-            aRetval = convert(aRetval, aTab, aSpace, false);
+            aRetval = convert(aRetval, aTab, aSpace);
 
             // strip of all leading and trailing spaces
             aRetval = aRetval.trim();
 
-            // consolidate contiguous space
-            aRetval = consolidateContiguousSpace(aRetval);
+            if(bIsDefault)
+            {
+                // consolidate contiguous space
+                aRetval = consolidateContiguousSpace(aRetval);
+            }
 
             return aRetval;
         }
 
-        OUString whiteSpaceHandlingPreserve(const OUString& rCandidate)
-        {
-            const sal_Unicode aNewline('\n');
-            const sal_Unicode aTab('\t');
-            const sal_Unicode aSpace(' ');
-
-            // convert newline to space
-            convert(rCandidate, aNewline, aSpace, false);
-
-            // convert tab to space
-            convert(rCandidate, aTab, aSpace, false);
-
-            return rCandidate;
-        }
-
         ::std::vector< double > solveSvgNumberVector(const SvgNumberVector& 
rInput, const InfoProvider& rInfoProvider)
         {
             ::std::vector< double > aRetval;

Reply via email to