You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2020/01/26 20:44:02 UTC

svn commit: r1873188 - in /poi/trunk/src/ooxml: java/org/apache/poi/xwpf/usermodel/XWPFRun.java testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java

Author: fanningpj
Date: Sun Jan 26 20:44:02 2020
New Revision: 1873188

URL: http://svn.apache.org/viewvc?rev=1873188&view=rev
Log:
[bug-64098] XWPFRun: Whitespace in text not preserved if starting with tab character. Thanks to gjmathews

Modified:
    poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java?rev=1873188&r1=1873187&r2=1873188&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java Sun Jan 26 20:44:02 2020
@@ -146,7 +146,8 @@ public class XWPFRun implements ISDTCont
      */
     static void preserveSpaces(XmlString xs) {
         String text = xs.getStringValue();
-        if (text != null && (text.startsWith(" ") || text.endsWith(" "))) {
+        if (text != null && text.length() >= 1
+                && (Character.isWhitespace(text.charAt(0)) || Character.isWhitespace(text.charAt(text.length()-1)))) {
             XmlCursor c = xs.newCursor();
             c.toNextToken();
             c.insertAttributeWithValue(new QName("http://www.w3.org/XML/1998/namespace", "space"), "preserve");

Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java?rev=1873188&r1=1873187&r2=1873188&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java Sun Jan 26 20:44:02 2020
@@ -16,18 +16,6 @@
 ==================================================================== */
 package org.apache.poi.xwpf.usermodel;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.util.Iterator;
-import java.util.List;
-
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.util.LocaleUtil;
 import org.apache.poi.util.Units;
@@ -40,17 +28,16 @@ import org.junit.Test;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;
 import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrClear;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STEm;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHighlightColor;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STThemeColor;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.junit.Assert.*;
 
 /**
  * Tests for XWPF Run
@@ -809,4 +796,43 @@ public class TestXWPFRun {
             assertEquals(pic.getDepth(), Units.toPoints(32), 0.0);
         }
     }
+
+    @Test
+    public void testWhitespace() throws IOException {
+        String[] text = new String[] {
+                "  The quick brown fox",
+                "\t\tjumped over the lazy dog"
+        };
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        try (XWPFDocument doc = new XWPFDocument();) {
+            for(String s : text) {
+                XWPFParagraph p1 = doc.createParagraph();
+                XWPFRun r1 = p1.createRun();
+                r1.setText(s);
+            }
+
+            doc.write(bos);
+            bos.flush();
+        }
+
+        try (
+                ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+                XWPFDocument doc = new XWPFDocument(bis)
+        ) {
+            List<XWPFParagraph> paragraphs = doc.getParagraphs();
+            assertEquals(2, paragraphs.size());
+            for (int i = 0; i < text.length; i++) {
+                XWPFParagraph p1 = paragraphs.get(i);
+                String expected = text[i];
+                assertEquals(expected, p1.getText());
+                CTP ctp = p1.getCTP();
+                CTR ctr = ctp.getRArray(0);
+                CTText ctText = ctr.getTArray(0);
+                // if text has leading whitespace then expect xml-fragment to have xml:space="preserve" set
+                // <xml-fragment xml:space="preserve" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
+                boolean isWhitespace = Character.isWhitespace(expected.charAt(0));
+                assertEquals(isWhitespace, ctText.isSetSpace());
+            }
+        }
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org