public ZLTextHyphenationInfo GetInfo(string word, int offset = 0)
        {
            int len = word.Length;
            var isLetter = new bool[len];
            var pattern = new char[len + 2];
            char[] data = word.ToCharArray();
            pattern[0] = ' ';
            for (int i = 0, j = offset; i < len; ++i, ++j)
            {
                char character = data[j];
                if (character == '\'' || character == '^' || Char.IsLetter(character))
                {
                    isLetter[i] = true;
                    pattern[i + 1] = char.ToLower(character);
                }
                else
                {
                    pattern[i + 1] = ' ';
                }
            }
            pattern[len + 1] = ' ';

            var info = new ZLTextHyphenationInfo(len + 2);
            bool[] mask = info.Mask;
            Hyphenate(pattern, mask, len + 2);
            for (int i = 0, j = offset - 1; i <= len; ++i, ++j)
            {
                if ((i < 2) || (i > len - 2))
                {
                    mask[i] = false;
                }
                else
                {
                    switch (data[j])
                    {
                        case (char) 0xAD: // soft hyphen
                            mask[i] = true;
                            break;
                        case '-':
                            mask[i] = (i >= 3)
                                      && isLetter[i - 3]
                                      && isLetter[i - 2]
                                      && isLetter[i]
                                      && isLetter[i + 1];
                            break;
                        default:
                            mask[i] = mask[i]
                                      && isLetter[i - 2]
                                      && isLetter[i - 1]
                                      && isLetter[i]
                                      && isLetter[i + 1];
                            break;
                    }
                }
            }

            return info;
        }
        public ZLTextHyphenationInfo GetInfo(string word, int offset = 0)
        {
            int len      = word.Length;
            var isLetter = new bool[len];
            var pattern  = new char[len + 2];

            char[] data = word.ToCharArray();
            pattern[0] = ' ';
            for (int i = 0, j = offset; i < len; ++i, ++j)
            {
                char character = data[j];
                if (character == '\'' || character == '^' || Char.IsLetter(character))
                {
                    isLetter[i]    = true;
                    pattern[i + 1] = char.ToLower(character);
                }
                else
                {
                    pattern[i + 1] = ' ';
                }
            }
            pattern[len + 1] = ' ';

            var info = new ZLTextHyphenationInfo(len + 2);

            bool[] mask = info.Mask;
            Hyphenate(pattern, mask, len + 2);
            for (int i = 0, j = offset - 1; i <= len; ++i, ++j)
            {
                if ((i < 2) || (i > len - 2))
                {
                    mask[i] = false;
                }
                else
                {
                    switch (data[j])
                    {
                    case (char)0xAD:      // soft hyphen
                        mask[i] = true;
                        break;

                    case '-':
                        mask[i] = (i >= 3) &&
                                  isLetter[i - 3] &&
                                  isLetter[i - 2] &&
                                  isLetter[i] &&
                                  isLetter[i + 1];
                        break;

                    default:
                        mask[i] = mask[i] &&
                                  isLetter[i - 2] &&
                                  isLetter[i - 1] &&
                                  isLetter[i] &&
                                  isLetter[i + 1];
                        break;
                    }
                }
            }

            return(info);
        }