aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremias Maerki <jeremias@apache.org>2006-04-10 07:39:01 +0000
committerJeremias Maerki <jeremias@apache.org>2006-04-10 07:39:01 +0000
commit2569a6d829991a2aebad001df2447483d44e1d9b (patch)
tree6322f43132c46501d647fb83c5ee8cda43eb6be8
parent45c2b951496f399540056fd971521f4e47c10044 (diff)
downloadxmlgraphics-fop-2569a6d829991a2aebad001df2447483d44e1d9b.tar.gz
xmlgraphics-fop-2569a6d829991a2aebad001df2447483d44e1d9b.zip
List NBSP under adjustable spaces in CharUtilities.
Generate space elements in the area tree from spaces in fo:character. Clearly mark test cases which test for NBSP. Document failure to generate adjustable spaces from fo:character in a disabled test case. Adjust checks to the fact the fo:character can now also generate spaces. Enable block_white-space-collapse_2.xml again git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@392901 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java16
-rw-r--r--src/java/org/apache/fop/util/CharUtilities.java4
-rw-r--r--test/layoutengine/disabled-testcases.xml9
-rw-r--r--test/layoutengine/standard-testcases/block_white-space-collapse_1.xml3
-rw-r--r--test/layoutengine/standard-testcases/block_white-space_4.xml24
-rw-r--r--test/layoutengine/standard-testcases/block_white-space_nbsp_1.xml105
-rw-r--r--test/layoutengine/standard-testcases/block_white-space_nbsp_2.xml (renamed from test/layoutengine/standard-testcases/block_white-space_2.xml)20
7 files changed, 148 insertions, 33 deletions
diff --git a/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
index 4bc66adfb..9067c575c 100644
--- a/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
+++ b/src/java/org/apache/fop/layoutmgr/inline/CharacterLayoutManager.java
@@ -32,6 +32,7 @@ import org.apache.fop.layoutmgr.TraitSetter;
import org.apache.fop.area.Trait;
import org.apache.fop.traits.MinOptMax;
import org.apache.fop.traits.SpaceVal;
+import org.apache.fop.util.CharUtilities;
import java.util.List;
import java.util.LinkedList;
@@ -73,12 +74,17 @@ public class CharacterLayoutManager extends LeafNodeLayoutManager {
}
private org.apache.fop.area.inline.TextArea getCharacterInlineArea(Character node) {
- org.apache.fop.area.inline.TextArea ch
+ org.apache.fop.area.inline.TextArea text
= new org.apache.fop.area.inline.TextArea();
- ch.addWord(String.valueOf(node.getCharacter()), 0);
- TraitSetter.setProducerID(ch, node.getId());
- TraitSetter.addTextDecoration(ch, fobj.getTextDecoration());
- return ch;
+ char ch = node.getCharacter();
+ if (CharUtilities.isAnySpace(ch)) {
+ text.addSpace(ch, 0, CharUtilities.isAdjustableSpace(ch));
+ } else {
+ text.addWord(String.valueOf(ch), 0);
+ }
+ TraitSetter.setProducerID(text, node.getId());
+ TraitSetter.addTextDecoration(text, fobj.getTextDecoration());
+ return text;
}
/** @see org.apache.fop.layoutmgr.LayoutManager#getNextKnuthElements(LayoutContext, int) */
diff --git a/src/java/org/apache/fop/util/CharUtilities.java b/src/java/org/apache/fop/util/CharUtilities.java
index f200c3e2f..985c25df7 100644
--- a/src/java/org/apache/fop/util/CharUtilities.java
+++ b/src/java/org/apache/fop/util/CharUtilities.java
@@ -61,6 +61,8 @@ public class CharUtilities {
public static final char ZERO_WIDTH_SPACE = '\u200B';
/** zero-width no-break space (= byte order mark) */
public static final char ZERO_WIDTH_NOBREAK_SPACE = '\uFEFF';
+ /** soft hyphen */
+ public static final char SOFT_HYPHEN = '\u00AD';
/**
@@ -142,7 +144,7 @@ public class CharUtilities {
//TODO: are there other kinds of adjustable spaces?
return
(c == '\u0020' // normal space
- /*|| c == ''*/);
+ || c == NBSPACE); // no-break space
}
/**
diff --git a/test/layoutengine/disabled-testcases.xml b/test/layoutengine/disabled-testcases.xml
index cd9b71f86..366550224 100644
--- a/test/layoutengine/disabled-testcases.xml
+++ b/test/layoutengine/disabled-testcases.xml
@@ -57,11 +57,10 @@
stacking constraints which it shouldn't.</description>
</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
- word 'each'. Trailing spaces not removed in layout. Note: the test passes
- in case of text-align="justify".</description>
+ <name>block white-space nbsp 2</name>
+ <file>block_white-space_nbsp_2.xml</file>
+ <description>The nbsp given as an fo:character is not adjustable and therefore
+ the justification does not work in this case.</description>
</testcase>
<testcase>
<name>block word-spacing</name>
diff --git a/test/layoutengine/standard-testcases/block_white-space-collapse_1.xml b/test/layoutengine/standard-testcases/block_white-space-collapse_1.xml
index f0383be8c..b12666096 100644
--- a/test/layoutengine/standard-testcases/block_white-space-collapse_1.xml
+++ b/test/layoutengine/standard-testcases/block_white-space-collapse_1.xml
@@ -103,8 +103,7 @@
<eval expected="6" xpath="count(//flow/block[1]/lineArea[1]/text[1]/space)"/>
<eval expected="2" xpath="count(//flow/block[1]/lineArea[1]/text[2]/word)"/>
<eval expected="1" xpath="count(//flow/block[1]/lineArea[1]/text[2]/space)"/>
- <eval expected="1" xpath="count(//flow/block[1]/lineArea[1]/text[3]/word)"/>
- <eval expected=" " xpath="//flow/block[1]/lineArea[1]/text[3]/word"/>
+ <eval expected="1" xpath="count(//flow/block[1]/lineArea[1]/text[3]/space)"/>
<eval expected="1" xpath="count(//flow/block[1]/lineArea[1]/text[4]/word)"/>
<eval expected="3" xpath="count(//flow/block[2]/block[1]/lineArea[1]/text/word)"/>
diff --git a/test/layoutengine/standard-testcases/block_white-space_4.xml b/test/layoutengine/standard-testcases/block_white-space_4.xml
index 29f724490..c19c6f529 100644
--- a/test/layoutengine/standard-testcases/block_white-space_4.xml
+++ b/test/layoutengine/standard-testcases/block_white-space_4.xml
@@ -88,7 +88,7 @@
<box w="6672"/>
- <skip>11</skip>
+ <skip>12</skip>
</element-list>
<eval expected="62040" xpath="//block[@prod-id='l-sp']/lineArea/text/@ipd"/>
<eval expected="word" xpath="local-name(//block[@prod-id='l-sp']/lineArea/text/*[1])"/>
@@ -125,7 +125,7 @@
<box w="6672"/>
- <skip>15</skip>
+ <skip>16</skip>
</element-list>
<eval expected="60168" xpath="//block[@prod-id='l-thin-space']/lineArea/text/@ipd"/>
<eval expected="word" xpath="local-name(//block[@prod-id='l-thin-space']/lineArea/text/*[1])"/>
@@ -162,7 +162,7 @@
<box w="6672"/>
- <skip>15</skip>
+ <skip>16</skip>
</element-list>
<eval expected="57768" xpath="//block[@prod-id='l-hair-space']/lineArea/text/@ipd"/>
<true xpath="//block[@prod-id='l-hair-space']/lineArea/text/*[2]/@adj = 'false'"/>
@@ -192,7 +192,7 @@
<box w="6672"/>
- <skip>19</skip>
+ <skip>20</skip>
</element-list>
<eval expected="55368" xpath="//block[@prod-id='l-zwsp']/lineArea/text/@ipd"/>
<true xpath="//block[@prod-id='l-zwsp']/lineArea/text/*[2]/@adj = 'false'"/>
@@ -207,7 +207,7 @@
<box w="26016"/>
- <skip>11</skip>
+ <skip>12</skip>
</element-list>
<eval expected="55368" xpath="//block[@prod-id='l-nosp']/lineArea/text/@ipd"/>
@@ -246,7 +246,7 @@
<box w="6672"/>
- <skip>23</skip>
+ <skip>24</skip>
</element-list>
<eval expected="60168" xpath="//block[@prod-id='c-thin-space']/lineArea/text/@ipd"/>
<eval expected="word" xpath="local-name(//block[@prod-id='c-thin-space']/lineArea/text/*[1])"/>
@@ -277,7 +277,7 @@
<box w="6672"/>
- <skip>5</skip>
+ <skip>6</skip>
</element-list>
<eval expected="190804" xpath="//block[@prod-id='j-sp']/lineArea/text/@ipd"/>
<eval expected="42921" xpath="//block[@prod-id='j-sp']/lineArea/text/@twsadjust"/>
@@ -300,7 +300,7 @@
<box w="6672"/>
- <skip>7</skip>
+ <skip>8</skip>
</element-list>
<eval expected="104277" xpath="//block[@prod-id='j-thin-space']/lineArea/text/@ipd"/>
<eval expected="44109" xpath="//block[@prod-id='j-thin-space']/lineArea/text/@twsadjust"/>
@@ -325,7 +325,7 @@
<box w="6672"/>
- <skip>9</skip>
+ <skip>10</skip>
</element-list>
<eval expected="84280" xpath="//block[@prod-id='j-zwsp']/lineArea/text/@ipd"/>
<eval expected="28912" xpath="//block[@prod-id='j-zwsp']/lineArea/text/@twsadjust"/>
@@ -350,7 +350,7 @@
<box w="6672"/>
- <skip>5</skip>
+ <skip>6</skip>
</element-list>
<eval expected="182404" xpath="//block[@prod-id='lsj-sp']/lineArea/text/@ipd"/>
<eval expected="32121" xpath="//block[@prod-id='lsj-sp']/lineArea/text/@twsadjust"/>
@@ -374,7 +374,7 @@
<box w="6672"/>
- <skip>7</skip>
+ <skip>8</skip>
</element-list>
<eval expected="104777" xpath="//block[@prod-id='lsj-thin-space']/lineArea/text/@ipd"/>
<eval expected="28609" xpath="//block[@prod-id='lsj-thin-space']/lineArea/text/@twsadjust"/>
@@ -400,7 +400,7 @@
<box w="6672"/>
- <skip>9</skip>
+ <skip>10</skip>
</element-list>
<eval expected="85480" xpath="//block[@prod-id='lsj-zwsp']/lineArea/text/@ipd"/>
<eval expected="14112" xpath="//block[@prod-id='lsj-zwsp']/lineArea/text/@twsadjust"/>
diff --git a/test/layoutengine/standard-testcases/block_white-space_nbsp_1.xml b/test/layoutengine/standard-testcases/block_white-space_nbsp_1.xml
new file mode 100644
index 000000000..9ef8ba78e
--- /dev/null
+++ b/test/layoutengine/standard-testcases/block_white-space_nbsp_1.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2005-2006 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 (nbsp).
+ </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" id="single">&#160;single&#160;nbsp&#160;around&#160;</fo:block>
+ <fo:block background-color="red" id="only">&#160;</fo:block>
+ <fo:block background-color="silver" id="double">&#160;&#160;after&#160;&#160;empty&#160;&#160;line&#160;&#160;</fo:block>
+ <fo:block background-color="silver" id="single-justify" text-align="justify" text-align-last="justify" space-before="5pt">&#160;single&#160;nbsp&#160;around&#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="11100" xpath="//flow/block[2]/lineArea/@bpd"/>
+ <eval expected="1" 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="11100" xpath="//flow/block[4]/lineArea/@bpd"/>
+ <eval expected="3" xpath="count(//flow/block[4]/lineArea/text/space)"/> <!-- trailing nbsp is removed by LineLM -->
+
+ <!-- nbsp must be adjustable -->
+ <true xpath="not(//flow/block[4]/lineArea/text/space[1]/@adj = 'false')"/>
+
+ <element-list category="line" id="single">
+ <box w="3336"/>
+ <box/>
+ <box w="3336"/>
+ <box/>
+ <box w="3336"/>
+ <box/>
+ <box w="3336"/>
+ <skip>3</skip>
+ </element-list>
+
+ <element-list category="line" id="only">
+ <box w="3336"/>
+ <skip>3</skip>
+ </element-list>
+
+ <element-list category="line" id="double">
+ <box w="3336"/>
+ <box w="3336"/>
+ <box/>
+ <box w="3336"/>
+ <box w="3336"/>
+ <box/>
+ <box w="3336"/>
+ <box w="3336"/>
+ <box/>
+ <box w="3336"/>
+ <box w="3336"/>
+ <skip>3</skip>
+ </element-list>
+
+ <element-list category="line" id="single-justify">
+ <box w="0"/>
+ <penalty p="INF"/>
+ <glue w="3336" y="1668" z="1112"/>
+ <box/>
+ <box w="0"/>
+ <penalty p="INF"/>
+ <glue w="3336" y="1668" z="1112"/>
+ <box/>
+ <box w="0"/>
+ <penalty p="INF"/>
+ <glue w="3336" y="1668" z="1112"/>
+ <box/>
+ <box w="0"/>
+ <penalty p="INF"/>
+ <glue w="3336" y="1668" z="1112"/>
+ <skip>3</skip>
+ </element-list>
+
+ </checks>
+</testcase>
diff --git a/test/layoutengine/standard-testcases/block_white-space_2.xml b/test/layoutengine/standard-testcases/block_white-space_nbsp_2.xml
index bf6c570c0..ac8d1d76c 100644
--- a/test/layoutengine/standard-testcases/block_white-space_2.xml
+++ b/test/layoutengine/standard-testcases/block_white-space_nbsp_2.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright 2005 The Apache Software Foundation
+ Copyright 2006 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.
@@ -18,7 +18,8 @@
<testcase>
<info>
<p>
- This test checks non breaking white space.
+ This test checks non breaking white space (nbsp) specified as fo:character.
+ This is to check if a nbsb as fo:character is processed the same way as a normal nbsb.
</p>
</info>
<fo>
@@ -30,9 +31,10 @@
</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:block background-color="silver">&#160;single<fo:character character="&#160;"/>nbsp&#160;around&#160;</fo:block>
+
+ <fo:block background-color="silver" text-align="justify" text-align-last="justify" space-before="5pt">&#160;single&#160;nbsp&#160;around&#160;</fo:block>
+ <fo:block background-color="silver" text-align="justify" text-align-last="justify">&#160;single<fo:character character="&#160;"/>nbsp&#160;around&#160;</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
@@ -40,9 +42,11 @@
<checks>
<eval expected="11100" xpath="//flow/block[1]/lineArea/@bpd"/>
<eval expected="4" 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)"/>
+ <!-- //flow/block[2] is only for reference -->
<eval expected="11100" xpath="//flow/block[3]/lineArea/@bpd"/>
- <eval expected="8" xpath="count(//flow/block[3]/lineArea/text/space)"/>
+ <eval expected="3" xpath="count(//flow/block[3]/lineArea/text/space)"/> <!-- last nbsp is removed by LineLM -->
+
+ <!-- twsadjust must be the same for block 2 and 3 as they are supposed to be equivalent -->
+ <true xpath="//flow/block[2]/lineArea/text[1]/@twsadjust = //flow/block[3]/lineArea/text[1]/@twsadjust"/>
</checks>
</testcase>