وحدة:بطاقة

-- 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("&nbsp;[[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("&nbsp;[[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&section=0' ) )  		.. ' ' .. i18n['edit'] .. ']'.. ' - ['  		.. tostring( mw.uri.fullUrl( page.name, 'action=edit&section=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