Jump to content

Module:Split article: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
fixes
fixing misnested tag (td without tr), rm logObject
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local MessageBox = require('Module:Message box')
local MessageBox = require("Module:Message box")
local yesno = require("Module:Yesno")
local yesno = require("Module:Yesno")


Line 11: Line 11:
mw.addWarning(text)
mw.addWarning(text)
return nocat and "" or "[[Category:Pages with split article warnings]]"
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
end


Line 30: Line 37:
local text = ""
local text = ""
-- from1 also included in case someone filed the template improperly
-- from1 also included in case someone filed the template improperly
local from = args["from"] or args["from1"] or mw.title.getCurrentTitle().subjectPageTitle.prefixedText
local from = delink(args["from"] or args["from1"]) or mw.title.getCurrentTitle().subjectPageTitle.prefixedText
local fromTalk = mw.title.new(from).talkPageTitle.prefixedText
local fromTalk = mw.title.new(from).talkPageTitle.prefixedText
Line 41: Line 48:
-- Row-based parameters
-- Row-based parameters
local to = args["to"] or args["to1"]
local to = delink(args["to"] or args["to1"])
local diff = args["diff"] or args["diff1"]
local diff = args["diff"] or args["diff1"]
local date = args["date"] or args["date1"]
local date = args["date"] or args["date1"]
Line 49: Line 56:
end
end
if date == nil then
if date == nil then
return showError("Split date was not specified with <code>date</code>.", demoCheck(args))
text = text .. showWarning("Split date was not specified with <code>date</code>. This may cause an error in the future.", demoCheck(args))
end
end
text = string.format("Material from [[%s]] was split to [[%s]]", from, to, date)
text = string.format("Material from [[%s]] was split to [[%s]]", from, to, date)
if diff ~= nil then
if diff ~= nil and date ~= nil then
if from_oldid:match("^[0123456789/]+$") then
if diff:match("^[0123456789/]+$") then
text = string.format("%s on [[Special:Diff/%s|%s]]", text, diff, date)
text = string.format("%s on [[Special:Diff/%s|%s]]", text, diff, date)
else
else
text = string.format("%s on [%s %s]", text, diff, date)
text = string.format("%s on [%s %s]", text, diff, date)
end
end
elseif date ~= nil then
else
text = string.format("%s on %s", text, date)
text = string.format("%s on %s", text, date)
end
end
Line 90: Line 97:


local function row(args, i)
local function row(args, i)
local to = args["to" .. i] or (i == 1 and args["to"] or nil)
local to = delink(args["to" .. i] or (i == 1 and args["to"] or nil))
local toTalk = mw.title.new(to).subjectPageTitle.prefixedText
local toTalk = mw.title.new(delink(to)).subjectPageTitle.prefixedText
local diff = args["diff" .. i] or (i == 1 and args["diff"] or nil)
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 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)
local from_oldid = args["from_oldid" .. i] or (i == 1 and args["from_oldid"] or nil)
if date == nil then
if date == nil then
return showError(string.format(
text = text .. showWarning(string.format(
"Split date for \"%s\" (<code>to%s</code>) was not specified with <code>date</code>.",
"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
to, i
), demoCheck(args))
), demoCheck(args))
Line 106: Line 113:
to, toTalk, to, date, diff
to, toTalk, to, date, diff
)
)
if diff ~= nil then
if diff ~= nil and date ~= nil then
if from_oldid:match("^[0123456789/]+$") then
if diff:match("^[0123456789/]+$") then
rowText = string.format("%s on [[Special:Diff/%s|%s]]", rowText, diff, date)
rowText = string.format("%s on [[Special:Diff/%s|%s]]", rowText, diff, date)
else
else
rowText = string.format("%s on [%s %s]", rowText, diff, date)
rowText = string.format("%s on [%s %s]", rowText, diff, date)
end
end
elseif date ~= nil then
else
rowText = string.format("%s on %s", rowText, date)
rowText = string.format("%s on %s", rowText, date)
end
end
Line 129: Line 136:
local text = ""
local text = ""
-- from1 also included in case someone filed the template improperly
-- from1 also included in case someone filed the template improperly
local from = args["from"] or args["from1"] or mw.title.getCurrentTitle().subjectPageTitle.prefixedText
local from = delink(args["from"] or args["from1"]) or mw.title.getCurrentTitle().subjectPageTitle.prefixedText
local fromTalk = mw.title.new(from).talkPageTitle.prefixedText
local fromTalk = mw.title.new(delink(from)).talkPageTitle.prefixedText
local collapse = tonumber(args["collapse"]) or yesno(args["collapse"])
if args["from1"] then
if args["from1"] then
text = text .. showWarning(
text = text .. showWarning(
Line 153: Line 161:
)
)
local li = mw.html.create("ul")
local ul = mw.html.create("ul")
local ul2
local target = ul
-- Row-based parameters
-- Row-based parameters
local i = 1
local i = 1
while args["to" .. i] or (i == 1 and args["to"]) do
while args["to" .. i] or (i == 1 and args["to"]) do
-- Swap out ul with collapsible table if collapsible
li:node(row(args, i))
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
i = i + 1
end
end
Line 169: Line 208:
end
end
text = text .. " " .. tostring(li)
text = text .. " " .. tostring(ul2 or "") .. tostring(target)
return text
return text

Latest revision as of 03:06, 18 August 2022

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