Ejemplo n.º 1
0
 /// <summary>
 /// Restore the data saved by SaveTypes
 /// </summary>
 public void RestoreTypes()
 {
     _classes.Clear();
     _classes.Add(_savedClasses.AsSlice());
     _pairedBracketTypes.Clear();
     _pairedBracketTypes.Add(_savedPairedBracketTypes.AsSlice());
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Appends text to the bidi data.
        /// </summary>
        /// <param name="text">The text to process.</param>
        public void Append(ReadOnlySlice <char> text)
        {
            _classes.Add(text.Length);
            _pairedBracketTypes.Add(text.Length);
            _pairedBracketValues.Add(text.Length);

            // Resolve the BidiCharacterType, paired bracket type and paired
            // bracket values for all code points
            HasBrackets   = false;
            HasEmbeddings = false;
            HasIsolates   = false;

            int i = Length;

            var codePointEnumerator = new CodepointEnumerator(text);

            while (codePointEnumerator.MoveNext())
            {
                var codepoint = codePointEnumerator.Current;

                // Look up BiDiClass
                var dir = codepoint.BiDiClass;

                _classes[i] = dir;

                switch (dir)
                {
                case BidiClass.LeftToRightEmbedding:
                case BidiClass.LeftToRightOverride:
                case BidiClass.RightToLeftEmbedding:
                case BidiClass.RightToLeftOverride:
                case BidiClass.PopDirectionalFormat:
                {
                    HasEmbeddings = true;
                    break;
                }

                case BidiClass.LeftToRightIsolate:
                case BidiClass.RightToLeftIsolate:
                case BidiClass.FirstStrongIsolate:
                case BidiClass.PopDirectionalIsolate:
                {
                    HasIsolates = true;
                    break;
                }
                }

                // Lookup paired bracket types
                var pbt = codepoint.PairedBracketType;

                _pairedBracketTypes[i] = pbt;

                if (pbt == BidiPairedBracketType.Open)
                {
                    // Opening bracket types can never have a null pairing.
                    codepoint.TryGetPairedBracket(out var paired);

                    _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(paired).Value;

                    HasBrackets = true;
                }
                else if (pbt == BidiPairedBracketType.Close)
                {
                    _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(codepoint).Value;

                    HasBrackets = true;
                }

                i++;
            }

            Length = i;

            Classes             = _classes.AsSlice(0, Length);
            PairedBracketTypes  = _pairedBracketTypes.AsSlice(0, Length);
            PairedBracketValues = _pairedBracketValues.AsSlice(0, Length);
        }