پرش به محتوا

پودمان:Triple tab Quran

از ویکی شیعه
توضیحات پودمان[نمایش] [ویرایش] [تاریخچه] [پاکسازی]
محتوای تب متن در اینجا قرار می‌گیرد.
محتوای تب متن و ترجمه در اینجا قرار می‌گیرد.
محتوای تب ترجمه در اینجا قرار می‌گیرد.
🔄

-- پودمان:Triple tab Quran (اصلاح شده برای خطای incrementGlobal)
local p = {}
local mw = require("mw")

function p.render(frame)
    local parentArgs = frame:getParent() and frame:getParent().args or {}
    local directArgs = frame.args or {}
    local args = {}
    for k, v in pairs(directArgs) do args[k] = v end
    for k, v in pairs(parentArgs) do args[k] = v end -- parentArgs اولویت دارد

    local function getInput(keys, default_val)
        if type(keys) == "string" then keys = {keys} end
        for _, key in ipairs(keys) do
            if args[key] and mw.text.trim(args[key]) ~= "" then
                return args[key]
            end
        end
        return default_val
    end

    -- تولید شناسه یکتا بدون استفاده از mw.incrementGlobal
    local unique_page_part = string.gsub(mw.title.getCurrentTitle().prefixedText, "[^%w%d]+", "")
    unique_page_part = unique_page_part:sub(1, 30) -- برای جلوگیری از طولانی شدن بیش از حد

    local server_part = string.gsub(mw.site.server or "defserv", "[^%w%d]+", "")
    server_part = server_part:sub(1, 20)

    local random_part = tostring(math.random(10000, 99999)) -- عدد تصادفی برای افزایش یکتایی

    local instance_id_default = "tripletab-" .. server_part .. "-" .. unique_page_part .. "-" .. random_part
    local instance_id = getInput({"id", "شناسه"}, instance_id_default)


    local tab_configs = {
        {url_key = "text", id_suffix = "quran-text", label_keys = {"textLabel", "برچسب متن"}, default_label = "متن", content_arg_keys = {"text", "متن"}, default_content = "محتوای تب متن در اینجا قرار می‌گیرد."},
        {url_key = "text_translate", id_suffix = "quran-text-translate", label_keys = {"textAndTranslateLabel", "برچسب متن و ترجمه"}, default_label = "متن و ترجمه", content_arg_keys = {"textAndTranslate", "tat", "متن و ترجمه"}, default_content = "محتوای تب متن و ترجمه در اینجا قرار می‌گیرد."},
        {url_key = "translate", id_suffix = "quran-translate", label_keys = {"translateLabel", "برچسب ترجمه"}, default_label = "ترجمه", content_arg_keys = {"translate", "ترجمه"}, default_content = "محتوای تب ترجمه در اینجا قرار می‌گیرد."}
    }
    local default_active_tab_url_key = tab_configs[1].url_key

    -- دریافت تب فعال از پارامتر URL یا آرگومان‌های الگو
    local query_params = {}
    local current_uri_string = mw.title.getCurrentTitle():fullUrl() -- گرفتن URL کامل
    local query_string_start = current_uri_string:match("?(.+)") -- استخراج بخش کوئری
    if query_string_start then
        query_params = mw.uri.decodeQueryString(query_string_start)
    end
    local active_tab_url_key_from_url = query_params.ttq_tab

    local active_tab_url_key_from_args = getInput({"ttq_tab"}, active_tab_url_key_from_url or default_active_tab_url_key)

    local final_active_tab_url_key = default_active_tab_url_key
    local is_valid_key = false
    for _, t_config in ipairs(tab_configs) do
        if t_config.url_key == active_tab_url_key_from_args then
            final_active_tab_url_key = active_tab_url_key_from_args
            is_valid_key = true
            break
        end
    end
    if not is_valid_key then -- اگر مقدار ttq_tab معتبر نبود، به پیش‌فرض برگرد
        final_active_tab_url_key = default_active_tab_url_key
    end

    local root_html = mw.html.create('div')
        :addClass('quran-TripleTabView')
        :attr('data-instance-id-quran', instance_id)

    local header_html = root_html:tag('div'):addClass('quran-tab-header'):attr('role', 'tablist')
    for i, t_config in ipairs(tab_configs) do
        local tab_html_id = t_config.id_suffix .. "-" .. instance_id .. "-header"
        local tab_content_target_id = t_config.id_suffix .. "-" .. instance_id

        local tab_div = header_html:tag('div')
            :addClass('quran-tab')
            :attr('role', 'tab')
            :attr('tabindex', (t_config.url_key == final_active_tab_url_key) and '0' or '-1')
            :attr('id', tab_html_id)
            :attr('aria-controls', tab_content_target_id)
            :attr('aria-selected', tostring(t_config.url_key == final_active_tab_url_key))
            :attr('data-tab-target-id', tab_content_target_id)
            :attr('data-tab-url-key', t_config.url_key)
            :wikitext(getInput(t_config.label_keys, t_config.default_label))
        if t_config.url_key == final_active_tab_url_key then
            tab_div:addClass('active')
        end
    end

    local wrapper_html = root_html:tag('div'):addClass('quran-tab-wrapper')
    for _, t_config in ipairs(tab_configs) do
        local content_html_id = t_config.id_suffix .. "-" .. instance_id
        local content_div = wrapper_html:tag('div')
            :addClass('quran-tab-content')
            :attr('id', content_html_id)
            :attr('role', 'tabpanel')
            :attr('aria-labelledby', t_config.id_suffix .. "-" .. instance_id .. "-header")

        local content_text = getInput(t_config.content_arg_keys, t_config.default_content)
        content_div:tag('div')
            :addClass('quran-content-card')
            :wikitext(content_text)

        if t_config.url_key == final_active_tab_url_key then
            content_div:addClass('active')
        else
            content_div:addClass('quran-tab-hidden')
        end
    end

    local controls_html = root_html:tag('div'):addClass('quran-table-controls')
    controls_html:tag('div')
        :attr('id', 'quran-reset-font-' .. instance_id)
        :addClass('quran-font-button quran-reset-button')
        :attr('role', 'button'):attr('tabindex', '0'):attr('aria-label', 'بازنشانی اندازه فونت')
        :wikitext('🔄')
    controls_html:tag('div')
        :attr('id', 'quran-decrease-font-' .. instance_id)
        :addClass('quran-font-button quran-decrease-button')
        :attr('role', 'button'):attr('tabindex', '0'):attr('aria-label', 'کاهش اندازه فونت')
        :wikitext('➖')
    controls_html:tag('div')
        :attr('id', 'quran-increase-font-' .. instance_id)
        :addClass('quran-font-button quran-increase-button')
        :attr('role', 'button'):attr('tabindex', '0'):attr('aria-label', 'افزایش اندازه فونت')
        :wikitext('➕')

    local templatestyles_tag = frame:extensionTag{
        name = 'templatestyles',
        args = { src = 'Module:Triple tab Quran/styles.css' }
    }
    return templatestyles_tag .. tostring(root_html)
end

return p