示例#1
0
        public bool MoveNext()
        {
            int runCount = _line.Runs.Count;

            for (; _runIndex < runCount; _runIndex++)
            {
                Line.Run run = _line.Runs[_runIndex];

                if ((run.level & 1) != 0)
                {
                    int index = _charIndex;
                    int limit = run.offset + run.length;

                    if (index == -1)
                    {
                        index = run.offset;
                    }

                    for (; index < limit; index++)
                    {
                        int mirror = PairingLookup.DetermineMirror(_line.Text[index]);

                        if (mirror != 0)
                        {
                            _charIndex    = index + 1;
                            _agent.index  = index;
                            _agent.mirror = mirror;

                            return(true);
                        }
                    }
                }

                _charIndex = -1;
            }

            Reset();
            return(false);
        }
示例#2
0
        private void ResolveBrackets()
        {
            BidiLink strongLink = null;

            _bracketQueue.Clear(Level.MakeEmbeddingType(_level));

            for (BidiLink link = _roller.Next; link != _roller; link = link.Next)
            {
                CharType type = link.type;

                switch (type)
                {
                case CharType.ON:
                    BracketType bracketType;

                    char ch           = Text[link.offset];
                    int  bracketValue = PairingLookup.DetermineBracketPair((int)ch, out bracketType);

                    switch (bracketType)
                    {
                    case BracketType.Open:
                        BracketPair bracketPair = new BracketPair()
                        {
                            bracketUnicode  = ch,
                            openingLink     = link,
                            priorStrongLink = strongLink
                        };
                        _bracketQueue.Enqueue(bracketPair);
                        break;

                    case BracketType.Close:
                        if (!_bracketQueue.IsEmpty)
                        {
                            _bracketQueue.ClosePair(link, bracketValue);

                            if (_bracketQueue.ShouldDequeue)
                            {
                                ResolveAvailableBracketPairs();
                            }
                        }
                        break;
                    }
                    break;

                case CharType.L:
                case CharType.R:
                case CharType.AL:
                case CharType.EN:
                case CharType.AN:
                    if (!_bracketQueue.IsEmpty)
                    {
                        if (type == CharType.EN || type == CharType.AN)
                        {
                            type = CharType.R;
                        }

                        _bracketQueue.SetStrongType(type);
                    }
                    strongLink = link;
                    break;
                }
            }

            ResolveAvailableBracketPairs();
        }