Mô đun:Section link

Từ Từ điển tri thức Hội Thánh của Đức Chúa Trời
Bước tới điều hướng Bước tới tìm kiếm

Có thể viết tài liệu về mô đun này tại Mô đun:Section link/tài liệu.

-- Mô đun này thực hiện {{section link}}.

local checkType = require('libraryUtil').checkType

local p = {}

local function makeSectionLink(page, section, display)
	display = display or section
	page = page or ''
	return string.format('[[%s#%s|%s]]', page, section, display)
end

local function normalizeTitle(title)
	title = mw.ustring.gsub(mw.ustring.gsub(title,"'",""),'"','')
	return mw.title.new(mw.ustring.gsub(title,"%b<>","")).prefixedText
end

function p._main(page, sections, options, title)
	-- Validate input.
	checkType('_main', 1, page, 'string', true)
	checkType('_main', 3, options, 'table', true)
	if sections == nil then
		sections = {}
	elseif type(sections) == 'string' then
		sections = {sections}
	elseif type(sections) ~= 'table' then
		error(string.format(
			"loại lỗi trong đối số #2 đến '_main' " ..
			"(chuỗi, bảng hoặc không mong đợi, lấy được %s)",
			type(sections)
		), 2)
	end
	options = options or {}
	title = title or mw.title.getCurrentTitle()

	-- Deal with blank page names elegantly
	if page and not page:find('%S') then
		page = nil
		options.nopage = true
	end

	-- Make the link(s).
	local isShowingPage = not options.nopage
	if #sections <= 1 then
		local linkPage = page or ''
		local section = sections[1] or 'Ghi chú'
		local display = '§&nbsp;' .. section
		if isShowingPage then
			page = page or title.prefixedText
			if options.display and options.display ~= '' then
				if normalizeTitle(options.display) == normalizeTitle(page) then
					display = options.display .. ' ' .. display
				else
					error(string.format(
						'Hiển thị tiêu đề "%s" đã bị bỏ qua kể từ khi nó ' ..
						"không tương đương với tiêu đề thực tế của trang",
						options.display
					), 0)
				end
			else
				display = page .. ' ' .. display
			end
		end
		return makeSectionLink(linkPage, section, display)
	else
		-- Multiple sections. First, make a list of the links to display.
		local ret = {}
		for i, section in ipairs(sections) do
			ret[i] = makeSectionLink(page, section)
		end

		-- Assemble the list of links into a string with mw.text.listToText.
		-- We use the default separator for mw.text.listToText, but a custom
		-- conjunction. There is also a special case conjunction if we only
		-- have two links.
		local conjunction
		if #sections == 2 then
			conjunction = '&#8203; và '
		else
			conjunction = ', và '
		end
		ret = mw.text.listToText(ret, nil, conjunction)

		-- Add the intro text.
		local intro = '§§&nbsp;'
		if isShowingPage then
			intro = (page or title.prefixedText) .. ' ' .. intro
		end
		ret = intro .. ret

		return ret
	end
end

function p.main(frame)
	local args = require('Mô đun:Arguments').getArgs(frame, {
		wrappers = 'Bản mẫu: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
	})

	-- Sort the arguments.
	local page
	local sections, options = {}, {}
	for k, v in pairs(args) do
		if k == 1 then
			-- Doing this in the loop because of a bug in [[Mô đun:Arguments]]
			-- when using pairs with deleted arguments.
			page = mw.text.decode(v, decodeNamedEntities)
		elseif type(k) == 'number' then
			sections[k] = v
		else
			options[k] = v
		end
	end
	
	-- Extract section from page, if present
	if page then
		local p, s = page:match('^(.-)#(.*)$')
		if p then page, sections[1] = p, s 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)

	return p._main(page, sections, options)
end

return p