<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AGHS_phrases</id>
	<title>Module:GHS phrases - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3AGHS_phrases"/>
	<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:GHS_phrases&amp;action=history"/>
	<updated>2026-04-10T01:31:08Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.tiffa.net/w/index.php?title=Module:GHS_phrases&amp;diff=117689&amp;oldid=prev</id>
		<title>Fire: Created page with &quot;-------------------------------------------------------------------------------- -- Module:GHS phrases --  -- main: reads GHS parameters (arguments like &quot;H301&quot;, &quot;P401&quot;) --		and returns for each (listtype=&#039;abbr&#039;): --		phraseID visible; formal phrase text as &lt;abbr title=&quot;...&quot;&gt; -- setID	= &quot;H&quot; or &quot;P&quot; -- phraseID = e.g. &quot;H201&quot;, &quot;P231+P234&quot; -- phrase text read from array tables in Module:GHS phrases/data -- -- Implements: Template:GHS phrases -- Helppage: [[Template:GH...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:GHS_phrases&amp;diff=117689&amp;oldid=prev"/>
		<updated>2024-02-19T15:21:29Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-------------------------------------------------------------------------------- -- Module:GHS phrases --  -- main: reads GHS parameters (arguments like &amp;quot;H301&amp;quot;, &amp;quot;P401&amp;quot;) --		and returns for each (listtype=&amp;#039;abbr&amp;#039;): --		phraseID visible; formal phrase text as &amp;lt;abbr title=&amp;quot;...&amp;quot;&amp;gt; -- setID	= &amp;quot;H&amp;quot; or &amp;quot;P&amp;quot; -- phraseID = e.g. &amp;quot;H201&amp;quot;, &amp;quot;P231+P234&amp;quot; -- phrase text read from array tables in &lt;a href=&quot;/wiki/Module:GHS_phrases/data&quot; title=&quot;Module:GHS phrases/data&quot;&gt;Module:GHS phrases/data&lt;/a&gt; -- -- Implements: &lt;a href=&quot;/w/index.php?title=Template:GHS_phrases&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Template:GHS phrases (page does not exist)&quot;&gt;Template:GHS phrases&lt;/a&gt; -- Helppage: [[Template:GH...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
-- Module:GHS phrases&lt;br /&gt;
-- &lt;br /&gt;
-- main: reads GHS parameters (arguments like &amp;quot;H301&amp;quot;, &amp;quot;P401&amp;quot;)&lt;br /&gt;
--		and returns for each (listtype=&amp;#039;abbr&amp;#039;):&lt;br /&gt;
--		phraseID visible; formal phrase text as &amp;lt;abbr title=&amp;quot;...&amp;quot;&amp;gt;&lt;br /&gt;
-- setID	= &amp;quot;H&amp;quot; or &amp;quot;P&amp;quot;&lt;br /&gt;
-- phraseID = e.g. &amp;quot;H201&amp;quot;, &amp;quot;P231+P234&amp;quot;&lt;br /&gt;
-- phrase text read from array tables in [[Module:GHS phrases/data]]&lt;br /&gt;
--&lt;br /&gt;
-- Implements: [[Template:GHS phrases]]&lt;br /&gt;
-- Helppage: [[Template:GHS phrases]]&lt;br /&gt;
-- Error category: [[Category:GHS errors]], [[Category:GHS warnings]] (mainspace pages only)&lt;br /&gt;
--&lt;br /&gt;
-- Also: &lt;br /&gt;
-- listAll(), numberOfPhrases(), listOmitRules(),&lt;br /&gt;
-- listtype, omit&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local r = {}	-- &amp;quot;r&amp;quot; for return, so no confusion with setID P&lt;br /&gt;
local GHSdata	= mw.loadData(&amp;#039;Module:GHS phrases/data&amp;#039;)&lt;br /&gt;
local getArgs	= require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local tTools	= require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
local yesno		= require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local tArgName	= {} -- named parameters (setid, omit, listtype)&lt;br /&gt;
local tMessagesToShow = {} -- the tail: Preview, Categories&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- wlHelpPage&lt;br /&gt;
--&lt;br /&gt;
-- Formats page as [[Helppage#Section|Label]]&lt;br /&gt;
-- by default, sLabel == sSection&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function wlHelpPage(sSection, sLabel)&lt;br /&gt;
local sHelpPage = &amp;#039;Template:GHS phrases&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if sLabel == nil then sLabel = sSection end&lt;br /&gt;
	&lt;br /&gt;
	if (sLabel or &amp;#039;&amp;#039;) == &amp;#039;&amp;#039; then&lt;br /&gt;
		sLabel = &amp;#039;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		sLabel = &amp;#039;|&amp;#039; .. sLabel &lt;br /&gt;
	end&lt;br /&gt;
	if (sSection or &amp;#039;&amp;#039;) == &amp;#039;&amp;#039; then&lt;br /&gt;
		sSection = &amp;#039;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		sSection = &amp;#039;#&amp;#039; .. sSection&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;[[&amp;#039; .. sHelpPage .. sSection .. sLabel .. &amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- addErrorCategory&lt;br /&gt;
--&lt;br /&gt;
-- Formats as [[Category:GHS errors|catsort]]&lt;br /&gt;
-- or &amp;#039;&amp;#039; when in other namespace.&lt;br /&gt;
-- sCatsort option using: H, P, _&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function addErrorCategory(sCatsort)&lt;br /&gt;
local pagetype = require(&amp;#039;Module:Pagetype&amp;#039;).main&lt;br /&gt;
	&lt;br /&gt;
	local wlErrCat = &amp;#039;&amp;#039;&lt;br /&gt;
	if pagetype() == &amp;#039;article&amp;#039; then -- mainspace only&lt;br /&gt;
		if sCatsort == nil then sCatsort = tArgName[&amp;#039;setID&amp;#039;] end&lt;br /&gt;
		&lt;br /&gt;
		if sCatsort == &amp;#039;&amp;#039; then&lt;br /&gt;
			wlErrCat = &amp;#039;[[Category:GHS errors]]&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			wlErrCat = &amp;#039;[[Category:GHS errors|&amp;#039; .. sCatsort .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(tMessagesToShow, wlErrCat)&lt;br /&gt;
	return&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- addWarningCategory&lt;br /&gt;
--&lt;br /&gt;
-- Formats as [[Category:GHS warnings|catsort]]&lt;br /&gt;
-- mainspace only, or &amp;#039;&amp;#039; when in other namespace.&lt;br /&gt;
-- sCatsort option using: H, P, U, ?, D, O&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function addWarningCategory(sCatsort)&lt;br /&gt;
local pagetype = require(&amp;#039;Module:Pagetype&amp;#039;).main&lt;br /&gt;
if sCatsort == nil then sCatsort = tArgName[&amp;#039;setID&amp;#039;] end&lt;br /&gt;
		&lt;br /&gt;
	local wlWarnCat = &amp;#039;&amp;#039;&lt;br /&gt;
	if pagetype() == &amp;#039;article&amp;#039; then -- mainspace only&lt;br /&gt;
		if sCatsort == &amp;#039;&amp;#039; then&lt;br /&gt;
			wlWarnCat = &amp;#039;[[Category:GHS warnings]]&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			wlWarnCat = &amp;#039;[[Category:GHS warnings|&amp;#039; .. sCatsort .. &amp;#039;]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(tMessagesToShow, wlWarnCat)&lt;br /&gt;
	return&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- addPreviewMsg&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function addPreviewMsg(sMsg)&lt;br /&gt;
local previewWarn = require(&amp;#039;Module:If preview&amp;#039;)._warning&lt;br /&gt;
	table.insert(tMessagesToShow, previewWarn({sMsg}))&lt;br /&gt;
	return&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- showPreviewMsg&lt;br /&gt;
--&lt;br /&gt;
-- show table tMessagesToShow&lt;br /&gt;
-- preview-messages and errorcat&lt;br /&gt;
-- all namespaces&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function showPreviewMsg()&lt;br /&gt;
	if tTools.size(tMessagesToShow) &amp;gt; 0 then&lt;br /&gt;
		return table.concat(tMessagesToShow, &amp;#039;&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- applyRemoveDuplicates&lt;br /&gt;
--&lt;br /&gt;
-- returns edited table, with double Codes removed&lt;br /&gt;
-- adds warning with codes.&lt;br /&gt;
-- base table tArgs is walked through by a iwalker that reads a singel code,&lt;br /&gt;
-- then a ikiller checks the upward part of the same table to delete all copies&lt;br /&gt;
-- ikiller starts at end of table, walks towards iwalker; then tArgs is compressed&lt;br /&gt;
-- iwalker steps 1 up in the freshly compressed table&lt;br /&gt;
-- Used: iArgs is sorted, and order stays same. compress does not change that.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function applyRemoveDuplicates(tArgs)&lt;br /&gt;
local iR, iK -- iR = reader, iK = killer&lt;br /&gt;
local hit = false&lt;br /&gt;
&lt;br /&gt;
	iR = 1&lt;br /&gt;
	while iR &amp;lt; #tArgs do&lt;br /&gt;
		iK = #tArgs -- will be counting downwards&lt;br /&gt;
		while iK &amp;gt; iR do&lt;br /&gt;
			if tArgs[iK] == tArgs[iR] then&lt;br /&gt;
				hit = true&lt;br /&gt;
				addPreviewMsg(&amp;#039;Duplicate removed: &amp;#039; .. tArgs[iR])&lt;br /&gt;
				table.remove(tArgs, iK)&lt;br /&gt;
				tTools.compressSparseArray(tArgs)&lt;br /&gt;
			end&lt;br /&gt;
			iK = iK - 1&lt;br /&gt;
		end&lt;br /&gt;
		tTools.compressSparseArray(tArgs)&lt;br /&gt;
		iR = iR + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if hit then&lt;br /&gt;
		addWarningCategory(&amp;#039;D&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return tArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- applyOmitRules&lt;br /&gt;
--&lt;br /&gt;
-- returns edited table, with Omit phraseID&amp;#039;s removed&lt;br /&gt;
-- Omit rule is per GHS_Rev9E_0.pdf (2021)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function applyOmitRules(tArgs)&lt;br /&gt;
local tRules = GHSdata[&amp;#039;tOmitRules&amp;#039;]&lt;br /&gt;
	local hit = false&lt;br /&gt;
	&lt;br /&gt;
	for keep, omit in pairs(tRules) do&lt;br /&gt;
		if tTools.inArray(tArgs, omit) then&lt;br /&gt;
			if tTools.inArray(tArgs, keep) then&lt;br /&gt;
				hit = true&lt;br /&gt;
				for i, k in pairs(tArgs) do&lt;br /&gt;
					if k == omit then&lt;br /&gt;
						table.remove(tArgs, i)		&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				addPreviewMsg(wlHelpPage(&amp;#039;Omit Rules&amp;#039;) .. &amp;#039;: keep &amp;#039; .. keep .. &amp;#039;, omit &amp;#039; .. omit)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if hit then&lt;br /&gt;
		tTools.compressSparseArray(tArgs)&lt;br /&gt;
		addWarningCategory(&amp;#039;O&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return tArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- label H-phrases or P-phrases&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function PHlabel()&lt;br /&gt;
	if tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;GHS&amp;#039; then&lt;br /&gt;
		return &amp;#039;GHS phrases&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return tArgName[&amp;#039;setID&amp;#039;] .. &amp;#039;-phrases&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- inMono&lt;br /&gt;
--&lt;br /&gt;
-- Use mono font-family (from: Template:Mono)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function inMono(s)&lt;br /&gt;
	if s == nil then s = &amp;#039;&amp;#039; end&lt;br /&gt;
	return &amp;#039;&amp;lt;span class=&amp;quot;monospaced&amp;quot; style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;#039; .. s .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- wlInlineTag&lt;br /&gt;
--&lt;br /&gt;
-- Returns &amp;lt;sup&amp;gt;[?]&amp;lt;/sup&amp;gt; with wikilink to [[helppage#section|errormessage]]&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function wlInlineTag(phraseID)&lt;br /&gt;
	local sMsg&lt;br /&gt;
	sMsg = &amp;#039;&amp;lt;sup&amp;gt;&amp;lt;span class=&amp;quot;noprint Inline-Template&amp;quot;&amp;gt;&amp;amp;#91;&amp;lt;i&amp;gt;&amp;#039;&lt;br /&gt;
				.. wlHelpPage(PHlabel(), &amp;#039;&amp;lt;span title=&amp;quot;&amp;#039; &lt;br /&gt;
									.. PHlabel() .. &amp;#039;: &amp;#039;&lt;br /&gt;
									.. phraseID&lt;br /&gt;
									.. &amp;#039; not found&amp;#039;&lt;br /&gt;
									.. &amp;#039;&amp;quot;&amp;gt;?&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
				.. &amp;#039;&amp;lt;/i&amp;gt;&amp;amp;#93;&amp;lt;/span&amp;gt;&amp;lt;/sup&amp;gt;&amp;#039;&lt;br /&gt;
	return sMsg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- errorPhraseIDnotFound&lt;br /&gt;
--&lt;br /&gt;
-- Returns single value when error (not found in list):&lt;br /&gt;
-- plain value + inline warning [?] (linked) + error cat (mainsp) + preview warning&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function errorPhraseIDnotFound(phraseID)&lt;br /&gt;
	if phraseID == nil then phraseID = &amp;#039;&amp;#039; end&lt;br /&gt;
	&lt;br /&gt;
	local inlineTag = wlInlineTag(phraseID)&lt;br /&gt;
	local previewMsg = wlHelpPage(PHlabel()) .. &amp;#039;: \&amp;quot;&amp;#039; .. phraseID .. &amp;#039;\&amp;quot; not found&amp;#039;&lt;br /&gt;
	addPreviewMsg(previewMsg)&lt;br /&gt;
	addErrorCategory()&lt;br /&gt;
	&lt;br /&gt;
	return phraseID .. inlineTag&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- errorHPsetIDnotFound&lt;br /&gt;
--&lt;br /&gt;
-- setID H or P could not be found&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function errorHPsetIDnotFound()&lt;br /&gt;
	local sMsg&lt;br /&gt;
	sMsg = wlHelpPage(&amp;#039;&amp;#039;, PHlabel())&lt;br /&gt;
			.. &amp;#039;: &amp;quot;H&amp;quot; or &amp;quot;P&amp;quot; set id not found&amp;#039; &lt;br /&gt;
			.. &amp;#039; (please use form like &amp;quot;|H200&amp;quot; or &amp;quot;|P300+P301&amp;quot;)&amp;#039;&lt;br /&gt;
	addPreviewMsg(sMsg)&lt;br /&gt;
	addErrorCategory(&amp;#039;?&amp;#039;)&lt;br /&gt;
	return showPreviewMsg()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- errorHPsetIDmissing&lt;br /&gt;
--&lt;br /&gt;
-- parameter |setid= to be used&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function errorHPsetIDmissing()&lt;br /&gt;
	local sMsg&lt;br /&gt;
	sMsg = wlHelpPage( &amp;#039;&amp;#039;, PHlabel())&lt;br /&gt;
			.. &amp;#039;: &amp;quot;H&amp;quot; or &amp;quot;P&amp;quot; set id not found,&amp;#039; &lt;br /&gt;
			.. &amp;#039; please use |setid=... (H or P)&amp;#039;&lt;br /&gt;
	addPreviewMsg(sMsg)&lt;br /&gt;
	return&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- formatPhraseAbbr&lt;br /&gt;
--&lt;br /&gt;
-- format phraseID and text, for abbr-form (infobox list form)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function formatPhraseAbbr(phraseID, sPhrase)&lt;br /&gt;
	return &amp;#039;&amp;lt;abbr class=&amp;quot;abbr&amp;quot; title=&amp;quot; &amp;#039; .. phraseID .. &amp;#039;: &amp;#039; .. sPhrase .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
				.. phraseID &lt;br /&gt;
				.. &amp;#039;&amp;lt;/abbr&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- formatPhraseInline&lt;br /&gt;
--&lt;br /&gt;
-- format phraseID and text, for inline form (in sentence)&lt;br /&gt;
-- adds &amp;quot;quotes&amp;quot;&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function formatPhraseInline(phraseID, sPhrase)&lt;br /&gt;
	return inMono(phraseID) .. &amp;#039;: \&amp;quot;&amp;#039; .. sPhrase .. &amp;#039;\&amp;quot;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- formatPhraseList&lt;br /&gt;
--&lt;br /&gt;
-- as inline, but no &amp;quot;quotes&amp;quot; added.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function formatPhraseList(phraseID, sPhrase)&lt;br /&gt;
	return inMono(phraseID) .. &amp;#039;: &amp;#039; .. sPhrase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- getSetID&lt;br /&gt;
--&lt;br /&gt;
-- Determines setID (expected either &amp;#039;H&amp;#039; or &amp;#039;P&amp;#039;)&lt;br /&gt;
-- First route is: read |setid=&lt;br /&gt;
-- When |setid= is not set, &lt;br /&gt;
--		it looks for a first parameter that has an H of P prefix (in |P201|P202|...)&lt;br /&gt;
--		when not found, &amp;#039;GHS&amp;#039; is retured&lt;br /&gt;
-- In one call, P and H numbers can *not* be mixed&lt;br /&gt;
--		so &amp;quot;|H201|P202|&amp;quot; will cause error &amp;quot;P202 not found&amp;quot; (... in H-list)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function getSetID(tArgs)&lt;br /&gt;
	local setIDfound = &amp;#039;GHS&amp;#039;&lt;br /&gt;
	local paramsetID = tArgs[&amp;#039;setid&amp;#039;] or nil&lt;br /&gt;
	&lt;br /&gt;
	if (paramsetID ~= nil) and (paramsetID == &amp;#039;P&amp;#039; or paramsetID == &amp;#039;H&amp;#039;) then&lt;br /&gt;
		setIDfound = paramsetID&lt;br /&gt;
	else&lt;br /&gt;
		local initial = nil&lt;br /&gt;
		for i, v in ipairs(tArgs) do&lt;br /&gt;
			initial = mw.ustring.match(v, &amp;#039;^[PH]&amp;#039;)&lt;br /&gt;
			if initial ~=nil then&lt;br /&gt;
				setIDfound = initial&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return setIDfound&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- getListType&lt;br /&gt;
--&lt;br /&gt;
-- Checks list format, including those from Module:List&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function getListType(tArgs)&lt;br /&gt;
	local listTypes = {&lt;br /&gt;
	[&amp;#039;abbr&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;bulleted&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;unbulleted&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;horizontal&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ordered&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;horizontal_ordered&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;horizontal ordered&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;inline&amp;#039;] = true&lt;br /&gt;
	}&lt;br /&gt;
	local sListType = tArgs[&amp;#039;listtype&amp;#039;] or &amp;#039;abbr&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if sListType == &amp;#039;&amp;#039; or sListType == &amp;#039;abbr&amp;#039; then&lt;br /&gt;
		return &amp;#039;abbr&amp;#039;&lt;br /&gt;
	elseif listTypes[sListType] == true then&lt;br /&gt;
		if sListType == &amp;#039;horizontal ordered&amp;#039; then&lt;br /&gt;
			sListType = &amp;#039;horizontal_ordered&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		return sListType&lt;br /&gt;
	else &lt;br /&gt;
		sListType = &amp;#039;abbr&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return sListType&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- getDoOmitRules&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function getDoOmitRules(tArgs)&lt;br /&gt;
	local b = yesno(tArgs[&amp;#039;omit&amp;#039;], true)&lt;br /&gt;
	&lt;br /&gt;
	if b == nil then b = true end&lt;br /&gt;
&lt;br /&gt;
	return yesno(b, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- prepareArgs&lt;br /&gt;
--&lt;br /&gt;
-- First: determine setID (from |setID= OR from prefixes in parameters)&lt;br /&gt;
-- Then: clean up &amp;amp; format phrase IDs (=unnamed parameters)&lt;br /&gt;
--		remove bad characters, create H/P pattern &amp;quot;H201&amp;quot;, &amp;quot;P310+P302&amp;quot;&lt;br /&gt;
-- straight array, no nil&amp;#039;s, sorted&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
local function prepareArgs(tArgs)&lt;br /&gt;
&lt;br /&gt;
	tArgName[&amp;#039;setID&amp;#039;] = getSetID(tArgs)&lt;br /&gt;
	tArgName[&amp;#039;listtype&amp;#039;] = getListType(tArgs)&lt;br /&gt;
	tArgName[&amp;#039;omit&amp;#039;] = getDoOmitRules(tArgs)&lt;br /&gt;
&lt;br /&gt;
	tArgs = tTools.compressSparseArray(tArgs) -- removes all named args&lt;br /&gt;
	if string.len(tArgName[&amp;#039;setID&amp;#039;]) == 1 and #tArgs &amp;gt; 0 then&lt;br /&gt;
		for i, v in ipairs(tArgs) do&lt;br /&gt;
			v = mw.text.decode(v)&lt;br /&gt;
			v = mw.ustring.gsub(v, &amp;#039;[^%d%+A-Za-z]&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
			v = mw.ustring.gsub(v, &amp;#039;^(%d)&amp;#039;, tArgName[&amp;#039;setID&amp;#039;] .. &amp;#039;%1&amp;#039;)&lt;br /&gt;
			v = mw.ustring.gsub(v, &amp;#039;%+(%d)&amp;#039;, &amp;#039;+&amp;#039; .. tArgName[&amp;#039;setID&amp;#039;] .. &amp;#039;%1&amp;#039;)&lt;br /&gt;
			tArgs[i] = v&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(tArgs)&lt;br /&gt;
	end&lt;br /&gt;
	return tArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- listAll&lt;br /&gt;
--&lt;br /&gt;
-- Returns wikitable rows for each phrase id.&lt;br /&gt;
-- requires |setID=P/H&lt;br /&gt;
-- returns full list, all phrases, for a setID&lt;br /&gt;
-- 2-columns wikitable, sorted, sortable, anchor like &amp;quot;H201&amp;quot; for each&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function r.listAll(frame)&lt;br /&gt;
local newArgs = getArgs(frame)&lt;br /&gt;
local tL = {}&lt;br /&gt;
&lt;br /&gt;
	prepareArgs(newArgs)&lt;br /&gt;
	&lt;br /&gt;
	local tRead&lt;br /&gt;
	if tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;H&amp;#039; then&lt;br /&gt;
		tRead = GHSdata[&amp;#039;Hphrases&amp;#039;]&lt;br /&gt;
	elseif tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;P&amp;#039; then&lt;br /&gt;
		tRead = GHSdata[&amp;#039;Pphrases&amp;#039;]&lt;br /&gt;
	else &lt;br /&gt;
		errorHPsetIDmissing()&lt;br /&gt;
		return  showPreviewMsg()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Intermediate table t2 to maintain order; read from original table (/data)&lt;br /&gt;
	local t2 = {}&lt;br /&gt;
	local iPh&lt;br /&gt;
	for s, v in pairs(tRead) do&lt;br /&gt;
		iPh = tonumber(mw.ustring.match(s, &amp;#039;[PH](%d%d%d)&amp;#039;))&lt;br /&gt;
		if string.len(s) &amp;gt; 4 then&lt;br /&gt;
			iPh = tTools.size(t2) + 1&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(t2, iPh, s)&lt;br /&gt;
	end&lt;br /&gt;
	t2 = tTools.compressSparseArray(t2)&lt;br /&gt;
	table.sort(t2)&lt;br /&gt;
&lt;br /&gt;
	local sTR, v, sAnchor&lt;br /&gt;
	-- i = array index, s = phraseID, v = phrase text&lt;br /&gt;
	for i, s in ipairs(t2) do&lt;br /&gt;
		v = tRead[s]&lt;br /&gt;
		sAnchor = &amp;#039;&amp;lt;span class=&amp;quot;anchor&amp;quot; id=&amp;quot;&amp;#039; .. s .. &amp;#039;&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		sTR = &amp;#039;|- &amp;#039; .. sAnchor .. &amp;#039;\n| datasortvalue=&amp;quot;&amp;#039; .. i .. &amp;#039;&amp;quot; | &amp;lt;span style=&amp;quot;font-family: monospace;&amp;quot;&amp;gt;&amp;#039; .. s .. &amp;#039;&amp;lt;/span&amp;gt; || &amp;#039; .. v&lt;br /&gt;
		table.insert(tL, sTR)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(tL, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- numberOfPhrases&lt;br /&gt;
--&lt;br /&gt;
-- Documentation&lt;br /&gt;
-- requires |setID=H/P&lt;br /&gt;
-- Returns number of phrases, in format&lt;br /&gt;
--	&amp;quot;GHS H-phrases (123)&amp;quot;&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function r.numberOfPhrases(frame)&lt;br /&gt;
	local newArgs = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	prepareArgs(newArgs)&lt;br /&gt;
&lt;br /&gt;
	local iT&lt;br /&gt;
	if tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;H&amp;#039; then&lt;br /&gt;
		iT = tTools.size(GHSdata[&amp;#039;Hphrases&amp;#039;])&lt;br /&gt;
	elseif tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;P&amp;#039; then&lt;br /&gt;
		iT = tTools.size(GHSdata[&amp;#039;Pphrases&amp;#039;])&lt;br /&gt;
	else&lt;br /&gt;
		errorHPsetIDmissing()&lt;br /&gt;
		return showPreviewMsg()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;GHS &amp;#039; .. PHlabel() .. &amp;#039; &amp;lt;span style=&amp;quot;font-weight: normal;&amp;quot;&amp;gt;(&amp;#039; .. tostring(iT) .. &amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- listOmitRules&lt;br /&gt;
--&lt;br /&gt;
-- self-documentation&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function r.listOmitRules()&lt;br /&gt;
local tRules = GHSdata[&amp;#039;tOmitRules&amp;#039;]&lt;br /&gt;
local tL = {}&lt;br /&gt;
local s&lt;br /&gt;
&lt;br /&gt;
	s = wlHelpPage(&amp;#039;Omit Rules&amp;#039;)&lt;br /&gt;
		.. &amp;#039;: when the &amp;lt;i&amp;gt;keep&amp;lt;/i&amp;gt; ID is present, do not show the &amp;lt;i&amp;gt;omit&amp;lt;/i&amp;gt; ID phrase&amp;#039;&lt;br /&gt;
	table.insert(tL, s)&lt;br /&gt;
	for keep, omit in pairs (tRules) do&lt;br /&gt;
		s = &amp;#039;&amp;amp;bull; keep &amp;#039; .. inMono(keep) .. &amp;#039;, omit &amp;#039; .. inMono(omit)&lt;br /&gt;
		table.insert(tL, s)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(tL, &amp;#039;&amp;lt;br/&amp;gt;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- _main&lt;br /&gt;
--&lt;br /&gt;
-- processes setID (H, P) and phrase codes&lt;br /&gt;
--		error:	setID not P, H&lt;br /&gt;
--				code not found&lt;br /&gt;
-- cannot mix H and P phrases&lt;br /&gt;
-- reads phrases from /data H or P phrases tables&lt;br /&gt;
-- formats phrase (abbreviation, abbr-title, phraseID)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function r._main(tArgs)&lt;br /&gt;
&lt;br /&gt;
	tArgs = prepareArgs(tArgs)&lt;br /&gt;
	&lt;br /&gt;
	if #tArgs == 0 then&lt;br /&gt;
		return showPreviewMsg() -- no content&lt;br /&gt;
	elseif tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;GHS&amp;#039; then&lt;br /&gt;
		return errorHPsetIDnotFound()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tArgs = applyRemoveDuplicates(tArgs)&lt;br /&gt;
	if tArgName[&amp;#039;omit&amp;#039;] then&lt;br /&gt;
		tArgs = applyOmitRules(tArgs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local formatterF&lt;br /&gt;
	if tArgName[&amp;#039;listtype&amp;#039;] == &amp;#039;abbr&amp;#039; then&lt;br /&gt;
		formatterF = formatPhraseAbbr&lt;br /&gt;
	elseif tArgName[&amp;#039;listtype&amp;#039;] == &amp;#039;inline&amp;#039; then&lt;br /&gt;
		formatterF = formatPhraseInline&lt;br /&gt;
	else --- Module:List options&lt;br /&gt;
		formatterF = formatPhraseList&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tReadD = {}&lt;br /&gt;
	if tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;H&amp;#039; then&lt;br /&gt;
		tReadD = GHSdata[&amp;#039;Hphrases&amp;#039;]&lt;br /&gt;
	elseif tArgName[&amp;#039;setID&amp;#039;] == &amp;#039;P&amp;#039; then&lt;br /&gt;
		tReadD = GHSdata[&amp;#039;Pphrases&amp;#039;]&lt;br /&gt;
	else&lt;br /&gt;
		return showPreviewMsg()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local sPhrase&lt;br /&gt;
	local tR = {}&lt;br /&gt;
	for i, v in ipairs(tArgs) do&lt;br /&gt;
		sPhrase = tReadD[v]&lt;br /&gt;
		if sPhrase == nil then&lt;br /&gt;
			table.insert(tR, errorPhraseIDnotFound(tostring(v)))&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(tR, formatterF(v, sPhrase))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tArgName[&amp;#039;listtype&amp;#039;] == &amp;#039;abbr&amp;#039; then&lt;br /&gt;
		return table.concat(tR, &amp;#039;, &amp;#039;) .. showPreviewMsg()&lt;br /&gt;
	elseif tArgName[&amp;#039;listtype&amp;#039;] == &amp;#039;inline&amp;#039; then&lt;br /&gt;
		return table.concat(tR, &amp;#039;, &amp;#039;) .. showPreviewMsg()&lt;br /&gt;
	else&lt;br /&gt;
		local mList = require(&amp;#039;Module:List&amp;#039;)&lt;br /&gt;
		return mList[tArgName[&amp;#039;listtype&amp;#039;]](tR) .. showPreviewMsg()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- main&lt;br /&gt;
--&lt;br /&gt;
-- handles template input frame, then calls generic _main() function&lt;br /&gt;
-- To be invoked from {{template}}&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
function r.main(frame)&lt;br /&gt;
local newArgs = getArgs(frame)&lt;br /&gt;
	return r._main(newArgs) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return r&lt;/div&gt;</summary>
		<author><name>Fire</name></author>
	</entry>
</feed>