ページ「モジュール:Old AfD multi」と「モジュール:削除依頼ログ/sandbox」の間の差分
表示
(ページ間の差分)
削除された内容 追加された内容
m 「モジュール:Old AfD multi」を保護しました: 影響が特に大きいテンプレート: 削除依頼の対処に使用するモジュール ([編集=拡張承認された利用者と管理者に許可] (無期限) [移動=拡張承認された利用者と管理者に許可] (無期限)) |
編集の要約なし |
||
1行目: | 1行目: | ||
local yesno = require('Module:Yesno') |
local yesno = require('Module:Yesno') |
||
local mMessageBox = require('Module:Message box') |
|||
local TEMPLATE_PAGE = 'Template:Oldafdmulti' |
|||
------------------------------------------------------------------------------- |
------------------------------------------------------------------------------- |
||
-- |
-- AfDLog class |
||
------------------------------------------------------------------------------- |
------------------------------------------------------------------------------- |
||
local |
local AfDLog = {} |
||
AfDLog.__index = AfDLog |
|||
local success, exists = pcall(function () |
|||
local title = mw.title.new(page) |
|||
return title.exists |
|||
end) |
|||
return success and exists |
|||
end |
|||
---Create a new AfDLog object instance. |
|||
local function getAfdPage(page) |
|||
---@param args table |
|||
return 'Wikipedia:削除依頼/' .. page |
|||
---@return AfDLog |
|||
end |
|||
function AfDLog.new(args) |
|||
local |
local self = setmetatable({}, AfDLog) |
||
return 'Wikipedia:削除依頼/' .. page |
|||
end |
|||
-- Set non-data parameters |
|||
local function makeWikilink(page, display) |
|||
self.talk = not not yesno(args.talk) |
|||
display = display or '議論' |
|||
self.collapse = tonumber(args.collapse) or not not yesno(args.collapse) |
|||
return string.format('[[%s|%s]]', page, display) |
|||
self.numbered = true --yesno(args.numbered) == nil or not not yesno(args.numbered) -- Disabled parameter |
|||
end |
|||
self.reversed = yesno(args.reversed) == nil or not not yesno(args.reversed) |
|||
self.currentTitle = mw.title.getCurrentTitle() |
|||
self.omitCat = (function() |
|||
local patterns = { |
|||
'^Template:削除依頼ログ', |
|||
'^Template:削除済みノート', |
|||
'^Template:不削除ノート' |
|||
} |
|||
for _, v in ipairs(patterns) do |
|||
if string.find(self.currentTitle.prefixedText, v) then |
|||
return true |
|||
end |
|||
end |
|||
return false |
|||
end)() |
|||
self.pageList = {} |
|||
self.pageInvalid = false |
|||
self._suppressPageError = args._suppressPageError == 'true' -- Private parameter |
|||
-- Get page type |
|||
local function makeUrlLink(page, display) |
|||
local thisTitle |
|||
display = display or '議論' |
|||
if self.talk then |
|||
return string.format('[%s %s]', page, display) |
|||
thisTitle = self.currentTitle.talkPageTitle.prefixedText |
|||
end |
|||
self.pageType = 'ノート' |
|||
else |
|||
local subjTitle = self.currentTitle.subjectPageTitle |
|||
thisTitle = subjTitle.prefixedText |
|||
local pageTypes = { |
|||
[0] = '記事', |
|||
[2] = '利用者ページ', |
|||
[4] = 'プロジェクトページ', |
|||
[6] = 'ファイル', |
|||
[8] = 'インターフェースページ', |
|||
[10] = 'テンプレート', |
|||
[12] = 'ヘルプページ', |
|||
[14] = 'カテゴリ', |
|||
[100] = 'ポータル', |
|||
[102] = 'プロジェクト', |
|||
[828] = 'モジュール' |
|||
} |
|||
self.pageType = pageTypes[subjTitle.namespace] |
|||
end |
|||
-- Process data paremeters (result, page, date) |
|||
------------------------------------------------------------------------------- |
|||
self.rowData = {} |
|||
-- OldAfdMulti class |
|||
self.badParameters = {} |
|||
------------------------------------------------------------------------------- |
|||
---@param prefix "result" | "page" | "date" |
|||
local OldAfdMulti = {} |
|||
---@param num number |
|||
OldAfdMulti.__index = OldAfdMulti |
|||
---@param val string |
|||
local function setRowData(prefix, num, val) |
|||
if not self.rowData[num] then -- Set default data |
|||
self.rowData[num] = { |
|||
result = '削除', |
|||
page = 'Wikipedia:削除依頼/' .. thisTitle, |
|||
date = nil |
|||
} |
|||
end |
|||
if prefix == 'page' then |
|||
local m = string.match(val, '^%[*%s*(.-)%s*%]*$') -- Remove leading/trailing brackets and spaces |
|||
if m then val = m end |
|||
val = 'Wikipedia:削除依頼/' .. val |
|||
end |
|||
self.rowData[num][prefix] = val -- Set the specified data |
|||
end |
|||
---@param paramKey string | number |
|||
function OldAfdMulti.new(args) |
|||
local function setBadParameter(paramKey) |
|||
local self = setmetatable({}, OldAfdMulti) |
|||
self.badParameters[#self.badParameters + 1] = paramKey |
|||
self.currentTitle = mw.title.getCurrentTitle() |
|||
end |
|||
-- List of accepted parameter names; true for ordered parameters and false for unordered ones |
|||
local acceptedPrefixes = { |
|||
result = true, |
|||
date = true, |
|||
page = true, |
|||
talk = false, |
|||
collapse = false, |
|||
reversed = false, |
|||
_suppresspageerror = false, -- Private parameter |
|||
-- numbered = false -- Disabled parameter |
|||
} |
|||
-- Preprocess the row args for easier looping. |
|||
self.rowData = {} |
|||
for k, v in pairs(args) do |
for k, v in pairs(args) do |
||
if type(k) == 'string' then |
if type(k) == 'string' then |
||
local key = mw.ustring.lower(k) |
|||
local prefix, num = k:match('^(.-)([1-9][0-9]*)$') |
|||
local prefix, num = key:match('^(.-)(%d*)$') |
|||
if prefix and acceptedPrefixes[prefix] ~= nil and num and num ~= '0' then |
|||
num = tonumber(num) |
|||
num = tonumber(num) or 1 |
|||
if acceptedPrefixes[prefix] == true then |
|||
prefix == 'date' or |
|||
setRowData(prefix, num, v) |
|||
prefix == 'page' or |
|||
elseif acceptedPrefixes[prefix] == false then |
|||
prefix == 'link' or |
|||
-- Do nothing |
|||
prefix == 'caption' or |
|||
else |
|||
prefix == 'votepage' |
|||
setBadParameter(k) |
|||
then |
|||
end |
|||
self.rowData[num] = self.rowData[num] or {} |
|||
else |
|||
self.rowData[num][prefix] = v |
|||
setBadParameter(k) |
|||
end |
|||
end |
|||
end |
|||
else |
|||
setBadParameter(k) |
|||
end |
end |
||
end |
end |
||
-- Set aliases for parameters ending in "1". |
|||
---Remove any gaps in the array we made. |
|||
if self.rowData[1] then |
|||
---@param t table |
|||
self.rowData[1].result = self.rowData[1].result or args.result |
|||
---@return table |
|||
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 |
|||
elseif args.result or |
|||
args.date or |
|||
args.page or |
|||
args.votepage or |
|||
args.link or |
|||
args.caption |
|||
then |
|||
self.rowData[1] = { |
|||
result = args.result, |
|||
date = args.date, |
|||
page = args.page, |
|||
votepage = args.votepage, |
|||
link = args.link, |
|||
caption = args.caption |
|||
} |
|||
end |
|||
-- Remove any gaps in the array we made. |
|||
local function compressSparseArray(t) |
local function compressSparseArray(t) |
||
local ret, nums = {}, {} |
local ret, nums = {}, {} |
||
101行目: | 138行目: | ||
end |
end |
||
self.rowData = compressSparseArray(self.rowData) |
self.rowData = compressSparseArray(self.rowData) |
||
self.hasNoData = not self.rowData[1] |
|||
-- 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.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 'ページ' |
|||
return self |
return self |
||
end |
|||
function OldAfdMulti:renderResult(result) |
|||
return result or "'''存続'''" |
|||
end |
end |
||
---Render the AfDLog instance as a message box. |
|||
function OldAfdMulti:renderDate(date) |
|||
---@return string |
|||
if date then |
|||
function AfDLog:renderBox() |
|||
return date |
|||
return require('Module:Message box').main('tmbox', { |
|||
else |
|||
type = 'notice', |
|||
self.hasMissingDate = true |
|||
image = '[[File:Clipboard.svg|35px|削除依頼]]', |
|||
return string.format( |
|||
text = self:_renderBoxText() |
|||
'<sup>%s[[%s|日付がありません]]%s</sup>', |
|||
}) |
|||
mw.text.nowiki('['), |
|||
TEMPLATE_PAGE, |
|||
mw.text.nowiki(']') |
|||
) |
|||
end |
|||
end |
end |
||
function AfDLog:_renderBoxText() |
|||
function OldAfdMulti:renderPageText(linkFunc, page, caption) |
|||
return string.format('、%s', linkFunc(page, caption)) |
|||
end |
|||
local nRows = #self.rowData |
|||
function OldAfdMulti:renderRow(result, date, link) |
|||
local |
local ret = {} |
||
if nRows == 1 and self.rowData[1].date then |
|||
ret[#ret + 1] = string.format( |
|||
if link then |
|||
'この%sは%sに[[Wikipedia:削除依頼|削除依頼]]の審議対象になりました。', |
|||
return string.format('%s、%s提出、%s', result, date, link) |
|||
self.pageType, |
|||
else |
|||
self.rowData[1].date |
|||
return string.format('%s、%s提出', result, date) |
|||
) |
|||
else |
|||
ret[#ret + 1] = string.format( |
|||
'この%sは過去に[[Wikipedia:削除依頼|削除依頼]]の審議対象になりました。', |
|||
self.pageType |
|||
) |
|||
end |
|||
if nRows > 1 then |
|||
ret[#ret + 1] = '新しく依頼を提出する場合、以下を参考にしてください。' |
|||
ret[#ret + 1] = '\n' |
|||
ret[#ret + 1] = self:_renderMultipleRows() |
|||
elseif nRows == 1 then |
|||
ret[#ret + 1] = self:_renderFirstRow() |
|||
else -- There's no rowData |
|||
-- Do nothing |
|||
end |
end |
||
end |
|||
local errorMessage = self:_renderErrors() |
|||
function OldAfdMulti:renderFirstRow(data) |
|||
ret[#ret + 1] = #errorMessage > 0 and table.concat(errorMessage) or '' |
|||
local link |
|||
if data.link then |
|||
return table.concat(ret) |
|||
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) |
|||
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) |
|||
end |
end |
||
function |
function AfDLog:_renderMultipleRows() |
||
local root = mw.html.create() |
local root = mw.html.create() |
||
local nRows = #self.rowData |
local nRows = #self.rowData |
||
local i = nRows |
local i = self.reversed and nRows or 1 |
||
local nCollapsedRows |
local nCollapsedRows |
||
204行目: | 218行目: | ||
:tag('tr') |
:tag('tr') |
||
:tag('td') |
:tag('td') |
||
:tag(self. |
:tag(self.numbered 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 |
end |
||
217行目: | 224行目: | ||
if hasNormalRows then |
if hasNormalRows then |
||
local normalList = makeList(false) |
local normalList = makeList(false) |
||
if self.reversed then |
|||
while i > 1 and i > nCollapsedRows do |
|||
while i >= 1 and i > nCollapsedRows do |
|||
renderRow(normalList, 'renderSubsequentRow', self.rowData[i]) |
|||
self:_renderRow(i, normalList) |
|||
i = i - 1 |
|||
i = i - 1 |
|||
end |
|||
end |
|||
if i == 1 and i > nCollapsedRows then |
|||
else |
|||
renderRow(normalList, 'renderFirstRow', self.rowData[i]) |
|||
while i <= nRows - nCollapsedRows do |
|||
i = i - 1 |
|||
self:_renderRow(i, normalList) |
|||
end |
|||
i = i + 1 |
|||
end |
|||
end |
|||
end |
end |
||
232行目: | 242行目: | ||
if hasNormalRows then |
if hasNormalRows then |
||
header = '過去の削除依頼:' |
header = '過去の削除依頼:' |
||
elseif nRows > 1 then |
|||
header = '削除依頼:' |
|||
else |
else |
||
header = '削除依頼:' |
header = '削除依頼:' |
||
end |
end |
||
local collapsedList = makeList(true, header) |
local collapsedList = makeList(true, header) |
||
if self.reversed then |
|||
while i > 1 do |
|||
while i >= 1 do |
|||
renderRow(collapsedList, 'renderSubsequentRow', self.rowData[i]) |
|||
self:_renderRow(i, collapsedList) |
|||
i = i - 1 |
|||
i = i - 1 |
|||
end |
|||
end |
|||
renderRow(collapsedList, 'renderFirstRow', self.rowData[i]) |
|||
else |
|||
while i <= nRows do |
|||
self:_renderRow(i, collapsedList) |
|||
i = i + 1 |
|||
end |
|||
end |
|||
end |
end |
||
return tostring(root) |
return tostring(root) |
||
end |
end |
||
function |
function AfDLog:_renderRow(rowNum, html) |
||
local data = self.rowData[rowNum] |
|||
local link = self:_addPage(data) |
|||
local wkt |
|||
if data.date then |
|||
wkt = string.format('<b>%s</b> %s (%s)', data.result, link, data.date) |
|||
else |
|||
wkt = string.format('<b>%s</b> %s', data.result, link) |
|||
local page = data.page or self.currentTitle.text |
|||
end |
|||
if exists(getAfdPage(page)) then |
|||
html |
|||
link = makeWikilink(getAfdPage(page), caption) |
|||
:tag('li') |
|||
elseif exists(getVfdPage(page)) then |
|||
:attr('value', self.numbered and rowNum or nil) |
|||
link = makeWikilink(getVfdPage(page), caption) |
|||
:wikitext(wkt) |
|||
else |
|||
end |
|||
link = caption -- Make this an error? |
|||
end |
|||
function AfDLog:_renderFirstRow() |
|||
end |
|||
local |
local data = self.rowData[1] |
||
return string.format( |
return string.format( |
||
'%sの結果、%s |
'%sの結果、<b>%s</b>となりました。', |
||
self:_addPage(data, '議論'), |
|||
link, result |
|||
data.result |
|||
) |
) |
||
end |
end |
||
---Clean up pagetitle, check its existence, and set the 'pageInvalid' parameter to true if there's a problem. |
|||
function OldAfdMulti:renderBannerText() |
|||
---@param data table rowData object |
|||
---@param caption? string If nil, same as data.page |
|||
---@return string wikilink |
|||
function AfDLog:_addPage(data, caption) |
|||
local title = mw.title.new(data.page) |
|||
if title then |
|||
data.page = title.prefixedText |
|||
if self.pageList[data.page] == nil and not self._suppressPageError then |
|||
self.pageList[data.page] = title.exists |
|||
else |
|||
self.pageList[data.page] = true |
|||
end |
|||
else |
|||
self.pageList[data.page] = false |
|||
end |
|||
if not self.pageInvalid and not self.pageList[data.page] then |
|||
self.pageInvalid = true |
|||
end |
|||
if title then |
|||
return string.format( |
|||
'[[%s|%s]]', |
|||
data.page, |
|||
caption or data.page |
|||
) |
|||
else |
|||
return string.format( |
|||
'%s%s%s', |
|||
mw.text.nowiki('[['), |
|||
data.page, |
|||
mw.text.nowiki(']]') |
|||
) |
|||
end |
|||
end |
|||
function AfDLog:_renderErrors() |
|||
local ret = {} |
local ret = {} |
||
local errorMessage = '<strong class="error" style="display:block;">エラー: %s</strong>' |
|||
if nRows < 1 or not self.rowData[1].date then |
|||
if self.hasNoData then |
|||
ret[#ret + 1] = string.format( |
|||
ret[#ret + 1] = string.format( |
|||
'この%sは[[Wikipedia:削除依頼|削除依頼]]が提出されました。', |
|||
errorMessage, |
|||
self.pageType |
|||
'必須引数が指定されていません' |
|||
) |
|||
) |
|||
elseif nRows == 1 and self.rowData[1].date then |
|||
end |
|||
ret[#ret + 1] = string.format( |
|||
if #self.badParameters > 0 then |
|||
'この%sは%sに[[Wikipedia:削除依頼|削除依頼]]が提出されました。', |
|||
ret[#ret + 1] = string.format( |
|||
self.pageType, |
|||
errorMessage, |
|||
self.rowData[1].date |
|||
string.format( |
|||
) |
|||
'不正な引数が指定されています (%s)', |
|||
else |
|||
table.concat(self.badParameters, ', ') |
|||
ret[#ret + 1] = string.format( |
|||
) |
|||
'この%sは[[Wikipedia:削除依頼|削除依頼]]が提出されました。', |
|||
) |
|||
self.pageType |
|||
end |
|||
) |
|||
if self.pageInvalid then |
|||
ret[#ret + 1] = string.format( |
|||
errorMessage, |
|||
'不正な削除依頼サブページ名が指定されています' |
|||
) |
|||
end |
|||
-- Add cat if the caller isn't a template invoking this module |
|||
if #ret > 0 then |
|||
ret[#ret + 1] = self:renderCat() |
|||
end |
end |
||
return ret |
|||
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 |
end |
||
function |
function AfDLog:renderCat() |
||
return self.omitCat and '' or '[[Category:テンプレート呼び出しエラーのあるページ/Template:削除依頼ログ]]' |
|||
return mMessageBox.main('tmbox', { |
|||
small = self.isSmall, |
|||
type = 'notice', |
|||
image = '[[File:Clipboard.svg|35px|削除依頼]]', |
|||
smallimage = 'none', |
|||
text = self:renderBannerText() |
|||
}) |
|||
end |
end |
||
function |
function AfDLog:renderRawTemplate() |
||
local ret = {} |
|||
ret[#ret + 1] = '{{削除依頼ログ/sandbox' |
|||
if self.hasMissingDate and self.currentTitle.isTalkPage then |
|||
for i, _ in ipairs(self.rowData) do |
|||
ret[#ret + 1] = '' |
|||
local data = self.rowData[i] |
|||
end |
|||
ret[#ret + 1] = '\n' |
|||
return table.concat(ret) |
|||
ret[#ret + 1] = string.format('|result%s=%s', i, data.result) |
|||
end |
|||
ret[#ret + 1] = string.format('|page%s=%s', i, string.gsub(data.page, '^Wikipedia:削除依頼/', '')) |
|||
ret[#ret + 1] = string.format('|date%s=%s', i, data.date or '') |
|||
function OldAfdMulti:__tostring() |
|||
end |
|||
return self:renderBanner() .. self:renderTrackingCategories() |
|||
ret[#ret + 1] = '\n' |
|||
ret[#ret + 1] = '|talk=' .. tostring(self.talk) |
|||
ret[#ret + 1] = '\n' |
|||
ret[#ret + 1] = '|collapse=' .. tostring(self.collapse) |
|||
-- ret[#ret + 1] = '\n' |
|||
-- ret[#ret + 1] = '|numbered=' .. tostring(self.numbered) |
|||
ret[#ret + 1] = '\n' |
|||
ret[#ret + 1] = '}}' |
|||
return table.concat(ret) |
|||
end |
end |
||
336行目: | 385行目: | ||
function p._main(args) |
function p._main(args) |
||
local afd = OldAfdMulti.new(args) |
|||
local afd = AfDLog.new(args) |
|||
return tostring(afd) |
|||
local caller = mw.getCurrentFrame():getParent():getTitle() |
|||
local callerTitle = caller:match('^Template:(削除済みノート)') or caller:match('^Template:(不削除ノート)') |
|||
if mw.isSubsting() then |
|||
return afd:renderRawTemplate() |
|||
elseif callerTitle then |
|||
local ret = {} |
|||
ret[#ret + 1] = '<strong class="error">エラー: ' |
|||
ret[#ret + 1] = '[[Help:テンプレート#テンプレートの内容で置き換える|subst:]] がありません。' |
|||
ret[#ret + 1] = string.format('「%s」ではなく「subst:%s」としてください。', callerTitle, callerTitle) |
|||
ret[#ret + 1] = '</strong>' |
|||
ret[#ret + 1] = afd:renderCat() |
|||
return table.concat(ret) |
|||
else |
|||
return afd:renderBox() |
|||
end |
|||
end |
end |
||
function p.main(frame) |
function p.main(frame) |
||
local args = require('Module:Arguments').getArgs(frame, { |
local args = require('Module:Arguments').getArgs(frame, { |
||
wrappers = |
wrappers = { |
||
'Template:削除依頼ログ' |
|||
} |
|||
}) |
}) |
||
return p._main(args) |
return p._main(args) |