Module:Kana

From blackwiki
Jump to navigation Jump to search
-- This module converts between Japanese hiragana and katakana

local kanaData = mw.loadData('Module:Kana/data')
local p = {}

local function makeSingleCharConversionTable(inputKey, outputKey)
	local ret = {}
	for i, singleCharData in ipairs(kanaData.singleChars) do
		ret[singleCharData[inputKey]] = singleCharData[outputKey]
	end
	return ret
end

local function convertString(s, inputKey, outputKey)
	-- Convert double chars
	for i, doubleCharData in ipairs(kanaData.doubleChars) do
		s = mw.ustring.gsub(s, doubleCharData[inputKey], doubleCharData[outputKey])
	end

	-- Convert single chars
	s = mw.ustring.gsub(s, '.', makeSingleCharConversionTable(inputKey, outputKey))

	return s
end

local function cleanUpRomaji(s)
	-- Format long vowels the Hepburn way
	s = s:gsub('aa', 'ā')
	s = s:gsub('o[ou]', 'ō')
	s = s:gsub('uu', 'ū')
	s = s:gsub('ii', 'ī')

	-- Fix small tsu before consonants that aren't "t"
	s = s:gsub('t([kgsjdfhbpmnry])', '%1%1')
	s = s:gsub('ssu', 'tsu') -- Special case for "tsu" which became "ssu" on the line above

	-- Convert full-width spaces to half-width
	s = s:gsub(' ', ' ')

	return s
end

function p._htok(s)
	return convertString(s, 'hiragana', 'katakana')
end

function p._ktoh(s)
	return convertString(s, 'katakana', 'hiragana')
end

function p._htor(s)
	s = convertString(s, 'hiragana', 'romaji')
	return cleanUpRomaji(s)
end

function p._ktor(s)
	s = convertString(s, 'katakana', 'romaji')
	return cleanUpRomaji(s)
end

return setmetatable(p, {
	__index = function (t, key)
		return function (frame)
			local args = require('Module:Arguments').getArgs(frame, {
				wrappers = 'Template:Kana',
			})
			return p['_' .. key](args[1])
		end
	end
})