diff options
author | Simon Pepping <spepping@apache.org> | 2010-12-04 08:30:47 +0000 |
---|---|---|
committer | Simon Pepping <spepping@apache.org> | 2010-12-04 08:30:47 +0000 |
commit | 24e2fad7e1416bd1878e3474f710af2c15edd8fb (patch) | |
tree | da4b1e4d68f78d005eae4563e7e6877be6bf21e4 | |
parent | 5afd2a7a4e0dc5dc04ecd3958c6eb55ebfbcf2e2 (diff) | |
download | xmlgraphics-fop-24e2fad7e1416bd1878e3474f710af2c15edd8fb.tar.gz xmlgraphics-fop-24e2fad7e1416bd1878e3474f710af2c15edd8fb.zip |
Allow for words consisting of only soft hyphens; fixes bug 49837
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1042115 13f79535-47bb-0310-9956-ffa450edef68
3 files changed, 116 insertions, 11 deletions
diff --git a/src/java/org/apache/fop/fo/FOTreeBuilder.java b/src/java/org/apache/fop/fo/FOTreeBuilder.java index c848eb4f1..451481eb8 100644 --- a/src/java/org/apache/fop/fo/FOTreeBuilder.java +++ b/src/java/org/apache/fop/fo/FOTreeBuilder.java @@ -398,7 +398,9 @@ public class FOTreeBuilder extends DefaultHandler { FOValidationEventProducer eventProducer = FOValidationEventProducer.Provider.get( userAgent.getEventBroadcaster()); - eventProducer.unknownFormattingObject(this, currentFObj.getName(), + String name = (currentFObj != null ? currentFObj.getName() + : "{" + namespaceURI + "}" + localName); + eventProducer.unknownFormattingObject(this, name, new QName(namespaceURI, localName), getEffectiveLocator()); } diff --git a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java index 05cf979de..498fd1265 100644 --- a/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java @@ -770,11 +770,8 @@ public class TextLayoutManager extends LeafNodeLayoutManager { while (lastIndex > 0 && foText.charAt(lastIndex - 1) == CharUtilities.SOFT_HYPHEN) { lastIndex--; } - final boolean endsWithHyphen = checkEndsWithHyphen - && foText.charAt(lastIndex) == CharUtilities.SOFT_HYPHEN; Font font = FontSelector .selectFontForCharactersInText(foText, thisStart, lastIndex, foText, this); - int wordLength = lastIndex - thisStart; boolean kerning = font.hasKerning(); MinOptMax wordIPD = MinOptMax.ZERO; for (int i = thisStart; i < lastIndex; i++) { @@ -801,23 +798,31 @@ public class TextLayoutManager extends LeafNodeLayoutManager { } } } + boolean endsWithHyphen = checkEndsWithHyphen + && foText.charAt(lastIndex) == CharUtilities.SOFT_HYPHEN; if (kerning && breakOpportunity && !TextLayoutManager.isSpace(ch) && lastIndex > 0 && endsWithHyphen) { - final int kern = font.getKernValue(foText.charAt(lastIndex - 1), ch); + int kern = font.getKernValue(foText.charAt(lastIndex - 1), ch); if (kern != 0) { addToLetterAdjust(lastIndex, kern); //TODO: add kern to wordIPD? } } - int letterSpaces = wordLength - 1; - // if there is a break opportunity and the next one - // is not a space, it could be used as a line end; - // add one more letter space, in case other text follows - if (breakOpportunity && !TextLayoutManager.isSpace(ch)) { - letterSpaces++; + // shy+chars at start of word: wordLength == 0 && breakOpportunity + // shy only characters in word: wordLength == 0 && !breakOpportunity + int wordLength = lastIndex - thisStart; + int letterSpaces = 0; + if (wordLength != 0) { + letterSpaces = wordLength - 1; + // if there is a break opportunity and the next one + // is not a space, it could be used as a line end; + // add one more letter space, in case other text follows + if (breakOpportunity && !TextLayoutManager.isSpace(ch)) { + letterSpaces++; + } } assert letterSpaces >= 0; wordIPD = wordIPD.plus(letterSpaceIPD.mult(letterSpaces)); diff --git a/test/layoutengine/standard-testcases/word_lonely_shy.xml b/test/layoutengine/standard-testcases/word_lonely_shy.xml new file mode 100644 index 000000000..557ceea90 --- /dev/null +++ b/test/layoutengine/standard-testcases/word_lonely_shy.xml @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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 that a word consisting of one or more Soft Hyphens is rendered as an empty word. + </p> + </info> + <fo> +<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + +<fo:layout-master-set> + <fo:simple-page-master page-width="297mm" page-height="210mm" master-name="a4"><fo:region-body/></fo:simple-page-master> +</fo:layout-master-set> + + <fo:page-sequence initial-page-number="auto" master-reference="a4"> + <fo:flow flow-name="xsl-region-body"> + <fo:block>Name: hy (hyphen), Unicode: U+002D (45)</fo:block> + <fo:block>-</fo:block> + <fo:block>Name: shy (soft hyphen = discretionary hyphen), Unicode: U+00AD (173)</fo:block> + <fo:block> a b c d </fo:block> + </fo:flow> +</fo:page-sequence> + +</fo:root> + </fo> + <checks> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[1]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[2]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[3]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[4]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[5]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[6]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[7]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[8]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[9]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[10]"/> + <eval expected="a" xpath="//flow/block[4]/lineArea/text/*[11]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[12]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[13]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[14]"/> + <eval expected="b" xpath="//flow/block[4]/lineArea/text/*[15]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[16]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[17]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[18]"/> + <eval expected="c" xpath="//flow/block[4]/lineArea/text/*[19]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[20]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[21]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[22]"/> + <eval expected="d" xpath="//flow/block[4]/lineArea/text/*[23]"/> + <eval expected=" " xpath="//flow/block[4]/lineArea/text/*[24]"/> + <eval expected="" xpath="//flow/block[4]/lineArea/text/*[25]"/> +<!-- + <word offset="0"/> + <space offset="0"> </space> + <word offset="0"/> + <space offset="0"> </space> + <word offset="0"/> + <space offset="0"> </space> + <word offset="0"/> + <space offset="0"> </space> + <word offset="0"/> + <space offset="0"> </space> + <word offset="0">a</word> + <space offset="0"> </space> + <word offset="0"/> + <space offset="0"> </space> + <word offset="0">b</word> + <space offset="0"> </space> + <word offset="0"/> + <space offset="0"> </space> + <word offset="0">c</word> + <space offset="0"> </space> + <word offset="0"/> + <space offset="0"> </space> + <word offset="0">d</word> + <space offset="0"> </space> + <word offset="0"/> +--> + </checks> +</testcase> + |