2
0

WikiEntry.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. namespace PCLCS;
  2. /// <summary>
  3. /// MC 百科条目。
  4. /// <para/>使用 <see cref="WikiEntry.All"/> 获取所有条目。
  5. /// </summary>
  6. public class WikiEntry {
  7. /// <summary>
  8. /// 在 MC 百科中的对应 ID。
  9. /// </summary>
  10. public int Id;
  11. /// <summary>
  12. /// 中文译名。
  13. /// <c>null</c> 代表没有翻译。
  14. /// </summary>
  15. public string? ChineseName;
  16. /// <summary>
  17. /// 各个 Mod 平台的 Slug(例如 advanced-solar-panels)。
  18. /// 若没有对应键则为不在该平台上。
  19. /// </summary>
  20. public Dictionary<ResourcePlatforms, string> Slugs = [];
  21. /// <summary>
  22. /// MC 百科的浏览量逆序排行,1 代表浏览量最低。
  23. /// </summary>
  24. public int Popularity;
  25. /// <summary>
  26. /// 内置数据库中的所有 MC 百科条目。
  27. /// </summary>
  28. public static readonly Lazy<List<WikiEntry>> All = new(() => {
  29. var dataLines = FileUtils.ReadAsLines(@"Resource\WikiEntries.txt", type: typeof(WikiEntry)).ToList();
  30. // 读取最后一行的浏览量
  31. Queue<int> popularities = [];
  32. for (int i = 0; i < dataLines[^1].Length; i += 3) { // 将每 3 个字符切割成一个元素
  33. popularities.Enqueue(int.Parse(dataLines[^1].Substring(i, 3).ConvertRadix(86, 10)));
  34. }
  35. dataLines.RemoveAt(dataLines.Count - 1);
  36. // 解析每一行
  37. List<WikiEntry> results = [];
  38. var lineNumber = 0;
  39. foreach (var lineData in dataLines) {
  40. lineNumber++;
  41. if (lineData == "") continue;
  42. var popularity = popularities.Dequeue();
  43. foreach (var entryData in lineData.Split('¨')) {
  44. var entry = new WikiEntry();
  45. var parts = entryData.Split('|');
  46. var slugs = parts[0];
  47. if (slugs.StartsWithF("@")) {
  48. entry.Slugs.Add(ResourcePlatforms.Modrinth, slugs.Replace("@", ""));
  49. } else if (slugs.EndsWithF("@")) {
  50. entry.Slugs.Add(ResourcePlatforms.CurseForge, slugs.TrimEnd('@'));
  51. entry.Slugs.Add(ResourcePlatforms.Modrinth, entry.Slugs[ResourcePlatforms.CurseForge]);
  52. } else if (slugs.Contains("@")) {
  53. var splitSlugs = slugs.Split('@');
  54. entry.Slugs.Add(ResourcePlatforms.CurseForge, splitSlugs[0]);
  55. entry.Slugs.Add(ResourcePlatforms.Modrinth, splitSlugs[1]);
  56. } else {
  57. entry.Slugs.Add(ResourcePlatforms.CurseForge, slugs);
  58. }
  59. entry.Id = lineNumber;
  60. entry.Popularity = popularity;
  61. if (parts.Length >= 2) {
  62. entry.ChineseName = parts[^1]; // 最后一项
  63. if (entry.ChineseName.Contains("*")) { // 处理 *
  64. var englishName = entry.Slugs.Values.First().Replace("-", " ").Capitalize();
  65. entry.ChineseName = entry.ChineseName.Replace("*", $" ({englishName})");
  66. }
  67. }
  68. results.Add(entry);
  69. }
  70. }
  71. return results;
  72. });
  73. public override string ToString()
  74. => $"{Slugs.GetOrDefault(ResourcePlatforms.CurseForge)}&{Slugs.GetOrDefault(ResourcePlatforms.Modrinth)}|{Id}|{ChineseName},浏览量 {Popularity}";
  75. }