43 lines
1.2 KiB
C#
43 lines
1.2 KiB
C#
using ICSharpCode.AvalonEdit.Document;
|
|
using ICSharpCode.AvalonEdit.Folding;
|
|
|
|
namespace ISMSTcpCmdWpfAppDemo
|
|
{
|
|
|
|
public class JsonFoldingStrategy
|
|
{
|
|
public void UpdateFoldings(FoldingManager manager, TextDocument document)
|
|
{
|
|
var foldings = new List<NewFolding>();
|
|
var text = document.Text;
|
|
Stack<int> startOffsets = new Stack<int>();
|
|
|
|
for (int i = 0; i < text.Length; i++)
|
|
{
|
|
char c = text[i];
|
|
if (c == '{' || c == '[')
|
|
{
|
|
startOffsets.Push(i);
|
|
}
|
|
else if (c == '}' || c == ']')
|
|
{
|
|
if (startOffsets.Count > 0)
|
|
{
|
|
int start = startOffsets.Pop();
|
|
foldings.Add(new NewFolding(start, i + 1));
|
|
}
|
|
}
|
|
}
|
|
|
|
// 按 StartOffset 升序排序并去重
|
|
var sortedFoldings = foldings
|
|
.GroupBy(f => f.StartOffset)
|
|
.Select(g => g.First())
|
|
.OrderBy(f => f.StartOffset)
|
|
.ToList();
|
|
|
|
manager.UpdateFoldings(sortedFoldings, document.TextLength);
|
|
}
|
|
}
|
|
}
|