Siirry sisältöön

Moduuli:json-apu

Wikisanakirjasta

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:json-apu/ohje

local p = {}

local function escape(str)
	--str = string.gsub(str, '(.)', function (c) return string.byte(c) .. " " end)
	--str = string.gsub(str, '"', '\\"')
	--str = string.gsub(str, '\n', 'NL')
	--str = string.gsub(str, '(%W)', function (c) return "[" .. string.byte(c) .. "]" end)
	str = string.gsub(str, '<', '&lt;')
	str = string.gsub(str, '>', '&gt;')
	str = string.gsub(str, '%[%[(.*)%]%]', '&91;&91;%1&93;&93;')
	str = string.gsub(str, '%[(.*)%]', '&91;%1&93;')
	return mw.text.jsonEncode(str)
end

local function getUnnamedParams(frm)
   local regular = {}

   for i, v in ipairs(frm.args) do
      table.insert(regular, '' .. escape(frm:preprocess(v)) .. '');
   end

   return regular
end

local function getNamedParams(frm)
   local named = {}

    for k, v in pairs(frm.args) do
        if ( not tonumber(k) and k ~= "ohje" ) then
          table.insert(named, '' .. escape(k) ..':' .. escape(frm:preprocess(v)) .. '')  
        end
    end
    
    return named
end
   
function p.FormatObject(frame)
   local named   = getNamedParams(frame)
   local regular = getUnnamedParams(frame)


    if #regular > 0 then
       return error("Ylimääräisiä nimettömiä parametreja: " .. regular[1] .. "...")
    end
    
    return '{' .. table.concat(named, ',') .. '}'
end

function p.PFormatObject(frame)
	local pframe   = frame:getParent()
	local named    = getNamedParams(pframe)
	local listname = frame.args.list
	local regular  = getUnnamedParams(pframe)

    if #regular > 0 and not listname then
       return error("List-parametri puuttuu")
    end
    
    if listname then
       table.insert(named, '' .. escape(listname) .. ':[' .. table.concat(regular, ',') .. ']')
    end
    
    return '{' .. table.concat(named, ',') .. '}'
end

function p.FormatList(frame)
   local regular = getUnnamedParams(frame)
   local named   = getNamedParams(frame)

   if #named > 0 then
      error("Ylimääräisiä parametreja: " .. named[1] .. "...")
   end

    return '[' .. table.concat(regular, ',') .. ']'
end

function p.PFormatList(frame)
   local pframe = frame:getParent()

   if not pframe then
      return error("Ei kutstuttu mallineesta")
   end
   
   -- Varmistetaan, ettei turhia parametreja ole annettu.
   if frame.args.list then
      return error("Ylimääräinen list-parametri")
   end

   return p.FormatList(pframe)
end

return p