From 78c9c35237513ab170e0d1e326d59635997fa6d4 Mon Sep 17 00:00:00 2001 From: Daniel Cumbor Date: Sun, 13 Jul 2025 19:41:41 +0100 Subject: [PATCH] Reupload to new git vps. --- .gitignore | 6 ++ dictionary_window.gd | 158 +++++++++++++++++++++++++++++++++++++++++++ plugin.cfg | 7 ++ plugin.gd | 13 ++++ 4 files changed, 184 insertions(+) create mode 100644 .gitignore create mode 100644 dictionary_window.gd create mode 100644 plugin.cfg create mode 100644 plugin.gd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d3b464 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.godot/ +.import/ + +*.uid +logs +*.log \ No newline at end of file diff --git a/dictionary_window.gd b/dictionary_window.gd new file mode 100644 index 0000000..74da470 --- /dev/null +++ b/dictionary_window.gd @@ -0,0 +1,158 @@ +@tool +extends AcceptDialog + +var source_file_path: String = "" +var regex = RegEx.new() + +func _ready(): + title = "Dictionary Processor" + size = Vector2(600, 700) + regex.compile("^[a-z]+$") + + var vbox = VBoxContainer.new() + add_child(vbox) + + vbox.add_child(_create_label("Source Dictionary", 14)) + var file_button = Button.new() + file_button.text = "Select File" + file_button.pressed.connect(_show_file_dialog) + vbox.add_child(file_button) + + vbox.add_child(_create_label("Filtering Options", 14)) + var grid = GridContainer.new() + grid.columns = 2 + vbox.add_child(grid) + + grid.add_child(Label.new()) + grid.get_child(-1).text = "Min Word Length" + var min_spinner = _create_spinner(1, 10, 3) + grid.add_child(min_spinner) + + grid.add_child(Label.new()) + grid.get_child(-1).text = "Max Word Length" + var max_spinner = _create_spinner(1, 15, 6) + grid.add_child(max_spinner) + + vbox.add_child(_create_label("Output Settings", 14)) + var output_container = HBoxContainer.new() + vbox.add_child(output_container) + + output_container.add_child(Label.new()) + output_container.get_child(-1).text = "Output File Name:" + + var output_field = LineEdit.new() + output_field.text = "FilteredDictionary" + output_field.size_flags_horizontal = Control.SIZE_EXPAND_FILL + output_container.add_child(output_field) + + var button_container = HBoxContainer.new() + vbox.add_child(button_container) + + var preview_button = Button.new() + preview_button.text = "Preview" + button_container.add_child(preview_button) + + var process_button = Button.new() + process_button.text = "Process & Save" + button_container.add_child(process_button) + + var stats_label = Label.new() + vbox.add_child(stats_label) + + vbox.add_child(_create_label("Preview (first 50 words)", 14)) + var preview_label = RichTextLabel.new() + preview_label.custom_minimum_size = Vector2(0, 200) + preview_label.size_flags_vertical = Control.SIZE_EXPAND_FILL + vbox.add_child(preview_label) + + preview_button.pressed.connect(func(): + var result = _process_file(min_spinner.value, max_spinner.value) + if result: + _display_results(result, stats_label, preview_label, false)) + + process_button.pressed.connect(func(): + var result = _process_file(min_spinner.value, max_spinner.value) + if result: + _save_results(result, output_field.text) + _display_results(result, stats_label, preview_label, true)) + +func _create_label(text: String, font_size: int = 0) -> Label: + var label = Label.new() + label.text = text + if font_size > 0: + label.add_theme_font_size_override("font_size", font_size) + return label + +func _create_spinner(min_val: float, max_val: float, default: float) -> SpinBox: + var spinner = SpinBox.new() + spinner.min_value = min_val + spinner.max_value = max_val + spinner.value = default + return spinner + +func _show_file_dialog(): + var dialog = FileDialog.new() + dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE + dialog.add_filter("*.txt", "Text Files") + dialog.file_selected.connect(func(path): + source_file_path = path + print("Selected dictionary file: ", path) + dialog.queue_free()) + dialog.canceled.connect(dialog.queue_free) + + EditorInterface.get_editor_main_screen().add_child(dialog) + dialog.popup_centered(Vector2i(800, 600)) + +func _process_file(min_len: int, max_len: int) -> Dictionary: + if source_file_path.is_empty(): + printerr("No source file selected") + return {} + + var file = FileAccess.open(source_file_path, FileAccess.READ) + if not file: + printerr("Failed to open file: " + source_file_path) + return {} + + var content = file.get_as_text() + file.close() + + var lines = content.split("\n") + var unique_words = {} + + for line in lines: + var word = line.strip_edges().to_lower() + if word.length() >= min_len and word.length() <= max_len and regex.search(word): + unique_words[word] = true + + var filtered: Array[String] = [] + filtered.assign(unique_words.keys()) + filtered.sort() + return {"original": lines.size(), "filtered": filtered} + +func _save_results(result: Dictionary, filename: String): + if not DirAccess.dir_exists_absolute("res://data/"): + DirAccess.open("res://").make_dir("data") + + var path = "res://data/" + filename + ".txt" + var file = FileAccess.open(path, FileAccess.WRITE) + if not file: + printerr("Failed to write output file") + return + + file.store_string("\n".join(result.filtered)) + file.close() + print("Dictionary processing complete: %d words saved to: %s" % [result.filtered.size(), path]) + +func _display_results(result: Dictionary, stats: Label, preview: RichTextLabel, saved: bool): + var percentage = float(result.filtered.size()) / float(result.original) * 100.0 if result.original > 0 else 0.0 + stats.text = "Original: %d words\nFiltered: %d words (%.1f%% kept)%s" % [ + result.original, + result.filtered.size(), + percentage, + " - Saved!" if saved else "" + ] + + var preview_text = "\n".join(result.filtered.slice(0, 50)) + if result.filtered.size() > 50: + preview_text += "\n... and %d more words" % (result.filtered.size() - 50) + preview.text = preview_text diff --git a/plugin.cfg b/plugin.cfg new file mode 100644 index 0000000..9c47de4 --- /dev/null +++ b/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Dictionary Processor" +description="Filter and process dictionary files" +author="Daniel Cumbor" +version="1.0" +script="plugin.gd" diff --git a/plugin.gd b/plugin.gd new file mode 100644 index 0000000..1940593 --- /dev/null +++ b/plugin.gd @@ -0,0 +1,13 @@ +@tool +extends EditorPlugin + +func _enter_tree(): + add_tool_menu_item("Dictionary Processor", show_dictionary_window) + +func _exit_tree(): + remove_tool_menu_item("Dictionary Processor") + +func show_dictionary_window(): + var window = preload("res://addons/dictionary_processor/dictionary_window.gd").new() + EditorInterface.get_editor_main_screen().add_child(window) + window.popup_centered(Vector2i(600, 700))