Populează o cutie de navigare pentru o campanie militară cu linkuri de la Wikidata asociate unei anumite campanii.


local getArgs = require('Modul:Arguments').getArgs
local printMilNav = require('Modul:Military navigation').fromArgs
local Wikidata = require('Modul:Wikidata')
local illWd = require('Modul:Ill-wd').fromArgs
local StringUtils = require('Modul:StringUtils')
local data = mw.loadData('Modul:Campaignbox/data')

--index de bătălii; cele mai multe sunt cele de pe Isonzo care au ajuns la 12;
local digits = {'prima', 'a doua', 'a treia', 'a patra', 'a cincea', 'a șasea', 'a șaptea', 'a opta', 'a noua', 'a zecea', 'a unsprezecea', 'a douăsprezecea'}

local p = {}

local function getFormattedBattlesList(qid)
	local list = data[qid]
	if not list or type(list) ~= 'table' or #list == 0 then
		local idList = Wikidata.getBestEntityIdsList(qid, 'P527')
		list = {}
		for _,battleId in ipairs(idList or {}) do
			table.insert(list, { q = StringUtils._prependIfMissing(battleId, 'Q') })
		end
	end
	local out = {}
	for _,b in ipairs(list) do
		local label = b.l
		if not label then 
			local rawTitle = b.t or b.q and Wikidata.loadOneValueInChain(b.q, 'label')
			local nameSource = not b.t and b.q and Wikidata.loadOneValueInChain(b.q, 'P138', 'label')
			mw.logObject(rawTitle, '[Campaignbox] battle label')
			local battleIndex = 0
			for candidateIdx = 1, #digits do
				if mw.ustring.match(mw.ustring.lower(rawTitle), '^' .. digits[candidateIdx] .. ' bătălie.*') then
					battleIndex = candidateIdx
					rawTitle = 'Bătălia' .. mw.ustring.sub(rawTitle, 1 + mw.ustring.len(digits[candidateIdx] .. ' bătălie'))
				end
			end
			rawTitle = StringUtils._capitalize(StringUtils._removeStart(rawTitle, 'Bătălia de la ', 'Bătălia din ', 'Bătălia pentru ', 'Campania din ', 'Campania pentru ', 'Operațiunea '))
			label = (nameSource or mw.ustring.gsub(rawTitle, '%s+%(.*%)$', '')) .. (battleIndex > 0 and (' (' .. tostring(battleIndex) .. ')') or '')
		end
		table.insert(out, b.q and illWd(b.q, label, b.t, true) or ('[[' .. b.t .. '|' .. label .. ']]'))
	end
	return out
end

p.fromArgs = function(args)
	local milNavArgs = {}
	local qid = args.q or args[1] or mw.wikibase.getEntityIdForCurrentPage()
	
	milNavArgs.name = args['nume brut'] or (args['titlu'] and (args['nume'] or args['name']))
	milNavArgs.state = args.stare
	milNavArgs.listclass = args.listclass or args['clasă liste']
	milNavArgs.bodyclass = args.bodyclass or args['clasă corp']
	milNavArgs.below = args.note
	milNavArgs.border = args.border
	milNavArgs.state = args.state
	milNavArgs.title = args.titlu or args.nume or args.name or Wikidata.loadOneValueInChain(qid)
	milNavArgs.list1 = args['bătălii'] or args.battles
	if not milNavArgs.list1 then
		local separator = mw.text.decode(' • ', true)
		local elemList = getFormattedBattlesList(qid)
		if elemList then
			milNavArgs.list1 = table.concat(elemList, separator)
		end
	end
	return milNavArgs.list1 and #milNavArgs.list1 > 0 and printMilNav(milNavArgs) or nil
end

p.fromFrame = function(frame)
	local args = getArgs(frame)
	return p.fromArgs(args)
end

return p