-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathProgram.cs
More file actions
131 lines (109 loc) · 3.94 KB
/
Copy pathProgram.cs
File metadata and controls
131 lines (109 loc) · 3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using System.Globalization;
using System.Text;
using AngleSharp;
using AngleSharp.Html.Parser;
using CsvHelper;
// 根据P社的文档来生成 Modifiers.csv 和 DynamicModifiers.csv 文件, 用作修饰符查询器的数据源
var context = BrowsingContext.New(Configuration.Default);
var parser = context.GetService<IHtmlParser>() ?? new HtmlParser();
string fileText = File.ReadAllText(
@"D:\SteamLibrary\steamapps\common\Hearts of Iron IV\documentation\modifiers_documentation.html"
);
var modifiers = new Dictionary<string, IEnumerable<string>>(1024);
var dynamicModifiers = new Dictionary<string, IEnumerable<string>>(16);
var document = parser.ParseDocument(fileText);
bool isReady = false;
foreach (var element in document.All)
{
bool addToDynamicModifiers = false;
if (element.Id == "modifiers-for-scope-aggressive")
{
isReady = true;
}
if (isReady && element is { TagName: "h2", Id: "_drift_from_guarantees" })
{
break;
}
if (isReady && element.TagName.Equals("li", StringComparison.OrdinalIgnoreCase))
{
// 有些 <li> 没有子元素, 跳过
if (element.Children.Length == 0)
{
continue;
}
var link = element.Children[0];
string? query = link.GetAttribute("href");
if (string.IsNullOrWhiteSpace(query))
{
continue;
}
string innerHtml = link.InnerHtml;
if (innerHtml.Contains('<'))
{
addToDynamicModifiers = true;
}
string modifierName = addToDynamicModifiers
? System.Text.RegularExpressions.Regex.Replace(innerHtml, @"</[^>]+>", "")
: link.TextContent;
var modifier = document.QuerySelector(query);
var ulElement = modifier?.NextElementSibling;
if (ulElement is null || !ulElement.TagName.Equals("UL", StringComparison.OrdinalIgnoreCase))
{
// 如果没有找到下一个元素, 可能是一个动态生成的修饰符, 嵌套在在一个 <h2> 中
var parentNext = modifier?.ParentElement?.NextElementSibling;
if (parentNext != null && parentNext.TagName.Equals("UL", StringComparison.OrdinalIgnoreCase))
{
ulElement = parentNext;
}
}
if (ulElement is null)
{
continue;
}
var categoriesElement = ulElement.Children.FirstOrDefault(item => item.TextContent.Contains("Categories"));
if (categoriesElement == null)
{
continue;
}
var categoriesParts = categoriesElement.TextContent.Split(':');
if (categoriesParts.Length < 2)
{
continue;
}
string categories = categoriesParts[1];
if (addToDynamicModifiers)
{
dynamicModifiers[modifierName] = categories.Split(',', StringSplitOptions.TrimEntries);
}
else
{
modifiers[modifierName] = categories.Split(',', StringSplitOptions.TrimEntries);
}
}
}
using var modifierCsv = new CsvWriter(
new StreamWriter(File.Open("Modifiers.csv", FileMode.Create), new UTF8Encoding(false)),
CultureInfo.InvariantCulture
);
modifierCsv.WriteField("Name");
modifierCsv.WriteField("Categories");
modifierCsv.NextRecord();
foreach (var element in modifiers)
{
modifierCsv.WriteField(element.Key);
modifierCsv.WriteField(string.Join(';', element.Value));
modifierCsv.NextRecord();
}
using var dynamicModifierCsv = new CsvWriter(
new StreamWriter(File.Open("DynamicModifiers.csv", FileMode.Create), new UTF8Encoding(false)),
CultureInfo.InvariantCulture
);
dynamicModifierCsv.WriteField("Name");
dynamicModifierCsv.WriteField("Categories");
dynamicModifierCsv.NextRecord();
foreach (var element in dynamicModifiers)
{
dynamicModifierCsv.WriteField(element.Key);
dynamicModifierCsv.WriteField(string.Join(';', element.Value));
dynamicModifierCsv.NextRecord();
}