@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