<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADYK_checklist</id>
	<title>Module:DYK checklist - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADYK_checklist"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:DYK_checklist&amp;action=history"/>
	<updated>2026-06-14T03:46:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:DYK_checklist&amp;diff=471453&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:DYK_checklist&amp;diff=471453&amp;oldid=prev"/>
		<updated>2021-07-15T21:15:02Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module implements {{DYK checklist}}.&lt;br /&gt;
&lt;br /&gt;
-- Load modules&lt;br /&gt;
require('Module:No globals')&lt;br /&gt;
local yesno = require('Module:Yesno')&lt;br /&gt;
local data = mw.loadData('Module:DYK checklist/data')&lt;br /&gt;
local responseIcons = data.responseIcons&lt;br /&gt;
local statusIcons = data.statusIcons&lt;br /&gt;
&lt;br /&gt;
-- Template for making collapsed sections.&lt;br /&gt;
local COLLAPSED_WIKITABLE = [[&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;font-weight:normal; &amp;quot; | %s&lt;br /&gt;
|-&lt;br /&gt;
| %s&lt;br /&gt;
|}]]&lt;br /&gt;
&lt;br /&gt;
-- Template for making uncollapsed sections.&lt;br /&gt;
local UNCOLLAPSED_WIKITABLE = [[&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; style=&amp;quot;border-collapse:collapse;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| %s&lt;br /&gt;
|}]]&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Make the given key in args lowercase if when lowercased it equals val.&lt;br /&gt;
local function makeArgLowerCase(args, key, val)&lt;br /&gt;
	if args[key] and string.lower(args[key]) == val then&lt;br /&gt;
		args[key] = val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Normalize the args table to make it easier to work with elsewhere in the&lt;br /&gt;
-- module.&lt;br /&gt;
local function normalizeArguments(args)&lt;br /&gt;
	-- Consolidate aliases&lt;br /&gt;
	args.plagiarismfree = args.plagiarismfree or args.plagarismfree&lt;br /&gt;
	args.plagarismfree = nil&lt;br /&gt;
&lt;br /&gt;
	-- Normalize special values&lt;br /&gt;
	makeArgLowerCase(args, 'hookcited', 'agf')&lt;br /&gt;
	makeArgLowerCase(args, 'picfree', 'na')&lt;br /&gt;
	makeArgLowerCase(args, 'qpq', 'na')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- If any of the keys in the keys array are in the table t, return true;&lt;br /&gt;
-- otherwise, return false.&lt;br /&gt;
local function anyKeysInTable(t, keys)&lt;br /&gt;
	for i, key in ipairs(keys) do&lt;br /&gt;
		if t[key] then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Make a wikitext error message.&lt;br /&gt;
local function makeWikitextError(msg)&lt;br /&gt;
	return string.format([['''&amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;''']], msg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format a user-supplied string for display in error messages.&lt;br /&gt;
-- This prevents input from being displayed as special wiki markup, converts&lt;br /&gt;
-- multi-line strings to a single line, and truncates long strings so that they&lt;br /&gt;
-- are easier to read.&lt;br /&gt;
local function escapeUserString(s)&lt;br /&gt;
	if #s &amp;gt; 28 then&lt;br /&gt;
		s = s:sub(1, 12) .. '...' .. s:sub(-12, -1)&lt;br /&gt;
	end&lt;br /&gt;
	s = s:gsub(&amp;quot;\n&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	return mw.text.nowiki(s)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Make a collapsed wikitable with the given header and content. &lt;br /&gt;
local function makeCollapsedWikitable(header, content)&lt;br /&gt;
	return string.format(COLLAPSED_WIKITABLE, header, content)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Make an uncollapsed wikitable with the given content. &lt;br /&gt;
local function makeUncollapsedWikitable(content)&lt;br /&gt;
	return string.format(UNCOLLAPSED_WIKITABLE, content)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Make a bulleted list from an array of strings.&lt;br /&gt;
local function makeBulletedList(items)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, item in ipairs(items) do&lt;br /&gt;
		ret[i] = '* ' .. item&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret, '\n')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Make a checklist item from the given issue and status.&lt;br /&gt;
local function makeChecklistItem(issue, status, defaultMarker)&lt;br /&gt;
	if not status then&lt;br /&gt;
		return string.format('%s: %s', issue, responseIcons.UNKNOWN)&lt;br /&gt;
	elseif yesno(status) then&lt;br /&gt;
		return string.format('%s: %s', issue, responseIcons.YES)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format(&lt;br /&gt;
			'%s: %s - %s',&lt;br /&gt;
			issue,&lt;br /&gt;
			defaultMarker or responseIcons.NO,&lt;br /&gt;
			status&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return true if all issues have been resolved; return false otherwise.&lt;br /&gt;
-- mainIssues is an array of tables as passed to makeSection. otherIssues is a&lt;br /&gt;
-- string value or nil (again, as passed to makeSection).&lt;br /&gt;
local function allIssuesAreResolved(mainIssues, otherIssues)&lt;br /&gt;
	if otherIssues then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for i, t in ipairs(mainIssues) do&lt;br /&gt;
		if t.isResolved == false&lt;br /&gt;
			or (&lt;br /&gt;
				t.isResolved ~= true&lt;br /&gt;
				and not yesno(t.status)&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Assemble a section of the DYK checklist.&lt;br /&gt;
local function makeSection(options)&lt;br /&gt;
	local issues = {}&lt;br /&gt;
&lt;br /&gt;
	-- Add main issues&lt;br /&gt;
	options.mainIssues = options.mainIssues or {}&lt;br /&gt;
	for i, t in ipairs(options.mainIssues) do&lt;br /&gt;
		local checklistItem&lt;br /&gt;
		if t.isResolved then&lt;br /&gt;
			checklistItem = makeChecklistItem(t.issue, t.status, responseIcons.YES)&lt;br /&gt;
		else&lt;br /&gt;
			checklistItem = makeChecklistItem(t.issue, t.status)&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(issues, checklistItem)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add other issues&lt;br /&gt;
	if options.otherIssues then&lt;br /&gt;
		table.insert(issues, makeChecklistItem('Other problems', options.otherIssues))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Make the section output.&lt;br /&gt;
	local content = makeBulletedList(issues)&lt;br /&gt;
	if allIssuesAreResolved(options.mainIssues, options.otherIssues) then&lt;br /&gt;
		return makeCollapsedWikitable(options.resolvedHeader, '\n' .. content)&lt;br /&gt;
	else&lt;br /&gt;
		return options.unresolvedHeader .. '\n' .. content&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Section functions&lt;br /&gt;
-- Each of these functions makes a single section of the DYK checklist.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeGeneralEligibilitySection(args)&lt;br /&gt;
	return makeSection{&lt;br /&gt;
		unresolvedHeader = &amp;quot;'''General eligibility:'''&amp;quot;,&lt;br /&gt;
		resolvedHeader = &amp;quot;'''General:''' Article is new enough and long enough&amp;quot;,&lt;br /&gt;
		mainIssues = {&lt;br /&gt;
			{&lt;br /&gt;
				issue = '[[WP:Did you know#New|New Enough]]',&lt;br /&gt;
				status = args.newness,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				issue = '[[WP:Did you know#Long enough|Long Enough]]',&lt;br /&gt;
				status = args.length,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		otherIssues = args.eligibilityother,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makePolicyComplianceSection(args)&lt;br /&gt;
	return makeSection{&lt;br /&gt;
		unresolvedHeader = &amp;quot;'''Policy compliance:'''&amp;quot;,&lt;br /&gt;
		resolvedHeader = &amp;quot;'''Policy:''' Article is sourced, neutral, and free of copyright problems&amp;quot;,&lt;br /&gt;
		mainIssues = {&lt;br /&gt;
			{&lt;br /&gt;
				issue = '[[WP:Citing sources|Adequate sourcing]]',&lt;br /&gt;
				status = args.sourced,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				issue = '[[WP:NPOV|Neutral]]',&lt;br /&gt;
				status = args.neutral,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				issue = 'Free of [[Wikipedia:Copyright violations|copyright violations]], [[Wikipedia:Plagiarism|plagiarism]], and [[WP:close paraphrasing|close paraphrasing]]',&lt;br /&gt;
				status = args.plagiarismfree,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		otherIssues = args.policyother,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeHookEligibilitySection(args)&lt;br /&gt;
	-- Deal with AGF special case for hook citations&lt;br /&gt;
	local hookCiteStatus, isHookSourceAGF&lt;br /&gt;
	if args.hookcited == 'agf' then&lt;br /&gt;
		hookCiteStatus = 'Offline/paywalled citation accepted in good faith'&lt;br /&gt;
		isHookSourceAGF = true&lt;br /&gt;
	else&lt;br /&gt;
		hookCiteStatus = args.hookcited&lt;br /&gt;
		isHookSourceAGF = nil -- use default behaviour&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Generate output&lt;br /&gt;
	return makeSection{&lt;br /&gt;
		unresolvedHeader = &amp;quot;'''Hook eligibility:'''&amp;quot;,&lt;br /&gt;
		resolvedHeader = &amp;quot;'''Hook:''' Hook has been verified by provided inline citation&amp;quot;,&lt;br /&gt;
		mainIssues = {&lt;br /&gt;
			{&lt;br /&gt;
				issue = '[[WP:Did you know#Cited hook|Cited]]',&lt;br /&gt;
				status = hookCiteStatus,&lt;br /&gt;
				isResolved = isHookSourceAGF&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				issue = 'Interesting',&lt;br /&gt;
				status = args.hookinterest,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
		otherIssues = args.hookother,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeImageEligibilitySection(args)&lt;br /&gt;
	if args.status&lt;br /&gt;
		and (args.picfree == 'na' or not args.picfree)&lt;br /&gt;
		and not args.picused&lt;br /&gt;
		and not args.picclear&lt;br /&gt;
	then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return makeSection{&lt;br /&gt;
		unresolvedHeader = &amp;quot;'''Image eligibility:'''&amp;quot;,&lt;br /&gt;
		resolvedHeader = &amp;quot;'''Image:''' Image is freely licensed, used in the article, and clear at 100px.&amp;quot;,&lt;br /&gt;
		mainIssues = {&lt;br /&gt;
			{&lt;br /&gt;
				issue = '[[WP:ICTIC|Freely licensed]]',&lt;br /&gt;
				status = args.picfree,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				issue = '[[WP:Did you know#Pictures|Used in article]]',&lt;br /&gt;
				status = args.picused,&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				issue = 'Clear at 100px',&lt;br /&gt;
				status = args.picclear,&lt;br /&gt;
			},&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeQPQSection(args)&lt;br /&gt;
	-- The QPQ section is different enough from the other sections that we&lt;br /&gt;
	-- will just do everything here rather than trying to use the makeSection&lt;br /&gt;
	-- function.&lt;br /&gt;
	local isDone = yesno(args.qpq)&lt;br /&gt;
	if isDone == true then&lt;br /&gt;
		return makeUncollapsedWikitable(&amp;quot;'''QPQ''': Done.&amp;quot;)&lt;br /&gt;
	elseif args.qpq == 'na' then&lt;br /&gt;
		return makeUncollapsedWikitable(&amp;quot;'''QPQ''': None required.&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		local ret = makeChecklistItem(&lt;br /&gt;
			&amp;quot;'''[[Wikipedia:Did you know#QPQ|QPQ]]'''&amp;quot;,&lt;br /&gt;
			isDone == false and 'Not done' or args.qpq&lt;br /&gt;
		)&lt;br /&gt;
		return ret .. '&amp;lt;br /&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeStatusSection(args)&lt;br /&gt;
	if not args.status then&lt;br /&gt;
		return makeWikitextError('Review is incomplete - please fill in the &amp;quot;status&amp;quot; field')&lt;br /&gt;
	elseif args.status ~= 'y'&lt;br /&gt;
		and args.status ~= '?'&lt;br /&gt;
		and args.status ~= 'maybe'&lt;br /&gt;
		and args.status ~= 'no'&lt;br /&gt;
		and args.status ~= 'again'&lt;br /&gt;
	then&lt;br /&gt;
		return makeWikitextError(string.format(&lt;br /&gt;
			'Invalid status &amp;quot;%s&amp;quot; - use one of &amp;quot;y&amp;quot;, &amp;quot;?&amp;quot;, &amp;quot;maybe&amp;quot;, &amp;quot;no&amp;quot; or &amp;quot;again&amp;quot;',&lt;br /&gt;
			escapeUserString(args.status)&lt;br /&gt;
		))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	table.insert(ret, &amp;quot;'''Overall''': &amp;quot;)&lt;br /&gt;
	local isOK = yesno(args.status)&lt;br /&gt;
	if isOK == true then&lt;br /&gt;
		if args.hookcited == 'agf' then&lt;br /&gt;
			table.insert(ret, statusIcons.YES_AGF)&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(ret, statusIcons.YES)&lt;br /&gt;
		end&lt;br /&gt;
	elseif isOK == false then&lt;br /&gt;
		table.insert(ret, statusIcons.NO)&lt;br /&gt;
	elseif args.status == '?' then&lt;br /&gt;
		table.insert(ret, statusIcons.QUESTION)&lt;br /&gt;
	elseif args.status == 'maybe' then&lt;br /&gt;
		table.insert(ret, statusIcons.MAYBE)&lt;br /&gt;
	elseif args.status == 'again' then&lt;br /&gt;
		table.insert(ret, statusIcons.AGAIN)&lt;br /&gt;
	end&lt;br /&gt;
	if args.comments then&lt;br /&gt;
		table.insert(ret, ' ')&lt;br /&gt;
		table.insert(ret, args.comments)&lt;br /&gt;
	end&lt;br /&gt;
	if args.sign then&lt;br /&gt;
		table.insert(ret, ' ')&lt;br /&gt;
		table.insert(ret, args.sign)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- Normalize the args table to make it easier to work with in other&lt;br /&gt;
	-- functions.&lt;br /&gt;
	normalizeArguments(args)&lt;br /&gt;
&lt;br /&gt;
	-- Check whether the review has been started.&lt;br /&gt;
	local params = {&lt;br /&gt;
		'newness',&lt;br /&gt;
		'length',&lt;br /&gt;
		'eligibilityother',&lt;br /&gt;
		'sourced',&lt;br /&gt;
		'neutral',&lt;br /&gt;
		'plagiarismfree',&lt;br /&gt;
		'policyother',&lt;br /&gt;
		'hookcited',&lt;br /&gt;
		'hookinterest',&lt;br /&gt;
		'hookother',&lt;br /&gt;
		'picfree',&lt;br /&gt;
		'picused',&lt;br /&gt;
		'picclear',&lt;br /&gt;
	}&lt;br /&gt;
	if not anyKeysInTable(args, params) then&lt;br /&gt;
		return 'Review not started'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The review has been started, so assemble all the review sections.&lt;br /&gt;
	local funcs = {&lt;br /&gt;
		makeGeneralEligibilitySection,&lt;br /&gt;
		makePolicyComplianceSection,&lt;br /&gt;
		makeHookEligibilitySection,&lt;br /&gt;
		makeImageEligibilitySection,&lt;br /&gt;
		makeQPQSection,&lt;br /&gt;
		makeStatusSection,&lt;br /&gt;
	}&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, func in ipairs(funcs) do&lt;br /&gt;
		table.insert(ret, func(args))&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret, '\n')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require('Module:Arguments').getArgs(frame, {&lt;br /&gt;
		wrappers = 'Template:DYK checklist',&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>