Bước tới nội dung

Mô đun:ckb-translit

Từ điển mở Wiktionary

Mô đun này có chức năng chuyển tự văn bản Tiếng Soran. Nó cũng được sử dụng để phiên âm tiếng Gorantiếng Kurmanji. Lưu ý, không nên gọi mô đun này trực tiếp trong các bản mẫu hoặc mô đun khác. Để sử dụng trong một bản mẫu, hãy dùng {{xlit}}. Còn trong một mô đun, hãy dùng Mô đun:languages#Language:transliterate.

Đối với trường hợp kiểm thử, xem Module:ckb-translit/testcases.

Chức năng

[sửa]
tr(text, lang, sc)
Chuyển tự một text (văn bản) được đưa ra và viết bằng chữ viết được xác định bởi mã sc, và ngôn ngữ được xác định bởi mã lang.
Nếu chuyển tự thất bại, nó sẽ gọi giá trị nil.
-- Authors: JavaScript ئاسۆ; Lua Ghybu, Calak

local export = {}

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

local find = m_str_utils.find
local gsub = m_str_utils.gsub
local sub = m_str_utils.sub
local U = m_str_utils.char

local mapping = {
	["ا"] = "a", ["ب"] = "b", ["چ"] = "ç", ["ج"] = "c", ["د"] = "d", ["ە"] = "e", ["ێ"] = "ê", ["ف"] = "f", ["گ"] = "g",
	["ھ"] = "h", ["ه"] = "h", ["ح"] = "ḧ", ["ژ"] = "j", ["ک"] = "k", ["ڵ"] = "ll", ["ل"] = "l", ["م"] = "m", ["ن"] = "n",
	["ۆ"] = "o", ["پ"] = "p", ["ق"] = "q", ["ر"] = "r", ["ڕ"] = "r", ["س"] = "s", ["ش"] = "ş", ["ت"] = "t", ["ڤ"] = "v",
	["خ"] = "x", ["غ"] = "ẍ", ["ز"] = "z", ["ئ"] = "", ["ع"] = "'",
	
	[U(0x200C)] = "", -- ZWNJ (zero-width non-joiner)
	["ـ"] = "", -- kashida, no sound
	
	-- numerals
    ["١"] = "1", ["٢"] = "2", ["٣"] = "3", ["٤"] = "4", ["٥"] = "5",
	["٦"] = "6", ["٧"] = "7", ["٨"] = "8", ["٩"] = "9", ["٠"] = "0",
	-- persian variants to numerals
	["۱"] = "1", ["۲"] = "2", ["۳"] = "3", ["۴"] = "4", ["۵"] = "5",
	["۶"] = "6", ["۷"] = "7", ["۸"] = "8", ["۹"] = "9", ["۰"] = "0",
}

	-- punctuation (leave on separate lines)
local punctuation = {
	["؟"] = "?", -- question mark
	["،"] = ",", -- comma
	["؛"] = ";", -- semicolon
	["«"] = '“', -- quotation mark
	["»"] = '”', -- quotation mark
	["٪"] = "%", -- percent
	["؉"] = "‰", -- per mille
	["٫"] = ".", -- decimals
	["٬"] = ",", -- thousand
}

-- translit
local function tr_word(word)
	
    word = gsub(word, '.', punctuation)
		
	--Remove punctuation at the end of the word.
	local ponct
	if find(word, '[%.%!،؛»«٪؉٫٬%p]$') then
	   ponct =  sub(word, -1)
	   word = gsub(word, '[%.%!،؛»«٪؉٫٬%p]$', '')
	else
	   word = word
	   ponct = ''
	end
	
	word = gsub(word, 'ه‌', "ە") --correct unicode for letter ە
	-- U+0647 (Arabic letter heh) + U+200C (zero-width non-joiner)
	-- ↓
	-- U+06D5 (Arabic letter ae)
	
	-- diacritics
	word = gsub(word, 'ْ', "i") -- U+0652, Arabic sukun
	word = gsub(word, 'ِ', "i") -- U+0650, Arabic kasra
	 
	--managing 'و' and 'ی'
	word = gsub(word, 'و([iاێۆە])', "w%1") --و + vowel => w (e.g. wan)
	word = gsub(word, 'ی([iاێۆە])', "y%1") --ی + vowel => y (e.g. yas)
	word = gsub(word, '([iاێۆە])و', "%1w") --vowel + و => w (e.g. kew)
	word = gsub(word, '([iاێۆە])ی', "%1y") --vowel + ی => y (e.g. bey)
	word = gsub(word, '^و$', "û") --non-letter + 'و' + non-letter => û (=and)
	word = gsub(word, '([^ء-يٱ-ەiwy])و', "%1w") --non-letter + 'و' => w (e.g. wtar)

	word = gsub(word, '^و', "w") --first 'و' => w (e.g. wtar)
	word = gsub(word, 'یو', "îw") --'ی' + 'و' => îw (e.g. nîw)
	word = gsub(word, '([^و])یی', "%1îy") --'ی' + 'ی' => îy (e.g. kanîy)
	word = gsub(word, 'وی', "uy") --'و' + 'ی' => uy (e.g. buyn)
	word = gsub(word, 'وو', "û") --'و' + 'و' => û (e.g. bû)
	word = gsub(word, 'ی', "î")
	word = gsub(word, 'و', "u")
	word = gsub(word, 'uu', "û") --'و' + 'و' => û (e.g. bû)
	word = gsub(word, '([ء-يٱ-ەiîuûwy])ڕ', "%1rr") --when 'ڕ' not at the beginning of a word => rr
	word = gsub(word, '([ء-يٱ-ەiîuûwy])ئ', "%1'") --when 'ئ' not at the beginning of a word => '
	
	word = gsub(word, '.', mapping)
	
	--insert i where applicable
	word = gsub(word, 'll', "Ľ") -- temporary conversion to avoid seeing ll as 2 letters
	word = gsub(word, 'rr', "Ŕ") -- temporary conversion to avoid seeing rr as 2 letters
	
	word = gsub(word, '([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([fjlĽmnrŔsşvwxẍyz])([fjlĽmnrŔsşvwxẍyz])([^aeêiîouûy])', "%1%2i%3%4") --e.g. grft -> grift
	word = gsub(word, '([aeêiîouû])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])$', "%1%2%3i%4") --e.g. cejnt -> cejnit
	word = gsub(word, '([fjlĽrŔsşwyz])([fjlĽmnrŔsşvwxẍyz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])', "%1i%2%3") --e.g. wrd -> wird
	
	word = gsub(word, '([bcçdghḧkmnpqtvxẍ])([fjlĽmnrŔsşvwxẍyz])([^aeêiîouû])', "%1i%2%3") --e.g. prd -> pird
	word = gsub(word, '([bcçdghḧkmnpqtvxẍ])([fjlĽmnrŔsşvwxẍyz])$', "%1i%2") --like above
	
	word = gsub(word, '([^aeêiîouû])([bcçdghḧkmnpqtvxẍ])([fjlĽmnrŔsşvwxẍyz])([^aeêiîouû])', "%1%2i%3%4") --repeat the latter expression, in case skipped
	word = gsub(word, '([^aeêiîouû])([bcçdghḧkmnpqtvxẍ])([fjlĽmnrŔsşvwxẍyz])$', "%1%2i%3") --repeat the latter expression, in case skipped

	word = gsub(word, '^([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([^aeêiîouû])', "%1i%2%3") --e.g. ktk -> kitk
	word = gsub(word, '^([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])$', "%1i%2") --e.g. ktk -> kitk
	word = gsub(word, '([^aeêiîouy])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([^aeêiîouû])', "%1%2i%3%4") --e.g. ktk -> kitk
	word = gsub(word, '([^aeêiîouy])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])$', "%1%2i%3") --e.g. ktk -> kitk

	word = gsub(word, '([^a-zçşêîûĽŔ])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])$', "%1%2i") --e.g. j -> ji
	word = gsub(word, '^([bcçdfghḧjklĽmnpqrŔsştvwxẍz])$', "%1i") --e.g. j -> ji	


	--word = gsub(word, '([^a-zêîûçş0-9\'’])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvxẍz])', "%1%2i%3") --e.g. bra -> bira
	--word = gsub(word, '^([bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvxẍz])', "%1i%2") --e.g. bra -> bira

	--word = gsub(word, '([bcçdfghḧjklmnpqrsştvwxẍz][bcçdfghḧjklĽmnpqrŔsştvwxẍz])([bcçdfghḧjklĽmnpqrŔsştvwxẍz])', "%1i%2") --e.g. aşkra -> aşkira
	
	--word = gsub(word, 'si([tp][aeêiîouû])', "s%1") -- sp, st cluster
	
	word = gsub(word, 'Ľ', "ll") --revert the temporary conversion
	word = gsub(word, 'Ŕ', "rr") --revert the temporary conversion

    -- Add the punctuation who had previously deleted.
    word = word .. ponct
    
	return word
end

function export.tr(text, lang, sc)
    local textTab = {}
    
    -- Create a word table separated by a space (%s).
	for _, word in ipairs(mw.text.split(text, '%s+')) do
		table.insert(textTab, word)
	end
	
	-- Tablo of translit.
	for key, word in ipairs(textTab) do
		textTab[key] = tr_word(word)
	end

	return table.concat(textTab, ' ')
end

return export