Jump to content

Module:Backwards copy: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
downgrade missing date to warning if year provided in author
further downgrade missing date to prevent hiding box content if no date was provided
Line 82: Line 82:
), demoCheck(args))
), demoCheck(args))
else
else
return showError(string.format(
text = text .. " " .. showWarning(string.format(
"Provided <code>title%s</code> must also have a respective <code>year%s</code> or <code>date%s</code> parameter.",
"Provided <code>title%s</code> must also have a respective <code>year%s</code> or <code>date%s</code> parameter.",
i, i, i
i, i, i

Revision as of 04:17, 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 backwards copy 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 backwards copy errors]] ",
		tostring(
			mw.html.create("span")
				:css("color", "red")
				:css("font-weight", "bold")
				:wikitext("Error:")
		),
		text
	)
end

local function row(args, i)
	return mw.html.create("li"):wikitext(rowText)
end

local function bannerText(frame, args)
	local text = ""
	
	local id = args["id"] or args["revid"]
	if id ~= nil then
		text = string.format("Revisions succeeding [[Special:Diff/%s|this version]] of this", id)
	else
		text = "This"
	end
	
	local citations = {}
	local i = 1
	while (
		args[tostring(i)] or 
			(args["articlename" .. i] or (i == 1 and args["articlename"])) or 
			(args["title" .. i] or (i == 1 and args["title"]))
	) do
		if args[tostring(i)] then
			table.insert(citations, args[tostring(i)])
		else
			local author = args["author" .. i] or (i == 1 and args["author"])
			local authors = args["authorlist" .. i] or (i == 1 and args["authorlist"])
			local date = (args["date" .. i] or (i == 1 and args["date"])) or
				-- legacy way of providing dates
				string.format(
					"%s %s",
					args["monthday" .. i] or (i == 1 and args["monthday"]) or "",
					args["year" .. i] or (i == 1 and args["year"]) or ""
				)
				
			if mw.text.trim(date or "") == "" then
				if string.match(author or "", "(%d%d%d[%d]+)") then
					text = text .. " " .. showWarning(string.format(
						"A <code>year%s</code> or <code>date%s</code> parameter was not found, but a parenthesized year was found in the " ..
						"<code>author%s</code> parameter. Move the provided year to the correct parameter.",
						i, i, i
					), demoCheck(args))
				elseif string.match(authors or "", "(%d%d%d[%d]*)") then
					text = text .. " " .. showWarning(string.format(
						"A <code>year%s</code> or <code>date%s</code> parameter was not found, but a parenthesized year was found in the " ..
						"<code>authorlist%s</code> parameter. Move the provided year to the correct parameter.",
						i, i, i
					), demoCheck(args))
				else
					text = text .. " " .. showWarning(string.format(
						"Provided <code>title%s</code> must also have a respective <code>year%s</code> or <code>date%s</code> parameter.",
						i, i, i
					))
				end
			end
			
			table.insert(citations, frame:expandTemplate{ title = "Citation", args = {
				ref = "none",
				author = author,
				authors = authors,
				["display-authors"] = args["display-authors" .. i] or (i == 1 and args["display-authors"]),
				date = date,
				url = args["url" .. i] or (i == 1 and args["url"]),
				title = (args["articlename" .. i] or (i == 1 and args["articlename"]))
					or args["title" .. i] or (i == 1 and args["title"]),
				publisher = (args["org" .. i] or (i == 1 and args["org"]))
					or args["publisher" .. i] or (i == 1 and args["publisher"])
			} })
		end
		
		i = i + 1
	end

	text = string.format(
		"%s article is substantially duplicated by a piece in an external publication. " ..
		"Please do not flag this article as a copyright violation of the following source",
		text
	)
	local citationCount = #citations
	if citationCount == 0 then
		return showError(
			"No citations were provided. Provide at least one citation using <code>title</code>.", 
			demoCheck(args)
		)
	elseif citationCount > 1 then
		text = string.format("%ss:", text)
	else
		text = string.format("%s:", text)
	end
	
	local ul = mw.html.create("ul")
	for k, v in pairs(citations) do
		ul:node(mw.html.create("li"):wikitext(v))
	end
	
	text = string.format(
		"%s %s %s",
		text,
		tostring(ul),
		args["comments"] and tostring(
			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("Additional comments")
					)
				)
				:node(mw.html.create("tr"):node(mw.html.create("td")
					:attr("style", "background-color: white; border: 1px solid #c0c090; padding: 0.25em 0.5em;")
					:wikitext(
						args["comments"]
					)
				))
		) or ""
	)
	
	return text
end

function p.renderBanner(frame, args)
	return MessageBox.main('tmbox', {
		name = "backwards-copy",
		small = yesno(args["small"]),
		image = '[[File:Newspaper Cover.svg|50px]]',
		text = bannerText(frame, args)
	}) .. (demoCheck(args) and "[[Category:Wikipedia article talk pages incorporating the backwardscopy template]]" or "")
end

function p.main(frame)
	local getArgs = require('Module:Arguments').getArgs
	local args = getArgs(frame, {
		trim = true,
		removeBlanks = true
	})
	return p.renderBanner(frame, args)
end

return p