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-unsubscr...@poi.apache.org For additional commands, e-mail: commits-h...@poi.apache.org