پودمان:پدیدآورنده: تفاوت میان نسخهها
ظاهر
صفحهای تازه حاوی «local translate2bn = require('پودمان:Number Converter')._translate2bn function errorMessage(text) -- Return a html formated version of text stylized as an error. local html = mw.html.create('div') html:addClass('error') :wikitext(text) :wikitext('Category:Wrong author templates') return tostring(html) end function createLinkRow(link, site) -- Return some html stylised formated text of link local html = mw.html.cre...» ایجاد کرد |
بدون خلاصۀ ویرایش |
||
| خط ۱: | خط ۱: | ||
local p = {} | |||
local cfg = require('Module:پدیدآورنده/تنظیمات') | |||
local function filled(v) | |||
return type(v) == 'string' | |||
and mw.text.trim(v) ~= '' | |||
end | |||
local function safe(v) | |||
return mw.text.nowiki(tostring(v or '')) | |||
end | end | ||
function | local function statementValue(entity, property) | ||
if not filled(property) then | |||
return nil | |||
end | |||
local statements = entity:getBestStatements(property) | |||
for _, s in ipairs(statements or {}) do | |||
local snak = s.mainsnak | |||
if snak and snak.snaktype == 'value' | |||
and snak.datavalue then | |||
return snak.datavalue.value | |||
end | |||
end | end | ||
return nil | |||
end | end | ||
function | local function deathInfo(value, frame) | ||
if type(value) ~= 'table' or not value.time then | |||
return nil, nil | |||
end | |||
local y, m, d = value.time:match( | |||
'^[%+%-]?(%d+)%-(%d%d)%-(%d%d)' | |||
) | |||
y, m, d = tonumber(y), tonumber(m), tonumber(d) | |||
if not y or y < 1 or y > 9999 then | |||
return nil, nil | |||
end | |||
local precision = tonumber(value.precision) or 9 | |||
if precision < 9 then | |||
return nil, nil | |||
end | |||
end | |||
local today = frame:callParserFunction( | |||
'#time', 'Y-m-d' | |||
) | |||
local cy, cm, cd = today:match( | |||
'^(%d+)%-(%d+)%-(%d+)' | |||
) | |||
cy, cm, cd = tonumber(cy), tonumber(cm), tonumber(cd) | |||
if not cy then | |||
return tostring(y), nil | |||
end | |||
local years = cy - y | |||
if precision >= 11 and m and d | |||
and m >= 1 and m <= 12 | |||
and d >= 1 and d <= 31 then | |||
if cm < m or (cm == m and cd < d) then | |||
years = years - 1 | |||
end | |||
else | |||
-- محاسبه محافظهکارانه برای تاریخ ناقص | |||
years = years - 1 | |||
end | |||
return tostring(y), math.max(0, years) | |||
end | end | ||
function | local function addRow(rows, label, value) | ||
if not filled(value) then | |||
return | |||
end | |||
rows[#rows + 1] = | |||
'<tr><th style="padding:9px;text-align:right;' .. | |||
'width:34%;color:#66776f;font-weight:normal;' .. | |||
'border-bottom:1px solid #edf0ee;">' .. | |||
safe(label) .. | |||
'</th><td style="padding:9px;' .. | |||
'border-bottom:1px solid #edf0ee;">' .. | |||
value .. '</td></tr>' | |||
end | end | ||
function | local function projectLink(entity, site, base, label) | ||
if not filled(site) or not filled(base) then | |||
return nil | |||
end | |||
local ok, title = pcall(function() | |||
return entity:getSitelink(site) | |||
end) | |||
if not ok or not filled(title) then | |||
return nil | |||
end | |||
local url = base .. mw.uri.encode(title, 'PATH') | |||
return '[' .. url .. ' ' .. label .. ']' | |||
end | end | ||
function | p['نمایش'] = function(frame) | ||
local args = frame:getParent() | |||
and frame:getParent().args or frame.args | |||
local title = mw.title.getCurrentTitle() | |||
local name = mw.text.trim(args['نام'] or '') | |||
if name == '' then | |||
name = title.text | |||
end | |||
local wb = mw.wikibase | |||
-- اگر صفحه به آیتم متصل نیست، هیچ دادهای نخوان. | |||
local id = wb and wb.getEntityIdForCurrentPage | |||
and wb.getEntityIdForCurrentPage() | |||
if not id then | |||
return '<div class="sourcical-author" ' .. | |||
'style="direction:rtl;max-width:310px;' .. | |||
'padding:16px;border:1px solid #dce7e1;' .. | |||
'border-radius:12px;text-align:center;">' .. | |||
'<strong>' .. safe(name) .. '</strong></div>' | |||
end | |||
local ok, entity = pcall(function() | |||
return wb.getEntity(id) | |||
end) | |||
if not ok or not entity then | |||
return '<strong>' .. safe(name) .. '</strong>' | |||
end | end | ||
local description = entity.descriptions | |||
and entity.descriptions.fa | |||
and entity.descriptions.fa.value | |||
local birth = statementValue( | |||
entity, cfg.birthProperty | |||
) | |||
local death = statementValue( | |||
entity, cfg.deathProperty | |||
) | |||
local photo = statementValue( | |||
entity, cfg.imageProperty | |||
) | |||
local deathYear, years = deathInfo(death, frame) | |||
local birthYear = birth and birth.time | |||
and birth.time:match('^[%+%-]?(%d+)%-') | |||
local rows = {} | |||
if birthYear then | |||
addRow(rows, 'تولد', safe(birthYear) .. ' میلادی') | |||
end | |||
if deathYear then | |||
addRow(rows, 'درگذشت', | |||
safe(deathYear) .. ' میلادی') | |||
end | |||
local links = {} | |||
if filled(cfg.datacalURL) then | |||
links[#links + 1] = | |||
'[' .. cfg.datacalURL .. | |||
mw.uri.encode(id, 'PATH') .. | |||
' دیتاکال]' | |||
end | |||
local projects = { | |||
{cfg.encyclopediaSite, | |||
cfg.encyclopediaURL, 'دانشنامه'}, | |||
{cfg.commonsSite, | |||
cfg.commonsURL, 'انبار اسلامیکال'}, | |||
{cfg.islamicoulSite, | |||
cfg.islamicoulURL, 'اسلامیکول'} | |||
} | |||
for _, item in ipairs(projects) do | |||
local link = projectLink( | |||
entity, item[1], item[2], item[3] | |||
) | |||
if link then | |||
links[#links + 1] = link | |||
end | |||
end | |||
local out = {} | |||
out[#out + 1] = | |||
'<div class="sourcical-author" ' .. | |||
'style="direction:rtl;max-width:310px;' .. | |||
'border:1px solid #dce7e1;border-radius:12px;' .. | |||
'overflow:hidden;background:#fff;' .. | |||
'margin:12px 0;">' | |||
out[#out + 1] = | |||
'<div style="background:#f4f8f6;' .. | |||
'padding:20px;text-align:center;">' | |||
if type(photo) == 'string' | |||
and filled(photo) then | |||
out[#out + 1] = | |||
'[[پرونده:' .. photo .. | |||
'|140px|وسط|بدونقاب]]' | |||
end | |||
out[#out + 1] = | |||
'<div style="font-size:19px;' .. | |||
'font-weight:bold;color:#244b3d;">' .. | |||
safe(name) .. '</div>' | |||
if filled(description) then | |||
out[#out + 1] = | |||
'<div style="font-size:13px;' .. | |||
'color:#66776f;margin-top:8px;">' .. | |||
safe(description) .. '</div>' | |||
end | |||
out[#out + 1] = '</div>' | |||
if #rows > 0 then | |||
out[#out + 1] = | |||
'<table style="width:100%;border-collapse:' .. | |||
'collapse;font-size:13px;">' .. | |||
table.concat(rows) .. '</table>' | |||
end | |||
if #links > 0 then | |||
out[#out + 1] = | |||
'<div style="padding:12px;' .. | |||
'font-size:12px;line-height:2;' .. | |||
'text-align:center;">' .. | |||
table.concat(links, ' · ') .. | |||
'</div>' | |||
end | |||
out[#out + 1] = '</div>' | |||
-- وضعیت زمانی حق نشر | |||
local copyrightTemplate | |||
if years then | |||
if years >= 100 then | |||
copyrightTemplate = 'حق نشر/درگذشت ۱۰۰' | |||
elseif years >= 50 then | |||
copyrightTemplate = 'حق نشر/درگذشت ۵۰' | |||
elseif years >= 30 then | |||
copyrightTemplate = 'حق نشر/درگذشت ۳۰' | |||
else | |||
copyrightTemplate = 'حق نشر/درگذشت کمتر از ۳۰' | |||
end | |||
end | |||
if copyrightTemplate then | |||
out[#out + 1] = frame:expandTemplate({ | |||
end | title = copyrightTemplate, | ||
args = { | |||
['نام'] = name, | |||
['سال'] = tostring(years) | |||
} | |||
}) | |||
end | |||
return table.concat(out) | |||
return | |||
end | end | ||
return p | return p | ||
نسخهٔ ۴ نوامبر ۲۰۲۶، ساعت ۰۳:۴۰
توضیحات این پودمان میتواند در پودمان:پدیدآورنده/توضیحات قرار گیرد.
local p = {}
local cfg = require('Module:پدیدآورنده/تنظیمات')
local function filled(v)
return type(v) == 'string'
and mw.text.trim(v) ~= ''
end
local function safe(v)
return mw.text.nowiki(tostring(v or ''))
end
local function statementValue(entity, property)
if not filled(property) then
return nil
end
local statements = entity:getBestStatements(property)
for _, s in ipairs(statements or {}) do
local snak = s.mainsnak
if snak and snak.snaktype == 'value'
and snak.datavalue then
return snak.datavalue.value
end
end
return nil
end
local function deathInfo(value, frame)
if type(value) ~= 'table' or not value.time then
return nil, nil
end
local y, m, d = value.time:match(
'^[%+%-]?(%d+)%-(%d%d)%-(%d%d)'
)
y, m, d = tonumber(y), tonumber(m), tonumber(d)
if not y or y < 1 or y > 9999 then
return nil, nil
end
local precision = tonumber(value.precision) or 9
if precision < 9 then
return nil, nil
end
local today = frame:callParserFunction(
'#time', 'Y-m-d'
)
local cy, cm, cd = today:match(
'^(%d+)%-(%d+)%-(%d+)'
)
cy, cm, cd = tonumber(cy), tonumber(cm), tonumber(cd)
if not cy then
return tostring(y), nil
end
local years = cy - y
if precision >= 11 and m and d
and m >= 1 and m <= 12
and d >= 1 and d <= 31 then
if cm < m or (cm == m and cd < d) then
years = years - 1
end
else
-- محاسبه محافظهکارانه برای تاریخ ناقص
years = years - 1
end
return tostring(y), math.max(0, years)
end
local function addRow(rows, label, value)
if not filled(value) then
return
end
rows[#rows + 1] =
'<tr><th style="padding:9px;text-align:right;' ..
'width:34%;color:#66776f;font-weight:normal;' ..
'border-bottom:1px solid #edf0ee;">' ..
safe(label) ..
'</th><td style="padding:9px;' ..
'border-bottom:1px solid #edf0ee;">' ..
value .. '</td></tr>'
end
local function projectLink(entity, site, base, label)
if not filled(site) or not filled(base) then
return nil
end
local ok, title = pcall(function()
return entity:getSitelink(site)
end)
if not ok or not filled(title) then
return nil
end
local url = base .. mw.uri.encode(title, 'PATH')
return '[' .. url .. ' ' .. label .. ']'
end
p['نمایش'] = function(frame)
local args = frame:getParent()
and frame:getParent().args or frame.args
local title = mw.title.getCurrentTitle()
local name = mw.text.trim(args['نام'] or '')
if name == '' then
name = title.text
end
local wb = mw.wikibase
-- اگر صفحه به آیتم متصل نیست، هیچ دادهای نخوان.
local id = wb and wb.getEntityIdForCurrentPage
and wb.getEntityIdForCurrentPage()
if not id then
return '<div class="sourcical-author" ' ..
'style="direction:rtl;max-width:310px;' ..
'padding:16px;border:1px solid #dce7e1;' ..
'border-radius:12px;text-align:center;">' ..
'<strong>' .. safe(name) .. '</strong></div>'
end
local ok, entity = pcall(function()
return wb.getEntity(id)
end)
if not ok or not entity then
return '<strong>' .. safe(name) .. '</strong>'
end
local description = entity.descriptions
and entity.descriptions.fa
and entity.descriptions.fa.value
local birth = statementValue(
entity, cfg.birthProperty
)
local death = statementValue(
entity, cfg.deathProperty
)
local photo = statementValue(
entity, cfg.imageProperty
)
local deathYear, years = deathInfo(death, frame)
local birthYear = birth and birth.time
and birth.time:match('^[%+%-]?(%d+)%-')
local rows = {}
if birthYear then
addRow(rows, 'تولد', safe(birthYear) .. ' میلادی')
end
if deathYear then
addRow(rows, 'درگذشت',
safe(deathYear) .. ' میلادی')
end
local links = {}
if filled(cfg.datacalURL) then
links[#links + 1] =
'[' .. cfg.datacalURL ..
mw.uri.encode(id, 'PATH') ..
' دیتاکال]'
end
local projects = {
{cfg.encyclopediaSite,
cfg.encyclopediaURL, 'دانشنامه'},
{cfg.commonsSite,
cfg.commonsURL, 'انبار اسلامیکال'},
{cfg.islamicoulSite,
cfg.islamicoulURL, 'اسلامیکول'}
}
for _, item in ipairs(projects) do
local link = projectLink(
entity, item[1], item[2], item[3]
)
if link then
links[#links + 1] = link
end
end
local out = {}
out[#out + 1] =
'<div class="sourcical-author" ' ..
'style="direction:rtl;max-width:310px;' ..
'border:1px solid #dce7e1;border-radius:12px;' ..
'overflow:hidden;background:#fff;' ..
'margin:12px 0;">'
out[#out + 1] =
'<div style="background:#f4f8f6;' ..
'padding:20px;text-align:center;">'
if type(photo) == 'string'
and filled(photo) then
out[#out + 1] =
'[[پرونده:' .. photo ..
'|140px|وسط|بدونقاب]]'
end
out[#out + 1] =
'<div style="font-size:19px;' ..
'font-weight:bold;color:#244b3d;">' ..
safe(name) .. '</div>'
if filled(description) then
out[#out + 1] =
'<div style="font-size:13px;' ..
'color:#66776f;margin-top:8px;">' ..
safe(description) .. '</div>'
end
out[#out + 1] = '</div>'
if #rows > 0 then
out[#out + 1] =
'<table style="width:100%;border-collapse:' ..
'collapse;font-size:13px;">' ..
table.concat(rows) .. '</table>'
end
if #links > 0 then
out[#out + 1] =
'<div style="padding:12px;' ..
'font-size:12px;line-height:2;' ..
'text-align:center;">' ..
table.concat(links, ' · ') ..
'</div>'
end
out[#out + 1] = '</div>'
-- وضعیت زمانی حق نشر
local copyrightTemplate
if years then
if years >= 100 then
copyrightTemplate = 'حق نشر/درگذشت ۱۰۰'
elseif years >= 50 then
copyrightTemplate = 'حق نشر/درگذشت ۵۰'
elseif years >= 30 then
copyrightTemplate = 'حق نشر/درگذشت ۳۰'
else
copyrightTemplate = 'حق نشر/درگذشت کمتر از ۳۰'
end
end
if copyrightTemplate then
out[#out + 1] = frame:expandTemplate({
title = copyrightTemplate,
args = {
['نام'] = name,
['سال'] = tostring(years)
}
})
end
return table.concat(out)
end
return p