Zum Inhalt springen

Modul:Vorlage:Infobox Gut

aus Wikipedia, der freien Enzyklopädie
Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch English

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


--[=[ 2025-03-11
Unterstützung für {{Vorlage:Infobox Gut}}
Unterstützung für {{Vorlage:Infobox Park}}
infobox() test()
]=]

-- Baut eine Infobox für ein Gut --

local wikidataId = ''
local hdrLine = '=Überschrift='

-- List of possible data elements with the parameter name and the display name for each element --
-- {hdrLine,'header'} inserts a header
-- Data will be displayed in order as listed
-- only for testing, should be provided by parameter "Parameterliste"
local dataLists = {
	-- Daten bei Auruf von  Infobox Gut
	Gut = {
		{hdrLine,'Kenndaten'},
		{'Ort', 'Ort'},
		{'Ortsteil', 'Ortsteil'},
		{'Gutsherren', 'Gutsherren'},
		{'Hofeigentümer', 'Hofeigentümer'},
		{'Entstehungszeit', 'Entstehungszeit'}, 
		{'Neugestaltet', 'Neugestaltet'},
		{'HistNamen', 'Hist. Namen'},
		{'Straßen', 'Umgebende Straßen'},
		{'Strassen', 'Umgebende Strassen'},
		{'Gutsanlagen', 'Gutsanlagen'},
		{'Hofanlagen', 'Hofanlagen'},
		{'Gutsgestaltung', 'Gutsgestaltung'},
		{'Hofgestaltung', 'Hofgestaltung'},
		{'Zustand', 'Zustand'},
		{'Nutzung heute', 'Nutzung heute'},
		{hdrLine,'Geodaten'},
		{'Fläche', 'Fläche'},
		{'Gutsfläche', 'Gutsfläche'},
		{'Hoffläche', 'Hoffläche'},
		{'Höhe', 'Höhe'},
	}
}

-- table object with methods to create 2 column wiki table --
local tableCode = {
	code = '', -- here we gather the wikitext for the infobox table
	codeMarker = 0, -- marks a position in code
	nl = '\n',
	
	-- formats for the table and different rows of the table
	tblFormat		= 'class="infobox float-right toptextcells hintergrundfarbe1 rahmenfarbe1"'
					  .. ' cellspacing="0" cellpadding="1"'
					  .. ' style="width:250px; border-style:solid; padding: 1px; margin-left:2em; margin-bottom:2em; font-size:90%;"',
	titleFormat 	= 'class="hintergrundfarbe9"'
					  .. ' style="padding: 5px; font-size: 125%; font-weight: bold;"',
	artFormat		= 'style="text-align:center; vertical-align:middle; padding: 5px 4px 0px 4px; font-size:100%; font-weight:bold;"',
	bildFormat		= 'style="text-align:center; vertical-align:middle; border-top-style:solid; border-color:#888; border-width:2px;"',
	bildTitelFormat = 'style="text-align:center; vertical-align:middle; font-size:smaller;"',
	abschTitelFormat = 'style="text-align:center; vertical-align:middle; margin: 5px; background: #DFDFDF; border-top-style:solid; border-color:#999999; border-width:2px;"',
	centeredFormat	= 'style="text-align:center; vertical-align:middle; font-size:smaller; padding:2px; background-color:#f2f2f4;"',
	planFormat		= 'style="text-align:center; vertical-align:middle; font-size:smaller; padding:2px"',
	
	addToTbl = function (self,typ,css,cell1,cell2) -- adds a row to the table of the given type, format and cell contents
				if self[typ] then
					-- fill nil parameters with ''
					css = css or ''
					cell1 = cell1 or ''
					cell2 = cell2 or ''
					-- call type specific function
    				self.code = self.code .. self[typ](self,css,cell1,cell2)
				else
    				mw.log('tableCode:addToTbl(<typ>): -' .. typ .. '- ist ein ungültiger Wert für Parameter typ')
				end		
			   end,
	setMarker = function (self) -- remember current end of wiki text
					self.codeMarker = string.len(self.code)
					return
				end,
	setBack = function (self) -- truncate wiki text to position set by setMarker
					self.code = string.sub(self.code,1,self.codeMarker)
			   end,
	export = function (self) -- checks correct closure of table and returns wikitext for generated table 
					if string.sub(self.code, -2) ~= '|}' then
						self:addToTbl('end')
					end
					return self.code
			 end,
	['bgn'] = function (self,css,cell1,cell2) -- start wiki table
				return '{| ' .. css
			  end,
	['end'] = function (self,css,cell1,cell2) -- end wiki table
				return  self.nl .. '|}'
			  end,
	['nro'] = function (self,css,cell1,cell2) -- start a new row
				return  self.nl .. '|-'
			  end,
	['hdr'] = function (self,css,cell1,cell2) -- insert a header row spanning both columns
				return  self:nro() .. self.nl .. '! colspan="2" ' .. css .. '|' .. cell1
			  end,
	['sgl'] = function (self,css,cell1,cell2) -- insert row spanning both columns
				return  self:nro() .. self.nl .. '| colspan="2" ' .. css .. '|' .. cell1
			  end,
	['dbl'] = function (self,css,cell1,cell2) -- insert row with both columns
				return  self:nro() .. self.nl .. '|' .. cell1 .. '||' .. cell2
			  end,
}

-- check if string object exists or is empty --
local function isempty(s)
  return s == nil or s == ''
end

-- Bilderwunsch platzieren
local function bilderwunsch(frame,pArgs)
	local r = frame:expandTemplate{ title = 'Bilderwunsch/Listeneintrag', 
				{
					['NAME'] = mw.title.getCurrentTitle().text,
					['BREITENGRAD'] = pArgs['Breitengrad'],
					['LÄNGENGRAD'] = pArgs['Längengrad']
				}
			   }
	return r
end

-- display and log error --
local function errortxt(frame,e)
	local templName = frame:getParent():getTitle()
	local msg = '<span class="error editoronly" style="display:none">Fehler in [[' .. templName ..']] – ' .. e .. '</span>'
	if mw.title.getCurrentTitle().namespace == 0 then
		msg = msg .. ' [[Kategorie:Wikipedia:Vorlagenfehler/' .. templName .. ']]'
	end
	return msg
end


-- main function that reads and checks the parameters and compiles the infobox accordingly --
function main(frame,pArgs)
	local ortsTyp = ''
	local dataList = {} -- Datenliste für diesen Aufruf Typ
	local myArgs = frame.args
    -- local pFrame = frame:getParent() -- Parent enviroment to access template parameters
    -- local pArgs = pFrame.args
    local nameSpace = mw.title.getCurrentTitle().namespace
    local title = '' -- title to be used for infobox
    local ort = '' -- Ort ohne eventuelle Verlinkung
    local breakLine = '<br/>' -- html line break for line break inside cell
    -- temporarily used variables
    local cell1 = ''
    local cell2 = ''
	local entryFlag = false -- used to flag that an entry was made for a specific section
	local coordArticle = '' -- set if coordinates should be written in upper left corner of article
	local errorStr = ''

	-- Version passend zu Vorlage anpassen
	if isempty(myArgs[1]) then
		ortsTyp = 'Gut'
		dataList = dataLists[ortsTyp]
	else
		ortsTyp = string.gsub(string.gsub(myArgs[1],'^%s*',''),'%s*$','')
	end
	
	
	---[=[
	if not isempty(myArgs['Parameterliste']) then
		lucky, dataList = pcall(mw.text.jsonDecode, myArgs['Parameterliste'], mw.text.JSON_TRY_FIXING )
		if not lucky then
			error('Syntaxfehler in Parameterliste')
		end
	end
	--]=]
	
	-- Bezeichnung für Ort und Ortsteil wenn so spezifiziert ändern (Platz)
	for i,v in ipairs(dataList) do
		if v[1] == 'Ort' and not isempty(pArgs['Bezeichnung Ort']) then
			dataList[i][2] = pArgs['Bezeichnung Ort']
		end
		if v[1] == 'Ortsteil' and not isempty(pArgs['Bezeichnung Ortsteil']) then
			dataList[i][2] = pArgs['Bezeichnung Ortsteil']
		end
	end
	
	-- Ortsnamen ohne eventuell angegebene eckige Klammern merken und falls Artikel zum Ort existiert mit eckigen Klammern in pArgs.Ort speichern 
	if not isempty(pArgs.Ort) then -- entferne eventuellen Link [[ ... ]]
		ort = require('Module:WLink').WLink().getPlain(pArgs.Ort)
		-- ort = string.gsub(string.gsub(pArgs.Ort,'^%s*%[%[%s*',''),'%s*%]%]%s*$','')
		local titleObj = mw.title.new(ort)
		if titleObj and titleObj.exists then
			pArgs.Ort = '[[' .. ort .. ']]'
		end
	end
	
    -- start infobox table
	tableCode:addToTbl('bgn',tableCode.tblFormat)
	
		-- Geodaten bei Angabe von Koordinaten unter Verwendung der Vorlagen Coordinate und Positionskarte --
	if pArgs['Breitengrad'] == 'wikidata' then
		-- get coordinates from wikidata
		wikidataId = mw.wikibase.getEntityIdForCurrentPage()
		local entity = mw.wikibase.getEntity()
		if entity and entity.claims.P625 then
			local coord = entity.claims.P625[1].mainsnak.datavalue.value
			-- tableCode:addToTbl('dbl','',coord.latitude,coord.longitude)
			pArgs['Breitengrad'] = coord.latitude
			pArgs['Längengrad'] = coord.longitude
		else
			pArgs['Breitengrad'] = ''
			pArgs['Längengrad'] = ''
			tableCode:addToTbl('sgl','',errortxt(frame,'keine Koordinaten in Wikidata'))
			entryFlag = true
		end
	end
		
	
	-- infobox title if not specified use title of calling article --
	if isempty(pArgs.Name) then
		title = mw.title.getCurrentTitle().text
	else 
		title = pArgs.Name
	end
	cell1 = title
	if not isempty(pArgs.Alternativnamen) then
		cell1 = cell1 .. breakLine .. "<small>''" .. pArgs.Alternativnamen .. "''</small>"
	end
	tableCode:addToTbl('hdr',tableCode.titleFormat,cell1)
	
	-- Zeile mit Typ des Gutes --
	if not isempty(pArgs.Gut) then
		pArgs.Objektbezeichnung = pArgs.Gut
	end
	if isempty(pArgs.Objektbezeichnung) then
		cell1 = ortsTyp
	else
		cell1 = pArgs.Objektbezeichnung
	end
	if not isempty(ort) then
		cell1 = cell1 .. '&nbsp;in ' .. ort
	end
	if not isempty(pArgs.Kategorie) then
		cell1 = '[[:Kategorie:' .. pArgs.Kategorie .. '|' .. cell1 .. ']]'
	end
	if not isempty(pArgs.Wappen) then
		cell1 = '[[Datei:'.. pArgs.Wappen .. '|left|18px|class=noviewer]] ' .. cell1
	elseif not isempty(pArgs.Stadtwappen) then
		cell1 = '[[Datei:'.. pArgs.Stadtwappen .. '|left|18px|class=noviewer]] ' .. cell1
	end
	tableCode:addToTbl('sgl',tableCode.artFormat,cell1)
	
	-- Bild des Gutes und Bild Bezeichnung --
	if isempty(pArgs.Bild) then
		-- tableCode:addToTbl('sgl',tableCode.bildFormat,bilderwunsch())
	else
		if pArgs.Bild == 'Bilderwunsch' then
			tableCode:addToTbl('sgl',tableCode.bildFormat,bilderwunsch(frame,pArgs))
		elseif pArgs.Bild == 'none' then
			cell1 = '' -- ignore
		else
			tableCode:addToTbl('sgl',tableCode.bildFormat,'[[Datei:' .. pArgs.Bild .. '|245px|' .. title .. ']]')
			if not isempty(pArgs['Bild zeigt']) then
				tableCode:addToTbl('sgl',tableCode.bildTitelFormat,pArgs['Bild zeigt'])
			end
		end
	end
	
	-- Daten zum Gut --
	tableCode:setMarker()
	entryFlag = true
	for i,v in ipairs(dataList) do
		if v[1] == hdrLine then
			if not entryFlag then
				tableCode:setBack()
			end
			tableCode:setMarker()
			entryFlag = false
			tableCode:addToTbl('sgl',tableCode.abschTitelFormat,"'''" .. v[2] .. "'''")
		elseif not isempty(pArgs[v[1]]) then
			tableCode:addToTbl('dbl','',v[2],pArgs[v[1]])
			entryFlag = true
		end
	end
	
	-- Detail oder Lageplan, es werden die Bezeichnungen Plan oder Karte beim Parameter verwandt
	for i,v in ipairs({'Plan','Karte'}) do
		if not isempty(pArgs[v]) then
			tableCode:addToTbl('sgl',tableCode.planFormat,'[[Datei:' .. pArgs[v] .. '|245px|' .. title .. ']]')
			if not isempty(pArgs[v .. ' zeigt']) then
				tableCode:addToTbl('sgl',tableCode.bildTitelFormat,pArgs[v .. ' zeigt'])
			end
			entryFlag = true
		end
	end



	if not isempty(pArgs['Breitengrad']) then
		errorStr = ''
		local elev = ''
		local vargs = {}
		if isempty(pArgs['Längengrad']) then
			errorStr = errorStr .. 'Längengrad fehlt<br />'
		end
		if isempty(pArgs['Region-ISO']) then
			errorStr = errorStr .. 'Region-ISO Angabe fehlt<br />'
		end
		if  not isempty(pArgs['Höhe']) then
			elev = pArgs['Höhe']
		end
		if string.len(errorStr) > 0 then 
			tableCode:addToTbl('sgl','',errortxt(frame,errorStr)) -- missing information
			entryFlag = true
		else -- all necessary data available for coordinates and location map
			
			local nbx = not isempty(pArgs['NEBENBOX'])
			
			-- Zeile mit Koordinaten
			vargs = { -- compile parameters for template Coordinate
				text='/', -- Coordinates will be displayed inline in row of table
				article= '/',  -- Coordinates will not be displayed in upper right corner of article
				NS=pArgs['Breitengrad'],
				EW=pArgs['Längengrad'],
				elevation = elev,
				['type']='building',
				region=pArgs['Region-ISO'],
				dim=100,
				name=title				
			}
			if nbx then 
				vargs.article = '' -- Coordinates will be displayed in upper right corner of article
				vargs.text = '/' -- Coordinates will not be displayed inline in row of table
				cell1 = frame:expandTemplate{ title = 'Coordinate', args = vargs}
				tableCode:addToTbl('sgl',tableCode.centeredFormat,cell1)
				coordArticle = ''
				-- We place this code that displays coordinates in upper right corner of article later in last row of the table
			else
				cell1 = frame:expandTemplate{ title = 'Coordinate', args = vargs}
				tableCode:addToTbl('sgl',tableCode.centeredFormat,cell1)
				entryFlag = true
			end

			-- Positionskarte
			if not nbx then
				local templateName = 'Positionskarte ISO 3166-2'
				vargs = { -- compile parameters for template Positionskarte
					[1] = pArgs['Region-ISO'],
					label = title,
					position = 'none',
					lat = pArgs['Breitengrad'],
					long = pArgs['Längengrad'],
					elevation = elev,
					['type']='building',
					region=pArgs['Region-ISO'],
					dim = '100',
					name=title,
					width = '245',
					float='center',
					border = 'none',
					mark = 'Green Point.gif',
					marksize = '16',
					maptype = 'relief'
				}
				if not isempty(pArgs['Poskarte']) then
					templateName = 'Positionskarte'
					vargs[1] = pArgs['Poskarte']
				end
				cell1 = frame:expandTemplate{ title = templateName, args = vargs}
				tableCode:addToTbl('sgl',tableCode.planFormat,cell1)
				entryFlag = true
			end
		end -- if string.len(errorStr) > 0
	end -- not isempty(Breitengrad)
	if not entryFlag then
		tableCode:setBack()
	end
	
	if not isempty(wikidataId) then
		tableCode:addToTbl('dbl','','<small>Wikidata Id</small>','<small>' .. wikidataId .. '</small>')
	end

	if not isempty(coordArticle) then 
		-- Code to display coordinates in upper right corner of article goes in last hidden row of table
		tableCode:addToTbl('sgl','',coordArticle)
	end

	-- debug --
	-- Vorschau Seiten: Gut Cadenberge, Herrenhaus Wellingsbüttel, Vorlage:Infobox_Gut/Doku
	-- tableCode:addToTbl('dbl','','namespace',mw.title.getCurrentTitle().namespace)

	-- End of table --
	tableCode:addToTbl('end')

	-- Abliefern des Wikitext für die Tabelle --
    return tableCode:export()

end


-- Export

local p = {}

function p.test( frame, parameterList )
    local lucky, wikitxtInfobx = pcall( main, frame, parameterList )
    return wikitxtInfobx
end

function p.infobox( frame )
    local lucky, wikitxtInfobx = pcall( main, frame, frame:getParent().args )
    return wikitxtInfobx
end


return p