وحدة:بطاقة
المظهر
![]() | صُنّفت هذه الوحدة على أنها في المرحلة النهائية. في هذه المرحلة تكون الوحدة وصلت لنقطة يمكن أن تستخدم في أي صفحة أو أي نطاق. كما أنها تؤدي الهدف الذي بنيت من أجله ولا توجد أي أخطاء بها. يمكن أن يشار إلى هذه الوحدة في صفحات المساعدة أو أي صفحات إرشادية على ويكيبيديا، كما يمكن أن توضع كأمثلة للجدد ليتعلموا منها. |
لماذا هذا الأسلوب ؟
هذه الوحدة تعمل على جعل عملية استحداث قوالب البطاقات (أو قوالب معلومات أو Infobox) أسهل/أبسط ما يمكن من خلال تعريفات بسيطة في وحدات فرعية.
- المميزات
- استحداث القوالب يندرج ضمن عملية البرمجة واستعمال وحدات فرعية بلغة لوا (Lua) يضبط المكتوب لضمان غياب الأخطاء.
- عملية ترتيب البيانات المعروضة بسيطة ولا تستدعي تغيير الأرقام (مثلما هو الحال مع module:InfoBox).
- توفر مكتبات لجلب البيانات الأكثر استعمالا لاقتصاد الوقت والكود.
- الجمع في مكان واحد للمبرمج/المطور لتوفير التعليمات والشروح.
- توفر أدوات مساعدة لتحيين صفحة الشرح بصورة آنية وآلية أو نصف آلية (مثل : الصيغة وبيانات القالب ..) بعد تحيين الوحدة أو أحد المكتبات المساعدة.
الاستخدام
هذه الوحدة تستعمل لعرض قالب معلومات (Infobox) أو بطاقة بالاعتماد على وحدة فرعية تحتوي على بيانات حول مضمون هذا القالب. تسمح هذه الوحدة بإجراء استجوابات بصورة مبسطة لويكي بيانات لجلب ما توفر من البيانات.
استحداث قالب معلومة (أو بطاقة) يمر بخطوتين :
- إنشاء وحدة فرعية بعنوان من الشاكلة : وحدة:بطاقة/قالب/اسم_قالب
- مثال : وحدة:بطاقة/قالب/لعبة
- إنشاء قالب يستعمل لاحقا في المقالات. محتوى هذا القالب سيكون :
{{#استدعاء:بطاقة|تركيب|وحدة=اسم_الوحدة_الفرعية}}
- مثال :
{{#استدعاء:بطاقة|تركيب|وحدة=لعبة}}
- مثال :
محتوى الوحدة الفرعية
- محتوى فارغ
return {
maincolor = '#DDDDDD' -- اللون المستعمل لعنوان البطاقة
,parts = {} -- محتويات البطاقة
}
- محتوى نموذجي
local generic = require( 'وحدة:بطاقة/أدوات' )
return {
-- اللون المستعمل لعنوان البطاقة
maincolor = '#DDDDDD',
-- محتويات البطاقة
parts = {
generic.title(),
{type = 'subtitle', value = {'الاسم_الأصلي'}},
generic.logo(),
generic.mainimage(),
{type = 'table', title = 'معلومات عامة', rows = {
{type = 'row',
label = 'الصانع',
value ={'صانع','manufacturer'},
wikidata = {property='P176'}
},
{type = 'row',
label = 'أسماء أخرى',
value ={'أسماء_أخرى','aka'},
},
{type = 'row',
label = '[[شركة أم]]',
value ={'شركة_أم','parent_company'},
},
}},
}
}
- محتوى متقدم يجمع التعليمات بالشروح
return {
-- شرح مختصر عن وظيفة البطاقة
description = "بطاقة تعريفية عن ...",
-- اللون المستعمل لعنوان البطاقة
maincolor = '#DDDDDD',
-- محتويات البطاقة
parts = {
generic.title(),
{type = 'subtitle', value = {'الاسم_الأصلي'}},
generic.logo(),
generic.mainimage(),
{type = 'table', title = 'معلومات عامة', rows = {
{type = 'row',
label = 'الصانع',
value ={'صانع','manufacturer'},
wikidata = {property='P176'},
metadata = {
description = "تسمية صانع المنتج",
option = "required", -- تظهر عند التحرير المرئي على أنها معلومة ضرورية يجب توفيرها
type = "string",
}
},
{type = 'row',
label = 'أسماء أخرى',
value ={'أسماء_أخرى','aka'},
metadata = {
description = "أسماء أخرى متداولة",
option = "suggested",
type = "string",
}
},
{type = 'row',
label = 'تاريخ التأسيس',
value ={'تأسيس','founded'},
metadata = {
description = "تاريخ التأسيس الشركة",
option = "suggested",
-- تظهر عند التحرير المرئي على أنها معلومة تمثل تاريخا لذا وجب كتابة بنسق التواريخ.
type = "date"
}
},
}},
}
}
توثيق المعطيات (metadata)
metadata = {
description = "", -- شرح مختصر
option = "", -- أهمية المعلومة : required / suggested / deprecated
type = "", -- نوع المعلومة : number/boolean/date/url/wiki-file-name/line/content
example = "", -- مثال عن نص يساعد في ملء صحيح للخانة
suggestedvalues = {}, -- قائمة لقيم مقترحة مساعدة.
autovalue = ""; -- قيمة مولدة آليا مثل :{{subst:CURRENTYEAR}}
default = "" -- قيمة ثابتة
}
الأيقونات المتوفرة
خلفية فاتحة | خلفية فاتحة وأيقونة على اليسار | خلفية داكنة |
---|---|---|
aerostat | aerostat | aerostat |
aikido | aikido | aikido |
alpinisme | alpinisme | alpinisme |
arbitre | arbitre | arbitre |
arc | arc | arc |
archives2 | archives2 | archives2 |
arduino | arduino | arduino |
electro | electro | electro |
artiste | artiste | artiste |
artsmartiauxjap | artsmartiauxjap | artsmartiauxjap |
association | association | association |
athletisme | athletisme | athletisme |
audio | audio | audio |
auteur | auteur | auteur |
autogire | autogire | autogire |
automobile | automobile | automobile |
avion | avion | avion |
aviron | aviron | aviron |
badminton | badminton | badminton |
baseball | baseball | baseball |
basket-ball | basket-ball | basket-ball |
bd | bd | bd |
biathlon | biathlon | biathlon |
biere | biere | biere |
book | book | book |
universite | universite | universite |
boxe | boxe | boxe |
calendrier | calendrier | calendrier |
camera | camera | camera |
canada | canada | canada |
cardinal | cardinal | cardinal |
catch | catch | catch |
chateau | chateau | chateau |
chimie | chimie | chimie |
cinema | cinema | cinema |
commonwealth | commonwealth | commonwealth |
communication | communication | communication |
cyclisme | cyclisme | cyclisme |
deportation | deportation | deportation |
diplomatie | diplomatie | diplomatie |
disney | disney | disney |
droit | droit | droit |
drone-civil | drone-civil | drone-civil |
egypte-antique | egypte-antique | egypte-antique |
entreprise | entreprise | entreprise |
entreprise-blanc | entreprise-blanc | entreprise-blanc |
equitation | equitation | equitation |
escalade | escalade | escalade |
escalade | escalade | escalade |
escrime | escrime | escrime |
espagne | espagne | espagne |
eveque | eveque | eveque |
factory | factory | factory |
floorball | floorball | floorball |
fondeur | fondeur | fondeur |
football | football | football |
footballblack | footballblack | footballblack |
footUS | footUS | footUS |
futsal | futsal | futsal |
golf | golf | golf |
grappe | grappe | grappe |
gymnastique | gymnastique | gymnastique |
handball | handball | handball |
handballblack | handballblack | handballblack |
helicoptere | helicoptere | helicoptere |
hockey | hockey | hockey |
hockey-sur-gazon | hockey-sur-gazon | hockey-sur-gazon |
hospitaliers | hospitaliers | hospitaliers |
humain | humain | humain |
informatique | informatique | informatique |
internet | internet | internet |
israel-judaisme | israel-judaisme | israel-judaisme |
jeu | jeu | jeu |
jeu-role | jeu-role | jeu-role |
jeuvideo | jeuvideo | jeuvideo |
jeuvideov3 | jeuvideov3 | jeuvideov3 |
judo | judo | judo |
karate | karate | karate |
kayak | kayak | kayak |
kickboxing | kickboxing | kickboxing |
lutte | lutte | lutte |
macintosh | macintosh | macintosh |
malte | malte | malte |
map | map | map |
medecine | medecine | medecine |
mets | mets | mets |
militaire | militaire | militaire |
money | money | money |
money_coin | money_coin | money_coin |
montreal-metro | montreal-metro | montreal-metro |
metro | metro | metro |
montreal-train | montreal-train | montreal-train |
moteur-avion | moteur-avion | moteur-avion |
mosque | mosque | mosque |
musee | musee | musee |
museum | museum | museum |
papyrus | papyrus | papyrus |
musique | musique | musique |
music | music | music |
natation | natation | natation |
nations-unies | nations-unies | nations-unies |
omnisports | omnisports | omnisports |
palace | palace | palace |
paralympique | paralympique | paralympique |
persofiction | persofiction | persofiction |
petrole | petrole | petrole |
planeur | planeur | planeur |
plateforme | plateforme | plateforme |
poker | poker | poker |
presse | presse | presse |
pretendant | pretendant | pretendant |
projet | projet | projet |
project | project | project |
psychologie | psychologie | psychologie |
quebec | quebec | quebec |
recherche | recherche | recherche |
rinkhockey | rinkhockey | rinkhockey |
rome-antique | rome-antique | rome-antique |
route | route | route |
rugby | rugby | rugby |
rugbyblack | rugbyblack | rugbyblack |
satellite | satellite | satellite |
sautski | sautski | sautski |
science-fiction | science-fiction | science-fiction |
serie-video | serie-video | serie-video |
ski-alpin | ski-alpin | ski-alpin |
snooker | snooker | snooker |
software | software | software |
sport | sport | sport |
sport-automobile | sport-automobile | sport-automobile |
squash | squash | squash |
stadium | stadium | stadium |
starwars | starwars | starwars |
surf | surf | surf |
taekwondo | taekwondo | taekwondo |
television | television | television |
templiers | templiers | templiers |
tennis | tennis | tennis |
tennis-de-table | tennis-de-table | tennis-de-table |
tennis-de-tableblack | tennis-de-tableblack | tennis-de-tableblack |
timbre | timbre | timbre |
train | train | train |
triathlon | triathlon | triathlon |
ultimate | ultimate | ultimate |
union-europeenne | union-europeenne | union-europeenne |
video | video | video |
voile | voile | voile |
volleyball | volleyball | volleyball |
water-polo | water-polo | water-polo |
-- Credits:
-- Original from fr:Module:Infobox
-- forked by وهراني @arwiki
-- Version: 20240613
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 i18n = {
['see doc'] = 'حول القالب',
['edit'] = 'تعديل',
['edit code'] = 'تعديل مصدري',
['edit item'] = 'تعديل ويكي بيانات',
['tracking cat'] = "صفحات بها بيانات ويكي بيانات",
['invalid block type'] = "لبنة بيانات غير صحيحة في القالب",
['default cat'] = "صيانة بطاقات",
['pages_using_bitaqa_with_no_params_cat'] = 'صفحات_تستخدم_وحدة_بطاقة/بلا_مدخلات',
['pages_using_bitaqa_cat'] = 'صفحات_تستخدم_وحدة_بطاقة',
['pages_with_empty_bitaqa_cat'] = 'صفحات_تستخدم_وحدة_بطاقة/بقالب_فارغ',
['pages_using_bitaqa_with_errors_cat'] = 'صفحات_تستخدم_وحدة_بطاقة/بها_أخطاء',
['pages_using_infobox_cat'] = 'مقالات تستعمل قوالب معلومات',
}
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
local getValue = localdata.getValue
local function expandQuery(query)
local function expand1Query(query,wikimod)
local noerr,data, nb
noerr,data, nb = pcall(wdexpandQuery,localdata.item ,wikimod,query)
if noerr
then return data, nb
else
addMaintenanceCat(i18n['pages_using_bitaqa_with_errors_cat'])
mw.log("WD Query Error : "..mw.dumpObject(data))
mw.log(debug.traceback('>>ERROR :>>'))
return '<span class="error">' .. (data) .. '</span>' ,1
end
end
local v, valnum -- نتيجة ، عدد النتائج للضبط الصرفي للعنوان
if(type(query) ~= 'table') then return nil end
-- الوحدات المستعملة
local wikimod = query.wikimod or localdata.wikimod or 'Wikidata2' --'Wikidata/fr'
if type(query["wikidata" .. 2]) ~= 'nil' then
local answers = {}
local maxNbAns
v,valnum = expand1Query(query["wikidata"]
or query["wikidata" .. 1],wikimod)
maxNbAns = valnum or 0
table.insert(answers,v)
local i = 2
while type(query["wikidata" .. i]) ~= 'nil' do
v,valnum =expand1Query(query["wikidata" .. i],wikimod)
maxNbAns = math.max(maxNbAns,valnum or 0)
table.insert(answers,v)
i = i+1
end
if #answers>0 then
return table.concat(answers, query.sep or "\n<br />"),maxNbAns
else return nil
end
else
return expand1Query(query,wikimod)
end
end
local function getWikidataValue(params, wikidataparam)
if(type(params) ~='table') then params={} end
if not localdata.item then
return nil
end
if params.blockers then -- blockers are local parameters that disable the wikidata query
local blockers = params.blockers
if (type(blockers) == 'string') then
blockers = {blockers}
end
for i, blocker in ipairs(blockers) do
if getValue(blocker) then return nil end
end
end
local v, valnum -- قيم النتائج وعددها (لعرض مناسب في حالة الجمع)
if not wikidataparam then wikidataparam = 'wikidata' end
if params[wikidataparam] then
if type(params[wikidataparam]) == 'function' then
v, valnum = params[wikidataparam](localdata.item)
elseif type(params[wikidataparam]) == 'table' then
v, valnum = expandQuery(params[wikidataparam])
else
v, valnum = params[wikidataparam]
end
end
local i = 2
while not v and type(params["wikidata" .. i]) ~= 'nil' do
wikidataparam = "wikidata" .. i
i = i + 1
if params[wikidataparam] then
if type(params[wikidataparam]) == 'function' then
v, valnum = params[wikidataparam](localdata.item)
elseif type(params[wikidataparam]) == 'table' then
v, valnum = expandQuery(params[wikidataparam])
else
v, valnum = params[wikidataparam]
end
end
end
if not v or valnum==0 then return nil end
return v, valnum
end
function p.separator(params)
if(type(params) ~='table') then params={} end
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)
if(type(params) ~='table') then params={} end
local text = getValue(params.value, params)
or params.textdefaultvalue
or getWikidataValue(params)
or mw.title.getCurrentTitle().text
local subtext = getValue(params.subtitle)
or getWikidataValue(params, 'wikidatasubtitle')
or params.subtitledefaultvalue
if subtext and (subtext ~= text) then
text = text .. '<br /><small>' .. subtext .. '</small>'
end
local class = 'entete ' .. (params.icon or '')
-- overwrites with those provided in the module
local style = {}
style['background-color'] = maincolor
style['color'] = thirdcolor
if params.style then
for i, j in pairs(params.style) do
style[i] = j
end
end
local title = mw.html.create('div')
:addClass(class)
:css(style)
:tag('div')
:wikitext(text)
:allDone()
return title
end
p.buildTitle = p.buildtitle
local function getwdImage(Q, property)
property = property
local QID
if type(Q) == 'table' and Q.id and Q.id ~= '-'
then QID = Q.id
else return
end
local wdata
if (type(property) == 'string')
then wdata = mw.wikibase.getBestStatements(QID, property)
elseif(type(property) == 'table')
then for _,prop in ipairs(property) do
wdata = mw.wikibase.getBestStatements(QID,prop)
if(wdata) then break end
end
else return
end
local first
for _, image in pairs(wdata) do
if image.mainsnak.snaktype == 'value' then
if not first then
first = image.mainsnak.datavalue.value
end
local q = image.qualifiers
if q and q.P2096 then
for _, caption in pairs(q.P2096) do -- P2096 is 'caption'
if caption.snaktype == 'value'
and caption.datavalue.value.language == wikiLang then
return
image.mainsnak.datavalue.value, caption.datavalue.value.text
end
end
end
end
end
return first,nil
end
local function getImageFromWD(Q, pwd)
local images,caption
if type(pwd.property) == 'table' then
pwd.property = mw.text.listToText(pwd.property, '**', '**')
end
if type(pwd) == 'table' then
for p in string.gmatch(pwd.property, 'P%d+') do
images,caption = getwdImage(Q, p)
if images then
addWikidataCat(p)
return images,caption
end
end
end
if type(pwd) == 'function' then
images = pwd()
if type(images) == 'string' then
return images
end
end
end
function p.buildgallery(params)
if(type(params) ~='table') then params={} end
if(type(params.images) ~= 'table') then return nil end
local images = {}
for _, im in ipairs(params.images) do
local imv = getValue(im.imageparameters)
if type(imv)=='string' then
table.insert(images, {
img = imv ,
cap = (getValue(im.captionparameter) or im.defaultcaption or '')
})
else
local caption
if type(im.property) == 'string' then
im.wikidata = {['property'] = im.property}
end
if type(im.wikidata) == 'table' then
imv,caption = getImageFromWD(localdata.item, im.wikidata)
if type(imv)=='string' then
table.insert(images, {
img = imv ,
cap = (caption or im.defaultcaption or '')
})
end
end
end
end
if #images >= 0 then
local arg = {
total_width = params.total_width or '280',
align = params.align or 'center',
footer = params.footer,
footer_align = params.footer_align or 'center',
caption_align = 'center',
border = 'infobox'
}
local i=1
for _, im in ipairs(images) do
arg["image"..i] = im.img
arg["caption"..i] = im.cap
i = i + 1
end
return
'<div style="width: '..tostring( params.width or 280 ) ..'px;clear: both">'
.. require("Module:Multiple image").renderMultipleImages(arg,arg)
.. mw.getCurrentFrame():extensionTag( 'templatestyles', '', { src = "Multiple image/styles.css"})..
'</div>'
end
return
end
function p.buildimages(params)
if(type(params) ~='table') then params={} end
local images = {}
local upright, link, caption, captionfromwd, alt, size -- size is deprecated
if type(params.imageparameters) == 'string' then
params.imageparameters = {params.imageparameters}
end
if type(params.imageparameters) ~= 'table' then -- في حالة غياب أي مدخل لصورة
params.imageparameters = {}
end
for j, k in ipairs(params.imageparameters) do
table.insert(images, getValue(k))
end
-- Images from Wikidata
if #images == 0 and localdata.item then
if params.property then
params.wikidata = {entity = localdata.item, property = params.property}
end
if params.wikidata then
images,captionfromwd = getImageFromWD(localdata.item, params.wikidata)
if type(images) == 'string' then
images = {images}
end
if (not images) then
images = {}
end
end
end
-- استعمال صور افتراضبة في حال عرفت
if #images == 0 then
if params.maintenancecat then
addMaintenanceCat(params.maintenancecat, params.sortkey)
end
if params.defaultimages then
images = params.defaultimages
if type(images) == 'string' then
images = {images}
end
upright = params.defaultimageupright
caption = params.defaultimagecaption
link = params.defaultimagelink
alt = params.defaultimagealt
if not alt and ( images[1] == 'DefautAr.svg' or images[1] == 'Defaut 2.svg' ) then
alt = 'نحتاج صورة تكون من الأفضل حرة'
end
end
end
if #images == 0 then
return nil
end
upright = upright or getValue(params.uprightparameter) or params.defaultupright or "1.2"
link = link or getValue(params.linkparameter) or params.defaultlink
caption = captionfromwd or caption or getValue(params.captionparameter) or params.defaultcaption
alt = alt or getValue( params.altparameter) or params.defaultalt
size = size or getValue(params.sizeparameter) or params.defaultsize
if size then
local numsize = size:gsub('px', '')
numsize = size:gsub('بك', '')
numsize = mw.ustring.gsub(numsize, 'x.*', '')
numsize = tonumber(numsize)
if type(numsize) ~= 'number' or numsize > 280 then
addMaintenanceCat("مقالات تسيء استعمال حجم الصورة")
end
if tonumber(size) then
size = size .. 'px'
end
size = '|' .. size
else
size = ''
end
if tonumber(upright) then
upright = tostring(tonumber(upright) ) / #images
end
if tonumber(size) then
size = tostring(tonumber(size) ) / #images
end
local style = params.style or {padding ='2px 0',}
-- تحضير عرض الصورة
local 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 .. size .. '|frameless'
-- [[
if alt then imagesString = imagesString .. '|alt=' .. alt end
if link then imagesString = imagesString .. '|link=' .. link end
if upright then
imagesString = imagesString .. '|upright=' .. upright
elseif #images > 1 then
imagesString = imagesString .. '|upright=' .. ( 1 / #images )
end
imagesString = imagesString .. ']]'
end
end
local image = mw.html.create('div')
:addClass("images")
:css(style)
:wikitext(imagesString)
:done()
-- التعليق
local captionobj
if caption then
captionobj = mw.html.create('div')
:wikitext(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)
if(type(params) ~='table') then params={} end
local class = params.class or ''
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 text = getValue(params.value, params)
or getWikidataValue(params)
or params.defaultvalue
if text == '-' then
return
end
if not text then
addMaintenanceCat(params.maintenancecat, params.sortkey)
return nil
end
local formattedtext = mw.html.create('p')
:addClass(class)
:css(style)
:wikitext(text)
:done()
return formattedtext
end
p.buildText = p.buildtext
function p.buildrow(params)
if(type(params) ~='table') then params={} end
local class = params.class or ''
local style = params.style or {}
local valueClass = params.valueClass or ''
local valueStyle = params.valueStyle or {}
local value, number = getValue(params.value, params)
if (not value) then
value, number = getWikidataValue(params, 'wikidata')
end
if (not value) and (params.property) then
value, number = expandQuery{ property = params.property } --, ucfirst = params.ucfirst
end
if not value then
value = params.defaultvalue
end
if value == '-' then
return nil
end
if not value then
if params.maintenancecat then
local maintenancecat = getValue(params.maintenancecat, params)
addMaintenanceCat(maintenancecat, params.sortkey)
end
return nil
end
if not number then
number = 0 -- == غير معرف
end
local label = params.label
if type(label) == 'table' then label= getValue(params.label, params) end
if number > 1 and (params.plurallabel) then
label = params.plurallabel
elseif number == 1 and (params.singularlabel) then
label = params.singularlabel
end
if type(label) == 'function' then
label = label(localdata, localdata.item)
end
if not label and type(params.defaultlabel) == 'string' then
label = params.defaultlabel
end
if number > 4 then --- إخفاء النتيجة في حال تجاوز عددها 4
params.hidden = true
end
-- format
local formattedvalue = mw.html.create('div')
:wikitext('\n' .. 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(valueClass)
:css(valueStyle)
:allDone()
local formattedlabel
if label then
formattedlabel = mw.html.create('th')
:attr('scope', 'row')
:wikitext(label)
:done()
end
local row = mw.html.create('tr')
:addClass(class)
:css(style)
:node(formattedlabel)
:node(formattedvalue)
:done()
return row
end
p.buildRow = p.buildrow
function p.buildnavbox(params)
if(type(params) ~='table') then params={} end
-- تعريف الستايل
local class = "overflow nav " .. (params.class or '')
local style = params.style or {}
if params.separated then -- خيار إضافة فاصل مسبق
class = class .. ' bordered'
style['border-top'] = '1px solid' .. maincolor
end
-- ترتيب البيانات
params.previousval = params.previousval or params.previousparameter
params.nextval = params.nextval or params.nextparameter
if params.previousproperty then
params.previouswikidata = {property = params.previousproperty, conjtype='<br />'}
end
if params.nextproperty then
params.nextwikidata = {property = params.nextproperty, conjtype='<br />'}
end
local previousval = getValue(params.previousval, params)
or getWikidataValue(params, 'previouswikidata')
local nextval = getValue(params.nextval, params)
or getWikidataValue(params, 'nextwikidata')
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(previousval)
:done()
end
if nextval then
nextNode = mw.html.create('div')
:addClass('next_bloc')
:wikitext(nextval)
:done()
end
if previousval or nextval then
navbox
:addClass(class)
:css(style)
:node(prevNode)
:node(nextNode)
:allDone()
return navbox
end
return nil
end
p.buildNavbox = p.buildnavbox
function p.buildsuccession(params)
if(type(params) ~='table') then params={} end
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'
-- ترتيب البيانات
params.previousval = params.previousval or params.previousparameter
params.nextval = params.nextval or params.nextparameter
if params.previousproperty then
params.previouswikidata = {property = params.previousproperty}
end
if params.nextproperty then
params.nextwikidata = {property = params.nextproperty}
end
local before = params.value['before']
or getValue(params.previousval, params)
or getWikidataValue(params, 'previouswikidata')
local after = params.value['after']
or getValue(params.nextval, params)
or getWikidataValue(params, 'nextwikidata')
local center = params.value['center']
--
local widthCell = '44%'
if center then
widthCenter = '28%'
widthCell = '29%'
end
local formattedbefore
if 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(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 center then
formattedcenter = mw.html.create('td')
:attr({align = 'center'})
:attr({valign = 'middle'})
:attr({width = widthCenter})
:css(style)
:wikitext(center)
:done()
row:node(formattedcenter)
formattedcenter = mw.html.create('td')
:attr({width = '1%'})
:css(styleTrans)
:wikitext('')
:done()
row:node(formattedcenter)
end
local formattedafter
if after then
formattedafter = mw.html.create('td')
:attr({align = 'left'})
:attr({valign = 'middle'})
:attr({width = widthCell})
:css(style)
:wikitext(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(type(params) ~='table') then params={} end
local value, number = getValue(params.value, params)
if (not value) then
value, number = getWikidataValue(params, 'wikidata')
end
if (not value) and (params.property) then
value, number = expandQuery{ property = params.property }
end
if not value then
value = params.defaultvalue
end
if value == '-' or type(value)== 'nil' then
return nil
end
local class = params.class
local rowcolor
if params.color == 'secondcolor' then
rowcolor = secondcolor
else
rowcolor = params.color
end
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'
if number and number > 4 then --- اخفاء النتيجة في حال تجاوز عددها 4
params.hidden = true
end
local formattedvalue = mw.html.create('div')
:wikitext('\n' .. 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)
if(type(params) ~='table') then params={} end
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
local text = getValue(params.value, params) or getWikidataValue(params) or params.defaultvalue
if text == '-' then
return
end
if not text then
addMaintenanceCat(params.maintenancecat, params.sortkey)
return nil
end
local title = mw.html.create('div')
:addClass(class)
:css(style)
:tag('div')
:wikitext(text)
:allDone()
return title
end
p.buildSubTitle = p.buildsubtitle
function p.buildtable(params)
if(type(params) ~='table') then params={} end
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.buildinvalidblock(args)
addMaintenanceCat(defaultcat)
local text = ''
if type(args) ~= 'table' then
text = "لبنات قالب بطاقة يجب أن تكتب على شكل جداول (table)"
else
text = i18n["invalid block type"] .. ' : ' .. (args.type or '??')
end
return text
end
p.buildInvalidBlock = p.buildinvalidblock
function p.buildmap(params)
if(type(params) ~='table') then params={} end
local latitude = getValue({'latitude','دائرة العرض','دائرة عرض'})
local longitude = getValue({'longitude','خط الطول','خط طول'})
local itemid
if localdata.item and localdata.item.id then itemid = localdata.item.id end
if(not params.ids and not longitude and not itemid ) then return nil end
if itemid and not (
#(mw.wikibase.getBestStatements(itemid, 'P625'))~=0
or params.ids or longitude
) then return nil end
--mw.logObject(#(mw.wikibase.getBestStatements(itemid, 'P625')))
local width = tonumber(params.width) or 260
if width > 260 then
--addMaintenanceCat("خطأ في بطاقة/صورة بأبعاد كبيرة")
width = 260
end
local newparams = {
['marker-symbol'] = params.marker or 'marker'
, ['marker-color'] = params.markercolor or '#FF0000'
, ['marker-size'] = params.markersize
, frameless='yes'
, ['width']=width
, ['height']=width
, ['latitude']= latitude
, ['longitude']= longitude
, ['align']='center'
, type='mapframe'
, geotype= params.geotype
, item = itemid
, ids = params.ids
, zoom= params.zoom or params.default_zoom or 9
, lang="ar"
, title = mw.title.getCurrentTitle().text
, debug = params.debug --or 1
}
if params.params and type(params.params) == 'table' then -- بيانات اضافية
for i, j in pairs(params.params) do
if(not newparams[i]) then newparams[i] = j end
end
end
local f_tag = require('Module:Map')._tag
local noerr,data = pcall(f_tag,newparams)
if noerr == true
then return data
else
addMaintenanceCat(i18n["pages_using_bitaqa_with_errors_cat"])
mw.log("Error from [[Module:Map]] : "..mw.dumpObject(data))
mw.log(debug.traceback('>>ERROR :>>'))
return nil
end
end
p.buildMap = p.buildmap
function p.buildexternaltext(params)
if(type(params) ~='table') then params={} end
local value = getValue(params.value)
if value and (type(value) == 'string') then
externaltext = externaltext .. value
end
end
p.buildExternalText = p.buildexternaltext
function p.buildfooter(params)
if(type(params) ~='table') 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 backlinkstr = '['
.. tostring( mw.uri.fullUrl( page.name, 'veaction=edit§ion=0' ) )
.. ' ' .. i18n['edit'] .. ']'.. ' - ['
.. tostring( mw.uri.fullUrl( page.name, 'action=edit§ion=0' ) )
.. ' ' .. i18n['edit code'] .. ']'
local itemlinkstr
if localdata.item and localdata.item.id then
itemlinkstr = '[[d:' .. localdata.item.id .. '|' .. i18n['edit item'] .. ']]'
end
local editstr = backlinkstr
if itemlinkstr then
editstr = editstr .. ' - ' .. itemlinkstr
end
local editlinkspan = mw.html.create('span')
:css({['text-align'] = "right", ['font-size'] = "80%",['background'] = "inherit"})
:addClass('plainlinks')
:wikitext(editstr)
:done()
local doclinkstr = '[[File:Test_Template_Info-Icon_-_Version_(2).svg|30x15px|link='
.. localdata["__templatename__"] .. '|' .. i18n['see doc'] .. ']]'
local doclinkspan = mw.html.create('span')
:css({['text-align'] = "left",['float'] = "left"})
:wikitext(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,
['gallery'] = p.buildgallery,
['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(style)
: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()
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
function p.build()
local noerr,data, nb
noerr,data = pcall(_modbuild)
if noerr
then return data
else
mw.log("Bitaqa Error : "..mw.dumpObject(data))
mw.log(debug.traceback('>>ERROR :>>'))
addMaintenanceCat(i18n['pages_using_bitaqa_with_errors_cat'])
return '<span class="error">' .. (data) .. '</span>'
end
end
p['تركيب'] = p.build
return p