この解説は、モジュール:UserAN/docから呼び出されています。 (編集 | 履歴) 編集者は、このモジュールをサンドボックス (作成 | 複製)とテストケース (作成)で試すことができます。(解説) このモジュールのサブページ一覧。 |
local modip = require('Module:IP') ---Enclose a string by plainlinks ---@param str string ---@return string local function plainlinks(str) return '<span class="plainlinks" style="font-size:smaller;">' .. str .. '</span>' end --Alternative to ternary operator local function ternary(cond, T, F) if cond then return T else return F end end ---OR evaluator ---@param comparator any ---@param ... unknown ---@return boolean local function anyOf(comparator, ...) for _, v in ipairs(arg) do if comparator == v then return true end end return false end ---Get links to show for a reportee in accordance with the UserAN type ---@param reportee string ---@param lcType string ---@param ipType "cidr"|"ip"|"none" ---@return string local function getTypedLinks(reportee, lcType, ipType) local usernolink = '利用者:' .. reportee local userlink = '[[' .. usernolink .. ']]' local reporteeUri = string.gsub(reportee, ' ', '_') local talk = '[[User talk:' .. reporteeUri .. '|会話]]' local contribs = '[[特別:投稿記録/' .. reporteeUri .. '|投稿記録]]' local log = '[//ja.wikivoyage.org/w/index.php?title=特別:Log&page=User:' .. reporteeUri .. ' 記録]' local filterLog = '[//ja.wikivoyage.org/w/index.php?title=特別:AbuseLog&wpSearchUser=' .. reporteeUri .. ' フィルター記録]' local ca = '[[特別:CentralAuth/' .. reporteeUri .. '|CA]]' local guc = '[//xtools.wmflabs.org/globalcontribs/ipr-' .. reporteeUri .. ' GUC]' local spur = '[//spur.us/context/' .. reporteeUri .. ' SPUR]' local block = '[[特別:block/' .. reporteeUri .. '|ブロック]]' local logid = '[[特別:転送/logid/' .. reporteeUri .. '|Logid/' .. reporteeUri .. ']]' local diff = '[[特別:差分/' .. reporteeUri .. '|差分/' .. reporteeUri .. ']]の投稿者' local defaultLinks = { user2 = userlink .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. filterLog .. ' / ' .. ca .. ' / ' .. block .. ')'), unl = usernolink .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. filterLog .. ' / ' .. ca .. ' / ' .. block .. ')'), ip2 = 'IP:' .. reportee .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. filterLog .. ' / ' .. guc .. ' / ' .. spur .. ' / ' .. block .. ')'), ip2cidr = 'IP:' .. reportee .. plainlinks('(' .. talk .. ' / ' .. contribs .. ' / ' .. log .. ' / ' .. guc .. ' / ' .. spur .. ' / ' .. block .. ')'), logid = logid, diff = diff, none = reportee } local links if anyOf(lcType, 'usernolink', 'unl') then links = defaultLinks.unl elseif anyOf(lcType, 'ipuser2', 'ip2') then links = ternary(ipType == 'cidr', defaultLinks.ip2cidr, defaultLinks.ip2) elseif anyOf(lcType, 'log', 'logid') then links = defaultLinks.logid elseif anyOf(lcType, 'dif', 'diff') then links = defaultLinks.diff elseif lcType == 'none' then links = defaultLinks.none else links = defaultLinks.user2 end return links end local errCnt = 0 ---Error handling function ---@param errorType "nousername"|"nonipexpected"|"ipexpected"|"invalidcidr"|"numberexpected"|"invalidtype" ---@param typeParam string ---@param invalidSubnet string? ---@return string local function errHandler(errorType, typeParam, invalidSubnet) errCnt = errCnt + 1 local err = { nousername = '第一引数は必須です', nonipexpected = 'type=' .. typeParam .. 'に対しIPアドレスが指定されています', ipexpected = 'type=' .. typeParam .. 'には有効なIPアドレスを指定してください', invalidcidr = ternary(invalidSubnet, invalidSubnet, '') .. 'は無効なIPサブネットです', numberexpected = 'type=' .. typeParam .. 'には数字を指定してください', invalidtype = 'type=' .. typeParam .. 'は存在しません' } local msg = ternary(errCnt == 1, '[[Template:UserAN|UserAN]]エラー: ', '; ') .. err[errorType] msg = '<span style="color: red; font-weight: bold;">' .. msg .. '</span>' if errCnt == 1 and mw.getCurrentFrame():getParent():getTitle() == 'Template:UserAN' then -- Add category only when called from this template msg = msg .. '[[Category:テンプレート呼び出しエラーのあるページ/Template:UserAN]]' end return msg end -- Icons to show leading the username local defaultIcons = { done = '[[File:Yes check.svg|20px|<span class="done">済</span>]]', done2 = '[[File:Yes check.svg|20px|<span class="done">済</span>]] <small><b>済</b></small>', doing = '[[File:Stock post message.svg|22px|<span class="doing">未了</span>]]', rejected = '[[File:X mark.svg|20px|<span class="done">却下</span>]] <small><b>却下</b></small>', withdrawn = '[[File:X mark.svg|20px|<span class="done">取り下げ</span>]] <small><b>取り下げ</b></small>', deferred = '[[File:X mark.svg|20px|<span class="done">見送り</span>]] <small><b>見送り</b></small>' } -- Main package function local p = {} function p.Main(frame) local args = frame.args local u = modip.Util.removeDirMarkers(args.username) local t = modip.Util.removeDirMarkers(args.type) t = ternary(t == '', 'User2', t) -- Evaluate the username parameter if u == '' then return errHandler('nousername', '') else u = u:gsub('_', ' ') end -- Evaluate IP local isIp = modip.Util.isIPAddress(u) local isCidr, _, corrected = modip.Util.isIPAddress(u, true, true) local isIPAddress = isIp or isCidr u = ternary(isIPAddress, u:upper(), u) -- Capitalize u if it's an IP if corrected ~= nil then corrected = corrected:upper() end -- Same as above -- Evaluate the type parameter and its compatibility with the username parameter local lcType = string.lower(t) local function generateIpErr() return errHandler('nonipexpected', t) .. ternary(corrected ~= nil, errHandler('invalidcidr', t, u), '') end local errorMsg = '' if anyOf(lcType, 'usernolink', 'unl', 'user2', 'none') then if isIPAddress then errorMsg = generateIpErr() lcType = 'ip2' end elseif anyOf(lcType, 'ipuser2', 'ip2') then if not isIPAddress then errorMsg = errHandler('ipexpected', t) lcType = 'unl' elseif corrected ~= nil then -- Cidr is provided but modified because it's invalid errorMsg = errHandler('invalidcidr', t, u) end elseif anyOf(lcType, 'log', 'logid', 'dif', 'diff') then if not u:find('^%d+$') then -- if not a number errorMsg = errHandler('numberexpected', t) lcType = 'unl' if isIPAddress then errorMsg = errorMsg .. generateIpErr() lcType = 'ip2' end end else errorMsg = errHandler('invalidtype', t) lcType = 'unl' if isIPAddress then errorMsg = errorMsg .. generateIpErr() lcType = 'ip2' end end errorMsg = ternary(errorMsg ~= '', '<small>' .. errorMsg .. '</small>', errorMsg) -- Get links to show local ipType = ternary(isCidr, 'cidr', ternary(isIp, 'ip', 'none')) local links = getTypedLinks(ternary(corrected ~= nil, corrected, u), lcType, ipType) -- Add icon local icon local autostatus = args.autostatus -- 2= local lcAutostatus = string.lower(autostatus) local manualstatus = args.manualstatus -- 状態= if lcAutostatus == '' then icon = ternary(manualstatus == '', defaultIcons.doing, defaultIcons.done2) elseif anyOf(lcAutostatus, 'done', '済', '済み') then icon = defaultIcons.done elseif anyOf(lcAutostatus, 'not done', '却下', '非対処') then icon = defaultIcons.rejected elseif lcAutostatus == '取り下げ' then icon = defaultIcons.withdrawn elseif lcAutostatus == '見送り' then icon = defaultIcons.deferred else icon = defaultIcons.done .. ' <small><b>' .. autostatus .. '</b></small>' end -- Return the string to display return icon .. ' ' .. links .. errorMsg end return p