پرش به محتوا

پودمان:Old AfD multi/تمرین

از ویکی‌پدیا، دانشنامهٔ آزاد
توضیحات پودمان[ایجاد] [پاکسازی]
-- بخش‌هایی از این پودمان برای سازگاری با فرایندهای ویکی‌پدیای فارسی ‌دستخوش تغییرات عمده شده‌اند. لطفاً در زمان به‌روزرسانی دقت کنید

local yesno = require('Module:Yesno')
local mMessageBox = require('Module:Message box')
local TEMPLATE_PAGE = 'الگو:پیشینه حذف'

-------------------------------------------------------------------------------
-- Helper functions
-------------------------------------------------------------------------------

local function exists(page)
	local success, exists = pcall(function ()
		local title = mw.title.new(page)
		return title.exists
	end)
	return success and exists
end

local function getAfdPage(page)
	if page and mw.title.new(page) then
		return 'ویکی‌پدیا:نظرخواهی برای حذف/' .. page
	else
		return nil
	end
end

--[[
در ویکی‌پدیای فارسی نیازی نیست
local function getVfdPage(page)
	if page and mw.title.new(page) then
		if mw.title.new(page).rootPageTitle.fullText == 'Wikipedia:Votes for deletion' then
			return page
		else
			return 'Wikipedia:Votes for deletion/' .. page
		end
	else return nil
	end
end ]]--

local function makeWikilink(page, display)
	display = display or 'بحث'
	if page then
		return mw.ustring.format('[[%s|%s]]', page, display)
	else
		return display															-- probably a bad title
	end
end

local function makeUrlLink(page, display)
	display = display or 'بحث'
	return mw.ustring.format('[%s %s]', page, display)
end

local function pageTypeName(title)
	local display = mw.ustring.lower(title.subjectNsText)
	local pageTypes = {
		[''] = 'مقاله',
		['کاربر'] = 'صفحهٔ کاربری',
		['ویکی‌پدیا'] = 'صفحهٔ پروژه',
		['مدیاویکی'] = 'صفحهٔ رابط کاربری',
		['راهنما'] = 'صفحهٔ راهنما'
	}
	if pageTypes[display] then display = pageTypes[display] end
	return display
end

local function cleanupTitle(title)
	if not title then return title end
	title = mw.uri.decode(title, 'PATH')
	title = mw.ustring.gsub(title, '|.*', '')
	title = mw.ustring.gsub(title, '[%[%]{}]', '')
	return title
end

-------------------------------------------------------------------------------
-- OldAfdMulti class
-------------------------------------------------------------------------------

local OldAfdMulti = {}
OldAfdMulti.__index = OldAfdMulti

function OldAfdMulti.new(args)
	local self = setmetatable({}, OldAfdMulti)
	self.currentTitle = mw.title.getCurrentTitle()

	-- Preprocess the row args for easier looping.
	self.rowData = {}
	for k, v in pairs(args) do
		if type(k) == 'string' then
			local prefix, num = mw.ustring.match(k, '^(.-)(%d[%d]?)$')
			if prefix and num then
				num = mw.getContentLanguage():parseFormattedNumber(num)
				if prefix == 'result' or
					prefix == 'نتیجه' or
					prefix == 'date' or
					prefix == 'تاریخ' or
					prefix == 'page' or
					prefix == 'صفحه' or
					prefix == 'link' or
					prefix == 'پیوند' or
					prefix == 'caption' or
					prefix == 'توضیح' or
					prefix == 'votepage' or
					prefix == 'نظرخواهی' or
					prefix == 'merge' or
					prefix == 'ادغام'
				then
					self.rowData[num] = self.rowData[num] or {}
					self.rowData[num][prefix] = v
					if v and v ~= '' and prefix=='merge' or prefix=='ادغام' then
						self.isMerge = true
					end
				end
			end
		end
	end
	-- Set aliases for parameters ending in "1".
	if self.rowData[1] then
		self.rowData[1].result = self.rowData[1].result or args.result or args['نتیجه']
		self.rowData[1].date = self.rowData[1].date or args.date or args['تاریخ']
		self.rowData[1].page = self.rowData[1].page or args.page or args['صفحه']
		self.rowData[1].votepage = self.rowData[1].votepage or args.votepage or args['نظرخواهی']
		self.rowData[1].link = self.rowData[1].link or args.link or args['پیوند']
		self.rowData[1].caption = self.rowData[1].caption or args.caption or args['توضیح']
		self.rowData[1].merge = self.rowData[1].merge or args.merge or args['ادغام']
	elseif args.result or
		args['نتیجه'] or
		args.date or
		args['تاریخ'] or
		args.page or
		args['صفحه'] or
		args.votepage or
		args['نظرخواهی'] or
		args.link or
		args['پیوند'] or
		args.caption or
		args['توضیح'] or
		args.merge or
		args['ادغام']
	then
		self.rowData[1] = {
			result = args.result or args['نتیجه'],
			date = args.date or args['تاریخ'],
			page = args.page or args['صفحه'],
			votepage = args.votepage or args['نظرخواهی'],
			link = args.link or args['پیوند'],
			caption = args.caption or args['توضیح'],
			merge = args.merge or args['ادغام']
		}
	end
	-- Remove any gaps in the array we made.
	local function compressSparseArray(t)
		local ret, nums = {}, {}
		for num, data 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
	self.rowData = compressSparseArray(self.rowData)
	-- Set aliases that apply to all of the data tables.
	for i, data in ipairs(self.rowData) do
		data.page = data.page or data.votepage
		data.page = cleanupTitle(data.page)
		data.votepage = nil
	end

	-- Set collapsedness
	self.collapse = tonumber(args.collapse or args['جمع‌شده'])
	if not self.collapse then
		self.collapse = yesno(args.collapse or args['جمع‌شده'])
	end

	-- Set other properties
	self.isNumbered = yesno(args.numbered or args['شماره‌دار'])
	self.isSmall = yesno(args.small or args['کوچک'])
	self.pageType = args.type or args['نوع'] or pageTypeName(self.currentTitle)
	if (args.merge or args['ادغام']) and (args.merge or args['ادغام']) ~= '' then
		self.isMerge = true
	end
	
	return self
end

function OldAfdMulti:renderResult(result)
	return result or "'''بماند'''"
end

function OldAfdMulti:renderDate(date)
	if date then
		return date
	else
		self.hasMissingDate = true
		return mw.ustring.format(
			'<sup>%s[[%s|تاریخ ناموجود]]%s</sup>',
			mw.text.nowiki('['),
			TEMPLATE_PAGE,
			mw.text.nowiki(']')
		)
	end
end

function OldAfdMulti:renderPageText(linkFunc, page, caption)
	return mw.ustring.format('، %s را ببینید.', linkFunc(page, caption))
end

function OldAfdMulti:renderRow(result, date, link, merge)
	local result = self:renderResult(result)
	local date = self:renderDate(date)
	local mergeText = ''
	if merge and merge ~= '' then
		mergeText = mw.ustring.format('ادغام با [[:%s]]: ', merge)
	end
	if link then
		return mw.ustring.format('%s%s، %s، %s را ببینید.', mergeText, result, date, link)
	else
		return mw.ustring.format('%s%s، %s', mergeText, result, date)
	end
end

function OldAfdMulti:renderFirstRow(data)
	local link
	if data.link or data['پیوند'] then
		link = makeUrlLink(data.link or data['پیوند'], data.caption or data['توضیح'])
	else
		local page = data.page or data['صفحه'] or self.currentTitle.text
		link = makeWikilink(getAfdPage(page), data.caption or data['توضیح'])
	end
	return self:renderRow(data.result or data['نتیجه'], data.date or data['تاریخ'], link, data.merge or data['ادغام'])
end

function OldAfdMulti:renderSubsequentRow(data)
	local link
	if data.page or data['صفحه'] then
		link = makeWikilink(getAfdPage(data.page or data['صفحه']), data.caption or data['توضیح'])
	elseif data.link or data['پیوند'] then
		link = makeUrlLink(data.link or data['پیوند'], data.caption or data['توضیح'])
	end
	return self:renderRow(data.result or data['نتیجه'], data.date or data['تاریخ'], link, data.merge or data['ادغام'])
end

function OldAfdMulti:renderRows()
	local root = mw.html.create()
	local nRows = #self.rowData
	local i = nRows

	local nCollapsedRows
	if type(self.collapse) == 'number' then
		nCollapsedRows = self.collapse
	elseif self.collapse then
		nCollapsedRows = nRows
	else
		nCollapsedRows = 0
	end
	local hasNormalRows = nRows - nCollapsedRows > 0

	local function makeList(isCollapsed, header)
		local tableRoot = root:tag('table')
		tableRoot
			:addClass(isCollapsed and 'collapsible collapsed' or nil)
			:css('width', '100%')
			:css('background-color', '#f8eaba')
		if header then
			tableRoot
				:tag('tr')
					:tag('th')
						:wikitext(header)
		end
		return tableRoot
			:tag('tr')
				:tag('td')
					:tag(self.isNumbered and 'ol' or 'ul')
	end

	local function renderRow(html, method, data)
		html
			:tag('li')
				:attr('value', self.isNumbered and i or nil)
				:wikitext(self[method](self, data))
	end

	-- Render normal rows
	if hasNormalRows then
		local normalList = makeList(false)
		while i > 1 and i > nCollapsedRows do
			renderRow(normalList, 'renderSubsequentRow', self.rowData[i])
			i = i - 1
		end
		if i == 1 and i > nCollapsedRows then
			renderRow(normalList, 'renderFirstRow', self.rowData[i])
			i = i - 1
		end
	end

	-- Render collapsed rows
	if nCollapsedRows > 0 then
		local header
		if hasNormalRows then
			header = 'نظرخواهی‌های قدیمی‌تر برای حذف:'
		elseif nRows > 1 then
			header = 'نظرخواهی‌ها برای حذف:'
		else
			header = 'نظرخواهی برای حذف:'
		end
		local collapsedList = makeList(true, header)
		while i > 1 do
			renderRow(collapsedList, 'renderSubsequentRow', self.rowData[i])
			i = i - 1
		end
		renderRow(collapsedList, 'renderFirstRow', self.rowData[i])
	end

	return tostring(root)
end

function OldAfdMulti:renderFirstRowOnly()
	local data = self.rowData[1] or {}
	local caption = data.caption or data['توضیح'] or 'بحث'
	local link
	if data.link or data['پیوند'] then
		link = makeUrlLink(data.link or data['پیوند'], caption)
	else
		local page = data.page or data['صفحه'] or self.currentTitle.text
		if exists(getAfdPage(page)) then
			link = makeWikilink(getAfdPage(page), caption)
--[[ not needed in fawiki
		elseif exists(getVfdPage(page)) then
			link = makeWikilink(getVfdPage(page), caption) ]]--
		else
			link = caption														-- Make this an error?
		end
	end
	local result = self:renderResult(data.result or data['نتیجه'] or "'''بماند'''")
	local resultText
	if self.rowData[1].date then
		resultText = mw.ustring.format(
			"نتیجهٔ %s که در تاریخ %s جمع‌بندی شد چنین بود: '''%s'''",
			link,
			self.rowData[1].date,
			result
			)
	else
		resultText = mw.ustring.format(
			"نتیجهٔ %s چنین بود: '''%s'''",
			link,
			result
			)
	end
	return resultText
end

function OldAfdMulti:renderBannerText()
	local nRows = #self.rowData
	local ret = {}
	if self.isMerge then
			if nRows < 1 or not self.rowData[1].date then
			ret[#ret + 1] = mw.ustring.format(
				'این %s در گذشته برای [[ویکی‌پدیا:سیاست حذف#ادغام|ادغام]] با %s در نظر گرفته شده‌بود.',
				self.pageType,
				self.rowData[1].merge
			)
		elseif nRows == 1 and self.rowData[1].date then
			ret[#ret + 1] = mw.ustring.format(
				'این %s در %s برای [[ویکی‌پدیا:سیاست حذف#ادغام|ادغام]] با [[:%s]] در نظر گرفته شده‌بود.',
				self.pageType,
				self.rowData[1].date,
				self.rowData[1].merge
			)
		else
			ret[#ret + 1] = mw.ustring.format(
				'این %s درگذشته برای [[ویکی‌پدیا:سیاست حذف|حذف]] نامزد شده یا برای [[ویکی‌پدیا:سیاست حذف#ادغام|ادغام]] در نظر گرفته شده‌بود.',
				self.pageType
			)
		end
	else
		if nRows < 1 or not self.rowData[1].date then
			ret[#ret + 1] = mw.ustring.format(
				'این %s در گذشته برای [[ویکی‌پدیا:سیاست حذف|حذف]] نامزد شده‌بود.',
				self.pageType
			)
		elseif nRows == 1 and self.rowData[1].date then
			ret[#ret + 1] = mw.ustring.format(
				'این %s برای [[ویکی‌پدیا:سیاست حذف|حذف]] نامزد شده‌بود.',
				self.pageType
			)
		else
			ret[#ret + 1] = mw.ustring.format(
				'این %s برای [[ویکی‌پدیا:سیاست حذف|حذف]] نامزد شده‌بود.',
				self.pageType
			)
		end
	end
	
	if nRows > 1 then
		ret[#ret + 1] = ' '
		if self.isSmall then
			ret[#ret + 1] = 'اگر قصد نامزد کردن مجدد را دارید، بحث‌های پیشین را بازبینی کنید:'
		else
			ret[#ret + 1] = 'اگر قصد دارید نامزدی جدیدی ایجاد کنید، لطفاً بحث‌های پیشین را بازبینی کنید:'
		end
		ret[#ret + 1] = '\n'
		ret[#ret + 1] = self:renderRows()
	else
		ret[#ret + 1] = ' '
		ret[#ret + 1] = self:renderFirstRowOnly()
	end
	return table.concat(ret)
end

function OldAfdMulti:renderBanner()
	return mMessageBox.main('tmbox', {
		small = self.isSmall,
		type = 'notice',
		image = '[[پرونده:Clipboard.svg|35px|نظرخواهی برای حذف]]',
		smallimage = 'none',
		text = self:renderBannerText()
	})
end

function OldAfdMulti:renderTrackingCategories()
	local ret = {}
	if self.hasMissingDate and self.currentTitle.isTalkPage then
		ret[#ret + 1] = '[[رده:الگوهای پیشینه حذف دارای خطا]]'
	end
	return table.concat(ret)
end

function OldAfdMulti:__tostring()
	return self:renderBanner() .. self:renderTrackingCategories()
end

-------------------------------------------------------------------------------
-- Exports
-------------------------------------------------------------------------------

local p = {}

function p._main(args)
	local afd = OldAfdMulti.new(args)
	return tostring(afd)
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = TEMPLATE_PAGE
	})
	return p._main(args)
end

return p