From 2e7c67b0ef4367db33fe4d7095158d33991524b0 Mon Sep 17 00:00:00 2001 From: lucastucious Date: Thu, 17 Jul 2025 17:52:00 +0200 Subject: [PATCH] Adding FormatOnSave --- Addons/SimpleFormatOnSave/LICENSE.txt | 21 +++ Addons/SimpleFormatOnSave/formatter.gd | 10 ++ Addons/SimpleFormatOnSave/formatter.gd.uid | 1 + Addons/SimpleFormatOnSave/icon.png | Bin 0 -> 31339 bytes Addons/SimpleFormatOnSave/icon.png.import | 40 +++++ Addons/SimpleFormatOnSave/plugin.cfg | 7 + .../SimpleFormatOnSave/rules/blank_lines.gd | 64 ++++++++ .../rules/blank_lines.gd.uid | 1 + Addons/SimpleFormatOnSave/rules/spacing.gd | 155 ++++++++++++++++++ .../SimpleFormatOnSave/rules/spacing.gd.uid | 1 + .../simple_format_on_save.gd | 82 +++++++++ .../simple_format_on_save.gd.uid | 1 + 12 files changed, 383 insertions(+) create mode 100644 Addons/SimpleFormatOnSave/LICENSE.txt create mode 100644 Addons/SimpleFormatOnSave/formatter.gd create mode 100644 Addons/SimpleFormatOnSave/formatter.gd.uid create mode 100644 Addons/SimpleFormatOnSave/icon.png create mode 100644 Addons/SimpleFormatOnSave/icon.png.import create mode 100644 Addons/SimpleFormatOnSave/plugin.cfg create mode 100644 Addons/SimpleFormatOnSave/rules/blank_lines.gd create mode 100644 Addons/SimpleFormatOnSave/rules/blank_lines.gd.uid create mode 100644 Addons/SimpleFormatOnSave/rules/spacing.gd create mode 100644 Addons/SimpleFormatOnSave/rules/spacing.gd.uid create mode 100644 Addons/SimpleFormatOnSave/simple_format_on_save.gd create mode 100644 Addons/SimpleFormatOnSave/simple_format_on_save.gd.uid diff --git a/Addons/SimpleFormatOnSave/LICENSE.txt b/Addons/SimpleFormatOnSave/LICENSE.txt new file mode 100644 index 0000000..933cadc --- /dev/null +++ b/Addons/SimpleFormatOnSave/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025-present VitSoonYoung - + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Addons/SimpleFormatOnSave/formatter.gd b/Addons/SimpleFormatOnSave/formatter.gd new file mode 100644 index 0000000..dbde166 --- /dev/null +++ b/Addons/SimpleFormatOnSave/formatter.gd @@ -0,0 +1,10 @@ +class_name Formatter + +const RuleSpacing = preload("./rules/spacing.gd") +const RuleBlankLines = preload("./rules/blank_lines.gd") + + +func format_code(code: String) -> String: + code = RuleSpacing.apply(code) + code = RuleBlankLines.apply(code) + return code diff --git a/Addons/SimpleFormatOnSave/formatter.gd.uid b/Addons/SimpleFormatOnSave/formatter.gd.uid new file mode 100644 index 0000000..b666797 --- /dev/null +++ b/Addons/SimpleFormatOnSave/formatter.gd.uid @@ -0,0 +1 @@ +uid://clqnxlippxlm4 diff --git a/Addons/SimpleFormatOnSave/icon.png b/Addons/SimpleFormatOnSave/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..909a17700b82be3c746d7e55804c2b643d18339f GIT binary patch literal 31339 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 literal 0 HcmV?d00001 diff --git a/Addons/SimpleFormatOnSave/icon.png.import b/Addons/SimpleFormatOnSave/icon.png.import new file mode 100644 index 0000000..0249f50 --- /dev/null +++ b/Addons/SimpleFormatOnSave/icon.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cv42njjkdhl2l" +path="res://.godot/imported/icon.png-c0076118964b028971c5407cf9f25f2c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Addons/SimpleFormatOnSave/icon.png" +dest_files=["res://.godot/imported/icon.png-c0076118964b028971c5407cf9f25f2c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Addons/SimpleFormatOnSave/plugin.cfg b/Addons/SimpleFormatOnSave/plugin.cfg new file mode 100644 index 0000000..d7d61a9 --- /dev/null +++ b/Addons/SimpleFormatOnSave/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Simple Format On Save" +description="Combination of simple gdscript formatter & Format On Save with extra rules for beatiful formatting...maybe" +author="VitSoonYoung" +version="0.1" +script="simple_format_on_save.gd" diff --git a/Addons/SimpleFormatOnSave/rules/blank_lines.gd b/Addons/SimpleFormatOnSave/rules/blank_lines.gd new file mode 100644 index 0000000..4107400 --- /dev/null +++ b/Addons/SimpleFormatOnSave/rules/blank_lines.gd @@ -0,0 +1,64 @@ +class_name RuleBlankLines + +var FORMAT_ACTION := "simple_format_on_save/format_code" +var format_key: InputEventKey + + +static func apply(code: String) -> String: + var trim1_regex = RegEx.create_from_string("\n{2,}") + code = trim1_regex.sub(code, "\n\n", true) + code = _blank_for_func_class(code) + var trim2_regex = RegEx.create_from_string("\n{3,}") + code = trim2_regex.sub(code, "\n\n\n", true) + return code + + +static func _blank_for_func_class(code: String) -> String: + var assignment_regex = RegEx.create_from_string(r".*=.*") + var statement_regex = RegEx.create_from_string(r"\s+(if|for|while|match)[\s|\(].*") + var misc_statement_regex = RegEx.create_from_string(r"\s+(else|elif|\}|\]).*") + var func_class_regex = RegEx.create_from_string(r".*(func|class) .*") + var comment_line_regex = RegEx.create_from_string(r"^\s*#") + var empty_line_regex = RegEx.create_from_string(r"^\s+$") + var lines := code.split('\n') + var modified_lines: Array[String] = [] + + for line: String in lines: + # Spaces between functions & classes + if func_class_regex.search(line): + if modified_lines.size() > 0: + var i := modified_lines.size() - 1 + + while i > 0 and comment_line_regex.search(modified_lines[i]): + i -= 1 + + if i == 0: + modified_lines.append(line) + continue + + modified_lines.insert(i + 1, "") + modified_lines.insert(i + 1, "") + + # 1 space between assignment & statement + if statement_regex.search(line): + if modified_lines.size() > 0: + var i := modified_lines.size() - 1 + + if assignment_regex.search(modified_lines[i]) and not statement_regex.search(modified_lines[i]) and not statement_regex.search(line): + modified_lines.insert(i + 1, "") + else: + pass + + # Space after a code block (Doesn't work with spaces for now) + var indent_count := line.count("\t") + + if indent_count and not misc_statement_regex.search(line) and not statement_regex.search(line): + if modified_lines.size() > 0: + var i := modified_lines.size() - 1 + + if modified_lines[i].count("\t") > indent_count: + modified_lines.insert(i + 1, "") + + modified_lines.append(line) + + return "\n".join(modified_lines) diff --git a/Addons/SimpleFormatOnSave/rules/blank_lines.gd.uid b/Addons/SimpleFormatOnSave/rules/blank_lines.gd.uid new file mode 100644 index 0000000..452523a --- /dev/null +++ b/Addons/SimpleFormatOnSave/rules/blank_lines.gd.uid @@ -0,0 +1 @@ +uid://dr266abkfhg1o diff --git a/Addons/SimpleFormatOnSave/rules/spacing.gd b/Addons/SimpleFormatOnSave/rules/spacing.gd new file mode 100644 index 0000000..e0326f2 --- /dev/null +++ b/Addons/SimpleFormatOnSave/rules/spacing.gd @@ -0,0 +1,155 @@ +class_name RuleSpacing + +const SYMBOLS = [ + r"\*\*=", + r"\*\*", + "<<=", + ">>=", + "<<", + ">>", + "==", + "!=", + ">=", + "<=", + "&&", + r"\|\|", + r"\+=", + "-=", + r"\*=", + "/=", + "%=", + "&=", + r"\^=", + r"\|=", + "~=", + ":=", + "->", + r"&", + r"\|", + r"\^", + "-", + r"\+", + "/", + r"\*", + ">", + "<", + "-", + "%", + "=", + ":", + ",", +]; +const KEYWORDS = [ + "and", + "is", + "or", + "not", +] + + +static func apply(code: String) -> String: + var string_regex = RegEx.new() + string_regex.compile(r'(? String: + var indent_regex = RegEx.create_from_string(r"^\s{4}") + var new_code = indent_regex.sub(code, "\t", true) + + while (code != new_code): + code = new_code + new_code = indent_regex.sub(code, "\t", true) + + var symbols_regex = "(" + ") | (".join(SYMBOLS) + ")" + symbols_regex = " * ?(" + symbols_regex + ") * " + var symbols_operator_regex = RegEx.create_from_string(symbols_regex) + code = symbols_operator_regex.sub(code, " $1 ", true) + + # ": =" => ":=" + code = RegEx.create_from_string(r": *=").sub(code, ":=", true) + + # "a(" => "a (" + code = RegEx.create_from_string(r"(?<=[\w\)\]]) *([\(:,])(?!=)").sub(code, "$1", true) + + # "( a" => "(a" + code = RegEx.create_from_string(r"([\(\{}]) *").sub(code, "$1", true) + + # "a )" => "a)" + code = RegEx.create_from_string(r" *([\)\}])").sub(code, "$1", true) + + # "if(" => "if (" + code = RegEx.create_from_string(r"\b(if|for|while|switch|match)\(").sub(code, "$1 (", true) + + var keywoisrd_regex = r"|".join(KEYWORDS) + var keyword_operator_regex = RegEx.create_from_string(r"(?<=[ \)\]])(" + keywoisrd_regex + r")(?=[ \(\[])") + code = keyword_operator_regex.sub(code, " $1 ", true) + + # tab "a\t=" => "a =" + code = RegEx.create_from_string(r"(\t*. * ?)\t * ").sub(code, "$1", true) + + #trim + code = RegEx.create_from_string("[ \t]*\n").sub(code, "\n", true) + + # " " => " " + code = RegEx.create_from_string(" +").sub(code, " ", true) + + # "= -a" => "= -a" + code = RegEx.create_from_string(r"([=,(] ?)- ").sub(code, "$1-", true) + + return code + + +static func _replace(text: String, what: String, forwhat: String) -> String: + var index := text.find(what) + + if index != -1: + text = text.substr(0, index) + forwhat + text.substr(index + what.length()) + + return text diff --git a/Addons/SimpleFormatOnSave/rules/spacing.gd.uid b/Addons/SimpleFormatOnSave/rules/spacing.gd.uid new file mode 100644 index 0000000..5b6c307 --- /dev/null +++ b/Addons/SimpleFormatOnSave/rules/spacing.gd.uid @@ -0,0 +1 @@ +uid://wfodrj6vpfb6 diff --git a/Addons/SimpleFormatOnSave/simple_format_on_save.gd b/Addons/SimpleFormatOnSave/simple_format_on_save.gd new file mode 100644 index 0000000..2164754 --- /dev/null +++ b/Addons/SimpleFormatOnSave/simple_format_on_save.gd @@ -0,0 +1,82 @@ +@tool +extends EditorPlugin + +var FORMAT_ACTION := "simple_format_on_save/format_code" +var format_key: InputEventKey +var formatter: Formatter + + +func _enter_tree(): + add_tool_menu_item("Format (Ctrl+Alt+L)", _on_format_code) + + if InputMap.has_action(FORMAT_ACTION): + InputMap.erase_action(FORMAT_ACTION) + + InputMap.add_action(FORMAT_ACTION) + format_key = InputEventKey.new() + format_key.keycode = KEY_L + format_key.ctrl_pressed = true + format_key.alt_pressed = true + InputMap.action_add_event(FORMAT_ACTION, format_key) + resource_saved.connect(on_resource_saved) + + +func _exit_tree(): + remove_tool_menu_item("Format (Ctrl+Alt+L)") + InputMap.erase_action(FORMAT_ACTION) + resource_saved.disconnect(on_resource_saved) + + +# Return true if formatted code != original code +func _on_format_code() -> bool: + var current_editor := EditorInterface.get_script_editor().get_current_editor() + + if not (current_editor and current_editor.is_class("ScriptTextEditor")): + return false + + var text_edit = current_editor.get_base_editor() + var code = text_edit.text + + if not formatter: + formatter = Formatter.new() + + var formatted_code = formatter.format_code(code) + + if not formatted_code: + return false + + if code.length() == formatted_code.length() and code == formatted_code: + return false + + var scroll_horizontal = text_edit.scroll_horizontal + var scroll_vertical = text_edit.scroll_vertical + var caret_column = text_edit.get_caret_column(0) + var caret_line = text_edit.get_caret_line(0) + + text_edit.text = formatted_code + text_edit.set_caret_line(caret_line) + text_edit.set_caret_column(caret_column) + text_edit.scroll_horizontal = scroll_horizontal + text_edit.scroll_vertical = scroll_vertical + + return true + + +func _shortcut_input(event: InputEvent) -> void: + if event is InputEventKey and event.is_pressed(): + if Input.is_action_pressed(FORMAT_ACTION): + _on_format_code() + + +# CALLED WHEN A SCRIPT IS SAVED +func on_resource_saved(resource: Resource): + if resource is Script: + var script: Script = resource + var current_script = get_editor_interface().get_script_editor().get_current_script() + + # Prevents other unsaved scripts from overwriting the active one + if current_script == script: + var is_modified: bool = _on_format_code() + + #if is_modified: + #print_rich("[color=#636363]Auto formatted code[/color]") diff --git a/Addons/SimpleFormatOnSave/simple_format_on_save.gd.uid b/Addons/SimpleFormatOnSave/simple_format_on_save.gd.uid new file mode 100644 index 0000000..a8e28ce --- /dev/null +++ b/Addons/SimpleFormatOnSave/simple_format_on_save.gd.uid @@ -0,0 +1 @@ +uid://b6d7va37k5131