diff options
author | Simon Pepping <spepping@apache.org> | 2010-10-06 07:07:38 +0000 |
---|---|---|
committer | Simon Pepping <spepping@apache.org> | 2010-10-06 07:07:38 +0000 |
commit | 04701709af5735bf1ecf236efef93999c2ffe834 (patch) | |
tree | 2c47b28176dc80445e0153382de454fe90d6b510 | |
parent | a6e8eea8153df672e94a9e4e7d2398b45a29b0bc (diff) | |
download | xmlgraphics-fop-04701709af5735bf1ecf236efef93999c2ffe834.tar.gz xmlgraphics-fop-04701709af5735bf1ecf236efef93999c2ffe834.zip |
Making fallback from (lang,country) to (lang) consistent
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1004907 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/java/org/apache/fop/hyphenation/Hyphenator.java | 91 | ||||
-rw-r--r-- | test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml | 137 |
2 files changed, 198 insertions, 30 deletions
diff --git a/src/java/org/apache/fop/hyphenation/Hyphenator.java b/src/java/org/apache/fop/hyphenation/Hyphenator.java index a556fd7fe..7f37b5e28 100644 --- a/src/java/org/apache/fop/hyphenation/Hyphenator.java +++ b/src/java/org/apache/fop/hyphenation/Hyphenator.java @@ -76,8 +76,9 @@ public final class Hyphenator { } /** - * Returns a hyphenation tree for a given language and country. The hyphenation trees are - * cached. + * Returns a hyphenation tree for a given language and country, + * with fallback from (lang,country) to (lang). + * The hyphenation trees are cached. * @param lang the language * @param country the country (may be null or "none") * @param resolver resolver to find the hyphenation files @@ -89,11 +90,62 @@ public final class Hyphenator { String llccKey = HyphenationTreeCache.constructLlccKey(lang, country); HyphenationTreeCache cache = getHyphenationTreeCache(); - // See if there was an error finding this hyphenation tree before + // If this hyphenation tree has been registered as missing, return immediately if (cache.isMissing(llccKey)) { return null; } + HyphenationTree hTree = getHyphenationTree2(lang, country, resolver, hyphPatNames); + + // fallback to lang only + if (hTree == null && country != null && !country.equals("none")) { + String llKey = HyphenationTreeCache.constructLlccKey(lang, null); + if (!cache.isMissing(llKey)) { + hTree = getHyphenationTree2(lang, null, resolver, hyphPatNames); + if (hTree != null && log.isDebugEnabled()) { + log.debug("Couldn't find hyphenation pattern " + + "for lang=\"" + lang + "\",country=\"" + country + "\"." + + " Using general language pattern " + + "for lang=\"" + lang + "\" instead."); + } + if (hTree == null) { + // no fallback; register as missing + cache.noteMissing(llKey); + } else { + // also register for (lang,country) + cache.cache(llccKey, hTree); + } + } + } + + if (hTree == null) { + // (lang,country) and (lang) tried; register as missing + cache.noteMissing(llccKey); + log.error("Couldn't find hyphenation pattern " + + "for lang=\"" + lang + "\"" + + (country != null && !country.equals("none") + ? ",country=\"" + country + "\"" + : "") + + "."); + } + + return hTree; + } + + /** + * Returns a hyphenation tree for a given language and country + * The hyphenation trees are cached. + * @param lang the language + * @param country the country (may be null or "none") + * @param resolver resolver to find the hyphenation files + * @param hyphPatNames the map with user-configured hyphenation pattern file names + * @return the hyphenation tree + */ + private static HyphenationTree getHyphenationTree2(String lang, + String country, HyphenationTreeResolver resolver, Map hyphPatNames) { + String llccKey = HyphenationTreeCache.constructLlccKey(lang, country); + HyphenationTreeCache cache = getHyphenationTreeCache(); + HyphenationTree hTree; // first try to find it in the cache hTree = getHyphenationTreeCache().getHyphenationTree(lang, country); @@ -105,6 +157,7 @@ public final class Hyphenator { if (key == null) { key = llccKey; } + if (resolver != null) { hTree = getUserHyphenationTree(key, resolver); } @@ -115,10 +168,8 @@ public final class Hyphenator { // put it into the pattern cache if (hTree != null) { cache.cache(llccKey, hTree); - } else { - log.error("Couldn't find hyphenation pattern " + llccKey); - cache.noteMissing(llccKey); } + return hTree; } @@ -173,31 +224,11 @@ public final class Hyphenator { try { is = getResourceStream(key); if (is == null) { - if (key.length() == 5) { - String lang = key.substring(0, 2); - is = getResourceStream(lang); - if (is != null) { - if (log.isDebugEnabled()) { - log.debug("Couldn't find hyphenation pattern '" - + key - + "'. Using general language pattern '" - + lang - + "' instead."); - } - } else { - if (log.isDebugEnabled()) { - log.debug("Couldn't find precompiled hyphenation pattern " - + lang + " in resources."); - } - return null; - } - } else { - if (log.isDebugEnabled()) { - log.debug("Couldn't find precompiled hyphenation pattern " - + key + " in resources"); - } - return null; + if (log.isDebugEnabled()) { + log.debug("Couldn't find precompiled hyphenation pattern " + + key + " in resources"); } + return null; } hTree = readHyphenationTree(is); } finally { diff --git a/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml b/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml new file mode 100644 index 000000000..3af71a3ea --- /dev/null +++ b/test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml @@ -0,0 +1,137 @@ +<?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> + Checks fallback from hyphenation pattern for (lang,country) to hyphenation pattern for (lang) + </p> + </info> + <fo> +<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> + + <fo:layout-master-set> + <fo:simple-page-master master-name="simple" + page-height="29.7cm" + page-width="21cm" + margin-top="1cm" + margin-bottom="2cm" + margin-left="7cm" + margin-right="3cm"> + <fo:region-body margin-top="1.5cm"/> + </fo:simple-page-master> + </fo:layout-master-set> + <!-- end: defines page layout --> + + + <fo:page-sequence master-reference="simple"> + + <fo:flow flow-name="xsl-region-body" + text-align="justify"> + + <fo:block font-size="12pt" + font-family="sans-serif" + background-color="blue" + color="white" + text-align="start"> + language="en",country="IN" + </fo:block> + <fo:block font-size="12pt" + font-family="sans-serif" + space-after="3pt" + language="en" + country="IN" + hyphenate="true" + hyphenation-ladder-count="no-limit" + > + This document has been reviewed by W3C Members and other interested parties and has been endorsed by the Director as a + W3C Recommendation. It is a stable document and may be used as reference material or cited as a normative reference from + another document. W3C's role in making the Recommendation is to draw attention to the specification and to promote its + widespread deployment. This enhances the functionality and interoperability of the Web. + </fo:block> + + <fo:block font-size="12pt" + font-family="sans-serif" + background-color="blue" + color="white" + text-align="start"> + language="em" + </fo:block> + <fo:block font-size="12pt" + font-family="sans-serif" + space-after="3pt" + language="em" + hyphenate="true" + hyphenation-ladder-count="no-limit" + > + This document has been reviewed by W3C Members and other interested parties and has been endorsed by the Director as a + W3C Recommendation. It is a stable document and may be used as reference material or cited as a normative reference from + another document. W3C's role in making the Recommendation is to draw attention to the specification and to promote its + widespread deployment. This enhances the functionality and interoperability of the Web. + </fo:block> + + <fo:block font-size="12pt" + font-family="sans-serif" + background-color="blue" + color="white" + text-align="start"> + language="em",country="IN" + </fo:block> + <fo:block font-size="12pt" + font-family="sans-serif" + space-after="3pt" + language="em" + country="IN" + hyphenate="true" + hyphenation-ladder-count="no-limit" + > + This document has been reviewed by W3C Members and other interested parties and has been endorsed by the Director as a + W3C Recommendation. It is a stable document and may be used as reference material or cited as a normative reference from + another document. W3C's role in making the Recommendation is to draw attention to the specification and to promote its + widespread deployment. This enhances the functionality and interoperability of the Web. + </fo:block> + + </fo:flow> + </fo:page-sequence> +</fo:root> + + </fo> + + <checks> + <eval expected="8" xpath="count(//pageViewport[1]//flow/block[2]/lineArea)"/> + <eval expected="Di-" xpath="//pageViewport[1]//flow/block[2]/lineArea[2]/text/word[10]"/> + <eval expected="norma-" xpath="//pageViewport[1]//flow/block[2]/lineArea[4]/text/word[12]"/> + <eval expected="mak-" xpath="//pageViewport[1]//flow/block[2]/lineArea[5]/text/word[9]"/> + <eval expected="specifi-" xpath="//pageViewport[1]//flow/block[2]/lineArea[6]/text/word[10]"/> + <eval expected="en-" xpath="//pageViewport[1]//flow/block[2]/lineArea[7]/text/word[9]"/> + + <eval expected="9" xpath="count(//pageViewport[1]//flow/block[4]/lineArea)"/> + <eval expected="by" xpath="//pageViewport[1]//flow/block[4]/lineArea[2]/text/word[9]"/> + <eval expected="cited" xpath="//pageViewport[1]//flow/block[4]/lineArea[4]/text/word[10]"/> + <eval expected="document." xpath="//pageViewport[1]//flow/block[4]/lineArea[5]/text/word[7]"/> + <eval expected="to" xpath="//pageViewport[1]//flow/block[4]/lineArea[6]/text/word[10]"/> + <eval expected="deployment." xpath="//pageViewport[1]//flow/block[4]/lineArea[7]/text/word[8]"/> + + <eval expected="9" xpath="count(//pageViewport[1]//flow/block[6]/lineArea)"/> + <eval expected="by" xpath="//pageViewport[1]//flow/block[6]/lineArea[2]/text/word[9]"/> + <eval expected="cited" xpath="//pageViewport[1]//flow/block[6]/lineArea[4]/text/word[10]"/> + <eval expected="document." xpath="//pageViewport[1]//flow/block[6]/lineArea[5]/text/word[7]"/> + <eval expected="to" xpath="//pageViewport[1]//flow/block[6]/lineArea[6]/text/word[10]"/> + <eval expected="deployment." xpath="//pageViewport[1]//flow/block[6]/lineArea[7]/text/word[8]"/> + </checks> +</testcase> |