示例#1
0
        public static void AnalyzeExtendedCharactersAndDigits(
            IntPtr text,
            uint length,
            TextItemizer textItemizer,
            CharAttribute[]                                  pCharAttribute,
            CultureInfo numberCulture,
            IClassification classificationUtility
            )
        {
            // Text will never be of zero length. This is enforced by Itemize().
            bool isCombining;
            bool needsCaretInfo;
            bool isIndic;
            bool isDigit;
            bool isLatin;
            bool isStrong;
            bool isExtended;

            char ch = (char)Marshal.ReadInt16(text);

            classificationUtility.GetCharAttribute(
                ch,
                out isCombining,
                out needsCaretInfo,
                out isIndic,
                out isDigit,
                out isLatin,
                out isStrong
                );

            isExtended = ItemizerHelper.IsExtendedCharacter(ch);

            uint isDigitRangeStart    = 0;
            uint isDigitRangeEnd      = 0;
            bool previousIsDigitValue = (numberCulture == null) ? false : isDigit;
            bool currentIsDigitValue;

            // pCharAttribute is assumed to have the same length as text. This is enforced by Itemize().
            pCharAttribute[0] = (CharAttribute)
                                (((isCombining)    ? CharAttribute.IsCombining    : CharAttribute.None)
                                 | ((needsCaretInfo) ? CharAttribute.NeedsCaretInfo : CharAttribute.None)
                                 | ((isLatin)        ? CharAttribute.IsLatin        : CharAttribute.None)
                                 | ((isIndic)        ? CharAttribute.IsIndic        : CharAttribute.None)
                                 | ((isStrong)       ? CharAttribute.IsStrong       : CharAttribute.None)
                                 | ((isExtended)     ? CharAttribute.IsExtended     : CharAttribute.None));

            uint i;

            for (i = 1; i < length; ++i)
            {
                ch = (char)Marshal.ReadInt16(text, 2 * (int)i);

                classificationUtility.GetCharAttribute(
                    ch,
                    out isCombining,
                    out needsCaretInfo,
                    out isIndic,
                    out isDigit,
                    out isLatin,
                    out isStrong
                    );

                isExtended = ItemizerHelper.IsExtendedCharacter(ch);


                pCharAttribute[i] = (CharAttribute)
                                    (((isCombining)    ? CharAttribute.IsCombining    : CharAttribute.None)
                                     | ((needsCaretInfo) ? CharAttribute.NeedsCaretInfo : CharAttribute.None)
                                     | ((isLatin)        ? CharAttribute.IsLatin        : CharAttribute.None)
                                     | ((isIndic)        ? CharAttribute.IsIndic        : CharAttribute.None)
                                     | ((isStrong)       ? CharAttribute.IsStrong       : CharAttribute.None)
                                     | ((isExtended)     ? CharAttribute.IsExtended     : CharAttribute.None));


                currentIsDigitValue = (numberCulture == null) ? false : isDigit;
                if (previousIsDigitValue != currentIsDigitValue)
                {
                    isDigitRangeEnd = i;
                    textItemizer.SetIsDigit(isDigitRangeStart, isDigitRangeEnd - isDigitRangeStart, previousIsDigitValue);

                    isDigitRangeStart    = i;
                    previousIsDigitValue = currentIsDigitValue;
                }
            }


            isDigitRangeEnd = i;
            textItemizer.SetIsDigit(isDigitRangeStart, isDigitRangeEnd - isDigitRangeStart, previousIsDigitValue);
        }