From 1ea41c7ac6c06eaa36c1c117684488786d5fd8e3 Mon Sep 17 00:00:00 2001 From: Face <69168154+face-hh@users.noreply.github.com> Date: Sat, 9 Aug 2025 13:28:24 +0300 Subject: [PATCH] fix - setAttribute, getAttribute --- flumi/Scripts/Utils/Lua/DOM.gd | 105 ++++++++++++++++++++++---- flumi/Scripts/Utils/Lua/ThreadedVM.gd | 2 +- flumi/Scripts/Utils/SelectorUtils.gd | 2 +- 3 files changed, 93 insertions(+), 16 deletions(-) diff --git a/flumi/Scripts/Utils/Lua/DOM.gd b/flumi/Scripts/Utils/Lua/DOM.gd index f3880f9..ecbcddf 100644 --- a/flumi/Scripts/Utils/Lua/DOM.gd +++ b/flumi/Scripts/Utils/Lua/DOM.gd @@ -477,36 +477,42 @@ static func create_element_wrapper(vm: LuauVM, element: HTMLParser.HTMLElement, static func add_element_methods(vm: LuauVM, lua_api: LuaAPI) -> void: vm.set_meta("lua_api", lua_api) - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_on_wrapper"), "element.on") + vm.lua_pushcallable(LuaDOMUtils._element_on_wrapper, "element.on") vm.lua_setfield(-2, "on") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_append_wrapper"), "element.append") + vm.lua_pushcallable(LuaDOMUtils._element_append_wrapper, "element.append") vm.lua_setfield(-2, "append") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_set_text_wrapper"), "element.setText") + vm.lua_pushcallable(LuaDOMUtils._element_set_text_wrapper, "element.setText") vm.lua_setfield(-2, "setText") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_remove_wrapper"), "element.remove") + vm.lua_pushcallable(LuaDOMUtils._element_remove_wrapper, "element.remove") vm.lua_setfield(-2, "remove") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_insert_before_wrapper"), "element.insertBefore") + vm.lua_pushcallable(LuaDOMUtils._element_insert_before_wrapper, "element.insertBefore") vm.lua_setfield(-2, "insertBefore") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_insert_after_wrapper"), "element.insertAfter") + vm.lua_pushcallable(LuaDOMUtils._element_insert_after_wrapper, "element.insertAfter") vm.lua_setfield(-2, "insertAfter") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_replace_wrapper"), "element.replace") + vm.lua_pushcallable(LuaDOMUtils._element_replace_wrapper, "element.replace") vm.lua_setfield(-2, "replace") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_clone_wrapper"), "element.clone") + vm.lua_pushcallable(LuaDOMUtils._element_clone_wrapper, "element.clone") vm.lua_setfield(-2, "clone") + + vm.lua_pushcallable(LuaDOMUtils._element_get_attribute_wrapper, "element.getAttribute") + vm.lua_setfield(-2, "getAttribute") + + vm.lua_pushcallable(LuaDOMUtils._element_set_attribute_wrapper, "element.setAttribute") + vm.lua_setfield(-2, "setAttribute") _add_classlist_support(vm, lua_api) vm.lua_newtable() - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_index_wrapper"), "element.__index") + vm.lua_pushcallable(LuaDOMUtils._element_index_wrapper, "element.__index") vm.lua_setfield(-2, "__index") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_element_newindex_wrapper"), "element.__newindex") + vm.lua_pushcallable(LuaDOMUtils._element_newindex_wrapper, "element.__newindex") vm.lua_setfield(-2, "__newindex") vm.lua_setmetatable(-2) @@ -538,7 +544,7 @@ static func _element_on_wrapper(vm: LuauVM) -> int: vm.lua_pushinteger(subscription_id) vm.lua_setfield(-2, "_subscription_id") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_unsubscribe_wrapper"), "subscription.unsubscribe") + vm.lua_pushcallable(LuaDOMUtils._unsubscribe_wrapper, "subscription.unsubscribe") vm.lua_setfield(-2, "unsubscribe") return 1 @@ -743,6 +749,77 @@ static func _element_clone_wrapper(vm: LuauVM) -> int: vm.lua_pushnil() return 1 +static func _element_get_attribute_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + vm.lua_pushnil() + return 1 + + # Get element ID from self table + vm.luaL_checktype(1, vm.LUA_TTABLE) # element + var attribute_name: String = vm.luaL_checkstring(2) # attribute name + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + # Find the element + var element: HTMLParser.HTMLElement = null + if element_id == "body": + element = lua_api.dom_parser.find_first("body") + else: + element = lua_api.dom_parser.find_by_id(element_id) + + if not element: + vm.lua_pushnil() + return 1 + + # Get the attribute value + var attribute_value = element.get_attribute(attribute_name) + if attribute_value.is_empty(): + vm.lua_pushnil() + else: + vm.lua_pushstring(attribute_value) + + return 1 + +static func _element_set_attribute_wrapper(vm: LuauVM) -> int: + var lua_api = vm.get_meta("lua_api") as LuaAPI + if not lua_api: + return 0 + + # Get element ID from self table + vm.luaL_checktype(1, vm.LUA_TTABLE) # element + var attribute_name: String = vm.luaL_checkstring(2) # attribute name + var attribute_value: String = vm.luaL_checkstring(3) # attribute value + + vm.lua_getfield(1, "_element_id") + var element_id: String = vm.lua_tostring(-1) + vm.lua_pop(1) + + # Find the element + var element: HTMLParser.HTMLElement = null + if element_id == "body": + element = lua_api.dom_parser.find_first("body") + else: + element = lua_api.dom_parser.find_by_id(element_id) + + if not element: + return 0 + + # Handle removing attribute when value is empty + if attribute_value == "": + element.attributes.erase(attribute_name) + else: + element.set_attribute(attribute_name, attribute_value) + + # Trigger visual update by calling init() again for DOM nodes (must be on main thread) + var dom_node = lua_api.dom_parser.parse_result.dom_nodes.get(element_id, null) + if dom_node and dom_node.has_method("init"): + dom_node.call_deferred("init", element, lua_api.dom_parser) + + return 0 + static func _element_index_wrapper(vm: LuauVM) -> int: vm.luaL_checktype(1, vm.LUA_TTABLE) var key: String = vm.luaL_checkstring(2) @@ -820,13 +897,13 @@ static func _add_classlist_support(vm: LuauVM, lua_api: LuaAPI) -> void: vm.lua_setfield(-2, "_element_id") # Store it in classList table # Add classList methods - vm.lua_pushcallable(Callable(LuaDOMUtils, "_classlist_add_wrapper"), "classList.add") + vm.lua_pushcallable(LuaDOMUtils._classlist_add_wrapper, "classList.add") vm.lua_setfield(-2, "add") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_classlist_remove_wrapper"), "classList.remove") + vm.lua_pushcallable(LuaDOMUtils._classlist_remove_wrapper, "classList.remove") vm.lua_setfield(-2, "remove") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_classlist_toggle_wrapper"), "classList.toggle") + vm.lua_pushcallable(LuaDOMUtils._classlist_toggle_wrapper, "classList.toggle") vm.lua_setfield(-2, "toggle") # Set classList on the element diff --git a/flumi/Scripts/Utils/Lua/ThreadedVM.gd b/flumi/Scripts/Utils/Lua/ThreadedVM.gd index b99a58c..520d7e1 100644 --- a/flumi/Scripts/Utils/Lua/ThreadedVM.gd +++ b/flumi/Scripts/Utils/Lua/ThreadedVM.gd @@ -474,7 +474,7 @@ func _threaded_body_on_handler(vm: LuauVM) -> int: vm.lua_pushinteger(subscription_id) vm.lua_setfield(-2, "_subscription_id") - vm.lua_pushcallable(Callable(LuaDOMUtils, "_unsubscribe_wrapper"), "subscription.unsubscribe") + vm.lua_pushcallable(LuaDOMUtils._unsubscribe_wrapper, "subscription.unsubscribe") vm.lua_setfield(-2, "unsubscribe") return 1 diff --git a/flumi/Scripts/Utils/SelectorUtils.gd b/flumi/Scripts/Utils/SelectorUtils.gd index 2f7860b..04327e4 100644 --- a/flumi/Scripts/Utils/SelectorUtils.gd +++ b/flumi/Scripts/Utils/SelectorUtils.gd @@ -25,4 +25,4 @@ static func find_first_matching(selector: String, elements: Array[HTMLParser.HTM if match_element(selector, element): return element - return null \ No newline at end of file + return null