711
次編輯
imported>Migertile CL 無編輯摘要 |
無編輯摘要 |
||
第8行: | 第8行: | ||
function IMC:renderPerCombatant(builder, headerText, prefix, suffix) | function IMC:renderPerCombatant(builder, headerText, prefix, suffix) | ||
prefix = prefix or '' | |||
suffix = sufix or '' | |||
local colspans = {} | |||
-- This may result in colspans[1] getting set twice, but | |||
-- this is no big deal. The second set will be correct. | |||
local lastCombatant = 1 | |||
for i = 1,self.combatants do | |||
if self.args[prefix .. i .. suffix] then | |||
colspans[lastCombatant] = i - lastCombatant | |||
lastCombatant = i | |||
end | |||
end | |||
local jointText = self.args[prefix .. (self.combatants + 1) .. suffix] | |||
if headerText and (colspans[1] or jointText) then | |||
builder:tag('tr') | |||
:tag('th') | |||
:attr('colspan', self.combatants) | |||
:cssText(infoboxStyle.header_raw) | |||
:wikitext(headerText) | |||
end | |||
-- The only time colspans[1] wouldn't be set is if no | -- The only time colspans[1] wouldn't be set is if no | ||
第61行: | 第61行: | ||
end | end | ||
if jointText then | |||
builder:tag('tr') | |||
:tag('td') | |||
:attr('colspan', self.combatants) | |||
:css('text-align', 'center') | |||
-- don't show the border if we're directly under a header | |||
:css('border-top', (not headerText or colspans[1]) and infoboxStyle.internal_border or nil) | |||
:css('font-size', '90%') -- 中文維基添加 | |||
:newline() | |||
:wikitext(jointText) | |||
end | |||
end | end | ||
function IMC:renderHeaderTable(builder) | function IMC:renderHeaderTable(builder) | ||
builder = builder:tag('table') | |||
:cssText(infoboxStyle.box_label) -- 中文維基添加 | |||
:css('width', '100%') | |||
:css('margin', 0) | |||
:css('padding', 0) | |||
:css('border', 0) | |||
if self.args.date then | |||
builder:tag('tr') | |||
:tag('th') | |||
:css('padding-right', '1em') | |||
:css('white-space', 'nowrap') | |||
:wikitext('日期') | |||
:done() | |||
:tag('td') | |||
:wikitext(self.args.date) | |||
end | |||
builder = builder:tag('tr') | |||
:tag('th') | |||
:css('padding-right', '1em') | |||
:css('white-space', 'nowrap') | |||
:wikitext('地點') | |||
:done() | |||
:tag('td') | |||
:tag('div') | |||
:addClass('location') | |||
:wikitext(self.args.place or '{{{place}}}') -- hack so that people who don't know Lua know that this parameter is required | |||
:done() | |||
if self.args.coordinates then | |||
builder:wikitext(self.args.coordinates) | |||
end | |||
builder = builder:done():done() | |||
-- only for "Putsch" | |||
if self.args.action then | |||
builder:tag('tr') | |||
:tag('th') | |||
:css('padding-right', '1em') | |||
:css('white-space', 'nowrap') | |||
:wikitext(self.args.action and '行動') | |||
:done() | |||
:tag('td') | |||
:wikitext(self.args.action) | |||
end | |||
if self.args.status or self.args.result then | |||
builder:tag('tr') | |||
:tag('th') | |||
:css('padding-right', '1em') | |||
:css('white-space', 'nowrap') | |||
:wikitext(self.args.status and '狀態' or '結果') | |||
:done() | |||
:tag('td') | |||
:addClass('status') | |||
:newline() | |||
:wikitext(self.args.status or self.args.result) | |||
end | |||
if self.args.territory then | |||
builder:tag('tr') | |||
:tag('th') | |||
:css('padding-right', '1em') | |||
:css('white-space', 'nowrap') | |||
:wikitext('領土變更') | |||
:done() | |||
:tag('td') | |||
:newline() | |||
:wikitext(self.args.territory) | |||
end | |||
end | end | ||
function IMC:render() | function IMC:render() | ||
local builder = mw.html.create() | |||
if self.args.campaignbox then | |||
-- this should be the same as using {{stack|clear=right|...}} | |||
builder:wikitext(self.frame:expandTemplate{ title = 'stack begin', args = { clear='true'} }) | |||
end | |||
builder = builder:tag('table') | |||
:addClass('infobox vevent') | |||
:cssText(infoboxStyle.main_box_raw) | |||
:css('width', self.args.width or nil) | |||
builder:tag('tr') | |||
:tag('th') | |||
:addClass('summary') | |||
:attr('colspan', self.combatants) | |||
:cssText(infoboxStyle.header_raw .. 'font-size:100%') -- 中文维基修改 | |||
:wikitext(self.args.conflict or mw.title.getCurrentTitle().text) | |||
builder:tag('tr') | builder:tag('tr') | ||
:tag('th') | :tag('th') | ||
第171行: | 第177行: | ||
:wikitext(self.args.partof .. '的一部分') | :wikitext(self.args.partof .. '的一部分') | ||
end | end | ||
if self.args.image or self.args['image-hans'] or self.args['image-hant'] then | |||
builder:tag('tr') | |||
:tag('td') | |||
:attr('colspan', self.combatants) | |||
:cssText(infoboxStyle.image_box_raw) | |||
:wikitext(string.format('%s%s%s', | |||
require('Module:InfoboxImageVariant')._main{ | |||
image = self.args.image, | |||
['image-hans'] = self.args['image-hans'], | |||
['image-hant'] = self.args['image-hant'], | |||
size = self.args.image_size, | |||
sizedefault = 'frameless', | |||
upright = 1, | |||
alt = self.args.alt, | |||
['alt-hans'] = self.args['alt-hans'], | |||
['alt-hant'] = self.args['alt-hant'], | |||
}, | }, | ||
第192行: | 第198行: | ||
self.args.caption or '' | self.args.caption or '' | ||
)) | )) | ||
end | |||
self:renderHeaderTable(builder:tag('tr'):tag('td'):attr('colspan', self.combatants)) | |||
self:renderPerCombatant(builder, self.args.combatants_header or '參戰方', 'combatant') | |||
-- can be un-hardcoded once gerrit:165108 is merged | |||
for _,v in ipairs{'a','b','c','d'} do | |||
self:renderPerCombatant(builder, nil, 'combatant', v) | |||
end | |||
self:renderPerCombatant(builder, '指揮官與領導者', 'commander') | |||
for _,v in ipairs{'a','b','c','d'} do | |||
self:renderPerCombatant(builder, nil, 'commander', v) | |||
end | |||
self:renderPerCombatant(builder, '參戰單位', 'units') | |||
self:renderPerCombatant(builder, '兵力', 'strength') | |||
self:renderPerCombatant(builder, '政治支持', 'polstrength') | |||
self:renderPerCombatant(builder, '軍事支援', 'milstrength') | |||
self:renderPerCombatant(builder, '傷亡與損失', 'casualties') | |||
if self.args.notes then | |||
builder:tag('tr') | |||
:tag('td') | |||
:attr('colspan', self.combatants) | |||
-- :css('font-size', '90%') 中文維基去除 | |||
:css('border-top', infoboxStyle.section_border) | |||
:newline() | |||
:wikitext(self.args.notes) | |||
end | |||
if self.args.map_type then | |||
builder:tag('tr') | |||
:tag('td') | |||
:attr('colspan', self.combatants) | |||
:css('border-top', infoboxStyle.internal_border) | |||
:node(require('Module:Location map').main(self.frame, { | |||
self.args.map_type, | |||
relief = self.args.map_relief, | |||
coordinates = self.args.coordinates, | |||
width = self.args.map_size or 220, | |||
float = 'center', | |||
border = 'none', | |||
mark = self.args.map_mark, | |||
marksize = self.args.map_marksize or 8, | |||
label = self.args.map_label, | |||
alt = self.args.map_alt, | |||
caption = self.args.map_caption or ('在' | |||
.. (require('Module:Location map').data(self.frame, {self.args.map_type, 'name'})) .. '的位置') | |||
})) | |||
end | |||
builder = builder:done() | |||
if self.args.campaignbox then | |||
builder = builder:done() | |||
builder:wikitext(self.args.campaignbox .. self.frame:expandTemplate{ title = 'stack end'}) | |||
end | |||
return builder | |||
end | end | ||
function IMC.new(frame, args) | function IMC.new(frame, args) | ||
if not args then | |||
args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Infobox military conflict'}) | |||
end | |||
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,5 do | |||
if args['combatant' .. i .. v] then | |||
obj.combatants = math.max(obj.combatants, i) | |||
end | |||
end | |||
end | |||
return setmetatable(obj, IMC) | |||
end | end | ||
第274行: | 第280行: | ||
function p.main(frame) | function p.main(frame) | ||
return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(IMC.new(frame):render()) | |||
end | end | ||
return p | return p |