Module:Split article
Implements {{split article}}
local MessageBox = require("Module:Message box") local yesno = require("Module:Yesno") local p = {} local function demoCheck(args) return yesno(args["demo"]) or yesno(args["nocat"]) end local function showWarning(text, nocat) mw.addWarning(text) return nocat and "" or "[[Category:Pages with split article warnings]]" end local function delink(text) if text == nil then return nil end return string.gsub(string.gsub(require("Module:Delink")._delink{text}, "%[%[", ""), "%]%]", "") end local function showError(text, nocat) return string.format( "%s%s %s", nocat and "" or "[[Category:Pages with split article errors]] ", tostring( mw.html.create("span") :css("color", "red") :css("font-weight", "bold") :wikitext("Error:") ), text ) end local function singleText(args) local text = "" -- from1 also included in case someone filed the template improperly local from = delink(args["from"] or args["from1"]) or mw.title.getCurrentTitle().subjectPageTitle.prefixedText local fromTalk = mw.title.new(from).talkPageTitle.prefixedText if args["from1"] then text = text .. showWarning( "<code>from</code> is not a row-based parameter. Use <code>from</code> instead of <code>from1</code>.", demoCheck(args) ) end -- Row-based parameters local to = delink(args["to"] or args["to1"]) local diff = args["diff"] or args["diff1"] local date = args["date"] or args["date1"] local from_oldid = args["from_oldid"] or args["from_oldid1"] if to == nil then return showError("Target page was not specified with <code>to</code>.", demoCheck(args)) end if date == nil then text = text .. showWarning("Split date was not specified with <code>date</code>. This may cause an error in the future.", demoCheck(args)) end text = string.format("Material from [[%s]] was split to [[%s]]", from, to, date) if diff ~= nil and date ~= nil then if diff:match("^[0123456789/]+$") then text = string.format("%s on [[Special:Diff/%s|%s]]", text, diff, date) else text = string.format("%s on [%s %s]", text, diff, date) end elseif date ~= nil then text = string.format("%s on %s", text, date) end if from_oldid ~= nil then if from_oldid:match("^[0123456789/]+$") then text = string.format("%s from [[Special:Diff/%s|this version]]", text, from_oldid) else text = string.format("%s from [%s this version]", text, from_oldid) end end text = string.format( "%s. The former page's [[Special:PageHistory/%s|history]] now serves to ".. "[[Wikipedia:Copying within Wikipedia|provide attribution]] for that content ".. "in the latter page, and it must not be deleted so long as the latter page ".. "exists. Please leave this template in place to link the article histories ".. "and preserve this attribution.", text, from ) if fromTalk ~= mw.title.getCurrentTitle().prefixedText then text = string.format( "%s The former page's talk page can be accessed at [[%s]].", text, fromTalk ) end return text end local function row(args, i) local to = delink(args["to" .. i] or (i == 1 and args["to"] or nil)) local toTalk = mw.title.new(delink(to)).subjectPageTitle.prefixedText local diff = args["diff" .. i] or (i == 1 and args["diff"] or nil) local date = args["date" .. i] or (i == 1 and args["date"] or nil) local from_oldid = args["from_oldid" .. i] or (i == 1 and args["from_oldid"] or nil) if date == nil then text = text .. showWarning(string.format( "Split date for \"%s\" (<code>to%s</code>) was not specified with <code>date</code>. This may cause an error in the future.", to, i ), demoCheck(args)) end local rowText = string.format( "[[%s]] ([[%s|talk]] | [[Special:PageHistory/%s|history]])", to, toTalk, to, date, diff ) if diff ~= nil and date ~= nil then if diff:match("^[0123456789/]+$") then rowText = string.format("%s on [[Special:Diff/%s|%s]]", rowText, diff, date) else rowText = string.format("%s on [%s %s]", rowText, diff, date) end elseif date ~= nil then rowText = string.format("%s on %s", rowText, date) end if from_oldid ~= nil then if from_oldid:match("^%d+$") then rowText = string.format("%s from [[Special:Diff/%s|this version]]", rowText, from_oldid) else rowText = string.format("%s from [%s this version]", rowText, from_oldid) end end return mw.html.create("li"):wikitext(rowText) end local function multiText(args) local text = "" -- from1 also included in case someone filed the template improperly local from = delink(args["from"] or args["from1"]) or mw.title.getCurrentTitle().subjectPageTitle.prefixedText local fromTalk = mw.title.new(delink(from)).talkPageTitle.prefixedText local collapse = tonumber(args["collapse"]) or yesno(args["collapse"]) if args["from1"] then text = text .. showWarning( "<code>from</code> is not a row-based parameter. Use <code>from</code> instead of <code>from1</code>.", demoCheck(args) ) end if args["from_oldid1"] then text = text .. showWarning( "<code>from_oldid</code> is not a row-based parameter. Use <code>from_oldid</code> instead of <code>from_oldid1</code>.", demoCheck(args) ) end text = string.format( "Material from [[%s]] was split to other pages. The former page's ".. "[[Special:PageHistory/%s|history]] now serves to ".. "[[Wikipedia:Copying within Wikipedia|provide attribution]] for that content ".. "in the latter pages, and it must not be deleted so long as the latter pages ".. "exist. Please leave this template in place to link the article histories ".. "and preserve this attribution.", from, from ) local ul = mw.html.create("ul") local ul2 local target = ul -- Row-based parameters local i = 1 while args["to" .. i] or (i == 1 and args["to"]) do -- Swap out ul with collapsible table if collapsible if collapse == true and i == 1 then -- Only on first run target = mw.html.create("table") :attr("class", "mw-collapsible mw-collapsed") :attr("style", "width:100%; background-color: #f8eaba;") :node(mw.html.create("tr") :node(mw.html.create("th") :wikitext("Page splits") ) ) :node(mw.html.create("td"):node(ul)) elseif collapse == (i - 1) then ul2 = ul ul = mw.html.create("ul") -- Only once threshold has been reached target = mw.html.create("table") :attr("class", "mw-collapsible mw-collapsed") :attr("style", "width:100%; background-color: #f8eaba;") :node(mw.html.create("tr") :node(mw.html.create("th") :wikitext("Other page splits") ) ) :node(mw.html.create("tr") :node(mw.html.create("td"):node(ul)) ) end ul:node(row(args, i)) i = i + 1 end if fromTalk ~= mw.title.getCurrentTitle().prefixedText then text = string.format( "%s The former page's talk page can be accessed at [[%s]].", text, fromTalk ) end text = text .. " " .. tostring(ul2 or "") .. tostring(target) return text end local function bannerText(args) -- Checks if there are multiple rows local text if args["to2"] ~= nil and ((args["to1"] or args["to"]) ~= nil) then text = multiText(args) --.. categories(args,true) else text = singleText(args) --.. categories(args,false) end return text end function p.renderBanner(args) return MessageBox.main('tmbox', { name = "split-article", small = args["small"], image = '[[File:Split-arrows.svg|50px]]', text = bannerText(args) }) end function p.main(frame) local getArgs = require('Module:Arguments').getArgs local args = getArgs(frame, { trim = true, removeBlanks = true }) return p.renderBanner(args) end return p