/
prettycjson.lua
50 lines (47 loc) · 1.12 KB
/
prettycjson.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
--prettycjson 1.5 from https://github.com/bungle/lua-resty-prettycjson.
--Copyright (c) 2015 — 2016, Aapo Talvensaari. BSD license.
local cjson = require'cjson.safe'
local cat = table.concat
local rep = string.rep
return function(dt, lf, id, ac)
local s, e = cjson.encode(dt)
if not s then return s, e end
lf, id, ac = lf or '\n', id or '\t', ac or ' '
local i, j, k, n, r, p, q = 1, 0, 0, #s, {}, nil, nil
local al = ac:sub(-1) == '\n'
for x = 1, n do
local c = s:sub(x, x)
if not q and (c == '{' or c == '[') then
r[i] = p == ':' and c..lf or rep(id, j)..c..lf
j = j + 1
elseif not q and (c == '}' or c == ']') then
j = j - 1
if p == '{' or p == '[' then
i = i - 1
r[i] = rep(id, j)..p..c
else
r[i] = lf..rep(id, j)..c
end
elseif not q and c == ',' then
r[i] = c..lf
k = -1
elseif not q and c == ':' then
r[i] = c..ac
if al then
i = i + 1
r[i] = rep(id, j)
end
else
if c == '\'' and p ~= '\\' then
q = not q and true or nil
end
if j ~= k then
r[i] = rep(id, j)
i, k = i + 1, j
end
r[i] = c
end
p, i = c, i + 1
end
return cat(r)
end