⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hyphenationtree.java

📁 处理PDF
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                    }                    if (sc[q] == 0) {                        values = getValues(eq[q]);                        int j = index;                        for (int k = 0; k < values.length; k++) {                            if (j < il.length && values[k] > il[j]) {                                il[j] = values[k];                            }                            j++;                        }                        break;                    } else {                        q = lo[q];                        /**                         * actually the code should be:                         * q = sc[q] < 0 ? hi[q] : lo[q];                         * but java chars are unsigned                         */                    }                }            } else {                p = d < 0 ? lo[p] : hi[p];            }        }    }    /**     * Hyphenate word and return a Hyphenation object.     * @param word the word to be hyphenated     * @param remainCharCount Minimum number of characters allowed     * before the hyphenation point.     * @param pushCharCount Minimum number of characters allowed after     * the hyphenation point.     * @return a {@link Hyphenation Hyphenation} object representing     * the hyphenated word or null if word is not hyphenated.     */    public Hyphenation hyphenate(String word, int remainCharCount,                                 int pushCharCount) {        char[] w = word.toCharArray();        return hyphenate(w, 0, w.length, remainCharCount, pushCharCount);    }    /**     * w = "****nnllllllnnn*****",     * where n is a non-letter, l is a letter,     * all n may be absent, the first n is at offset,     * the first l is at offset + iIgnoreAtBeginning;     * word = ".llllll.'\0'***",     * where all l in w are copied into word.     * In the first part of the routine len = w.length,     * in the second part of the routine len = word.length.     * Three indices are used:     * index(w), the index in w,     * index(word), the index in word,     * letterindex(word), the index in the letter part of word.     * The following relations exist:     * index(w) = offset + i - 1     * index(word) = i - iIgnoreAtBeginning     * letterindex(word) = index(word) - 1     * (see first loop).     * It follows that:     * index(w) - index(word) = offset - 1 + iIgnoreAtBeginning     * index(w) = letterindex(word) + offset + iIgnoreAtBeginning     */    /**     * Hyphenate word and return an array of hyphenation points.     * @param w char array that contains the word     * @param offset Offset to first character in word     * @param len Length of word     * @param remainCharCount Minimum number of characters allowed     * before the hyphenation point.     * @param pushCharCount Minimum number of characters allowed after     * the hyphenation point.     * @return a {@link Hyphenation Hyphenation} object representing     * the hyphenated word or null if word is not hyphenated.     */    public Hyphenation hyphenate(char[] w, int offset, int len,                                 int remainCharCount, int pushCharCount) {        int i;        char[] word = new char[len + 3];        // normalize word        char[] c = new char[2];        int iIgnoreAtBeginning = 0;        int iLength = len;        boolean bEndOfLetters = false;        for (i = 1; i <= len; i++) {            c[0] = w[offset + i - 1];            int nc = classmap.find(c, 0);            if (nc < 0) {    // found a non-letter character ...                if (i == (1 + iIgnoreAtBeginning)) {                    // ... before any letter character                    iIgnoreAtBeginning ++;                } else {                    // ... after a letter character                    bEndOfLetters = true;                }                iLength --;            } else {                if (!bEndOfLetters) {                    word[i - iIgnoreAtBeginning] = (char)nc;                } else {                    return null;                }            }        }        len = iLength;        if (len < (remainCharCount + pushCharCount)) {            // word is too short to be hyphenated            return null;        }        int[] result = new int[len + 1];        int k = 0;        // check exception list first        String sw = new String(word, 1, len);        if (stoplist.containsKey(sw)) {            // assume only simple hyphens (Hyphen.pre="-", Hyphen.post = Hyphen.no = null)            ArrayList hw = (ArrayList)stoplist.get(sw);            int j = 0;            for (i = 0; i < hw.size(); i++) {                Object o = hw.get(i);                // j = index(sw) = letterindex(word)?                // result[k] = corresponding index(w)                if (o instanceof String) {                    j += ((String)o).length();                    if (j >= remainCharCount && j < (len - pushCharCount)) {                        result[k++] = j + iIgnoreAtBeginning;                    }                }            }        } else {            // use algorithm to get hyphenation points            word[0] = '.';                    // word start marker            word[len + 1] = '.';              // word end marker            word[len + 2] = 0;                // null terminated            byte[] il = new byte[len + 3];    // initialized to zero            for (i = 0; i < len + 1; i++) {                searchPatterns(word, i, il);            }            // hyphenation points are located where interletter value is odd            // i is letterindex(word),            // i + 1 is index(word),            // result[k] = corresponding index(w)            for (i = 0; i < len; i++) {                if (((il[i + 1] & 1) == 1) && i >= remainCharCount                        && i <= (len - pushCharCount)) {                    result[k++] = i + iIgnoreAtBeginning;                }            }        }        if (k > 0) {            // trim result array            int[] res = new int[k];            System.arraycopy(result, 0, res, 0, k);            return new Hyphenation(new String(w, offset, len), res);        } else {            return null;        }    }    /**     * Add a character class to the tree. It is used by     * {@link SimplePatternParser SimplePatternParser} as callback to     * add character classes. Character classes define the     * valid word characters for hyphenation. If a word contains     * a character not defined in any of the classes, it is not hyphenated.     * It also defines a way to normalize the characters in order     * to compare them with the stored patterns. Usually pattern     * files use only lower case characters, in this case a class     * for letter 'a', for example, should be defined as "aA", the first     * character being the normalization char.     */    public void addClass(String chargroup) {        if (chargroup.length() > 0) {            char equivChar = chargroup.charAt(0);            char[] key = new char[2];            key[1] = 0;            for (int i = 0; i < chargroup.length(); i++) {                key[0] = chargroup.charAt(i);                classmap.insert(key, 0, equivChar);            }        }    }    /**     * Add an exception to the tree. It is used by     * {@link SimplePatternParser SimplePatternParser} class as callback to     * store the hyphenation exceptions.     * @param word normalized word     * @param hyphenatedword a vector of alternating strings and     * {@link Hyphen hyphen} objects.     */    public void addException(String word, ArrayList hyphenatedword) {        stoplist.put(word, hyphenatedword);    }    /**     * Add a pattern to the tree. Mainly, to be used by     * {@link SimplePatternParser SimplePatternParser} class as callback to     * add a pattern to the tree.     * @param pattern the hyphenation pattern     * @param ivalue interletter weight values indicating the     * desirability and priority of hyphenating at a given point     * within the pattern. It should contain only digit characters.     * (i.e. '0' to '9').     */    public void addPattern(String pattern, String ivalue) {        int k = ivalues.find(ivalue);        if (k <= 0) {            k = packValues(ivalue);            ivalues.insert(ivalue, (char)k);        }        insert(pattern, (char)k);    }    public void printStats() {        System.out.println("Value space size = "                           + Integer.toString(vspace.length()));        super.printStats();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -