Module:GetJSON: Difference between revisions

From AlternateWiki
No edit summary
No edit summary
Tag: Manual revert
 
(3 intermediate revisions by the same user not shown)
(No difference)

Latest revision as of 18:43, 21 June 2024

Documentation for this module may be created at Module:GetJSON/doc

-- Create a Lua module named "p"
local p = {}

-- Define the main function of the module
p.main = function(frame)
    -- Create a local table "m" to store data
    local m = {}
    -- Load JSON data from the first argument passed to the module
    m.root = mw.loadJsonData(frame.args[1])
    
    -- Function to split a key string by "."
    local function splitKey(key)
        local keys = {}
        -- Split the key string by "."
        for subkey in string.gmatch(key, "([^%.]+)") do
            -- Insert each subkey into the keys table
            table.insert(keys, subkey)
        end
        return keys -- Return the keys table
    end
    
    -- Function to get the value from the nested table using keys
    local function getValueByKeys(root, keys)
        local value = root
        
        function pairsByKeys (t, f)
		      local a = {}
		      for n in pairs(t) do table.insert(a, n) end
		      table.sort(a, f)
		      local i = 0      -- iterator variable
		      local iter = function ()   -- iterator function
		        i = i + 1
		        if a[i] == nil then return nil
		        else return a[i], t[a[i]]
		        end
		      end
		      return iter
		end
        
        -- Iterate through each key
        for _, key in ipairs(keys) do
        	if key[0] == "#" then
        		keyval = tonumber(string.sub(key, 2))
        		i = 1
        		for name, line in pairsByKeys(value) do
        			if i == keyval then
        				return value[name]
        			end
        			i = i + 1
        		end
        	end
        	
            -- Check if the key is numeric
            if tonumber(key) then
                key = tonumber(key) -- Convert numeric key to number
            end
            
            -- Check if the value associated with the key is nil
            if value[key] == nil then
                return nil -- Return nil if value is nil
            end
            value = value[key] -- Update value to the nested table
        end

        -- If the value is a table and contains json_file and json_key
        if type(value) == "table" and value.json_file and value.json_key then
            -- Load JSON data from the specified file
            local newRoot = mw.loadJsonData(value.json_file)
            -- Split the json_key string
            local newKeys = splitKey(value.json_key)
            -- Recursively call this function with new data
            return getValueByKeys(newRoot, newKeys)
        end
        
        return value -- Return the final value
    end

    -- Split the key provided in the second argument
    local keys = splitKey(frame.args[2])
    -- Get the value from the nested table using the keys
    local value = getValueByKeys(m.root, keys)
    
    -- If the value is not nil
    if value ~= nil then
        -- If the value is a table
        if type(value) == "table" then
            -- If the fourth parameter is "keys"
            if frame.args[4] == "keys" then
                -- Return keys of the table
                local str = ""
                for k, _ in pairs(value) do
                    str = str .. k .. ";"
                end
                return frame:preprocess(str:sub(1, -2))
            else
                -- Return values of the table
                local str = ""
                for _, v in pairs(value) do
                    str = str .. v .. ";"
                end
                return frame:preprocess(str:sub(1, -2))
            end
        end
        return frame:preprocess(value) -- Return the value
    else
        -- If the third argument is not nil, return it
        if frame.args[3] ~= nil then
            return frame.args[3]
        else
            return "" -- Return an empty string if no value is found
        end
    end
end

-- Return the module table "p"
return p