Jump to content

Module:Nested Lists: Difference between revisions

From The Petit Planet Wiki
ReisuDesign (talk | contribs)
Created page with "local p = {} local exists = require('Module:Exists') local levels = { [''] = 0, ['//'] = 1, ['$$'] = 2, ['%%'] = 3, ['&&'] = 4, } function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { parentFirst = true, wrapper = {'Template:Nested Lists'} }) return p._main(args) end function p._main(args) local input = args[1] or '' local link = args.link == '1' local output = {} -- Each semicolon separates an item. for item in mw.text...."
 
ReisuDesign (talk | contribs)
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 16: Line 16:
wrapper = {'Template:Nested Lists'}
wrapper = {'Template:Nested Lists'}
})
})
return p._main(args)
return p._main(args)
end
end
Line 23: Line 22:
local input = args[1] or ''
local input = args[1] or ''
local link = args.link == '1'
local link = args.link == '1'
local iconFormat = args.icon
local iconMain = args.icon_main == '1'
local iconSize = args.icon_size or '25'
-- Allow icon_size to be written as either 25 or 25px.
iconSize = mw.text.trim(tostring(iconSize))
iconSize = mw.ustring.gsub(iconSize, '[pP][xX]$', '')
if iconSize == '' then
iconSize = '25'
end


local output = {}
local output = {}
Line 34: Line 43:
local text = item
local text = item


-- Check for indentation marker.
-- Determine indentation marker.
local prefix = mw.ustring.sub(item, 1, 2)
local prefix = mw.ustring.sub(item, 1, 2)
 
if levels[prefix] ~= nil then
if levels[prefix] then
marker = prefix
marker = prefix
text = mw.text.trim(mw.ustring.sub(item, 3))
text = mw.text.trim(mw.ustring.sub(item, 3))
Line 44: Line 52:
local level = levels[marker] or 0
local level = levels[marker] or 0


-- Link the item if requested and the page exists.
-- [no] disables the icon for this item.
if link and exists.checkExists(text) then
local noIcon = false
text = '[[' .. text .. ']]'
local customIcon = nil
 
if mw.ustring.sub(text, 1, 4) == '[no]' then
noIcon = true
text = mw.text.trim(mw.ustring.sub(text, 5))
else
-- [Icon Name.png] specifies a custom icon.
local customIconName, remainingText =
mw.ustring.match(text, '^%[([^%]]+)%]%s*(.*)$')
 
if customIconName then
customIcon = mw.text.trim(customIconName)
text = mw.text.trim(remainingText)
end
end
 
-- Separate page target and display label.
local target = text
local label = text
local separator = mw.ustring.find(text, '|', 1, true)
 
if separator then
target = mw.text.trim(mw.ustring.sub(text, 1, separator - 1))
label = mw.text.trim(mw.ustring.sub(text, separator + 1))
end
 
-- Check whether the target page exists.
local pageExists = false
 
if link and target ~= '' then
pageExists = exists.checkExists(target)
end
 
-- Generate the icon.
local icon = ''
 
if not noIcon then
local iconName = customIcon
 
-- Use the global icon format unless icon_main is enabled
-- and this is not a level 0 item.
if not iconName and iconFormat and iconFormat ~= '' and (not iconMain or level == 0) then
iconName = mw.ustring.gsub(
iconFormat,
'{item}',
function()
return target
end
)
end
 
if iconName and iconName ~= '' then
-- Check whether the requested icon exists.
if not exists.checkExists('File:' .. iconName) then
iconName = 'Unknown.png'
end
 
-- Link the icon to the item page if it exists.
if pageExists then
icon = string.format(
'[[File:%s|%spx|link=%s]]',
iconName,
iconSize,
target
)
else
icon = string.format(
'[[File:%s|%spx]]',
iconName,
iconSize
)
end
end
end
 
-- Generate the text.
local displayText = label
 
if pageExists then
displayText = '[[' .. target .. '|' .. label .. ']]'
end
 
-- Combine icon and text.
local content = displayText
 
if icon ~= '' then
content = icon .. ' ' .. displayText
end
end


table.insert(
table.insert(
output,
output,
string.rep('*', level + 1) .. ' ' .. text
string.rep('*', level + 1) .. ' ' .. content
)
)
end
end

Latest revision as of 12:34, 3 September 2026

Module documentation

This module implements {{Nested Lists}}.

local p = {}

local exists = require('Module:Exists')

local levels = {
	[''] = 0,
	['//'] = 1,
	['$$'] = 2,
	['%%'] = 3,
	['&&'] = 4,
}

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		parentFirst = true,
		wrapper = {'Template:Nested Lists'}
	})
	return p._main(args)
end

function p._main(args)
	local input = args[1] or ''
	local link = args.link == '1'
	local iconFormat = args.icon
	local iconMain = args.icon_main == '1'
	local iconSize = args.icon_size or '25'

	-- Allow icon_size to be written as either 25 or 25px.
	iconSize = mw.text.trim(tostring(iconSize))
	iconSize = mw.ustring.gsub(iconSize, '[pP][xX]$', '')
	if iconSize == '' then
		iconSize = '25'
	end

	local output = {}

	-- Each semicolon separates an item.
	for item in mw.text.gsplit(input, ';', true) do
		item = mw.text.trim(item)

		if item ~= '' then
			local marker = ''
			local text = item

			-- Determine indentation marker.
			local prefix = mw.ustring.sub(item, 1, 2)
			if levels[prefix] ~= nil then
				marker = prefix
				text = mw.text.trim(mw.ustring.sub(item, 3))
			end

			local level = levels[marker] or 0

			-- [no] disables the icon for this item.
			local noIcon = false
			local customIcon = nil

			if mw.ustring.sub(text, 1, 4) == '[no]' then
				noIcon = true
				text = mw.text.trim(mw.ustring.sub(text, 5))
			else
				-- [Icon Name.png] specifies a custom icon.
				local customIconName, remainingText =
					mw.ustring.match(text, '^%[([^%]]+)%]%s*(.*)$')

				if customIconName then
					customIcon = mw.text.trim(customIconName)
					text = mw.text.trim(remainingText)
				end
			end

			-- Separate page target and display label.
			local target = text
			local label = text
			local separator = mw.ustring.find(text, '|', 1, true)

			if separator then
				target = mw.text.trim(mw.ustring.sub(text, 1, separator - 1))
				label = mw.text.trim(mw.ustring.sub(text, separator + 1))
			end

			-- Check whether the target page exists.
			local pageExists = false

			if link and target ~= '' then
				pageExists = exists.checkExists(target)
			end

			-- Generate the icon.
			local icon = ''

			if not noIcon then
				local iconName = customIcon

				-- Use the global icon format unless icon_main is enabled
				-- and this is not a level 0 item.
				if not iconName and iconFormat and iconFormat ~= '' and (not iconMain or level == 0) then
					iconName = mw.ustring.gsub(
						iconFormat,
						'{item}',
						function()
							return target
						end
					)
				end

				if iconName and iconName ~= '' then
					-- Check whether the requested icon exists.
					if not exists.checkExists('File:' .. iconName) then
						iconName = 'Unknown.png'
					end

					-- Link the icon to the item page if it exists.
					if pageExists then
						icon = string.format(
							'[[File:%s|%spx|link=%s]]',
							iconName,
							iconSize,
							target
						)
					else
						icon = string.format(
							'[[File:%s|%spx]]',
							iconName,
							iconSize
						)
					end
				end
			end

			-- Generate the text.
			local displayText = label

			if pageExists then
				displayText = '[[' .. target .. '|' .. label .. ']]'
			end

			-- Combine icon and text.
			local content = displayText

			if icon ~= '' then
				content = icon .. ' ' .. displayText
			end

			table.insert(
				output,
				string.rep('*', level + 1) .. ' ' .. content
			)
		end
	end

	return table.concat(output, '\n')
end

return p