You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2008/08/12 21:57:04 UTC

svn commit: r685283 - in /poi/trunk/src/scratchpad: src/org/apache/poi/hwpf/extractor/ src/org/apache/poi/hwpf/usermodel/ testcases/org/apache/poi/hwpf/data/ testcases/org/apache/poi/hwpf/usermodel/

Author: nick
Date: Tue Aug 12 12:57:04 2008
New Revision: 685283

URL: http://svn.apache.org/viewvc?rev=685283&view=rev
Log:
Add HWPF support for stripping out fields (eg macros), and make this optionally happen always for headers and footers

Added:
    poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/data/HeaderWithMacros.doc   (with props)
    poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRange.java   (with props)
Modified:
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/extractor/WordExtractor.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java
    poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java
    poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHeaderStories.java
    poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/extractor/WordExtractor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/extractor/WordExtractor.java?rev=685283&r1=685282&r2=685283&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/extractor/WordExtractor.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/extractor/WordExtractor.java Tue Aug 12 12:57:04 2008
@@ -230,4 +230,12 @@
 		
 		return ret.toString();
 	}
+	
+	/**
+	 * Removes any fields (eg macros, page markers etc)
+	 *  from the string.
+	 */
+	public static String stripFields(String text) {
+		return Range.stripFields(text);
+	}
 }

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java?rev=685283&r1=685282&r2=685283&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/HeaderStories.java Tue Aug 12 12:57:04 2008
@@ -35,6 +35,8 @@
 	private Range headerStories;
 	private PlexOfCps plcfHdd;
 	
+	private boolean stripFields = false;
+	
 	public HeaderStories(HWPFDocument doc) {
 		this.headerStories = doc.getHeaderStoryRange();
 		FileInformationBlock fib = doc.getFileInformationBlock();
@@ -157,8 +159,15 @@
 			return "";
 		}
 		
-		// Return the contents
-		return headerStories.text().substring(prop.getStart(), prop.getEnd());
+		// Grab the contents
+		String text =
+			headerStories.text().substring(prop.getStart(), prop.getEnd());
+		
+		// Strip off fields and macros if requested
+		if(stripFields) {
+			return Range.stripFields(text);
+		}
+		return text;
 	}
 	
 	public Range getRange() {
@@ -167,4 +176,22 @@
 	protected PlexOfCps getPlcfHdd() {
 		return plcfHdd;
 	}
+	
+	/**
+	 * Are fields currently being stripped from
+	 *  the text that this {@link HeaderStories} returns?
+	 *  Default is false, but can be changed
+	 */
+	public boolean areFieldsStripped() {
+		return stripFields;
+	}
+	/**
+	 * Should fields (eg macros) be stripped from
+	 *  the text that this class returns?
+	 * Default is not to strip.
+	 * @param stripFields
+	 */
+	public void setAreFieldsStripped(boolean stripFields) {
+		this.stripFields = stripFields;
+	}
 }

Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java?rev=685283&r1=685282&r2=685283&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java (original)
+++ poi/trunk/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java Tue Aug 12 12:57:04 2008
@@ -299,6 +299,63 @@
     }
     return sb.toString();
   }
+  
+  /**
+   * Removes any fields (eg macros, page markers etc)
+   *  from the string.
+   * Normally used to make some text suitable for showing
+   *  to humans, and the resultant text should not normally
+   *  be saved back into the document!
+   */
+  public static String stripFields(String text) {
+	  // First up, fields can be nested...
+	  // A field can be 0x13 [contents] 0x15
+	  // Or it can be 0x13 [contents] 0x14 [real text] 0x15
+	  
+	  // If there are no fields, all easy
+	  if(text.indexOf('\u0013') == -1) return text;
+	  
+	  // Loop over until they're all gone
+	  // That's when we're out of both 0x13s and 0x15s
+	  while( text.indexOf('\u0013') > -1 &&
+			   text.indexOf('\u0015') > -1) {
+		  int first13 = text.indexOf('\u0013');
+		  int next13 = text.indexOf('\u0013', first13+1);
+		  int first14 = text.indexOf('\u0014', first13+1);
+		  int last15 = text.lastIndexOf('\u0015');
+		  
+		  // If they're the wrong way around, give up
+		  if(last15 < first13) {
+			  break;
+		  }
+		  
+		  // If no more 13s and 14s, just zap
+		  if(next13 == -1 && first14 == -1) {
+			  text = text.substring(0, first13) +
+			  			text.substring(last15+1);
+			  break;
+		  }
+		  
+		  // If a 14 comes before the next 13, then
+		  //  zap from the 13 to the 14, and remove
+		  //  the 15
+		  if(first14 != -1 && (first14 < next13 || next13 == -1)) {
+			  text = text.substring(0, first13) +
+			  			text.substring(first14+1, last15) +
+			  			text.substring(last15+1);
+			  continue;
+		  }
+		  
+		  // Another 13 comes before the next 14.
+		  // This means there's nested stuff, so we
+		  //  can just zap the lot
+		  text = text.substring(0, first13) +
+			text.substring(last15+1);
+		  continue;
+	  }
+
+	  return text;
+  }
 
   /**
    * Used to get the number of sections in a range. If this range is smaller

Added: poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/data/HeaderWithMacros.doc
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/data/HeaderWithMacros.doc?rev=685283&view=auto
==============================================================================
Binary file - no diff available.

Propchange: poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/data/HeaderWithMacros.doc
------------------------------------------------------------------------------
    svn:mime-type = application/msword

Modified: poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHeaderStories.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHeaderStories.java?rev=685283&r1=685282&r2=685283&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHeaderStories.java (original)
+++ poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestHeaderStories.java Tue Aug 12 12:57:04 2008
@@ -35,6 +35,7 @@
 	private HWPFDocument oddEven; 
 	private HWPFDocument diffFirst; 
 	private HWPFDocument unicode;
+	private HWPFDocument withFields;
 	
     protected void setUp() throws Exception {
 		String dirname = System.getProperty("HWPF.testdata.path");
@@ -60,6 +61,9 @@
 		unicode = new HWPFDocument(
 				new FileInputStream(new File(dirname, "HeaderFooterUnicode.doc"))
 		);
+		withFields = new HWPFDocument(
+				new FileInputStream(new File(dirname, "HeaderWithMacros.doc"))
+		);
     }
     
     public void testNone() throws Exception {
@@ -186,4 +190,15 @@
 		assertEquals("\r\r", hs.getEvenFooter());
 		assertEquals("The footer, with Moli\u00e8re, has Unicode in it.\r\r", hs.getOddFooter());
     }
+    
+    public void testWithFields() throws Exception {
+    	HeaderStories hs = new HeaderStories(withFields);
+    	assertFalse(hs.areFieldsStripped());
+    	
+    	assertEquals("HEADER GOES HERE. 8/12/2008 \u0013 AUTHOR   \\* MERGEFORMAT \u0014Eric Roch\u0015\r\r\r", hs.getOddHeader());
+    	
+    	// Now turn on stripping
+    	hs.setAreFieldsStripped(true);
+    	assertEquals("HEADER GOES HERE. 8/12/2008 Eric Roch\r\r\r", hs.getOddHeader());
+    }
 }

Modified: poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java?rev=685283&r1=685282&r2=685283&view=diff
==============================================================================
--- poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java (original)
+++ poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java Tue Aug 12 12:57:04 2008
@@ -18,7 +18,6 @@
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileOutputStream;
 
 import junit.framework.TestCase;
 

Added: poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRange.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRange.java?rev=685283&view=auto
==============================================================================
--- poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRange.java (added)
+++ poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRange.java Tue Aug 12 12:57:04 2008
@@ -0,0 +1,53 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.poi.hwpf.usermodel;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for Range which aren't around deletion, insertion,
+ *  text replacement or textual contents
+ */
+public class TestRange extends TestCase {
+	public void testFieldStripping() throws Exception {
+		String exp = "This is some text.";
+		
+		String single = "This is some \u0013Blah!\u0015text.";
+		String with14 = "This is \u0013Blah!\u0014some\u0015 text.";
+		String withNested =
+			"This is \u0013Blah!\u0013Blah!\u0015\u0015some text.";
+		String withNested14 =
+			"This is \u0013Blah!\u0013Blah!\u0014don't see me\u0015 blah!\u0015some text.";
+		String withNestedIn14 = 
+			"This is \u0013Blah!\u0014some\u0013Blah!\u0015 \u0015text.";
+		
+		// Check all comes out right
+		assertEquals(exp, Range.stripFields(exp));
+		assertEquals(exp, Range.stripFields(single));
+		assertEquals(exp, Range.stripFields(with14));
+		assertEquals(exp, Range.stripFields(withNested));
+		assertEquals(exp, Range.stripFields(withNested14));
+		assertEquals(exp, Range.stripFields(withNestedIn14));
+		
+		// Ones that are odd and we won't change
+		String odd1 = "This\u0015 is \u0013 odd";
+		String odd2 = "This\u0015 is \u0014 also \u0013 odd";
+		
+		assertEquals(odd1, Range.stripFields(odd1));
+		assertEquals(odd2, Range.stripFields(odd2));
+	}
+}

Propchange: poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRange.java
------------------------------------------------------------------------------
    svn:eol-style = native



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