<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://odden.us:443/thadar/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AHeadword</id>
	<title>Module:Headword - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://odden.us:443/thadar/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3AHeadword"/>
	<link rel="alternate" type="text/html" href="https://odden.us:443/thadar/wiki/index.php?title=Module:Headword&amp;action=history"/>
	<updated>2026-04-12T11:12:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://odden.us:443/thadar/wiki/index.php?title=Module:Headword&amp;diff=1136&amp;oldid=prev</id>
		<title>Oa10712: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://odden.us:443/thadar/wiki/index.php?title=Module:Headword&amp;diff=1136&amp;oldid=prev"/>
		<updated>2022-09-06T03:25:56Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:25, 5 September 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Oa10712</name></author>
	</entry>
	<entry>
		<id>https://odden.us:443/thadar/wiki/index.php?title=Module:Headword&amp;diff=1135&amp;oldid=prev</id>
		<title>en&gt;Benwing2: don&#039;t add palindrome category if nopalindromecat</title>
		<link rel="alternate" type="text/html" href="https://odden.us:443/thadar/wiki/index.php?title=Module:Headword&amp;diff=1135&amp;oldid=prev"/>
		<updated>2022-09-04T17:18:23Z</updated>

		<summary type="html">&lt;p&gt;don&amp;#039;t add palindrome category if nopalindromecat&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_data = mw.loadData(&amp;quot;Module:headword/data&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
local isLemma = m_data.lemmas&lt;br /&gt;
local isNonLemma = m_data.nonlemmas&lt;br /&gt;
local notranslit = m_data.notranslit&lt;br /&gt;
local toBeTagged = m_data.toBeTagged&lt;br /&gt;
&lt;br /&gt;
-- If set to true, categories always appear, even in non-mainspace pages&lt;br /&gt;
local test_force_categories = false&lt;br /&gt;
&lt;br /&gt;
local function test_script(text, script_code)&lt;br /&gt;
	if type(text) == &amp;quot;string&amp;quot; and type(script_code) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		local sc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(script_code)&lt;br /&gt;
		local characters&lt;br /&gt;
		if sc then&lt;br /&gt;
			characters = sc:getCharacters()&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local out&lt;br /&gt;
		if characters then&lt;br /&gt;
			text = mw.ustring.gsub(text, &amp;quot;%W&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			out = mw.ustring.find(text, &amp;quot;[&amp;quot; .. characters .. &amp;quot;]&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if out then&lt;br /&gt;
			return true&lt;br /&gt;
		else&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		mw.log(&amp;quot;Parameters to test_script were incorrect.&amp;quot;)&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local spacingPunctuation = &amp;quot;[%s%p]+&amp;quot;&lt;br /&gt;
--[[ List of punctuation or spacing characters that are found inside of words.&lt;br /&gt;
	 Used to exclude characters from the regex above. ]]&lt;br /&gt;
local wordPunc = &amp;quot;-־׳״&amp;#039;.·*’་•&amp;quot;&lt;br /&gt;
local notWordPunc = &amp;quot;[^&amp;quot; .. wordPunc .. &amp;quot;]+&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Return true if the given head is multiword according to the algorithm used&lt;br /&gt;
-- in full_headword().&lt;br /&gt;
function export.head_is_multiword(head)&lt;br /&gt;
	for possibleWordBreak in mw.ustring.gmatch(head, spacingPunctuation) do&lt;br /&gt;
		if mw.ustring.find(possibleWordBreak, notWordPunc) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Add links to a multiword head.&lt;br /&gt;
function export.add_multiword_links(head)&lt;br /&gt;
	local function workaround_to_exclude_chars(s)&lt;br /&gt;
		return mw.ustring.gsub(s, notWordPunc, &amp;quot;]]%1[[&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	head = &amp;quot;[[&amp;quot;&lt;br /&gt;
		.. mw.ustring.gsub(&lt;br /&gt;
			head,&lt;br /&gt;
			spacingPunctuation,&lt;br /&gt;
			workaround_to_exclude_chars&lt;br /&gt;
			)&lt;br /&gt;
		.. &amp;quot;]]&amp;quot;&lt;br /&gt;
	--[=[&lt;br /&gt;
	use this when workaround is no longer needed:&lt;br /&gt;
	head = &amp;quot;[[&amp;quot;&lt;br /&gt;
		.. mw.ustring.gsub(head, WORDBREAKCHARS, &amp;quot;]]%1[[&amp;quot;)&lt;br /&gt;
		.. &amp;quot;]]&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	Remove any empty links, which could have been created above&lt;br /&gt;
	at the beginning or end of the string.&lt;br /&gt;
	]=]&lt;br /&gt;
	head = mw.ustring.gsub(head, &amp;quot;%[%[%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	return head&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function non_categorizable()&lt;br /&gt;
	return (title:inNamespace(&amp;quot;&amp;quot;) and title.text:find(&amp;quot;^Unsupported titles/&amp;quot;))&lt;br /&gt;
		or (title:inNamespace(&amp;quot;Appendix&amp;quot;) and title.text:find(&amp;quot;^Gestures/&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function preprocess(data, postype)&lt;br /&gt;
	--[=[&lt;br /&gt;
	[[Special:WhatLinksHere/Template:tracking/headword/heads-not-table]]&lt;br /&gt;
	[[Special:WhatLinksHere/Template:tracking/headword/translits-not-table]]&lt;br /&gt;
	]=]&lt;br /&gt;
	if type(data.heads) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		if data.heads then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/heads-not-table&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		data.heads = { data.heads }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if type(data.translits) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		if data.translits then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/translits-not-table&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		data.translits = { data.translits }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if type(data.transcriptions) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		if data.transcriptions then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/transcriptions-not-table&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		data.transcriptions = { data.transcriptions }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not data.heads or #data.heads == 0 then&lt;br /&gt;
		data.heads = {&amp;quot;&amp;quot;}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Determine if term is reconstructed&lt;br /&gt;
	local is_reconstructed = data.lang:getType() == &amp;quot;reconstructed&amp;quot;&lt;br /&gt;
		or title.nsText == &amp;quot;Reconstruction&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- Create a default headword.&lt;br /&gt;
	local subpagename = title.subpageText&lt;br /&gt;
	local pagename = title.text&lt;br /&gt;
	local default_head&lt;br /&gt;
	if is_reconstructed then&lt;br /&gt;
		default_head = require(&amp;quot;Module:utilities&amp;quot;).plain_gsub(pagename, data.lang:getCanonicalName() .. &amp;quot;/&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		default_head = subpagename&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local unmodified_default_head = default_head&lt;br /&gt;
&lt;br /&gt;
	-- Add links to multi-word page names when appropriate&lt;br /&gt;
	if data.lang:getCode() ~= &amp;quot;zh&amp;quot; and (not is_reconstructed) and&lt;br /&gt;
			export.head_is_multiword(default_head) then&lt;br /&gt;
		default_head = export.add_multiword_links(default_head)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if is_reconstructed then&lt;br /&gt;
		default_head = &amp;quot;*&amp;quot; .. default_head&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- If a head is the empty string &amp;quot;&amp;quot;, then replace it with the default&lt;br /&gt;
	for i, head in ipairs(data.heads) do&lt;br /&gt;
		if head == &amp;quot;&amp;quot; then&lt;br /&gt;
			head = default_head&lt;br /&gt;
		else&lt;br /&gt;
			if head == default_head and data.lang:getCanonicalName() == &amp;quot;English&amp;quot; then&lt;br /&gt;
				table.insert(data.categories, data.lang:getCanonicalName() .. &amp;quot; terms with redundant head parameter&amp;quot;)&lt;br /&gt;
			end			&lt;br /&gt;
		end&lt;br /&gt;
		data.heads[i] = head&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If the first head is multiword (after removing links), maybe insert into &amp;quot;LANG multiword terms&amp;quot;&lt;br /&gt;
	if not data.nomultiwordcat and postype == &amp;quot;lemma&amp;quot; and not m_data.no_multiword_cat[data.lang:getCode()] then&lt;br /&gt;
		-- Check for spaces or hyphens, but exclude prefixes and suffixes.&lt;br /&gt;
		-- Use the pagename, not the head= value, because the latter may have extra&lt;br /&gt;
		-- junk in it, e.g. superscripted text that throws off the algorithm.&lt;br /&gt;
		local checkpattern = &amp;quot;.[%s%-፡].&amp;quot;&lt;br /&gt;
		if m_data.hyphen_not_multiword_sep[data.lang:getCode()] then&lt;br /&gt;
			-- Exclude hyphens if the data module states that they should for this language&lt;br /&gt;
			checkpattern = &amp;quot;.[%s፡].&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.find(unmodified_default_head, checkpattern) and not non_categorizable() then&lt;br /&gt;
			table.insert(data.categories, data.lang:getCanonicalName() .. &amp;quot; multiword terms&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[	Try to detect the script if it was not provided&lt;br /&gt;
			We use the first headword for this, and assume&lt;br /&gt;
			that all of them have the same script&lt;br /&gt;
			This *should* always be true, right?		]]&lt;br /&gt;
	if not data.sc then&lt;br /&gt;
		data.sc = require(&amp;quot;Module:scripts&amp;quot;).findBestScript(data.heads[1], data.lang)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, val in pairs(data.translits) do&lt;br /&gt;
		data.translits[i] = {display = val, is_manual = true}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Make transliterations&lt;br /&gt;
	for i, head in ipairs(data.heads) do&lt;br /&gt;
		local translit = data.translits[i]&lt;br /&gt;
		&lt;br /&gt;
		-- Try to generate a transliteration if necessary&lt;br /&gt;
		-- Generate it if the script is not Latn or similar, and if no transliteration was provided&lt;br /&gt;
		if translit and translit.display == &amp;quot;-&amp;quot; then&lt;br /&gt;
			translit = nil&lt;br /&gt;
		elseif not translit and not (data.sc:getCode():find(&amp;quot;Latn&amp;quot;, nil, true) or data.sc:getCode() == &amp;quot;Latinx&amp;quot; or data.sc:getCode() == &amp;quot;None&amp;quot;) and (not data.sc or data.sc:getCode() ~= &amp;quot;Imag&amp;quot;) then&lt;br /&gt;
			translit = data.lang:transliterate(require(&amp;quot;Module:links&amp;quot;).remove_links(head), data.sc)&lt;br /&gt;
			&lt;br /&gt;
			-- There is still no transliteration?&lt;br /&gt;
			-- Add the entry to a cleanup category.&lt;br /&gt;
			if not translit and not notranslit[data.lang:getCode()] then&lt;br /&gt;
				translit = &amp;quot;&amp;lt;small&amp;gt;transliteration needed&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
				table.insert(data.categories, &amp;quot;Requests for transliteration of &amp;quot; .. data.lang:getCanonicalName() .. &amp;quot; terms&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if translit then&lt;br /&gt;
				translit = {display = translit, is_manual = false}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Link to the transliteration entry for languages that require this&lt;br /&gt;
		if translit and data.lang:link_tr() then&lt;br /&gt;
			translit.display = require(&amp;quot;Module:links&amp;quot;).full_link{&lt;br /&gt;
				term = translit.display,&lt;br /&gt;
				lang = data.lang,&lt;br /&gt;
				sc = require(&amp;quot;Module:scripts&amp;quot;).getByCode(&amp;quot;Latn&amp;quot;),&lt;br /&gt;
				tr = &amp;quot;-&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		data.translits[i] = translit&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if data.id and type(data.id) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		error(&amp;quot;The id in the data table should be a string.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Format a headword with transliterations&lt;br /&gt;
local function format_headword(data)&lt;br /&gt;
	local m_scriptutils = require(&amp;quot;Module:script utilities&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- Are there non-empty transliterations?&lt;br /&gt;
	-- Need to do it this way because translit[1] might be nil while translit[2] is not&lt;br /&gt;
	local has_translits = false&lt;br /&gt;
	local has_manual_translits = false&lt;br /&gt;
	&lt;br /&gt;
	-- Format the headwords&lt;br /&gt;
	for i, head in ipairs(data.heads) do&lt;br /&gt;
		if data.translits[i] or data.transcriptions[i] then&lt;br /&gt;
			has_translits = true&lt;br /&gt;
		end&lt;br /&gt;
		if data.translits[i] and data.translits[i].is_manual or data.transcriptions[i] then&lt;br /&gt;
			has_manual_translits = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Apply processing to the headword, for formatting links and such&lt;br /&gt;
		if head:find(&amp;quot;[[&amp;quot;, nil, true) and (not data.sc or data.sc:getCode() ~= &amp;quot;Imag&amp;quot;) then&lt;br /&gt;
			head = require(&amp;quot;Module:links&amp;quot;).language_link({term = head, lang = data.lang}, false)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Add language and script wrapper&lt;br /&gt;
		if i == 1 then&lt;br /&gt;
			head = m_scriptutils.tag_text(head, data.lang, data.sc, &amp;quot;head&amp;quot;, nil, data.id)&lt;br /&gt;
		else&lt;br /&gt;
			head = m_scriptutils.tag_text(head, data.lang, data.sc, &amp;quot;head&amp;quot;, nil)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		data.heads[i] = head&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local translits_formatted = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	if has_manual_translits then&lt;br /&gt;
		-- [[Special:WhatLinksHere/Template:tracking/headword/has-manual-translit/LANG]]&lt;br /&gt;
		require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/has-manual-translit/&amp;quot; .. data.lang:getCode())&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if has_translits then&lt;br /&gt;
&lt;br /&gt;
		-- Format the transliterations&lt;br /&gt;
		local translits = data.translits&lt;br /&gt;
		local transcriptions = data.transcriptions&lt;br /&gt;
		&lt;br /&gt;
		if translits then&lt;br /&gt;
			-- using pairs() instead of ipairs() in case there is a gap&lt;br /&gt;
			for i, _ in pairs(translits) do&lt;br /&gt;
				if type(i) == &amp;quot;number&amp;quot; then&lt;br /&gt;
					translits[i] = m_scriptutils.tag_translit(translits[i].display, data.lang:getCode(), &amp;quot;head&amp;quot;, nil, translits[i].is_manual)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if transcriptions then&lt;br /&gt;
			for i, _ in pairs(transcriptions) do&lt;br /&gt;
				if type(i) == &amp;quot;number&amp;quot; then&lt;br /&gt;
					transcriptions[i] = m_scriptutils.tag_transcription(transcriptions[i], data.lang:getCode(), &amp;quot;head&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		for i = 1, math.max(#translits, #transcriptions) do&lt;br /&gt;
			local translits_formatted = {}&lt;br /&gt;
			table.insert(translits_formatted, translits[i] and translits[i] or &amp;quot;&amp;quot;)&lt;br /&gt;
			table.insert(translits_formatted, (translits[i] and transcriptions[i]) and &amp;quot; &amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
			table.insert(translits_formatted, transcriptions[i] and &amp;quot;/&amp;quot; .. transcriptions[i] .. &amp;quot;/&amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
			data.translits[i] = table.concat(translits_formatted)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		translits_formatted = &amp;quot; (&amp;quot; .. table.concat(data.translits, &amp;quot; &amp;lt;i&amp;gt;or&amp;lt;/i&amp;gt; &amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		local transliteration_page = mw.title.new(data.lang:getCanonicalName() .. &amp;quot; transliteration&amp;quot;, &amp;quot;Wiktionary&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		if transliteration_page then&lt;br /&gt;
			local success, exists = pcall(function () return transliteration_page.exists end)&lt;br /&gt;
			if success and exists then&lt;br /&gt;
				translits_formatted = &amp;quot; [[Wiktionary:&amp;quot; .. data.lang:getCanonicalName() .. &amp;quot; transliteration|•]]&amp;quot; .. translits_formatted&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(data.heads, &amp;quot; &amp;lt;i&amp;gt;or&amp;lt;/i&amp;gt; &amp;quot;) .. translits_formatted&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function format_genders(data)&lt;br /&gt;
	if data.genders and #data.genders &amp;gt; 0 then&lt;br /&gt;
		local pos_for_cat&lt;br /&gt;
		if not data.nogendercat and not m_data.no_gender_cat[data.lang:getCode()] then&lt;br /&gt;
			local pos_category = data.pos_category:gsub(&amp;quot;^reconstructed &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			pos_for_cat = m_data.pos_for_gender_number_cat[pos_category]&lt;br /&gt;
		end&lt;br /&gt;
		local text, cats = require(&amp;quot;Module:gender and number&amp;quot;).format_genders(data.genders, data.lang, pos_for_cat)&lt;br /&gt;
		for _, cat in ipairs(cats) do&lt;br /&gt;
			table.insert(data.categories, cat)&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;quot;&amp;amp;nbsp;&amp;quot; .. text&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function format_inflection_parts(data, parts)&lt;br /&gt;
	for key, part in ipairs(parts) do&lt;br /&gt;
		if type(part) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
			part = {term = part}&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local qualifiers&lt;br /&gt;
		local reftext&lt;br /&gt;
		&lt;br /&gt;
		if part.qualifiers and #part.qualifiers &amp;gt; 0 then&lt;br /&gt;
			qualifiers = require(&amp;quot;Module:qualifier&amp;quot;).format_qualifier(part.qualifiers) .. &amp;quot; &amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			-- [[Special:WhatLinksHere/Template:tracking/headword/qualifier]]&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/qualifier&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if part.refs and #part.refs &amp;gt; 0 then&lt;br /&gt;
			local refs = {}&lt;br /&gt;
			for _, ref in ipairs(part.refs) do&lt;br /&gt;
				if type(ref) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
					ref = {text = ref}&lt;br /&gt;
				end&lt;br /&gt;
				local refargs&lt;br /&gt;
				if ref.name or ref.group then&lt;br /&gt;
					refargs = {name = ref.name, group = ref.group}&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(refs, mw.getCurrentFrame():extensionTag(&amp;quot;ref&amp;quot;, ref.text, refargs))&lt;br /&gt;
			end&lt;br /&gt;
			reftext = table.concat(refs)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local partaccel = part.accel&lt;br /&gt;
		local face = part.hypothetical and &amp;quot;hypothetical&amp;quot; or &amp;quot;bold&amp;quot;&lt;br /&gt;
		local nolink = part.hypothetical or part.nolink&lt;br /&gt;
&lt;br /&gt;
		if part.label then&lt;br /&gt;
			-- There should be a better way of italicizing a label. As is, this isn&amp;#039;t customizable.&lt;br /&gt;
			part = &amp;quot;&amp;lt;i&amp;gt;&amp;quot; .. part.label .. &amp;quot;&amp;lt;/i&amp;gt;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			-- Convert the term into a full link&lt;br /&gt;
			-- Don&amp;#039;t show a transliteration here, the consensus seems to be not to&lt;br /&gt;
			-- show them in headword lines to avoid clutter.&lt;br /&gt;
			part = require(&amp;quot;Module:links&amp;quot;).full_link(&lt;br /&gt;
				{&lt;br /&gt;
					term = not nolink and part.term or nil,&lt;br /&gt;
					alt = part.alt or (nolink and part.term or nil),&lt;br /&gt;
					lang = part.lang or data.lang,&lt;br /&gt;
					sc = part.sc or parts.sc or (not part.lang and data.sc),&lt;br /&gt;
					id = part.id,&lt;br /&gt;
					genders = part.genders,&lt;br /&gt;
					tr = part.translit or (not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and &amp;quot;-&amp;quot; or nil),&lt;br /&gt;
					ts = part.transcription,&lt;br /&gt;
					accel = parts.accel or partaccel,&lt;br /&gt;
				},&lt;br /&gt;
				face,&lt;br /&gt;
				false&lt;br /&gt;
				)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if qualifiers then&lt;br /&gt;
			part = qualifiers .. part&lt;br /&gt;
		end&lt;br /&gt;
		if reftext then&lt;br /&gt;
			part = part .. reftext&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		parts[key] = part&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local parts_output = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if #parts &amp;gt; 0 then&lt;br /&gt;
		parts_output = &amp;quot; &amp;quot; .. table.concat(parts, &amp;quot; &amp;lt;i&amp;gt;or&amp;lt;/i&amp;gt; &amp;quot;)&lt;br /&gt;
	elseif parts.request then&lt;br /&gt;
		parts_output = &amp;quot; &amp;lt;small&amp;gt;[please provide]&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
			.. require(&amp;quot;Module:utilities/format_categories&amp;quot;)(&lt;br /&gt;
				{&amp;quot;Requests for inflections in &amp;quot; .. data.lang:getCanonicalName() .. &amp;quot; entries&amp;quot;},&lt;br /&gt;
				lang,&lt;br /&gt;
				nil,&lt;br /&gt;
				nil,&lt;br /&gt;
				data.force_cat_output or test_force_categories,&lt;br /&gt;
				data.sc&lt;br /&gt;
				)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return &amp;quot;&amp;lt;i&amp;gt;&amp;quot; .. parts.label .. &amp;quot;&amp;lt;/i&amp;gt;&amp;quot; .. parts_output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format the inflections following the headword&lt;br /&gt;
local function format_inflections(data)&lt;br /&gt;
	if data.inflections and #data.inflections &amp;gt; 0 then&lt;br /&gt;
		-- Format each inflection individually&lt;br /&gt;
		for key, infl in ipairs(data.inflections) do&lt;br /&gt;
			data.inflections[key] = format_inflection_parts(data, infl)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return &amp;quot; (&amp;quot; .. table.concat(data.inflections, &amp;quot;, &amp;quot;) .. &amp;quot;)&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Return &amp;quot;lemma&amp;quot; if the given POS is a lemma, &amp;quot;non-lemma form&amp;quot; if a non-lemma form, or nil&lt;br /&gt;
-- if unknown. The POS passed in must be in its plural form (&amp;quot;nouns&amp;quot;, &amp;quot;prefixes&amp;quot;, etc.).&lt;br /&gt;
-- If you have a POS in its singular form, call pluralize() in [[Module:string utilities]] to&lt;br /&gt;
-- pluralize it in a smart fashion that knows when to add &amp;#039;-s&amp;#039; and when to add &amp;#039;-es&amp;#039;.&lt;br /&gt;
--&lt;br /&gt;
-- If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess&lt;br /&gt;
-- based on whether it ends in &amp;quot; forms&amp;quot;; otherwise, return nil.&lt;br /&gt;
function export.pos_lemma_or_nonlemma(plpos, best_guess)&lt;br /&gt;
	-- Is it a lemma category?&lt;br /&gt;
	if isLemma[plpos] or isLemma[plpos:gsub(&amp;quot;^reconstructed &amp;quot;, &amp;quot;&amp;quot;)] then&lt;br /&gt;
		return &amp;quot;lemma&amp;quot;&lt;br /&gt;
	-- Is it a nonlemma category?&lt;br /&gt;
	elseif isNonLemma[plpos]&lt;br /&gt;
		or isNonLemma[plpos:gsub(&amp;quot;^reconstructed &amp;quot;, &amp;quot;&amp;quot;)]&lt;br /&gt;
		or isLemma[plpos:gsub(&amp;quot;^mutated &amp;quot;, &amp;quot;&amp;quot;)]&lt;br /&gt;
		or isNonLemma[plpos:gsub(&amp;quot;^mutated &amp;quot;, &amp;quot;&amp;quot;)] then&lt;br /&gt;
		return &amp;quot;non-lemma form&amp;quot;&lt;br /&gt;
	elseif best_guess then&lt;br /&gt;
		return plpos:find(&amp;quot; forms$&amp;quot;) and &amp;quot;non-lemma form&amp;quot; or &amp;quot;lemma&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function show_headword_line(data)&lt;br /&gt;
	local namespace = title.nsText&lt;br /&gt;
&lt;br /&gt;
	-- Check the namespace against the language type&lt;br /&gt;
	if namespace == &amp;quot;&amp;quot; then&lt;br /&gt;
		if data.lang:getType() == &amp;quot;reconstructed&amp;quot; then&lt;br /&gt;
			error(&amp;quot;Entries for this language must be placed in the Reconstruction: namespace.&amp;quot;)&lt;br /&gt;
		elseif data.lang:getType() == &amp;quot;appendix-constructed&amp;quot; then&lt;br /&gt;
			error(&amp;quot;Entries for this language must be placed in the Appendix: namespace.&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tracking_categories = {}&lt;br /&gt;
&lt;br /&gt;
	if not data.noposcat then	&lt;br /&gt;
		local pos_category = data.lang:getCanonicalName() .. &amp;quot; &amp;quot; .. data.pos_category&lt;br /&gt;
		if pos_category ~= &amp;quot;Translingual Han characters&amp;quot; then&lt;br /&gt;
			table.insert(data.categories, 1, pos_category)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if data.sccat and data.sc then&lt;br /&gt;
		table.insert(data.categories, data.lang:getCanonicalName() .. &amp;quot; &amp;quot; .. data.pos_category&lt;br /&gt;
			.. &amp;quot; in &amp;quot; .. data.sc:getDisplayForm())&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Is it a lemma category?&lt;br /&gt;
	local postype = export.pos_lemma_or_nonlemma(data.pos_category)&lt;br /&gt;
	if not postype then&lt;br /&gt;
		-- We don&amp;#039;t know what this category is, so tag it with a tracking category.&lt;br /&gt;
		--[=[&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/headword/unrecognized pos]]&lt;br /&gt;
		]=]&lt;br /&gt;
		table.insert(tracking_categories, &amp;quot;head tracking/unrecognized pos&amp;quot;)&lt;br /&gt;
		require(&amp;quot;Module:debug/track&amp;quot;){&lt;br /&gt;
			&amp;quot;headword/unrecognized pos&amp;quot;,&lt;br /&gt;
			&amp;quot;headword/unrecognized pos/lang/&amp;quot; .. data.lang:getCode(),&lt;br /&gt;
			&amp;quot;headword/unrecognized pos/pos/&amp;quot; .. data.pos_category&lt;br /&gt;
		}&lt;br /&gt;
	elseif not data.noposcat then&lt;br /&gt;
		table.insert(data.categories, 1, data.lang:getCanonicalName() .. &amp;quot; &amp;quot; .. postype .. &amp;quot;s&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Preprocess&lt;br /&gt;
	preprocess(data, postype)&lt;br /&gt;
	&lt;br /&gt;
	if namespace == &amp;quot;&amp;quot; and data.lang:getType() ~= &amp;quot;reconstructed&amp;quot; then&lt;br /&gt;
		local m_links = require(&amp;quot;Module:links&amp;quot;)&lt;br /&gt;
		for _, head in ipairs(data.heads) do&lt;br /&gt;
			if title.prefixedText ~= m_links.getLinkPage(m_links.remove_links(head), data.lang) then&lt;br /&gt;
				--[=[&lt;br /&gt;
				[[Special:WhatLinksHere/Template:tracking/headword/pagename spelling mismatch]]&lt;br /&gt;
				]=]&lt;br /&gt;
				require(&amp;quot;Module:debug/track&amp;quot;){&lt;br /&gt;
					&amp;quot;headword/pagename spelling mismatch&amp;quot;,&lt;br /&gt;
					&amp;quot;headword/pagename spelling mismatch/&amp;quot; .. data.lang:getCode()&lt;br /&gt;
				}&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Format and return all the gathered information&lt;br /&gt;
	return&lt;br /&gt;
		format_headword(data) ..&lt;br /&gt;
		format_genders(data) ..&lt;br /&gt;
		format_inflections(data) ..&lt;br /&gt;
		require(&amp;quot;Module:utilities/format_categories&amp;quot;)(&lt;br /&gt;
			tracking_categories, data.lang, data.sort_key, nil,&lt;br /&gt;
			data.force_cat_output or test_force_categories, data.sc&lt;br /&gt;
			)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.full_headword(data)&lt;br /&gt;
	local tracking_categories = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Script-tags the topmost header.&lt;br /&gt;
	local pagename = title.text&lt;br /&gt;
	local fullPagename = title.fullText&lt;br /&gt;
	local namespace = title.nsText&lt;br /&gt;
	&lt;br /&gt;
	if not data.lang or type(data.lang) ~= &amp;quot;table&amp;quot; or not data.lang.getCode then&lt;br /&gt;
		error(&amp;quot;In data, the first argument to full_headword, data.lang should be a language object.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not data.sc then&lt;br /&gt;
		data.sc = require(&amp;quot;Module:scripts&amp;quot;).findBestScript(data.heads and data.heads[1] ~= &amp;quot;&amp;quot; and data.heads[1] or pagename, data.lang)&lt;br /&gt;
	else&lt;br /&gt;
		-- Track uses of sc parameter&lt;br /&gt;
		local best = require(&amp;quot;Module:scripts&amp;quot;).findBestScript(pagename, data.lang)&lt;br /&gt;
		require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/sc&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		if data.sc:getCode() == best:getCode() then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/sc/redundant&amp;quot;)&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/sc/redundant/&amp;quot; .. data.sc:getCode())&lt;br /&gt;
		else&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/sc/needed&amp;quot;)&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/sc/needed/&amp;quot; .. data.sc:getCode())&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local displayTitle&lt;br /&gt;
	-- Assumes that the scripts in &amp;quot;toBeTagged&amp;quot; will never occur in the Reconstruction namespace.&lt;br /&gt;
	-- Avoid tagging ASCII as Hani even when it is tagged as Hani in the&lt;br /&gt;
	-- headword, as in [[check]]. The check for ASCII might need to be expanded&lt;br /&gt;
	-- to a check for any Latin characters and whitespace or punctuation.&lt;br /&gt;
	if (namespace == &amp;quot;&amp;quot; and data.sc and toBeTagged[data.sc:getCode()]&lt;br /&gt;
			and not pagename:find &amp;quot;^[%z\1-\127]+$&amp;quot;)&lt;br /&gt;
			or (data.sc:getCode() == &amp;quot;Jpan&amp;quot; and (test_script(pagename, &amp;quot;Hira&amp;quot;) or test_script(pagename, &amp;quot;Kana&amp;quot;))) then&lt;br /&gt;
		displayTitle = &amp;#039;&amp;lt;span class=&amp;quot;&amp;#039; .. data.sc:getCode() .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. pagename .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	elseif namespace == &amp;quot;Reconstruction&amp;quot; then&lt;br /&gt;
		displayTitle, matched = mw.ustring.gsub(&lt;br /&gt;
			fullPagename,&lt;br /&gt;
			&amp;quot;^(Reconstruction:[^/]+/)(.+)$&amp;quot;,&lt;br /&gt;
			function(before, term)&lt;br /&gt;
				return before ..&lt;br /&gt;
					require(&amp;quot;Module:script utilities&amp;quot;).tag_text(&lt;br /&gt;
						term,&lt;br /&gt;
						data.lang,&lt;br /&gt;
						data.sc&lt;br /&gt;
					)&lt;br /&gt;
			end&lt;br /&gt;
		)&lt;br /&gt;
		&lt;br /&gt;
		if matched == 0 then&lt;br /&gt;
			displayTitle = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if displayTitle then&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		frame:callParserFunction(&lt;br /&gt;
			&amp;quot;DISPLAYTITLE&amp;quot;,&lt;br /&gt;
			displayTitle&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if data.force_cat_output then&lt;br /&gt;
		--[=[&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/headword/force cat output]]&lt;br /&gt;
		]=]&lt;br /&gt;
		require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;headword/force cat output&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if data.getCanonicalName then&lt;br /&gt;
		error(&amp;#039;The &amp;quot;data&amp;quot; variable supplied to &amp;quot;full_headword&amp;quot; should not be a language object.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	-- Were any categories specified?&lt;br /&gt;
	if data.categories and #data.categories &amp;gt; 0 then&lt;br /&gt;
		local lang_name = require(&amp;quot;Module:string/pattern_escape&amp;quot;)(data.lang:getCanonicalName())&lt;br /&gt;
		for _, cat in ipairs(data.categories) do&lt;br /&gt;
			-- Does the category begin with the language name? If not, tag it with a tracking category.&lt;br /&gt;
			if not mw.ustring.find(cat, &amp;quot;^&amp;quot; .. lang_name) then&lt;br /&gt;
				mw.log(cat, data.lang:getCanonicalName())&lt;br /&gt;
				table.insert(tracking_categories, &amp;quot;head tracking/no lang category&amp;quot;)&lt;br /&gt;
				&lt;br /&gt;
				--[=[&lt;br /&gt;
				[[Special:WhatLinksHere/Template:tracking/head tracking/no lang category]]&lt;br /&gt;
				]=]&lt;br /&gt;
				require(&amp;quot;Module:debug/track&amp;quot;){&lt;br /&gt;
					&amp;quot;headword/no lang category&amp;quot;,&lt;br /&gt;
					&amp;quot;headword/no lang category/lang/&amp;quot; .. data.lang:getCode()&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if not data.pos_category&lt;br /&gt;
			and mw.ustring.find(data.categories[1], &amp;quot;^&amp;quot; .. data.lang:getCanonicalName())&lt;br /&gt;
				then&lt;br /&gt;
			data.pos_category = mw.ustring.gsub(data.categories[1], &amp;quot;^&amp;quot; .. data.lang:getCanonicalName() .. &amp;quot; &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			table.remove(data.categories, 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not data.pos_category then&lt;br /&gt;
		error(&lt;br /&gt;
			&amp;#039;No valid part-of-speech categories were found in the list &amp;#039;&lt;br /&gt;
			.. &amp;#039;of categories passed to the function &amp;quot;full_headword&amp;quot;. &amp;#039;&lt;br /&gt;
			.. &amp;#039;The part-of-speech category should consist of a language\&amp;#039;s &amp;#039;&lt;br /&gt;
			.. &amp;#039;canonical name plus a part of speech.&amp;#039;&lt;br /&gt;
			)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Categorise for unusual characters&lt;br /&gt;
	local standard = data.lang:getStandardCharacters()&lt;br /&gt;
	&lt;br /&gt;
	if standard then&lt;br /&gt;
		if mw.ustring.len(title.subpageText) ~= 1 and not non_categorizable() then&lt;br /&gt;
			for character in mw.ustring.gmatch(title.subpageText, &amp;quot;([^&amp;quot; .. standard .. &amp;quot;])&amp;quot;) do&lt;br /&gt;
				local upper = mw.ustring.upper(character)&lt;br /&gt;
				if not mw.ustring.find(upper, &amp;quot;[&amp;quot; .. standard .. &amp;quot;]&amp;quot;) then&lt;br /&gt;
					character = upper&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(&lt;br /&gt;
					data.categories,&lt;br /&gt;
					data.lang:getCanonicalName() .. &amp;quot; terms spelled with &amp;quot; .. character&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Categorise for palindromes&lt;br /&gt;
	if not data.nopalindromecat and title.nsText ~= &amp;quot;Reconstruction&amp;quot; and mw.ustring.len(title.subpageText) &amp;gt; 2&lt;br /&gt;
		and require(&amp;quot;Module:palindromes&amp;quot;).is_palindrome(&lt;br /&gt;
			title.subpageText, data.lang, data.sc&lt;br /&gt;
			) then&lt;br /&gt;
		table.insert(data.categories, data.lang:getCanonicalName() .. &amp;quot; palindromes&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- This may add more categories (e.g. gender categories), so make sure it gets&lt;br /&gt;
	-- evaluated first.&lt;br /&gt;
	local text = show_headword_line(data)&lt;br /&gt;
	return&lt;br /&gt;
		text ..&lt;br /&gt;
		require(&amp;quot;Module:utilities/format_categories&amp;quot;)(&lt;br /&gt;
			data.categories, data.lang, data.sort_key, nil,&lt;br /&gt;
			data.force_cat_output or test_force_categories, data.sc&lt;br /&gt;
			) ..&lt;br /&gt;
		require(&amp;quot;Module:utilities/format_categories&amp;quot;)(&lt;br /&gt;
			tracking_categories, data.lang, data.sort_key, nil,&lt;br /&gt;
			data.force_cat_output or test_force_categories, data.sc&lt;br /&gt;
			)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>en&gt;Benwing2</name></author>
	</entry>
</feed>