From 1488e788972f0ee1b9fbd91de166fe5323eae454 Mon Sep 17 00:00:00 2001 From: Chris Bowditch Date: Fri, 29 Mar 2019 10:24:14 +0000 Subject: [PATCH] =?utf8?q?fix=20FOP-2514.=20Patch=20submitted=20by=20Bj?= =?utf8?q?=C3=B6rn=20Kautler?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1856528 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/fop/fo/FOPropertyMapping.java | 3 +- .../fop/fo/properties/CommonHyphenation.java | 17 +-- .../properties/OptionalCharacterProperty.java | 116 ++++++++++++++++++ .../layoutmgr/inline/TextLayoutManager.java | 5 +- 4 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 fop-core/src/main/java/org/apache/fop/fo/properties/OptionalCharacterProperty.java diff --git a/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java b/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java index 0b8da47cc..c96e34b32 100644 --- a/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java +++ b/fop-core/src/main/java/org/apache/fop/fo/FOPropertyMapping.java @@ -53,6 +53,7 @@ import org.apache.fop.fo.properties.LengthRangeProperty; import org.apache.fop.fo.properties.LineHeightPropertyMaker; import org.apache.fop.fo.properties.ListProperty; import org.apache.fop.fo.properties.NumberProperty; +import org.apache.fop.fo.properties.OptionalCharacterProperty; import org.apache.fop.fo.properties.PageBreakShorthandParser; import org.apache.fop.fo.properties.PageDimensionMaker; import org.apache.fop.fo.properties.PositionShorthandParser; @@ -1105,7 +1106,7 @@ public final class FOPropertyMapping implements Constants { addPropertyMaker("hyphenate", m); // hyphenation-character - m = new CharacterProperty.Maker(PR_HYPHENATION_CHARACTER); + m = new OptionalCharacterProperty.Maker(PR_HYPHENATION_CHARACTER); m.setInherited(true); m.setDefault("-"); addPropertyMaker("hyphenation-character", m); diff --git a/fop-core/src/main/java/org/apache/fop/fo/properties/CommonHyphenation.java b/fop-core/src/main/java/org/apache/fop/fo/properties/CommonHyphenation.java index 4c87030b9..256c6dd7a 100644 --- a/fop-core/src/main/java/org/apache/fop/fo/properties/CommonHyphenation.java +++ b/fop-core/src/main/java/org/apache/fop/fo/properties/CommonHyphenation.java @@ -58,7 +58,7 @@ public final class CommonHyphenation { public final EnumProperty hyphenate; /** The "hyphenation-character" property */ - public final CharacterProperty hyphenationCharacter; + public final OptionalCharacterProperty hyphenationCharacter; /** The "hyphenation-push-character-count" property */ public final NumberProperty hyphenationPushCharacterCount; @@ -74,7 +74,7 @@ public final class CommonHyphenation { StringProperty country, StringProperty script, EnumProperty hyphenate, - CharacterProperty hyphenationCharacter, + OptionalCharacterProperty hyphenationCharacter, NumberProperty hyphenationPushCharacterCount, NumberProperty hyphenationRemainCharacterCount) { this.language = language; @@ -104,8 +104,8 @@ public final class CommonHyphenation { = (StringProperty) propertyList.get(Constants.PR_SCRIPT); EnumProperty hyphenate = (EnumProperty) propertyList.get(Constants.PR_HYPHENATE); - CharacterProperty hyphenationCharacter - = (CharacterProperty) propertyList.get(Constants.PR_HYPHENATION_CHARACTER); + OptionalCharacterProperty hyphenationCharacter + = (OptionalCharacterProperty) propertyList.get(Constants.PR_HYPHENATION_CHARACTER); NumberProperty hyphenationPushCharacterCount = (NumberProperty) propertyList.get(Constants.PR_HYPHENATION_PUSH_CHARACTER_COUNT); NumberProperty hyphenationRemainCharacterCount @@ -132,7 +132,10 @@ public final class CommonHyphenation { * @param font the font * @return the effective hyphenation character. */ - public char getHyphChar(org.apache.fop.fonts.Font font) { + public Character getHyphChar(org.apache.fop.fonts.Font font) { + if (hyphenationCharacter.getObject() == null) { + return null; + } char hyphChar = hyphenationCharacter.getCharacter(); if (font.hasChar(hyphChar)) { return hyphChar; //short-cut @@ -183,8 +186,8 @@ public final class CommonHyphenation { * @return the IPD in millipoints for the hyphenation character. */ public int getHyphIPD(org.apache.fop.fonts.Font font) { - char hyphChar = getHyphChar(font); - return font.getCharWidth(hyphChar); + Character hyphChar = getHyphChar(font); + return (hyphChar == null) ? 0 : font.getCharWidth(hyphChar); } /** diff --git a/fop-core/src/main/java/org/apache/fop/fo/properties/OptionalCharacterProperty.java b/fop-core/src/main/java/org/apache/fop/fo/properties/OptionalCharacterProperty.java new file mode 100644 index 000000000..73c1f8626 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/fo/properties/OptionalCharacterProperty.java @@ -0,0 +1,116 @@ +/* + * 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$ */ + +package org.apache.fop.fo.properties; + +import org.apache.fop.fo.FObj; +import org.apache.fop.fo.PropertyList; + +/** + * Superclass for properties that wrap an optional character value + * TODO convert character value to int in order to denote unicode scalar value + * instead of a single UTF-16 code element + */ +public final class OptionalCharacterProperty extends Property { + + /** + * Inner class for creating instances of OptionalCharacterProperty + */ + public static class Maker extends PropertyMaker { + + /** + * @param propId the id of the property for which a Maker should be created + */ + public Maker(int propId) { + super(propId); + } + + /** {@inheritDoc} */ + public Property make(PropertyList propertyList, String value, + FObj fo) { + if (value.isEmpty()) { + return OptionalCharacterProperty.getInstance(null); + } else { + char c = value.charAt(0); + return OptionalCharacterProperty.getInstance(c); + } + } + + } + + /** cache containing all canonical OptionalCharacterProperty instances */ + private static final PropertyCache CACHE + = new PropertyCache(); + + private final Character character; + + /** + * @param character character value to be wrapped in this property + */ + private OptionalCharacterProperty(Character character) { + this.character = character; + } + + /** + * Get character property instance for character. + * @param character the character + * @return the character property instance + */ + public static OptionalCharacterProperty getInstance(Character character) { + return CACHE.fetch(new OptionalCharacterProperty(character)); + } + + /** + * @return this.character cast as an Object + */ + public Object getObject() { + return character; + } + + /** + * @return this.character + */ + public char getCharacter() { + return character == null ? 0 : this.character; + } + + /** + * @return this.character cast as a String + */ + public String getString() { + return character == null ? "" : character.toString(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof OptionalCharacterProperty) { + OptionalCharacterProperty ocp = (OptionalCharacterProperty) obj; + return character == ocp.character + || character != null + && character.equals(ocp.character); + } else { + return false; + } + } + + @Override + public int hashCode() { + return character == null ? 0 : character.hashCode(); + } +} diff --git a/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java b/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java index 3134ebb17..8611cbda5 100644 --- a/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java +++ b/fop-core/src/main/java/org/apache/fop/layoutmgr/inline/TextLayoutManager.java @@ -550,7 +550,10 @@ public class TextLayoutManager extends LeafNodeLayoutManager { } private void addHyphenationChar() { - wordChars.append(foText.getCommonHyphenation().getHyphChar(font)); + Character hyphChar = foText.getCommonHyphenation().getHyphChar(font); + if (hyphChar != null) { + wordChars.append(hyphChar); + } // [TBD] expand bidi word levels, letter space adjusts, gpos adjusts // [TBD] [GA] problematic in bidi context... what is level of hyphen? textArea.setHyphenated(); -- 2.39.5