123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- /* $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
- package org.apache.fop.layout.hyphenation;
-
- import java.io.*;
- import java.util.Hashtable;
- import org.apache.fop.configuration.*;
- import org.apache.fop.messaging.MessageHandler;
-
- /**
- * This class is the main entry point to the hyphenation package.
- * You can use only the static methods or create an instance.
- *
- * @author Carlos Villegas <cav@uniscope.co.jp>
- */
- public class Hyphenator {
- static Hashtable hyphenTrees = new Hashtable();
-
- private HyphenationTree hyphenTree = null;
- private int remainCharCount = 2;
- private int pushCharCount = 2;
- private static boolean errorDump = false;
-
- public Hyphenator(String lang, String country, int leftMin,
- int rightMin) {
- hyphenTree = getHyphenationTree(lang, country);
- remainCharCount = leftMin;
- pushCharCount = rightMin;
- }
-
- public static HyphenationTree getHyphenationTree(String lang,
- String country) {
- String key = lang;
- //check whether the country code has been used
- if (country != null && !country.equals("none"))
- key += "_" + country;
- // first try to find it in the cache
- if (hyphenTrees.containsKey(key))
- return (HyphenationTree) hyphenTrees.get(key);
- if (hyphenTrees.containsKey(lang))
- return (HyphenationTree) hyphenTrees.get(lang);
-
- HyphenationTree hTree = getFopHyphenationTree(key);
- if (hTree == null) {
- String hyphenDir = Configuration.getStringValue("hyphenation-dir");
- if (hyphenDir != null){
- hTree = getUserHyphenationTree(key,hyphenDir);
- }
- }
- //put it into the pattern cache
- if (hTree != null) {
- hyphenTrees.put(key, hTree);
- } else {
- MessageHandler.errorln("Couldn't find hyphenation pattern " + key);
- }
- return hTree;
- }
-
- public static HyphenationTree getFopHyphenationTree (String key) {
- HyphenationTree hTree = null;
- ObjectInputStream ois = null;
- InputStream is = null;
- try {
- is = Hyphenator.class.getResourceAsStream("/hyph/" + key + ".hyp");
- if (is == null) {
- if (key.length() == 5) {
- is = Hyphenator.class.getResourceAsStream("/hyph/" +
- key.substring(0,2) + ".hyp");
- if (is != null) {
- MessageHandler.errorln(
- "Couldn't find hyphenation pattern " + key
- + "\nusing general language pattern " +
- key.substring(0,2) + " instead.");
- } else {
- if (errorDump){
- MessageHandler.errorln("Couldn't find precompiled "
- + "fop hyphenation pattern " + key + ".hyp");
- }
- return null;
- }
- } else {
- if (errorDump){
- MessageHandler.errorln("Couldn't find precompiled "
- + "fop hyphenation pattern " + key + ".hyp");
- }
- return null;
- }
- }
- ois = new ObjectInputStream(is);
- hTree = (HyphenationTree) ois.readObject();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (ois != null) {
- try {
- ois.close();
- } catch (IOException e) {
- MessageHandler.errorln("can't close hyphenation object stream");
- }
- }
- }
- return hTree;
- }
-
- /**
- * load tree from serialized file or xml file
- * using configuration settings
- */
- public static HyphenationTree getUserHyphenationTree (String key,String hyphenDir) {
- HyphenationTree hTree = null;
- // I use here the following convention. The file name specified in
- // the configuration is taken as the base name. First we try
- // name + ".hyp" assuming a serialized HyphenationTree. If that fails
- // we try name + ".xml", assumming a raw hyphenation pattern file.
-
- // first try serialized object
- File hyphenFile = new File(hyphenDir, key + ".hyp");
- if (hyphenFile.exists()) {
- ObjectInputStream ois = null;
- try {
- ois = new ObjectInputStream(
- new FileInputStream(hyphenFile));
- hTree = (HyphenationTree) ois.readObject();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (ois != null) {
- try {
- ois.close();
- } catch (IOException e) {
- }
- }
- }
- return hTree;
- } else {
-
- // try the raw XML file
- hyphenFile = new File(hyphenDir, key + ".xml");
- if (hyphenFile.exists()) {
- hTree = new HyphenationTree();
- if (errorDump) {
- MessageHandler.errorln("reading " +
- hyphenDir + key +".xml");
- }
- try {
- hTree.loadPatterns(hyphenFile.getPath());
- if (errorDump) {
- System.out.println("Stats: ");
- hTree.printStats();
- }
- return hTree;
- } catch (HyphenationException ex) {
- if (errorDump) {
- MessageHandler.errorln("Can't load user patterns "
- + "from xml file " + hyphenDir + key +".xml");
- }
- return null;
- }
- } else {
- if (errorDump) {
- MessageHandler.errorln("Tried to load " +
- hyphenFile.toString() +
- "\nCannot find compiled nor xml file for "
- + "hyphenation pattern" + key );
- }
- return null;
- }
- }
- }
-
- public static Hyphenation hyphenate(String lang, String country,
- String word, int leftMin, int rightMin) {
- HyphenationTree hTree = getHyphenationTree(lang, country);
- if (hTree == null) {
- MessageHandler.errorln(
- "Error building hyphenation tree for language " + lang);
- return null;
- }
- return hTree.hyphenate(word, leftMin, rightMin);
- }
-
- public static Hyphenation hyphenate(String lang, String country,
- char[] word, int offset, int len, int leftMin, int rightMin) {
- HyphenationTree hTree = getHyphenationTree(lang, country);
- if (hTree == null) {
- MessageHandler.errorln(
- "Error building hyphenation tree for language " + lang);
- return null;
- }
- return hTree.hyphenate(word, offset, len, leftMin, rightMin);
- }
-
- public void setMinRemainCharCount(int min) {
- remainCharCount = min;
- }
-
- public void setMinPushCharCount(int min) {
- pushCharCount = min;
- }
-
- public void setLanguage(String lang, String country) {
- hyphenTree = getHyphenationTree(lang, country);
- }
-
- public Hyphenation hyphenate(char[] word, int offset, int len) {
- if (hyphenTree == null)
- return null;
- return hyphenTree.hyphenate(word, offset, len, remainCharCount,
- pushCharCount);
- }
-
- public Hyphenation hyphenate(String word) {
- if (hyphenTree == null)
- return null;
- return hyphenTree.hyphenate(word, remainCharCount, pushCharCount);
- }
- }
|