Module: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 "" 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 " ",		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(			" is not a row-based parameter. Use   instead of  .",			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 .", demoCheck(args)) end if date == nil then text = text .. showWarning("Split date was not specified with . 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 %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 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 history now serves to "..		"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\" was not specified with  . This may cause an error in the future.", to, i		), demoCheck(args)) end local rowText = string.format(		"%s (talk | history)",		to, toTalk, to, date, diff	) if diff ~= nil and date ~= nil then if diff:match("^[0123456789/]+$") then rowText = string.format("%s on %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 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(			" is not a row-based parameter. Use   instead of  .",			demoCheck(args)		) end if args["from_oldid1"] then text = text .. showWarning(			" is not a row-based parameter. Use   instead of  .",			demoCheck(args)		) end text = string.format(		"Material from %s was split to other pages. The former page's "..		"history now serves to "..		"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 = '',		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