انتقل إلى المحتوى

وحدة:Lang-zh

من ويكيبيديا، الموسوعة الحرة
require('strict')

local p = {}

-- المقالات التي تسبق فيها الصينية التقليدية الصينية المبسطة
local t1st = {
    ["حادثة 228"] = true,
    ["التقويم الصيني"] = true,
    ["مركز ليبو (هونغ كونغ)"] = true,
    ["جمهورية الصين"] = true,
    ["جمهورية الصين في الألعاب الأولمبية الصيفية 1924"] = true,
    ["تايوان"] = true,
    ["جزيرة تايوان"] = true,
    ["مقاطعة تايوان"] = true,
    ["وي بويانغ"] = true,
}

-- تسميات كل جزء
local labels = {
    ["c"] = "بالصينية",
    ["s"] = "بالصينية المبسطة",
    ["t"] = "بالصينية التقليدية",
    ["p"] = "البينيين",
    ["tp"] = "تنغينغ بينيين",
    ["w"] = "ويد–جيلز",
    ["j"] = "يتبنغ",
    ["cy"] = "بالكانتونية",
    ["sl"] = "سيدني لاو",
    ["poj"] = "بي-ويه-جي",
    ["tl"] = "تاي-لو",
    ["zhu"] = "زهوين فوهاو",
    ["l"] = "ت.ح.",
    ["tr"] = "الترجمة",
}

-- عناوين المقالات المستخدمة كروابط لكل جزء
local wlinks = {
    ["c"] = "اللغة الصينية",
    ["s"] = "حروف صينية مبسطة",
    ["t"] = "حروف صينية تقليدية",
    ["p"] = "بينيين",
    ["tp"] = "تنغينغ بينيين",
    ["w"] = "ويد–جيلز",
    ["j"] = "يتبنغ",
    ["cy"] = "رومنة ييل للغة الكانتونية",
    ["sl"] = "سيدني لاو للترويم",
    ["poj"] = "بيخوتسي",
    ["tl"] = "نظام تايوان لوماجي",
    ["zhu"] = "بوبوموفو",
    ["l"] = "ترجمة حرفية",
    ["tr"] = "ترجمة",
}

-- أكواد ISO للغات التي يتم استخدامها
local ISOlang = {
    ["c"] = "zh",
    ["t"] = "zh-Hant",
    ["s"] = "zh-Hans",
    ["p"] = "zh-Latn",
    ["tp"] = "zh-Latn-tongyong",
    ["w"] = "zh-Latn-wadegile",
    ["j"] = "yue-Latn-jyutping",
    ["cy"] = "yue-Latn",
    ["sl"] = "yue-Latn",
    ["poj"] = "nan-Latn",
    ["tl"] = "nan-Latn-tailo",
    ["zhu"] = "zh-Bopo",
}

-- تحديد الأجزاء التي سيتم كتابتها بخط مائل
local italic = {
    ["p"] = true,
    ["tp"] = true,
    ["w"] = true,
    ["j"] = true,
    ["cy"] = true,
    ["sl"] = true,
    ["poj"] = true,
    ["tl"] = true,
}

-- تحديد الأجزاء التي سيتم كتابتها بخط علوي
local superscript = {
    ["w"] = true,
    ["sl"] = true,
}

-- تصنيفات لأنواع مختلفة من النصوص الصينية
local cats = {
    ["c"] = "[[تصنيف: مقالات تحوي نصا بالصينية]]",
    ["s"] = "[[تصنيف:مقالات تحوي نصا بالصينية المبسطة]]",
    ["t"] = "[[تصنيف:مقالات تحوي نصا بالصينية التقليدية]]",
}

-- الدالة الرئيسية لإظهار النص
function p.Zh(frame)
    -- تحميل الوحدة للحصول على المعاملات
    local getArgs = require('Module:Arguments').getArgs
    local args = getArgs(frame)
    return p._Zh(args)
end

function p._Zh(args)
    -- التحقق من وجود الرابط والتسمية وتحديد الخيارات الافتراضية
    if args["link"] then args["links"] = args["link"]; end
    if args["label"] then args["labels"] = args["label"]; end

    local uselinks = args["links"] ~= "no" -- هل يتم إضافة الروابط
    local uselabels = args["labels"] ~= "no" -- هل يتم إضافة التسميات
    local capfirst = args["scase"] ~= nil
    local out = nil -- المصطلح الأساسي الذي يظهر قبل الأقواس
    local usebrackets = 0 -- هل يجب أن تكون هناك مصطلحات بين قوسين
    local numargs = 0

    if args["out"] then
        out = args["out"]
        usebrackets = 1
    end

    local t1 = false -- ما إذا كان سيتم تقديم الأحرف التقليدية أولاً
    local j1 = false -- ما إذا كان سيتم تقديم الرومنة الكانتونية أولاً
    local poj1 = false -- ما إذا كان سيتم تقديم الرومنة الهوكينية أولاً

    -- التحقق من الأولوية حسب الاختيارات
    if (args["first"]) then
        for testChar in mw.ustring.gmatch(args["first"], "%a+") do
            if (testChar == "t") then t1 = true end
            if (testChar == "j") then j1 = true end
            if (testChar == "poj") then poj1 = true end
        end
    end
    if (t1 == false) then
        local title = mw.title.getCurrentTitle()
        t1 = t1st[title.text] == true
    end

    -- قائمة ترتيب العرض حسب التفضيلات
    local orderlist = {"c", "s", "t", "p", "tp", "w", "j", "cy", "sl", "poj", "tl", "zhu", "l", "tr"}
    if (t1) then
        orderlist[2] = "t"
        orderlist[3] = "s"
    end
    if (j1) then
        orderlist[4] = "j"
        orderlist[5] = "cy"
        orderlist[6] = "sl"
        orderlist[7] = "p"
        orderlist[8] = "tp"
        orderlist[9] = "w"
    end
    if (poj1) then
        orderlist[4] = "poj"
        orderlist[5] = "tl"
        orderlist[6] = "p"
        orderlist[7] = "tp"
        orderlist[8] = "w"
        orderlist[9] = "j"
        orderlist[10] = "cy"
        orderlist[11] = "sl"
    end

    -- القواعد لإعادة تسمية بعض الأجزاء إذا كانت تستوفي شروط معينة
    if args["hp"] then
        args["p"] = args["hp"]
    end
    if args["tp"] then
        labels["p"] = "هانيو بينيين"
    end

    if (args["s"] and args["s"] == args["t"]) then
        args["c"] = args["s"]
        args["s"] = nil
        args["t"] = nil
        if out == "s" or out == "t" then
            out = "c"
        end
    elseif (not (args["s"] and args["t"])) then
        labels["s"] = labels["c"]
        labels["t"] = labels["c"]
    end
    if out then
        for i, v in ipairs (orderlist) do
            if v == out then
                table.remove(orderlist, i)
                table.insert(orderlist, 1, v)
                break
            end
        end
    end

    if (out == "c" and args["s"]) then usebrackets = 2; end

    local body = "" -- النص الناتج
    local params -- لإنشاء علامات HTML
    local label -- التسمية (قبل النص المقدم)
    local val -- النص المقدم

    -- المرور على كل جزء من الأجزاء المحتملة وإضافتها إلى النص الناتج
    for i, part in ipairs(orderlist) do
        if (args[part]) then
            numargs = numargs + 1
            label = ""
            if (uselabels) then
                label = labels[part]
                if (capfirst) then
                    label = mw.language.getContentLanguage():ucfirst(label)
                    capfirst = false
                end
                if (uselinks and part ~= "l" and part ~= "tr") then
                    label = "[[" .. wlinks[part] .. "|" .. label .. "]]"
                end
                if (part == "l" or part == "tr") then
                    label = "<abbr title=\"" .. wlinks[part] .. "\"><small>" .. label .. "</small></abbr>"
                else
                    label = label .. "&colon;"
                end
                label = label .. " "
            end
            val = args[part]
            if (cats[part]) and mw.title.getCurrentTitle().namespace == 0 then
                val = cats[part] .. val
            end
            if (ISOlang[part]) then
                params = {["lang"] = ISOlang[part]}
                val = mw.text.tag({name="span",attrs=params, content=val})
            elseif (part == "l") then
                local terms = ""
                for term in val:gmatch("[^,;؛]+") do
                    term = string.gsub(term, "^([ \"'؛,]*)(.*?)([ \"'؛,]*)$", "%2")
                    if term ~= "" then
                        terms = terms .. "&apos;" .. term .. "&apos;, "
                    end
                end
                val = string.sub(terms, 1, -3)
            elseif (part == "tr") then
                val = "&quot;" .. val .. "&quot;"
            end
            if (italic[part]) then
                val = "<i>" .. val .. "</i>"
            end
            if string.match(val, "</?sup>") then val = val.."[[تصنيف:صفحات تستخدم قالب Zh مع علامات sup]]" end
            if (superscript[part]) then
                val = val:gsub("(%d)", "<sup>%1</sup>"):gsub("(%d)</sup>%*<sup>(%d)", "%1*%2"):gsub("<sup><sup>([%d%*]+)</sup></sup>", "<sup>%1</sup>")
            end
            if numargs == usebrackets then
                body = body .. label .. val .. " ("
            else
                body = body .. label .. val .. "؛ "
            end
        end
    end

    if (body > "") then
        body = string.sub(body, 1, -4)
        if out and numargs > usebrackets then
            body = body .. "&rpar;"
        end
        return body
    else
        if (args[1]) then
            label = ""
            if (uselabels) then
                label = labels["c"]
                if (uselinks) then
                    label = "[[" .. wlinks["c"] .. "|" .. label .. "]]"
                end
                label = label .. "&colon; "
            end
            if mw.title.getCurrentTitle().namespace == 0 then
                val = cats["c"] .. args[1]
            else
                val = args[1]
            end
            params = {["lang"] = ISOlang["c"]}
            val = mw.text.tag({name="span",attrs=params, content=val})
            return label .. val
        end
        return ""
    end
end

return p