Modul:Infobox
Documentația acestui modul poate fi creată la Modul:Infobox/doc
--
-- This module implements {{Infobox}}
--
local p = {}
local getArgs = require('Modul:Arguments').getArgs
local StringUtils = require('Modul:StringUtils')
local TableTools = require('Modul:TableTools')
local args = {}
local function containsEmbed(cellData)
local check = { mw.ustring.find(cellData, "^%s*<%s*[Tt][Rr](%s*)([^<>]*)>%s*<%s*[Tt][DdHh](%s*)([^<>]*)>") }
if check[1] == nil or (check[3] == "" and check[4] ~= "") or (check[5] == "" and check[6] ~= "") then return false end
check = { mw.ustring.find(cellData, "</[Tt][DdHh]%s*>%s*</[Tt][Rr]%s*>%s*$") }
if check[1] == nil then return false else return true end
end
p._infobox = function(origArgs)
local child = origArgs["child"] or origArgs["embed"] or "no"
local bodyclass = origArgs["bodyclass"] or "infocaseta"
local antet = origArgs["antet"] or "default"
local aboveclass = origArgs["aboveclass"] or antet
local abovestyle = origArgs["abovestyle"] or ""
local culoare_cadru = origArgs["culoare cadru"] or "F5F5DC"
if mw.ustring.match(culoare_cadru, '^%x%x%x$') or mw.ustring.match(culoare_cadru, '^%x%x%x%x%x%x$') then culoare_cadru = StringUtils._prependIfMissing({culoare_cadru, '#'}) end
local culoare_text = origArgs["culoare text"] or "000000"
if mw.ustring.match(culoare_text, '^%x%x%x$') or mw.ustring.match(culoare_text, '^%x%x%x%x%x%x$') then culoare_text = StringUtils._prependIfMissing({culoare_text, '#'}) end
local titlestyle = origArgs["titlestyle"] or ""
local title = origArgs["title"] or origArgs["titlu"] or ""
title = StringUtils._capitalize({title})
local showtitle = origArgs["showtitle"] or "yes"
local above = origArgs["above"] or ""
local parentColSpanArg = origArgs['parent_colspan']
local parentColSpan
if parentColSpanArg and mw.ustring.gsub(parentColSpanArg, '%d+', '', 1) == '' then
parentColSpan = tonumber(parentColSpanArg)
else
parentColSpan = 2
end
local wikidataEnabled = origArgs["wikidata"] or ""
local enclose = origArgs["enclose"]
if type(enclose) ~= "string" then enclose = "auto" end
if enclose == "begin" then enclose = { true, false }
elseif enclose == "end" then enclose = { false, true }
elseif enclose == "both" then enclose = { true, true }
elseif enclose == "none" or child == "yes" then enclose = { false, false }
else enclose = { true, true }
end
local out = ""
-- open box
if enclose[1] then
out = out .. "<table class=\"" .. bodyclass .. "\">"
end
if child ~= "yes" then
-- caption
if showtitle == "yes" then
out = out .. tostring(mw.html.create('tr')
:tag('td')
:attr('colspan', tostring(parentColSpan))
:addClass('antet ' .. aboveclass)
:css('background-color', culoare_cadru)
:css('color', culoare_text)
:cssText(titlestyle)
:wikitext(title)
:allDone())
end
-- header
if above ~= "" then
local aboveTr = mw.html.create('tr'):tag('td')
:attr('colspan', tostring(parentColSpan))
:addClass(aboveclass)
:css('text-align', 'center')
:css('font-size', '125%')
:css('font-weight', 'bold')
:cssText(abovestyle)
:wikitext(above):allDone()
out = out .. tostring(aboveTr)
end
else
if showtitle == "yes" and title ~= "" then
local newTr = mw.html.create('tr'):tag('td')
:attr('colspan', tostring(parentColSpan))
:css('background-color', culoare_cadru)
:css('color', culoare_text)
:css('font-size', '125%')
:css('font-weight', 'bold')
:css('margin-bottom', '2')
:css('text-align', 'center')
:css('line-height', '1.2em')
:cssText(titlestyle)
:wikitext(title):allDone()
out = out .. tostring(newTr)
end
end
-- subheaders
local subheaders = {}
subheaders[1] = origArgs["subheader"] or origArgs["subheader1"] or ""
local subhIndex = 2
while (origArgs["subheader" .. tostring(subhIndex)] or "") ~= "" do
subheaders[subhIndex] = origArgs["subheader" .. tostring(subhIndex)] or ""
subhIndex = subhIndex + 1
end
local subheaderstyle = origArgs["subheaderstyle"] or ""
local subheaderclass = origArgs["subheaderclass"] or ""
for subHeaderIdx = 1,#subheaders do
if subheaders[subHeaderIdx] ~= "" then
local subhTr = mw.html.create('tr'):tag('td'):attr('colspan', tostring(parentColSpan))
:addClass(subheaderclass)
:css('text-align', 'center')
:cssText(subheaderstyle)
:wikitext(subheaders[subHeaderIdx]):allDone()
out = out .. tostring(subhTr)
end
end
-- images
local imageIndices = TableTools.affixNums(origArgs, 'image')
local images = {}
local captions = {}
if origArgs['image'] then
table.insert(images, origArgs['image'] or '')
table.insert(captions, origArgs['caption'] or '')
end
for _,imgIndex in ipairs(imageIndices) do
table.insert(images, origArgs['image' .. tostring(imgIndex)])
table.insert(captions, origArgs['caption' .. tostring(imgIndex)] or '')
end
local imageclass = origArgs["imageclass"]
local imagestyle = origArgs["imagestyle"]
local captionstyle = origArgs["captionstyle"]
for i = 1,#images do
if images[i] ~= "" then
local imageRow = mw.html.create('tr')
local imageTd = imageRow
:tag('td'):attr('colspan', tostring(parentColSpan))
:addClass(imageclass)
:css('text-align', 'center')
:cssText(imagestyle)
:wikitext(images[i])
if captions[i] ~= "" then
imageTd:tag('br')
imageTd:tag('div'):cssText('margin-top: 3px')
imageTd:tag('span'):cssText(captionstyle)
:wikitext(captions[i])
end
out = out .. tostring(imageRow)
end
end
-- rows
local labelstyle = origArgs["labelstyle"] or ""
local datastyle = origArgs["datastyle"] or ""
local headerstyle = origArgs["headerstyle"] or ""
local elementIndex = 1
local headers = {}
local data = {}
local labels = {}
local classes = {}
local styles = {}
local lblstyles = {}
local processingOrder = {}
for k,v in pairs(origArgs) do
local headerStart
local headerEnd
local labelStart
local labelEnd
local dataStart
local dataEnd
local styleStart
local styleEnd
local lblStyleStart
local lblStyleEnd
headerStart, headerEnd = mw.ustring.find(k, "header")
labelStart, labelEnd = mw.ustring.find(k, "label")
dataStart, dataEnd = mw.ustring.find(k, "data")
styleStart, styleEnd = mw.ustring.find(k, "style")
lblStyleStart, lblStyleEnd = mw.ustring.find(k, "lblstyle")
local nr = ""
if dataStart == 1 then
nr = mw.ustring.sub(k, 1 + dataEnd, mw.ustring.len(k))
elseif labelStart == 1 then
nr = mw.ustring.sub(k, 1 + labelEnd, mw.ustring.len(k))
elseif headerStart == 1 then
nr = mw.ustring.sub(k, 1 + headerEnd, mw.ustring.len(k))
elseif styleStart == 1 then
nr = mw.ustring.sub(k, 1 + styleEnd, mw.ustring.len(k))
elseif lblStyleStart == 1 then
nr = mw.ustring.sub(k, 1 + lblStyleEnd, mw.ustring.len(k))
end
if nr ~= "" and processingOrder[nr] == nil and tonumber(nr) ~= nil then
headers[elementIndex] = origArgs["header" .. nr] or ""
labels[elementIndex] = origArgs["label" .. nr] or ""
data[elementIndex] = origArgs["data" .. nr] or ""
classes[elementIndex] = origArgs["class" .. nr] or ""
styles[elementIndex] = origArgs["style" .. nr] or ""
lblstyles[elementIndex] = origArgs["lblstyle" .. nr] or ""
processingOrder[tonumber(nr)] = elementIndex
elementIndex = elementIndex + 1
end
end
local processingElement = 1
while processingElement <= table.maxn(processingOrder) do
elementIndex = processingOrder[processingElement]
if elementIndex ~= nil then
local crtHeader = headers[elementIndex]
local crtData = data[elementIndex]
local crtLabel = labels[elementIndex]
local crtLblStyle = lblstyles[elementIndex]
local crtClass = classes[elementIndex]
local crtStyle = styles[elementIndex]
if crtHeader ~= "" then
local headerTr = mw.html.create('tr')
local headerTh = headerTr:tag('th')
:attr('colspan', tostring(parentColSpan))
:css('text-align', 'center')
:css('background-color', culoare_cadru)
:css('color', culoare_text)
:addClass(crtClass)
:cssText(headerstyle)
:wikitext(crtHeader)
out = out .. tostring(headerTr)
elseif crtLabel ~= "" then
if crtData ~= "" then
local dataAndLabelTr = mw.html.create('tr')
:tag('th'):cssText(labelstyle):cssText(crtLblStyle)
:wikitext(crtLabel):done()
:tag('td')
:attr('colspan', tostring(parentColSpan - 1))
:addClass(crtClass)
:cssText(datastyle):cssText(crtStyle)
:wikitext(crtData):allDone()
out = out .. tostring(dataAndLabelTr)
end
elseif crtData ~= "" then
crtData = mw.getCurrentFrame():preprocess(crtData)
if containsEmbed(crtData) then
out = out .. crtData
else
local dataTr = mw.html.create('tr')
:tag('td'):attr('colspan', tostring(parentColSpan))
:addClass(crtClass)
:css('text-align', 'center')
:cssText(datastyle)
:cssText(crtStyle)
:wikitext(crtData):allDone()
out = out .. tostring(dataTr)
end
end
end
processingElement = processingElement + 1
end
-- below
local belowstyle = origArgs["belowstyle"] or ""
local below = origArgs["below"] or ""
if below ~= "" then
out = out .. tostring(mw.html.create('tr')
:tag('td')
:attr('colspan', tostring(parentColSpan))
:css('text-align', 'center')
:cssText(belowstyle)
:wikitext(below):allDone())
end
-- tnavbar
local name = origArgs["name"] or ""
local navbar = origArgs["navbar"]
if name ~= "" and navbar ~= 'false' then
local navBarTr = mw.html.create('tr'):tag('td')
:css('text-align', 'right')
:attr('colspan', tostring(parentColSpan))
:wikitext(mw.getCurrentFrame():expandTemplate{title = "Tnavbar", args = { name }}):done()
out = out .. tostring(navBarTr)
end
if child ~= "yes" then
local doc = origArgs["doc"] or ""
if doc ~= "" then
local infodocTr = mw.html.create('tr'):wikitext(mw.getCurrentFrame():expandTemplate{title = "infodoc", args = {colspan = tostring(parentColSpan), culoare = culoare_cadru, link = doc, wikidata = wikidataEnabled }})
out = out .. tostring(infodocTr)
end
end
-- close box
if enclose[2] then
out = out .. "</table>" .. mw.getCurrentFrame():extensionTag{ name = 'templatestyles', args = { src = 'Modul:Infobox/styles.css'} }
end
return out
end
p.infobox = function(frame)
local origArgs = getArgs(frame)
return p._infobox(origArgs)
end
return p