Beispiel #1
0
            public override void Analyze(TextDocument doc, DocumentLine line, Chunk startChunk, int startOffset, int endOffset)
            {
                // Check line start
                int  o = line.Offset;
                char c = '\0';

                for (; o < line.EndOffset && char.IsWhiteSpace(c = doc.GetCharAt(o)); o++)
                {
                    ;
                }

                if (c != '-' && c != '#')
                {
                    return;
                }

                DSyntax.Document = doc;
                var spanParser = new SpanParser(DSyntax, new CloneableStack <Span>());
                var chunkP     = new ChunkParser(DSyntax, spanParser, Ide.IdeApp.Workbench.ActiveDocument.Editor.ColorStyle, line);

                var n = chunkP.GetChunks(startOffset, endOffset - startOffset);

                startChunk.Next   = n;
                startChunk.Length = n.Offset - startChunk.Offset;
            }
Beispiel #2
0
        public virtual IEnumerable <Chunk> GetChunks(ColorScheme style, DocumentLine line, int offset, int length)
        {
            SpanParser  spanParser  = CreateSpanParser(line, null);
            ChunkParser chunkParser = CreateChunkParser(spanParser, style, line);
            Chunk       result      = chunkParser.GetChunks(chunkParser.lineOffset, line.Length);

            if (SemanticRules != null)
            {
                foreach (SemanticRule sematicRule in SemanticRules)
                {
                    sematicRule.Analyze(doc, line, result, offset, offset + length);
                }
            }
            var minOffset = offset;

            if (result != null)
            {
                // crop to begin
                if (result.Offset < offset)
                {
                    while (result != null && result.EndOffset < offset)
                    {
                        result = result.Next;
                    }
                    if (result != null)
                    {
                        int endOffset = result.EndOffset;
                        result.Offset = offset;
                        result.Length = endOffset - offset;
                        minOffset     = result.Offset;
                    }
                }
            }
            while (result != null)
            {
                // crop to end
                if (result.EndOffset >= offset + length)
                {
                    result.Length = offset + length - result.Offset;
                    result.Next   = null;
                    if (result.Length < 0)
                    {
                        result.Length = 0;
                        yield break;
                    }
                }
                while (result.Next != null && result.Offset < minOffset)
                {
                    result = result.Next;
                }
                minOffset = result.Offset + result.Length;
                yield return(result);

                result = result.Next;
            }
        }
Beispiel #3
0
        public virtual IEnumerable <Chunk> GetChunks(ColorScheme style, DocumentLine line, int offset, int length)
        {
            SpanParser  spanParser  = CreateSpanParser(line, null);
            ChunkParser chunkParser = CreateChunkParser(spanParser, style, line);
            Chunk       result      = chunkParser.GetChunks(chunkParser.lineOffset, line.Length);

            if (SemanticRules != null)
            {
                foreach (SemanticRule sematicRule in SemanticRules)
                {
                    sematicRule.Analyze(doc, line, result, offset, offset + length);
                }
            }
            if (result != null)
            {
                // crop to begin
                if (result.Offset != offset)
                {
                    while (result != null && result.EndOffset < offset)
                    {
                        result = result.Next;
                    }
                    if (result != null)
                    {
                        int endOffset = result.EndOffset;
                        result.Offset = offset;
                        result.Length = endOffset - offset;
                    }
                }

                if (result != null && offset + length != chunkParser.lineOffset + line.Length)
                {
                    // crop to end
                    Chunk cur = result;
                    while (cur != null && cur.EndOffset < offset + length)
                    {
                        cur = cur.Next;
                    }
                    if (cur != null)
                    {
                        cur.Length = offset + length - cur.Offset;
                        cur.Next   = null;
                    }
                }
            }
            while (result != null)
            {
                yield return(result);

                result = result.Next;
            }
        }
Beispiel #4
0
        public virtual Chunk GetChunks(Document doc, Style style, LineSegment line, int offset, int length)
        {
            SpanParser  spanParser  = CreateSpanParser(doc, this, line, null);
            ChunkParser chunkParser = CreateChunkParser(spanParser, doc, style, this, line);
            Chunk       result      = chunkParser.GetChunks(chunkParser.lineOffset, line.EditableLength);

            if (SemanticRules != null)
            {
                foreach (SemanticRule sematicRule in SemanticRules)
                {
                    sematicRule.Analyze(doc, line, result, offset, offset + length);
                }
            }
            if (result != null)
            {
                // crop to begin
                if (result.Offset != offset)
                {
                    while (result != null && result.EndOffset < offset)
                    {
                        result = result.Next;
                    }
                    if (result != null)
                    {
                        int endOffset = result.EndOffset;
                        result.Offset = offset;
                        result.Length = endOffset - offset;
                    }
                }

                if (result != null && offset + length != chunkParser.lineOffset + line.EditableLength)
                {
                    // crop to end
                    Chunk cur = result;
                    while (cur != null && cur.EndOffset < offset + length)
                    {
                        cur = cur.Next;
                    }
                    if (cur != null)
                    {
                        cur.Length = offset + length - cur.Offset;
                        cur.Next   = null;
                    }
                }
            }

            return(result);
        }
			public override void Analyze(TextDocument doc, DocumentLine line, Chunk startChunk, int startOffset, int endOffset)
			{
				// Check line start
				int o = line.Offset;
				char c = '\0';
				for (; o < line.EndOffset && char.IsWhiteSpace(c = doc.GetCharAt(o)); o++) ;

				if (c != '-' && c != '#')
					return;

				DSyntax.Document = doc;
				var spanParser = new SpanParser(DSyntax, new CloneableStack<Span>());
				var chunkP = new ChunkParser(DSyntax, spanParser, Ide.IdeApp.Workbench.ActiveDocument.Editor.ColorStyle, line);

				var n = chunkP.GetChunks(startOffset, endOffset - startOffset);
				if (n == null)
					return;
				startChunk.Next = n;
				startChunk.Length = n.Offset - startChunk.Offset;
			}