]> git.lizzy.rs Git - worldedit.git/commitdiff
Improve node name normalization
authorsfan5 <sfan5@live.de>
Thu, 31 Aug 2017 18:38:38 +0000 (20:38 +0200)
committersfan5 <sfan5@live.de>
Thu, 31 Aug 2017 18:38:38 +0000 (20:38 +0200)
worldedit_commands/init.lua

index 61231c321b3b93fc497951d30e19a13d9a93af5c..897636cc332a9cc6e721bc645c7b4d9675458b58 100644 (file)
@@ -23,6 +23,7 @@ local function get_position(name) --position 1 retrieval function for when not u
        return pos1\r
 end\r
 \r
+-- normalize_nodename wrapper for convenience purposes\r
 local function get_node(name, nodename)\r
        local node = worldedit.normalize_nodename(nodename)\r
        if not node then\r
@@ -36,26 +37,46 @@ function worldedit.player_notify(name, message)
        minetest.chat_send_player(name, "WorldEdit -!- " .. message, false)\r
 end\r
 \r
---determines whether `nodename` is a valid node name, returning a boolean\r
+local function string_endswith(full, part)\r
+       return full:find(part, 1, true) == #full - #part + 1\r
+end\r
+\r
+-- normalizes node "description" `nodename`, returning a string (or nil)\r
 worldedit.normalize_nodename = function(nodename)\r
-       nodename = nodename:gsub("^%s*(.-)%s*$", "%1")\r
+       nodename = nodename:gsub("^%s*(.-)%s*$", "%1") -- strip spaces\r
        if nodename == "" then return nil end\r
-       local fullname = ItemStack({name=nodename}):get_name() --resolve aliases of node names to full names\r
-       if minetest.registered_nodes[fullname] or fullname == "air" then --directly found node name or alias of nodename\r
+\r
+       local fullname = ItemStack({name=nodename}):get_name() -- resolve aliases\r
+       if minetest.registered_nodes[fullname] or fullname == "air" then -- full name\r
                return fullname\r
        end\r
        for key, value in pairs(minetest.registered_nodes) do\r
-               if key:find(":" .. nodename, 1, true) then --found in mod\r
+               if string_endswith(key, ":" .. nodename) then -- matches name (w/o mod part)\r
                        return key\r
                end\r
        end\r
-       nodename = nodename:lower() --lowercase both for case insensitive comparison\r
+       nodename = nodename:lower() -- lowercase both for case insensitive comparison\r
        for key, value in pairs(minetest.registered_nodes) do\r
-               if value.description:lower() == nodename then --found in description\r
+               local desc = value.description:lower()\r
+               if desc == nodename then -- matches description\r
+                       return key\r
+               end\r
+               if string_endswith(desc, " block") and desc == nodename.." block" then\r
+                       -- fuzzy description match (e.g. "Steel" == "Steel Block")\r
                        return key\r
                end\r
        end\r
-       return nil\r
+\r
+       local match = nil\r
+       for key, value in pairs(minetest.registered_nodes) do\r
+               if value.description:lower():find(nodename, 1, true) ~= nil then\r
+                       if match ~= nil then\r
+                               return nil\r
+                       end\r
+                       match = key -- substring description match (only if no ambiguities)\r
+               end\r
+       end\r
+       return match\r
 end\r
 \r
 -- Determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1)\r