<?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%3ALinks</id>
	<title>Module:Links - 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%3ALinks"/>
	<link rel="alternate" type="text/html" href="https://odden.us:443/thadar/wiki/index.php?title=Module:Links&amp;action=history"/>
	<updated>2026-04-12T11:43:39Z</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:Links&amp;diff=1174&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:Links&amp;diff=1174&amp;oldid=prev"/>
		<updated>2022-09-06T03:34:43Z</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:34, 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:Links&amp;diff=1173&amp;oldid=prev</id>
		<title>en&gt;Benwing2: encode &lt; and &gt; so they don&#039;t interfere with parsing &lt;span ...&gt;</title>
		<link rel="alternate" type="text/html" href="https://odden.us:443/thadar/wiki/index.php?title=Module:Links&amp;diff=1173&amp;oldid=prev"/>
		<updated>2022-07-24T00:24:45Z</updated>

		<summary type="html">&lt;p&gt;encode &amp;lt; and &amp;gt; so they don&amp;#039;t interfere with parsing &amp;lt;span ...&amp;gt;&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;
--[=[&lt;br /&gt;
	[[Unsupported titles]], pages with high memory usage,&lt;br /&gt;
	extraction modules and part-of-speech names are listed&lt;br /&gt;
	at [[Module:links/data]].&lt;br /&gt;
&lt;br /&gt;
	Other modules used:&lt;br /&gt;
		[[Module:script utilities]]&lt;br /&gt;
		[[Module:scripts]]&lt;br /&gt;
		[[Module:languages]] and its submodules&lt;br /&gt;
		[[Module:gender and number]]&lt;br /&gt;
		[[Module:debug]]&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
-- These are prefixed with u to avoid confusion with the default string methods&lt;br /&gt;
-- of the same name.&lt;br /&gt;
local usub = mw.ustring.sub&lt;br /&gt;
&lt;br /&gt;
local table_insert = table.insert&lt;br /&gt;
local table_concat = table.concat&lt;br /&gt;
&lt;br /&gt;
local ignore_cap&lt;br /&gt;
local phonetic_extraction&lt;br /&gt;
local pos_tags&lt;br /&gt;
local unsupported_titles&lt;br /&gt;
function export.getLinkPage(target, lang)&lt;br /&gt;
	unsupported_titles = unsupported_titles or mw.loadData(&amp;quot;Module:links/data&amp;quot;).unsupported_titles&lt;br /&gt;
	if unsupported_titles[target] then&lt;br /&gt;
		return &amp;quot;Unsupported titles/&amp;quot; .. unsupported_titles[target]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If the link contains unexpanded template parameters, then don&amp;#039;t create a link.&lt;br /&gt;
	if target:find(&amp;quot;{{{&amp;quot;) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if target:sub(1, 1) == &amp;quot;:&amp;quot; or target:sub(1, 2) == &amp;quot;w:&amp;quot; or target:sub(1, 10) == &amp;quot;wikipedia:&amp;quot; then&lt;br /&gt;
		return target&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove diacritics from the page name&lt;br /&gt;
	target = lang:makeEntryName(target)&lt;br /&gt;
&lt;br /&gt;
	if target:sub(1, 1) == &amp;quot;/&amp;quot; then&lt;br /&gt;
		return &amp;quot;:&amp;quot; .. target&lt;br /&gt;
&lt;br /&gt;
	-- Link to appendix for reconstructed terms and terms in appendix-only languages&lt;br /&gt;
	elseif target:sub(1, 1) == &amp;quot;*&amp;quot; and #target &amp;gt; 1 then&lt;br /&gt;
		if lang:getCode() == &amp;quot;und&amp;quot; then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		target = &amp;quot;Reconstruction:&amp;quot; .. lang:getCanonicalName() .. &amp;quot;/&amp;quot; .. usub(target, 2)&lt;br /&gt;
	elseif lang:getType() == &amp;quot;reconstructed&amp;quot; then&lt;br /&gt;
		error(&amp;quot;The specified language &amp;quot; .. lang:getCanonicalName()&lt;br /&gt;
			.. &amp;quot; is unattested, while the given word is not marked with &amp;#039;*&amp;#039; to indicate that it is reconstructed&amp;quot;)&lt;br /&gt;
	elseif lang:getType() == &amp;quot;appendix-constructed&amp;quot; then&lt;br /&gt;
		target = &amp;quot;Appendix:&amp;quot; .. lang:getCanonicalName() .. &amp;quot;/&amp;quot; .. target&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return target&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Make a language-specific link from given link&amp;#039;s parts&lt;br /&gt;
local function makeLangLink(link, lang, id, allow_self_link)&lt;br /&gt;
	-- Temporary tracking code&lt;br /&gt;
	local langCode = lang:getCode()&lt;br /&gt;
	if langCode == &amp;quot;se&amp;quot; or langCode == &amp;quot;sia&amp;quot; or langCode:find(&amp;quot;^sm[ajns]$&amp;quot;)&lt;br /&gt;
			or langCode:find(&amp;quot;^sj[dektu]$&amp;quot;) then&lt;br /&gt;
		if link.display and link.display:find(&amp;quot;&amp;#039;&amp;quot;) then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/Sami apostrophe display&amp;quot;)&lt;br /&gt;
		elseif link.target and link.target:find(&amp;quot;&amp;#039;&amp;quot;) then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/Sami apostrophe target&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find fragments (when link didn&amp;#039;t come from parseLink).&lt;br /&gt;
	-- Prevents {{l|en|word#Etymology 2|word}} from linking to [[word#Etymology 2#English]].&lt;br /&gt;
	if link.fragment == nil then&lt;br /&gt;
		-- Replace numeric character references with the corresponding character (&amp;amp;#29; → &amp;#039;),&lt;br /&gt;
		-- as they contain #, which causes the numeric character reference to be&lt;br /&gt;
		-- misparsed (wa&amp;#039;a → wa&amp;amp;#29;a → pagename wa&amp;amp;, fragment 29;a).&lt;br /&gt;
		link.target = link.target:gsub(&amp;quot;&amp;amp;#(%d+);&amp;quot;,&lt;br /&gt;
			function(number) return mw.ustring.char(tonumber(number)) end)&lt;br /&gt;
		local first, second = link.target:match(&amp;quot;^([^#]+)#(.+)$&amp;quot;)&lt;br /&gt;
		if first then&lt;br /&gt;
			link.target, link.fragment = first, second&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If there is no display form, then create a default one&lt;br /&gt;
	if not link.display then&lt;br /&gt;
		link.display = link.target&lt;br /&gt;
&lt;br /&gt;
		-- Strip the prefix from the displayed form&lt;br /&gt;
		-- TODO: other interwiki links?&lt;br /&gt;
		if link.display:sub(1, 1) == &amp;quot;:&amp;quot; and not mw.loadData(&amp;quot;Module:links/data&amp;quot;).unsupported_titles[link.display] then&lt;br /&gt;
			link.display = link.display:sub(2) -- remove colon from beginning&lt;br /&gt;
		else&lt;br /&gt;
			local prefix = link.display:match(&amp;quot;^([^:]+):&amp;quot;)&lt;br /&gt;
			local prefixes = {&lt;br /&gt;
				w = true,&lt;br /&gt;
				wikipedia = true,&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if prefixes[prefix] then&lt;br /&gt;
				link.display = link.display:sub(#prefix + 2) -- remove prefix plus colon&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Process the target&lt;br /&gt;
	link.target = export.getLinkPage(link.target, lang)&lt;br /&gt;
&lt;br /&gt;
	if not link.target then&lt;br /&gt;
		return link.display&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If the target is the same as the current page and there is no sense id&lt;br /&gt;
	-- and linking to the same page hasn&amp;#039;t been turned on, then return a &amp;quot;self-link&amp;quot;&lt;br /&gt;
	-- like the software does.&lt;br /&gt;
	if not (allow_self_link or id) and link.target:gsub(&amp;quot;^:&amp;quot;, &amp;quot;&amp;quot;) == mw.title.getCurrentTitle().prefixedText then&lt;br /&gt;
		return &amp;quot;&amp;lt;strong class=\&amp;quot;selflink\&amp;quot;&amp;gt;&amp;quot; .. link.display .. &amp;quot;&amp;lt;/strong&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		Add fragment&lt;br /&gt;
		Do not add a section link to &amp;quot;Undetermined&amp;quot;, as such sections do not exist and are invalid.&lt;br /&gt;
		TabbedLanguages handles links without a section by linking to the &amp;quot;last visited&amp;quot; section,&lt;br /&gt;
		but adding &amp;quot;Undetermined&amp;quot; would break that feature.&lt;br /&gt;
		For localized prefixes that make syntax error, please use the format: [&amp;quot;xyz&amp;quot;] = true,&lt;br /&gt;
	]]&lt;br /&gt;
	local prefix = link.target:match(&amp;quot;^:?([^:]+):&amp;quot;)&lt;br /&gt;
	local prefixes = {&lt;br /&gt;
		w = true,&lt;br /&gt;
		wikipedia = true,&lt;br /&gt;
		Category = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if not prefixes[prefix] then&lt;br /&gt;
		if link.fragment or link.target:find(&amp;quot;#$&amp;quot;) then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;) {&lt;br /&gt;
				&amp;quot;links/fragment&amp;quot;,&lt;br /&gt;
				&amp;quot;links/fragment/&amp;quot; .. lang:getCode()&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not link.fragment and lang:getCode() ~= &amp;quot;und&amp;quot; then&lt;br /&gt;
			if id then&lt;br /&gt;
				link.fragment = require(&amp;quot;Module:senseid&amp;quot;).anchor(lang, id)&lt;br /&gt;
			elseif not mw.ustring.find(link.target, &amp;quot;^Appendix:&amp;quot;)&lt;br /&gt;
					and not mw.ustring.find(link.target, &amp;quot;^Reconstruction:&amp;quot;) then&lt;br /&gt;
				link.fragment = lang:getCanonicalName()&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- This allows linking to pages like [[sms:a]] without it being treated weirdly.&lt;br /&gt;
		link.target = link.target:gsub(&amp;quot;:&amp;quot;, &amp;quot;&amp;amp;#x3a;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;quot;[[&amp;quot; .. link.target .. (link.fragment and &amp;quot;#&amp;quot; .. link.fragment or &amp;quot;&amp;quot;) .. &amp;quot;|&amp;quot; .. link.display .. &amp;quot;]]&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Split a link into its parts&lt;br /&gt;
local function parseLink(linktext)&lt;br /&gt;
	local link = { target = linktext }&lt;br /&gt;
	local first, second = link.target:match(&amp;quot;^([^|]+)|(.+)$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if first then&lt;br /&gt;
		link.target = first&lt;br /&gt;
		link.display = second&lt;br /&gt;
	else&lt;br /&gt;
		link.display = link.target&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	first, second = link.target:match(&amp;quot;^(.+)#(.+)$&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	if first then&lt;br /&gt;
		link.target = first&lt;br /&gt;
		link.fragment = second&lt;br /&gt;
	else&lt;br /&gt;
		-- So that makeLangLink does not look for a fragment again&lt;br /&gt;
		link.fragment = false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Creates a basic wikilink to the given term. If the text already contains&lt;br /&gt;
-- links, these are replaced with links to the correct section.&lt;br /&gt;
function export.language_link(data, allow_self_link)&lt;br /&gt;
	if type(data) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		error(&amp;quot;The first argument to the function language_link must be a table. See Module:links/documentation for more information.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text = data.term&lt;br /&gt;
&lt;br /&gt;
	ignore_cap = ignore_cap or mw.loadData(&amp;quot;Module:links/data&amp;quot;).ignore_cap&lt;br /&gt;
	if ignore_cap[data.lang:getCode()] and text then&lt;br /&gt;
		text = text:gsub(&amp;quot;%^&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If the text begins with * and another character,&lt;br /&gt;
	-- then act as if each link begins with *&lt;br /&gt;
	local allReconstructed = false&lt;br /&gt;
&lt;br /&gt;
	if text:find(&amp;quot;^*.&amp;quot;) then&lt;br /&gt;
		allReconstructed = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Do we have embedded wikilinks?&lt;br /&gt;
	if text:find(&amp;quot;[[&amp;quot;, nil, true) then&lt;br /&gt;
		--[=[&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/links/alt-ignored]]&lt;br /&gt;
		[[Special:WhatLinksHere/Template:tracking/links/id-ignored]]&lt;br /&gt;
		]=]&lt;br /&gt;
&lt;br /&gt;
		if data.alt then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/alt-ignored&amp;quot;)&lt;br /&gt;
			mw.log(&amp;quot;(from Module:links)&amp;quot;, &amp;quot;text with embedded wikilinks:&amp;quot;, text,&lt;br /&gt;
				&amp;quot;ignored alt:&amp;quot;, data.alt, &amp;quot;lang:&amp;quot;, data.lang:getCode())&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if data.id then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/id-ignored&amp;quot;)&lt;br /&gt;
			mw.log(&amp;quot;(from Module:links)&amp;quot;, &amp;quot;text with embedded wikilinks:&amp;quot;, text,&lt;br /&gt;
				&amp;quot;ignored id:&amp;quot;, data.id, &amp;quot;lang:&amp;quot;, data.lang:getCode())&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Begins and ends with a wikilink tag&lt;br /&gt;
		if text:find(&amp;quot;^%[%[(.+)%]%]$&amp;quot;) then&lt;br /&gt;
			-- There are no [ ] in between.&lt;br /&gt;
			-- This makes the wikilink tag redundant.&lt;br /&gt;
			if text:find(&amp;quot;^%[%[[^%[%]]+%]%]$&amp;quot;) then&lt;br /&gt;
				require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/redundant wikilink&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				local temp = text:gsub(&amp;quot;^%[%[(.+)%]%]$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
				temp = temp:gsub(&amp;quot;%]%], %[%[&amp;quot;, &amp;quot;|&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
				if not temp:find(&amp;quot;[%[%]]&amp;quot;) then&lt;br /&gt;
					require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/list&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		text = text:gsub(&amp;quot;%[%[([^%]]+)%]%]&amp;quot;,&lt;br /&gt;
			function(linktext)&lt;br /&gt;
				local link = parseLink(linktext)&lt;br /&gt;
&lt;br /&gt;
				if allReconstructed then&lt;br /&gt;
					link.target = &amp;quot;*&amp;quot; .. link.target&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				return makeLangLink(link, data.lang, data.id, allow_self_link)&lt;br /&gt;
			end)&lt;br /&gt;
&lt;br /&gt;
		-- Remove the extra * at the beginning if it&amp;#039;s immediately followed&lt;br /&gt;
		-- by a link whose display begins with * too&lt;br /&gt;
		if allReconstructed then&lt;br /&gt;
			text = text:gsub(&amp;quot;^%*%[%[([^|%]]+)|%*&amp;quot;, &amp;quot;[[%1|*&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- There is no embedded wikilink, make a link using the parameters.&lt;br /&gt;
		text = makeLangLink({ target = text, display = data.alt }, data.lang, data.id, allow_self_link)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.mark(text, itemType, face, lang)&lt;br /&gt;
	local tag = { &amp;quot;&amp;quot;, &amp;quot;&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
	if itemType == &amp;quot;gloss&amp;quot; then&lt;br /&gt;
		tag = { &amp;#039;&amp;lt;span class=&amp;quot;mention-gloss-double-quote&amp;quot;&amp;gt;“&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mention-gloss&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;mention-gloss-double-quote&amp;quot;&amp;gt;”&amp;lt;/span&amp;gt;&amp;#039; }&lt;br /&gt;
	elseif itemType == &amp;quot;tr&amp;quot; then&lt;br /&gt;
		if face == &amp;quot;term&amp;quot; then&lt;br /&gt;
			tag = { &amp;#039;&amp;lt;span lang=&amp;quot;&amp;#039; .. lang:getCode() .. &amp;#039;&amp;quot; class=&amp;quot;tr mention-tr Latn&amp;quot;&amp;gt;&amp;#039;,&lt;br /&gt;
				&amp;#039;&amp;lt;/span&amp;gt;&amp;#039; }&lt;br /&gt;
		else&lt;br /&gt;
			tag = { &amp;#039;&amp;lt;span lang=&amp;quot;&amp;#039; .. lang:getCode() .. &amp;#039;&amp;quot; class=&amp;quot;tr Latn&amp;quot;&amp;gt;&amp;#039;, &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; }&lt;br /&gt;
		end&lt;br /&gt;
	elseif itemType == &amp;quot;ts&amp;quot; then&lt;br /&gt;
		tag = { &amp;#039;&amp;lt;span class=&amp;quot;ts mention-ts Latn&amp;quot;&amp;gt;/&amp;#039;, &amp;#039;/&amp;lt;/span&amp;gt;&amp;#039; }&lt;br /&gt;
	elseif itemType == &amp;quot;pos&amp;quot; then&lt;br /&gt;
		tag = { &amp;#039;&amp;lt;span class=&amp;quot;ann-pos&amp;quot;&amp;gt;&amp;#039;, &amp;#039;&amp;lt;/span&amp;gt;&amp;#039; }&lt;br /&gt;
	elseif itemType == &amp;quot;annotations&amp;quot; then&lt;br /&gt;
		tag = { &amp;#039;&amp;lt;span class=&amp;quot;mention-gloss-paren annotation-paren&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;#039;,&lt;br /&gt;
			&amp;#039;&amp;lt;span class=&amp;quot;mention-gloss-paren annotation-paren&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;#039; }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(text) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		return tag[1] .. text .. tag[2]&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;
-- Format the annotations (things following the linked term)&lt;br /&gt;
function export.format_link_annotations(data, face)&lt;br /&gt;
	local output = {}&lt;br /&gt;
&lt;br /&gt;
	-- Interwiki link&lt;br /&gt;
	if data.interwiki then&lt;br /&gt;
		table_insert(output, data.interwiki)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Genders&lt;br /&gt;
	if type(data.genders) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		data.genders = { data.genders }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if data.genders and #data.genders &amp;gt; 0 then&lt;br /&gt;
		local m_gen = require(&amp;quot;Module:gender and number&amp;quot;)&lt;br /&gt;
		table_insert(output, &amp;quot;&amp;amp;nbsp;&amp;quot; .. m_gen.format_list(data.genders, data.lang))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local annotations = {}&lt;br /&gt;
&lt;br /&gt;
	-- Transliteration and transcription&lt;br /&gt;
	if data.tr or data.ts then&lt;br /&gt;
		local kind&lt;br /&gt;
		if face == &amp;quot;term&amp;quot; then&lt;br /&gt;
			kind = face&lt;br /&gt;
		else&lt;br /&gt;
			kind = &amp;quot;default&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if data.tr and data.ts then&lt;br /&gt;
			table_insert(annotations,&lt;br /&gt;
				require(&amp;quot;Module:script utilities&amp;quot;).tag_translit(data.tr, data.lang, kind)&lt;br /&gt;
				.. &amp;quot; &amp;quot; .. export.mark(data.ts, &amp;quot;ts&amp;quot;))&lt;br /&gt;
		elseif data.ts then&lt;br /&gt;
			table_insert(annotations, export.mark(data.ts, &amp;quot;ts&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			table_insert(annotations,&lt;br /&gt;
				require(&amp;quot;Module:script utilities&amp;quot;).tag_translit(data.tr, data.lang, kind))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Gloss/translation&lt;br /&gt;
	if data.gloss then&lt;br /&gt;
		table_insert(annotations, export.mark(data.gloss, &amp;quot;gloss&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Part of speech&lt;br /&gt;
	if data.pos then&lt;br /&gt;
		-- debug category for pos= containing transcriptions&lt;br /&gt;
		if data.pos:find(&amp;quot;/[^&amp;gt;&amp;lt;]*/&amp;quot;) then&lt;br /&gt;
			data.pos = data.pos .. &amp;quot;[[Category:links likely containing transcriptions in pos]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		pos_tags = pos_tags or mw.loadData(&amp;quot;Module:links/data&amp;quot;).pos_tags&lt;br /&gt;
		table_insert(annotations, export.mark(pos_tags[data.pos] or data.pos, &amp;quot;pos&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Literal/sum-of-parts meaning&lt;br /&gt;
	if data.lit then&lt;br /&gt;
		table_insert(annotations, &amp;quot;literally &amp;quot; .. export.mark(data.lit, &amp;quot;gloss&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if #annotations &amp;gt; 0 then&lt;br /&gt;
		table_insert(output, &amp;quot; &amp;quot; .. export.mark(table_concat(annotations, &amp;quot;, &amp;quot;), &amp;quot;annotations&amp;quot;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table_concat(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- A version of {{l}} or {{m}} that can be called from other modules too&lt;br /&gt;
function export.full_link(data, face, allow_self_link, no_check_redundant_translit)&lt;br /&gt;
	if type(data) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		error(&amp;quot;The first argument to the function full_link must be a table. &amp;quot;&lt;br /&gt;
			.. &amp;quot;See Module:links/documentation for more information.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the link&lt;br /&gt;
	local output = {}&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	local link = &amp;quot;&amp;quot;&lt;br /&gt;
	local annotations&lt;br /&gt;
&lt;br /&gt;
	phonetic_extraction = phonetic_extraction or mw.loadData(&amp;quot;Module:links/data&amp;quot;).phonetic_extraction&lt;br /&gt;
&lt;br /&gt;
	-- Is there any text to show?&lt;br /&gt;
	if (data.term or data.alt) then&lt;br /&gt;
		-- Try to detect the script if it was not provided&lt;br /&gt;
		if not data.sc then&lt;br /&gt;
			data.sc = require(&amp;quot;Module:scripts&amp;quot;).findBestScript(data.alt or data.term, 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(data.alt or data.term, data.lang)&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/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;links/sc/redundant&amp;quot;)&lt;br /&gt;
				require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/sc/redundant/&amp;quot; .. data.sc:getCode())&lt;br /&gt;
			else&lt;br /&gt;
				require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/sc/needed&amp;quot;)&lt;br /&gt;
				require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;links/sc/needed/&amp;quot; .. data.sc:getCode())&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local class = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
		-- Encode certain characters to avoid various delimiter-related issues at various stages. We need to encode &amp;lt; and &amp;gt;&lt;br /&gt;
		-- because they end up forming part of CSS class names inside of &amp;lt;span ...&amp;gt; and will interfere with finding the end&lt;br /&gt;
		-- of the HTML tag. I first tried converting them to URL encoding, i.e. %3C and %3E; they then appear in the URL as&lt;br /&gt;
		-- %253C and %253E, which get mapped back to %3C and %3E when passed to [[Module:accel]]. But mapping them to &amp;amp;lt;&lt;br /&gt;
		-- and &amp;amp;gt; somehow works magically without any further work; they appear in the URL as &amp;lt; and &amp;gt;, and get passed to&lt;br /&gt;
		-- [[Module:accel]] as &amp;lt; and &amp;gt;. I have no idea who along the chain of calls is doing the encoding and decoding. If&lt;br /&gt;
		-- someone knows, please modify this comment appropriately!&lt;br /&gt;
		local encode_accel_char_map = {&lt;br /&gt;
			[&amp;quot;%&amp;quot;] = &amp;quot;.&amp;quot;,&lt;br /&gt;
			[&amp;quot; &amp;quot;] = &amp;quot;_&amp;quot;,&lt;br /&gt;
			[&amp;quot;&amp;lt;&amp;quot;] = &amp;quot;&amp;amp;lt;&amp;quot;,&lt;br /&gt;
			[&amp;quot;&amp;gt;&amp;quot;] = &amp;quot;&amp;amp;gt;&amp;quot;,&lt;br /&gt;
		}&lt;br /&gt;
		local function encode_accel_param_chars(param)&lt;br /&gt;
			local retval = param:gsub(&amp;quot;[% &amp;lt;&amp;gt;]&amp;quot;, encode_accel_char_map) -- discard second return value&lt;br /&gt;
			return retval&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local function encode_accel_param(prefix, param)&lt;br /&gt;
			if not param then&lt;br /&gt;
				return &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			if type(param) == &amp;quot;table&amp;quot; then&lt;br /&gt;
				local filled_params = {}&lt;br /&gt;
				-- There may be gaps in the sequence, especially for translit params.&lt;br /&gt;
				local maxindex = 0&lt;br /&gt;
				for k, v in pairs(param) do&lt;br /&gt;
					if type(k) == &amp;quot;number&amp;quot; and k &amp;gt; maxindex then&lt;br /&gt;
						maxindex = k&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				for i=1,maxindex do&lt;br /&gt;
					filled_params[i] = param[i] or &amp;quot;&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				-- [[Module:accel]] splits these up again.&lt;br /&gt;
				param = table.concat(filled_params, &amp;quot;*~!&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
			-- This is decoded again by [[WT:ACCEL]].&lt;br /&gt;
			return prefix .. encode_accel_param_chars(param)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if data.accel then&lt;br /&gt;
			local form = data.accel.form and encode_accel_param_chars(data.accel.form) .. &amp;quot;-form-of&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
			local gender = encode_accel_param(&amp;quot;gender-&amp;quot;, data.accel.gender)&lt;br /&gt;
			local pos = encode_accel_param(&amp;quot;pos-&amp;quot;, data.accel.pos)&lt;br /&gt;
			local translit = encode_accel_param(&amp;quot;transliteration-&amp;quot;,&lt;br /&gt;
				data.accel.translit or (data.tr ~= &amp;quot;-&amp;quot; and data.tr or nil))&lt;br /&gt;
			local target = encode_accel_param(&amp;quot;target-&amp;quot;, data.accel.target)&lt;br /&gt;
			local lemma = encode_accel_param(&amp;quot;origin-&amp;quot;, data.accel.lemma)&lt;br /&gt;
			local lemma_translit = encode_accel_param(&amp;quot;origin_transliteration-&amp;quot;, data.accel.lemma_translit)&lt;br /&gt;
			local no_store = data.accel.no_store and &amp;quot;form-of-nostore&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			local accel =&lt;br /&gt;
				form .. &amp;quot; &amp;quot; ..&lt;br /&gt;
				gender .. &amp;quot; &amp;quot; ..&lt;br /&gt;
				pos .. &amp;quot; &amp;quot; ..&lt;br /&gt;
				translit .. &amp;quot; &amp;quot; ..&lt;br /&gt;
				target .. &amp;quot; &amp;quot; ..&lt;br /&gt;
				lemma .. &amp;quot; &amp;quot; ..&lt;br /&gt;
				lemma_translit .. &amp;quot; &amp;quot; ..&lt;br /&gt;
				no_store .. &amp;quot; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
			class = &amp;quot;form-of lang-&amp;quot; .. data.lang:getCode() .. &amp;quot; &amp;quot; .. accel&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Only make a link if the term has been given, otherwise just show the alt text without a link&lt;br /&gt;
		link = require(&amp;quot;Module:script utilities&amp;quot;).tag_text(&lt;br /&gt;
			data.term and export.language_link(data, allow_self_link)&lt;br /&gt;
			or data.alt, data.lang, data.sc, face, class)&lt;br /&gt;
	else&lt;br /&gt;
		--[[	No term to show.&lt;br /&gt;
				Is there at least a transliteration we can work from?	]]&lt;br /&gt;
		link = require(&amp;quot;Module:script utilities&amp;quot;).request_script(data.lang, data.sc)&lt;br /&gt;
&lt;br /&gt;
		if link == &amp;quot;&amp;quot; or not data.tr or data.tr == &amp;quot;-&amp;quot; then&lt;br /&gt;
			-- No link to show, and no transliteration either. Show a term request.&lt;br /&gt;
			local category = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
			if mw.title.getCurrentTitle().nsText ~= &amp;quot;Template&amp;quot; then&lt;br /&gt;
				table_insert(categories, &amp;quot;[[Category:&amp;quot; .. data.lang:getCanonicalName() .. &amp;quot; term requests]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			link = &amp;quot;&amp;lt;small&amp;gt;[Term?]&amp;lt;/small&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table_insert(output, link)&lt;br /&gt;
&lt;br /&gt;
	if data.tr == &amp;quot;&amp;quot; or data.tr == &amp;quot;-&amp;quot; then&lt;br /&gt;
		data.tr = nil&lt;br /&gt;
&lt;br /&gt;
	elseif phonetic_extraction[data.lang:getCode()] then&lt;br /&gt;
		local m_phonetic = require(phonetic_extraction[data.lang:getCode()])&lt;br /&gt;
		data.tr = data.tr or m_phonetic.getTranslit(export.remove_links(data.term))&lt;br /&gt;
&lt;br /&gt;
	elseif (data.term or data.alt) and not data.sc:getCode():find(&amp;quot;Lati?n&amp;quot;) then&lt;br /&gt;
&lt;br /&gt;
		-- Try to generate a transliteration, unless transliteration has been supplied and either&lt;br /&gt;
		-- no_check_redundant_translit is given or we are in a high-memory entry. (Checking for redundant&lt;br /&gt;
		-- transliteration can use up significant amounts of memory so we don&amp;#039;t want to do it if memory&lt;br /&gt;
		-- is tight. `no_check_redundant_translit` is currently set when called ultimately from&lt;br /&gt;
		-- {{multitrans|...|no-check-redundant-translit=1}}.)&lt;br /&gt;
		if not (data.tr and (&lt;br /&gt;
			no_check_redundant_translit or&lt;br /&gt;
			mw.loadData(&amp;quot;Module:links/data&amp;quot;).high_memory_entries[mw.title.getCurrentTitle().text]&lt;br /&gt;
		)) then&lt;br /&gt;
			local automated_tr = data.lang:transliterate(export.remove_links(data.alt or data.term), data.sc)&lt;br /&gt;
&lt;br /&gt;
			if automated_tr then&lt;br /&gt;
				local manual_tr = data.tr&lt;br /&gt;
&lt;br /&gt;
				if manual_tr then&lt;br /&gt;
					if manual_tr == automated_tr then&lt;br /&gt;
						table_insert(categories,&lt;br /&gt;
							&amp;quot;[[Category:Terms with redundant transliterations]]&amp;quot;&lt;br /&gt;
									.. &amp;quot;[[Category:Terms with redundant transliterations/&amp;quot; .. data.lang:getCode() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
					else&lt;br /&gt;
						-- Prevents Arabic root categories from flooding the tracking categories.&lt;br /&gt;
						if mw.title.getCurrentTitle().nsText ~= &amp;quot;Category&amp;quot; then&lt;br /&gt;
							table_insert(categories,&lt;br /&gt;
								&amp;quot;[[Category:Terms with manual transliterations different from the automated ones]]&amp;quot;&lt;br /&gt;
										.. &amp;quot;[[Category:Terms with manual transliterations different from the automated ones/&amp;quot; .. data.lang:getCode() .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if (not manual_tr) or data.lang:overrideManualTranslit() then&lt;br /&gt;
					data.tr = automated_tr&lt;br /&gt;
				end&lt;br /&gt;
			end&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 data.tr and data.lang:link_tr() then&lt;br /&gt;
		data.tr = export.language_link { lang = data.lang, term = data.tr }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table_insert(output, export.format_link_annotations(data, face))&lt;br /&gt;
&lt;br /&gt;
	return table_concat(output) .. table_concat(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[	Strips links: deletes category links,&lt;br /&gt;
		the targets of piped links,&lt;br /&gt;
		and all double square brackets.			]]&lt;br /&gt;
function export.remove_links(text)&lt;br /&gt;
	if type(text) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		text = text.args[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not text or text == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = mw.ustring.gsub(text, &amp;quot;%[%[Category:[^|%]]-|?[^|%]]-%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	text = text:gsub(&amp;quot;%[%[[^|%]]-|&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	text = text:gsub(&amp;quot;%[%[&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	text = text:gsub(&amp;quot;%]%]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.english_links(text)&lt;br /&gt;
	local lang = require(&amp;quot;Module:languages&amp;quot;).getByCode(&amp;quot;en&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- Parentheses around function call to remove second return value, the&lt;br /&gt;
	-- number of replacements.&lt;br /&gt;
	return (text:gsub(&amp;quot;%[%[([^%]]+)%]%]&amp;quot;,&lt;br /&gt;
		function(linktext)&lt;br /&gt;
			local link = parseLink(linktext)&lt;br /&gt;
			return makeLangLink(link, lang, nil, true, false)&lt;br /&gt;
		end))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
This decodes old section encodings.&lt;br /&gt;
For example, Norwegian_Bokm.C3.A5l → Norwegian_Bokmål.&lt;br /&gt;
It isn&amp;#039;t picky about whether the section encodings represent the UTF-8 encoding&lt;br /&gt;
of a real Unicode character, so it will mangle section names that contain&lt;br /&gt;
a period followed by two uppercase hex characters. At least such section names&lt;br /&gt;
are probably pretty rare.&lt;br /&gt;
&lt;br /&gt;
Wiktionary adds an additional id=&amp;quot;&amp;quot; attribute for sections&lt;br /&gt;
using a legacy encoding, if it is different from the modern minimally modified attribute.&lt;br /&gt;
It is like percent encoding (URI or URL encoding) except with &amp;quot;.&amp;quot; instead of &amp;quot;%&amp;quot;.&lt;br /&gt;
See [[mw:Manual:$wgFragmentMode]] and the code that does the encoding at&lt;br /&gt;
https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/7bf779524ab1fd8e1d74f79ea4840564d48eea4d/includes/parser/Sanitizer.php#893&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
-- The character class %x should not be used, as it includes the characters a-f,&lt;br /&gt;
-- which do not occur in these anchor encodings.&lt;br /&gt;
local capitalHex = &amp;quot;[0-9A-F]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function decodeAnchor(anchor)&lt;br /&gt;
	return (anchor:gsub(&amp;quot;%.(&amp;quot; .. capitalHex .. capitalHex .. &amp;quot;)&amp;quot;,&lt;br /&gt;
		function(hexByte)&lt;br /&gt;
			return string.char(tonumber(hexByte, 16))&lt;br /&gt;
		end))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.section_link(link)&lt;br /&gt;
	if type(link) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		error(&amp;quot;The first argument to section_link was a &amp;quot; .. type(link) .. &amp;quot;, but it should be a string.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	link = link:gsub(&amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local numberSigns = select(2, mw.ustring.gsub(link, &amp;quot;#&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
	if numberSigns &amp;gt; 1 then&lt;br /&gt;
		error(&amp;quot;The section link should only contain one number sign (#).&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	link = mw.uri.decode(link, &amp;quot;WIKI&amp;quot;)&lt;br /&gt;
	local page, section = link:match(&amp;quot;^([^#]*)#(.+)$&amp;quot;)&lt;br /&gt;
	if page == &amp;quot;&amp;quot; then&lt;br /&gt;
		page = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if section then&lt;br /&gt;
		section = decodeAnchor(section)&lt;br /&gt;
&lt;br /&gt;
		-- URI-encode (percent-encode) section to allow square brackets and&lt;br /&gt;
		-- other dodgy characters in section name.&lt;br /&gt;
		-- If not percent-encoded, they prevent the parser from creating a link.&lt;br /&gt;
		-- Decode percent-encoding in the displayed text&lt;br /&gt;
		if page then&lt;br /&gt;
			return &amp;quot;[[&amp;quot; .. page .. &amp;quot;#&amp;quot; .. mw.uri.encode(section, &amp;quot;WIKI&amp;quot;)&lt;br /&gt;
				.. &amp;quot;|&amp;quot; .. page .. &amp;quot; §&amp;amp;nbsp;&amp;quot; .. section .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;quot;[[#&amp;quot; .. mw.uri.encode(section, &amp;quot;WIKI&amp;quot;)&lt;br /&gt;
				.. &amp;quot;|§&amp;amp;nbsp;&amp;quot; .. section .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;quot;The function “section_link” could not find a number sign marking a section name.&amp;quot;)&lt;br /&gt;
	end&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>