添加解析器

This commit is contained in:
limil 2025-12-28 18:09:36 +08:00
parent a4c5834da5
commit 47df98a25e
15 changed files with 352 additions and 110 deletions

View File

@ -1,10 +1,11 @@
using System.Collections.Generic;
using Godot;
using Learn.Models;
using Learn.Parsers;
namespace Learn.Component;
public partial class ParsedInfoPanel : Tree
public partial class InspectorPanel : Tree
{
[Export] private NodeInfoEditPanel _editPanel;
@ -34,7 +35,7 @@ public partial class ParsedInfoPanel : Tree
_editPanel.OnNodeInfoEdited += OnNodeChanged;
}
public void SetNode(TreeNode node)
{
_node = node;
@ -47,6 +48,11 @@ public partial class ParsedInfoPanel : Tree
if (_node == null) return;
var root = CreateItem();
var nameNode = CreateItem(root);
nameNode.SetText(KeyColumn, "Name");
nameNode.SetText(ValueColumn, _node.Info.Name());
var kvs = _node.GetKeyValueInfos();
foreach (var kv in kvs)
{

View File

@ -0,0 +1 @@
uid://bl3kpjp1rfw8n

View File

@ -17,7 +17,7 @@ public partial class MainTreePanel : Tree
}
private readonly HashSet<string> _columns = new();
private readonly List<string> _columns = new();
private readonly HashSet<TreeNode> _selectingNodes = new();
private readonly Dictionary<TreeItem, TreeNode> _mapper = new();
private readonly Dictionary<string, Item> _items = new();
@ -30,7 +30,7 @@ public partial class MainTreePanel : Tree
SetColumnTitlesVisible(true);
SetColumnTitle(0, "文件名");
SetColumnCustomMinimumWidth(0, 400);
SetColumnCustomMinimumWidth(0, 500);
SetColumnExpand(0, true);
MultiSelected += OnMultiSelected;
@ -38,10 +38,15 @@ public partial class MainTreePanel : Tree
UpdateColumns();
}
public void AddColumn(string columnName)
public void AddColumn(string columnName, int index)
{
if (string.IsNullOrEmpty(columnName)) return;
_columns.Add(columnName);
if (_columns.Contains(columnName)) return;
if (index < 0)
{
_columns.Add(columnName);
}
_columns.Insert(index, columnName);
UpdateColumns();
}
@ -52,6 +57,12 @@ public partial class MainTreePanel : Tree
UpdateColumns();
}
public void ClearColumns()
{
_columns.Clear();
UpdateColumns();
}
public void UpdateColumns()
{
Columns = _columns.Count + 1;
@ -59,7 +70,7 @@ public partial class MainTreePanel : Tree
foreach (var column in _columns)
{
SetColumnTitle(index, column);
SetColumnCustomMinimumWidth(index, 200);
SetColumnCustomMinimumWidth(index, 400);
SetColumnExpand(index, true);
index += 1;
}
@ -161,6 +172,11 @@ public partial class MainTreePanel : Tree
TreeItem root = CreateItem();
BuildTree(root, path);
}
public bool Query(TreeItem item, out TreeNode node)
{
return _mapper.TryGetValue(item, out node);
}
private void BuildTree(TreeItem root, string path)
{

View File

@ -1 +0,0 @@
uid://bkx2esr711e68

132
Main.cs
View File

@ -1,42 +1,41 @@
using System.Collections.Generic;
using System.IO;
using Godot;
using System.Linq;
using Learn.Component;
using Learn.Parsers;
public partial class Main : Node
{
[ExportGroup("文件夹操作")][Export] private FileDirSelector _dirSelector;
[ExportGroup("文件夹操作")]
[Export] private FileDirSelector _dirSelector;
[ExportGroup("操作面板")][Export] private RichTextLabel _console;
[ExportGroup("操作面板")][Export] private Button _openDirButton;
[ExportGroup("操作面板")][Export] private Button _doParseButton;
[ExportGroup("操作面板")][Export] private Button _saveButton;
[ExportGroup("操作面板")][Export] private Button _resetButton;
[ExportGroup("操作面板")]
[Export] private Button _openDirButton;
[Export] private Button _doParseButton;
[Export] private Button _saveButton;
[Export] private Button _resetButton;
[Export] private Button _loadButton;
[ExportGroup("编辑面板")][Export] private NodeInfoEditPanel _nodeInfoEditPanel;
[ExportGroup("编辑面板")][Export] private Button _addKeyButton;
[ExportGroup("编辑面板")][Export] private Button _removeKeyButton;
[ExportGroup("编辑面板")]
[Export] private NodeInfoEditPanel _nodeInfoEditPanel;
[Export] private Button _addKeyButton;
[Export] private Button _removeKeyButton;
[ExportGroup("解析面板")][Export] private ParsedInfoPanel _parsedInfoPanel;
[ExportGroup("解析面板")]
[Export] private InspectorPanel _inspectorPanel;
[ExportGroup("主展示面板")] [Export] private MainTreePanel _mainTreePanel;
[ExportGroup("主展示面板")][Export] private LineEdit _columnText;
[ExportGroup("主展示面板")][Export] private Button _addColumnButton;
[ExportGroup("主展示面板")][Export] private Button _removeColumnButton;
[ExportGroup("主展示面板")]
[Export] private MainTreePanel _mainTreePanel;
[Export] private LineEdit _columnIndexText;
[Export] private LineEdit _columnText;
[Export] private Button _addColumnButton;
[Export] private Button _removeColumnButton;
[Export] private Button _clearColumnButton;
[Export] private Button _expandAllButton;
[Export] private Button _foldAllButton;
private bool _refreshPanels;
private void Log(string log)
{
var time = Time.GetTimeDictFromSystem();
string timestamp = $"[{time["hour"]:D2}:{time["minute"]:D2}:{time["second"]:D2}]";
string bbcode = $"[color=#888888]{timestamp}[/color] " +
$"{log}\n";
_console.AppendText(bbcode);
_console.ScrollToLine(_console.GetLineCount());
}
public override void _Ready()
{
@ -45,23 +44,65 @@ public partial class Main : Node
_removeKeyButton.Pressed += _nodeInfoEditPanel.RemoveKeyValue;
_mainTreePanel.MultiSelected += (_, _, _) => { _refreshPanels = true; };
_addColumnButton.Pressed += () => _mainTreePanel.AddColumn(_columnText.Text);
_addColumnButton.Pressed += () => _mainTreePanel.AddColumn(_columnText.Text, int.TryParse(_columnIndexText.Text, out var index) ? index : -1);
_removeColumnButton.Pressed += () => _mainTreePanel.RemoveColumn(_columnText.Text);
_clearColumnButton.Pressed += () => _mainTreePanel.ClearColumns();
_expandAllButton.Pressed += ExpandAll;
_foldAllButton.Pressed += FoldAll;
// 功能区
_openDirButton.Pressed += ScanDir;
_doParseButton.Pressed += DoParse;
_saveButton.Pressed += DoSave;
_resetButton.Pressed += DoReset;
_loadButton.Pressed += LoadData;
LoadData();
// 先加载保存的数据
_mainTreePanel.Scan("C:/Users/15401/Desktop/2025-up7"); // todo: 弄好后删掉
FoldAll();
_refreshPanels = true;
}
private void LoadData()
{
if (File.Exists(DataPath))
{
_mainTreePanel.LoadData(DataPath);
Log("加载成功:" + DataPath);
GD.Print("加载成功:" + DataPath);
_refreshPanels = true;
}
}
private void ExpandAll()
{
SetAllCollapsed(false);
}
private void FoldAll()
{
SetAllCollapsed(true);
}
private void SetAllCollapsed(bool collapsed)
{
var root = _mainTreePanel.GetRoot();
if (root == null) return;
var queue = new Queue<TreeItem>();
queue.Enqueue(root);
while (queue.Count > 0)
{
var treeItem = queue.Dequeue();
foreach (var child in treeItem.GetChildren())
{
if(child == null) continue;
child.Collapsed = collapsed;
queue.Enqueue(child);
}
}
}
public override void _Process(double delta)
{
@ -69,11 +110,13 @@ public partial class Main : Node
{
_refreshPanels = false;
_nodeInfoEditPanel.SetNodes(_mainTreePanel.SelectingNodes);
_parsedInfoPanel.SetNode(_mainTreePanel.SelectingNodes.FirstOrDefault());
_inspectorPanel.SetNode(_mainTreePanel.SelectingNodes.FirstOrDefault());
}
}
#region Commands
private async void ScanDir()
{
var path = await _dirSelector.SelectFolderAsync();
@ -82,12 +125,33 @@ public partial class Main : Node
return;
}
_mainTreePanel.Scan(path);
FoldAll();
_refreshPanels = true;
}
private void DoParse()
{
// todo;
var root = _mainTreePanel.GetRoot();
if (root == null) return;
ItemParser parser = new NormalParser();
var queue = new Queue<TreeItem>();
queue.Enqueue(root);
while (queue.Count > 0)
{
var treeItem = queue.Dequeue();
foreach (var child in treeItem.GetChildren())
{
if(child == null) continue;
if (_mainTreePanel.Query(child, out var node))
{
parser.DoParse(node);
}
queue.Enqueue(child);
}
}
_mainTreePanel.UpdateColumns();
}
private const string DataPath = "data.json";
@ -95,14 +159,14 @@ public partial class Main : Node
private void DoSave()
{
_mainTreePanel.SaveData(DataPath);
Log("保存成功");
GD.Print("保存成功");
}
private void DoReset()
{
_mainTreePanel.ClearData();
_nodeInfoEditPanel.OnNodesChanged();
Log("清空成功");
GD.Print("清空成功");
}
#endregion

View File

@ -3,7 +3,7 @@
[ext_resource type="Script" uid="uid://dqs5segp8tixm" path="res://Utils/FileDirSelector.cs" id="1_d2g23"]
[ext_resource type="Script" uid="uid://bmepprx2mndih" path="res://Component/MainTreePanel.cs" id="2_44ud8"]
[ext_resource type="Script" uid="uid://biwhkhqrhpf6a" path="res://Main.cs" id="2_0727o"]
[ext_resource type="Script" uid="uid://bkx2esr711e68" path="res://Component/ParsedInfoPanel.cs" id="3_d2g23"]
[ext_resource type="Script" uid="uid://bl3kpjp1rfw8n" path="res://Component/InspectorPanel.cs" id="4_0727o"]
[ext_resource type="Script" uid="uid://bbgo6drfpvv2a" path="res://Component/NodeInfoEditPanel.cs" id="4_d2g23"]
[node name="Control" type="Control"]
@ -17,22 +17,26 @@ grow_vertical = 2
[node name="FileDirDialog" type="FileDialog" parent="."]
script = ExtResource("1_d2g23")
[node name="Main" type="Node" parent="." node_paths=PackedStringArray("_dirSelector", "_console", "_openDirButton", "_doParseButton", "_saveButton", "_resetButton", "_nodeInfoEditPanel", "_addKeyButton", "_removeKeyButton", "_parsedInfoPanel", "_mainTreePanel", "_columnText", "_addColumnButton", "_removeColumnButton")]
[node name="Main" type="Node" parent="." node_paths=PackedStringArray("_dirSelector", "_openDirButton", "_doParseButton", "_saveButton", "_resetButton", "_loadButton", "_nodeInfoEditPanel", "_addKeyButton", "_removeKeyButton", "_inspectorPanel", "_mainTreePanel", "_columnIndexText", "_columnText", "_addColumnButton", "_removeColumnButton", "_clearColumnButton", "_expandAllButton", "_foldAllButton")]
script = ExtResource("2_0727o")
_dirSelector = NodePath("../FileDirDialog")
_console = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/RichTextLabel")
_openDirButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/ScanDir")
_doParseButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/DoParse")
_saveButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/Save")
_resetButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer/Reset")
_openDirButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作/ScanDir")
_doParseButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作/DoParse")
_saveButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作/Save")
_resetButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作/Reset")
_loadButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作/Load")
_nodeInfoEditPanel = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/NodeEditPanel")
_addKeyButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/AddKey")
_removeKeyButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer/VBoxContainer/HBoxContainer/RemoveKey")
_parsedInfoPanel = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2/ParsedNodePanel")
_inspectorPanel = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2/InspectorPanel")
_mainTreePanel = NodePath("../MarginContainer/HSplitContainer/MainTreePanel")
_columnText = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer/ColunmText")
_addColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer/AddColumn")
_removeColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer/RemoveColumn")
_columnIndexText = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2/ColumnIndex")
_columnText = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer/ColunmText")
_addColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer/AddColumn")
_removeColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer/RemoveColumn")
_clearColumnButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/ClearColumns")
_expandAllButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/ExpandAll")
_foldAllButton = NodePath("../MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/FoldAll")
[node name="MarginContainer" type="MarginContainer" parent="."]
layout_mode = 1
@ -48,11 +52,11 @@ theme_override_constants/margin_bottom = 5
[node name="HSplitContainer" type="HSplitContainer" parent="MarginContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="MainTreePanel" type="Tree" parent="MarginContainer/HSplitContainer"]
custom_minimum_size = Vector2(600, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 7.0
allow_search = false
hide_root = true
select_mode = 2
@ -60,6 +64,8 @@ script = ExtResource("2_44ud8")
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/HSplitContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 3.0
[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer"]
layout_mode = 2
@ -69,60 +75,109 @@ size_flags_horizontal = 3
layout_mode = 2
title = "功能操作"
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4"]
[node name="VBoxContainer2" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4"]
layout_mode = 2
[node name="RichTextLabel" type="RichTextLabel" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer"]
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2"]
layout_mode = 2
[node name="TabContainer" type="TabContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2"]
custom_minimum_size = Vector2(0, 200)
layout_mode = 2
bbcode_enabled = true
current_tab = 0
[node name="HFlowContainer" type="HFlowContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer"]
[node name="文件夹操作" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer"]
layout_mode = 2
metadata/_tab_index = 0
[node name="ScanDir" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
[node name="ScanDir" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作"]
layout_mode = 2
size_flags_vertical = 4
text = "扫描文件夹"
[node name="DoParse" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
[node name="DoParse" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/文件夹操作"]
layout_mode = 2
size_flags_vertical = 4
text = "开始解析"
[node name="Save" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
[node name="保存操作" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer"]
visible = false
layout_mode = 2
text = "保存"
metadata/_tab_index = 1
[node name="Reset" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HFlowContainer"]
[node name="Save" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作"]
layout_mode = 2
text = "重置"
text = "保存树表"
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer"]
[node name="Load" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作"]
layout_mode = 2
text = "加载树表"
[node name="Reset" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/保存操作"]
layout_mode = 2
text = "重置树表"
[node name="树表操作" type="VBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer"]
visible = false
layout_mode = 2
metadata/_tab_index = 2
[node name="HBoxContainer2" type="HBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
layout_mode = 2
[node name="ColunmText" type="LineEdit" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer"]
[node name="Label2" type="Label" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2"]
layout_mode = 2
text = " 第"
[node name="ColumnIndex" type="LineEdit" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2"]
custom_minimum_size = Vector2(50, 0)
layout_mode = 2
[node name="Label3" type="Label" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer2"]
layout_mode = 2
text = "行"
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
layout_mode = 2
[node name="ColunmText" type="LineEdit" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer"]
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
size_flags_vertical = 0
[node name="AddColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer"]
[node name="AddColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer"]
layout_mode = 2
text = "显示"
size_flags_vertical = 0
text = "显示字段"
[node name="RemoveColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer/HBoxContainer"]
[node name="RemoveColumn" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作/HBoxContainer"]
layout_mode = 2
text = "隐藏"
size_flags_vertical = 0
text = "隐藏字段"
[node name="ClearColumns" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
layout_mode = 2
text = "清空字段"
[node name="ExpandAll" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
layout_mode = 2
text = "展开全部"
[node name="FoldAll" type="Button" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer4/VBoxContainer2/TabContainer/树表操作"]
layout_mode = 2
text = "折叠全部"
[node name="FoldableContainer2" type="FoldableContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2"]
layout_mode = 2
title = "解析数据"
title = "检查器"
[node name="ParsedNodePanel" type="Tree" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2" node_paths=PackedStringArray("_editPanel")]
[node name="InspectorPanel" type="Tree" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2/FoldableContainer2" node_paths=PackedStringArray("_editPanel")]
custom_minimum_size = Vector2(0, 300)
layout_mode = 2
allow_rmb_select = true
hide_root = true
select_mode = 1
script = ExtResource("3_d2g23")
script = ExtResource("4_0727o")
_editPanel = NodePath("../../FoldableContainer/VBoxContainer/NodeEditPanel")
[node name="FoldableContainer" type="FoldableContainer" parent="MarginContainer/HSplitContainer/ScrollContainer/VBoxContainer2"]

View File

@ -0,0 +1,49 @@
using System.Collections.Generic;
using System.IO;
using Learn.Models;
namespace Learn.Parsers;
public static class ItemFieldExtension
{
#region
public static string Name(this Item item)
{
var path = item.MainInfo["Path"];
return Path.GetFileName(path);
}
public static bool IsFolder(this Item item)
{
return item.MainInfo["IsDir"] == "True";
}
#endregion
public static void SetGroupIfNotExist(this Item item, string group)
{
item.Info.TryAdd("Group", group);
}
public static void SetTitleIfNotExist(this Item item, string title)
{
item.Info.TryAdd("Title", title);
}
public static void SetRawTitle(this Item item, string rawTitle)
{
item.Info.TryAdd("RawTitle", rawTitle);
}
public static string RawTitle(this Item item)
{
return item.Info["RawTitle"];
}
public static void SetSeasonIfNotExist(this Item item, string season)
{
item.Info.TryAdd("Season", season);
}
}

View File

@ -0,0 +1 @@
uid://fo70m114nwe7

19
Parsers/ItemParser.cs Normal file
View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
using Learn.Models;
namespace Learn.Parsers;
/// <summary>
/// 目标的解析字段:
/// "季度"
/// "剧名"
/// "发布组"
/// "集数"
/// "类型""额外内容", "字幕", "剧集"
/// "字幕语言"
/// "年份"
/// </summary>
public interface ItemParser
{
public bool DoParse(TreeNode node);
}

View File

@ -0,0 +1 @@
uid://d2o60ij0d4uhb

61
Parsers/NormalParser.cs Normal file
View File

@ -0,0 +1,61 @@
using System.Linq;
using System.Text.RegularExpressions;
using Learn.Models;
namespace Learn.Parsers;
public class NormalParser : ItemParser
{
private string ParseSeason(string season)
{
if (int.TryParse(season, out _)) return season;
switch (season)
{
case "零": return "0";
case "一": return "1";
case "二": return "2";
case "三": return "3";
case "四": return "4";
case "五": return "5";
case "六": return "6";
case "七": return "7";
case "八": return "8";
case "九": return "9";
}
return season;
}
public bool DoParse(TreeNode node)
{
var item = node.Info;
var name = item.Name();
var matches = Regex.Matches(name, @"[^\[\]_]+").Select(match => match.Value).ToArray();
if (matches.Length == 1)
{
node.Info.SetRawTitle(matches[0]);
return true;
}
if (matches.Length >= 2)
{
node.Info.SetGroupIfNotExist(matches[0]);
var title = matches[1].Trim();
var match = Regex.Match(title, "(.+)第(.+)季");
if (match.Success)
{
node.Info.SetSeasonIfNotExist(ParseSeason(match.Groups[2].Value.Trim()));
node.Info.SetRawTitle(match.Groups[1].Value.Trim());
}
else
{
node.Info.SetRawTitle(title);
}
}
return true;
}
}

View File

@ -0,0 +1 @@
uid://bfixayy5gpwd6

View File

@ -1,35 +0,0 @@
using System.Collections.Generic;
using Learn.Models;
namespace Learn.Parsers;
/// <summary>
/// 目标的解析字段:
/// "季度"
/// "剧名"
/// "发布组"
/// "集数"
/// "类型""额外内容", "字幕", "剧集"
/// "字幕语言"
/// "年份"
/// </summary>
public static class ParseItemHelper
{
private static void ParseItem(Item item)
{
var info = item.Info;
if (info["IsDir"] == "True")
{
}
}
public static void DoParse(IEnumerable<TreeNode> nodes)
{
foreach (var node in nodes)
{
if (node.Info == null) continue;
ParseItem(node.Info);
}
}
}

View File

@ -1 +0,0 @@
uid://dbm2l6j6s1t7r

View File

@ -15,6 +15,11 @@ run/main_scene="res://MediaTreeEditor.tscn"
config/features=PackedStringArray("4.5", "C#", "Forward Plus")
config/icon="res://icon.svg"
[display]
window/size/viewport_width=1920
window/size/viewport_height=1080
[dotnet]
project/assembly_name="Learn"