<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AJCW</id>
	<title>Module:JCW - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AJCW"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:JCW&amp;action=history"/>
	<updated>2026-04-15T15:28:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:JCW&amp;diff=137071&amp;oldid=prev</id>
		<title>imported&gt;Aidan9382: Discourage potentially creating linter errors</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:JCW&amp;diff=137071&amp;oldid=prev"/>
		<updated>2022-10-21T10:51:19Z</updated>

		<summary type="html">&lt;p&gt;Discourage potentially creating &lt;a href=&quot;/index.php?title=WP:Linter&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;WP:Linter (page does not exist)&quot;&gt;linter&lt;/a&gt; errors&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local mArguments = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
local TableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local function stripToNil(text)&lt;br /&gt;
	-- If text is a non-empty string, return its trimmed content.&lt;br /&gt;
	-- Otherwise, return nothing (text is an empty string or is not a string).&lt;br /&gt;
	if type(text) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return text:match(&amp;#039;(%S.-)%s*$&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getDoiArgs(args)&lt;br /&gt;
	-- Return a list of |doiN=xxx parameter values, omitting blanks and skipped N&amp;#039;s.&lt;br /&gt;
	-- LATER Should expand this to work with each exported function.&lt;br /&gt;
	local indices = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if stripToNil(v) and type(k) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			local n = tonumber(k:match(&amp;#039;^doi(%d+)$&amp;#039;))&lt;br /&gt;
			if n then&lt;br /&gt;
				table.insert(indices, n)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(indices)&lt;br /&gt;
	local parms = {}&lt;br /&gt;
	if stripToNil(args.doi) then&lt;br /&gt;
		if args.doi1 then&lt;br /&gt;
			error(&amp;#039;Use doi or doi1, not both&amp;#039;, 0)&lt;br /&gt;
		end&lt;br /&gt;
		parms[1] = args.doi&lt;br /&gt;
	end&lt;br /&gt;
	for _, n in ipairs(indices) do&lt;br /&gt;
		table.insert(parms, args[&amp;#039;doi&amp;#039; .. n])&lt;br /&gt;
	end&lt;br /&gt;
	return parms&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local Searcher&lt;br /&gt;
Searcher = {&lt;br /&gt;
	link = function (self, doi)&lt;br /&gt;
		return&lt;br /&gt;
			&amp;#039;&amp;lt;code&amp;gt;&amp;amp;#123;{&amp;#039; ..&lt;br /&gt;
			self.doiText ..&lt;br /&gt;
			&amp;#039;|[https://en.wikipedia.org/w/index.php?&amp;#039; ..&lt;br /&gt;
			-- &amp;#039;sort=relevance&amp;amp;title=Special%3ASearch&amp;amp;profile=advanced&amp;amp;fulltext=1&amp;amp;advancedSearch-current={}&amp;amp;&amp;#039; ..  -- not needed; can include this for compatibility&lt;br /&gt;
			&amp;#039;ns0=1&amp;amp;ns118=1&amp;amp;search=insource%3A&amp;#039; ..&lt;br /&gt;
			doi:gsub(&amp;#039;10%.&amp;#039;, &amp;#039;/10\\.&amp;#039;) ..&lt;br /&gt;
			&amp;#039;%5C%2F%20*%2F &amp;#039; ..  -- &amp;#039;%20*&amp;#039; seems redundant but is needed for Special:Search to work (&amp;#039;x*&amp;#039; also works)&lt;br /&gt;
			doi ..&lt;br /&gt;
			&amp;#039;]}&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
	end,&lt;br /&gt;
	new = function (options)&lt;br /&gt;
		options = options or {}&lt;br /&gt;
		local doiText = options.linkdoi and &amp;#039;[[Digital object identifier#Prefix|doi]]&amp;#039; or &amp;#039;doi&amp;#039;&lt;br /&gt;
		return setmetatable({doiText = doiText}, Searcher)&lt;br /&gt;
	end&lt;br /&gt;
}&lt;br /&gt;
Searcher.__index = Searcher&lt;br /&gt;
&lt;br /&gt;
function p.selected(frame)&lt;br /&gt;
	local n = mArguments.getArgs(frame, {parentOnly = true})&lt;br /&gt;
	local note = n.note&lt;br /&gt;
	local wantSource = {&lt;br /&gt;
		[&amp;#039;User:JL-Bot/Questionable.cfg&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
	--local abbrev = {BLJ = &amp;#039;[https://beallslist.weebly.com/standalone-journals.html BLJ]&amp;#039;, BLJU=&amp;#039;[https://beallslist.weebly.com/standalone-journals.html BLJU]&amp;#039;, BLP=&amp;#039;[https://beallslist.weebly.com/ BLP]&amp;#039;, BLPU=&amp;#039;[https://beallslist.weebly.com/ BLPU]&amp;#039;, SPJJ = &amp;#039;[https://predatoryjournals.com/journals/ SPJJ]&amp;#039;, SPJP = &amp;#039;[https://predatoryjournals.com/publishers/ SPJP]&amp;#039;, DOAJ=&amp;#039;[https://blog.doaj.org/2014/08/28/some-journals-say-they-are-in-doaj-when-they-are-not/ Lying about DOAJ]&amp;#039;, UCG=&amp;#039;[https://www.ugc.ac.in/journallist/4305_Journals.pdf Removed from UGC]&amp;#039; QW =&amp;#039;[https://www.quackwatch.org/04ConsumerEducation/nonrecperiodicals.html QW]&amp;#039;,	DEPS =&amp;#039;[[WP:DEPS|DEPS]]&amp;#039;, URF =&amp;#039;[[#Unreliable fields|URF]]&amp;#039;}&lt;br /&gt;
	local abbrev = {Bohannon = &amp;#039;Bohannon&amp;#039;, BLJ = &amp;#039;BLJ&amp;#039;, BLJU= &amp;#039;BLJU&amp;#039;, BLP = &amp;#039;BLP&amp;#039;, BLPU = &amp;#039;BLPU&amp;#039;, SPJJ =&amp;#039;SPJJ&amp;#039;, SPJP =&amp;#039;SPJP&amp;#039;, DOAJ = &amp;#039;DOAJ&amp;#039;, QW=&amp;#039;QW&amp;#039;, DEPS =&amp;#039;DEPS&amp;#039;, UCG = &amp;#039;UCG&amp;#039;, URF = &amp;#039;URF&amp;#039;, Unknown = &amp;#039;Unknown&amp;#039;}&lt;br /&gt;
	local source&lt;br /&gt;
	if wantSource[mw.title.getCurrentTitle().fullText] then&lt;br /&gt;
		source = n.source or &amp;#039;Unknown&amp;#039;&lt;br /&gt;
		source = abbrev[source] or source&lt;br /&gt;
	end&lt;br /&gt;
	local sourcenote&lt;br /&gt;
	if note and source then&lt;br /&gt;
		sourcenote = string.format(&amp;#039;&amp;amp;nbsp;(%s) &amp;amp;#91;%s&amp;amp;#93;&amp;#039;, source, note)&lt;br /&gt;
	elseif source then&lt;br /&gt;
		sourcenote = string.format(&amp;#039;&amp;amp;nbsp;(%s)&amp;#039;, source)&lt;br /&gt;
	elseif note then&lt;br /&gt;
		sourcenote = string.format(&amp;#039;&amp;amp;nbsp;&amp;amp;#91;%s&amp;amp;#93;&amp;#039;, note)&lt;br /&gt;
	else&lt;br /&gt;
		sourcenote = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local listDoi, nrDoi = {}, 0&lt;br /&gt;
	local function addDoi(doi, i)&lt;br /&gt;
		if doi then&lt;br /&gt;
			nrDoi = nrDoi + 1&lt;br /&gt;
			if i and listDoi[i] then&lt;br /&gt;
				table.insert(listDoi, i, doi)&lt;br /&gt;
			else&lt;br /&gt;
				listDoi[nrDoi] = doi&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	for i, v in ipairs(TableTools.compressSparseArray(n)) do&lt;br /&gt;
		if i == 1 then&lt;br /&gt;
			rows[1] = { string.format(&amp;#039;*[[:%s]]%s&amp;#039;, v, sourcenote) }&lt;br /&gt;
		elseif v:match(&amp;#039;^10%.%d+$&amp;#039;) then&lt;br /&gt;
			addDoi(v)&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(rows, string.format(&amp;#039;**[[:%s]]&amp;#039;, v))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not rows[1] then&lt;br /&gt;
		error(&amp;#039;Need at least one target parameter&amp;#039;, 0)&lt;br /&gt;
	end&lt;br /&gt;
	for _, param in ipairs({ &amp;#039;imprint&amp;#039;, &amp;#039;parent&amp;#039; }) do&lt;br /&gt;
		for i = 1, 10 do&lt;br /&gt;
			local arg = n[param .. i]&lt;br /&gt;
			if arg then&lt;br /&gt;
				table.insert(rows[1], string.format(&amp;quot;&amp;#039;&amp;#039;[[%s]]&amp;#039;&amp;#039;&amp;quot;, arg))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if n.doi and n.doi1 then&lt;br /&gt;
		error(&amp;#039;Use doi or doi1, not both&amp;#039;, 0)&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, 10 do&lt;br /&gt;
		local doi&lt;br /&gt;
		if i == 1 then&lt;br /&gt;
			doi = n.doi or n.doi1&lt;br /&gt;
		else&lt;br /&gt;
			doi = n[&amp;#039;doi&amp;#039; .. i]&lt;br /&gt;
		end&lt;br /&gt;
		addDoi(doi, i)&lt;br /&gt;
	end&lt;br /&gt;
	local search = Searcher.new()&lt;br /&gt;
	for i = 1, nrDoi do&lt;br /&gt;
		local doi = listDoi[i]&lt;br /&gt;
		table.insert(rows,&lt;br /&gt;
			&amp;#039;**&amp;#039; .. search:link(doi)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	rows[1] = table.concat(rows[1], &amp;#039; / &amp;#039;)&lt;br /&gt;
	return table.concat(rows, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.doilist(frame)&lt;br /&gt;
	local doiList = getDoiArgs(frame:getParent().args)&lt;br /&gt;
	if not doiList[1] then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local search = Searcher.new({linkdoi = true})&lt;br /&gt;
	for i, doi in ipairs(doiList) do&lt;br /&gt;
		doiList[i] = search:link(doi)&lt;br /&gt;
	end&lt;br /&gt;
	return&lt;br /&gt;
		&amp;quot;&amp;amp;nbsp;| &amp;lt;b&amp;gt;&amp;lt;span class=plainlinks&amp;gt;&amp;quot; ..&lt;br /&gt;
		table.concat(doiList, &amp;#039;&amp;amp;nbsp;&amp;lt;b&amp;gt;&amp;amp;middot;&amp;lt;/b&amp;gt; &amp;#039;) ..  -- middot is double bold&lt;br /&gt;
		&amp;quot;&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.exclude(frame)&lt;br /&gt;
	local n = mArguments.getArgs(frame, {parentOnly = true})&lt;br /&gt;
	local length = TableTools.length(n)&lt;br /&gt;
	local text = string.format(&amp;#039;*[[:%s]]&amp;#039;, n[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	n[1] = nil&lt;br /&gt;
	for _, v in ipairs(TableTools.compressSparseArray(n)) do&lt;br /&gt;
		if length &amp;gt; 1 then&lt;br /&gt;
			text = text .. string.format(&amp;quot; ≠ [[:%s]]&amp;quot;, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.pattern(frame)&lt;br /&gt;
	local rows = {}&lt;br /&gt;
	for i, v in ipairs(frame:getParent().args) do&lt;br /&gt;
		v = mw.text.trim(v)&lt;br /&gt;
		if v == &amp;#039;&amp;#039; then&lt;br /&gt;
			rows[i] = &amp;#039;&amp;#039;&lt;br /&gt;
		elseif i == 1 then&lt;br /&gt;
			rows[i] = string.format(&amp;#039;*[[%s]]&amp;#039;, v)&lt;br /&gt;
		else&lt;br /&gt;
			rows[i] = string.format(&amp;quot;\n**&amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;&amp;quot;, v&lt;br /&gt;
				:gsub(&amp;quot;%.%*&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;&amp;lt;span style=color:#006400;&amp;gt;.*&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&amp;quot;)&lt;br /&gt;
				:gsub(&amp;quot;!&amp;quot;, &amp;quot;&amp;lt;b&amp;gt;&amp;lt;span style=color:#8B0000;&amp;gt;!&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&amp;quot;)&lt;br /&gt;
				:gsub(&amp;quot;&amp;#039;&amp;quot;, &amp;quot;&amp;amp;rsquo;&amp;quot;)&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not rows[1] then&lt;br /&gt;
		error(&amp;#039;pattern requires parameter 1&amp;#039;, 0)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(rows)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Aidan9382</name></author>
	</entry>
</feed>