Module:ryu

Hello, you have come here looking for the meaning of the word Module:ryu. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:ryu, but we will also tell you about its etymology, its characteristics and you will know how to say Module:ryu in singular and plural. Everything you need to know about the word Module:ryu you have here. The definition of the word Module:ryu will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:ryu, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.


local export = {}

local m_str_utils = require("Module:string utilities")

local codepoint = m_str_utils.codepoint
local str_gsub = string.gsub
local find = m_str_utils.find
local gmatch = m_str_utils.gmatch
local gsub = m_str_utils.gsub
local len = m_str_utils.len
local match = m_str_utils.match
local sub = m_str_utils.sub
local toNFC = mw.ustring.toNFC
local trim = mw.text.trim
local u = m_str_utils.char
local upper = m_str_utils.upper

local titleObj = mw.title.getCurrentTitle()
local pagename = titleObj.text
local namespace = titleObj.nsText

local Jpan = require("Module:scripts").getByCode("Jpan")
local lang = require("Module:languages").getByCode("ryu")

-- note that arrays loaded by mw.loadData cannot be directly used by gsub
local data = mw.loadData("Module:ryu/data")

export.data = {
	joyo_kanji = data.joyo_kanji,
	jinmeiyo_kanji = data.jinmeiyo_kanji,
	grade1 = data.grade1,
	grade2 = data.grade2,
	grade3 = data.grade3,
	grade4 = data.grade4,
	grade5 = data.grade5,
	grade6 = data.grade6
}

local function track(code)
	if type(code) ~= "string" then
		error("The track function requires a string as argument.")
	end
	require("Module:debug").track("ryu/" .. code)
end

local function change_codepoint(added_value)
	return function(char)
		return u(codepoint(char) + added_value)
	end
end

function export.hira_to_kata(text)
	if type(text) == "table" then text = text.args end

	return (gsub(gsub(text, '', change_codepoint(96)), '', change_codepoint(20)))
end

function export.kata_to_hira(text)
	if type(text) == "table" then text = text.args end

	return (gsub(gsub(text, '', change_codepoint(-96)), '', change_codepoint(-20)))
end

function export.fullwidth_to_halfwidth(text)
	if type(text) == "table" then text = text.args end

	text = gsub(text, ' ', ' ')
	return (gsub(text, '', change_codepoint(-65248)))
end

function export.kana_to_romaji(text, options)
	-- options: no_diacritics, keep_dot, hist, anc, phonetic
	local str_find = string.find

	if type(text) == "table" then
		text = text.args
	end

	if not options then options = {} end

	-- conversions
	if not options.phonetic then
		text = gsub(text, '(%-)()$', '%1㊟㈛㊟%2') -- は as suffix (派 "-ha", etc.) and appearing at the end of string
		text = gsub(text, '(%-)() ', '%1㊟㈛㊟%2 ') -- は as suffix and appearing mid-sentence
	end
	
	text = str_gsub(text, '%', '㊟㌫㊟') -- at ], for example; avoid collision with % used in our ruby syntax
	text = str_gsub(text, '\'\'\'', '㊟⒝㊟')
	text = str_gsub(text, '<u>', '㊟㋑⒰㊟')
	text = str_gsub(text, '</u>', '㊟㋺⒰㊟')
	
	local text_styling = "㊟+㊟"
	
	-- avoid tampering with existing latin text: store it away
	local escape = {}
	local id = 0
	for latin in string.gmatch(text, "+") do
		escape = latin
		text = str_gsub(text, latin, "㊟㊕㊕㊟" .. id .. "㊟㊕㊕㊟")
		id = id + 1
	end

	-- special preformatting
	text = str_gsub(text, 'ヶげつ', 'かげつ')
	text = gsub(text, 'ヶ(' .. text_styling .. ')げつ', 'か%1げつ') -- 「'''ヶ'''げつ」
	text = str_gsub(text, 'ヶ', 'が')
	text = str_gsub(text, 'ヵ', 'か')
	text = gsub(text, '(.)', '%1%1')
	text = gsub(text, '(.)', function(char) return toNFC(char .. char .. '゙') end) -- unicode hax

	-- ]
	if options.hist then
--		text = gsub(text, '', '㊟⒳㊟%0')
		text = gsub(text, '.',
			{
--				 = 'tu',
--				 = 'ti',
--				 = 'du',
--				 = 'di',
--				 = 'si',
--				 = 'zi',
--				 = 'wi',
--				 = 'wo',
				 = 'ye',
			}
		)
	end
	
	if options.anc then
		text = gsub(text, '', '㊟⒳㊟%0')
		text = gsub(text, '.',
			{
				 = 'tu',
				 = 'ti',
				 = 'du',
				 = 'di',
				 = 'si',
				 = 'zi',
				 = 'wi',
				 = 'wo',
				 = 'ye',
			}
		)
	end

	text = export.hira_to_kata(text)
	text = gsub(text, '.', data.kr)
	text = export.fullwidth_to_halfwidth(text)

	if options.anc then
		text = str_gsub(text, 'oo', 'o.o')
		text = str_gsub(text, 'ou', 'o.u')
		text = str_gsub(text, 'h', 'f')
		
		local old = text
		text = str_gsub(text, 'i㊟⒳㊟y', 'y') -- くゐやう kwyau
		text = str_gsub(text, '()u㊟⒳㊟w', '%1w') 
		if old ~= text then
			--[=[
				There may be cases in which i or u is deleted incorrectly, and a
				period should be inserted.
				"Syncope" isn't quite accurate, as there wasn't a sound change.
				It's just an orthographic convention.
				]
			]=]
			mw.log(str_gsub(old, '㊟⒳㊟', '')  .. ' → ' .. str_gsub(text, '㊟⒳㊟', '') )
			track('mora syncope')
		end
		
		text = str_gsub(text, '㊟⒳㊟', '') -- ゑつ wetsu
	end

	-- markup
	text = str_gsub(text, '%%', '.') -- ruby "percent sign" syntax
	text = gsub(text, '()%.', '%1') -- 「し を ぼっ.す」; 「るい%じん%えん」→「rui.jin¤.en¤」

	-- 「テェェェ」→「テェーー」 (avoid funky romaji effected by the "(テュ→)teユ→tyu" line below)
	local kogaki_vowels = {'ァ','ィ','ゥ','ェ','ォ'}
	for _, char in ipairs(kogaki_vowels) do
		text = gsub(text, '('..char..')('..char..'+)', function(a,b) return a .. ('ー'):rep(len(b)) end)
	end

	-- (ゲェ→)geェ→gee (note that this also causes things like ウゥ→wu and イィ→yi)
	text = gsub(text, '', {='aa',='yi',='wu',='ee',='oo',})

	-- (クヮ→)kuヮ→kwa, (ク𛅤→)ku𛅤→kwi, (ク𛅥→)ku𛅥→kwe, (ク𛅦→)ku𛅦→kwo
	text = gsub(text, '()', {='wa',='wi',='we',='wo',})

	-- (クァ→)kuァ→kwa, (トァ→)toァ→twa, (ウィ→)uィ→wi
	text = gsub(text, '()', {='wa',='wi',='we',='wo',})
	if not options.anc then
		-- (ツァ→)cwa→ca
		text = str_gsub(text, '()w', '%1')
	end

	-- (テュ→)teユ→tyu, (ギェ→)giェ→gye
	text = gsub(text, '()', {='ya',='yu',='ye',='yo',})
	-- (ジュ→)jyu→ju
	text = gsub(text, '()y', '%1')

	-- (ティ→)teィ→ti (essentially forget about the vowel in between)
	text = gsub(text, '()', {='a',='i',='u',='e',='o',})

	-- chouonpu and sokuon
	while str_find(text, 'ー') or str_find(text, 'ッ *') or find(text, 'ッ' .. text_styling .. '') do
		text = str_gsub(text, '()ー', '%1%1')
		text = str_gsub(text, 'ッ( *)()', '%2%1%2')
		text = gsub(text, 'ッ(' .. text_styling .. ')()', '%2%1%2')
	end
	-- deal with leftover sokuon not used as geminate
	text = str_gsub(text, 'ッ', '&#39;') -- Apostrophe

	-- (ん→)n¤
	text = str_gsub(text, '¤()', "'%1")
	text = str_gsub(text, '¤', '')

	-- は, へ
	if not options.phonetic and str_find(text, "h") then
		for i, v in ipairs{
			{ "ha", "wa" },
			{ "he", "e" }
		} do
			local thingy = '' -- not sure what this should be named
			text = gsub(text, "(" .. thingy .. ")" .. v .. "(" .. thingy .. ")", "%1" .. v .. "%2")
			text = gsub(text, "(" .. thingy .. ")" .. v .. "$", "%1" .. v)
			text = gsub(text, "^" .. v .. "(" .. thingy .. ")", v .. "%1")
			if find(text, text_styling) then
				text = gsub(text, "(" .. thingy .. ")" .. v .. "(" .. text_styling .. thingy ..")", "%1" .. v .. "%2")
				text = gsub(text, "(" .. thingy .. ")" .. v .. "(" .. text_styling .. ")$", "%1" .. v .. "%2")
				text = gsub(text, "(" .. thingy .. text_styling .. ")" .. v .. "(" .. text_styling .. thingy ..")", "%1" .. v .. "%2")
				text = gsub(text, "(" .. thingy .. text_styling .. ")" .. v .. "(" .. text_styling .. ")$", "%1" .. v .. "%2")
			end
		end
	end
	-- change only when
	--   ① not flanked by a-z or a period ("^sore wa nani$", "^hyappou no .he hitotsu$")
	--   ② at the end of the string and not preceded by a-z or a period ("^are wa$")
	--   ③ at the beginning of the string and not followed by a-z or a period ("^he ikou$") 
	-- this also means that "^ha$" becomes "ha"
	-- period can be used next to the kana (either side) to force the "dumb" romanization (i.e. "ha", "he")

	-- fix sh, ch, ts
	local function handle_digraphs(geminate, intervening, main, following)
		--「めちゃ」→「mecha」
		--「めっちゃ」→「metcha」
		--「めっっちゃ」→「mettcha」
		local corresp_geminate_form = {='s',='t',='t'}
		local corresp_main = {='sh',='ch',='ts'}
		
		local geminate_repl, main_repl
		
		-- So as not to convert ch to tsh.
		if not following or main .. following ~= "ch" then
			main_repl = corresp_main
		end
		
		if geminate ~= "" then
			geminate_repl = string.rep(corresp_geminate_form, #geminate)
		end
		
		return (geminate_repl or geminate) .. (intervening or "") .. (main_repl or main) .. (following or "")
	end
	
	local function handle_digraphs2(geminate, main, following)
		return handle_digraphs(geminate, nil, main, following)
	end
	
	text = gsub(text, '(+)(' .. text_styling .. ')()', handle_digraphs)
	text = gsub(text, '(*)()(.?)', handle_digraphs2)
	

	-- macrons
	-- Will cause problems if combined vowel-macron characters are used below.
	if not options.no_diacritics then
		if not options.phonetic then
			text = str_gsub(text, 'ou', 'ō')
		end
		local macron = u(0x304)
		text = str_gsub(
			text,
			'()%1',
			'%1' .. macron
		)
	end

	-- remove markup and convert real periods
	if not options.keep_dot then
		text = str_gsub(text, '%.', '')
		text = str_gsub(text, '。', '◆.◇')
	end

	-- 
	text = str_gsub(text, '◇◆', '')
	text = str_gsub(text, '◆◇', '')
	text = str_gsub(text, ' *◆ *', '')
	text = str_gsub(text, ' *◇ *', ' ')

	-- restore latin text
	text = str_gsub(text, "㊟㊕㊕㊟(%d+)㊟㊕㊕㊟", function(id) return escape end)

	-- clean up spaces
	text = trim(text)
	text = str_gsub(text, ' +', ' ')
	
	-- remove double ampersands used in ruby
	text = str_gsub(text, '&&(.-)&&', '%1')

	-- uppercase markup
	text = str_gsub(text, "(%^)(㊟⒝㊟)", "%2%1") -- move ^ to an effective position if placed before bold markup
	text = str_gsub(text, "(%^)( )", "%2%1") -- same but with spaces
	text = gsub(text, '%^(.)', upper) -- uppercase conversion

	-- clean up spaces again
	text = str_gsub(text, ' +', ' ')

	-- conversions
	text = str_gsub(text, '㊟⒝㊟', '\'\'\'')
	text = str_gsub(text, '㊟㋑⒰㊟', '<u>')
	text = str_gsub(text, '㊟㋺⒰㊟', '</u>')
	text = str_gsub(text, '㊟㈛㊟', '')
	text = str_gsub(text, '㊟㌫㊟', '%%')

	-- unicode NFC
	text = toNFC(text)

	if find(text, '') then
		track('k2r failure')
	end
	
	return text
end

-- removes spaces and hyphens from input
-- intended to be used when checking manual romaji to allow the
-- insertion of spaces or hyphens in manual romaji without appearing "wrong"
function export.rm_spaces_hyphens(f)
	local text = type(f) == 'table' and f.args or f
	text = str_gsub(text, '.', {  = '',  = '',  = '',  = '' })
	text = str_gsub(text, '&nbsp;', '')
	return text
end

function export.romaji_to_kata(f)
	local text = type(f) == 'table' and f.args or f
	text = gsub(text, '.', data.rd)
	text = str_gsub(text, '(.)%1', {
		k = 'ッk', s = 'ッs', t = 'ッt', p = 'ッp',
		b = 'ッb', d = 'ッd', g = 'ッg', j = 'ッj'
	})
	text = str_gsub(text, 'tc', 'ッc')
	text = str_gsub(text, 'tsyu', 'ツュ')
	text = str_gsub(text, 'ts', {='ツ',='ツォ',='ツィ',='ツェ',='ツァ'})
	text = str_gsub(text, 'sh', {='シュ',='ショ',='シ',='シェ',='シャ'})
	text = str_gsub(text, 'ch', {='チュ',='チョ',='チ',='チェ',='チャ'})
	text = str_gsub(text, "n?", {='ヌ',='ノ',='ニ',='ネ',='ナ'})
	text = str_gsub(text, '?', data.rk)
	text = str_gsub(text, "n'?", 'ン')
	text = str_gsub(text, '', {
		u = 'ウ', o = 'オ', i = 'イ', e = 'エ', a = 'ア'
	})
	return text
end

-- expects: any mix of kanji and kana
-- determines the script types used
-- e.g. given イギリス人, it returns Kana+Hani
function export.script(f)
	text, script = type(f) == 'table' and f.args or f, {}

	if find(text, '') or find(text, '') then
		table.insert(script, 'Hira')
	end
	-- TODO: there are two kanas.  This should insert Kata.
	if find(text, '') or find(text, '') then
		table.insert(script, 'Kana')
	end
	-- 一 is unicode 4e00, previously used 丁 is 4e01
	if find(text, '') then
		table.insert(script, 'Hani')
	end
	-- matching %a should have worked but matched the end of every string
	if find(text, '') then
		table.insert(script, 'Romaji')
	end
	if find(text, '') then
		table.insert(script, 'Number')
	end
	if find(text, '') then
		table.insert(script, 'Abbreviation')
	end

	return table.concat(script, '+')
end

-- when counting morae, most small hiragana belong to the previous mora,
-- so for purposes of counting them, they can be removed and the characters
-- can be counted to get the number of morae.  The exception is small tsu,
-- so data.nonmora_to_empty maps all small hiragana except small tsu.
function export.count_morae(text)
	if type(text) == "table" then
		text = text.args
	end
	-- convert kata to hira (hira is untouched)
	text = export.kata_to_hira(text)
	-- remove all of the small hiragana such as ょ except small tsu
	text = gsub(text,'.',data.nonmora_to_empty)
	-- remove zero-width spaces
	text = gsub(text, '‎', '')
	-- return number of characters, which should be the number of morae
	return len(text)
end

-- returns a sort key with |sort= in front, e.g.
-- |sort=はつぐん' if given ばつぐん
function export.sort(f)
	return "|sort=" .. (lang:makeSortKey(f))
end

-- returns the "stem" of a verb or -i adjective, that is the term minus the final two characters
function export.definal(f)
	return sub(f.args,1,(len(f.args)-2))
end

function export.definal3(f)
	return sub(f.args,1,(len(f.args)-3))
end

function export.remove_ruby_markup(text)
	return (string.gsub(text, "", ""))
end

-- see also Template:JAruby
-- meant to be called from another module
function export.add_ruby_backend(term, kana, from_ryu_link)
	if term == kana then
		return term
	end
	local pattern = ""
	-- holds the whole segments of markup enclosed in <ruby>...</ruby>
	local ruby_markup = {}
	-- range of kana: ''
	-- nonkana: 
	local kanji_pattern = ""
	
	local str_find = string.find
	local str_gsub = string.gsub
	
	-- If term and kana aren't identical, then term should contain stuff that can
	-- have kana put above it.
	if not find(term, kanji_pattern) then
		require("Module:debug").track("ryu/ruby/no kanji")
		-- error("No kanji or other ruby-annotatable characters in first argument of add_ruby_backend.")
		return term
	end
	
	local orig_term = term
	
	-- Escape decimal numeric entities (such as &#32; representing a space) and HTML tags, which do not need ruby annotations.
	local function escape(t, i)
		return function(text, patt)
			return str_gsub(text, patt,
				function(capture)
					i = i + 1
					t = capture
					return "㊟" .. string.rep("&", i) .. "㊟"
				end)
		end
	end
	
	local escaped1 = {}
	local escape1 = escape(escaped1, 0)
	
	term = escape1(term, "(&&.-&&)")
	term = escape1(term, "(&#x?%d+;)")
	term = escape1(term, "(&+;)")
	term = escape1(term, "(<+>)")
	
	local escaped2 = {}
	local escape2 = escape(escaped2, 0)
	
	kana = escape2(kana, "(&&.-&&)")
	kana = escape2(kana, "(&#%d+;)")
	kana = escape2(kana, "(&+;)")
	kana = escape2(kana, "(<+>)")
	
	if escaped1 or escaped2 then
		-- ]
		require("Module:debug").track("ryu/ruby/escaped")
	end
	
	if #escaped2 ~= #escaped1 then
		local relationship
		if #escaped1 > #escaped2 then
			relationship = "more"
		else
			relationship = "fewer"
		end
		
		mw.logObject(escaped1)
		mw.logObject(escaped2)
		error("There are " .. relationship .. " escaped things in the text to be annotated than in the ruby text.")
	end
	
	-- links without pipes will fail
	term = str_gsub(term, '%]+)%]%]', ']')

	-- remove links from kana
	kana = str_gsub(kana, '%]+)%]%]', '%1')
	kana = str_gsub(kana, '%]+|(]+)%]%]', '%1')

	-- build up pattern
	-- escape the magic characters in the term
	pattern = str_gsub(term, '%]+|(]+)%]%]', '%1')
	pattern = require("Module:string utilities").pattern_escape(pattern)

	pattern = str_gsub(pattern, "]+", " *")
	kana = str_gsub(kana, "]+", '')
	pattern = str_gsub(pattern, " *('+) *", "%1")
	kana = str_gsub(kana, " *('+) *", "%1")
	pattern = str_gsub(pattern, " +", " ")
	kana = str_gsub(kana, " +", " ")

	-- remove periods and caret signs and hyphens
	pattern = str_gsub(pattern, '%%', '')
	kana = str_gsub(kana, '', '')

	-- in order to make a pattern that will find the ruby,
	-- replace every unbroken string of kanji with a sub-pattern
	
	-- mw.log("before adding (..-):", pattern)
	pattern = gsub(pattern, kanji_pattern .. '+', '(..-)')
	-- get a pattern like
	-- (.+)ばか(.+)ばか(.+)ばかばかばああか(.+) when given 超ばか猿超ばか猿超ばかばかばああか猿
	-- it turns out we need to keep the spaces sometimes
	-- so that kana don't "leak" in ambiguous cases like 捨すてて撤退 where it's not clear if it's
	-- す, てったい or すて, ったい.  only solution now is to put spaces in the "term" param
	-- if they fall between kana

	-- build up term (e.g. ])
	local replaced = {}
	local count = 0
	term = str_gsub(term, '%]', '%]') -- escape the "]" character so that it cannot appear, example becomes %]
	term = gsub(
		str_gsub(term, "%-", ""),
		kanji_pattern .. '+',
		function(text)
			count = count + 1
			-- remove spaces
			text = str_gsub(text, ' ', '')
			table.insert(replaced, text)
			return ''
		end
	) -- example becomes う|った%]%]

	
	while str_find(term, '%*%*|') do
		term = str_gsub(
			term,
			'(%*)%(*|)',
			function(a,b,c)
				return a .. replaced .. c
			end
		)
	end
	 -- example becomes った%]%]
	
	-- anchor pattern at ends of string, because quantifiers are non-greedy
	pattern = "^" .. pattern .. "$"
	
	-- apply that pattern to the kana to collect the rubies
	-- if this fails, try it without spaces
	if find(kana, pattern) == nil then
		kana = str_gsub(kana, ' ', '')
		if not find(kana, pattern) then
			mw.log("failed match:", "\n", kana, #kana, "\n", pattern, #pattern, "\n", orig_term, #orig_term)
			error("The pattern did not match the kana.")
		end
	end
	
	local ruby = { match(kana, pattern) }
	if require("Module:fun").some(function(kana) return kana:find("^ +$") end, ruby) then
		-- ]
		track('ruby spaces')
		mw.log('One of the kana in the ruby table derived from ' .. kana .. ' contains nothing but spaces.')
	end
	-- local ruby = {}
	-- for c in gmatch(kana, pattern) do table.insert(ruby, c) end

	-- find the kanji strings again and combine them with their ruby to make the <ruby> markup
	local kanji_segments = {}
	for c in string.gmatch(term, '%') do
		table.insert(kanji_segments, replaced)
	end
	
	if #kanji_segments ~= #ruby then
		mw.logObject(kanji_segments)
		mw.logObject(ruby)
		error("There are " .. #kanji_segments .. " kanji segments but only " .. #ruby .. " ruby segments. There should be an equal number of each.")
	end
	
	for i, kanji_segment in pairs(kanji_segments) do
		if not ruby then
			error('No ruby for kanji segment "' .. kanji_segment .. '".')
		end
		
		local kanji, kana
		if len(kanji_segment) > 1 and len(kanji_segment) == len(ruby) then
			-- Split kanji and kana into individual characters.
			kanji = mw.text.split(kanji_segment, "")
			kana = mw.text.split(ruby, "")
		else
			kanji, kana = { kanji_segment }, { ruby }
		end
		
		local ruby_string = {}
		for i = 1, #kanji do
			-- To prevent, for instance, "stop" being annotated with "stop" in ].
			if kanji == kana then
				table.insert(ruby_string, kanji)
			else
				table.insert(ruby_string, "<ruby>" .. kanji .. "<rp>&nbsp;(</rp><rt>" .. kana .. "</rt><rp>) </rp></ruby>")
			end
		end
		table.insert(ruby_markup, table.concat(ruby_string))
	end

	count = 0
	term = str_gsub(term, '%', function()
		count = count + 1
		return ruby_markup
	end)

	term = str_gsub(term, '%%%]', ']')
	term = str_gsub(term, '%%', '')
	term = str_gsub(term, ' ', '')
	
	term = str_gsub(term,
		"㊟(&+)㊟",
		function(ampersands)
			return escaped1
		end)
	
	term = str_gsub(term, "&&(.-)&&", "%1")
	
	--done
	return term
end

-- An invokable version of "add_ruby_backend"
function export.show_ruby(frame)
	return export.add_ruby_backend(frame.args, frame.args)
end

-- do the work of Template:ryu-kanji
function export.kanji(frame)
	local pagename = mw.title.getCurrentTitle().text
	-- only do this if this entry is a kanji page and not some user's page
	if find(pagename, "") then
		local params = {
			grade = {},
			rs = {},
			shin = {},
			kyu = {},
			head = {},
		}
		local args = require("Module:parameters").process(frame:getParent().args, params)
		
		local rs = args or (lang:makeSortKey(pagename))
		local shin = args
		local kyu = args
		local head = args
		
		local grade_replacements = {
			c = "7",
			n = "8",
			uc = "9",
			r = "0",
		}
		local grade = tonumber(args)
		grade = grade_replacements or grade

		local wikitext = {}
		local categories = {}

		local catsort = rs or pagename

		-- display the kanji itself at the top at 275% size
		table.insert(wikitext, '<div><span lang="ryu" class="Jpan" style="font-size:275%; line-height:1;">' .. (args or pagename) .. '</span></div>')

		-- display information for the grade

		-- if grade was not specified, determine it now
		if not grade then
			grade = export.kanji_grade(pagename)
		end
		
		local in_parenthesis = {}
		local grade_links = {
			 = "]",
			 = "]",
			 = "]",
			 = "]",
			 = "]",
			 = "]",
			 = "]",
			 = "]",
			 = "]",
			 = "]",
		}
		if grade_links then
			table.insert(in_parenthesis, grade_links)
		else
			table.insert(categories, "]")
		end

		-- link to shinjitai if shinjitai was specified, and link to kyujitai if kyujitai was specified

		if kyu then
			table.insert(in_parenthesis, '] kanji, ] form <span lang="ryu" class="Jpan">]</span>')
		elseif shin then
			table.insert(in_parenthesis, '] kanji, ] form <span lang="ryu" class="Jpan">]</span>')
		end
		table.insert(wikitext, "''(" .. table.concat(in_parenthesis, ",&nbsp;") .. "'')")

		-- add categories
		table.insert(categories, "]")
		local grade_categories = {
			 = "Grade 1 kanji",
			 = "Grade 2 kanji",
			 = "Grade 3 kanji",
			 = "Grade 4 kanji",
			 = "Grade 5 kanji",
			 = "Grade 6 kanji",
			 = "Common kanji",
			 = "Kanji used for names",
			 = "Uncommon kanji",
			 = "CJKV radicals",
		}
		table.insert(categories, " or error("The grade " .. grade .. " is invalid.")) .. "|" .. (grade == "0" and " " or catsort) .. "]]")

		-- error category
		if not rs then
			table.insert(categories, "]")
		end

		return table.concat(wikitext, "") .. table.concat(categories, "\n")
	end
end

local grade1_pattern = ('')
local grade2_pattern = ('')
local grade3_pattern = ('')
local grade4_pattern = ('')
local grade5_pattern = ('')
local grade6_pattern = ('')
local secondary_pattern = ('')
local jinmeiyo_kanji_pattern = ('')
local hyogaiji_pattern = ('')

function export.kanji_grade(kanji)
	if type(kanji) == "table" then
		kanji = kanji.args
	end

	if find(kanji, hyogaiji_pattern) then return 9
	elseif find(kanji, jinmeiyo_kanji_pattern) then return 8
	elseif find(kanji, secondary_pattern) then return 7
	elseif find(kanji, grade6_pattern) then return 6
	elseif find(kanji, grade5_pattern) then return 5
	elseif find(kanji, grade4_pattern) then return 4
	elseif find(kanji, grade3_pattern) then return 3
	elseif find(kanji, grade2_pattern) then return 2
	elseif find(kanji, grade1_pattern) then return 1
	end

	return false
end

function export.new(frame)
	local args = frame:getParent().args

	local function waapuro_r_to_kana(text)
		return require("Module:typing-aids").replace{"ryu", text}
	end

	local result = args and ("===Etymology " .. args .. "===") or "==Okinawan=="
	local hf = args and "=" or ""

	if args then
		result = result .. "\n{{DEFAULTSORT:" .. args .. "}}"
	end
	if args then
		result = result .. "\n{{wp|lang=ryu" .. (args ~= "y" and "|" .. args or "") .. "}}"
	end
	wp_count = 2
	while args do
		result = result .. "\n{{wp|lang=ryu|" .. args .. "}}"
		wp_count = wp_count + 1
	end
	
	if args then
		result = result .. "\n{{swp|lang=ryu" .. (args ~= "y" and "|" .. args or "") .. "}}"
	end
	swp_count = 2
	while args do
		result = result .. "\n{{swp|lang=ryu|" .. args .. "}}"
		swp_count = swp_count + 1
	end

	text = args ~= "" and args or pagename
	text = gsub(text, "%-", "|")
	text = waapuro_r_to_kana(text)

	local function make_tab(original, yomi)
		output_text = ""
		original = gsub(original, " ", "|")
		original = gsub(original, "%.", "|")
		original = gsub(original, "%^", "")
		if find(original, "<") then
			for word in gmatch(original, "<(+)>") do
				output_text = output_text .. "|" .. word
			end
			yomi = yomi or "k"
		else
			output_text = gsub(original, ">()", "|k%1=")
			output_text = find(output_text, "|") and "|" .. output_text or false
		end
		yomi = yomi or "o"
		return "\n{{ryu-kanjitab" .. (output_text or "") .. (yomi == "n" and "" or "|yomi=" .. yomi) .. (args and "|sort=" .. args or sortkey or "") .. (args and "|r=" .. args or "") .. (args and "|alt=" .. args or "") .. "}}", yomi
	end
	
	if find(pagename, "") or args then
		to_add, yomi = make_tab(text, args)
		result = result .. to_add
	end

	if find(text, "<") then
		text = gsub(text, "", "")
	else
		text = gsub(text, "^+>%d+(+)", "%1")
		text = gsub(text, "|+>%d+(+)", "%1")
		text = gsub(text, "()|(あ)", "%1.%2")
		text = gsub(text, "()|(い)", "%1.%2")
		text = gsub(text, "()|(う)", "%1.%2")
		text = gsub(text, "()|()", "%1.%2")
		text = gsub(text, "()|()", "%1.%2")
		text = gsub(text, "|", "")
	end
	
	if args then
		result = result .. "\n{{swp|lang=ryu" .. (args ~= "y" and "|" .. args or "") .. "}}"
	end
	wpd_count = 2
	while args do
		result = result .. "\n{{swp|lang=ryu|" .. args .. "}}"
		wpd_count = wpd_count + 1
	end

	if args then
		result = result .. args
	end
	pic_count = 2
	while args do
		result = result .. args
		swp_count = pic_count + 1
	end

	local function other(class, title, args)
		local code, i = "", 2
		
		if args then
			code = code .. "\n\n===" .. hf .. title .. hf .. "===\n* {{ryu-l|" .. args .. "}}"

			while args do
				code = code .. "\n* {{ryu-l|" .. args .. "}}"
				i = i + 1
			end
		end

		code = gsub(code, "{{ryu%-l|(+)", "{{ryu-r|%1|") -- change something like "{{ryu-l|辞典:じてん}}" to "{{ryu-r|辞典|じてん}}"
		code = gsub(code, "{{ryu%-l|(+)}}", "{{ryu-r|%1}}") -- change something like "{{ryu-l|じてん}}" to "{{ryu-r|じてん}}"

		return code
	end

	result = result .. other("alt", "Alternative forms", args)

	sortkey = export.script(text) == "Kana" and export.sort(text) or false
	if sortkey and sortkey == "|sort=" .. text then
		sortkey = false
	end

	if args or args or args or args or args or args or args or args or args or args or args then
		result = result .. "\n\n" .. hf .. "===Etymology===" .. hf .. "\n"
		if args then
			result = result .. "{{waei|" .. args .. "|" .. args
			we_count = 3
			while args do
				result = result .. "|" .. args
				we_count = we_count + 1
			end
			result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			if args then
				result = result .. ", {{cal|ryu|nocap=y|" .. (args or "en") .. (args and "|" .. args or "") .. (args and "|tr=" .. args or "") .. (args and "||" .. args or "") .. (args and "|lit=" .. args or "") .. (args and "|pos=" .. args or "") .. (args and "|g=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			end
			if args then
				result = result .. ", equivalent to {{pre|ryu|" .. args .. "|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t1=" .. args or "") .. (args and "|t2=" .. args or "") .. (args and "|sort=" .. args or "") .. "}}"
			elseif args then
				result = result .. ", equivalent to {{suf|ryu|" .. args .. "|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t1=" .. args or "") .. (args and "|t2=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			elseif args then
				result = result .. ", equivalent to {{af|ryu|" .. args .. (args and "|alt1=" .. args or "") .. (args and "|tr1=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|t1=" .. args or "") .. "|" .. args .. (args and "|alt2=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t2=" .. args or "")
				co_count = 3
				while args do
					result = result .. "|" .. args .. (args and "|alt" .. co_count .. "=" .. args or "") .. (args and "|tr" .. co_count .. "=" .. args or "") .. (args and "|pos" .. co_count .. "=" .. args or "") .. (args and "|t" .. co_count .. "=" .. args or "")
					co_count = co_count + 1
				end
				result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			elseif args then
				result = result .. ", equivalent to a {{blend|ryu|nocap=y|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|t1=" .. args or "") .. "|" .. args .. (args and "|tr2=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t2=" .. args or "")
				bl_count = 3
				while args do
					result = result .. "|" .. args .. (args and "|tr" .. bl_count .. "=" .. args or "") .. (args and "|pos" .. bl_count .. "=" .. args or "") .. (args and "|t" .. bl_count .. "=" .. args or "")
					bl_count = bl_count + 1
				end
				result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			end
		elseif args then
			result = result .. "{{yoji|" .. args .. "|" .. args .. (args and "|" .. args or "") .. (args and "|" .. args or "") .. (args and "|tr1=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|tr3=" .. args or "") .. (args and "|tr4=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|pos3=" .. args or "") .. (args and "|pos4=" .. args or "") .. (args and "|t1=" .. args or "") .. (args and "|t2=" .. args or "") .. (args and "|t3=" .. args or "") .. (args and "|t4=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
		elseif args then
			result = result .. "{{cal|ryu|" .. (args or "en") .. (args and "|" .. args or "") .. (args and "|tr=" .. args or "") .. (args and "||" .. args or "") .. (args and "|lit=" .. args or "") .. (args and "|pos=" .. args or "") .. (args and "|g=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			if args then
				result = result .. ", equivalent to {{pre|ryu|" .. args .. "|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t1=" .. args or "") .. (args and "|t2=" .. args or "") .. (args and "|sort=" .. args or "") .. "}}"
			elseif args then
				result = result .. ", equivalent to {{suf|ryu|" .. args .. "|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t1=" .. args or "") .. (args and "|t2=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			elseif args then
				result = result .. ", equivalent to {{af|ryu|" .. args .. (args and "|alt1=" .. args or "") .. (args and "|tr1=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|t1=" .. args or "") .. "|" .. args .. (args and "|alt2=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t2=" .. args or "")
				co_count = 3
				while args do
					result = result .. "|" .. args .. (args and "|alt" .. co_count .. "=" .. args or "") .. (args and "|tr" .. co_count .. "=" .. args or "") .. (args and "|pos" .. co_count .. "=" .. args or "") .. (args and "|t" .. co_count .. "=" .. args or "")
					co_count = co_count + 1
				end
				result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			elseif args then
				result = result .. ", equivalent to a {{blend|ryu|nocap=y|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|t1=" .. args or "") .. "|" .. args .. (args and "|tr2=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t2=" .. args or "")
				bl_count = 3
				while args do
					result = result .. "|" .. args .. (args and "|tr" .. bl_count .. "=" .. args or "") .. (args and "|pos" .. bl_count .. "=" .. args or "") .. (args and "|t" .. bl_count .. "=" .. args or "")
					bl_count = bl_count + 1
				end
				result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
			end
		elseif args then
			result = result .. "From {{pre|ryu|" .. args .. "|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t1=" .. args or "") .. (args and "|t2=" .. args or "") .. (args and "|sort=" .. args or "") .. "}}"
		elseif args then
			result = result .. "From {{suf|ryu|" .. args .. "|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t1=" .. args or "") .. (args and "|t2=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
		elseif args then
			result = result .. "From {{af|ryu|" .. args .. (args and "|alt1=" .. args or "") .. (args and "|tr1=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|t1=" .. args or "") .. "|" .. args .. (args and "|alt2=" .. args or "") .. (args and "|tr2=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t2=" .. args or "")
			co_count = 3
			while args do
				result = result .. "|" .. args .. (args and "|alt" .. co_count .. "=" .. args or "") .. (args and "|tr" .. co_count .. "=" .. args or "") .. (args and "|pos" .. co_count .. "=" .. args or "") .. (args and "|t" .. co_count .. "=" .. args or "")
				co_count = co_count + 1
			end
			result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
		elseif args then
			result = result .. "{{blend|ryu|" .. args .. (args and "|tr1=" .. args or "") .. (args and "|pos1=" .. args or "") .. (args and "|t1=" .. args or "") .. "|" .. args .. (args and "|tr2=" .. args or "") .. (args and "|pos2=" .. args or "") .. (args and "|t2=" .. args or "")
			bl_count = 3
			while args do
				result = result .. "|" .. args .. (args and "|tr" .. bl_count .. "=" .. args or "") .. (args and "|pos" .. bl_count .. "=" .. args or "") .. (args and "|t" .. bl_count .. "=" .. args or "")
				bl_count = bl_count + 1
			end
			result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
		elseif args then
			result = result .. "From {{bor|ryu|" .. (args or "en") .. (args and "|" .. args or "") .. (args and "|tr=" .. args or "") .. (args and "||" .. args or "") .. (args and "|lit=" .. args or "") .. (args and "|pos=" .. args or "") .. (args and "|g=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
		elseif args then
			result = result .. "{{lbor|ryu|" .. (args or "grc") .. (args and "|" .. args or "") .. (args and "|tr=" .. args or "") .. (args and "||" .. args or "") .. (args and "|lit=" .. args or "") .. (args and "|pos=" .. args or "") .. (args and "|g=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
		else
			result = result .. (args or
				("From {{der|ryu|" .. (args or "en") .. (args and "|" .. args or "") .. (args and "|tr=" .. args or "") .. (args and "||" .. args or "") .. (args and "|lit=" .. args or "") .. (args and "|pos=" .. args or "") .. (args and "|g=" .. args or "") .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"))
		end
		result = result .. (args and args or "")
	end

	if not args then
		result = result .. "\n\n" .. hf .. "===Pronunciation===" .. hf .. "\n{{ryu-pron" .. (args ~= "" and "|" .. gsub(text, '%^', '') or "")
		if args == "n" or yomi == "n" then
			result = result .. ""
		elseif args and args ~= "n" then
			result = result .. "|y=" .. args
		elseif yomi then
			if yomi == "irr" then
			result = result .. "|y=i"
			else
				result = result .. "|y=" .. yomi
			end
		end
		result = result .. (args and "|acc=" .. args or "") .. (args and "|acc_ref=" .. args or "")
		acc_count = 2
		while args do
			result = result .. "|acc" .. acc_count .. "=" .. args .. (args and "|acc" .. acc_count .. "_ref=" .. args or "")
			acc_count = acc_count + 1
		end
		result = result .. (args and "|dev=" .. args or "") .. (args and "|devm=" .. args or "") .. "}}"
		if args then
			if yomi and not (yomi == "n" or y == "n") then
				result = result .. "\n** "
			else
				result = result .. "\n* "
			end
			result = result .. (args and "{{hmp|ryu|" .. args or "")
			hmp_count = 2
			while args do
				result = result .. "|" .. args
				hmp_count = hmp_count + 1
			end
			result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
		end
	end

	local pos = args ~= "" and args or "n"
	local pos_table = {
		 = { "Noun", "noun", true },
		 = { "Noun", "noun", true },
		 = { "Noun", "noun", true, "Verb", "verb-suru" },
		 = { "Noun", "noun", true },
		 = { "Noun", "noun", true, "Verb", "verb-suru" },
		 = { "Adjective", "adj", true, "Noun", "noun" },
		 = { "Adjective", "adj", true, "Noun", "noun" },
		 = { "Verb", "verb", true },
		 = { "Verb", "verb", true },
		 = { "Verb", "verb form", true },
		 = { "Verb", "verb form", true },
		 = { "Adjective", "adj", true },
		 = { "Adjective", "adj", true },
		 = { "Adjective", "adj", true },
		 = { "Adverb", "adverb", false },
		 = { "Adverb", "adverb", false },
		 = { "Adverb", "adverb", false, "Verb", "verb-suru" },
		 = { "Pronoun", "pronoun", false },
		 = { "Pronoun", "pronoun", false },
		 = { "Proper noun", "proper", false },
		 = { "Proper noun", "proper", false },
		 = { "Proper noun", "proper", false },
		 = { "Proper noun", "proper", false },
		 = { "Phrase", "phrase", true },
		 = { "Phrase", "phrase", true },
		 = { "Interjection", "interjection", false },
		 = { "Interjection", "interjection", false },
		 = { "Conjunction", "conjunction", false },
		 = { "Particle", "particle", false },
		 = { "Preposition", "preposition", false },
		 = { "Suffix", "suffix", false },
		 = { "Suffix", "suffix", false },
		 = { "Prefix", "prefix", false },
		 = { "Prefix", "prefix", false },
		 = { "Proverb", "proverb", false },
		 = { "Idiom", "idiom", false },
		 = { "Idiom", "idiom", false },
		 = { "Adnominal", "adnominal", false },
		 = { "Adnominal", "adnominal", false },
	}

	result = result .. "\n\n" .. hf .. "===" .. pos_table .. "===" .. hf .. "\n{{ryu-" .. 
		(not pos_table and "pos|" or "") .. pos_table ..
		(args ~= "" and "|" .. text or "") .. 
		(args and "|head=" .. args or "") ..
		(args and "|count=" .. args or "") .. 
		(args and "|kyu=" .. args or "") .. 
		(args and "|shin=" .. args or "") .. 
		(args and "|" .. waapuro_r_to_kana(args) or "") .. 
		(args and "|" .. waapuro_r_to_kana(args) or "") .. 
		(args and "|" .. waapuro_r_to_kana(args) or "") .. 
		(args and "|rom=" .. args or "") .. 
		(args and "|hhira=" .. waapuro_r_to_kana(args) or "") .. 
		(args and "|hkata=" .. waapuro_r_to_kana(args) or "")

	if pos_table == "Adjective" then
		result = result .. "|infl=" .. (args and args or "na")
	end

	result = result .. (args and "|type=" .. args or "") .. (args and "|tr=" .. args or "") .. "}}"
	result = result .. "\n\n# " .. (args or "{{rfdef|ryu}}")

	if args then
		result = result .. "\n#" .. args
	end
	eg_count = 2
	while args do
		result = result .. "\n#" .. args
		eg_count = eg_count + 1
	end

	if pos_table == "Adjective" then
		result = result .. "\n\n" .. hf .. "====Inflection====" .. hf .. "\n"
		if args == "san" or args == "さん" then
			result = result .. "{{ryu-san" .. (args ~= "" and "|" .. sub(text, 1, -2) or "") .. "}}"
		else
			result = result .. "{{ryu-na" .. (args ~= "" and "|" .. text or "") .. "}}"
		end
	end

	if pos_table == "verb" then
		result = result .. "\n\n" .. hf .. "====Conjugation====" .. hf .. "\n{{ryu-"
		penul, cons = text, text
		penul, cons = sub(penul, -2, -2), sub(cons, -1, -1)
		penul, cons = export.hira_to_kata(penul), export.hira_to_kata(cons)
		penul, cons = gsub(penul, ".", data.kr), gsub(cons, ".", data.kr)
		penul, cons = sub(penul, -1, -1), sub(cons, 1, 1)
		if cons == "u" then
			cons = ""
		elseif cons == "c" then
			cons = "ts"
		end
		if args == "2" then
			result = result .. "ichi"
		else
			result = result .. "go-" .. cons .. "u"
		end

		result = result .. (args ~= "" and "|" .. sub(text, 1, -2) or "") .. "}}"
	end

	if pos_table and args ~= "" then
		result = result .. "\n\n" .. hf .. "===" .. pos_table .. "===" .. hf .. "\n{{ryu-" .. pos_table .. (args ~= "" and "|" .. text or "") ..
			(args and "|head=" .. args or "") ..
			(args and "|count=" .. args or "") .. 
			(args and "|kyu=" .. args or "") .. 
			(args and "|shin=" .. args or "") .. 
			(args and "|" .. waapuro_r_to_kana(args) or "") .. 
			(args and "|" .. waapuro_r_to_kana(args) or "") .. 
			(args and "|" .. waapuro_r_to_kana(args) or "") .. 
			(args and "|rom=" .. args or "") .. 
			(args and "|hhira=" .. waapuro_r_to_kana(args) or "") .. 
			(args and "|hkata=" .. waapuro_r_to_kana(args) or "") ..
			(args and "|type=" .. args or "") .. (args and "|tr=" .. args or "") .. "}}\n\n# " .. (args or "{{rfdef|ryu}}")

		if pos_table == "Verb" then
			result = result .. "\n\n" .. hf .. "====Conjugation====" .. hf .. "\n{{ryu-sun" .. (args ~= "" and "|" .. text or "") .. "}}"
		end
	end

	if args then
		result = result .. "\n\n" .. hf .. "====Usage notes====" .. hf .. "\n* " .. args
	end

	result = result .. other("syn", "=Synonyms=", args)
	result = result .. other("ant", "=Antonyms=", args)
	result = result .. other("der", "=Derived terms=", args)
	result = result .. other("rel", "=Related terms=", args)

	if args or args or args or args then
		result = result .. "\n\n" .. hf .. "===Descendants===" .. hf .. "\n" .. (args and "* {{desc|zh|" .. args .. (args and "|bor=y" or "") .. (args and "|der=y" or "") .. (args and "|clq=y" or "") .. "}}" or "")
		if args then
			if args or args or args then
				result = result .. "\n"
			end
		end
		result = result .. (args and "* {{desc|en|" .. args .. (args and "|bor=y" or "") .. (args and "|der=y" or "") .. (args and "|clq=y" or "") .. "}}" or "")
		if args then
			if args or args then
				result = result .. "\n"
			end
		end
		result = result .. (args and "* {{desc|ko|" .. args .. (args and "|bor=y" or "") .. (args and "|der=y" or "") .. (args and "|clq=y" or "") .. "}}" or "")
		if args then
			if args then
				result = result .. "\n"
			end
		end
		result = result .. (args and "* {{desc|vi|" .. args .. (args and "|bor=y" or "") .. (args and "|der=y" or "") .. (args and "|clq=y" or "") .. "}}" or "")
	end
	result = result .. other("ana", "Anagrams", args)
	result = result .. other("also", "See also", args)

	if args or args then
		result = result .. "\n\n===References===\n<references/>"
	end

	if args then
		result = result .. "\n\n{{cln|ryu|" .. args
	cn_count = 2
	while args do
		result = result .. "|" .. args
		cn_count = cn_count + 1
	end
		result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
	end
	if args then
		result = result .. (args and "\n" or "\n\n") .. "{{top|ryu|" .. args
	ct_count = 2
	while args do
		result = result .. "|" .. args
		ct_count = ct_count + 1
	end
		result = result .. (args and "" or args and "|sort=" .. args or sortkey or "") .. "}}"
	end

	return result
end

return export