]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Another attempt at fixing the space removal issue. This method
authorGlen Mazza <gmazza@apache.org>
Sun, 4 Apr 2004 06:29:44 +0000 (06:29 +0000)
committerGlen Mazza <gmazza@apache.org>
Sun, 4 Apr 2004 06:29:44 +0000 (06:29 +0000)
combines the long-standing previous method (the one that removed spaces
between words correctly, at a cost of a leading extra space for the first
FOText instance of an fo:block) with my later patch (which would
fix the extra space issue but had problems with spaces between words).  It
appears to work well, but the fo:inline issues Simon brought up will still
need further work.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@197489 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/FOText.java
src/java/org/apache/fop/fo/FObjMixed.java
src/java/org/apache/fop/layoutmgr/AddLMVisitor.java
src/java/org/apache/fop/layoutmgr/TextLayoutManager.java
src/java/org/apache/fop/render/rtf/RTFHandler.java

index b59f628c5c00ce54952b4f45d6f2fd25a6c62ded..ad203a5ab29cf9e966c08b0672fa47ad4c69f979 100644 (file)
@@ -47,11 +47,21 @@ public class FOText extends FObj {
      * The starting valid index of the ca array 
      * to be processed.
      *
+     * This value is originally equal to 0, but becomes 
+     * incremented during leading whitespace removal by the flow.Block class,  
+     * via the TextCharIterator.remove() method below.
+     */
+    public int startIndex = 0;
+
+    /**
+     * The ending valid index of the ca array 
+     * to be processed.
+     *
      * This value is originally equal to ca.length, but becomes 
-     * incremented during whitespace removal by the flow.Block class,  
+     * decremented during between-word whitespace removal by the flow.Block class,  
      * via the TextCharIterator.remove() method below.
      */
-    public int start = 0;
+    public int endIndex = 0;
 
     /**
      * The TextInfo object attached to the text
@@ -100,9 +110,10 @@ public class FOText extends FObj {
      */
     public FOText(char[] chars, int start, int end, TextInfo ti, FONode parent) {
         super(parent);
-        int length = end - start;
-        this.ca = new char[length];
-        System.arraycopy(chars, start, ca, 0, length);
+        endIndex = end - start;
+        this.ca = new char[endIndex];
+        System.arraycopy(chars, start, ca, 0, endIndex);
+//      System.out.println("->" + new String(ca) + "<-");
         textInfo = ti;
         createBlockPointers();
         textTransform();
@@ -119,11 +130,11 @@ public class FOText extends FObj {
      */
     public boolean willCreateArea() {
         if (textInfo.whiteSpaceCollapse == WhiteSpaceCollapse.FALSE
-                && ca.length - start > 0) {
+                && endIndex - startIndex > 0) {
             return true;
         }
 
-        for (int i = start; i < ca.length; i++) {
+        for (int i = startIndex; i < endIndex; i++) {
             char ch = ca[i];
             if (!((ch == ' ')
                     || (ch == '\n')
@@ -142,37 +153,7 @@ public class FOText extends FObj {
         return new TextCharIterator();
     }
 
-    private class TextCharIterator extends AbstractCharIterator {
-        private int curIndex = 0;
-
-        public boolean hasNext() {
-            return (curIndex < ca.length);
-        }
-
-        public char nextChar() {
-            if (curIndex < ca.length) {
-                // Just a char class? Don't actually care about the value!
-                return ca[curIndex++];
-            } else {
-                throw new NoSuchElementException();
-            }
-        }
-
-        public void remove() {
-            if (start < ca.length) {
-                start++;
-            }
-        }
-
-        public void replaceChar(char c) {
-            if (curIndex > 0 && curIndex <= ca.length) {
-                ca[curIndex - 1] = c;
-            }
-        }
-
-    }
-
-    /**
+     /**
      * This method is run as part of the Constructor, to create xref pointers to
      * the previous FOText objects within the same Block
      */
@@ -214,7 +195,7 @@ public class FOText extends FObj {
         if (textInfo.textTransform == TextTransform.NONE) {
             return;
         }
-        for (int i = 0; i < ca.length; i++) {
+        for (int i = 0; i < endIndex; i++) {
             ca[i] = charTransform(i);
         }
     }
@@ -279,7 +260,7 @@ public class FOText extends FObj {
      */
     private char getRelativeCharInBlock(int i, int offset) {
         // The easy case is where the desired character is in the same FOText
-        if (((i + offset) >= 0) && ((i + offset) <= this.ca.length)) {
+        if (((i + offset) >= 0) && ((i + offset) <= this.endIndex)) {
             return ca[i + offset];
         }
         // For now, we can't look at following FOText nodes
@@ -297,11 +278,11 @@ public class FOText extends FObj {
                 break;
             }
             nodeToTest = nodeToTest.prevFOTextThisBlock;
-            if ((nodeToTest.ca.length + remainingOffset) >= 0) {
-                charToReturn = nodeToTest.ca[nodeToTest.ca.length + remainingOffset];
+            if ((nodeToTest.endIndex + remainingOffset) >= 0) {
+                charToReturn = nodeToTest.ca[nodeToTest.endIndex + remainingOffset];
                 foundChar = true;
             } else {
-                remainingOffset = remainingOffset + nodeToTest.ca.length;
+                remainingOffset = remainingOffset + nodeToTest.endIndex;
             }
         }
         return charToReturn;
@@ -458,4 +439,53 @@ public class FOText extends FObj {
     public void acceptVisitor(FOTreeVisitor fotv) {
         fotv.serveFOText(this);
     }
+
+    
+    private class TextCharIterator extends AbstractCharIterator {
+        private int curIndex = 0;
+        private int nextCharCalled = 0;
+        
+        public boolean hasNext() {
+           if (curIndex == 0) {
+//             System.out.println("->" + new String(ca) + "<-");
+          }
+           return (curIndex < endIndex);
+        }
+
+        public char nextChar() {
+            if (curIndex < endIndex) {
+                nextCharCalled++;
+                // Just a char class? Don't actually care about the value!
+                return ca[curIndex++];
+            } else {
+                throw new NoSuchElementException();
+            }
+        }
+
+        public void remove() {
+            if (curIndex < endIndex && nextCharCalled < 2) {
+                startIndex++;
+                nextCharCalled = 0;
+//              System.out.println("removeA: " + new String(ca, startIndex, endIndex - startIndex));
+            } else if (curIndex < endIndex) {
+                // copy from curIndex to end to curIndex-1
+                System.arraycopy(ca, curIndex, ca, curIndex - 1, 
+                    endIndex - curIndex);
+                endIndex--;
+                curIndex--;
+//              System.out.println("removeB: " + new String(ca, startIndex, endIndex - startIndex));
+            } else if (curIndex == endIndex) {
+//              System.out.println("removeC: " + new String(ca, startIndex, endIndex - startIndex));
+                curIndex = --endIndex;
+            }
+        }
+
+        public void replaceChar(char c) {
+            if (curIndex > 0 && curIndex <= endIndex) {
+                ca[curIndex - 1] = c;
+            }
+        }
+
+    }
+    
 }
index f1deac548e589a1a77dba154a737c016e27cefcf..513294ad6155e872bd151f2012b877dac567e83b 100644 (file)
@@ -55,7 +55,7 @@ public class FObjMixed extends FObj {
         ft.setName("text");
         
         /* characters() processing empty for FOTreeHandler, not empty for RTF & MIFHandlers */
-        getFOTreeControl().getFOInputHandler().characters(ft.ca, ft.start, ft.ca.length);
+        getFOTreeControl().getFOInputHandler().characters(ft.ca, ft.startIndex, ft.endIndex);
 
         addChild(ft);
     }
index 6d56e6f99c27edc465159ba025928703b5c4b101..bf6f8aee9baf65ab39451020841c65055fd51240 100644 (file)
@@ -180,7 +180,7 @@ public class AddLMVisitor implements FOTreeVisitor {
     }
 
     public void serveFOText(FOText foText) {
-        if (foText.ca.length - foText.start > 0) {
+        if (foText.endIndex - foText.startIndex > 0) {
             currentLMList.add(new TextLayoutManager(foText));
         }
     }
index d7fae3dc4d2896719a943d83e6bf2dc16f661d26..ae6987258f4102e0a033264771b5c1c392e43726 100644 (file)
@@ -98,9 +98,9 @@ public class TextLayoutManager extends AbstractLayoutManager {
     public TextLayoutManager(FOText node) {
         super(node);
         foText = node;
-        textArray = new char[node.ca.length - node.start];
-        System.arraycopy(node.ca, node.start, textArray, 0,
-            node.ca.length - node.start);
+        textArray = new char[node.endIndex - node.startIndex];
+        System.arraycopy(node.ca, node.startIndex, textArray, 0,
+            node.endIndex - node.startIndex);
 
         vecAreaInfo = new java.util.ArrayList();
 
index 3d65a071a7cc0fd93f7381524a52b416bb23b5a2..708bc6f4d46fe1d2574c230e1a1159a81c3575ad 100644 (file)
@@ -1152,7 +1152,7 @@ public class RTFHandler extends FOInputHandler {
         } else if (fobj instanceof FOText) {
             if (bStart) {
                 FOText text = (FOText) fobj;
-                characters(text.ca, text.start, text.ca.length);
+                characters(text.ca, text.startIndex, text.endIndex);
             }
         } else if (fobj instanceof BasicLink) {
             if (bStart) {