<?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%3Aletter_def</id>
	<title>Module:letter def - 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%3Aletter_def"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:letter_def&amp;action=history"/>
	<updated>2026-05-23T22:07:11Z</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:letter_def&amp;diff=515160&amp;oldid=prev</id>
		<title>Sware at 10:47, 8 May 2026</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:letter_def&amp;diff=515160&amp;oldid=prev"/>
		<updated>2026-05-08T10:47:32Z</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 10:47, 8 May 2026&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-l148&quot;&gt;Line 148:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 148:&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;	if canontype == &amp;quot;letter&amp;quot; or canontype == &amp;quot;numsym&amp;quot; then&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;	if canontype == &amp;quot;letter&amp;quot; or canontype == &amp;quot;numsym&amp;quot; then&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;		merge_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;		merge_params {&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;			[3] = &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{type = &quot;number&quot;}&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;			[3] = &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;true&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;			[4] = list_param,&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;			[4] = list_param,&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;			linklang = boolean_param, -- only used for prec/foll&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;			linklang = boolean_param, -- only used for prec/foll&lt;/div&gt;&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-l256&quot;&gt;Line 256:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 256:&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;		if args[3] then&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;		if args[3] then&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;			ins(&amp;quot; &amp;quot;)&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;			ins(&amp;quot; &amp;quot;)&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;			ins(ordinal_to_word(args[3]))&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;			ins(&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;type(args[3]) == &quot;number&quot; and &lt;/ins&gt;ordinal_to_word(args[3]) &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;or args[3]&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;		end&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;		end&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;		if args.last then&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;		if args.last then&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:letter_def&amp;diff=515159&amp;oldid=prev</id>
		<title>Sware: Created page with &quot;-- Author: Benwing  local export = {}  local force_cat = false  local require_when_needed = require(&quot;Module:utilities/require when needed&quot;)  local ConvertNumeric_module = &quot;Module:ConvertNumeric&quot; local headword_module = &quot;Module:headword&quot; local headword_utilities_module = &quot;Module:headword utilities&quot; local languages_module = &quot;Module:languages&quot; local links_module = &quot;Module:links&quot; local parameters_module = &quot;Module:parameters&quot; local scripts_module = &quot;Module:scripts&quot; local stri...&quot;</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:letter_def&amp;diff=515159&amp;oldid=prev"/>
		<updated>2026-05-08T10:38:01Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- Author: Benwing  local export = {}  local force_cat = false  local require_when_needed = require(&amp;quot;Module:utilities/require when needed&amp;quot;)  local ConvertNumeric_module = &amp;quot;Module:ConvertNumeric&amp;quot; local headword_module = &amp;quot;Module:headword&amp;quot; local headword_utilities_module = &amp;quot;Module:headword utilities&amp;quot; local languages_module = &amp;quot;Module:languages&amp;quot; local links_module = &amp;quot;Module:links&amp;quot; local parameters_module = &amp;quot;Module:parameters&amp;quot; local scripts_module = &amp;quot;Module:scripts&amp;quot; local stri...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Author: Benwing&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local force_cat = false&lt;br /&gt;
&lt;br /&gt;
local require_when_needed = require(&amp;quot;Module:utilities/require when needed&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local ConvertNumeric_module = &amp;quot;Module:ConvertNumeric&amp;quot;&lt;br /&gt;
local headword_module = &amp;quot;Module:headword&amp;quot;&lt;br /&gt;
local headword_utilities_module = &amp;quot;Module:headword utilities&amp;quot;&lt;br /&gt;
local languages_module = &amp;quot;Module:languages&amp;quot;&lt;br /&gt;
local links_module = &amp;quot;Module:links&amp;quot;&lt;br /&gt;
local parameters_module = &amp;quot;Module:parameters&amp;quot;&lt;br /&gt;
local scripts_module = &amp;quot;Module:scripts&amp;quot;&lt;br /&gt;
local string_utilities_module = &amp;quot;Module:string utilities&amp;quot;&lt;br /&gt;
local table_module = &amp;quot;Module:table&amp;quot;&lt;br /&gt;
local utilities_module = &amp;quot;Module:utilities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local m_links = require(links_module)&lt;br /&gt;
local full_link = m_links.full_link&lt;br /&gt;
local m_string_utilities = require(string_utilities_module)&lt;br /&gt;
local glossary_link = require_when_needed(headword_utilities_module, &amp;quot;glossary_link&amp;quot;)&lt;br /&gt;
local lang_getByCode = require_when_needed(languages_module, &amp;quot;getByCode&amp;quot;)&lt;br /&gt;
local format_categories = require_when_needed(utilities_module, &amp;quot;format_categories&amp;quot;)&lt;br /&gt;
local serial_comma_join = require_when_needed(table_module, &amp;quot;serialCommaJoin&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local uupper = m_string_utilities.upper&lt;br /&gt;
local ulower = m_string_utilities.lower&lt;br /&gt;
local ufind = m_string_utilities.find&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
&lt;br /&gt;
local function ine(val)&lt;br /&gt;
	if not val then&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
	val = mw.text.trim(val)&lt;br /&gt;
	if val == &amp;quot;&amp;quot; then return nil else return val end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ordinal_to_word(num)&lt;br /&gt;
	-- [[Module:ConvertNumeric]] is taken from Wikipedia and is one of the worst pieces of shit I&amp;#039;ve ever seen.&lt;br /&gt;
	-- For example, spell_number has 13 numbered params.&lt;br /&gt;
	return require(ConvertNumeric_module).spell_number(&lt;br /&gt;
		num,&lt;br /&gt;
		nil, -- numerator&lt;br /&gt;
		nil, -- denominator&lt;br /&gt;
		nil, -- capitalize&lt;br /&gt;
		true, -- use_and; mimics default behavior of {{ordinal to word}}, which includes supposedly British &amp;quot;and&amp;quot;&lt;br /&gt;
			  -- before the final number&lt;br /&gt;
		nil, -- hyphenate&lt;br /&gt;
		true -- ordinal&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_initial_colon_to_term(term)&lt;br /&gt;
	if term ~= &amp;quot;-&amp;quot; and term ~= &amp;quot;+&amp;quot; and not term:find(&amp;quot;^:&amp;quot;) then&lt;br /&gt;
		-- Make sure we link to the specified term even if it has a diacritic that would normally be stripped off.&lt;br /&gt;
		term = &amp;quot;:&amp;quot; .. term&lt;br /&gt;
	end&lt;br /&gt;
	return term&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_param(value, paramname)&lt;br /&gt;
	if not value then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local termobjs&lt;br /&gt;
	if value:find(&amp;quot;[,&amp;lt;]&amp;quot;) then&lt;br /&gt;
		termobjs = require(headword_utilities_module).parse_term_with_modifiers {&lt;br /&gt;
			val = value,&lt;br /&gt;
			paramname = paramname,&lt;br /&gt;
			splitchar = &amp;quot;,&amp;quot;,&lt;br /&gt;
			include_mods = {&amp;quot;tr&amp;quot;, &amp;quot;ts&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;sc&amp;quot;},&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		termobjs = {{ term = value }}&lt;br /&gt;
	end&lt;br /&gt;
	return termobjs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parse_char(value, paramname, no_prefix_colon)&lt;br /&gt;
	if not value then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local termobjs = parse_param(value, paramname)&lt;br /&gt;
	for _, termobj in ipairs(termobjs) do&lt;br /&gt;
		if not no_prefix_colon then&lt;br /&gt;
			termobj.term = add_initial_colon_to_term(termobj.term)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return termobjs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function join_items(items, conj)&lt;br /&gt;
	if not items[2] then&lt;br /&gt;
		return items[1]&lt;br /&gt;
	else&lt;br /&gt;
		return serial_comma_join(items, {conj = conj})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
Implementation of {{tl|Latn-def}}, {{tl|Cyrl-def}} and the like. Supports the following invocation parameter:&lt;br /&gt;
; {{para|sc}}&lt;br /&gt;
: Specify the script code. If omitted, taken from the template parameter {{para|sc}}; if that is omitted, autodetected&lt;br /&gt;
  from the pagename and/or character specified in 3=. If neither method is possible, an error is thrown.&lt;br /&gt;
]==]&lt;br /&gt;
function export.show(frame)&lt;br /&gt;
	local list_param = {list = true, disallow_holes = true}&lt;br /&gt;
	local boolean_param = {type = &amp;quot;boolean&amp;quot;}&lt;br /&gt;
	local output = {}&lt;br /&gt;
	local function ins(txt)&lt;br /&gt;
		insert(output, txt)&lt;br /&gt;
	end&lt;br /&gt;
	local iargs = require(parameters_module).process(frame.args, {&lt;br /&gt;
		sc = {type = &amp;quot;script&amp;quot;},&lt;br /&gt;
	})&lt;br /&gt;
	local parent_args = frame:getParent().args&lt;br /&gt;
	local deftype = ine(parent_args[2])&lt;br /&gt;
	if deftype == &amp;quot;ordinal&amp;quot; then&lt;br /&gt;
		deftype = &amp;quot;numsym&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local canontype = deftype&lt;br /&gt;
	if canontype == &amp;quot;digraph&amp;quot; or canontype == &amp;quot;trigraph&amp;quot; or canontype == &amp;quot;tetragraph&amp;quot; or canontype == &amp;quot;pentagraph&amp;quot; or&lt;br /&gt;
		canontype == &amp;quot;multigraph&amp;quot; then&lt;br /&gt;
		canontype = &amp;quot;letter&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- FIXME: convert &amp;#039;ordinal&amp;#039; to &amp;#039;numsym&amp;#039;&lt;br /&gt;
	local deftypes = {&amp;quot;letter&amp;quot;, &amp;quot;digraph&amp;quot;, &amp;quot;trigraph&amp;quot;, &amp;quot;tetragraph&amp;quot;, &amp;quot;pentagraph&amp;quot;, &amp;quot;multigraph&amp;quot;, &amp;quot;numsym&amp;quot;, &amp;quot;ordinal&amp;quot;, &amp;quot;name&amp;quot;, &amp;quot;diacritic&amp;quot;, &amp;quot;syllable&amp;quot;}&lt;br /&gt;
	local params = {&lt;br /&gt;
		[1] = {type = &amp;quot;language&amp;quot;, required = true, template_default = &amp;quot;und&amp;quot;},&lt;br /&gt;
		[2] = {set = deftypes, required = true},&lt;br /&gt;
		sc = {type = &amp;quot;script&amp;quot;},&lt;br /&gt;
		nocap = boolean_param,&lt;br /&gt;
		dot = true,&lt;br /&gt;
		nodot = boolean_param,&lt;br /&gt;
		addl = true,&lt;br /&gt;
		pagename = true,&lt;br /&gt;
	}&lt;br /&gt;
	local function merge_params(extra_params)&lt;br /&gt;
		for k, v in pairs(extra_params) do&lt;br /&gt;
			params[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if canontype == &amp;quot;letter&amp;quot; or canontype == &amp;quot;numsym&amp;quot; then&lt;br /&gt;
		merge_params {&lt;br /&gt;
			[3] = {type = &amp;quot;number&amp;quot;},&lt;br /&gt;
			[4] = list_param,&lt;br /&gt;
			linklang = boolean_param, -- only used for prec/foll&lt;br /&gt;
			alphabet = true,&lt;br /&gt;
			alphvar = true,&lt;br /&gt;
			prec = true,&lt;br /&gt;
			foll = true,&lt;br /&gt;
			last = boolean_param,&lt;br /&gt;
		}&lt;br /&gt;
	elseif canontype == &amp;quot;name&amp;quot; then&lt;br /&gt;
		merge_params {&lt;br /&gt;
			[3] = {required = true},&lt;br /&gt;
			[4] = true,&lt;br /&gt;
			linklang = boolean_param,&lt;br /&gt;
			alphabet = true,&lt;br /&gt;
			alphvar = true,&lt;br /&gt;
			lit = true,&lt;br /&gt;
			eq = true,&lt;br /&gt;
		}&lt;br /&gt;
	elseif canontype == &amp;quot;diacritic&amp;quot; then&lt;br /&gt;
		merge_params {&lt;br /&gt;
			[3] = list_param,&lt;br /&gt;
			name = true,&lt;br /&gt;
			alphabet = true,&lt;br /&gt;
			alphvar = true,&lt;br /&gt;
			nopairs = boolean_param,&lt;br /&gt;
			moreexamples = boolean_param,&lt;br /&gt;
		}&lt;br /&gt;
	elseif canontype == &amp;quot;syllable&amp;quot; then&lt;br /&gt;
		merge_params {&lt;br /&gt;
			[3] = {required = true},&lt;br /&gt;
			[4] = {required = true},&lt;br /&gt;
			[5] = {required = true},&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		-- no need to throw an error here, as it will be thrown by [[Module:parameters]]&lt;br /&gt;
	end&lt;br /&gt;
	local args = require(parameters_module).process(parent_args, params)&lt;br /&gt;
	local lang = args[1]&lt;br /&gt;
	local sc = args.sc or iargs.sc&lt;br /&gt;
&lt;br /&gt;
	if not sc then&lt;br /&gt;
		if canontype == &amp;quot;letter&amp;quot; or canontype == &amp;quot;numsym&amp;quot; then&lt;br /&gt;
			sc = lang:findBestScript(args.pagename or mw.loadData(&amp;quot;Module:headword/data&amp;quot;).pagename)&lt;br /&gt;
		elseif canontype == &amp;quot;diacritic&amp;quot; or canontype == &amp;quot;name&amp;quot; then&lt;br /&gt;
			local test_char = args[3]&lt;br /&gt;
			if type(test_char) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				test_char = test_char[1]&lt;br /&gt;
			end&lt;br /&gt;
			if not test_char then&lt;br /&gt;
				error(&amp;quot;No letter is specified in 3= from which the script can be derived; you must specify the script explicitly in sc=&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			sc = lang:findBestScript(test_char)&lt;br /&gt;
		else&lt;br /&gt;
			sc = require(scripts_module).getByCode(&amp;quot;Latn&amp;quot;) -- not actually used&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local sccode = sc:getCode()&lt;br /&gt;
	local scname = sc:getCanonicalName()&lt;br /&gt;
	local sccatname = sc:getCategoryName()&lt;br /&gt;
	local scdisplay = sc:getDisplayForm()&lt;br /&gt;
	local linked_script = (&amp;quot;[[wikt:Appendix:%s|%s]]&amp;quot;):format(sccatname, sccatname)&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	ins(&amp;quot;&amp;lt;span class=&amp;#039;use-with-mention&amp;#039;&amp;gt;&amp;quot;)&lt;br /&gt;
	local function link_to_lang_or_mul(char, paramname, notr)&lt;br /&gt;
		local termobjs = parse_char(char, paramname)&lt;br /&gt;
		for i, termobj in ipairs(termobjs) do&lt;br /&gt;
			-- Either link a character using the language in 1= or using &amp;#039;mul&amp;#039; (Translingual). We do this to avoid&lt;br /&gt;
			-- yellow links from trying to link to a nonexistent character. Basically, if linklang=1, we always link&lt;br /&gt;
			-- using the language in 1=; otherwise we try to see if the character is in the language&amp;#039;s standard_chars,&lt;br /&gt;
			-- and if not, link to Translingual. If the standardChars for the language is missing or the character can&amp;#039;t&lt;br /&gt;
			-- be looked up (e.g. it&amp;#039;s a digraph or trigraph), assume it&amp;#039;s in the language and link using the language.&lt;br /&gt;
			local lang_for_linking&lt;br /&gt;
			local char = termobj.term&lt;br /&gt;
			if args.linklang then&lt;br /&gt;
				lang_for_linking = lang&lt;br /&gt;
			elseif #char &amp;gt; 1 then&lt;br /&gt;
				-- If the character is a digraph or trigraph, we can&amp;#039;t check it against standard_chars, which only lists&lt;br /&gt;
				-- single Unicode chars.&lt;br /&gt;
				lang_for_linking = lang&lt;br /&gt;
			else&lt;br /&gt;
				local standard_chars = lang:getStandardCharacters(sc)&lt;br /&gt;
				if type(standard_chars) ~= &amp;quot;string&amp;quot; or ufind(standard_chars, char) then&lt;br /&gt;
					-- No standard_chars, or character in standard_chars; link using lang.&lt;br /&gt;
					lang_for_linking = lang&lt;br /&gt;
				else&lt;br /&gt;
					lang_for_linking = lang_getByCode(&amp;quot;mul&amp;quot;, true)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			termobj.lang = lang_for_linking&lt;br /&gt;
			termobj.sc = sc&lt;br /&gt;
			if notr and not termobj.tr then&lt;br /&gt;
				termobj.tr = &amp;quot;-&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			termobjs[i] = full_link(termobj, &amp;quot;term&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		return join_items(termobjs, &amp;quot;or&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if canontype == &amp;quot;letter&amp;quot; or canontype == &amp;quot;numsym&amp;quot; then&lt;br /&gt;
		local indef = not args[3] and not args.last&lt;br /&gt;
		local article = indef and &amp;quot;A&amp;quot; or &amp;quot;The&amp;quot;&lt;br /&gt;
		if args.nocap then&lt;br /&gt;
			article = article:lower()&lt;br /&gt;
		end&lt;br /&gt;
		ins(article)&lt;br /&gt;
		if args[3] then&lt;br /&gt;
			ins(&amp;quot; &amp;quot;)&lt;br /&gt;
			ins(ordinal_to_word(args[3]))&lt;br /&gt;
		end&lt;br /&gt;
		if args.last then&lt;br /&gt;
			if args[3] then&lt;br /&gt;
				ins(&amp;quot; and&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			ins(&amp;quot; last&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		-- If we&amp;#039;re Translingual, don&amp;#039;t say we&amp;#039;re a letter of the &amp;quot;Translingual alphabet&amp;quot; because there is no such&lt;br /&gt;
		-- thing; instead, say we&amp;#039;re a letter of the given script, and omit the coda that says &amp;quot;written in the Foo&lt;br /&gt;
		-- script&amp;quot; because it&amp;#039;s redundant.&lt;br /&gt;
		local is_mul = lang:getFullCode() == &amp;quot;mul&amp;quot;&lt;br /&gt;
		local lang_for_linking = is_mul and lang_getByCode(&amp;quot;en&amp;quot;, true) or lang&lt;br /&gt;
		ins(&amp;quot; &amp;quot;)&lt;br /&gt;
		if canontype == &amp;quot;numsym&amp;quot; then&lt;br /&gt;
			ins(&amp;quot;[[wikt:numeral|numeral]] [[wikt:symbol|symbol]]&amp;quot;)&lt;br /&gt;
		elseif args[3] and deftype ~= &amp;quot;letter&amp;quot; then&lt;br /&gt;
			ins(&amp;quot;[[wikt:letter|letter]] (a [[wikt:&amp;quot; .. deftype .. &amp;quot;|&amp;quot; .. deftype .. &amp;quot;]])&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			ins(&amp;quot;[[wikt:&amp;quot; .. deftype .. &amp;quot;|&amp;quot; .. deftype .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		ins(&amp;quot; of &amp;quot;)&lt;br /&gt;
		if args.alphabet then&lt;br /&gt;
			ins(args.alphabet)&lt;br /&gt;
		elseif is_mul then&lt;br /&gt;
			ins(&amp;quot;the &amp;quot;)&lt;br /&gt;
			if sccode:find(&amp;quot;Lat&amp;quot;) and (args.pagename or mw.loadData(&amp;quot;Module:headword/data&amp;quot;).pagename):match(&amp;quot;^[a-zA-Z]$&amp;quot;) then&lt;br /&gt;
				-- Latn, Latf, Latg, pjt-Latn; if in ASCII a-z or A-Z, display as &amp;quot;basic modern Latin alphabet&amp;quot;,&lt;br /&gt;
				-- otherwise as &amp;quot;Latin script&amp;quot; as all other scripts display for mul.&lt;br /&gt;
				ins((&amp;quot;[[wikt:%s|%s]]&amp;quot;):format(sccatname, &amp;quot;basic modern Latin alphabet&amp;quot;))&lt;br /&gt;
			else&lt;br /&gt;
				ins(linked_script)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			ins(&amp;quot;the &amp;quot;)&lt;br /&gt;
			ins(lang:getCanonicalName())&lt;br /&gt;
			ins(&amp;quot; [[wikt:alphabet|alphabet]]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if args.alphvar then&lt;br /&gt;
			ins(&amp;quot; (&amp;quot; .. args.alphvar .. &amp;quot;)&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if args[4][1] then&lt;br /&gt;
			ins(&amp;quot;, called &amp;quot;)&lt;br /&gt;
			local formatted_names = {}&lt;br /&gt;
			for i, name in ipairs(args[4]) do&lt;br /&gt;
				local nameobjs = parse_param(name, i + 3)&lt;br /&gt;
				for _, nameobj in ipairs(nameobjs) do&lt;br /&gt;
					nameobj.lang = lang_for_linking&lt;br /&gt;
					insert(formatted_names, full_link(nameobj, &amp;quot;term&amp;quot;))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			ins(mw.text.listToText(formatted_names, nil, &amp;quot; or &amp;quot;))&lt;br /&gt;
			if not is_mul then&lt;br /&gt;
				ins(&amp;quot; and &amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif not is_mul then&lt;br /&gt;
			ins(&amp;quot;, &amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if not is_mul then&lt;br /&gt;
			ins((&amp;quot;written in the %s&amp;quot;):format(linked_script))&lt;br /&gt;
		end&lt;br /&gt;
		if args.prec then&lt;br /&gt;
			ins(&amp;quot;; preceded by &amp;quot;)&lt;br /&gt;
			ins(link_to_lang_or_mul(args.prec, &amp;quot;prec&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if args.foll then&lt;br /&gt;
			if args.prec then&lt;br /&gt;
				ins(&amp;quot; and &amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				ins(&amp;quot;; &amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			ins(&amp;quot;followed by &amp;quot;)&lt;br /&gt;
			ins(link_to_lang_or_mul(args.foll, &amp;quot;foll&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if canontype == &amp;quot;numsym&amp;quot; then&lt;br /&gt;
			-- FIXME: Rethink the name of this category.&lt;br /&gt;
			insert(categories, (&amp;quot;%s ordinal numbers&amp;quot;):format(lang:getFullName()))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif canontype == &amp;quot;name&amp;quot; then&lt;br /&gt;
		ins(args.nocap and &amp;quot;the&amp;quot; or &amp;quot;The&amp;quot;)&lt;br /&gt;
		ins((&amp;quot; name of the %s letter &amp;quot;):format(linked_script))&lt;br /&gt;
		ins(link_to_lang_or_mul(args[3], 3, &amp;quot;notr&amp;quot;))&lt;br /&gt;
		if args[4] then&lt;br /&gt;
			ins(&amp;quot;/&amp;quot;)&lt;br /&gt;
			ins(link_to_lang_or_mul(args[4], 4, &amp;quot;notr&amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		if args.alphabet then&lt;br /&gt;
			ins(&amp;quot;, in &amp;quot; .. args.alphabet)&lt;br /&gt;
			if args.alphvar then&lt;br /&gt;
				ins(&amp;quot; (&amp;quot; .. args.alphvar .. &amp;quot;)&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif args.alphvar then&lt;br /&gt;
			ins(&amp;quot;, in &amp;quot; .. args.alphvar)&lt;br /&gt;
		end&lt;br /&gt;
		if args.lit then&lt;br /&gt;
			ins(&amp;quot;, literally “&amp;quot;)&lt;br /&gt;
			ins(args.lit)&lt;br /&gt;
			ins(&amp;quot;”&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if args.eq then&lt;br /&gt;
			ins(&amp;quot;, called &amp;quot;)&lt;br /&gt;
			ins(full_link({lang = lang_getByCode(&amp;quot;en&amp;quot;, true), term = args.eq}, &amp;quot;term&amp;quot;))&lt;br /&gt;
			ins(&amp;quot; in English&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		insert(categories, (&amp;quot;%s:%s letter names&amp;quot;):format(lang:getFullCode(), scname))&lt;br /&gt;
&lt;br /&gt;
	elseif canontype == &amp;quot;diacritic&amp;quot; then&lt;br /&gt;
		ins(args.nocap and &amp;quot;a&amp;quot; or &amp;quot;A&amp;quot;)&lt;br /&gt;
		ins((&amp;quot; [[wikt:diacritical mark|diacritical mark]] of the %s&amp;quot;):format(linked_script))&lt;br /&gt;
		if args.alphabet then&lt;br /&gt;
			ins(&amp;quot; in &amp;quot; .. args.alphabet)&lt;br /&gt;
			if args.alphvar then&lt;br /&gt;
				ins(&amp;quot; (&amp;quot; .. args.alphvar .. &amp;quot;)&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif args.alphvar then&lt;br /&gt;
			ins(&amp;quot; in &amp;quot; .. args.alphvar)&lt;br /&gt;
		end&lt;br /&gt;
		if args.name then&lt;br /&gt;
			ins(&amp;quot;, called &amp;quot;)&lt;br /&gt;
			local formatted_names = {}&lt;br /&gt;
			local nameobjs = parse_param(args.name, &amp;quot;name&amp;quot;)&lt;br /&gt;
			for _, nameobj in ipairs(nameobjs) do&lt;br /&gt;
				nameobj.lang = lang&lt;br /&gt;
				insert(formatted_names, full_link(nameobj, &amp;quot;term&amp;quot;))&lt;br /&gt;
			end&lt;br /&gt;
			ins(mw.text.listToText(formatted_names, nil, &amp;quot; or &amp;quot;))&lt;br /&gt;
		end&lt;br /&gt;
		ins(&amp;quot; in &amp;quot;)&lt;br /&gt;
		ins(lang:getCanonicalName())&lt;br /&gt;
		if args[3][1] then&lt;br /&gt;
			ins(&amp;quot;, and found on &amp;quot;)&lt;br /&gt;
			local formatted_letters = {}&lt;br /&gt;
			local function format_letter(letter)&lt;br /&gt;
				return (&amp;quot;&amp;lt;span class=&amp;#039;mention&amp;#039;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;quot;):format(full_link {lang = lang, term = letter, sc = sc})&lt;br /&gt;
			end&lt;br /&gt;
			if args.nopairs then&lt;br /&gt;
				for _, letter in ipairs(args[3]) do&lt;br /&gt;
					insert(formatted_letters, format_letter(letter))&lt;br /&gt;
				end&lt;br /&gt;
			elseif #args[3] % 2 == 1 then&lt;br /&gt;
				error((&amp;quot;Saw %s letters but need an even number when nopairs= is not given&amp;quot;):format(#args[3]))&lt;br /&gt;
			else&lt;br /&gt;
				for i = 1, #args[3], 2 do&lt;br /&gt;
					insert(formatted_letters, (&amp;quot;%s/%s&amp;quot;):format(format_letter(args[3][i]), format_letter(args[3][i + 1])))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			ins(mw.text.listToText(formatted_letters))&lt;br /&gt;
			if args.moreexamples then&lt;br /&gt;
				ins(&amp;quot;, among others&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif canontype == &amp;quot;syllable&amp;quot; then&lt;br /&gt;
		ins(args.nocap and &amp;quot;the &amp;quot; or &amp;quot;The &amp;quot;)&lt;br /&gt;
		if args[3] ~= &amp;quot;-&amp;quot; then&lt;br /&gt;
			ins(&amp;quot;[[wikt:Appendix:Hiragana script|hiragana]] syllable &amp;quot;)&lt;br /&gt;
			ins(full_link({lang = lang, term = args[3], tr = args[5]}, &amp;quot;term&amp;quot;))&lt;br /&gt;
			ins(&amp;quot; or the &amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		ins(&amp;quot;[[wikt:Appendix:Katakana script|katakana]] syllable &amp;quot;)&lt;br /&gt;
		ins(full_link({lang = lang, term = args[4], tr = args[5]}, &amp;quot;term&amp;quot;))&lt;br /&gt;
		ins(&amp;quot; in [[wikt:Hepburn|Hepburn]] romanization&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		error((&amp;quot;Internal error: Unhandled canontype %s&amp;quot;):format(mw.dumpObject(canontype)))&lt;br /&gt;
	end&lt;br /&gt;
	local addl = args.addl&lt;br /&gt;
	if addl then&lt;br /&gt;
		if addl:find(&amp;quot;^[;:.]&amp;quot;) then&lt;br /&gt;
			ins(addl)&lt;br /&gt;
		elseif addl:find(&amp;quot;^_&amp;quot;) then&lt;br /&gt;
			ins(&amp;quot; &amp;quot; .. addl:sub(2))&lt;br /&gt;
		else&lt;br /&gt;
			ins(&amp;quot;, &amp;quot; .. addl)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.dot then&lt;br /&gt;
		ins(args.dot)&lt;br /&gt;
	elseif not args.nodot then&lt;br /&gt;
		ins(&amp;quot;.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	ins(&amp;quot;&amp;lt;/span&amp;gt;&amp;quot;)&lt;br /&gt;
	if categories[1] then&lt;br /&gt;
		ins(format_categories(categories, lang, nil, nil, force_cat))&lt;br /&gt;
	end&lt;br /&gt;
	return concat(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Sware</name></author>
	</entry>
</feed>