You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by lf...@apache.org on 2006/02/07 13:29:32 UTC
svn commit: r375585 - in /xmlgraphics/fop/trunk: ./
src/java/org/apache/fop/layoutmgr/inline/ test/layoutengine/
test/layoutengine/standard-testcases/
Author: lfurini
Date: Tue Feb 7 04:29:19 2006
New Revision: 375585
URL: http://svn.apache.org/viewcvs?rev=375585&view=rev
Log:
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
Removed:
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2a.xml
Modified:
xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
xmlgraphics/fop/trunk/status.xml
xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml
xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml
Modified: xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java (original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java Tue Feb 7 04:29:19 2006
@@ -752,204 +752,141 @@
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;
}
Modified: xmlgraphics/fop/trunk/status.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/status.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/status.xml (original)
+++ xmlgraphics/fop/trunk/status.xml Tue Feb 7 04:29:19 2006
@@ -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.
Modified: xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/disabled-testcases.xml Tue Feb 7 04:29:19 2006
@@ -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
Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_2.xml Tue Feb 7 04:29:19 2006
@@ -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>
Modified: xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml
URL: http://svn.apache.org/viewcvs/xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml?rev=375585&r1=375584&r2=375585&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml (original)
+++ xmlgraphics/fop/trunk/test/layoutengine/standard-testcases/block_white-space_3.xml Tue Feb 7 04:29:19 2006
@@ -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/>
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org