Mô đun:Section link

-- 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
Chúng tôi bán
Bài viết liên quan
Genius - Job Class siêu hiếm của Renner
Genius - Job Class siêu hiếm của Renner
Renner thì đã quá nổi tiếng với sự vô nhân tính cùng khả năng diễn xuất tuyệt đỉnh và là kẻ đã trực tiếp tuồng thông tin cũng như giúp Demiurge và Albedo
Review phim Nhật Thực Toàn Phần - Total Eclipse 1995
Review phim Nhật Thực Toàn Phần - Total Eclipse 1995
Phim xoay quanh những bức thư được trao đổi giữa hai nhà thơ Pháp thế kỷ 19, Paul Verlanie (David Thewlis) và Arthur Rimbaud (Leonardo DiCaprio)
Tất cả kết truyện với Yun Jin - Genshin Impact
Tất cả kết truyện với Yun Jin - Genshin Impact
Tổng hợp tất cả các kết truyện khi hẹn hò với Yun Jin
[Zhihu] Điều gì khiến bạn từ bỏ một mối quan hệ
[Zhihu] Điều gì khiến bạn từ bỏ một mối quan hệ
Khi nào ta nên từ bỏ một mối quan hệ