예제 #1
0
        private IEnumerable <ColoredText> HighlightCore(string text)
        {
            if (string.IsNullOrEmpty(text))
            {
                return(Array.Empty <ColoredText>());
            }

            var allTokens = AphidLexer.GetAllTokens(text);
            var tokens    = AphidLexer.GetTokens(text);

            if (tokens.Count == 0)
            {
                return(allTokens.Select(x => _theme.GetColoredText(x)));
            }

            var peekTable = Enumerable
                            .Range(0, tokens.Count - 1)
                            .ToDictionary(x => tokens[x].Index, x => tokens[x + 1].TokenType);

            void addNone(in AphidToken t) => peekTable.Add(t.Index, None);

            addNone(tokens[tokens.Count - 1]);
            allTokens.Except(tokens).For(x => addNone(in x));

            return(allTokens.Select(x => _theme.GetColoredText(x, peekTable[x.Index])));
        }
예제 #2
0
        public static void TokenizeAll(
            [PexAssumeUnderTest] AphidLexer lexer,
            [PexAssumeUnderTest] string code
            )
        {
            lexer.Text = code;
            lexer.GetAllTokens();

            // TODO: add assertions to method AphidInterpreterTest.Interpret(AphidInterpreter, String, Boolean)
        }
예제 #3
0
        public void SetSource(string source, int offset)
        {
            _index = 0;
            try
            {
                var lexer = new AphidLexer(source);

                if (_lexerMode != 0)
                {
                    lexer.SetMode(_lexerMode);
                }

                _tokens = lexer
                          .GetAllTokens()
                          .Where(x => x.TokenType != WhiteSpace)
                          .ToArray();

                _lexerMode = lexer.GetMode();
            }
            catch
            {
                _tokens = new AphidToken[0];
            }
        }
예제 #4
0
        protected override void OnRender(DrawingContext drawingContext)
        {
            DebugHelper.Trace();

            if (glyphFace == null)
            {
                return;
            }
            else if (string.IsNullOrEmpty(_text))
            {
                _currentColumn = 0;
                _currentRow    = 0;
                MoveCaretToCurrentCell();
                SetDefaultSize();
                CreateDocument(new List <AphidToken>());
                return;
            }

            var lexer = new AphidLexer(_text);

            CreateDocument(lexer.GetAllTokens());
            double greatestX = 0, greatestY = 0;

            for (int y = 0; y < _document.Count; y++)
            {
                for (int x = 0; x < _document[y].Count; x++)
                {
                    var cell = _document[y][x];

                    if (cell.Char == '\n')
                    {
                        continue;
                    }

                    var glyph = BuildGlyphRun(x, y, cell.Char);

                    drawingContext.DrawGlyphRun(
                        new SolidColorBrush(GetColor(cell.Type)),
                        glyph);

                    var x2 = glyph.BaselineOrigin.X + _cellWidth;

                    if (x2 > greatestX)
                    {
                        greatestX = x2;
                    }

                    if (glyph.BaselineOrigin.Y > greatestY)
                    {
                        //greatestY = glyph.BaselineOrigin.Y + 20;
                        greatestY = glyph.BaselineOrigin.Y;
                    }
                }
            }

            var caretY = Canvas.GetTop(_caret) + _caret.Height;

            if (caretY > greatestY)
            {
                greatestY = caretY;
            }

            Width  = greatestX;
            Height = greatestY;
        }