Browse Source

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
tags/fop-1_1rc1old
Simon Pepping 13 years ago
parent
commit
04701709af

+ 61
- 30
src/java/org/apache/fop/hyphenation/Hyphenator.java View File

@@ -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 {

+ 137
- 0
test/layoutengine/hyphenation-testcases/hyphenation-pattern_fallback.xml View File

@@ -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>

Loading…
Cancel
Save