From f5145d6ba13aaf48a8bf10c8cef7d1a8ea6f2708 Mon Sep 17 00:00:00 2001
From: Anthony Zhang <azhang9@gmail.com>
Date: Sat, 20 Apr 2013 20:28:21 -0400
Subject: Horrible, vile, disgusting hack. But it works.

---
 worldedit/serialization.lua | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

(limited to 'worldedit/serialization.lua')

diff --git a/worldedit/serialization.lua b/worldedit/serialization.lua
index cc3297e..985e3d7 100644
--- a/worldedit/serialization.lua
+++ b/worldedit/serialization.lua
@@ -214,7 +214,22 @@ worldedit.deserialize = function(originpos, value)
 			count = count + 1
 		end
 	elseif version == 4 then --current nested table format
-		local nodes = minetest.deserialize(value)
+		--wip: this is a filthy hack that works surprisingly well
+		value = value:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1)
+		local escaped = value:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]+\")", function(s) return string.rep("@", #s) end)
+		local startpos, startpos1, endpos = 1, 1
+		local nodes = {}
+		while true do
+			startpos, endpos = escaped:find("},%s*{", startpos)
+			if not startpos then
+				break
+			end
+			local current = value:sub(startpos1, startpos)
+			table.insert(nodes, minetest.deserialize("return " .. current))
+			startpos, startpos1 = endpos, endpos
+		end
+
+		--local nodes = minetest.deserialize(value) --wip: this is broken for larger tables in the current version of LuaJIT
 		count = #nodes
 		for index = 1, count do
 			local entry = nodes[index]
-- 
cgit v1.2.3