aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Furini <lfurini@apache.org>2006-02-07 12:29:19 +0000
committerLuca Furini <lfurini@apache.org>2006-02-07 12:29:19 +0000
commit5769a0fe9fb13878a9573ea45b5544ca481c1d00 (patch)
tree7ff32da452664e4d95ed0ca11552016379d856b9
parentf6bf4a418239b8600d5e4957febd12fdef6a61dd (diff)
downloadxmlgraphics-fop-5769a0fe9fb13878a9573ea45b5544ca481c1d00.tar.gz
xmlgraphics-fop-5769a0fe9fb13878a9573ea45b5544ca481c1d00.zip
Fix for bug 38507: the elements representing a non-breaking space were not always correct, sometimes allowing a break.
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
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java317
-rw-r--r--status.xml3
-rwxr-xr-xtest/layoutengine/disabled-testcases.xml13
-rw-r--r--test/layoutengine/standard-testcases/block_white-space_2.xml5
-rw-r--r--test/layoutengine/standard-testcases/block_white-space_2a.xml57
-rw-r--r--test/layoutengine/standard-testcases/block_white-space_3.xml24
6 files changed, 150 insertions, 269 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
index 4816f5c02..ac8867b31 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
@@ -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;
}
diff --git a/status.xml b/status.xml
index 216c6c593..1c82a06bc 100644
--- a/status.xml
+++ b/status.xml
@@ -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.
diff --git a/test/layoutengine/disabled-testcases.xml b/test/layoutengine/disabled-testcases.xml
index d2dd47b35..308cedb40 100755
--- a/test/layoutengine/disabled-testcases.xml
+++ b/test/layoutengine/disabled-testcases.xml
@@ -62,19 +62,6 @@
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>
<description>First line-break occurs after the fifth space following the
diff --git a/test/layoutengine/standard-testcases/block_white-space_2.xml b/test/layoutengine/standard-testcases/block_white-space_2.xml
index e1dfa24c0..bf6c570c0 100644
--- a/test/layoutengine/standard-testcases/block_white-space_2.xml
+++ b/test/layoutengine/standard-testcases/block_white-space_2.xml
@@ -19,11 +19,6 @@
<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
index c14b0a32f..000000000
--- a/test/layoutengine/standard-testcases/block_white-space_2a.xml
+++ /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>
diff --git a/test/layoutengine/standard-testcases/block_white-space_3.xml b/test/layoutengine/standard-testcases/block_white-space_3.xml
index b5276700b..112d6bed6 100644
--- a/test/layoutengine/standard-testcases/block_white-space_3.xml
+++ b/test/layoutengine/standard-testcases/block_white-space_3.xml
@@ -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>
@@ -60,16 +61,31 @@
<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/>