From 5769a0fe9fb13878a9573ea45b5544ca481c1d00 Mon Sep 17 00:00:00 2001 From: Luca Furini Date: Tue, 7 Feb 2006 12:29:19 +0000 Subject: [PATCH] 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 --- .../layoutmgr/inline/TextLayoutManager.java | 317 +++++++----------- status.xml | 3 + test/layoutengine/disabled-testcases.xml | 13 - .../block_white-space_2.xml | 5 - .../block_white-space_2a.xml | 57 ---- .../block_white-space_3.xml | 24 +- 6 files changed, 150 insertions(+), 269 deletions(-) delete mode 100644 test/layoutengine/standard-testcases/block_white-space_2a.xml 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 @@ + + Bugfix: The elements representing a non-breaking space weren't always correct. + 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 @@ -61,19 +61,6 @@ An empty block currently produces a fence for stacking constraints which it shouldn't. - - Non breaking space removal - block_white-space_2.xml - A non breaking space is incorrectly - removed from the start of a line. - - - Non breaking spaces must not be breakable - block_white-space_3.xml - A non breaking space incorrectly - causes a break possibility. The element list is wrong. - http://issues.apache.org/bugzilla/show_bug.cgi?id=38507 - block white-space-collapse 2 block_white-space-collapse_2.xml 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 @@

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.

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 @@ - - - - - -

- 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. -

-
- - - - - - - - - -  single nbsp around  -   -   after  empty  line   - - - - - - - - - - - - - - - -
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 @@ « text » « text Â» + « text Â» @@ -60,16 +61,31 @@ - - + + + + + + + + + + 3 + + + + + + + - - + + -- 2.39.5