Модуль:Песочница/Seryo93/Infobox military conflict2cols
Перейти к навигации
Перейти к поиску
Документация
require('Module:No globals')
local infoboxStyle = mw.loadData('Module:Песочница/Seryo93/Infobox military conflict/style')
local IMCframe
local IMC = {}
IMC.__index = IMC
function IMC:renderPerCombatant(builder, headerText, prefix, ruprefix)
prefix = prefix or ''
ruprefix = ruprefix or ''
local combatantsodd = {}
local combatantseven = {}
local combatantsrows = {}
local firstoddid = 1
local firstevenid = 2
local combatantsoddwithargs = {}
local combatantsevenwithargs = {}
local canregenerateodds
local canregenerateevens
local headercolspan
local columnwidhth
local oddborderonright
--local shallregentables = false
for i=1,self.combatants do
if (math.mod(i,2) == 0) then
combatantseven[#combatantseven+1] = {["ID"]=i, ["rowspan"]=1, ["value"]= (self.args[prefix..i] or self.args[ruprefix..i] or nil)}
else
combatantsodd[#combatantsodd+1] = {["ID"]=i, ["rowspan"]=1, ["value"]= (self.args[prefix..i] or self.args[ruprefix..i] or nil)}
end
end
for e=1,math.max(table.getn(combatantseven),table.getn(combatantsodd)) do
combatantsrows[e]=e
end
for i=1,table.getn(combatantsrows) do
if combatantseven[i]==nil then
local combatantsevenlastid=combatantseven[#combatantseven]["ID"]
combatantsevenlastid=combatantsevenlastid+2
combatantseven[i]={["ID"]=combatantsevenlastid, ["rowspan"]=1, ["value"]=(self.args[prefix..combatantsevenlastid] or self.args[ruprefix..combatantsevenlastid] or nil)}
end
if combatantsodd[i]==nil then
local combatantoddlastid=combatantsodd[#combatantsodd]["ID"]
combatantoddlastid=combatantoddlastid+2
combatantsodd[i]={["ID"]=combatantoddlastid, ["rowspan"]=1, ["value"]=(self.args[prefix..combatantoddlastid] or self.args[ruprefix..combatantoddlastid] or nil)}
end
end
for o=1,table.getn(combatantsodd) do
if combatantsodd[o]["value"]~=nil then
firstoddid=combatantsodd[o]["ID"]
break
end
end
for e=1,table.getn(combatantseven) do
if combatantseven[e]["value"]~=nil then
firstevenid=combatantseven[e]["ID"]
break
end
end
for odd=1,table.getn(combatantsodd) do
if combatantsodd[odd]["value"]~=nil then
combatantsoddwithargs[#combatantsoddwithargs+1]=combatantsodd[odd]["ID"]
end
end
for even=1,table.getn(combatantseven) do
if combatantseven[even]["value"]~=nil then
combatantsevenwithargs[#combatantsevenwithargs+1]=combatantseven[even]["ID"]
end
end
if table.getn(combatantsoddwithargs) == 0 then
canregenerateodds=false
else
canregenerateodds=true
end
if table.getn(combatantsevenwithargs) == 0 then
canregenerateevens=false
else
canregenerateevens=true
end
if (canregenerateodds and canregenerateevens) == true then
headercolspan = 2
columnwidhth='50%'
oddborderonright=infoboxStyle.internal_border
else
headercolspan = 1
columnwidhth='100%'
oddborderonright=nil
end
if (firstoddid~=combatantsodd[1]["ID"] or firstevenid~=combatantseven[1]["ID"]) and ((canregenerateodds or canregeneratevens)==true) then
combatantsrows = {}
if canregenerateodds~=false then
if firstoddid~=combatantsodd[1]["ID"] then
combatantsodd = {}
for i=firstoddid,self.combatants do
if not(math.mod(i,2) == 0) then
combatantsodd[#combatantsodd+1] = {["ID"]=i, ["rowspan"]=1, ["value"]= (self.args[prefix..i] or self.args[ruprefix..i] or nil)}
end
end
end
end
if canregenerateevens~=false then
if firstevenid~=combatantseven[1]["ID"] then
combatantseven = {}
for i=firstevenid,self.combatants do
if math.mod(i,2) == 0 then
combatantseven[#combatantseven+1] = {["ID"]=i, ["rowspan"]=1, ["value"]= (self.args[prefix..i] or self.args[ruprefix..i] or nil)}
end
end
end
end
for cr=1,math.max(table.getn(combatantseven),table.getn(combatantsodd)) do
combatantsrows[cr]=cr
end
for i=1,table.getn(combatantsrows) do
if combatantseven[i]==nil then
local combatantsevenlastid=combatantseven[#combatantseven]["ID"]
combatantsevenlastid=combatantsevenlastid+2
combatantseven[i]={["ID"]=combatantsevenlastid, ["rowspan"]=1, ["value"]=(self.args[prefix..combatantsevenlastid] or self.args[ruprefix..combatantsevenlastid] or nil)}
end
if combatantsodd[i]==nil then
local combatantoddlastid=combatantsodd[#combatantsodd]["ID"]
combatantoddlastid=combatantoddlastid+2
combatantsodd[i]={["ID"]=combatantoddlastid, ["rowspan"]=1, ["value"]=(self.args[prefix..combatantoddlastid] or self.args[ruprefix..combatantoddlastid] or nil)}
end
end
end
for i=1,table.getn(combatantsrows) do
if combatantsodd[i]["value"]~=nil then
for p=i+1,table.getn(combatantsrows) do
if combatantsrows[p]~=nil then
if combatantsodd[p]["value"]~=nil then
if combatantseven[p]["value"]==nil then
combatantseven[i]["rowspan"]=combatantseven[i]["rowspan"]+1
else
break
end
end
end
end
end
if combatantseven[i]["value"]~=nil then
for p=i+1,table.getn(combatantsrows) do
if combatantsrows[p]~=nil then
if combatantseven[p]["value"]~=nil then
if combatantsodd[p]["value"]==nil then
combatantsodd[i]["rowspan"]=combatantsodd[i]["rowspan"]+1
else
break
end
end
end
end
end
end
if headerText and ((combatantsodd[1]["value"]~=nil) or (combatantseven[1]["value"]~=nil)) then
builder:tag('tr')
:tag('th')
:attr('colspan', headercolspan ~=1 and headercolspan or nil)
:cssText(infoboxStyle.header_raw)
:wikitext(headerText)
end
if combatantsrows[1] then
for i=1,table.getn(combatantsrows) do
if combatantsodd[i]["value"]~=nil or combatantseven[i]["value"]~=nil then
builder = builder:tag('tr')
if combatantsodd[i]["value"]~=nil then
builder:tag('td')
:attr('rowspan', combatantsodd[i]["rowspan"] ~= 1 and combatantsodd[i]["rowspan"] or nil)
:css('width', columnwidhth)
:css('border-right', oddborderonright)
:css('border-top', not (headerText and combatantsrows[i]==1) and infoboxStyle.internal_border or nil)
:newline()
:wikitext(combatantsodd[i]["value"])
end
if combatantseven[i]["value"]~=nil then
builder:tag('td')
:attr('rowspan', combatantseven[i]["rowspan"] ~= 1 and combatantseven[i]["rowspan"] or nil)
:css('width', columnwidhth)
--:css('padding-left', '0.25em')
:css('border-top', not (headerText and combatantsrows[i]==1) and infoboxStyle.internal_border or nil)
:newline()
:wikitext(combatantseven[i]["value"])
end
end
end
end
end
function IMC:render()
local hascombatantargs
hascombatantargs = false
for _,v in ipairs{'', 'a', 'b', 'c', 'd', 'а', 'б', 'в', 'г'} do
for i=1,6 do
for _,p in ipairs {'combatant', 'commander', 'strength', 'casualties', 'противник', 'командир', 'силы', 'потери'} do
if self.args[p .. i .. v] then
hascombatantargs=true
break
end
end
end
end
local Commonstext = IMCframe:expandTemplate{ title = 'commonslink2', args = { self.args['викисклад'], 'Аудио, фото, видео', icon_size = '12px' } }
local iboxp = {
['стиль_вверху']=infoboxStyle.header_ibox,
['стиль_вверху2'] = infoboxStyle.sub_header_raw,
['стиль_заголовков'] = infoboxStyle.header_ibox,
['стиль_внизу'] = 'text-align: left;',
['стиль_внизу2'] = infoboxStyle.sub_header_raw,
['вверху'] = IMCframe:expandTemplate{ title='Карточка/название', args = {(self.args['conflict'] or self.args['конфликт'])}}
}
if self.args.partof or self.args['часть'] then
iboxp['вверху2'] = 'Основной конфликт: '.. (self.args.partof or self.args['часть'])
end
if self.args.image or self.args['изображение'] then
local imagestring=self.args.image or self.args['изображение']
iboxp['изображение'] = IMCframe:expandTemplate{title='Форматирование изображения', args = {imagestring, '300px'}}
end
if self.args.caption or self.args['подпись'] or self.args['заголовок'] then
iboxp['подпись'] = self.args.caption or self.args['подпись'] or self.args['заголовок']
end
if self.args.date or self.args['дата'] then
iboxp['метка1'] = 'Дата'
iboxp['текст1'] = self.args.date or self.args['дата']
end
if self.args.place or self.args['место'] then
iboxp['метка2'] = 'Место'
iboxp['текст2'] = self.args.place or self.args['место']
end
if self.args.casus or self.args['причина'] then
iboxp['метка3'] = 'Причина'
iboxp['текст3'] = self.args.casus or self.args['причина']
end
if self.args['статус'] or self.args.status or self.args['итог'] or self.args.result then
if (self.args['статус'] or self.args.status) then iboxp['метка4'] = 'Статус' else iboxp['метка4'] = 'Итог' end
iboxp['текст4'] = self.args['статус'] or self.args.status or self.args['итог'] or self.args.result
end
if self.args.territory or self.args['изменения'] then
iboxp['метка5'] = 'Изменения'
iboxp['текст5'] = self.args.territory or self.args['изменения']
end
if hascombatantargs==true then
local builder = mw.html.create()
builder = builder:tag('table')
:css('width', '100%')
:css('background', '#f9f9f9')
:css('text-align', 'left')
--:css('border', 0)
self:renderPerCombatant(builder, self.args.combatants_header or self.args['заголовок противников'] or 'Противники', 'combatant', 'противник')
self:renderPerCombatant(builder, 'Командующие', 'commander', 'командир')
self:renderPerCombatant(builder, 'Силы сторон', 'strength', 'силы')
self:renderPerCombatant(builder, 'Потери', 'casualties', 'потери')
builder:done()
iboxp['текст6'] = tostring(builder)
end
if self.args.overall_casualties or self.args['общие_потери'] then
iboxp['заголовок7'] = 'Общие потери'
iboxp['текст8'] = self.args.overall_casualties or self.args['общие_потери']
end
iboxp['внизу'] = IMCframe:expandTemplate{title='Примечания', args={['group']='~', ['2']='height'}}
if Commonstext~=('' or nil) then
iboxp['внизу2'] = Commonstext
end
local infobox = IMCframe:expandTemplate{ title='Карточка', args = iboxp}
return infobox
end
function IMC.new(frame, args)
if not args then
args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:Вооружённый конфликт', 'Template:Вооружённый конфликт/temp'}})
--return
end
IMCframe = frame
local obj = {
frame = frame,
args = args
}
-- until gerrit:165108 is merged, there's still a cap on combatants, but as soon as it merges, we can update this little bit of code to uncap it
-- also, don't try to make this more efficient, or references could be in the wrong order
obj.combatants = 2
for _,v in ipairs{'', 'a', 'b', 'c', 'd'} do
for i = 1,6 do
for _,p in ipairs {'противник', 'командир', 'силы', 'потери'} do
args[p..i..'a'] = args[p..i..'а'] or nil
args[p..i..'b'] = args[p..i..'б'] or nil
args[p..i..'c'] = args[p..i..'в'] or nil
args[p..i..'d'] = args[p..i..'в'] or nil
end
if args['combatant' .. i .. v] or args['противник' .. i .. v] then
obj.combatants = math.max(obj.combatants, i)
end
end
end
return setmetatable(obj, IMC)
end
local p = {}
function p.main(frame)
return IMC.new(frame):render()
end
return p