Открыть меню
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Модуль:Специальные утилиты

Материал из Create Wiki

Для документации этого модуля может быть создана страница Модуль:Специальные утилиты/doc

local p = {}

-- Пытается загрузить данные из модуля, возвращает nil в случае ошибки.
-- Предпочтительнее, чем чтение дорогостоящего свойства mw.title.exists
function p.tryLoadData(moduleName)
	local success, data = pcall(
		function()
			return mw.loadData(moduleName)
		end
	)
	return success and data or nil
end

-- Аналог tryLoadData для JSON-страниц
function p.tryLoadJsonData(moduleName)
	local success, data = pcall(
		function()
			return mw.loadJsonData(moduleName)
		end
	)
	return success and data or nil
end

-- Объединяет список с материнской таблицей,
-- либо добавляет туда строку или дочернюю таблицу
function p.mergeList(parentTable, content)
    local i = #parentTable + 1
    if content[1] then
        -- Добавить все элементы списка в таблицу
        for _, v in ipairs(content) do
            parentTable[i] = v
            i = i + 1
        end
    else
        -- Добавлить строку либо таблицу в материнскую таблицу
        parentTable[i] = content
    end
end

-- Добавление именованных значений, с обработкой повторяющихся ключей
local function tryInsertKey(thetable, key, value, strict)
	local try = 1
	local inserted = false
	local _key = key
	repeat
		if thetable[_key] == nil then
			table.insert(thetable, _key, value)
			inserted = true
		else
			if strict then
				error("Ключ " .. key .. " встречается в нескольких таблицах при том, что их обработка здесь была запрещена.")
			else
				try = try + 1
				_key = key .. try
			end
		end
	until inserted
end

-- Объединяет несколько таблиц вместе.
function p.jointables(tables, strict)
	local newt = {}
	
	if #tables == 1 then
		return tables[1]
	elseif #tables == 0 then
		return {}
	end
	
	if strict == nil then
		strict = false
	end
	
	for i, t in ipairs(tables) do
		if type(t) == 'table' then
			for k, v in pairs(t) do
				if type(k) == 'number' then
					table.insert(newt, v)
				else
					tryInsertKey(newt, k, v, strict)
				end
			end
		else
			error("Среди таблиц обнаружен объект, таблицей не являющейся.")
		end
	end
	
	return newt
end

return p
Сайт использует Cookie для нормальной работы