Dlaždice: Porovnání verzí

Z Wiki JU
Ofara (diskuse | příspěvky)
založena nová stránka s textem „-- Module:Dlaždice -- Zjistí, pro koho je cílová stránka zamčená: najde v jejím wikitextu všechny -- kategorie končící na " (skryté)" a vrátí hotový odznak (zámek + názvy skupin). -- Použití: {{#invoke:Dlaždice|odznak|odkaz=Útvar personální/K nástupu}} local p = {} local SUFFIX = ' (skryté)' -- Odstraní části wikitextu, ve kterých se kategorie nepočítají. local function stripIgnored(text) text = text:gsub('<!%-%-.-%…“
 
Ofara (diskuse | příspěvky)
Bez shrnutí editace
Řádek 2: Řádek 2:
-- Zjistí, pro koho je cílová stránka zamčená: najde v jejím wikitextu všechny
-- Zjistí, pro koho je cílová stránka zamčená: najde v jejím wikitextu všechny
-- kategorie končící na " (skryté)" a vrátí hotový odznak (zámek + názvy skupin).
-- kategorie končící na " (skryté)" a vrátí hotový odznak (zámek + názvy skupin).
-- Použití: {{#invoke:Dlaždice|odznak|odkaz=Útvar personální/K nástupu}}
-- Použití: {{#invoke:Dlaždice|odznaky|odkaz=Útvar personální/K nástupu|odznak=…}}
local p = {}
local p = {}


local SUFFIX = ' (skryté)'
local SUFFIX = ' (skryté)'
local LOGIN = 'Po přihlášení'


-- Odstraní části wikitextu, ve kterých se kategorie nepočítají.
-- Odstraní části wikitextu, ve kterých se kategorie nepočítají.
Řádek 36: Řádek 37:
end
end


function p.odznak(frame)
-- Vrátí seznam skupin cílové stránky (prázdný, když stránka není zamčená / neexistuje).
local args = frame.args
local function groupsForTarget(target)
local target = mw.text.trim(args.odkaz or '')
-- externí odkazy a prázdný odkaz neřešíme
-- externí odkazy a prázdný odkaz neřešíme
if target == '' or mw.ustring.lower(mw.ustring.sub(target, 1, 4)) == 'http' then
if target == '' or mw.ustring.lower(mw.ustring.sub(target, 1, 4)) == 'http' then
return ''
return {}
end
end
local title = mw.title.new(target)
local title = mw.title.new(target)
if not title or not title.exists then
if not title or not title.exists then
return ''
return {}
end
end
-- jedno přesměrování následujeme
-- jedno přesměrování následujeme
Řádek 54: Řádek 53:
local content = title:getContent()
local content = title:getContent()
if not content then
if not content then
return ''
return {}
end
return groupsOf(content)
end
 
local function badge(html, extraClass, tooltip)
return '<span class="dlazdice-odznak' .. (extraClass and (' ' .. extraClass) or '') .. '"'
.. (tooltip and (' title="' .. tooltip .. '"') or '') .. '>' .. html .. '</span>'
end
 
-- Poskládá odznaky dlaždice (pod sebou):
--  1. „Po přihlášení“ (automaticky, jen když stránka je zamčená a ruční odznak
--      už není přesně „Po přihlášení“),
--  2. 🔒 skupiny z kategorií „… (skryté)“,
--  3. ruční odznak (parametr odznak), pokud je zadán a není to „Po přihlášení“.
-- Když je ruční odznak „Po přihlášení“, zobrazí se na místě automatického (1).
-- Parametry: odkaz, odznak
function p.odznaky(frame)
local args = frame.args
local manual = mw.text.trim(args.odznak or '')
local groups = groupsForTarget(mw.text.trim(args.odkaz or ''))
local locked = #groups > 0
local manualIsLogin = mw.ustring.lower(manual) == mw.ustring.lower(LOGIN)
 
local parts = {}
if manualIsLogin then
table.insert(parts, badge(manual))
elseif locked then
table.insert(parts, badge(LOGIN))
end
if locked then
local list = table.concat(groups, ', ')
table.insert(parts, badge('🔒 ' .. mw.text.encode(list), 'dlazdice-odznak-zamek',
'Přístup jen pro: ' .. mw.text.encode(list)))
end
if manual ~= '' and not manualIsLogin then
table.insert(parts, badge(manual))
end
end


local groups = groupsOf(content)
if #parts == 0 then
if #groups == 0 then
return ''
return ''
end
end
 
return '<div class="dlazdice-odznaky">' .. table.concat(parts) .. '</div>'
return '<span class="dlazdice-odznak dlazdice-odznak-zamek" title="Přístup jen pro: '
.. mw.text.encode(table.concat(groups, ', ')) .. '">🔒 '
.. mw.text.encode(table.concat(groups, ', ')) .. '</span>'
end
end


return p
return p

Verze z 12. 11. 2026, 07:25

Dokumentaci tohoto modulu lze vytvořit na stránce Modul:Dlaždice/Dokumentace

-- Module:Dlaždice
-- Zjistí, pro koho je cílová stránka zamčená: najde v jejím wikitextu všechny
-- kategorie končící na " (skryté)" a vrátí hotový odznak (zámek + názvy skupin).
-- Použití: {{#invoke:Dlaždice|odznaky|odkaz=Útvar personální/K nástupu|odznak=…}}
local p = {}

local SUFFIX = ' (skryté)'
local LOGIN = 'Po přihlášení'

-- Odstraní části wikitextu, ve kterých se kategorie nepočítají.
local function stripIgnored(text)
	text = text:gsub('<!%-%-.-%-%->', '')
	text = text:gsub('<[nN][oO][wW][iI][kK][iI]>.-</[nN][oO][wW][iI][kK][iI]>', '')
	text = text:gsub('<[pP][rR][eE][^>]*>.-</[pP][rR][eE]>', '')
	return text
end

-- Vrátí seznam skupin (názvy kategorií bez přípony) v pořadí výskytu, bez duplicit.
local function groupsOf(text)
	local groups, seen = {}, {}
	local suffixLen = mw.ustring.len(SUFFIX)
	for prefix, name in stripIgnored(text):gmatch('%[%[%s*([^%]|:]+):%s*([^%]|]-)%s*[|%]]') do
		-- jen odkazy s prefixem jmenného prostoru Kategorie / Category
		local ns = mw.ustring.lower(mw.text.trim(prefix))
		if ns == 'kategorie' or ns == 'category' then
			name = mw.text.trim((name:gsub('_', ' ')))
			if mw.ustring.sub(name, -suffixLen) == SUFFIX then
				local group = mw.text.trim(mw.ustring.sub(name, 1, mw.ustring.len(name) - suffixLen))
				if group ~= '' and not seen[group] then
					seen[group] = true
					table.insert(groups, group)
				end
			end
		end
	end
	return groups
end

-- Vrátí seznam skupin cílové stránky (prázdný, když stránka není zamčená / neexistuje).
local function groupsForTarget(target)
	-- externí odkazy a prázdný odkaz neřešíme
	if target == '' or mw.ustring.lower(mw.ustring.sub(target, 1, 4)) == 'http' then
		return {}
	end
	local title = mw.title.new(target)
	if not title or not title.exists then
		return {}
	end
	-- jedno přesměrování následujeme
	if title.isRedirect and title.redirectTarget then
		title = title.redirectTarget
	end
	local content = title:getContent()
	if not content then
		return {}
	end
	return groupsOf(content)
end

local function badge(html, extraClass, tooltip)
	return '<span class="dlazdice-odznak' .. (extraClass and (' ' .. extraClass) or '') .. '"'
		.. (tooltip and (' title="' .. tooltip .. '"') or '') .. '>' .. html .. '</span>'
end

-- Poskládá odznaky dlaždice (pod sebou):
--   1. „Po přihlášení“ (automaticky, jen když stránka je zamčená a ruční odznak
--      už není přesně „Po přihlášení“),
--   2. 🔒 skupiny z kategorií „… (skryté)“,
--   3. ruční odznak (parametr odznak), pokud je zadán a není to „Po přihlášení“.
-- Když je ruční odznak „Po přihlášení“, zobrazí se na místě automatického (1).
-- Parametry: odkaz, odznak
function p.odznaky(frame)
	local args = frame.args
	local manual = mw.text.trim(args.odznak or '')
	local groups = groupsForTarget(mw.text.trim(args.odkaz or ''))
	local locked = #groups > 0
	local manualIsLogin = mw.ustring.lower(manual) == mw.ustring.lower(LOGIN)

	local parts = {}
	if manualIsLogin then
		table.insert(parts, badge(manual))
	elseif locked then
		table.insert(parts, badge(LOGIN))
	end
	if locked then
		local list = table.concat(groups, ', ')
		table.insert(parts, badge('🔒 ' .. mw.text.encode(list), 'dlazdice-odznak-zamek',
			'Přístup jen pro: ' .. mw.text.encode(list)))
	end
	if manual ~= '' and not manualIsLogin then
		table.insert(parts, badge(manual))
	end

	if #parts == 0 then
		return ''
	end
	return '<div class="dlazdice-odznaky">' .. table.concat(parts) .. '</div>'
end

return p