Модуль:SP7Tags

Материал из Аэропро.Вики
Версия от 17:50, 29 декабря 2025; Dimok911 (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

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

local p = {}

-- split "ПБЗ, давление; расход" -> {"ПБЗ","давление","расход"}
local function split_tags(s)
	if not s or s == "" then return {} end
	-- унифицируем разделители: ; и переносы -> ,
	s = mw.ustring.gsub(s, "[;\n\r]+", ",")
	local out = {}
	for part in mw.ustring.gmatch(s, "([^,]+)") do
		part = mw.text.trim(part)
		if part ~= "" then
			table.insert(out, part)
		end
	end
	return out
end

-- Сохраняет теги (вызывает шаблон ТегСП7 для каждого тега)
function p.store(frame)
	local args = frame.args
	local num  = mw.text.trim(args.num or "")
	local tags = args.tags or ""

	if num == "" then
		return ""
	end

	local list = split_tags(tags)
	if #list == 0 then
		return ""
	end

	local chunks = {}
	for _, tag in ipairs(list) do
		tag = mw.text.trim(tag)
		table.insert(chunks, string.format("{{ТегСП7|num=%s|tag=%s}}",
			mw.text.nowiki(num),
			mw.text.nowiki(tag)
		))
	end

	-- Выполнить сгенерированные вызовы шаблонов
	-- ВАЖНО: соединяем пробелом, чтобы не было абзацев
	return frame:preprocess(table.concat(chunks, " "))
end

-- Возвращает список тегов как ссылки вида ?tag=...
function p.links(frame)
	local num = mw.text.trim(frame.args.num or "")
	local base = frame.args.base or mw.title.getCurrentTitle().prefixedText
	if num == "" then return "" end

	local cargo = mw.ext.cargo
	local rows = cargo.query('sp7_letter_tags', 'tag', {
		where = 'num="' .. num .. '"',
		orderBy = 'tag'
	})

	local seen, out = {}, {}
	for _, r in ipairs(rows) do
		local tag = mw.text.trim(r.tag or "")
		if tag ~= "" and not seen[tag] then
			seen[tag] = true
			local url = base .. "?tag=" .. mw.uri.encode(tag)
			table.insert(out, string.format("[[%s|%s]]", url, tag))
		end
	end

	return table.concat(out, ", ")
end

return p