Skip to content

Commit 86ae7b3

Browse files
committed
Update json.lua from pending pull request
rxi/json.lua#52
1 parent 2e56476 commit 86ae7b3

File tree

1 file changed

+33
-25
lines changed

1 file changed

+33
-25
lines changed

src/resources/pandoc/datadir/_json.lua

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
--
77
-- includes unreleased upstream changes: https://github.com/rxi/json.lua/blob/dbf4b2dd2eb7c23be2773c89eb059dadd6436f94/json.lua
88
-- includes unmerged upstream pull request: https://github.com/rxi/json.lua/pull/51
9+
-- includes unmerged upstream pull request: https://github.com/rxi/json.lua/pull/52
910
--
1011
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
1112
-- this software and associated documentation files (the "Software"), to deal in
@@ -74,6 +75,9 @@ local function encode_nil(val)
7475
return "null"
7576
end
7677

78+
local function encode_string(val)
79+
return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
80+
end
7781

7882
local function encode_table(val, stack)
7983
local res = {}
@@ -84,44 +88,48 @@ local function encode_table(val, stack)
8488

8589
stack[val] = true
8690

87-
if rawget(val, 1) ~= nil or next(val) == nil then
88-
-- Treat as array -- check keys are valid and it is not sparse
89-
local n = 0
91+
if next(val) == nil then
92+
return '[]'
93+
end
94+
95+
local types = {}
96+
97+
for k in pairs(val) do
98+
types[type(k)] = true
99+
end
100+
101+
if #types > 1 then
102+
error("invalid table: mixed or invalid key types")
103+
elseif types["number"] then
104+
-- Treat as array
105+
local max_key = 0
90106
for k in pairs(val) do
91-
if type(k) ~= "number" then
92-
error("invalid table: mixed or invalid key types")
107+
if k > max_key then
108+
max_key = k
93109
end
94-
n = n + 1
95-
end
96-
if n ~= #val then
97-
error("invalid table: sparse array")
98110
end
99-
-- Encode
100-
for i, v in ipairs(val) do
101-
table.insert(res, encode(v, stack))
111+
for i = 1, max_key do
112+
if val[i] == nil then
113+
table.insert(res, "null")
114+
else
115+
local v = encode(val[i], stack)
116+
table.insert(res, v)
117+
end
102118
end
103119
stack[val] = nil
104120
return "[" .. table.concat(res, ",") .. "]"
105-
106-
else
107-
-- Treat as an object
121+
elseif types["string"] then
122+
-- Treat as object
108123
for k, v in pairsByKeys(val) do
109-
if type(k) ~= "string" then
110-
error("invalid table: mixed or invalid key types")
111-
end
112-
table.insert(res, encode(k, stack) .. ":" .. encode(v, stack))
124+
table.insert(res, encode_string(k) .. ":" .. encode(v, stack))
113125
end
114126
stack[val] = nil
115127
return "{" .. table.concat(res, ",") .. "}"
128+
else
129+
error( string.format("invalid table: unsupported key type %s", types[1]) )
116130
end
117131
end
118132

119-
120-
local function encode_string(val)
121-
return '"' .. val:gsub('[%z\1-\31\\"]', escape_char) .. '"'
122-
end
123-
124-
125133
local function encode_number(val)
126134
-- Check for NaN, -inf and inf
127135
if val ~= val or val <= -math.huge or val >= math.huge then

0 commit comments

Comments
 (0)