diff --git a/worldeditadditions/utils/strings/split_shell.lua b/worldeditadditions/utils/strings/split_shell.lua index 32d4d0d..cb9cab7 100644 --- a/worldeditadditions/utils/strings/split_shell.lua +++ b/worldeditadditions/utils/strings/split_shell.lua @@ -1,3 +1,4 @@ +-- worldeditadditions = { modpath="/home/sbrl/.minetest/worlds/Mod-Sandbox/worldmods/WorldEditAdditions/worldeditadditions/" } local table_map = dofile(worldeditadditions.modpath.."/utils/tables/table_map.lua") local function is_whitespace(char) @@ -21,6 +22,8 @@ local function split_shell(text) if i < text_length then nextchar = text:sub(i+1, i+1) end if i+1 < text_length then nextnextchar = text:sub(i+2, i+2) end + print("mode", mode, "prevchar", "curchar", curchar, "nextchar", nextchar) + if mode == "NORMAL" then if is_whitespace(curchar) and #acc > 0 then table.insert(result, table.concat(acc, "")) @@ -35,9 +38,10 @@ local function split_shell(text) table.insert(acc, curchar) end elseif mode == "INSIDE_QUOTES_DOUBLE" then - if curchar == "\"" and prevchar ~= "\\" and is_whitespace(nextchar) then + if curchar == "\"" and prevchar ~= "\\" and (is_whitespace(nextchar) or #nextchar == 0) then -- It's the end of a quote! mode = "NORMAL" + elseif (curchar == "\\" and ( nextchar ~= "\"" or (nextchar == "\"" and not is_whitespace(nextnextchar)) @@ -71,7 +75,7 @@ end return split_shell --- function test(text) +-- local function test(text) -- print("Source", text) -- for i,value in ipairs(split_shell(text)) do -- print("i", i, "→", value) @@ -80,6 +84,7 @@ return split_shell -- end -- -- test("yay yay yay") +-- test("dirt \"snow block\"") -- test("yay \"yay yay\" yay") -- test("yay \"yay\\\" yay\" yay") -- test("yay \"yay 'inside quotes' yay\\\"\" yay") diff --git a/worldeditadditions_commands/commands/bonemeal.lua b/worldeditadditions_commands/commands/bonemeal.lua index 088780f..505ae99 100644 --- a/worldeditadditions_commands/commands/bonemeal.lua +++ b/worldeditadditions_commands/commands/bonemeal.lua @@ -15,7 +15,7 @@ worldedit.register_command("bonemeal", { params_text = "1" end - local parts = worldeditadditions.split(params_text, "%s+", false) + local parts = worldeditadditions.split_shell(params_text, "%s+", false) local strength = 1 local chance = 1 diff --git a/worldeditadditions_commands/commands/convolve.lua b/worldeditadditions_commands/commands/convolve.lua index 609f86d..1ad1171 100644 --- a/worldeditadditions_commands/commands/convolve.lua +++ b/worldeditadditions_commands/commands/convolve.lua @@ -11,7 +11,8 @@ worldedit.register_command("convolve", { parse = function(params_text) if not params_text then params_text = "" end - local parts = worldeditadditions.split(params_text, "%s+", false) + -- local parts = worldeditadditions.split(params_text, "%s+", false) + local parts = worldeditadditions.split_shell(params_text) local kernel_name = "gaussian" local width = 5 diff --git a/worldeditadditions_commands/commands/ellipsoid.lua b/worldeditadditions_commands/commands/ellipsoid.lua index 97d3bfd..efa4ebf 100644 --- a/worldeditadditions_commands/commands/ellipsoid.lua +++ b/worldeditadditions_commands/commands/ellipsoid.lua @@ -5,7 +5,7 @@ -- ███████ ███████ ███████ ██ ██ ███████ ██████ ██ ██████ local wea = worldeditadditions local function parse_params_ellipsoid(params_text) - local parts = wea.split(params_text, "%s+", false) + local parts = wea.split_shell(params_text) if #parts < 4 then return false, "Error: Not enough arguments. Expected \" [h[ollow]]\"." diff --git a/worldeditadditions_commands/commands/forest.lua b/worldeditadditions_commands/commands/forest.lua index 14810f6..29167f9 100644 --- a/worldeditadditions_commands/commands/forest.lua +++ b/worldeditadditions_commands/commands/forest.lua @@ -18,7 +18,7 @@ worldedit.register_command("forest", { end local success, sapling_list = worldeditadditions.parse.weighted_nodes( - worldeditadditions.split(params_text, "%s+", false), + worldeditadditions.split_shell(params_text), false, function(name) return worldedit.normalize_nodename( diff --git a/worldeditadditions_commands/commands/layers.lua b/worldeditadditions_commands/commands/layers.lua index 28dd8da..ae09158 100644 --- a/worldeditadditions_commands/commands/layers.lua +++ b/worldeditadditions_commands/commands/layers.lua @@ -14,7 +14,7 @@ worldedit.register_command("layers", { end local success, node_list = worldeditadditions.parse.weighted_nodes( - worldeditadditions.split(params_text, "%s+", false), + worldeditadditions.split_shell(params_text), true ) return success, node_list diff --git a/worldeditadditions_commands/commands/maze.lua b/worldeditadditions_commands/commands/maze.lua index 48f626d..a02c7de 100644 --- a/worldeditadditions_commands/commands/maze.lua +++ b/worldeditadditions_commands/commands/maze.lua @@ -5,7 +5,7 @@ local function parse_params_maze(params_text, is_3d) return false, "No arguments specified" end - local parts = worldeditadditions.split(params_text, "%s+", false) + local parts = worldeditadditions.split_shell(params_text) local replace_node = parts[1] local seed = os.time() diff --git a/worldeditadditions_commands/commands/overlay.lua b/worldeditadditions_commands/commands/overlay.lua index ad0ddf5..e7f3d0f 100644 --- a/worldeditadditions_commands/commands/overlay.lua +++ b/worldeditadditions_commands/commands/overlay.lua @@ -10,7 +10,7 @@ worldedit.register_command("overlay", { require_pos = 2, parse = function(params_text) local success, node_list = worldeditadditions.parse.weighted_nodes( - worldeditadditions.split(params_text, "%s+", false) + worldeditadditions.split_shell(params_text) ) return success, node_list end, diff --git a/worldeditadditions_commands/commands/replacemix.lua b/worldeditadditions_commands/commands/replacemix.lua index 5eaa61a..085e596 100644 --- a/worldeditadditions_commands/commands/replacemix.lua +++ b/worldeditadditions_commands/commands/replacemix.lua @@ -15,7 +15,7 @@ worldedit.register_command("replacemix", { return false, "Error: No arguments specified" end - local parts = wea.split(params_text, "%s+", false) + local parts = wea.split_shell(params_text) local target_node = nil local target_node_chance = 1 diff --git a/worldeditadditions_commands/commands/scale.lua b/worldeditadditions_commands/commands/scale.lua index efebcaf..3076386 100644 --- a/worldeditadditions_commands/commands/scale.lua +++ b/worldeditadditions_commands/commands/scale.lua @@ -30,7 +30,7 @@ worldedit.register_command("scale", { parse = function(params_text) if not params_text then params_text = "" end - local parts = worldeditadditions.split(params_text, "%s+", false) + local parts = worldeditadditions.split_shell(params_text) local scale = vector.new(1, 1, 1) local anchor = vector.new(1, 1, 1) diff --git a/worldeditadditions_commands/commands/torus.lua b/worldeditadditions_commands/commands/torus.lua index 6131639..4ae2b5c 100644 --- a/worldeditadditions_commands/commands/torus.lua +++ b/worldeditadditions_commands/commands/torus.lua @@ -4,7 +4,7 @@ -- ██ ██ ██ ██ ██ ██ ██ ██ -- ██ ██████ ██ ██ ██████ ███████ local function parse_params_torus(params_text) - local parts = worldeditadditions.split(params_text, "%s+", false) + local parts = worldeditadditions.split_shell(params_text) if #parts < 1 then return false, "Error: No replace_node specified."