]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fix for bug 38507: the elements representing a non-breaking space were not always...
authorLuca Furini <lfurini@apache.org>
Tue, 7 Feb 2006 12:29:19 +0000 (12:29 +0000)
committerLuca Furini <lfurini@apache.org>
Tue, 7 Feb 2006 12:29:19 +0000 (12:29 +0000)
This also solves another bug concerning the incorrect suppression of a nbsp at the beginning of a line.

A bit of clean-up in TextLayoutManager

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

src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
status.xml
test/layoutengine/disabled-testcases.xml
test/layoutengine/standard-testcases/block_white-space_2.xml
test/layoutengine/standard-testcases/block_white-space_2a.xml [deleted file]
test/layoutengine/standard-testcases/block_white-space_3.xml

index 4816f5c02a2d237ce716f21a6df0df8a3e0b9e61..ac8867b31a029ad21d0a92329eb6223a88ac40a7 100644 (file)
@@ -752,204 +752,141 @@ public class TextLayoutManager extends LeafNodeLayoutManager {
         LinkedList spaceElements = new LinkedList();
         LeafPosition mainPosition = new LeafPosition(this, leafValue);
         
-        // add a penalty to avoid the next glue element to be
-        // a feasible line break
         if (textArray[ai.iStartIndex] == NBSPACE) {
-            spaceElements.add
-            (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                    new LeafPosition(this, -1),
-                    false));
-        }
-        
-        switch (alignment) {
-        case EN_CENTER :
-            // centered text:
-            // if the second element is chosen as a line break these elements 
-            // add a constant amount of stretch at the end of a line and at the
-            // beginning of the next one, otherwise they don't add any stretch
-            /*
-            spaceElements.add
-            (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthPenalty(0,
-                    (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE : 0),
-                    false, new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    - 6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    mainPosition, false));
-            spaceElements.add
-            (new KnuthInlineBox(0, 0, 0, 0,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    new LeafPosition(this, -1), false));
-            */
-            spaceElements.add
-                (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               new LeafPosition(this, -1), true));
-            spaceElements.add
-                (new KnuthPenalty(0,
-                        (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE : 0),
+            // a non-breaking space
+            //TODO: other kinds of non-breaking spaces
+            if (alignment == EN_JUSTIFY) {
+                // the space can stretch and shrink, and must be preserved
+                // when starting a line
+                spaceElements.add(new KnuthInlineBox(0, null,
+                        notifyPos(new LeafPosition(this, -1)), true));
+                spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE,
                         false, new LeafPosition(this, -1), false));
-            spaceElements.add
-                (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                               -6 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               mainPosition, false));
-            spaceElements.add
-                (new KnuthInlineBox(0, null,
-                                    notifyPos(new LeafPosition(this, -1)), true));
-            spaceElements.add
-                (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                  new LeafPosition(this, -1), true));
-            spaceElements.add
-                (new KnuthGlue(lineStartBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                               new LeafPosition(this, -1), true));
-            break;
-            
-        case EN_START  : // fall through
-        case EN_END    :
-            // left- or right-aligned text:
-            // if the second element is chosen as a line break these elements 
-            // add a constant amount of stretch at the end of a line, otherwise
-            // they don't add any stretch
-            /*
-            spaceElements.add
-            (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthPenalty(0, 0, false,
-                    new LeafPosition(this, -1), false));
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    - 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                    mainPosition, false));
-            */
-            if (lineStartBAP != 0 || lineEndBAP != 0) {
-                spaceElements.add
-                    (new KnuthGlue(lineEndBAP, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                   -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   mainPosition, false));
-                spaceElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                spaceElements.add
-                   (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                     new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
+                spaceElements.add(new KnuthGlue(ai.ipdArea.opt, ai.ipdArea.max - ai.ipdArea.opt, 
+                        ai.ipdArea.opt - ai.ipdArea.min, mainPosition, false));
             } else {
-                spaceElements.add
-                    (new KnuthGlue(0, 3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt,
-                                   -3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
-                                   mainPosition, false));
+                // the space does not need to stretch or shrink, and must be
+                // preserved when starting a line
+                spaceElements.add(new KnuthInlineBox(ai.ipdArea.opt, null,
+                        mainPosition, true));
             }
-            break;
-            
-        case EN_JUSTIFY:
-            // justified text:
-            // the stretch and shrink depends on the space width
-            /*
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    ai.ipdArea.max - ai.ipdArea.opt,
-                    ai.ipdArea.opt - ai.ipdArea.min,
-                    mainPosition, false));
-            */
-            if (lineStartBAP != 0 || lineEndBAP != 0) {
-                spaceElements.add
-                    (new KnuthGlue(lineEndBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                   ai.ipdArea.max - ai.ipdArea.opt,
-                                   ai.ipdArea.opt - ai.ipdArea.min,
-                                   mainPosition, false));
-                spaceElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-            } else {
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt,
-                            ai.ipdArea.max - ai.ipdArea.opt,
-                            ai.ipdArea.opt - ai.ipdArea.min,
+        } else {
+            // a breaking space
+            switch (alignment) {
+            case EN_CENTER:
+                // centered text:
+                // if the second element is chosen as a line break these elements 
+                // add a constant amount of stretch at the end of a line and at the
+                // beginning of the next one, otherwise they don't add any stretch
+                spaceElements.add(new KnuthGlue(lineEndBAP,
+                        3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                        new LeafPosition(this, -1), false));
+                spaceElements
+                        .add(new KnuthPenalty(
+                                0,
+                                (textArray[ai.iStartIndex] == NBSPACE ? KnuthElement.INFINITE
+                                        : 0), false,
+                                new LeafPosition(this, -1), false));
+                spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                        - (lineStartBAP + lineEndBAP), -6
+                        * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                        mainPosition, false));
+                spaceElements.add(new KnuthInlineBox(0, null,
+                        notifyPos(new LeafPosition(this, -1)), false));
+                spaceElements.add(new KnuthPenalty(0, KnuthElement.INFINITE,
+                        false, new LeafPosition(this, -1), false));
+                spaceElements.add(new KnuthGlue(lineStartBAP,
+                        3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                        new LeafPosition(this, -1), false));
+                break;
+
+            case EN_START: // fall through
+            case EN_END:
+                // left- or right-aligned text:
+                // if the second element is chosen as a line break these elements 
+                // add a constant amount of stretch at the end of a line, otherwise
+                // they don't add any stretch
+                if (lineStartBAP != 0 || lineEndBAP != 0) {
+                    spaceElements.add(new KnuthGlue(lineEndBAP,
+                            3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                            - (lineStartBAP + lineEndBAP), -3
+                            * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
                             mainPosition, false));
-            }
-            break;
-            
-        default:
-            // last line justified, the other lines unjustified:
-            // use only the space stretch
-            /*
-            spaceElements.add
-            (new KnuthGlue(ai.ipdArea.opt,
-                    ai.ipdArea.max - ai.ipdArea.opt, 0,
-                    mainPosition, false));
-            */
-            if (lineStartBAP != 0 || lineEndBAP != 0) {
-                spaceElements.add
-                    (new KnuthGlue(lineEndBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, 0, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt - (lineStartBAP + lineEndBAP),
-                                   ai.ipdArea.max - ai.ipdArea.opt, 0,
-                                   mainPosition, false));
-                spaceElements.add
-                    (new KnuthInlineBox(0, null,
-                                        notifyPos(new LeafPosition(this, -1)), false));
-                spaceElements.add
-                    (new KnuthPenalty(0, KnuthElement.INFINITE, false,
-                                      new LeafPosition(this, -1), false));
-                spaceElements.add
-                    (new KnuthGlue(lineStartBAP, 0, 0,
-                                   new LeafPosition(this, -1), false));
-            } else {
-                spaceElements.add
-                    (new KnuthGlue(ai.ipdArea.opt,
-                                    ai.ipdArea.max - ai.ipdArea.opt, 0,
-                                    mainPosition, false));
+                    spaceElements.add(new KnuthInlineBox(0, null,
+                            notifyPos(new LeafPosition(this, -1)), false));
+                    spaceElements.add(new KnuthPenalty(0,
+                            KnuthElement.INFINITE, false, new LeafPosition(
+                                    this, -1), false));
+                    spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                } else {
+                    spaceElements.add(new KnuthGlue(0,
+                            3 * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt, -3
+                            * LineLayoutManager.DEFAULT_SPACE_WIDTH, 0,
+                            mainPosition, false));
+                }
+                break;
+
+            case EN_JUSTIFY:
+                // justified text:
+                // the stretch and shrink depends on the space width
+                if (lineStartBAP != 0 || lineEndBAP != 0) {
+                    spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                            - (lineStartBAP + lineEndBAP), ai.ipdArea.max
+                            - ai.ipdArea.opt, ai.ipdArea.opt - ai.ipdArea.min,
+                            mainPosition, false));
+                    spaceElements.add(new KnuthInlineBox(0, null,
+                            notifyPos(new LeafPosition(this, -1)), false));
+                    spaceElements.add(new KnuthPenalty(0,
+                            KnuthElement.INFINITE, false, new LeafPosition(
+                                    this, -1), false));
+                    spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                } else {
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt,
+                            ai.ipdArea.max - ai.ipdArea.opt, ai.ipdArea.opt
+                                    - ai.ipdArea.min, mainPosition, false));
+                }
+                break;
+
+            default:
+                // last line justified, the other lines unjustified:
+                // use only the space stretch
+                if (lineStartBAP != 0 || lineEndBAP != 0) {
+                    spaceElements.add(new KnuthGlue(lineEndBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthPenalty(0, 0, false,
+                            new LeafPosition(this, -1), false));
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt
+                            - (lineStartBAP + lineEndBAP), ai.ipdArea.max
+                            - ai.ipdArea.opt, 0, mainPosition, false));
+                    spaceElements.add(new KnuthInlineBox(0, null,
+                            notifyPos(new LeafPosition(this, -1)), false));
+                    spaceElements.add(new KnuthPenalty(0,
+                            KnuthElement.INFINITE, false, new LeafPosition(
+                                    this, -1), false));
+                    spaceElements.add(new KnuthGlue(lineStartBAP, 0, 0,
+                            new LeafPosition(this, -1), false));
+                } else {
+                    spaceElements.add(new KnuthGlue(ai.ipdArea.opt,
+                            ai.ipdArea.max - ai.ipdArea.opt, 0, mainPosition,
+                            false));
+                }
             }
         }
         
-        // TODO
-        // Add zero width box to avoid any nbspace to be removed
-        // at the end of a paragraph.
-        // This is kind of a hack and should be removed once the
-        // whole line building and white space handling is revisited.
-        if (textArray[ai.iStartIndex] == NBSPACE) {
-            spaceElements.add
-                (new KnuthInlineBox(0, null,
-                                    notifyPos(new LeafPosition(this, -1)), true));
-        }
         return spaceElements;
     }
 
index 216c6c593d53c217847548de98909f56f55a9a6d..1c82a06bc16c226f4007c674a7d02a55b287e424 100644 (file)
@@ -27,6 +27,9 @@
 
   <changes>
     <release version="FOP Trunk">
+      <action context="Code" dev="LF" type="fix" fixes-bug="38507">
+        Bugfix: The elements representing a non-breaking space weren't always correct.
+      </action>
       <action context="Code" dev="JM" type="fix" fixes-bug="38453">
         Bugfix: Text-decoration was not promoted if no text-decoration attribute was
         specified on a nested element.
index d2dd47b354e6f7e58c7095a1131f333371caff2b..308cedb402e0393bf560afce536c09e5c0c2d8a9 100755 (executable)
     <description>An empty block currently produces a fence for
     stacking constraints which it shouldn't.</description>
   </testcase>
-  <testcase>
-    <name>Non breaking space removal</name>
-    <file>block_white-space_2.xml</file>
-    <description>A non breaking space is incorrectly
-    removed from the start of a line.</description>
-  </testcase>
-  <testcase>
-    <name>Non breaking spaces must not be breakable</name>
-    <file>block_white-space_3.xml</file>
-    <description>A non breaking space incorrectly
-    causes a break possibility. The element list is wrong.</description>
-    <reference>http://issues.apache.org/bugzilla/show_bug.cgi?id=38507</reference>
-  </testcase>
   <testcase>
     <name>block white-space-collapse 2</name>
     <file>block_white-space-collapse_2.xml</file>
index e1dfa24c073e04f8ed9403828b08b6a0eaa4784e..bf6c570c06fa937deeb1cbdbd3b3ec810fd2349f 100644 (file)
   <info>
     <p>
       This test checks non breaking white space.
-      Note: This test currently fails because the first non breaking space on
-      each line is incorrectly removed. There is a duplicate test
-      block_white-space_2a.xml whose checks have been adjusted to cater for 
-      this defect. Once the problem is fixed block_white-space_2a.xml should
-      be removed from the test suite.
     </p>
   </info>
   <fo>
diff --git a/test/layoutengine/standard-testcases/block_white-space_2a.xml b/test/layoutengine/standard-testcases/block_white-space_2a.xml
deleted file mode 100644 (file)
index c14b0a3..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright 2005 The Apache Software Foundation
-
-  Licensed 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.
--->
-<!-- $Id$ -->
-<testcase>
-  <info>
-    <p>
-      This test checks non breaking white space.
-      Note: This test should fail because the first nb space in each line is
-      incorrectly removed. However, the checks below have been adjusted to
-      cater for this defect so this test passes. This has been done to have some
-      test cases which are being run in the test suite for non breaking spaces.
-      This test is otherwise identical to block_white-space_2.xml. Once the problem
-      is fixed this file can be deleted from the test suite.
-    </p>
-  </info>
-  <fo>
-    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
-      <fo:layout-master-set>
-        <fo:simple-page-master master-name="normal" page-width="5in" page-height="5in">
-          <fo:region-body/>
-        </fo:simple-page-master>
-      </fo:layout-master-set>
-      <fo:page-sequence master-reference="normal" white-space-collapse="true">
-        <fo:flow flow-name="xsl-region-body">
-          <fo:block background-color="silver">&#160;single&#160;nbsp&#160;around&#160;</fo:block>
-          <fo:block background-color="red">&#160;</fo:block>
-          <fo:block background-color="silver">&#160;&#160;after&#160;&#160;empty&#160;&#160;line&#160;&#160;</fo:block>
-        </fo:flow>
-      </fo:page-sequence>
-    </fo:root>
-  </fo>
-  <checks>
-    <eval expected="11100" xpath="//flow/block[1]/lineArea/@bpd"/>
-    <!--<eval expected="4" xpath="count(//flow/block[1]/lineArea/text/space)"/>-->
-    <eval expected="3" xpath="count(//flow/block[1]/lineArea/text/space)"/>
-    <eval expected="11100" xpath="//flow/block[2]/lineArea/@bpd"/>
-    <!--<eval expected="1" xpath="count(//flow/block[2]/lineArea/text/space)"/>-->
-    <eval expected="0" xpath="count(//flow/block[2]/lineArea/text/space)"/>
-    <eval expected="11100" xpath="//flow/block[3]/lineArea/@bpd"/>
-    <!--<eval expected="8" xpath="count(//flow/block[3]/lineArea/text/space)"/>-->
-    <eval expected="7" xpath="count(//flow/block[3]/lineArea/text/space)"/>
-  </checks>
-</testcase>
index b5276700b926b22fb3a544940412fe5577a249ee..112d6bed6707ac7503f85a909d068e45a3e4fb77 100644 (file)
@@ -32,6 +32,7 @@
         <fo:flow flow-name="xsl-region-body">
           <fo:block background-color="yellow">« text »</fo:block><!-- normal spaces here -->
           <fo:block background-color="red">«&#160;text&#160;»</fo:block>
+          <fo:block background-color="blue" text-align="justify">«&#160;text&#160;»</fo:block>
         </fo:flow>
       </fo:page-sequence>
     </fo:root>
       <box/>
 
       <!-- first nbsp -->
-      <penalty w="0" p="INF"/>
-      <glue w="3336" y="0" z="0"/>
+      <box w="3336"/>
+      
+      <box/>
+      
+      <!-- second nbsp -->
+      <box w="3336"/>
+      
+      <box/>
+      
+      <skip>3</skip>
+    </element-list>
+    <element-list category="line" index="2">
+      <box/>
+
+      <!-- first nbsp -->
       <box w="0"/>
+      <penalty w="0" p="inf"/>
+      <glue w="3336" y="1668" z="1112"/>
       
       <box/>
       
       <!-- second nbsp -->
-      <penalty w="0" p="INF"/>
-      <glue w="3336" y="0" z="0"/>
       <box w="0"/>
+      <penalty w="0" p="inf"/>
+      <glue w="3336" y="1668" z="1112"/>
       
       <box/>