| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- using ICSharpCode.AvalonEdit.Document;
- using ICSharpCode.AvalonEdit.Folding;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace TeamAAS_VP.Core
- {
- /// <summary>
- /// Allows producing foldings from a document based on braces.
- /// </summary>
- public class BraceFoldingStrategy
- {
- /// <summary>
- /// Gets/Sets the opening brace. The default value is '{'.
- /// </summary>
- public char OpeningBrace { get; set; }
- /// <summary>
- /// Gets/Sets the closing brace. The default value is '}'.
- /// </summary>
- public char ClosingBrace { get; set; }
- /// <summary>
- /// Creates a new BraceFoldingStrategy.
- /// </summary>
- public BraceFoldingStrategy()
- {
- this.OpeningBrace = '{';
- this.ClosingBrace = '}';
- }
- public void UpdateFoldings(FoldingManager manager, TextDocument document)
- {
- int firstErrorOffset;
- IEnumerable<NewFolding> newFoldings = CreateNewFoldings(document, out firstErrorOffset);
- manager.UpdateFoldings(newFoldings, firstErrorOffset);
- }
- /// <summary>
- /// Create <see cref="NewFolding"/>s for the specified document.
- /// </summary>
- public IEnumerable<NewFolding> CreateNewFoldings(TextDocument document, out int firstErrorOffset)
- {
- firstErrorOffset = -1;
- return CreateNewFoldings(document);
- }
- /// <summary>
- /// Create <see cref="NewFolding"/>s for the specified document.
- /// </summary>
- public IEnumerable<NewFolding> CreateNewFoldings(ITextSource document)
- {
- List<NewFolding> newFoldings = new List<NewFolding>();
- Stack<int> startOffsets = new Stack<int>();
- int lastNewLineOffset = 0;
- char openingBrace = this.OpeningBrace;
- char closingBrace = this.ClosingBrace;
- for (int i = 0; i < document.TextLength; i++)
- {
- char c = document.GetCharAt(i);
- if (c == openingBrace)
- {
- startOffsets.Push(i);
- }
- else if (c == closingBrace && startOffsets.Count > 0)
- {
- int startOffset = startOffsets.Pop();
- // don't fold if opening and closing brace are on the same line
- if (startOffset < lastNewLineOffset)
- {
- newFoldings.Add(new NewFolding(startOffset, i + 1));
- }
- }
- else if (c=='#' && i+6< document.TextLength && document.GetCharAt(i+1)== 'r' && document.GetCharAt(i + 2) == 'e' && document.GetCharAt(i + 3) == 'g' && document.GetCharAt(i + 4) == 'i' && document.GetCharAt(i + 5) == 'o' && document.GetCharAt(i + 6) == 'n')
- {
- startOffsets.Push(i);
- }
- else if (c == '#' && i + 6 < document.TextLength && document.GetCharAt(i + 1) == 'e' && document.GetCharAt(i + 2) == 'n' && document.GetCharAt(i + 3) == 'd' && document.GetCharAt(i + 1) == 'r' && document.GetCharAt(i + 2) == 'e' && document.GetCharAt(i + 3) == 'g' && document.GetCharAt(i + 4) == 'i' && document.GetCharAt(i + 5) == 'o' && document.GetCharAt(i + 6) == 'n' && startOffsets.Count > 0)
- {
- int startOffset = startOffsets.Pop();
- // don't fold if opening and closing brace are on the same line
- if (startOffset < lastNewLineOffset)
- {
- newFoldings.Add(new NewFolding(startOffset, i + 1));
- }
- }
- else if (c == '\n' || c == '\r')
- {
- lastNewLineOffset = i + 1;
- }
- }
- newFoldings.Sort((a, b) => a.StartOffset.CompareTo(b.StartOffset));
- return newFoldings;
- }
- }
- }
|