Module:Multi-section link

-- This module creates a section link with multiple section names.

local p = {}

local function normalizePageName(page)
	local title = mw.title.new(page)
	if not title then
		error(string.format("'%s' is not a valid page name", page), 3)
	elseif title.namespace == 6 or title.namespace == 14 then
		return ':' .. title.prefixedText
	else
		return title.prefixedText
	end
end

function p._main(args)
	-- Sort the arguments.
	local sections = {}
	local page = ""
	for k, v in pairs(args) do
		if k == 1 then
			-- Doing this in the loop because of a bug in [[Module:Arguments]]
			-- when using pairs with deleted arguments.
			page = mw.text.decode(v, true)
		elseif type(k) == 'number' then
			sections[k] = v
		end
	end

	-- Compress the sections array.
	local function compressArray(t)
		local nums, ret = {}, {}
		for num in pairs(t) do
			nums[#nums + 1] = num
		end
		table.sort(nums)
		for i, num in ipairs(nums) do
			ret[i] = t[num]
		end
		return ret
	end
	sections = compressArray(sections)

	-- Deal with blank page names elegantly
	if not page:find('%S') then
		page = ""
	else
		page = normalizePageName(page)
	end

	if #sections == 0 then
		if #page == 0 then
			error('neither |1=pagename nor |2=section found', 2)
		end
		return string.format('[[%s]]', page)
	end

	local builder = {page, ' '}
	if #page == 0 then
		builder = {}
	end
	for i, s in ipairs(sections) do
		table.insert(builder, string.rep('§', i))
		table.insert(builder, ' ')
		table.insert(builder, s)
		table.insert(builder, ' ')
	end
	table.remove(builder)
	local display = table.concat(builder)
	local fragment = sections[#sections]
	return string.format('[[%s#%s|%s]]', page, fragment, display)
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:Multi-section link',
		valueFunc = function (key, value)
			value = value:match('^%s*(.-)%s*$') -- Trim whitespace
			-- Allow blank first parameters, as the wikitext template does this.
			if value ~= '' or key == 1 then
				return value
			end
		end
	})
	return p._main(args)
end

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.