default stylua formatting

This commit is contained in:
2025-12-26 13:24:30 -05:00
parent 2798cd6553
commit e53cc17025
3 changed files with 711 additions and 641 deletions

View File

@@ -1,7 +1,7 @@
-- Module options: -- Module options:
local always_use_lpeg = false local always_use_lpeg = false
local register_global_module_table = false local register_global_module_table = false
local global_module_name = 'json' local global_module_name = "json"
--[==[ --[==[
@@ -47,8 +47,7 @@ local pairs, type, tostring, tonumber, getmetatable, setmetatable =
local error, require, pcall, select = error, require, pcall, select local error, require, pcall, select = error, require, pcall, select
local floor, huge = math.floor, math.huge local floor, huge = math.floor, math.huge
local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat = local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat =
string.rep, string.gsub, string.sub, string.byte, string.char, string.rep, string.gsub, string.sub, string.byte, string.char, string.find, string.len, string.format
string.find, string.len, string.format
local strmatch = string.match local strmatch = string.match
local concat = table.concat local concat = table.concat
@@ -69,24 +68,28 @@ local _ENV = nil -- blocking globals in Lua 5.2 and later
pcall(function() pcall(function()
-- Enable access to blocked metatables. -- Enable access to blocked metatables.
-- Don't worry, this module doesn't change anything in them. -- Don't worry, this module doesn't change anything in them.
local debmeta = require "debug".getmetatable local debmeta = require("debug").getmetatable
if debmeta then getmetatable = debmeta end if debmeta then
getmetatable = debmeta
end
end) end)
json.null = setmetatable({}, { json.null = setmetatable({}, {
__tojson = function () return "null" end __tojson = function()
return "null"
end,
}) })
local function isarray(tbl) local function isarray(tbl)
local max, n, arraylen = 0, 0, 0 local max, n, arraylen = 0, 0, 0
for k, v in pairs(tbl) do for k, v in pairs(tbl) do
if k == 'n' and type(v) == 'number' then if k == "n" and type(v) == "number" then
arraylen = v arraylen = v
if v > max then if v > max then
max = v max = v
end end
else else
if type(k) ~= 'number' or k < 1 or floor(k) ~= k then if type(k) ~= "number" or k < 1 or floor(k) ~= k then
return false return false
end end
if k > max then if k > max then
@@ -102,8 +105,13 @@ local function isarray (tbl)
end end
local escapecodes = { local escapecodes = {
["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f", ['"'] = '\\"',
["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t" ["\\"] = "\\\\",
["\b"] = "\\b",
["\f"] = "\\f",
["\n"] = "\\n",
["\r"] = "\\r",
["\t"] = "\\t",
} }
local function escapeutf8(uchar) local function escapeutf8(uchar)
@@ -149,7 +157,7 @@ end
local function quotestring(value) local function quotestring(value)
-- based on the regexp "escapable" in https://github.com/douglascrockford/JSON-js -- based on the regexp "escapable" in https://github.com/douglascrockford/JSON-js
value = fsub (value, "[%z\1-\31\"\\\127]", escapeutf8) value = fsub(value, '[%z\1-\31"\\\127]', escapeutf8)
if strfind(value, "[\194\216\220\225\226\239]") then if strfind(value, "[\194\216\220\225\226\239]") then
value = fsub(value, "\194[\128-\159\173]", escapeutf8) value = fsub(value, "\194[\128-\159\173]", escapeutf8)
value = fsub(value, "\216[\128-\132]", escapeutf8) value = fsub(value, "\216[\128-\132]", escapeutf8)
@@ -160,7 +168,7 @@ local function quotestring (value)
value = fsub(value, "\239\187\191", escapeutf8) value = fsub(value, "\239\187\191", escapeutf8)
value = fsub(value, "\239\191[\176-\191]", escapeutf8) value = fsub(value, "\239\191[\176-\191]", escapeutf8)
end end
return "\"" .. value .. "\"" return '"' .. value .. '"'
end end
json.quotestring = quotestring json.quotestring = quotestring
@@ -206,8 +214,7 @@ end
function json.addnewline(state) function json.addnewline(state)
if state.indent then if state.indent then
state.bufferlen = addnewline2 (state.level or 0, state.bufferlen = addnewline2(state.level or 0, state.buffer, state.bufferlen or #state.buffer)
state.buffer, state.bufferlen or #(state.buffer))
end end
end end
@@ -215,7 +222,7 @@ local encode2 -- forward declaration
local function addpair(key, value, prev, indent, level, buffer, buflen, tables, globalorder, state) local function addpair(key, value, prev, indent, level, buffer, buflen, tables, globalorder, state)
local kt = type(key) local kt = type(key)
if kt ~= 'string' and kt ~= 'number' then if kt ~= "string" and kt ~= "number" then
return nil, "type '" .. kt .. "' is not supported as a key by JSON." return nil, "type '" .. kt .. "' is not supported as a key by JSON."
end end
if prev then if prev then
@@ -236,7 +243,7 @@ end
local function appendcustom(res, buffer, state) local function appendcustom(res, buffer, state)
local buflen = state.bufferlen local buflen = state.bufferlen
if type (res) == 'string' then if type(res) == "string" then
buflen = buflen + 1 buflen = buflen + 1
buffer[buflen] = res buffer[buflen] = res
end end
@@ -251,7 +258,9 @@ local function exception(reason, value, state, buffer, buflen, defaultmessage)
else else
state.bufferlen = buflen state.bufferlen = buflen
local ret, msg = handler(reason, value, state, defaultmessage) local ret, msg = handler(reason, value, state, defaultmessage)
if not ret then return nil, msg or defaultmessage end if not ret then
return nil, msg or defaultmessage
end
return appendcustom(ret, buffer, state) return appendcustom(ret, buffer, state)
end end
end end
@@ -263,22 +272,24 @@ end
encode2 = function(value, indent, level, buffer, buflen, tables, globalorder, state) encode2 = function(value, indent, level, buffer, buflen, tables, globalorder, state)
local valtype = type(value) local valtype = type(value)
local valmeta = getmetatable(value) local valmeta = getmetatable(value)
valmeta = type (valmeta) == 'table' and valmeta -- only tables valmeta = type(valmeta) == "table" and valmeta -- only tables
local valtojson = valmeta and valmeta.__tojson local valtojson = valmeta and valmeta.__tojson
if valtojson then if valtojson then
if tables[value] then if tables[value] then
return exception('reference cycle', value, state, buffer, buflen) return exception("reference cycle", value, state, buffer, buflen)
end end
tables[value] = true tables[value] = true
state.bufferlen = buflen state.bufferlen = buflen
local ret, msg = valtojson(value, state) local ret, msg = valtojson(value, state)
if not ret then return exception('custom encoder failed', value, state, buffer, buflen, msg) end if not ret then
return exception("custom encoder failed", value, state, buffer, buflen, msg)
end
tables[value] = nil tables[value] = nil
buflen = appendcustom(ret, buffer, state) buflen = appendcustom(ret, buffer, state)
elseif value == nil then elseif value == nil then
buflen = buflen + 1 buflen = buflen + 1
buffer[buflen] = "null" buffer[buflen] = "null"
elseif valtype == 'number' then elseif valtype == "number" then
local s local s
if value ~= value or value >= huge or -value >= huge then if value ~= value or value >= huge or -value >= huge then
-- This is the behaviour of the original JSON implementation. -- This is the behaviour of the original JSON implementation.
@@ -288,20 +299,20 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
end end
buflen = buflen + 1 buflen = buflen + 1
buffer[buflen] = s buffer[buflen] = s
elseif valtype == 'boolean' then elseif valtype == "boolean" then
buflen = buflen + 1 buflen = buflen + 1
buffer[buflen] = value and "true" or "false" buffer[buflen] = value and "true" or "false"
elseif valtype == 'string' then elseif valtype == "string" then
buflen = buflen + 1 buflen = buflen + 1
buffer[buflen] = quotestring(value) buffer[buflen] = quotestring(value)
elseif valtype == 'table' then elseif valtype == "table" then
if tables[value] then if tables[value] then
return exception('reference cycle', value, state, buffer, buflen) return exception("reference cycle", value, state, buffer, buflen)
end end
tables[value] = true tables[value] = true
level = level + 1 level = level + 1
local isa, n = isarray(value) local isa, n = isarray(value)
if n == 0 and valmeta and valmeta.__jsontype == 'object' then if n == 0 and valmeta and valmeta.__jsontype == "object" then
isa = false isa = false
end end
local msg local msg
@@ -310,7 +321,9 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
buffer[buflen] = "[" buffer[buflen] = "["
for i = 1, n do for i = 1, n do
buflen, msg = encode2(value[i], indent, level, buffer, buflen, tables, globalorder, state) buflen, msg = encode2(value[i], indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end if not buflen then
return nil, msg
end
if i < n then if i < n then
buflen = buflen + 1 buflen = buflen + 1
buffer[buflen] = "," buffer[buflen] = ","
@@ -332,21 +345,27 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
if v ~= nil then if v ~= nil then
used[k] = true used[k] = true
buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end if not buflen then
return nil, msg
end
prev = true -- add a seperator before the next element prev = true -- add a seperator before the next element
end end
end end
for k, v in pairs(value) do for k, v in pairs(value) do
if not used[k] then if not used[k] then
buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end if not buflen then
return nil, msg
end
prev = true -- add a seperator before the next element prev = true -- add a seperator before the next element
end end
end end
else -- unordered else -- unordered
for k, v in pairs(value) do for k, v in pairs(value) do
buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state) buflen, msg = addpair(k, v, prev, indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end if not buflen then
return nil, msg
end
prev = true -- add a seperator before the next element prev = true -- add a seperator before the next element
end end
end end
@@ -358,8 +377,14 @@ encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, s
end end
tables[value] = nil tables[value] = nil
else else
return exception ('unsupported type', value, state, buffer, buflen, return exception(
"type '" .. valtype .. "' is not supported by JSON.") "unsupported type",
value,
state,
buffer,
buflen,
"type '" .. valtype .. "' is not supported by JSON."
)
end end
return buflen return buflen
end end
@@ -370,8 +395,16 @@ function json.encode (value, state)
local buffer = oldbuffer or {} local buffer = oldbuffer or {}
state.buffer = buffer state.buffer = buffer
updatedecpoint() updatedecpoint()
local ret, msg = encode2 (value, state.indent, state.level or 0, local ret, msg = encode2(
buffer, state.bufferlen or 0, state.tables or {}, state.keyorder, state) value,
state.indent,
state.level or 0,
buffer,
state.bufferlen or 0,
state.tables or {},
state.keyorder,
state
)
if not ret then if not ret then
error(msg, 2) error(msg, 2)
elseif oldbuffer == buffer then elseif oldbuffer == buffer then
@@ -406,17 +439,23 @@ end
local function scanwhite(str, pos) local function scanwhite(str, pos)
while true do while true do
pos = strfind(str, "%S", pos) pos = strfind(str, "%S", pos)
if not pos then return nil end if not pos then
return nil
end
local sub2 = strsub(str, pos, pos + 1) local sub2 = strsub(str, pos, pos + 1)
if sub2 == "\239\187" and strsub(str, pos + 2, pos + 2) == "\191" then if sub2 == "\239\187" and strsub(str, pos + 2, pos + 2) == "\191" then
-- UTF-8 Byte Order Mark -- UTF-8 Byte Order Mark
pos = pos + 3 pos = pos + 3
elseif sub2 == "//" then elseif sub2 == "//" then
pos = strfind(str, "[\n\r]", pos + 2) pos = strfind(str, "[\n\r]", pos + 2)
if not pos then return nil end if not pos then
return nil
end
elseif sub2 == "/*" then elseif sub2 == "/*" then
pos = strfind(str, "*/", pos + 2) pos = strfind(str, "*/", pos + 2)
if not pos then return nil end if not pos then
return nil
end
pos = pos + 2 pos = pos + 2
else else
return pos return pos
@@ -425,8 +464,14 @@ local function scanwhite (str, pos)
end end
local escapechars = { local escapechars = {
["\""] = "\"", ["\\"] = "\\", ["/"] = "/", ["b"] = "\b", ["f"] = "\f", ['"'] = '"',
["n"] = "\n", ["r"] = "\r", ["t"] = "\t" ["\\"] = "\\",
["/"] = "/",
["b"] = "\b",
["f"] = "\f",
["n"] = "\n",
["r"] = "\r",
["t"] = "\t",
} }
local function unichar(value) local function unichar(value)
@@ -435,17 +480,16 @@ local function unichar (value)
elseif value <= 0x007f then elseif value <= 0x007f then
return strchar(value) return strchar(value)
elseif value <= 0x07ff then elseif value <= 0x07ff then
return strchar (0xc0 + floor(value/0x40), return strchar(0xc0 + floor(value / 0x40), 0x80 + (floor(value) % 0x40))
0x80 + (floor(value) % 0x40))
elseif value <= 0xffff then elseif value <= 0xffff then
return strchar (0xe0 + floor(value/0x1000), return strchar(0xe0 + floor(value / 0x1000), 0x80 + (floor(value / 0x40) % 0x40), 0x80 + (floor(value) % 0x40))
0x80 + (floor(value/0x40) % 0x40),
0x80 + (floor(value) % 0x40))
elseif value <= 0x10ffff then elseif value <= 0x10ffff then
return strchar (0xf0 + floor(value/0x40000), return strchar(
0xf0 + floor(value / 0x40000),
0x80 + (floor(value / 0x1000) % 0x40), 0x80 + (floor(value / 0x1000) % 0x40),
0x80 + (floor(value / 0x40) % 0x40), 0x80 + (floor(value / 0x40) % 0x40),
0x80 + (floor(value) % 0x40)) 0x80 + (floor(value) % 0x40)
)
else else
return nil return nil
end end
@@ -455,7 +499,7 @@ local function scanstring (str, pos)
local lastpos = pos + 1 local lastpos = pos + 1
local buffer, n = {}, 0 local buffer, n = {}, 0
while true do while true do
local nextpos = strfind (str, "[\"\\]", lastpos) local nextpos = strfind(str, '["\\]', lastpos)
if not nextpos then if not nextpos then
return unterminated(str, "string", pos) return unterminated(str, "string", pos)
end end
@@ -463,7 +507,7 @@ local function scanstring (str, pos)
n = n + 1 n = n + 1
buffer[n] = strsub(str, lastpos, nextpos - 1) buffer[n] = strsub(str, lastpos, nextpos - 1)
end end
if strsub (str, nextpos, nextpos) == "\"" then if strsub(str, nextpos, nextpos) == '"' then
lastpos = nextpos + 1 lastpos = nextpos + 1
break break
else else
@@ -517,36 +561,48 @@ local scanvalue -- forward declaration
local function scantable(what, closechar, str, startpos, nullval, objectmeta, arraymeta) local function scantable(what, closechar, str, startpos, nullval, objectmeta, arraymeta)
local tbl, n = {}, 0 local tbl, n = {}, 0
local pos = startpos + 1 local pos = startpos + 1
if what == 'object' then if what == "object" then
setmetatable(tbl, objectmeta) setmetatable(tbl, objectmeta)
else else
setmetatable(tbl, arraymeta) setmetatable(tbl, arraymeta)
end end
while true do while true do
pos = scanwhite(str, pos) pos = scanwhite(str, pos)
if not pos then return unterminated (str, what, startpos) end if not pos then
return unterminated(str, what, startpos)
end
local char = strsub(str, pos, pos) local char = strsub(str, pos, pos)
if char == closechar then if char == closechar then
return tbl, pos + 1 return tbl, pos + 1
end end
local val1, err local val1, err
val1, pos, err = scanvalue(str, pos, nullval, objectmeta, arraymeta) val1, pos, err = scanvalue(str, pos, nullval, objectmeta, arraymeta)
if err then return nil, pos, err end if err then
return nil, pos, err
end
pos = scanwhite(str, pos) pos = scanwhite(str, pos)
if not pos then return unterminated (str, what, startpos) end if not pos then
return unterminated(str, what, startpos)
end
char = strsub(str, pos, pos) char = strsub(str, pos, pos)
if char == ":" then if char == ":" then
if val1 == nil then if val1 == nil then
return nil, pos, "cannot use nil as table index (at " .. loc(str, pos) .. ")" return nil, pos, "cannot use nil as table index (at " .. loc(str, pos) .. ")"
end end
pos = scanwhite(str, pos + 1) pos = scanwhite(str, pos + 1)
if not pos then return unterminated (str, what, startpos) end if not pos then
return unterminated(str, what, startpos)
end
local val2 local val2
val2, pos, err = scanvalue(str, pos, nullval, objectmeta, arraymeta) val2, pos, err = scanvalue(str, pos, nullval, objectmeta, arraymeta)
if err then return nil, pos, err end if err then
return nil, pos, err
end
tbl[val1] = val2 tbl[val1] = val2
pos = scanwhite(str, pos) pos = scanwhite(str, pos)
if not pos then return unterminated (str, what, startpos) end if not pos then
return unterminated(str, what, startpos)
end
char = strsub(str, pos, pos) char = strsub(str, pos, pos)
else else
n = n + 1 n = n + 1
@@ -566,10 +622,10 @@ scanvalue = function (str, pos, nullval, objectmeta, arraymeta)
end end
local char = strsub(str, pos, pos) local char = strsub(str, pos, pos)
if char == "{" then if char == "{" then
return scantable ('object', "}", str, pos, nullval, objectmeta, arraymeta) return scantable("object", "}", str, pos, nullval, objectmeta, arraymeta)
elseif char == "[" then elseif char == "[" then
return scantable ('array', "]", str, pos, nullval, objectmeta, arraymeta) return scantable("array", "]", str, pos, nullval, objectmeta, arraymeta)
elseif char == "\"" then elseif char == '"' then
return scanstring(str, pos) return scanstring(str, pos)
else else
local pstart, pend = strfind(str, "^%-?[%d%.]+[eE]?[%+%-]?%d*", pos) local pstart, pend = strfind(str, "^%-?[%d%.]+[eE]?[%+%-]?%d*", pos)
@@ -598,7 +654,7 @@ local function optionalmetatables(...)
if select("#", ...) > 0 then if select("#", ...) > 0 then
return ... return ...
else else
return {__jsontype = 'object'}, {__jsontype = 'array'} return { __jsontype = "object" }, { __jsontype = "array" }
end end
end end
@@ -610,8 +666,8 @@ end
function json.use_lpeg() function json.use_lpeg()
local g = require("lpeg") local g = require("lpeg")
if type(g.version) == 'function' and g.version() == "0.11" then if type(g.version) == "function" and g.version() == "0.11" then
error "due to a bug in LPeg 0.11, it cannot be used for JSON matching" error("due to a bug in LPeg 0.11, it cannot be used for JSON matching")
end end
local pegmatch = g.match local pegmatch = g.match
@@ -633,16 +689,16 @@ function json.use_lpeg ()
return ErrorCall(str, pos - 1, "unterminated " .. what, state) return ErrorCall(str, pos - 1, "unterminated " .. what, state)
end end
local SingleLineComment = P"//" * (1 - S"\n\r")^0 local SingleLineComment = P("//") * (1 - S("\n\r")) ^ 0
local MultiLineComment = P"/*" * (1 - P"*/")^0 * P"*/" local MultiLineComment = P("/*") * (1 - P("*/")) ^ 0 * P("*/")
local Space = (S" \n\r\t" + P"\239\187\191" + SingleLineComment + MultiLineComment)^0 local Space = (S(" \n\r\t") + P("\239\187\191") + SingleLineComment + MultiLineComment) ^ 0
local function ErrUnterminated(what) local function ErrUnterminated(what)
return g.Cmt(g.Cc(what) * g.Carg(2), ErrorUnterminatedCall) return g.Cmt(g.Cc(what) * g.Carg(2), ErrorUnterminatedCall)
end end
local PlainChar = 1 - S"\"\\\n\r" local PlainChar = 1 - S('"\\\n\r')
local EscapeSequence = (P"\\" * g.C (S"\"\\/bfnrt" + Err "unsupported escape sequence")) / escapechars local EscapeSequence = (P("\\") * g.C(S('"\\/bfnrt') + Err("unsupported escape sequence"))) / escapechars
local HexDigit = R("09", "af", "AF") local HexDigit = R("09", "af", "AF")
local function UTF16Surrogate(match, pos, high, low) local function UTF16Surrogate(match, pos, high, low)
high, low = tonumber(high, 16), tonumber(low, 16) high, low = tonumber(high, 16), tonumber(low, 16)
@@ -655,15 +711,15 @@ function json.use_lpeg ()
local function UTF16BMP(hex) local function UTF16BMP(hex)
return unichar(tonumber(hex, 16)) return unichar(tonumber(hex, 16))
end end
local U16Sequence = (P"\\u" * g.C (HexDigit * HexDigit * HexDigit * HexDigit)) local U16Sequence = (P("\\u") * g.C(HexDigit * HexDigit * HexDigit * HexDigit))
local UnicodeEscape = g.Cmt(U16Sequence * U16Sequence, UTF16Surrogate) + U16Sequence / UTF16BMP local UnicodeEscape = g.Cmt(U16Sequence * U16Sequence, UTF16Surrogate) + U16Sequence / UTF16BMP
local Char = UnicodeEscape + EscapeSequence + PlainChar local Char = UnicodeEscape + EscapeSequence + PlainChar
local String = P"\"" * (g.Cs (Char ^ 0) * P"\"" + ErrUnterminated "string") local String = P('"') * (g.Cs(Char ^ 0) * P('"') + ErrUnterminated("string"))
local Integer = P"-"^(-1) * (P"0" + (R"19" * R"09"^0)) local Integer = P("-") ^ -1 * (P("0") + (R("19") * R("09") ^ 0))
local Fractal = P"." * R"09"^0 local Fractal = P(".") * R("09") ^ 0
local Exponent = (S"eE") * (S"+-")^(-1) * R"09"^1 local Exponent = (S("eE")) * (S("+-")) ^ -1 * R("09") ^ 1
local Number = (Integer * Fractal^(-1) * Exponent^(-1))/str2num local Number = (Integer * Fractal ^ -1 * Exponent ^ -1) / str2num
local Constant = P"true" * g.Cc (true) + P"false" * g.Cc (false) + P"null" * g.Carg (1) local Constant = P("true") * g.Cc(true) + P("false") * g.Cc(false) + P("null") * g.Carg(1)
local SimpleValue = Number + String + Constant local SimpleValue = Number + String + Constant
local ArrayContent, ObjectContent local ArrayContent, ObjectContent
@@ -676,15 +732,15 @@ function json.use_lpeg ()
local t, nt = {}, 0 local t, nt = {}, 0
repeat repeat
obj, cont, npos = pegmatch(ArrayContent, str, pos, nullval, state) obj, cont, npos = pegmatch(ArrayContent, str, pos, nullval, state)
if cont == 'end' then if cont == "end" then
return ErrorUnterminatedCall(str, start, "array", state) return ErrorUnterminatedCall(str, start, "array", state)
end end
pos = npos pos = npos
if cont == 'cont' or cont == 'last' then if cont == "cont" or cont == "last" then
nt = nt + 1 nt = nt + 1
t[nt] = obj t[nt] = obj
end end
until cont ~= 'cont' until cont ~= "cont"
return pos, setmetatable(t, state.arraymeta) return pos, setmetatable(t, state.arraymeta)
end end
@@ -695,27 +751,34 @@ function json.use_lpeg ()
local t = {} local t = {}
repeat repeat
key, obj, cont, npos = pegmatch(ObjectContent, str, pos, nullval, state) key, obj, cont, npos = pegmatch(ObjectContent, str, pos, nullval, state)
if cont == 'end' then if cont == "end" then
return ErrorUnterminatedCall(str, start, "object", state) return ErrorUnterminatedCall(str, start, "object", state)
end end
pos = npos pos = npos
if cont == 'cont' or cont == 'last' then if cont == "cont" or cont == "last" then
t[key] = obj t[key] = obj
end end
until cont ~= 'cont' until cont ~= "cont"
return pos, setmetatable(t, state.objectmeta) return pos, setmetatable(t, state.objectmeta)
end end
local Array = P"[" * g.Cmt (g.Carg(1) * g.Carg(2), parsearray) local Array = P("[") * g.Cmt(g.Carg(1) * g.Carg(2), parsearray)
local Object = P"{" * g.Cmt (g.Carg(1) * g.Carg(2), parseobject) local Object = P("{") * g.Cmt(g.Carg(1) * g.Carg(2), parseobject)
local Value = Space * (Array + Object + SimpleValue) local Value = Space * (Array + Object + SimpleValue)
local ExpectedValue = Value + Space * Err "value expected" local ExpectedValue = Value + Space * Err("value expected")
local ExpectedKey = String + Err "key expected" local ExpectedKey = String + Err("key expected")
local End = P(-1) * g.Cc'end' local End = P(-1) * g.Cc("end")
local ErrInvalid = Err "invalid JSON" local ErrInvalid = Err("invalid JSON")
ArrayContent = (Value * Space * (P"," * g.Cc'cont' + P"]" * g.Cc'last'+ End + ErrInvalid) + g.Cc(nil) * (P"]" * g.Cc'empty' + End + ErrInvalid)) * g.Cp() ArrayContent = (
local Pair = g.Cg (Space * ExpectedKey * Space * (P":" + Err "colon expected") * ExpectedValue) Value * Space * (P(",") * g.Cc("cont") + P("]") * g.Cc("last") + End + ErrInvalid)
ObjectContent = (g.Cc(nil) * g.Cc(nil) * P"}" * g.Cc'empty' + End + (Pair * Space * (P"," * g.Cc'cont' + P"}" * g.Cc'last' + End + ErrInvalid) + ErrInvalid)) * g.Cp() + g.Cc(nil) * (P("]") * g.Cc("empty") + End + ErrInvalid)
) * g.Cp()
local Pair = g.Cg(Space * ExpectedKey * Space * (P(":") + Err("colon expected")) * ExpectedValue)
ObjectContent = (
g.Cc(nil) * g.Cc(nil) * P("}") * g.Cc("empty")
+ End
+ (Pair * Space * (P(",") * g.Cc("cont") + P("}") * g.Cc("last") + End + ErrInvalid) + ErrInvalid)
) * g.Cp()
local DecodeValue = ExpectedValue * g.Cp() local DecodeValue = ExpectedValue * g.Cp()
jsonlpeg.version = json.version jsonlpeg.version = json.version
@@ -738,7 +801,9 @@ function json.use_lpeg ()
end end
-- cache result of this function: -- cache result of this function:
json.use_lpeg = function () return jsonlpeg end json.use_lpeg = function()
return jsonlpeg
end
jsonlpeg.use_lpeg = json.use_lpeg jsonlpeg.use_lpeg = json.use_lpeg
return jsonlpeg return jsonlpeg
@@ -749,4 +814,3 @@ if always_use_lpeg then
end end
return json return json

View File

@@ -4,7 +4,8 @@ local M = {}
M.__index = M M.__index = M
function M.fes(header, footer) function M.fes(header, footer)
local config = {} local site_config = {} local config = {}
local site_config = {}
local fes_mod = package.loaded.fes local fes_mod = package.loaded.fes
if fes_mod and fes_mod.config then if fes_mod and fes_mod.config then
config = fes_mod.config config = fes_mod.config
@@ -311,7 +312,7 @@ em, i { font-style: italic; }
</body> </body>
</html> </html>
]], ]],
parts = {} parts = {},
} }
return setmetatable(self, M) return setmetatable(self, M)
@@ -336,7 +337,11 @@ function M:build()
local header = self.header local header = self.header
header = header:gsub("{{TITLE}}", self.title or "Document") header = header:gsub("{{TITLE}}", self.title or "Document")
local favicon_html = self.favicon and ('<link rel="icon" type="image/x-icon" href="' .. self.favicon .. '">') local favicon_html = self.favicon and ('<link rel="icon" type="image/x-icon" href="' .. self.favicon .. '">')
header = header:gsub("{{FAVICON}}", favicon_html or [[<link rel="icon" href="data:image/svg+xml,<svg xmlns=%%22http://www.w3.org/2000/svg%%22 viewBox=%%220 0 100 100%%22><text y=%%22.9em%%22 font-size=%%2290%%22>🔥</text></svg>">]]) header = header:gsub(
"{{FAVICON}}",
favicon_html
or [[<link rel="icon" href="data:image/svg+xml,<svg xmlns=%%22http://www.w3.org/2000/svg%%22 viewBox=%%220 0 100 100%%22><text y=%%22.9em%%22 font-size=%%2290%%22>🔥</text></svg>">]]
)
local footer = self.footer:gsub("{{COPYRIGHT}}", self.copyright or "&#169; The Copyright Holder") local footer = self.footer:gsub("{{COPYRIGHT}}", self.copyright or "&#169; The Copyright Holder")
return header .. table.concat(self.parts, "\n") .. footer return header .. table.concat(self.parts, "\n") .. footer
end end

View File

@@ -19,29 +19,29 @@ end
function M.a(link, str) function M.a(link, str)
link = link or "https://example.com" link = link or "https://example.com"
str = str or link str = str or link
return "<a href=\"" .. link .. "\">" .. str .. "</a>" return '<a href="' .. link .. '">' .. str .. "</a>"
end end
function M.ha(link, str) function M.ha(link, str)
link = link or "https://example.com" link = link or "https://example.com"
str = str or link str = str or link
return "<a class=\"hidden\" href=\"" .. link .. "\">" .. str .. "</a>" return '<a class="hidden" href="' .. link .. '">' .. str .. "</a>"
end end
function M.external(link, str) function M.external(link, str)
return "<a target=\"_blank\" href=\"" .. link .. "\">" .. str .. "</a>" return '<a target="_blank" href="' .. link .. '">' .. str .. "</a>"
end end
function M.note(str) function M.note(str)
return '<div class="note">' .. str .. '</div>' return '<div class="note">' .. str .. "</div>"
end end
function M.muted(str) function M.muted(str)
return '<div class="muted">' .. str .. '</div>' return '<div class="muted">' .. str .. "</div>"
end end
function M.callout(str) function M.callout(str)
return '<div class="callout">' .. str .. '</div>' return '<div class="callout">' .. str .. "</div>"
end end
function M.h1(str) function M.h1(str)
@@ -55,7 +55,8 @@ end
function M.h3(str) function M.h3(str)
return "<h3>" .. (str or "") .. "</h3>" return "<h3>" .. (str or "") .. "</h3>"
end end
function M.h4(str) return "<h4>" .. (str or "") .. "</h4>" function M.h4(str)
return "<h4>" .. (str or "") .. "</h4>"
end end
function M.h5(str) function M.h5(str)