본문으로 이동

모듈:Deck: 두 판 사이의 차이

Kawa
잔글편집 요약 없음
잔글편집 요약 없음
 
(같은 사용자의 중간 판 10개는 보이지 않습니다)
2번째 줄: 2번째 줄:


function p.render(f)
function p.render(f)
    local args = f:getParent().args
local args = f:getParent().args
    if args['items'] == nil then
if args['items'] == nil then
        args = f.args
args = f.args
    end
end


local lines = (args['items'] or ''):gmatch("([^\n]+)")
local lines = (args['items'] or ''):gmatch("([^\n]+)")
local items = {{}}
local items = {}


for line in lines do
for line in lines do
line = mw.text.trim(line)
line = mw.text.trim(line)


if line == '' then
if line ~= '' then
table.insert(items, {})
local key, value = line:match('^([%w%s]+)=(.+)$')
else
local key, value = line:match('^([^=]+)=(.+)$')
if key and value then
if key and value then
key = mw.text.trim(key):lower()
key = mw.text.trim(key):lower()
23번째 줄: 21번째 줄:
items[#items][key] = value
items[#items][key] = value
end
end
else
table.insert(items, {
url = line
})
end
end
end
end
28번째 줄: 30번째 줄:


-- HTML
-- HTML
local html = ''
local decks = {''}
 
for _, item in ipairs(items) do
for _, item in ipairs(items) do
local url = item.url or '#'
local url = item.url or '#'
local icon = item.icon or '🔗'
if url:match('^-+$') then
local title = mw.text.trim(item.title or '')
decks[#decks + 1] = ''
if title == '' then
else
title = url:match("^%a+://([^/:]+)") or url
local icon = item.icon or ''
end
local title = mw.text.trim(item.title or '')


-- local anchor = mw.html.create('a')
local wikitext = '<span>' .. icon .. '</span>' .. '<span>' .. title .. '</span>'
-- :addClass('kawa-deck-item')


-- anchor:attr('href', url)
decks[#decks] = decks[#decks] .. '[' .. url .. ' ' .. wikitext .. ']'
-- if url:match('^(https?:)?//') then
-- anchor:attr('target', '_blank')
-- anchor:attr('rel', 'noopener noreferrer')
-- end
 
local iconSpan = mw.html.create('span')
:addClass('kawa-deck-icon')
:attr('aria-hidden', 'true')
 
if icon:match('^(https?:)?//') then
iconSpan:tag('img'):attr('src', icon):attr('alt', '')
else
iconSpan:wikitext(icon)
end
end
end


local titleSpan = mw.html.create('span')
local html = ''
:addClass('kawa-deck-title')
for _, deck in ipairs(decks) do
:wikitext(title)
html = html .. '<div class="kawa-deck">' .. deck .. '</div>'
local contentSpan = mw.html.create('span')
:addClass('kawa-deck-content')
contentSpan:node(titleSpan)
local wrap = mw.html.create('div')
:addClass('kawa-deck-item')
wrap:node(iconSpan)
wrap:node(contentSpan)
 
 
html = html .. '[' .. url .. ' ' .. tostring(wrap) .. ']'
end
end


return f:preprocess('<nav class="kawa-deck-grid">' .. html .. '</nav>')
return f:preprocess(html)
end
end


return p
return p

2026년 5월 27일 (수) 10:34 기준 최신판

이 모듈에 대한 설명문서는 모듈:Deck/설명문서에서 만들 수 있습니다

local p = {}

function p.render(f)
	local args = f:getParent().args
	if args['items'] == nil then
		args = f.args
	end

	local lines = (args['items'] or ''):gmatch("([^\n]+)")
	local items = {}

	for line in lines do
		line = mw.text.trim(line)

		if line ~= '' then
			local key, value = line:match('^([%w%s]+)=(.+)$')
			if key and value then
				key = mw.text.trim(key):lower()
				value = mw.text.trim(value)
				if key ~= '' then
					items[#items][key] = value
				end
			else
				table.insert(items, {
					url = line
				})
			end
		end
	end

	-- HTML
	local decks = {''}

	for _, item in ipairs(items) do
		local url = item.url or '#'
		if url:match('^-+$') then
			decks[#decks + 1] = ''
		else
			local icon = item.icon or ''
			local title = mw.text.trim(item.title or '')

			local wikitext = '<span>' .. icon .. '</span>' .. '<span>' .. title .. '</span>'

			decks[#decks] = decks[#decks] .. '[' .. url .. ' ' .. wikitext .. ']'
		end
	end

	local html = ''
	for _, deck in ipairs(decks) do
		html = html .. '<div class="kawa-deck">' .. deck .. '</div>'
	end

	return f:preprocess(html)
end

return p