---@type fun(frame: frame, options: { trim: boolean?, removeBlanks: boolean?, valueFunc: (fun(key: any, value: any): any)?, frameOnly: boolean?, parentOnly: boolean?, parentFirst: boolean?, wrappers: string[]?, readOnly: boolean?, noOverwrite: boolean? }?): { [string]: string }
local getArgs = require('Module:Arguments').getArgs
local NavboxFunc = require("Module:Navbox")._navbox
local adj = require('Module:Adjacent stations')
local p = {}
local operational = {
'0', '1', '2', '3', '4', '5', '江跳', '6', '9', '10', '18'
}
local construction = {
'7', '15', '17', '24', '27', '璧铜', --'永川'
}
local projected = {
'8', '12', '21'
}
local branches = {
['3'] = { '空港' },
['6'] = { '国博' },
}
local aliases = {
['3a'] = '3',
['6i'] = '6',
}
local bounds = {
['5'] = { '江跳' },
['江跳'] = { '5' },
}
---@param frame frame
---@param l string
---@return string
local function getLineStyle(frame, l)
return adj._color({ 'CRT', l }, frame)
end
---@param frame frame
---@param l string
---@return string
local function getLineTitle(frame, l)
return adj._line({ 'CRT', l }, frame)
end
---@param l string
---@return string
local function getLineName(l)
if l == '0' then
return '环线'
elseif tonumber(l) then
return l .. '号线'
else
return l .. '线'
end
end
---@param l string
---@return string
local function getLineFullName(l)
if l == '江跳' then
return '重庆市郊铁路' .. getLineName(l)
else
return '重庆轨道交通' .. getLineName(l)
end
end
---@param frame frame
---@param l string
---@return string
local function getLineList(frame, l)
if branches[l] then
local child_args = {
'child',
groupstyle = 'color:#3a3a3a; background:#ececec; width:4em; text-align:center;',
liststyle = 'width:auto;',
list0 = frame:expandTemplate { title = '重庆轨道交通车站/' .. getLineName(l) }
}
for i, b in ipairs(branches[l]) do
local branchName = getLineName(b)
child_args['group' .. i] = branchName
child_args['list' .. i] = frame:expandTemplate { title = '重庆轨道交通车站/' .. branchName }
end
return NavboxFunc(child_args)
else
return frame:expandTemplate { title = '重庆轨道交通车站/' .. getLineName(l) }
end
end
---@param frame frame
---@return string
function p.navbox(frame)
-- Make map
---@type { [string]: boolean }
local operational_map = {}
---@type { [string]: boolean }
local construction_map = {}
---@type { [string]: boolean }
local projected_map = {}
for _, l in ipairs(operational) do
operational_map[l] = false
end
for _, l in ipairs(construction) do
construction_map[l] = false
end
for _, l in ipairs(projected) do
projected_map[l] = false
end
-- Scan args
local args = getArgs(frame)
local num_int = 0
local num_arg = 0
local single_line = ''
local cats = {}
if args.construction or args.projected then
-- do nothing
else
for a, l in pairs(aliases) do
if args[a] then
args[a] = nil
args[l] = '1'
end
end
for l, _ in pairs(operational_map) do
if args[l] then
operational_map[l] = true
num_int = num_int + 1
num_arg = num_arg + 1
single_line = l
if not args.nocat then
table.insert(cats, '[[Category:' .. getLineFullName(l) .. '车站]]')
end
if bounds[l] then
for _, b in ipairs(bounds[l]) do
operational_map[b] = true
end
end
end
end
for l, _ in pairs(construction_map) do
if args[l] then
construction_map[l] = true
num_arg = num_arg + 1
single_line = l
if not args.nocat then
table.insert(cats, '[[Category:' .. getLineFullName(l) .. '车站]]')
end
end
end
for l, _ in pairs(projected_map) do
if args[l] then
projected_map[l] = true
num_arg = num_arg + 1
single_line = l
if not args.nocat then
table.insert(cats, '[[Category:' .. getLineFullName(l) .. '车站]]')
end
end
end
if num_arg == 0 then
for l, _ in pairs(operational_map) do
operational_map[l] = true
end
for l, _ in pairs(construction_map) do
construction_map[l] = true
end
for l, _ in pairs(projected_map) do
projected_map[l] = true
end
end
end
-- Build navbox
local navbox_args = {
name = '重庆轨道交通车站',
state = 'autocollapse',
bodystyle = 'width:100%; vertical-align:middle;',
titlestyle = 'background:#00843d; color:white;',
groupstyle = 'background:#ececec; width:4em; text-align:center;',
liststyle = 'width:auto;'
}
if args.construction or args.projected then
if args.construction then
navbox_args.title =
'[[重庆轨道交通|<span style="color:white">重庆轨道交通</span>]]在建线路[[重庆轨道交通车站列表|<span style="color:white">车站</span>]]'
for i, l in ipairs(construction) do
navbox_args['group' .. i .. 'style'] = frame:expandTemplate { title = 'box-shadow border', args = { 'r', '#' .. getLineStyle(frame, l), '5px' } }
navbox_args['group' .. i] = getLineTitle(frame, l)
navbox_args['list' .. i] = getLineList(frame, l)
end
else
navbox_args.title =
'[[重庆轨道交通|<span style="color:white">重庆轨道交通</span>]]规划线路[[重庆轨道交通车站列表|<span style="color:white">车站</span>]]'
for i, l in ipairs(projected) do
navbox_args['group' .. i .. 'style'] = frame:expandTemplate { title = 'box-shadow border', args = { 'r', '#' .. getLineStyle(frame, l), '5px' } }
navbox_args['group' .. i] = getLineTitle(frame, l)
navbox_args['list' .. i] = getLineList(frame, l)
end
end
else
if num_arg > 0 then
navbox_args.state = 'expanded'
if num_int > 1 and not args.nocat then
table.insert(cats, '[[Category:重庆轨道交通换乘车站|' .. num_int .. ']]')
end
end
if num_arg == 1 then
local line_name = getLineFullName(single_line)
navbox_args.name = '重庆轨道交通车站/' .. getLineName(single_line)
navbox_args.title = '[[' .. line_name .. '|<span style="color:white">' .. line_name .. '</span>]]车站'
navbox_args.titlestyle = 'background:#' .. adj._color({ 'CRT', single_line }, frame) .. '; color:white'
navbox_args.list0 = getLineList(frame, single_line)
else
navbox_args.title =
'[[重庆轨道交通|<span style="color:white">重庆轨道交通</span>]][[重庆轨道交通车站列表|<span style="color:white">车站</span>]]'
local i = 1
for _, l in ipairs(operational) do
if operational_map[l] then
navbox_args['group' .. i .. 'style'] = frame:expandTemplate { title = 'box-shadow border', args = { 'r', '#' .. getLineStyle(frame, l), '5px' } }
navbox_args['group' .. i] = getLineTitle(frame, l)
navbox_args['list' .. i] = getLineList(frame, l)
i = i + 1
end
end
local construction_args = {
'child',
title = '在建线路',
titlestyle = 'background:#ececec; color:#6b6b6b;',
groupstyle = 'background:#ececec; width:4em; text-align:center;',
liststyle = 'width:auto;'
}
local j = 1
for _, l in ipairs(construction) do
if construction_map[l] then
construction_args['group' .. j .. 'style'] = frame:expandTemplate { title = 'box-shadow border', args = { 'r', '#' .. getLineStyle(frame, l), '5px' } }
construction_args['group' .. j] = getLineTitle(frame, l)
construction_args['list' .. j] = getLineList(frame, l)
j = j + 1
end
end
if j > 1 then
if num_arg > 0 then
construction_args.state = 'expanded'
end
navbox_args['list' .. i] = NavboxFunc(construction_args)
i = i + 1
end
local projected_args = {
'child',
title = '规划线路',
titlestyle = 'background:#ececec; color:#6b6b6b;',
groupstyle = 'background:#ececec; width:4em; text-align:center;',
liststyle = 'width:auto;'
}
local k = 1
for _, l in ipairs(projected) do
if projected_map[l] then
projected_args['group' .. k .. 'style'] = frame:expandTemplate { title = 'box-shadow border', args = { 'r', '#' .. getLineStyle(frame, l), '5px' } }
projected_args['group' .. k] = getLineTitle(frame, l)
projected_args['list' .. k] = getLineList(frame, l)
k = k + 1
end
end
if k > 1 then
if num_arg > 0 then
projected_args.state = 'expanded'
end
navbox_args['list' .. i] = NavboxFunc(projected_args)
i = i + 1
end
end
end
return NavboxFunc(navbox_args) .. table.concat(cats)
end
return p