มอดูล:Subject bar

จากวิกิพีเดีย สารานุกรมเสรี
ไปยังการนำทาง ไปยังการค้นหา
Documentation icon คู่มือการใช้งานมอดูล[ดู] [แก้] [ประวัติ] [ล้างแคช]

This module implements the {{Subject bar}} template. Please don't use this module from an article or from another wiki page. You should use the {{Subject bar}} template instead. To use the module from another Lua module, read on.

Use from another Lua module[แก้]

Load the module like this:

local subjectBar = require('Module:Subject bar')._main

Then you can use the subjectBar function like this:

local myBar = subjectBar{
    book = 'Book 1',
    book2 = 'Book 2',
    -- ...
    portal = 'Portal 1',
    portal2 = 'Portal 2',
    -- ...
    commons = true,
    commons-search = 'Commons search string',
    wikt = true,
    wikt-search = 'Wiktionary search string'
    -- ...
}

Please see Template:Subject bar/doc for a full list of possible parameters.

local htmlBuilder = require('Module:HtmlBuilder')
local getPortalImage = require('Module:Portal').image

local p = {}

local function getArgNums(prefix, args)
    -- Returns a table containing the numbers of the arguments that exist for the specified prefix. For example, if the 
	-- prefix was 'data', and 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
    local nums = {}
    for k, v in pairs(args) do
        local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
        if num then table.insert(nums, tonumber(num)) end
    end
    table.sort(nums)
    return nums
end

local function makeHorizontalRule()
	local row = htmlBuilder.create('tr')
	row
		.tag('td')
			.attr('colspan', '2')
			.tag('hr', {selfClosing = true})
	return tostring(row)
end

local function makeItem(image, text)
	local root = htmlBuilder.create('table')
	root
		.css('float', 'left')
		.css('padding', '0px 5px')
		.tag('tr')
			.tag('td')
				.wikitext(image)
				.done()
			.tag('td')
				.css('width', '125px')
				.css('text-align', 'left')
				.wikitext(text)
	return tostring(root)
end

local function makeRow(items, heading, subheading, options)
	if #items < 1 then return end
	local swapHeadingSize = type(options) == 'table' and options.swapHeadingSize or false
	local row = htmlBuilder.create('tr')
	row
		.tag('td')
			.css('width', '175px')
			.tag('span')
				.css('font-size', swapHeadingSize and '85%' or '125%')
				.wikitext(heading)
				.done()
			.tag('br', {selfClosing = true})
			.tag('span')
				.css('font-size', swapHeadingSize and '125%' or '85%')
				.wikitext(subheading)
	local cell = row.tag('td')
	for i, item in ipairs(items) do
		local image = item[1]
		local text = item[2]
		cell
			.wikitext(makeItem(image, text))
	end
	return tostring(row)
end

local function makeNumberedRow(prefix, args, heading, subheading, getItemValsFunc, options)
	if args[prefix] then
		args[prefix .. '1'] = args[prefix]
	end
	local argNums = getArgNums(prefix, args)
	local items = {}
	for i, argNum in ipairs(argNums) do
		local image, text = getItemValsFunc(args[prefix .. tostring(argNum)])
		table.insert(items, {image, text})
	end
	return makeRow(items, heading, subheading, options)
end

function p._main(args)
	local rows = {}

	-- Get the book row text.
	local bookHeading = "'''[[Wikipedia:Books|Books]]'''"
	local bookSubheading = 'View or order collections of articles'
	local function getBookItemVals(book)
		local image = '[[File:Office-book.svg|30px|link=]]'
		local text = mw.ustring.format("'''''[[Book:%s|%s]]'''''", book, book)
		return image, text
	end
	local bookRow = makeNumberedRow('book', args, bookHeading, bookSubheading, getBookItemVals)
	table.insert(rows, bookRow)

	-- Get the portal row text
	local portalHeading = "'''[[วิกิพีเดีย:สถานีย่อย|สถานีย่อย]]'''"
	local portalSubheading = 'เข้าถึงหัวข้อที่เกี่ยวข้อง'
	local function getPortalItemVals(portal)
		local image = mw.ustring.format('[[File:%s|30x30px]]', getPortalImage{portal})
		local text = mw.ustring.format("'''''[[สถานีย่อย:%s|สถานีย่อย<br />%s]]'''''", portal, portal)
		return image, text
	end
	local portalRow = makeNumberedRow('portal', args, portalHeading, portalSubheading, getPortalItemVals)
	table.insert(rows, portalRow)

	-- Get the sister projects row text.
	local sisters = {
		{arg = 'commons', image = 'Commons-logo.svg', prefix = 'commons', display = 'สื่อ', from = 'คอมมอนส์'},
		{arg = 'species', image = 'Wikispecies-logo.svg', prefix = 'wikispecies', display = 'สารบบสปีชีส์', from = 'วิกิสปีชีส์'},
		{arg = 'voy', image = 'Wikivoyage-Logo-v3-icon.svg', prefix = 'voy', display = 'คู่มือนำเที่ยว', from = 'วิกิท่องเที่ยว'},
		{arg = 'n', image = 'Wikinews-logo.svg', prefix = 'wikinews', display = 'เรื่องข่าว', from = 'วิกิข่าว'},
		{arg = 'wikt', image = 'Wiktionary-logo-th.svg', prefix = 'wiktionary', display = 'บทนิยามภาษาไทย', from = 'วิกิพีเดีย'},
		{arg = 'b', image = 'Wikibooks-logo.svg', prefix = 'wikibooks', display = 'ตำรา', from = 'วิกิตำรา'},
		{arg = 'q', image = 'Wikiquote-logo.svg', prefix = 'wikiquote', display = 'คำคม', from = 'วิกิคำคม'},
		{arg = 's', image = 'Wikisource-logo.svg', prefix = 'wikisource', display = 'ข้อความต้นฉบับ', from = 'วิกิซอร์ซ'},
		{arg = 'v', image = 'Wikiversity-logo.svg', prefix = 'wikiversity', display = 'Learning resources', from = 'Wikiversity'}
	}
	local sisterItems = {}
	for i, t in ipairs(sisters) do
		if args[t.arg] then
			-- Get the image value.
			local image = mw.ustring.format('[[File:%s|30x30px|link=]]', t.image)
			-- Get the text value.
			local prefix = t.prefix
			local search = args[t.arg .. '-search'] or mw.title.getCurrentTitle().text
			local postfix = t.postfix
			postfix = postfix and ('#' .. postfix) or ''
			local display = t.display
			local from = t.from
			local text = mw.ustring.format(
				'[[%s:Special:Search/%s%s|%s]]<br />จาก %s',
				prefix,	search,	postfix, display, from
			)
			-- Add the values to the items table.
			table.insert(sisterItems, {image, text})
		end
	end
	local sisterHeading = "ศึกษาเพิ่มเติมทาง"
	local sisterSubheading = "'''[[วิกิพีเดีย:โครงการพี่น้อง|โครงการพี่น้อง]]'''"
	local sisterRow = makeRow(sisterItems, sisterHeading, sisterSubheading, {swapHeadingSize = true})
	table.insert(rows, sisterRow)

	-- Make the table.
	local root = htmlBuilder.create('table')
	root
		.addClass('noprint')
		.addClass('navbox')
		.css('background-color', '#f9f9f9')
		.css('border', '1px solid #aaa')
		.css('clear', 'both')
		.css('margin-bottom', '0.5em')
		.css('margin-top', '0.5em')
		.wikitext(table.concat(rows, makeHorizontalRule()))

	return tostring(root)
end

function p.main(frame)
	-- If called via #invoke, use the args passed into the invoking template, or the args passed to #invoke if any exist. Otherwise
	-- assume args are being passed directly in from the debug console or from another Lua module.
	local origArgs
	if frame == mw.getCurrentFrame() then
		origArgs = frame:getParent().args
		for k, v in pairs(frame.args) do
			origArgs = frame.args
			break
		end
	else
		origArgs = frame
	end
	-- Remove blank arguments.
	local args = {}
	for k, v in pairs(origArgs) do
		if v ~= '' then
			args[k] = v
		end
	end
	return p._main(args)
end

return p