<?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%3ATropical_cyclone_season_effects%2Fsandbox</id>
	<title>Module:Tropical cyclone season effects/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ATropical_cyclone_season_effects%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Tropical_cyclone_season_effects/sandbox&amp;action=history"/>
	<updated>2026-05-24T15:46:02Z</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:Tropical_cyclone_season_effects/sandbox&amp;diff=147377&amp;oldid=prev</id>
		<title>imported&gt;Chlod: ugh</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Tropical_cyclone_season_effects/sandbox&amp;diff=147377&amp;oldid=prev"/>
		<updated>2021-10-23T22:46:57Z</updated>

		<summary type="html">&lt;p&gt;ugh&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Used for tropical cyclone season articles.&lt;br /&gt;
&lt;br /&gt;
local invocation = require(&amp;#039;Module:Template invocation&amp;#039;).invocation&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local dateperiod = require(&amp;#039;Module:Date period&amp;#039;)._main&lt;br /&gt;
local Date = require(&amp;#039;Module:Date&amp;#039;)._Date&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame, {&lt;br /&gt;
		trim = true,&lt;br /&gt;
		removeBlanks = false&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
    return p._main(frame, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Used for decoding attributes (encoded by the child template automatically)&lt;br /&gt;
function unencode(encoded)&lt;br /&gt;
	return string.gsub(encoded, &amp;quot;&amp;amp;apos;&amp;quot;, &amp;quot;&amp;#039;&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Guesses the table year from the article title, or from arguments&lt;br /&gt;
function guessYear(frame, args)&lt;br /&gt;
	if args[&amp;quot;year&amp;quot;] or args[&amp;quot;start-year&amp;quot;] then&lt;br /&gt;
		return tonumber(args[&amp;quot;start-year&amp;quot;] or args[&amp;quot;year&amp;quot;]), &lt;br /&gt;
			tonumber(args[&amp;quot;end-year&amp;quot;])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local pageTitle = mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
	&lt;br /&gt;
	-- Note: These are different dashes (dash, ndash, mdash, respectively).&lt;br /&gt;
	rangeB = mw.ustring.match(pageTitle, &amp;quot;^%d+[%-–—](%d+)&amp;quot;)&lt;br /&gt;
	rangeA = mw.ustring.match(pageTitle, &amp;quot;^(%d+)&amp;quot;)&lt;br /&gt;
	if rangeB ~= nil then&lt;br /&gt;
		return tonumber(rangeA), tonumber(&lt;br /&gt;
			-- &amp;quot;2021&amp;quot; if &amp;quot;21&amp;quot;, &amp;quot;2021&amp;quot; if &amp;quot;2021&amp;quot;&lt;br /&gt;
			args[&amp;quot;end-year&amp;quot;] or (string.len(rangeB) &amp;gt; 2 and&lt;br /&gt;
				rangeB or string.sub(rangeA, 1, 2) .. rangeB)&lt;br /&gt;
		)&lt;br /&gt;
	elseif rangeA ~= nil then&lt;br /&gt;
		return tonumber(rangeA), nil&lt;br /&gt;
	else&lt;br /&gt;
		return nil, nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Module:Convert does not expose a module-friendly conversion system.&lt;br /&gt;
-- For this reason, we&amp;#039;ll need to do this messy hack that is extremely&lt;br /&gt;
-- inefficient.&lt;br /&gt;
function convert(frame, args)&lt;br /&gt;
	args[&amp;quot;disp&amp;quot;] = &amp;quot;number&amp;quot;&lt;br /&gt;
	args[&amp;quot;comma&amp;quot;] = &amp;quot;off&amp;quot;&lt;br /&gt;
	return tonumber(frame:expandTemplate{ title = &amp;quot;convert&amp;quot;, args = args })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(frame, args)&lt;br /&gt;
	local basin = args[&amp;quot;basin&amp;quot;] or args[&amp;quot;Basin&amp;quot;]&lt;br /&gt;
	if not yesno(args[&amp;quot;no-header&amp;quot;]) and basin == nil then&lt;br /&gt;
		mw.addWarning(&amp;quot;Basin not provided. A link will not be displayed leading to category definitions&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local startYear, endYear = guessYear(frame, args)&lt;br /&gt;
	if startYear == nil then&lt;br /&gt;
		return error(&amp;quot;Could not guess starting year. Supply with the &amp;#039;&amp;#039;year&amp;#039;&amp;#039; or &amp;#039;&amp;#039;startYear&amp;#039;&amp;#039; parameter&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if startYear == nil and endYear ~= nil then&lt;br /&gt;
		return error(&amp;quot;End year specified but start year not specified&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    local tableEntries = args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    tableEntries = unencode(tableEntries)&lt;br /&gt;
   &lt;br /&gt;
    local totalStorms = 0&lt;br /&gt;
    local strongestWinds = nil&lt;br /&gt;
    local tableWindsUnit = args[&amp;quot;winds-unit&amp;quot;]  -- nullable&lt;br /&gt;
    local lowestPressure = nil&lt;br /&gt;
    local tablePressureUnit = args[&amp;quot;pressure-unit&amp;quot;]  -- nullable&lt;br /&gt;
    local totalDamages = 0&lt;br /&gt;
    local totalDeaths = 0&lt;br /&gt;
    &lt;br /&gt;
    local earliestFormed = nil&lt;br /&gt;
    local latestDissipated = nil&lt;br /&gt;
    local latestPresent = false&lt;br /&gt;
    &lt;br /&gt;
    for entryJSON in mw.ustring.gmatch(tableEntries, &amp;quot;data%-tcse%-entry=&amp;#039;(.-)&amp;#039;&amp;quot;) do&lt;br /&gt;
    	entry = mw.text.jsonDecode(entryJSON)&lt;br /&gt;
    	totalStorms = totalStorms + 1&lt;br /&gt;
    	&lt;br /&gt;
    	if tableWindsUnit == nil then&lt;br /&gt;
    		tableWindsUnit = entry[&amp;quot;winds-unit&amp;quot;] or &amp;quot;kn&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
    	if tablePressureUnit == nil then&lt;br /&gt;
    		tablePressureUnit = entry[&amp;quot;pressure-unit&amp;quot;] or &amp;quot;hPa&amp;quot;&lt;br /&gt;
    	end&lt;br /&gt;
	&lt;br /&gt;
    	-- Convert to table units first&lt;br /&gt;
    	convertedWinds = tonumber(entry[&amp;quot;winds&amp;quot;]) ~= nil and (&lt;br /&gt;
    		entry[&amp;quot;winds-unit&amp;quot;] == tableWindsUnit&lt;br /&gt;
    			and entry[&amp;quot;winds&amp;quot;]&lt;br /&gt;
    			or convert(&lt;br /&gt;
    				frame,&lt;br /&gt;
    				{ entry[&amp;quot;winds&amp;quot;], entry[&amp;quot;winds-unit&amp;quot;] or &amp;quot;kn&amp;quot;, tableWindsUnit }&lt;br /&gt;
				)&lt;br /&gt;
			) or nil&lt;br /&gt;
		convertedPressure = tonumber(entry[&amp;quot;pressure&amp;quot;]) ~= nil and (&lt;br /&gt;
			entry[&amp;quot;pressure-unit&amp;quot;] == tablePressureUnit&lt;br /&gt;
				and entry[&amp;quot;pressure&amp;quot;]&lt;br /&gt;
    			or convert(&lt;br /&gt;
    				frame,&lt;br /&gt;
    				{ entry[&amp;quot;pressure&amp;quot;], entry[&amp;quot;pressure-unit&amp;quot;] or &amp;quot;hPa&amp;quot;, tablePressureUnit }&lt;br /&gt;
				)&lt;br /&gt;
			) or nil&lt;br /&gt;
		&lt;br /&gt;
		deaths = tonumber(mw.ustring.match(entry[&amp;quot;deaths&amp;quot;] or &amp;quot;&amp;quot;, &amp;quot;%d+&amp;quot;))&lt;br /&gt;
		damages = tonumber(mw.ustring.match(entry[&amp;quot;damages&amp;quot;] or &amp;quot;&amp;quot;, &amp;quot;%d+&amp;quot;))&lt;br /&gt;
		&lt;br /&gt;
		-- Compare&lt;br /&gt;
		if convertedWinds ~= nil and (&lt;br /&gt;
			strongestWinds == nil or convertedWinds &amp;gt; strongestWinds&lt;br /&gt;
		) then&lt;br /&gt;
			strongestWinds = convertedWinds&lt;br /&gt;
		end&lt;br /&gt;
		if convertedPressure ~= nil and (&lt;br /&gt;
			lowestPressure == nil or convertedPressure &amp;lt; lowestPressure&lt;br /&gt;
		) then&lt;br /&gt;
			lowestPressure = convertedPressure&lt;br /&gt;
		end&lt;br /&gt;
		if deaths ~= nil then&lt;br /&gt;
			totalDeaths = totalDeaths + deaths&lt;br /&gt;
		end&lt;br /&gt;
		if damages ~= nil then&lt;br /&gt;
			totalDamages = totalDamages + damages&lt;br /&gt;
		end&lt;br /&gt;
		if string.lower(entry[&amp;quot;dissipated&amp;quot;]) == &amp;quot;present&amp;quot; then&lt;br /&gt;
			latestPresent = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		formed = Date(entry[&amp;quot;formed&amp;quot;])&lt;br /&gt;
		dissipated = Date(entry[&amp;quot;dissipated&amp;quot;])&lt;br /&gt;
		if earliestFormed == nil or earliestFormed &amp;gt; formed then&lt;br /&gt;
			earliestFormed = formed&lt;br /&gt;
		end&lt;br /&gt;
		if latestDissipated == nil or latestDissipated &amp;lt; dissipated then&lt;br /&gt;
			latestDissipated = dissipated&lt;br /&gt;
		end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
	-- Using expandTemplate for modularity.&lt;br /&gt;
	local tcHeader = frame:expandTemplate{&lt;br /&gt;
		title = &amp;quot;Tropical cyclone season effects (top)&amp;quot;,&lt;br /&gt;
		args = {&lt;br /&gt;
			[&amp;quot;no-sort&amp;quot;] = totalStorms == 0 and &amp;quot;yes&amp;quot; or nil,&lt;br /&gt;
			[&amp;quot;no-header&amp;quot;] = args[&amp;quot;no-header&amp;quot;],&lt;br /&gt;
			[&amp;quot;basin&amp;quot;] = basin,&lt;br /&gt;
			[&amp;quot;start-year&amp;quot;] = startYear,&lt;br /&gt;
			[&amp;quot;end-year&amp;quot;] = endYear,&lt;br /&gt;
			[&amp;quot;currency-link&amp;quot;] = args[&amp;quot;currency-link&amp;quot;]&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- Template parameters not yet standardized. Hence the usage of capitalized&lt;br /&gt;
	-- parameter names.&lt;br /&gt;
	-- Using expandTemplate for modularity.&lt;br /&gt;
    local tcFooter = frame:expandTemplate{&lt;br /&gt;
    	title = &amp;quot;Tropical cyclone season effects (bottom)&amp;quot;,&lt;br /&gt;
    	args = {&lt;br /&gt;
			[&amp;quot;TC&amp;#039;s&amp;quot;] = totalStorms .. &amp;quot; system&amp;quot; .. (totalStorms == 1 and &amp;quot;&amp;quot; or &amp;quot;s&amp;quot;),&lt;br /&gt;
			[&amp;quot;dates&amp;quot;] = totalStorms == 0 and &amp;quot;Season not started&amp;quot; or&lt;br /&gt;
				dateperiod(&lt;br /&gt;
					earliestFormed,&lt;br /&gt;
					(latestPresent or yesno(args[&amp;quot;active&amp;quot;]))&lt;br /&gt;
					    and &amp;quot;Season ongoing&amp;quot; or latestDissipated:text(&lt;br /&gt;
					    	args[&amp;quot;date-format&amp;quot;] or &amp;quot;mdy&amp;quot;&lt;br /&gt;
				    	)&lt;br /&gt;
				),&lt;br /&gt;
			[&amp;quot;winds&amp;quot;] = (totalStorms == 0 or strongestWinds == 0) and &amp;quot;&amp;quot; or&lt;br /&gt;
				(&lt;br /&gt;
					tableWindsUnit == &amp;quot;kn&amp;quot; and (&lt;br /&gt;
						frame:expandTemplate{&lt;br /&gt;
							title = &amp;quot;convert&amp;quot;,&lt;br /&gt;
							args = {&lt;br /&gt;
								strongestWinds, &lt;br /&gt;
								tableWindsUnit,&lt;br /&gt;
								args[&amp;quot;winds-target&amp;quot;] or &amp;quot;kph&amp;quot;,&lt;br /&gt;
								round = &amp;quot;5&amp;quot;,&lt;br /&gt;
								abbr = &amp;quot;on&amp;quot;,&lt;br /&gt;
								disp = &amp;quot;out&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						} .. (args[&amp;quot;winds-target2&amp;quot;] ~= &amp;quot;none&amp;quot; and &amp;quot; (&amp;quot; .. frame:expandTemplate{&lt;br /&gt;
							title = &amp;quot;convert&amp;quot;,&lt;br /&gt;
							args = {&lt;br /&gt;
								strongestWinds, &lt;br /&gt;
								tableWindsUnit,&lt;br /&gt;
								args[&amp;quot;winds-target2&amp;quot;] or &amp;quot;mph&amp;quot;,&lt;br /&gt;
								round = &amp;quot;5&amp;quot;,&lt;br /&gt;
								abbr = &amp;quot;on&amp;quot;,&lt;br /&gt;
								disp = &amp;quot;out&amp;quot;&lt;br /&gt;
							}&lt;br /&gt;
						} .. &amp;quot;)&amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
					) or frame:expandTemplate{&lt;br /&gt;
						title = &amp;quot;convert&amp;quot;,&lt;br /&gt;
						args = {&lt;br /&gt;
							strongestWinds, &lt;br /&gt;
							tableWindsUnit,&lt;br /&gt;
							args[&amp;quot;winds-target&amp;quot;] or &amp;quot;&amp;quot;,&lt;br /&gt;
							round = &amp;quot;5&amp;quot;,&lt;br /&gt;
							abbr = &amp;quot;on&amp;quot;&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
				),&lt;br /&gt;
			[&amp;quot;pres&amp;quot;] = (totalStorms == 0 or lowestPressure == 0) and &amp;quot;&amp;quot; or&lt;br /&gt;
				frame:expandTemplate{&lt;br /&gt;
					title = &amp;quot;convert&amp;quot;,&lt;br /&gt;
					args = {&lt;br /&gt;
						lowestPressure, &lt;br /&gt;
						tablePressureUnit,&lt;br /&gt;
						args[&amp;quot;pressure-target&amp;quot;] or &amp;quot;inHg&amp;quot;,&lt;br /&gt;
						comma = &amp;quot;off&amp;quot;,&lt;br /&gt;
						sigfig = 4,&lt;br /&gt;
						abbr = &amp;quot;on&amp;quot;&lt;br /&gt;
					}&lt;br /&gt;
				},&lt;br /&gt;
			[&amp;quot;damage&amp;quot;] = (totalStorms == 0 or totalDamages == 0) and &amp;quot;&amp;quot; or&lt;br /&gt;
				frame:expandTemplate{&lt;br /&gt;
					title = totalDamages == 0 and &amp;quot;nts&amp;quot; or &amp;quot;ntsp&amp;quot;,&lt;br /&gt;
					args = { totalDamages, &amp;quot;&amp;quot;, totalDamages ~= 0 and (args[&amp;quot;currency-symbol&amp;quot;] or &amp;quot;$&amp;quot;) }&lt;br /&gt;
				},&lt;br /&gt;
			[&amp;quot;deaths&amp;quot;] = (totalStorms == 0 or totalDeaths == 0) and &amp;quot;&amp;quot; or &lt;br /&gt;
				frame:expandTemplate{&lt;br /&gt;
					title = &amp;quot;nts&amp;quot;,&lt;br /&gt;
					args = { totalDeaths }&lt;br /&gt;
				},&lt;br /&gt;
			[&amp;quot;Refs&amp;quot;] = args[&amp;quot;footer-refs&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return tcHeader .. &amp;quot;\n&amp;quot; .. tableEntries .. &amp;quot;\n&amp;quot; .. tcFooter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Chlod</name></author>
	</entry>
</feed>