پودمان: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