From 34c71b4c3d5667062852c0add835a73624b862a9 Mon Sep 17 00:00:00 2001 From: Bapham12 Date: Sat, 31 Oct 2026 00:04:22 +0700 Subject: [PATCH] =?UTF-8?q?Thay=20=C4=91=E1=BB=95i=20m=E1=BB=99t=20s?= =?UTF-8?q?=E1=BB=91=20th=E1=BB=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lua banner/main.lua | 11 +- Other/Pinyin.lua | 234 +++++++++++++++++++++++++++++++++++++++++++ Testcases/Pinyin.lua | 15 +++ 3 files changed, 257 insertions(+), 3 deletions(-) create mode 100644 Other/Pinyin.lua create mode 100644 Testcases/Pinyin.lua diff --git a/Lua banner/main.lua b/Lua banner/main.lua index fd4ff25..dc62b8d 100644 --- a/Lua banner/main.lua +++ b/Lua banner/main.lua @@ -3,9 +3,14 @@ local yesno = require('Module:Yesno') local mList = require('Module:List') local mTableTools = require('Module:TableTools') local mMessageBox = require('Module:Message box') +local TNT = require('Module:TNT') local p = {} +local function format(msg) + return TNT.format('I18n/Lua banner', msg) +end + function p.main(frame) local origArgs = frame:getParent().args local args = {} @@ -28,7 +33,7 @@ end function p.renderBox(modules) local boxArgs = {} if #modules < 1 then - boxArgs.text = 'Error: no modules specified' + boxArgs.text = string.format('%s', format('error_emptylist')) else local moduleLinks = {} for i, module in ipairs(modules) do @@ -44,9 +49,9 @@ function p.renderBox(modules) title = title.basePageTitle end if title.contentModel == "Scribunto" then - boxArgs.text = 'This module depends on the following other modules:' .. moduleList + boxArgs.text = format('module-header') .. '\n' .. moduleList else - boxArgs.text = 'This template uses [[BKDatabase:Lua|Lua]]:\n' .. moduleList + boxArgs.text = format('header') .. '\n' .. moduleList end end boxArgs.type = 'notice' diff --git a/Other/Pinyin.lua b/Other/Pinyin.lua new file mode 100644 index 0000000..8136448 --- /dev/null +++ b/Other/Pinyin.lua @@ -0,0 +1,234 @@ +local p = {} + +local function remove_links_and_markup(text) + -- these either are unnecessary or interfere with assimilation + + -- remove bold/italic + -- it is not impossible to allow bold/italic when it does not interfere with assimilation, but determining when to allow or disallow that adds complication for little practical gain + text = gsub(text, "'''", "") + text = gsub(text, "''", "") + + -- remove HTML tags (except br) + text = gsub(text, "<[Bb][Rr] */?>", " ") + text = gsub(text, "]->", "") + text = gsub(text, " ", "
") + + -- remove wikilinks + text = gsub(text, "%[%[[^%|]+%|(..-)%]%]", "%1") + text = gsub(gsub(text, "%[%[", ""), "%]%]", "") + + text = mw.text.killMarkers(text) + + return text +end + +function attachTone(a, n) + n = tonumber(n) + if a == "a" then + if n == 1 then return "ā" end + if n == 2 then return "á" end + if n == 3 then return "ǎ" end + if n == 4 then return "à" end + return a + + end + + if a == "A" then + if n == 1 then return "Ā" end + if n == 2 then return "Á" end + if n == 3 then return "Ǎ" end + if n == 4 then return "À" end + return a + + end + + if a == "e" then + if n == 1 then return "ē" end + if n == 2 then return "é" end + if n == 3 then return "ě" end + if n == 4 then return "è" end + return a + + end + + if a == "E" then + if n == 1 then return "Ē" end + if n == 2 then return "É" end + if n == 3 then return "Ě" end + if n == 4 then return "È" end + return a + + end + + if a == "i" then + if n == 1 then return "ī" end + if n == 2 then return "í" end + if n == 3 then return "ǐ" end + if n == 4 then return "ì" end + return a + + end + + if a == "O" then + if n == 1 then return "Ō" end + if n == 2 then return "Ó" end + if n == 3 then return "Ŏ" end + if n == 4 then return "Ò" end + return a + + end + + if a == "o" then + if n == 1 then return "ō" end + if n == 2 then return "ó" end + if n == 3 then return "ǒ" end + if n == 4 then return "ò" end + return a + + end + + if a == "u" then + if n == 1 then return "ū" end + if n == 2 then return "ú" end + if n == 3 then return "ǔ" end + if n == 4 then return "ù" end + return a + + end + + if (a == "v") or (a == "ü") then + if n == 1 then return "ǖ" end + if n == 2 then return "ǘ" end + if n == 3 then return "ǚ" end + if n == 4 then return "ǜ" end + return "ü" + + end + + if a == "Ê" then + if n == 1 then return "Ê̄" end + if n == 2 then return "Ế" end + if n == 3 then return "Ê̌" end + if n == 4 then return "Ề" end + return a + + end + + if a == "ê" then + if n == 1 then return "ê̄" end + if n == 2 then return "ế" end + if n == 3 then return "ê̌" end + if n == 4 then return "ề" end + return a + + end + + if a == "N" then + if n == 2 then return "Ń" end + if n == 3 then return "Ň" end + if n == 4 then return "Ǹ" end + return a + + end + if a == "n" then + if n == 2 then return "ń" end + if n == 3 then return "ň" end + if n == 4 then return "ǹ" end + return a + end + + if a == "M" then + if n == 2 then return "Ḿ" end + if n == 4 then return "M̀" end + return a + end + if a == "m" then + if n == 2 then return "ḿ" end + if n == 4 then return "m̀" end + return a + end + + return a + +end + + +function selectVowel(chara, n) + + if not chara then + return + end + + if chara:find('^.*A') then + return chara:gsub("A", attachTone("A", n)) + end + if chara:find('^.*a') then + return chara:gsub("a", attachTone("a", n)) + end + + if chara:find('^.*E') then + return chara:gsub("E", attachTone("E", n)) + end + if chara:find('^.*e') then + return chara:gsub("e", attachTone("e", n)) + end + + if chara:find('^.*Ê') then + return chara:gsub("Ê", attachTone("Ê", n)) + end + if chara:find('^.*ê') then + return chara:gsub("ê", attachTone("ê", n)) + end + + if chara:find('^.*iu') then + return chara:gsub("iu", "i"..attachTone("u", n)) + end + if chara:find('^.*i') then + return chara:gsub("i", attachTone("i", n)) + end + + if chara:find('^.*O') then + return chara:gsub("O", attachTone("O", n)) + end + if chara:find('^.*o') then + return chara:gsub("o", attachTone("o", n)) + end + + if chara:find('^.*u') then + return chara:gsub("u", attachTone("u", n)) + end + + if chara:find('^.*v') then + return chara:gsub("v", attachTone("v", n)) + end + if chara:find('^.*ü') then + return chara:gsub("ü", attachTone("ü", n)) + end + + if chara:find('^.*N') then + return chara:gsub("N", attachTone("N", n)) + end + if chara:find('^.*n') then + return chara:gsub("n", attachTone("n", n)) + end + + if chara:find('^.*M') then + return chara:gsub("M", attachTone("M", n)) + end + if chara:find('^.*m') then + return chara:gsub("m", attachTone("m", n)) + end +end + +function p.pinyin(frame) + local input = frame.args[1] + if not input then + return + end + local ve = input:gsub("nue", "nve"):gsub("lue", "lve") + local out = ve:gsub("([%aüÊê]+)(%d)", selectVowel) + return (out:gsub("v", "ü")) +end + + +return p diff --git a/Testcases/Pinyin.lua b/Testcases/Pinyin.lua new file mode 100644 index 0000000..ad363a2 --- /dev/null +++ b/Testcases/Pinyin.lua @@ -0,0 +1,15 @@ +-- Click talk page to run tests. +local p = require('Module:UnitTests') + +function p:test_pinyin() + self:preprocess_equals('{{#invoke:Pinyin|pinyin}}', '') + self:preprocess_equals('{{#invoke:Pinyin|pinyin|Wan4li2 Chang2cheng2}}', 'Wànlí Chángchéng') + self:preprocess_equals('{{#invoke:Pinyin|pinyin|She4 Diao1 yingxiongzhuan4}}', 'Shè Diāo yingxiongzhuàn') + self:preprocess_equals('{{#invoke:Pinyin|pinyin|Ai4 Dao3 Mo2 Shi4}}', 'Ài Dǎo Mó Shì') + self:preprocess_equals('{{#invoke:Pinyin|pinyin|Lü3 Bu4wei}}', 'Lǚ Bùwei') + self:preprocess_equals('{{#invoke:Pinyin|pinyin|Gong1lve4}}', 'Gōnglüè') + self:preprocess_equals('{{#invoke:Pinyin|pinyin|Xiu1ru3}}', 'Xiūrǔ') + self:preprocess_equals('{{#invoke:Pinyin|pinyin|M4 m2 ng2 N3 Ê2 ê3}}', 'M̀ ḿ ńg Ň Ế ê̌') +end + +return p