diff options
author | Luca Furini <lfurini@apache.org> | 2006-02-07 12:29:19 +0000 |
---|---|---|
committer | Luca Furini <lfurini@apache.org> | 2006-02-07 12:29:19 +0000 |
commit | 5769a0fe9fb13878a9573ea45b5544ca481c1d00 (patch) | |
tree | 7ff32da452664e4d95ed0ca11552016379d856b9 | |
parent | f6bf4a418239b8600d5e4957febd12fdef6a61dd (diff) | |
download | xmlgraphics-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.java | 317 | ||||
-rw-r--r-- | status.xml | 3 | ||||
-rwxr-xr-x | test/layoutengine/disabled-testcases.xml | 13 | ||||
-rw-r--r-- | test/layoutengine/standard-testcases/block_white-space_2.xml | 5 | ||||
-rw-r--r-- | test/layoutengine/standard-testcases/block_white-space_2a.xml | 57 | ||||
-rw-r--r-- | test/layoutengine/standard-testcases/block_white-space_3.xml | 24 |
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"> single nbsp around </fo:block> - <fo:block background-color="red"> </fo:block> - <fo:block background-color="silver">  after  empty  line  </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">« text »</fo:block> + <fo:block background-color="blue" text-align="justify">« text »</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/> |