Difference between revisions of "Module:Hangul"

From blackwiki
Jump to navigation Jump to search
blackwiki>Erutuon
(add names of Korean jamo in headers)
blackwiki>Erutuon
(combine the two functions)
Line 17: Line 17:
 
end
 
end
  
---- From [[wikt:Module:Unicode data]].
+
----
  
 
local tocodepoint = mw.ustring.codepoint
 
local tocodepoint = mw.ustring.codepoint
-- Cheaper to derive names from decomposed form of syllable?
 
local function get_syllable_name(syllable)
 
local li, vi, ti = syllableIndex2JamoIndices(tocodepoint(syllable) - 0xAC00)
 
 
return ("HANGUL SYLLABLE %s%s%s"):format(
 
data.leads[li], data.vowels[vi], data.trails[ti])
 
end
 
 
----
 
  
 
local function indexof(arr, val)
 
local function indexof(arr, val)
Line 39: Line 30:
 
end
 
end
  
local function tag(text)
+
local function get_name(char)
return '<span lang="ko">' .. text .. '</span>'
+
local codepoint = tocodepoint(char)
end
+
 
+
-- Hangul Compatibility Jamo block
-- Get name for character in Hangul Compatibility Jamo block.
+
if 0x3130 <= codepoint and codepoint <= 0x318F then
local function get_jamo_name(char)
+
return 'HANGUL LETTER ' .. data.names[codepoint - 0x3130]
return 'HANGUL LETTER ' .. data.names[tocodepoint(char) - 0x3130]
+
 +
-- Hangul Syllables block
 +
-- From [[wikt:Module:Unicode data]].
 +
-- Cheaper to derive names from decomposed form of syllable?
 +
elseif 0xAC00 <= codepoint and codepoint <= 0xD7A3 then
 +
local li, vi, ti = syllableIndex2JamoIndices(codepoint - 0xAC00)
 +
return ("HANGUL SYLLABLE %s%s%s"):format(
 +
data.leads[li], data.vowels[vi], data.trails[ti])
 +
 +
else
 +
error(('No name for U+%X found.'):format(codepoint))
 +
end
 
end
 
end
  
Line 74: Line 76:
 
for _, final in ipairs(data.independent_finals) do
 
for _, final in ipairs(data.independent_finals) do
 
output.add(('! title="%s" | %s')
 
output.add(('! title="%s" | %s')
:format(final ~= '' and get_jamo_name(final) or '', final))
+
:format(final ~= '' and get_name(final) or '', final))
 
end
 
end
 
 
Line 81: Line 83:
 
local independent_medial = data.independent_medials[i]
 
local independent_medial = data.independent_medials[i]
 
output.add(('! scope="row" title="%s" | %s')
 
output.add(('! scope="row" title="%s" | %s')
:format(get_jamo_name(independent_medial), independent_medial))
+
:format(get_name(independent_medial), independent_medial))
 
for _, final in ipairs(data.finals) do
 
for _, final in ipairs(data.finals) do
 
output.add(('| %s%s%s'):format(initial, medial, final))
 
output.add(('| %s%s%s'):format(initial, medial, final))
Line 95: Line 97:
 
'[가-힣]', -- [[Hangul Syllables]] block (U+AC00-D7AF)
 
'[가-힣]', -- [[Hangul Syllables]] block (U+AC00-D7AF)
 
function (syllable)
 
function (syllable)
return ('title="%s" | %s'):format(get_syllable_name(syllable), syllable)
+
return ('title="%s" | %s'):format(get_name(syllable), syllable)
 
end)
 
end)
 
 
 
-- Tag all Korean characters.
 
-- Tag all Korean characters.
-- The pattern matches the UTF-8 encoding of the codepoint ranges
+
-- The pattern matches a single UTF-8-encoded character in the ranges
 
-- U+1000-1FFF, U+3000-3FFF, and U+A000-DFFF.
 
-- U+1000-1FFF, U+3000-3FFF, and U+A000-DFFF.
 
-- (See [[UTF-8#Codepage layout]].)
 
-- (See [[UTF-8#Codepage layout]].)
output = output:gsub('[\225\227\234-\237][\128-\191]+', tag)
+
output = output:gsub(
 +
'[\225\227\234-\237][\128-\191]+',
 +
function (text)
 +
return '<span lang="ko">' .. text .. '</span>'
 +
end)
 
 
 
-- Check for consecutive span tags.
 
-- Check for consecutive span tags.

Revision as of 02:59, 28 April 2018

Usage

Script error: The function "syllables_by_initial" does not exist. Script error: The function "TOC" does not exist.



local p = {}

local data = mw.loadData 'Module:Hangul/data'

---- From [[wikt:Module:ko-hangul]
 
-- Given the "syllable index" of a precomposed Hangul syllable (see
-- above), returns "indices" representing the three constituent jamo
-- ("lead", i.e. initial consonant; "vowel"; and "tail", i.e. final
-- consonant, except that zero denotes the absence of a final consonant).
local function syllableIndex2JamoIndices(syllableIndex)
    local lIndex = math.floor(syllableIndex / 588)
    local vIndex = math.floor((syllableIndex % 588) / 28)
    local tIndex = syllableIndex % 28
 
    return lIndex, vIndex, tIndex
end

----

local tocodepoint = mw.ustring.codepoint

local function indexof(arr, val)
	for i, v in ipairs(arr) do
		if v == val then
			return i
		end
	end
	return -1
end

local function get_name(char)
	local codepoint = tocodepoint(char)
	
	-- Hangul Compatibility Jamo block
	if 0x3130 <= codepoint and codepoint <= 0x318F then
		return 'HANGUL LETTER ' .. data.names[codepoint - 0x3130]
	
	-- Hangul Syllables block
	-- From [[wikt:Module:Unicode data]].
	-- Cheaper to derive names from decomposed form of syllable?
	elseif 0xAC00 <= codepoint and codepoint <= 0xD7A3 then
		local li, vi, ti = syllableIndex2JamoIndices(codepoint - 0xAC00)
		return ("HANGUL SYLLABLE %s%s%s"):format(
			data.leads[li], data.vowels[vi], data.trails[ti])
	
	else
		error(('No name for U+%X found.'):format(codepoint))
	end
end

function p.show(frame)
	local initial = frame.args[1] or 'ᄀ'
	local codepoint = mw.ustring.codepoint(initial)
	if not (0x1100 <= codepoint and codepoint <= 0x1112) then
		error('Incorrect initial ' .. initial .. '. Should be between U+1100 and U+1112.')
	end
	
	local output = {}
	local i = 0
	function output.add(text)
		i = i + 1
		output[i] = text
	end
	function output.row()
		output.add('|-\n')
	end
	
	output.add(
([[
{| class="wikitable collapsible collapsed" style="width: 96px; height: 96px;"
! colspan="29" | Initial&nbsp;%s
|-
! Final→<br>Medial↓]]):format(data.independent_initials[indexof(data.initials, initial)]))

	for _, final in ipairs(data.independent_finals) do
		output.add(('! title="%s" | %s')
			:format(final ~= '' and get_name(final) or '', final))
	end
	
	for i, medial in ipairs(data.medials) do
		output.row()
		local independent_medial = data.independent_medials[i]
		output.add(('! scope="row" title="%s" | %s')
			:format(get_name(independent_medial), independent_medial))
		for _, final in ipairs(data.finals) do
			output.add(('| %s%s%s'):format(initial, medial, final))
		end
	end
	
	output.add('|}')
	
	output = table.concat(output, '\n')
	output = mw.ustring.toNFC(output)
	output = mw.ustring.gsub( -- Add names of syllable codepoints.
		output,
		'[가-힣]', -- [[Hangul Syllables]] block (U+AC00-D7AF)
		function (syllable)
			return ('title="%s" | %s'):format(get_name(syllable), syllable)
		end)
	
	-- Tag all Korean characters.
	-- The pattern matches a single UTF-8-encoded character in the ranges
	-- U+1000-1FFF, U+3000-3FFF, and U+A000-DFFF.
	-- (See [[UTF-8#Codepage layout]].)
	output = output:gsub(
		'[\225\227\234-\237][\128-\191]+',
		function (text)
			return '<span lang="ko">' .. text .. '</span>'
		end)
	
	-- Check for consecutive span tags.
	-- output:gsub('<span[^>]+>[^<]*</span><span[^>]+>[^<]*</span>', mw.log)
	
	return output
end

return p