Thành viên:NgocAnMaster/Biểu quyết xóa bài cũ/mô đun
Đây là mã nguồn cho trang Thành viên:NgocAnMaster/Biểu quyết xóa bài cũ dưới dạng wikitext. Xem thêm Mô đun:Old XfD multi và trang chỗ thử của nó.
local yesno = require('Module:Yesno') local mMessageBox = require('Module:Message box') local TEMPLATE_PAGE = 'Template:Đã biểu quyết giữ'
-- 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 if mw.title.new(page).namespace ~= 0 then return page else return 'Wikipedia:Biểu quyết xoá bài/' .. page end 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 'discussion' if page then return string.format('%s', page, display) else return display --probably a bad title end end
local function makeUrlLink(page, display) display = display or 'discussion' return string.format('[%s %s]', page, display) end
local function pageTypeName(title) local display = mw.ustring.lower(title.subjectNsText) local pageTypes = { [] = 'Bài viết', ['thành viên'] = 'Trang thành viên', ['wikipedia'] = 'Trang dự án', ['mediawiki'] = 'Trang giao diện', ['trợ giúp'] = 'Trang trợ giúp' } 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 = string.gsub(title, '|.*', ) title = string.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 = k:match('^(.-)([1-9][0-9]*)$') if prefix and num then num = tonumber(num) if prefix == 'result' or prefix == 'date' or prefix == 'page' or prefix == 'link' or prefix == 'caption' or prefix == 'votepage' or prefix == 'merge' then self.rowData[num] = self.rowData[num] or {} self.rowData[num][prefix] = v if v and v ~= and prefix=='merge' 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 self.rowData[1].date = self.rowData[1].date or args.date self.rowData[1].page = self.rowData[1].page or args.page self.rowData[1].votepage = self.rowData[1].votepage or args.votepage self.rowData[1].link = self.rowData[1].link or args.link self.rowData[1].caption = self.rowData[1].caption or args.caption self.rowData[1].merge = self.rowData[1].merge or args.merge elseif args.result or args.date or args.page or args.votepage or args.link or args.caption or args.merge then self.rowData[1] = { result = args.result, date = args.date, page = args.page, votepage = args.votepage, link = args.link, caption = args.caption, merge = args.merge } 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) if not self.collapse then self.collapse = yesno(args.collapse) end
-- Set other properties self.isNumbered = yesno(args.numbered) self.isSmall = yesno(args.small) self.pageType = args.type or pageTypeName(self.currentTitle) if args.merge and args.merge ~= then self.isMerge = true end
return self end
function OldAfdMulti:renderResult(result) return result or "Giữ" end
function OldAfdMulti:renderDate(date) if date then return date else self.hasMissingDate = true return string.format( '%sthiếu ngày%s', mw.text.nowiki('['), TEMPLATE_PAGE, mw.text.nowiki(']') ) end end
function OldAfdMulti:renderPageText(linkFunc, page, caption) return string.format(', see %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 = string.format('Hợp nhất với %s: ', merge) end if link then return string.format('%s%s, %s, see %s.', mergeText, result, date, link) else return string.format('%s%s, %s', mergeText, result, date) end end
function OldAfdMulti:renderFirstRow(data) local link if data.link then link = makeUrlLink(data.link, data.caption) else local page = data.page or self.currentTitle.text link = makeWikilink(getAfdPage(page), data.caption) end return self:renderRow(data.result, data.date, link, data.merge) end
function OldAfdMulti:renderSubsequentRow(data) local link if data.page then link = makeWikilink(getAfdPage(data.page), data.caption) elseif data.link then link = makeUrlLink(data.link, data.caption) end return self:renderRow(data.result, data.date, link, data.merge) 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 = 'Các lần thảo luận xóa trước đây:' elseif nRows > 1 then header = 'Các lần thảo luận xóa:' else header = 'Thảo luận xóa:' 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 'thảo luận' local link if data.link then link = makeUrlLink(data.link, caption) else local page = data.page or self.currentTitle.text if exists(getAfdPage(page)) then link = makeWikilink(getAfdPage(page), caption) 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 "giữ") return string.format( 'Kết quả của %s này là %s.', link, result ) 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] = string.format( '%s này được cân nhắc hợp nhất với %s.', self.pageType, self.rowData[1].merge ) elseif nRows == 1 and self.rowData[1].date then ret[#ret + 1] = string.format( '%s này được cân nhắc hợp nhất với %s vào %s.', self.pageType, self.rowData[1].merge, self.rowData[1].date ) else ret[#ret + 1] = string.format( '%s này được cân nhắc để xóa hoặc hợp nhất.', self.pageType ) end else if nRows < 1 or not self.rowData[1].date then ret[#ret + 1] = string.format( '%s này đã từng được đề cử xóa.', self.pageType ) elseif nRows == 1 and self.rowData[1].date then ret[#ret + 1] = string.format( '%s này đã từng được đề cử xóa vào %s.', self.pageType, self.rowData[1].date ) else ret[#ret + 1] = string.format( '%s này đã từng được đề cử xóa.', self.pageType ) end end
if nRows > 1 then ret[#ret + 1] = ' ' if self.isSmall then ret[#ret + 1] = 'Xem lại các thảo luận trước đây trước khi cân nhắc đề cử lại:' else ret[#ret + 1] = 'Vui lòng xem lại các thảo luận trước đây nếu bạn muốn cân nhắc đề cử lại:' 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 = '', 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