<?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%3Aja</id>
	<title>Module:ja - 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%3Aja"/>
	<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:ja&amp;action=history"/>
	<updated>2026-04-22T00:15:33Z</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:ja&amp;diff=495561&amp;oldid=prev</id>
		<title>Sware: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:ja&amp;diff=495561&amp;oldid=prev"/>
		<updated>2026-04-21T12:44:15Z</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 12:44, 21 April 2026&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>Sware</name></author>
	</entry>
	<entry>
		<id>https://linguifex.com/w/index.php?title=Module:ja&amp;diff=495560&amp;oldid=prev</id>
		<title>wikt&gt;Tespi40: Add headword class to kanji</title>
		<link rel="alternate" type="text/html" href="https://linguifex.com/w/index.php?title=Module:ja&amp;diff=495560&amp;oldid=prev"/>
		<updated>2025-11-01T12:01:07Z</updated>

		<summary type="html">&lt;p&gt;Add headword class to kanji&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local m_str_utils = require(&amp;quot;Module:string utilities&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local export = {}&lt;br /&gt;
&lt;br /&gt;
local codepoint = m_str_utils.codepoint&lt;br /&gt;
local concat = table.concat&lt;br /&gt;
local find = string.find&lt;br /&gt;
local get_by_code = require(&amp;quot;Module:languages&amp;quot;).getByCode&lt;br /&gt;
local insert = table.insert&lt;br /&gt;
local load_data = mw.loadData&lt;br /&gt;
local toNFC = mw.ustring.toNFC&lt;br /&gt;
local toNFD = mw.ustring.toNFD&lt;br /&gt;
local u = m_str_utils.char&lt;br /&gt;
local ugsub = m_str_utils.gsub&lt;br /&gt;
local ulen = m_str_utils.len&lt;br /&gt;
local ulower = m_str_utils.lower&lt;br /&gt;
local umatch = mw.ustring.match&lt;br /&gt;
local usub = m_str_utils.sub&lt;br /&gt;
&lt;br /&gt;
-- note that arrays loaded by mw.loadData cannot be directly used by gsub&lt;br /&gt;
local pagename -- generated when needed, to avoid an infinite loop with [[Module:Jpan-sortkey]]&lt;br /&gt;
local namespace = mw.title.getCurrentTitle().nsText&lt;br /&gt;
&lt;br /&gt;
local data = load_data(&amp;quot;Module:ja/data&amp;quot;)&lt;br /&gt;
local long_vowels_hira = data.long_vowels_hira&lt;br /&gt;
local long_vowels_kata = data.long_vowels_kata&lt;br /&gt;
local voice_marks = data.voice_marks&lt;br /&gt;
&lt;br /&gt;
local range = load_data(&amp;quot;Module:ja/data/range&amp;quot;)&lt;br /&gt;
local r_hiragana = range.hiragana&lt;br /&gt;
local r_vowels = range.vowels&lt;br /&gt;
local r_kana_combining_characters = range.kana_combining_characters&lt;br /&gt;
&lt;br /&gt;
local function change_codepoint(added_value)&lt;br /&gt;
	return function(char)&lt;br /&gt;
		return u(codepoint(char) + added_value)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.hira_to_kata(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;
	text = ugsub(toNFD(text), &amp;quot;[ぁ-ゖゝゞ]&amp;quot;, change_codepoint(96))&lt;br /&gt;
	text = ugsub(text, &amp;quot;[𛅐-𛅒]&amp;quot;, change_codepoint(20))&lt;br /&gt;
	text = ugsub(text, &amp;quot;[𛀁𛀆𛄟𛄲]&amp;quot;, data.hira_to_kata)&lt;br /&gt;
	return toNFC(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.kata_to_hira(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;
	text = ugsub(toNFD(text), &amp;quot;[ァ-ヶヽヾ]&amp;quot;, change_codepoint(-96))&lt;br /&gt;
	text = ugsub(text, &amp;quot;[𛅤-𛅦]&amp;quot;, change_codepoint(-20))&lt;br /&gt;
	text = ugsub(text, &amp;quot;[𛀀𛄠-𛄢𛅕]&amp;quot;, data.kata_to_hira)&lt;br /&gt;
	return toNFC(text)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- removes spaces and hyphens from input&lt;br /&gt;
-- intended to be used when checking manual romaji to allow the&lt;br /&gt;
-- insertion of spaces or hyphens in manual romaji without appearing &amp;quot;wrong&amp;quot;&lt;br /&gt;
function export.rm_spaces_hyphens(f)&lt;br /&gt;
	local text = type(f) == &amp;quot;table&amp;quot; and f.args[1] or f&lt;br /&gt;
	return (text:gsub(&amp;quot;[ &amp;#039;%-.^]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;&amp;amp;nbsp;&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local function handle_macron(ch)&lt;br /&gt;
		return ch == &amp;quot;o&amp;quot; and &amp;quot;ou&amp;quot; or ch .. ch&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function export.romaji_to_kata(f)&lt;br /&gt;
		local text = type(f) == &amp;quot;table&amp;quot; and f.args[1] or f&lt;br /&gt;
		text = ulower(toNFD(text))&lt;br /&gt;
		text = text:gsub(&amp;quot;(.[\128-\191]*)\204\132&amp;quot;, handle_macron)&lt;br /&gt;
			:gsub(&amp;quot;(.)%1&amp;quot;, &amp;quot;ッ%1&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;tc&amp;quot;, &amp;quot;ッc&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;tsyu&amp;quot;, &amp;quot;ツュ&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;ts[uoiea]&amp;quot;, {[&amp;quot;tsu&amp;quot;]=&amp;quot;ツ&amp;quot;,[&amp;quot;tso&amp;quot;]=&amp;quot;ツォ&amp;quot;,[&amp;quot;tsi&amp;quot;]=&amp;quot;ツィ&amp;quot;,[&amp;quot;tse&amp;quot;]=&amp;quot;ツェ&amp;quot;,[&amp;quot;tsa&amp;quot;]=&amp;quot;ツァ&amp;quot;})&lt;br /&gt;
			:gsub(&amp;quot;sh[uoiea]&amp;quot;, {[&amp;quot;shu&amp;quot;]=&amp;quot;シュ&amp;quot;,[&amp;quot;sho&amp;quot;]=&amp;quot;ショ&amp;quot;,[&amp;quot;shi&amp;quot;]=&amp;quot;シ&amp;quot;,[&amp;quot;she&amp;quot;]=&amp;quot;シェ&amp;quot;,[&amp;quot;sha&amp;quot;]=&amp;quot;シャ&amp;quot;})&lt;br /&gt;
			:gsub(&amp;quot;ch[uoiea]&amp;quot;, {[&amp;quot;chu&amp;quot;]=&amp;quot;チュ&amp;quot;,[&amp;quot;cho&amp;quot;]=&amp;quot;チョ&amp;quot;,[&amp;quot;chi&amp;quot;]=&amp;quot;チ&amp;quot;,[&amp;quot;che&amp;quot;]=&amp;quot;チェ&amp;quot;,[&amp;quot;cha&amp;quot;]=&amp;quot;チャ&amp;quot;})&lt;br /&gt;
			:gsub(&amp;quot;n[uoiea&amp;#039;]?&amp;quot;, {[&amp;quot;nu&amp;quot;]=&amp;quot;ヌ&amp;quot;,[&amp;quot;no&amp;quot;]=&amp;quot;ノ&amp;quot;,[&amp;quot;ni&amp;quot;]=&amp;quot;ニ&amp;quot;,[&amp;quot;ne&amp;quot;]=&amp;quot;ネ&amp;quot;,[&amp;quot;na&amp;quot;]=&amp;quot;ナ&amp;quot;})&lt;br /&gt;
			:gsub(&amp;quot;[wvtrpsnmlkjhgfdbzy][yw]?[uoiea]&amp;quot;, data.rk)&lt;br /&gt;
			:gsub(&amp;quot;n&amp;#039;?&amp;quot;, &amp;quot;ン&amp;quot;)&lt;br /&gt;
			:gsub(&amp;quot;[aeiou]&amp;quot;, {&lt;br /&gt;
			u = &amp;quot;ウ&amp;quot;, o = &amp;quot;オ&amp;quot;, i = &amp;quot;イ&amp;quot;, e = &amp;quot;エ&amp;quot;, a = &amp;quot;ア&amp;quot;&lt;br /&gt;
			})&lt;br /&gt;
		return text&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- expects: any mix of kanji and kana&lt;br /&gt;
-- determines the script types used&lt;br /&gt;
-- e.g. given イギリス人, it returns Kana+Hani&lt;br /&gt;
function export.script(f)&lt;br /&gt;
	local text = type(f) == &amp;quot;table&amp;quot; and f.args[1] or f&lt;br /&gt;
	local script = {}&lt;br /&gt;
	&lt;br /&gt;
	-- For Hira and Kana, we remove any characters which also feature in the other first, so that we don&amp;#039;t get false positives for ー etc.&lt;br /&gt;
	local no_overlap = ugsub(text, &amp;quot;[&amp;quot; .. range.kana_overlap .. &amp;quot;]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if umatch(no_overlap, &amp;quot;[&amp;quot; .. r_hiragana .. &amp;quot;ゟ]&amp;quot;) then&lt;br /&gt;
		insert(script, &amp;quot;Hira&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if umatch(no_overlap, &amp;quot;[&amp;quot; .. range.katakana .. &amp;quot;ヿ]&amp;quot;) then&lt;br /&gt;
		insert(script, &amp;quot;Kana&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if umatch(text, &amp;quot;[&amp;quot; .. range.kanji .. &amp;quot;]&amp;quot;) then&lt;br /&gt;
		insert(script, &amp;quot;Hani&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if umatch(text, &amp;quot;[&amp;quot; .. range.latin .. &amp;quot;]&amp;quot;) then&lt;br /&gt;
		insert(script, &amp;quot;Romaji&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if umatch(text, &amp;quot;[&amp;quot; .. range.numbers .. &amp;quot;]&amp;quot;) then&lt;br /&gt;
		insert(script, &amp;quot;Number&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if umatch(text, &amp;quot;[〆々]&amp;quot;) then&lt;br /&gt;
		insert(script, &amp;quot;Abbreviation&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return concat(script, &amp;quot;+&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
do&lt;br /&gt;
	local submoraic = range.submoraic_kana .. r_kana_combining_characters&lt;br /&gt;
	local spacing_punc = &amp;quot;%s%p%$%+=&amp;gt;%^`|~&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function handle_spacing_punc(ch, mora)&lt;br /&gt;
		insert(mora, ch)&lt;br /&gt;
		if ch:match(&amp;quot;[^%^%%&amp;#039;]&amp;quot;) then&lt;br /&gt;
			mora.sp = true&lt;br /&gt;
		end&lt;br /&gt;
		return ch, mora&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function iterate_mora(text, start, morae, mora)&lt;br /&gt;
		mora = mora or {}&lt;br /&gt;
		local ch = umatch(text, &amp;quot;^[&amp;quot; .. spacing_punc .. &amp;quot;]+&amp;quot;, start)&lt;br /&gt;
		if ch then&lt;br /&gt;
			return handle_spacing_punc(ch, mora)&lt;br /&gt;
		end&lt;br /&gt;
		ch = usub(text, start, start)&lt;br /&gt;
		if ch == &amp;quot;&amp;lt;&amp;quot; then&lt;br /&gt;
			ch = umatch(text, &amp;quot;^&amp;lt;.-&amp;gt;&amp;quot;, start) or umatch(text, &amp;quot;^[&amp;lt;&amp;quot; .. spacing_punc .. &amp;quot;]+&amp;quot;, start)&lt;br /&gt;
			return handle_spacing_punc(ch, mora)&lt;br /&gt;
		elseif (&lt;br /&gt;
			mora.sp or&lt;br /&gt;
			mora.kana and umatch(ch, &amp;quot;[^&amp;quot; .. submoraic .. &amp;quot;]&amp;quot;)&lt;br /&gt;
		) then&lt;br /&gt;
			insert(morae, concat(mora))&lt;br /&gt;
			mora = {}&lt;br /&gt;
		end&lt;br /&gt;
		mora.kana = true&lt;br /&gt;
		insert(mora, ch)&lt;br /&gt;
		return ch, mora&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Returns an array of morae.&lt;br /&gt;
	-- Small vowel kana (and any combining dakuten/handakuten) are grouped with any prior word characters, which should be kana. Non-word characters (spaces, punctuation etc.) are accounted for, and grouped with surrounding morae wherever possible.&lt;br /&gt;
	function export.moraify(text)&lt;br /&gt;
		local morae, start, text_len, mora = {}, 1, ulen(text)&lt;br /&gt;
		while start &amp;lt;= text_len do&lt;br /&gt;
			local ch&lt;br /&gt;
			ch, mora = iterate_mora(text, start, morae, mora)&lt;br /&gt;
			start = start + ulen(ch)&lt;br /&gt;
		end&lt;br /&gt;
		if mora then&lt;br /&gt;
			insert(morae, concat(mora))&lt;br /&gt;
		end&lt;br /&gt;
		return morae&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function remove_formatting(text)&lt;br /&gt;
		return ugsub(text:gsub(&amp;quot;&amp;lt;.-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;), &amp;quot;[&amp;lt;&amp;quot; .. spacing_punc .. &amp;quot;]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Counts the number of morae.&lt;br /&gt;
	function export.count_morae(text)&lt;br /&gt;
		text = export.moraify(text)&lt;br /&gt;
		local morae = #text&lt;br /&gt;
		for i = 1, morae do&lt;br /&gt;
			if #remove_formatting(text[i]) == 0 then&lt;br /&gt;
				morae = morae - 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return morae&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function do_long_vowel(i, text)&lt;br /&gt;
		if not text[i]:find(&amp;quot;ー&amp;quot;) then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		local prev = text[i - 1]&lt;br /&gt;
		if not prev then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		prev = ugsub(remove_formatting(prev), &amp;quot;[&amp;quot; .. r_kana_combining_characters .. &amp;quot;]+&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			:match(&amp;quot;[^\128-\191][\128-\191]*$&amp;quot;)&lt;br /&gt;
		for vowel, kana in pairs(r_vowels) do&lt;br /&gt;
			if kana:find(prev) then&lt;br /&gt;
				local v = (umatch(prev, &amp;quot;[&amp;quot; .. r_hiragana .. &amp;quot;]&amp;quot;) and long_vowels_hira or long_vowels_kata)[vowel]&lt;br /&gt;
				text[i] = text[i]:gsub(&amp;quot;ー&amp;quot;, v, 1)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function do_iteration_mark(i, n, text)&lt;br /&gt;
		local mora = text[i]&lt;br /&gt;
		if mora:find(&amp;quot;ゝ&amp;quot;) or mora:find(&amp;quot;ヽ&amp;quot;) then&lt;br /&gt;
			return n + 1&lt;br /&gt;
		elseif n == 0 then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		-- Count backwards once for each iteration mark, but stop early if we find something which can&amp;#039;t be iterated, as that marks the start of the set to be repeated.&lt;br /&gt;
		local anchor = i&lt;br /&gt;
		for j = 0, n - 1 do&lt;br /&gt;
			local prev = text[anchor - j]&lt;br /&gt;
			if not prev then&lt;br /&gt;
				n = j&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			prev = remove_formatting(prev)&lt;br /&gt;
			if prev:find(&amp;quot;ゝ&amp;quot;) or prev:find(&amp;quot;ヽ&amp;quot;) or umatch(prev, &amp;quot;[%s%p]&amp;quot;) then&lt;br /&gt;
				n = j&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if n == 0 then&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
		i = i - n + 1&lt;br /&gt;
		-- Replace iteration marks ahead with the relevant character.&lt;br /&gt;
		for j = i, i + n - 1 do&lt;br /&gt;
			mora = remove_formatting(text[j]):gsub(&amp;quot;^(.[\128-\191]*)\227\130[\153\154]&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
			text[j + n] = ugsub(text[j + n], &amp;quot;([ゝヽ])([゙゚]?)&amp;quot;, function(mark, voicing)&lt;br /&gt;
				local repl = mora:gsub(&amp;quot;^.[\128-\191]*&amp;quot;, &amp;quot;%0&amp;quot; .. voicing)&lt;br /&gt;
				return mark == &amp;quot;ゝ&amp;quot; and export.kata_to_hira(repl) or export.hira_to_kata(repl)&lt;br /&gt;
			end)&lt;br /&gt;
		end&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Normalizes long vowels, iteration marks and non-combining voice marks to the standard equivalents.&lt;br /&gt;
	-- Note: output text is normalized to NFD.&lt;br /&gt;
	function export.normalize_kana(text)&lt;br /&gt;
		text = export.moraify((toNFD(text):gsub(&amp;quot;[\227\239][\130\190][\155\156\158\159]&amp;quot;, voice_marks)))&lt;br /&gt;
		&lt;br /&gt;
		local n, morae = 0, #text&lt;br /&gt;
		for i = morae, 1, -1 do&lt;br /&gt;
			n = do_iteration_mark(i, n, text) or 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		for i = 1, morae do&lt;br /&gt;
			do_long_vowel(i, text)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Normalize again to be safe.&lt;br /&gt;
		return toNFD(concat(text))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns the &amp;quot;stem&amp;quot; of a verb or -i adjective, that is the term minus the final character&lt;br /&gt;
function export.definal(f)&lt;br /&gt;
	return usub(f.args[1], 1, -2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.remove_ruby_markup(text)&lt;br /&gt;
	return (text:gsub(&amp;quot;[%^%-%. %%]&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- do the work of [[Template:ja-kanji]], [[Template:ryu-kanji]] etc.&lt;br /&gt;
-- should probably be folded into [[Module:Jpan-headword]]&lt;br /&gt;
function export.kanji(frame)&lt;br /&gt;
	pagename = pagename or load_data(&amp;quot;Module:headword/data&amp;quot;).pagename&lt;br /&gt;
	-- only do this if this entry is a kanji page and not some user&amp;#039;s page&lt;br /&gt;
	if namespace == &amp;quot;&amp;quot; then&lt;br /&gt;
		local params = {&lt;br /&gt;
			grade = true, -- To be removed.&lt;br /&gt;
			rs = true,&lt;br /&gt;
			shin = true,&lt;br /&gt;
			kyu = true,&lt;br /&gt;
			head = true,&lt;br /&gt;
		}&lt;br /&gt;
		local lang_code = frame.args[1]&lt;br /&gt;
		local lang = get_by_code(lang_code)&lt;br /&gt;
		local lang_name = lang:getCanonicalName()&lt;br /&gt;
		local args = require(&amp;quot;Module:parameters&amp;quot;).process(frame:getParent().args, params, nil, &amp;quot;ja&amp;quot;, &amp;quot;kanji&amp;quot;)&lt;br /&gt;
		local sortkey = args.rs or require(&amp;quot;Module:Hani-sortkey&amp;quot;).makeSortKey(pagename) or pagename -- radical sort&lt;br /&gt;
		local shin = args.shin&lt;br /&gt;
		local kyu = args.kyu&lt;br /&gt;
		&lt;br /&gt;
		local wikitext, categories = {}, {}&lt;br /&gt;
		&lt;br /&gt;
		-- display the kanji itself at the top at 275% size&lt;br /&gt;
		insert(wikitext, &amp;quot;&amp;lt;div&amp;gt;&amp;lt;span lang=\&amp;quot;&amp;quot; .. lang_code .. &amp;quot;\&amp;quot; class=\&amp;quot;Jpan headword\&amp;quot; style=\&amp;quot;font-size:275%; line-height:1;\&amp;quot;&amp;gt;&amp;quot; .. (args.head or pagename) .. &amp;quot;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		-- display information for the grade&lt;br /&gt;
&lt;br /&gt;
		-- determine grade&lt;br /&gt;
		local grade, in_parenthesis = export.kanji_grade(pagename), {}&lt;br /&gt;
		insert(in_parenthesis, data.grade_links[grade])&lt;br /&gt;
		&lt;br /&gt;
		if args.grade then&lt;br /&gt;
			require(&amp;quot;Module:debug/track&amp;quot;)(&amp;quot;ja/redundant grade parameter&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- link to shinjitai if shinjitai was specified, and link to kyujitai if kyujitai was specified&lt;br /&gt;
		if kyu then&lt;br /&gt;
			insert(in_parenthesis, &amp;quot;[[shinjitai]] kanji, [[kyūjitai]] form &amp;lt;span lang=\&amp;quot;&amp;quot; .. lang_code .. &amp;quot;\&amp;quot; class=\&amp;quot;Jpan\&amp;quot;&amp;gt;[[&amp;quot; .. kyu .. &amp;quot;#&amp;quot; .. lang_name .. &amp;quot;|&amp;quot; .. kyu .. &amp;quot;]]&amp;lt;/span&amp;gt;&amp;quot;)&lt;br /&gt;
		elseif shin then&lt;br /&gt;
			insert(in_parenthesis, &amp;quot;[[kyūjitai]] kanji, [[shinjitai]] form &amp;lt;span lang=\&amp;quot;&amp;quot; .. lang_code .. &amp;quot;\&amp;quot; class=\&amp;quot;Jpan\&amp;quot;&amp;gt;[[&amp;quot; .. shin .. &amp;quot;#&amp;quot; .. lang_name .. &amp;quot;|&amp;quot; .. shin .. &amp;quot;]]&amp;lt;/span&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		insert(wikitext, &amp;quot;&amp;#039;&amp;#039;(&amp;quot; .. concat(in_parenthesis, &amp;quot;,&amp;amp;nbsp;&amp;quot;) .. &amp;quot;&amp;#039;&amp;#039;)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		-- add categories&lt;br /&gt;
		insert(categories, lang_name .. &amp;quot; kanji&amp;quot;)&lt;br /&gt;
		insert(categories, lang_name .. &amp;quot; &amp;quot; .. data.grades[grade])&lt;br /&gt;
		&lt;br /&gt;
		if grade &amp;lt;= 6 then&lt;br /&gt;
			insert(categories, lang_name .. &amp;quot; kyōiku kanji&amp;quot;)&lt;br /&gt;
			insert(categories, lang_name .. &amp;quot; jōyō kanji&amp;quot;) -- Grade 7 get this from the data.&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if mw.title.new(lang_name .. &amp;quot; terms spelled with &amp;quot; .. pagename, 14).exists then&lt;br /&gt;
			insert(wikitext, 1, &amp;quot;&amp;lt;div class=\&amp;quot;noprint floatright catlinks\&amp;quot; style=\&amp;quot;font-size: 90%; width: 270px\&amp;quot;&amp;gt;&amp;lt;div style=\&amp;quot;padding:0 5px\&amp;quot;&amp;gt;&amp;lt;i&amp;gt;See also:&amp;lt;/i&amp;gt;&amp;lt;div style=\&amp;quot;margin-left: 10px;\&amp;quot;&amp;gt;[[:Category:&amp;quot; .. lang_name .. &amp;quot; terms spelled with &amp;quot; .. pagename .. &amp;quot;]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return concat(wikitext) .. require(&amp;quot;Module:utilities&amp;quot;).format_categories(categories, lang, sortkey)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.kanji_grade(kanji)&lt;br /&gt;
	for i, set in ipairs(data.grade_kanji) do&lt;br /&gt;
		if find(set, kanji, 1, true) then&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return umatch(kanji, &amp;quot;[&amp;quot; .. range.kanji .. &amp;quot;]&amp;quot;) and 9 or false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>wikt&gt;Tespi40</name></author>
	</entry>
</feed>