OSDN Git Service

nuget 5.7.0で動くようにした
[fooeditengine/FooEditEngine.git] / WPF / Test / WZTextFoldingGenerator.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using FooEditEngine;
7
8 namespace Test
9 {
10     public sealed class OutlineItem : FoldingItem
11     {
12         /// <summary>
13         /// コンストラクター
14         /// </summary>
15         public OutlineItem(int start, int end, int level)
16             : base(start, end)
17         {
18             this.Level = level;
19         }
20
21         /// <summary>
22         /// アウトラインレベル
23         /// </summary>
24         public int Level
25         {
26             get;
27             set;
28         }
29     }
30
31     sealed class WZTextFoldingGenerator : IFoldingStrategy
32     {
33         struct TextLevelInfo
34         {
35             public int Index;
36             public int Level;
37             public TextLevelInfo(int index, int level)
38             {
39                 this.Index = index;
40                 this.Level = level;
41             }
42         }
43         public IEnumerable<FoldingItem> AnalyzeDocument(Document doc, int start, int end)
44         {
45             Stack<TextLevelInfo> beginIndexs = new Stack<TextLevelInfo>();
46             int lineHeadIndex = start;
47             foreach (string lineStr in doc.GetLines(start, end))
48             {
49                 int level = GetWZTextLevel(lineStr);
50                 if (level != -1)
51                 {
52                     foreach(FoldingItem item in GetFoldings(beginIndexs,level, lineHeadIndex))
53                         yield return item;
54                     beginIndexs.Push(new TextLevelInfo(lineHeadIndex, level));
55                 }
56                 lineHeadIndex += lineStr.Length;
57             }
58             foreach (FoldingItem item in GetFoldings(beginIndexs, 0, lineHeadIndex))
59                 yield return item;
60         }
61
62         IEnumerable<FoldingItem> GetFoldings(Stack<TextLevelInfo> beginIndexs,int level,int lineHeadIndex)
63         {
64             while (beginIndexs.Count > 0)
65             {
66                 TextLevelInfo begin = beginIndexs.Peek();
67                 if (level > begin.Level)
68                     break;
69                 beginIndexs.Pop();
70                 int endIndex = lineHeadIndex - 1;
71                 if (begin.Index < endIndex)
72                     yield return new OutlineItem(begin.Index, endIndex,begin.Level);
73             }
74         }
75
76         /// <summary>
77         /// WZText形式ののアウトラインレベルを取得する
78         /// </summary>
79         int GetWZTextLevel(string str)
80         {
81             int level = -1;
82             for (int i = 0; i < str.Length; i++)
83             {
84                 if (str[i] == '.')
85                     level++;
86                 else
87                     break;
88             }
89             return level;
90         }
91     }
92 }