<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Aaffixusex%2Ftemplates</id>
	<title>Module:affixusex/templates - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://linguifex.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3Aaffixusex%2Ftemplates"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;action=history"/>
	<updated>2026-04-06T20:49:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;diff=461077&amp;oldid=prev</id>
		<title>Sware at 14:03, 1 July 2025</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;diff=461077&amp;oldid=prev"/>
		<updated>2025-07-01T14:03:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:03, 1 July 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l49&quot;&gt;Line 49:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 49:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local has_exclamation_point = {}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local has_exclamation_point = {}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local items, args = m_param_utils.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;process_list_arguments &lt;/del&gt;{&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local items, args = m_param_utils.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;parse_list_with_inline_modifiers_and_separate_params &lt;/ins&gt;{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		params = params,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		params = params,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		param_mods = param_mods,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		param_mods = param_mods,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;diff=434766&amp;oldid=prev</id>
		<title>Sware at 13:12, 25 January 2025</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;diff=434766&amp;oldid=prev"/>
		<updated>2025-01-25T13:12:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;amp;diff=434766&amp;amp;oldid=235160&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;diff=235160&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;local export = {}  local m_languages = require(&quot;Module:languages&quot;)  local rfind = mw.ustring.find local rsubn = mw.ustring.gsub  -- helper functions  -- version of rsubn() tha...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:affixusex/templates&amp;diff=235160&amp;oldid=prev"/>
		<updated>2021-09-02T15:45:16Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local export = {}  local m_languages = require(&amp;quot;Module:languages&amp;quot;)  local rfind = mw.ustring.find local rsubn = mw.ustring.gsub  -- helper functions  -- version of rsubn() tha...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local export = {}&lt;br /&gt;
&lt;br /&gt;
local m_languages = require(&amp;quot;Module:languages&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local rfind = mw.ustring.find&lt;br /&gt;
local rsubn = mw.ustring.gsub&lt;br /&gt;
&lt;br /&gt;
-- helper functions&lt;br /&gt;
&lt;br /&gt;
-- version of rsubn() that discards all but the first return value&lt;br /&gt;
local function rsub(term, foo, bar)&lt;br /&gt;
	local retval = rsubn(term, foo, bar)&lt;br /&gt;
	return retval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.affixusex_t(frame)&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {required = true, default=&amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {list = true, allow_holes = true},&lt;br /&gt;
		&lt;br /&gt;
		[&amp;quot;t&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;gloss&amp;quot;] = {list = true, allow_holes = true, require_index = true, alias_of = &amp;quot;t&amp;quot;},&lt;br /&gt;
		[&amp;quot;tr&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;ts&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;g&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;id&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;altaff&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;alt&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;q&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;lit&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;pos&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;sc&amp;quot;] = {},&lt;br /&gt;
		[&amp;quot;nointerp&amp;quot;] = {type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		[&amp;quot;lang&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		-- Note, sc1=, sc2=, ... are different from sc=; the former apply to&lt;br /&gt;
		-- individual arguments when lang1=, lang2=, ... is specified, while&lt;br /&gt;
		-- the latter applies to all arguments where langN=... isn&amp;#039;t specified&lt;br /&gt;
		[&amp;quot;langsc&amp;quot;] = {list = &amp;quot;sc&amp;quot;, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;arrow&amp;quot;] = {list = true, allow_holes = true, require_index = true, type = &amp;quot;boolean&amp;quot;},&lt;br /&gt;
		[&amp;quot;joiner&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;fulljoiner&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
		[&amp;quot;accel&amp;quot;] = {list = true, allow_holes = true, require_index = true},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local aftype = frame.args[&amp;quot;type&amp;quot;]&lt;br /&gt;
	if aftype == &amp;quot;&amp;quot; or not aftype then&lt;br /&gt;
		aftype = &amp;quot;affix&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if aftype == &amp;quot;prefix&amp;quot; then&lt;br /&gt;
		params[&amp;quot;altpref&amp;quot;] = {alias_of = &amp;quot;altaff&amp;quot;}&lt;br /&gt;
	elseif aftype == &amp;quot;suffix&amp;quot; then&lt;br /&gt;
		params[&amp;quot;altsuf&amp;quot;] = {alias_of = &amp;quot;altaff&amp;quot;}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params)&lt;br /&gt;
	&lt;br /&gt;
	local lang = args[1]&lt;br /&gt;
	lang = m_languages.getByCode(lang) or m_languages.err(lang, 1)&lt;br /&gt;
	local sc = args[&amp;quot;sc&amp;quot;]&lt;br /&gt;
	sc = (sc and (require(&amp;quot;Module:scripts&amp;quot;).getByCode(sc) or error(&amp;quot;The script code \&amp;quot;&amp;quot; .. sc .. &amp;quot;\&amp;quot; is not valid.&amp;quot;)) or nil)&lt;br /&gt;
&lt;br /&gt;
	-- Find the maximum index among any of the list parameters.&lt;br /&gt;
	local maxmaxindex = 0&lt;br /&gt;
	for k, v in pairs(params) do&lt;br /&gt;
		if v.list and v.allow_holes and not v.alias_of and args[k].maxindex &amp;gt; maxmaxindex then&lt;br /&gt;
			maxmaxindex = args[k].maxindex&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Determine whether the terms in the numbered params contain a prefix or suffix.&lt;br /&gt;
	-- If not, we may insert one before the last term (for suffixes) or the first&lt;br /&gt;
	-- term (for prefixes).&lt;br /&gt;
	local affix_in_parts = false&lt;br /&gt;
	local SUBPAGE = mw.title.getCurrentTitle().subpageText&lt;br /&gt;
	local is_affix = {}&lt;br /&gt;
	for i=1,maxmaxindex do&lt;br /&gt;
		if args[2][i] then&lt;br /&gt;
			-- Careful here, a prefix beginning with ! should be treated as a&lt;br /&gt;
			-- normal term.&lt;br /&gt;
			if rfind(args[2][i], &amp;quot;^!&amp;quot;) or lang:makeEntryName(args[2][i]) == SUBPAGE then&lt;br /&gt;
				affix_in_parts = true&lt;br /&gt;
				is_affix[i] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local insertable_aff = args[&amp;quot;altaff&amp;quot;] or SUBPAGE&lt;br /&gt;
	-- Insert suffix derived from page title or altaff=/altsuf= before the last&lt;br /&gt;
	-- component if&lt;br /&gt;
	-- (a) nointerp= isn&amp;#039;t present, and&lt;br /&gt;
	-- (b) no suffix is present among the parts (where &amp;quot;suffix&amp;quot; means a part that&lt;br /&gt;
	--     matches the subpage name after diacritics have been removed, or a part&lt;br /&gt;
	--     prefixed by !), and either&lt;br /&gt;
	--    (i) {{suffixusex}}/{{sufex}} was used;&lt;br /&gt;
	--    (ii) {{affixusex}}/{{afex}} was used and altaff= is given, and its value&lt;br /&gt;
	--         looks like a suffix (begins with -, doesn&amp;#039;t end in -; an infix is&lt;br /&gt;
	--         not a suffix)&lt;br /&gt;
	--    (iii) {{affixusex}}/{{afex}} was used and altaff= is not given and the&lt;br /&gt;
	--          subpage title looks like a suffix (same conditions as for altaff=)&lt;br /&gt;
	local insert_suffix = not args[&amp;quot;nointerp&amp;quot;] and not affix_in_parts and (aftype == &amp;quot;suffix&amp;quot; or (&lt;br /&gt;
		aftype == &amp;quot;affix&amp;quot; and rfind(insertable_aff, &amp;quot;^%-&amp;quot;) and not rfind(insertable_aff, &amp;quot;%-$&amp;quot;)))&lt;br /&gt;
	-- Insert prefix derived from page title or altaff=/altpref= before the first&lt;br /&gt;
	-- component using similar logic as preceding.&lt;br /&gt;
	local insert_prefix = not args[&amp;quot;nointerp&amp;quot;] and not affix_in_parts and (aftype == &amp;quot;prefix&amp;quot; or (&lt;br /&gt;
		aftype == &amp;quot;affix&amp;quot; and rfind(insertable_aff, &amp;quot;%-$&amp;quot;) and not rfind(insertable_aff, &amp;quot;^%-&amp;quot;)))&lt;br /&gt;
&lt;br /&gt;
	-- Build up the per-term objects.&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for i=1,maxmaxindex do&lt;br /&gt;
		-- If we&amp;#039;re {{suffixusex}} and about to append the last term, or {{prefixusex}}&lt;br /&gt;
		-- and about to append the first term, and no affix appeared among the terms, and&lt;br /&gt;
		-- nointerp= isn&amp;#039;t set, insert the affix (which comes either from altaff=/altpref=/altsuf=&lt;br /&gt;
		-- or from the subpage name).&lt;br /&gt;
		if i == maxmaxindex and insert_suffix or i == 1 and insert_prefix then&lt;br /&gt;
			local affix = args[&amp;quot;altaff&amp;quot;]&lt;br /&gt;
			affix = affix or SUBPAGE&lt;br /&gt;
			table.insert(parts, {alt = affix})&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local part = {}&lt;br /&gt;
		if is_affix[i] and not args[&amp;quot;alt&amp;quot;][i] then&lt;br /&gt;
			part.alt = rsub(args[2][i], &amp;quot;^!&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			part.term = args[2][i]&lt;br /&gt;
			part.alt = args[&amp;quot;alt&amp;quot;][i]&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local langn = args[&amp;quot;lang&amp;quot;][i]&lt;br /&gt;
		if langn then&lt;br /&gt;
			langn =&lt;br /&gt;
				m_languages.getByCode(langn) or&lt;br /&gt;
				require(&amp;quot;Module:etymology languages&amp;quot;).getByCode(langn) or&lt;br /&gt;
				m_languages.err(langn, &amp;quot;lang&amp;quot; .. i)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local langsc = args[&amp;quot;langsc&amp;quot;][i]&lt;br /&gt;
		if langsc then&lt;br /&gt;
			langsc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(langsc) or error(&amp;quot;The script code \&amp;quot;&amp;quot; .. langsc .. &amp;quot;\&amp;quot; is not valid.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		part.t = args[&amp;quot;t&amp;quot;][i]&lt;br /&gt;
		part.tr = args[&amp;quot;tr&amp;quot;][i]&lt;br /&gt;
		part.ts = args[&amp;quot;ts&amp;quot;][i]&lt;br /&gt;
		part.g = args[&amp;quot;g&amp;quot;][i]&lt;br /&gt;
		part.id = args[&amp;quot;id&amp;quot;][i]&lt;br /&gt;
		part.q = args[&amp;quot;q&amp;quot;][i]&lt;br /&gt;
		part.lit = args[&amp;quot;lit&amp;quot;][i]&lt;br /&gt;
		part.pos = args[&amp;quot;pos&amp;quot;][i]&lt;br /&gt;
		part.lang = langn&lt;br /&gt;
		part.sc = langsc&lt;br /&gt;
		part.arrow = args[&amp;quot;arrow&amp;quot;][i]&lt;br /&gt;
		part.joiner = args[&amp;quot;joiner&amp;quot;][i]&lt;br /&gt;
		part.fulljoiner = args[&amp;quot;fulljoiner&amp;quot;][i]&lt;br /&gt;
		part.accel = args[&amp;quot;accel&amp;quot;][i] and string.gsub(args[&amp;quot;accel&amp;quot;], &amp;quot;_&amp;quot;, &amp;quot;|&amp;quot;),  -- To allow use of | in templates&lt;br /&gt;
		table.insert(parts, part)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return require(&amp;quot;Module:affixusex&amp;quot;).format_affixusex(lang, sc, parts, aftype)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>