وحدة:بطاقة/تجسيد
توثيق الوحدة [أنشئ] [محو الاختزان][استخدامات] [قوالب]
-- Credits:
-- Original by وهراني @arwiki
-- Version: 20240402
local p = {}
local wikiLang = 'ar' -- اللغة
local localdata = require( 'وحدة:بطاقة/بيانات') -- بيانات مضمنة في القالب
local wdexpandQuery = require("وحدة:بطاقة/ويكي.بيانات").expandQuery
local page = { -- بيانات حول الصفحة التي ستعرض عليها البطاقة
name = mw.title.getCurrentTitle().prefixedText,
namespace = mw.title.getCurrentTitle().namespace
}
local maincolor, secondcolor, thirdcolor = '#E1E1E1', '#E1E1E1', '#000000'
-- نتائج ثانوية
local maintenance = '' -- نص مضاف للنتيجة يستعمل لإدراج التصنيفات عادة
local externaltext = '' -- نص مضاف عام يستعمل لعرض إضافات مثل القوالب خارج قالب المعلومات
local function addWikidataCat(prop)
if type(prop) == 'table' then prop = prop[1] end
if page.namespace == 0 then
maintenance = maintenance .. '[[تصنيف:صفحات_تستخدم_خاصية_' .. prop .. ']]'
end
end
local function addMaintenanceCat(cat, sortkey)
if page.namespace == 0 and cat then
maintenance = maintenance
.. '[[Category:' .. cat .. '|' .. (sortkey or page.name) .. ']]'
end
return ''
end
function p.separator(params)
local style = params['separator style'] or {}
style.height = style.height or '2px'
style['background-color'] = style['background-color'] or maincolor
return mw.html.create('hr'):css( style )
end
--[=[
تحضير لبنة العنوان في البطاقة
]=]
function p.buildtitle(params)
local text = params.text
local subtext = params.subtitle
if subtext and (subtext ~= text) then
text = text .. '<br /><small>' .. subtext .. '</small>'
end
local class = 'entete ' .. (params.icon or '')
local title = mw.html.create('div')
:addClass(class)
:css(style)
:tag('div')
:wikitext(params.text)
:allDone()
return title
end
p.buildTitle = p.buildtitle
function p.buildimages(params)
local style = params.style or {padding ='2px 0',}
-- تحضير عرض الصورة
local imagesString = params.imagesString
for i,image in pairs(images) do
if image == '-' then
return
end
if(string.find(image, '<table',1,true) ~= nil or string.find(image, '<div',1,true) ~= nil) then
imagesString = imagesString .. image
else
image = string.match(image, '[^:]*:([^|%]]*)') or image
imagesString = imagesString .. '[[file:' .. image .. params.size .. '|frameless'
-- [[
if alt then imagesString = imagesString .. '|alt=' .. params.alt end
if link then imagesString = imagesString .. '|link=' .. params.link end
if upright then
imagesString = imagesString .. '|upright=' .. params.upright
end
imagesString = imagesString .. ']]'
end
end
local image = mw.html.create('div')
:addClass("images")
:css(style)
:wikitext(imagesString)
:done()
-- التعليق
local captionobj
if params.caption then
captionobj = mw.html.create('div')
:wikitext(params.caption)
:css(params.legendstyle or {})
:addClass("legend")
:done()
end
-- الفاصل
local separator
if params.separator then
separator = separator(params)
end
local imgout
if params.inner then -- في حالة التواجد داخل الجدول
imgout = mw.html.create('tr'):tag('th'):attr('colspan', 2)
else
imgout = mw.html.create('div'):css({ border="unset",padding="unset"})
end
return imgout
:node(image)
:node(captionobj)
:node(separator)
:done()
end
p.buildImages = p.buildimages
function p.buildtext(params)
local style = {
['text-align'] = 'center',
['font-weight'] = 'bold'
}
if params.style then
for i, j in pairs(params.style) do
style[i] = j
end
end
local formattedtext = mw.html.create('p')
:addClass(params.class or '')
:css(style)
:wikitext(params.text)
:done()
return formattedtext
end
p.buildText = p.buildtext
function p.buildrow(params)
-- format
local formattedvalue = mw.html.create('div')
:wikitext('\n' .. params.value) -- رمز '\n' مطلوب عندما تكون value قائمة تبدأ بـ '*' ou '#'
if (params.hidden == true)then
local divNavHead = mw.html.create('div')
:attr({class="nomobile", style="text-align:right;border: none; padding: 0; background:none; font-size: 75%;"})
:wikitext(" [[file:Incomplete list.svg|20x20px|link=]] القائمة ...") --[عرض]/[إخفاء]
formattedvalue
:addClass('mw-collapsible-content')
divNavHead = mw.html.create('div'):node(divNavHead)
formattedvalue = mw.html.create('div')
:attr({class="mw-collapsible mw-collapsed ", style="border: none; padding: 0;"})
:node(divNavHead)
:node(formattedvalue)
end
formattedvalue = mw.html.create('td')
:node(formattedvalue)
:addClass(params.valueClass or '')
:css(params.valueStyle or {})
:allDone()
local formattedlabel
if params.label then
formattedlabel = mw.html.create('th')
:attr('scope', 'row')
:wikitext(params.label)
:done()
end
local row = mw.html.create('tr')
:addClass(params.class or '')
:css(params.style or {})
:node(formattedlabel)
:node(formattedvalue)
:done()
return row
end
p.buildRow = p.buildrow
function p.buildnavbox(params)
local navbox
if params.inner then -- في حالة التواجد داخل الجدول
navbox = mw.html.create('tr'):tag('th'):attr('colspan', 2)
style['font-weight'] = style['font-weight'] or 'normal'
else
navbox = mw.html.create('div')
end
local prevNode, nextNode
if previousval then
prevNode = mw.html.create('div')
:addClass('prev_bloc')
:wikitext(params.previousval)
:done()
end
if nextval then
nextNode = mw.html.create('div')
:addClass('next_bloc')
:wikitext(params.nextval)
:done()
end
if previousval or nextval then
navbox
:addClass("overflow nav " .. (params.class or ''))
:css(params.style or {})
:node(prevNode)
:node(nextNode)
:allDone()
return navbox
end
return nil
end
p.buildNavbox = p.buildnavbox
function p.buildsuccession(params)
if not params.value then
return nil
end
local rowI = mw.html.create('tr')
cellI = mw.html.create('td')
:attr({colspan = '2'})
:attr({align = 'center'})
local styleT = {}
styleT['background-color'] = 'transparent'
styleT['width'] = '100%'
tabC = mw.html.create('table')
:attr({cellspacing = '0'})
:addClass('navigation-not-searchable')
:css(styleT)
local row = mw.html.create('tr')
local color = params.color
local style = {}
local arrowLeft
local arrowRight
if color == 'default' then
style['background-color'] = '#E6E6E6'
arrowLeft = '[[file:Fleche-defaut-droite.png|13px|alt=سابق|link=]]'
arrowRight = '[[file:Fleche-defaut-gauche.png|13px|alt=سابق|link=]]'
else
style['background-color'] = color
arrowLeft = '[[file:Fleche-defaut-droite-gris-32.png|13px|alt=لاحق|link=]]'
arrowRight = '[[file:Fleche-defaut-gauche-gris-32.png|13px|alt=لاحق|link=]]'
end
local styleTrans = {}
styleTrans['background-color'] = '#F9F9F9'
local widthCell = '44%'
if center then
widthCenter = '28%'
widthCell = '29%'
end
local formattedbefore
if params.before then
formattedbefore = mw.html.create('td')
:attr({valign = 'middle'})
:attr({align = 'right'})
:attr({width = '5%'})
:css(style)
:wikitext(arrowLeft)
:done()
row:node(formattedbefore)
formattedbefore = mw.html.create('td')
:attr({width = '1%'})
:css(style)
:wikitext('')
:done()
row:node(formattedbefore)
formattedbefore = mw.html.create('td')
:attr({align = 'right'})
:attr({valign = 'middle'})
:attr({width = widthCell})
:css(style)
:wikitext(params.before)
:done()
row:node(formattedbefore)
else
formattedbefore = mw.html.create('td')
:attr({valign = 'middle'})
:attr({align = 'right'})
:attr({width = '5%'})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedbefore)
formattedbefore = mw.html.create('td')
:attr({width = '1%'})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedbefore)
formattedbefore = mw.html.create('td')
:attr({align = 'right'})
:attr({valign = 'middle'})
:attr({width = widthCell})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedbefore)
end
local formattedcenter
formattedcenter = mw.html.create('td')
:attr({width = '1%'})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedcenter)
if params.center then
formattedcenter = mw.html.create('td')
:attr({align = 'center'})
:attr({valign = 'middle'})
:attr({width = widthCenter})
:css(style)
:wikitext(params.center)
:done()
row:node(formattedcenter)
formattedcenter = mw.html.create('td')
:attr({width = '1%'})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedcenter)
end
local formattedafter
if params.after then
formattedafter = mw.html.create('td')
:attr({align = 'left'})
:attr({valign = 'middle'})
:attr({width = widthCell})
:css(style)
:wikitext(params.after)
:done()
row:node(formattedafter)
formattedbefore = mw.html.create('td')
:attr({width = '1%'})
:css(style)
:wikitext('')
:done()
row:node(formattedbefore)
formattedafter = mw.html.create('td')
:attr({align = 'left'})
:attr({valign = 'middle'})
:attr({width = '5%'})
:css(style)
:wikitext(arrowRight)
:done()
row:node(formattedafter)
else
formattedafter = mw.html.create('td')
:attr({align = 'left'})
:attr({valign = 'middle'})
:attr({width = widthCell})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedafter)
formattedbefore = mw.html.create('td')
:attr({width = '1%'})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedbefore)
formattedafter = mw.html.create('td')
:attr({align = 'left'})
:attr({valign = 'middle'})
:attr({width = '5%'})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedafter)
end
row:done()
tabC:node(row)
tabC:done()
cellI:node(tabC)
cellI:done()
rowI:node(cellI)
rowI:allDone()
return rowI
end
p.buildSuccession = p.buildsuccession
function p.buildrow1col(params)
if params.value == '-' or type(params.value)== 'nil' then
return nil
end
local class = params.class
local rowcolor =params.color
local style = params.style or {}
style['padding'] = style['padding'] or '4px'
style['text-align'] = style['text-align'] or 'center'
style['background-color'] = style['background-color'] or rowcolor or '#F9F9F9'
style['color'] = style['color'] or '#000000'
local formattedvalue = mw.html.create('div')
:wikitext('\n' .. params.value) -- رمز '\n' مطلوب عندما تكون value قائمة تبدأ بـ '*' ou '#'
if (params.hidden == true) then
local divNavHead = mw.html.create('div')
:attr({class="nomobile", style="text-align:right;border: none; padding: 0; background:none; font-size: 75%;"})
:wikitext(" [[file:Incomplete list.svg|20x20px|link=]] القائمة ...") --[عرض]/[إخفاء]
formattedvalue
:addClass('mw-collapsible-content')
divNavHead = mw.html.create('div'):node(divNavHead)
formattedvalue = mw.html.create('div')
:attr({class="mw-collapsible mw-collapsed ", style="border: none; padding: 0;"})
:node(divNavHead)
:node(formattedvalue)
end
formattedvalue = mw.html.create('td')
:node(formattedvalue)
:attr({colspan = '2'})
:css(style)
:done()
local row = mw.html.create('tr')
:addClass(class)
:css(style)
:node(formattedvalue)
:done()
return row
end
p.buildRow1Col = p.buildrow1col
function p.buildsubtitle(params)
local class = params.class or ''
local style = { ['margin-top'] ='-8px',['margin-bottom'] ='10px',
['text-align'] = 'center',
['font-size'] = '90%',
['background-color'] = maincolor,
['color'] = thirdcolor,
flex= "auto",
width="100%"
}
if params.style then
for i, j in pairs(params.style) do
style[i] = j
end
end
if params.value == '-' then
return
end
return mw.html.create('div')
:addClass(class)
:css(style)
:tag('div')
:wikitext(params.value)
:allDone()
end
p.buildSubTitle = p.buildsubtitle
function p.buildtable(params)
local tab = mw.html.create('table'):css(params.style or {})
local rows = params.rows
-- expand parameters so that we have a list of tables
local i = 1
while (i <= #rows) do
local l = rows[i]
if type(l) == 'function' then
l = l(localdata, localdata.item)
end
if (type(l) == 'table') and (l.type == 'multi') then
table.remove(rows, i)
for j, row in ipairs(l.rows) do
table.insert(rows, i + j - 1, row)
end
elseif type(l) == 'nil' then
table.remove(rows, i)
elseif type(l) ~= 'table' then
return error('أسطر قالب البطاقة ("rows") على شكل جداول (table), وليست ' .. type(l))
else
i = i + 1
end
end
-- CREATE ROW
local expandedrows = {}
for k, row in ipairs(rows) do
local v = p.buildblock(row, true)
if v then
table.insert(expandedrows, v)
end
end
if (#expandedrows == 0) then
return nil
end
rows = expandedrows
-- ADD TITLE
local title
if params.title or params.singulartitle or params.pluraltitle then
local text
if #rows > 1 and params.pluraltitle then
text = params.pluraltitle
elseif #rows == 1 and params.singulartitle then
text = params.singulartitle
else
text = params.title
end
local style = params.titlestyle or {display = 'table-caption'}
style['text-align'] = style['text-align'] or 'center'
style['color'] = style['color'] or thirdcolor
style['background-color'] = style['background-color'] or secondcolor
title = mw.html.create('caption')
:attr({colspan = '2'})
:css(style)
:wikitext(text)
:done()
end
if title then
tab:node(title)
end
for i, j in pairs (rows) do
tab:node(j)
end
if params.separator then
local separator = p.separator(params)
tab:node(separator)
end
tab:allDone()
return tab
end
p.buildTable = p.buildtable
function p.buildfooter(params)
if not params then
params = {}
end
local class = 'navbar noprint bordered ' .. (params.class or '')
local style = params.style or {flex= "auto";}
style['border-top'] = style['border-top'] or '2px dotted ' .. maincolor
style['display'] = 'block'
style['width'] = '100%'
local editlinkspan = mw.html.create('span')
:css({['text-align'] = "right", ['font-size'] = "80%",['background'] = "inherit"})
:addClass('plainlinks')
:wikitext(params.editstr)
:done()
local doclinkspan = mw.html.create('span')
:css({['text-align'] = "left",['float'] = "left"})
:wikitext(params.doclinkstr)
:done()
local footer = mw.html.create('p')
:addClass(class)
:css(style)
:node(editlinkspan)
:node(doclinkspan)
return footer
end
p.buildFooter = p.buildfooter
function p.buildblock(block, inner)
if type(block) == 'function' then
block = block( localdata )
end
if(inner) then block.inner = true end
local blocktypes = { -- list of functions for block buildings
['invalid'] = p.buildinvalidblock,
['external text'] = p.buildexternaltext,
['footer'] = p.buildfooter,
['images'] = p.buildimages,
['map']= p.buildmap,
['navbox'] = p.buildnavbox,
['table'] = p.buildtable,
['mixed'] = p.buildrow,
['row'] = p.buildrow,
['row1col'] = p.buildrow1col,
['succession'] = p.buildsuccession,
['text'] = p.buildtext,
['title'] = p.buildtitle,
['subtitle'] = p.buildsubtitle,
}
if type(block) ~= 'table'
or (not block.type)
or (not blocktypes[block.type]) then
return blocktypes['invalid'](block)
end
return blocktypes[block.type](block)
end
p.buildBlock = p.buildblock
local function _modbuild()
local function _table_size(tab)
local tab_size = 0
for k, v in pairs( tab ) do tab_size = tab_size + 1 end
return tab_size
end
if _table_size(localdata) <= 5 and page.namespace == 0 then
addMaintenanceCat(i18n["pages_using_bitaqa_with_no_params_cat"])
end
-- assign rank to the infobox, "secondary" means special formatting like no displaytitle for coordinates
local infoboxrank = 'main' -- main infobox of the page, with coordinates displayed in title etc.
if page.namespace ~= 0 then
infoboxrank = 'secondary'
else
addMaintenanceCat(i18n["pages_using_bitaqa_cat"])
addMaintenanceCat(i18n["pages_using_infobox_cat"])
end
-- if infobox is linked to another item: rank = secondary
if localdata.item and localdata.item.id then
local itemlink = mw.wikibase.sitelink(localdata.item.id)
local pagetitle = mw.title.getCurrentTitle().text
if (itemlink or '') ~= pagetitle then
infoboxrank = 'secondary'
end
end
localdata.infoboxrank = infoboxrank
-- load infobox module page
local moduledata = require('وحدة:بطاقة/قالب/' .. localdata.modulename )
moduledata.name = localdata.modulename
localdata.wikimod = moduledata.wikimod or moduledata.wikidatamod or moduledata.wdmod
-- defines main color
maincolor = getValue({'infobox_color','لون_البطاقة'}) or moduledata.maincolor or maincolor
secondcolor = moduledata.secondcolor or secondcolor
thirdcolor = getValue({'text_color','لون_النص'}) or moduledata.thirdcolor or thirdcolor
if maincolor:match( '^%x%x%x%x%x%x$' ) or maincolor:match( '^%x%x%x$' ) then
maincolor = '#' .. maincolor
end
if thirdcolor:match ('نعم') or thirdcolor:match( 'true' ) then
thirdcolor = '#000'
end
if thirdcolor:match ('لا') or thirdcolor:match( 'false' ) then
thirdcolor = '#fff'
end
-- class
local class = 'infobox_v3 infobox'
if moduledata.class then
class = class .. ' ' .. moduledata.class
end
-- style
local style = moduledata.style or {}
-- build infobox
-- النتيجة النهائية
local infobox = mw.html.create('div')
--:addClass(class)
:css({display= "flex"
,["flex-wrap"]= "wrap"
,["flex-direction"]= "row"
,["justify-content"]= "center"
,["align-items"]= "center"})
:done()
local nbblock = 0
for i, j in pairs( moduledata.parts ) do
-- accepted only in table
if(not(j =='mixed' or j == 'multi' or j == 'row' or j == 'row1col'))
then
local mdp= p.buildblock(j)
infobox:node(mdp)
if(mdp) then nbblock = nbblock + 1 end
end
end
if nbblock < 2 and page.namespace == 0 then
addMaintenanceCat(i18n["pages_with_empty_bitaqa_cat"])
end
infobox :node(p.buildfooter(moduledata.footer))
:done()
infobox=mw.html.create('div')
:addClass(class)
:css(style)
:node(infobox)
:done()
local templatestyles
templatestyles = mw.getCurrentFrame():extensionTag( 'templatestyles', '',
{src = "بطاقة/infobox v3/styles.css"})
..mw.getCurrentFrame():extensionTag( 'templatestyles', '', { src = "بطاقة/icones.css"}
)
;
return templatestyles .. tostring(infobox) .. externaltext .. maintenance
end
p['تجسيد'] = p.build
return p