Módulo:Databox

Fonte: Enciclopédia de conhecimento da Igreja de Deus
Saltar para a navegação Saltar para a pesquisa

A documentação para este módulo pode ser criada na página Módulo:Databox/doc

local property_blacklist = {
				'P360', --is a list of
				'P4224', --category contains
				'P935', -- Commons gallery
				'P1472', -- Commons Creator page
				'P1612', -- Commons Institution page
				'P373', -- Commons category
				'P3722', -- Commons maps category
				'P1151', -- topic's main Wikimedia portal
				'P1424', -- topic's main template
				'P910', -- topic's main category
				'P1200', -- bodies of water basin category
				'P1792', -- category of associated people
				'P1464', -- category for people born here
				'P1465', -- category for people who died here
				'P1791', -- category of people buried here
				'P1740', -- category for films shot at this location
				'P2033', -- Category for pictures taken with camera
				'P2517', -- category for recipients of this award
				'P4195', -- category for employees of the organization
				'P1754', -- category related to list
				'P301', -- category's main topic
				'P971', -- category combines topics
				'P3876', -- category for alumni of educational institution
				'P1753', -- list related to category
				'P3921', -- Wikidata SPARQL query equivalent
				'P1204', -- Wikimedia portal's main topic
				'P1423', -- template's main topic
				'P1709', -- equivalent class
				'P3950', -- narrower external class
				'P2888', -- exact match
				'P1382', -- coincident with
				'P527', -- has part
				'P2670', -- has parts of the class
				'P3113', -- does not have part
				'P2737', -- union of
				'P2738', -- disjoint union of
				'P2445', -- metasubclass of
				'P1963', -- properties for this type
				'P3176', -- uses property
				'P1889', -- different from
				'P460', -- said to be the same as
				'P2959', -- permanent duplicated item
				'P2860', -- cites
				'P5125', -- wikimedia outline
				'P5008', -- on focus list of Wikimedia project
				'P2559', -- Wikidata usage instructions
				'P1343', -- described by source
				'P972', --  catalogu
				'P1282', -- OSM tag or key
				'P4839', -- Wolfram Language entity code
				'P6104', -- Maintained by Wikiproject
				'P5996', -- Category for films in this language
				'P2357', -- Code Classification of Instructional Program
}
function valuesToKeys(array)
				local result = {}
				for _, v in pairs(array) do
								result[v] = true
				end
				return result
end
local p = {}
function p.formatBlackList(frame)
				local template = frame.args[1]
				local res = ""
				for i, prop in ipairs(property_blacklist) do
								res = res .. "* " .. frame:expandTemplate{title=template,args = { prop  }} .. "\n"
				end
				return res
end
local function getLegend(image_statement, lang)
				
				if image_statement.qualifiers and image_statement.qualifiers["P2096"] then
								
								for k, v in pairs (image_statement.qualifiers["P2096"]) do
												if v.datavalue.value.language == lang then
																return mw.wikibase.formatValue(v)
												end
								end
				end
end
function p.databox(frame)
				local args = frame:getParent().args
				local itemId = nil
				if args.item then
								itemId = args.item
				end
				local lang = mw.language.getContentLanguage()
				local item = mw.wikibase.getEntity(itemId)
				
				if item == nil then
								mw.addWarning("Wikidata item not found")
								return ""
				end
				
				local classes =  'infobox_v2' --'expandTemplate{ title = 'Classes début infobox', args = { version = '3' } }
				classes = classes .. ' large'
				
				local databoxRoot = mw.html.create('div')
								:addClass(classes)
								:css({
												float = 'right',
												border = '1px solid #aaa',
												['max-width'] = '300px',
												padding = '0 0.4em',
												margin = '0 0 0.4em 0.4em',
								})
				local label = item:getLabel()
				--Title
				databoxRoot:tag('div')
								:css({
												['text-align'] = 'center',
												['background-color'] = '#f5f5f5',
												padding = '0.5em 0',
												margin = '0.5em 0',
												['font-size'] = '120%',
												['font-weight'] = 'bold',
								})
								:wikitext(
														(label and lang:ucfirst(label))
														or mw.title.getCurrentTitle().text
								)
					--Image
				local images = item:getBestStatements('P18')
				
				if #images == 1 then
								local caption = getLegend(images[1], lang:getCode())
								local captionobj
								
								local image_wikitext = '[[File:' .. images[1].mainsnak.datavalue.value .. '|frameless|300px]]'
								
								local imageobj = mw.html.create('div')
												:addClass("images")
												:css(style or {padding ='2px 0',})
												:wikitext(image_wikitext)
												:done()
				
								if caption then
												captionobj = mw.html.create('div')
																:addClass("legend")
																:wikitext(caption)
																:done()
								end
								databoxRoot
															:tag('div')
															:node(imageobj)
															:node(captionobj)
															:done()
				end
				--Table
				local dataTable = databoxRoot
								:tag('table')
								:css({
												['text-align'] = 'left',
												-- ['font-size'] = '90%',
												['word-break'] = 'break-word',
												['width'] = '100%',
												['table-layout'] = 'fixed',
								})
				
				dataTable:tag('caption')
													:css({
																	['background-color'] = '#f5f5f5',
																	['font-weight'] = 'bold',
																	['margin-top'] = '0.2em',
													})
													:wikitext(item:formatStatements('P31').value)
	
				local properties = mw.wikibase.orderProperties(item:getProperties())
				local property_blacklist_hash = valuesToKeys(property_blacklist)
				property_blacklist_hash['P31'] = true --Special property
				local edit_message = mw.message.new('vector-view-edit'):plain()
				for _, property in pairs(properties) do
								local datatype = item.claims[property][1].mainsnak.datatype
								if datatype ~= 'commonsMedia' and datatype ~= 'external-id' and datatype ~= 'quantity' and datatype ~= 'wikibase-property' and datatype ~= 'geo-shape' and datatype ~= 'tabular-data' and not property_blacklist_hash[property] and #item:getBestStatements(property) <= 5 then
												local propertyValue = item:formatStatements(property)
												dataTable:tag('tr')
																:tag('th')
																				:attr('scope', 'row')
																				:wikitext(lang:ucfirst(propertyValue.label)):done()
																:tag('td')
																				:wikitext(frame:preprocess(propertyValue.value))
																				:wikitext('&nbsp;[[File:OOjs UI icon edit-ltr.svg|' .. edit_message .. '|12px|baseline|class=noviewer|link=https://www.wikidata.org/wiki/' .. item.id .. '#' .. property .. ']]')
								end
				end
					
					--Map
				local coordinates_statements = item:getBestStatements('P625')
				if #coordinates_statements == 1 and coordinates_statements[1].mainsnak.datavalue and coordinates_statements[1].mainsnak.datavalue.value.globe == 'http://www.wikidata.org/entity/Q2' then
								--We build the call to mapframe
								local latitude = coordinates_statements[1].mainsnak.datavalue.value.latitude
								local longitude = coordinates_statements[1].mainsnak.datavalue.value.longitude
								local geojson = {
												type = 'Feature',
												geometry = {
																type = 'Point',
																coordinates = { longitude, latitude }
												},
												properties = {
																title = item:getLabel() or mw.title.getCurrentTitle().text,
																['marker-symbol'] = 'marker',
																['marker-color'] =  '#224422',
												}
								}
								databoxRoot:wikitext(frame:extensionTag('mapframe', mw.text.jsonEncode(geojson), {
												height = 300,
												width = 300,
												frameless = 'frameless',
												align = 'center',
												latitude = latitude,
												longitude = longitude,
												zoom = zoom
								}))
					end
					
					return tostring(databoxRoot)
end
return p