Modul:Vorlage:Infobox Gut
Erscheinungsbild
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 .. ' 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