模組:RenderStations
local p = {}
local function convBool(val, default)
if val == nil then
return default
elseif type(val) == 'boolean' then
return val
elseif mw.text.trim(val) == '' then
return default
end
return (mw.text.trim(val) == '1')
end
local function makeLongStationLink(stationLink)
local function buildLongLink(linkTarget)
local l, r, c = string.find(linkTarget, "([^ ]+) %([^%)]+%)")
if l ~= nil then
return "[[" .. linkTarget .. "|" .. c .. "]]"
else
return "[[" .. linkTarget .. "]]"
end
end
return stationLink:gsub('%[%[([^%]%|]+)%|[^%]%|]+%]%]', buildLongLink)
end
function p.renderStationLinks(frame)
local adj_result
local a = frame:getParent().args
local short = convBool(a.short, true)
local spos, epos, station_name = 1, 1, nil
local pos = 1
local sys_args = { system=true, short=true }
local text = ''
for k, v in frame:getParent():argumentPairs() do
if type(k) == 'number' then
if string.len(text) > 0 then
text = text .. '|' .. v
else
text = v
end
else
if sys_args[k] == nil then
if string.len(text) > 0 then
text = text .. '|' .. k .. '=' .. v
else
text = k .. '=' .. v
end
end
end
end
text = mw.text.trim(text)
local out_texts = {}
while spos ~= nil do
spos, epos, station_name = string.find(text, '%$%$([^%$]+)%$%$', pos)
if spos ~= nil then
adj_result = require('Module:Adjacent stations')._station({
system = a.system,
station = station_name,
line = nil,
type = nil,
}, frame)
if not short then
adj_result = makeLongStationLink(adj_result)
end
table.insert(out_texts, string.sub(text, pos, spos - 1) .. adj_result)
pos = epos + 1
else
table.insert(out_texts, string.sub(text, pos, string.len(text)))
end
end
return table.concat(out_texts)
end
function p.testCases()
local frame = mw.getCurrentFrame()
local child_frame = frame:newChild{title='RenderStations', args={system='宁波轨道交通', '1号线从$$高桥西$$\n', '到$$霞浦$$\n'}}
if p.renderStationLinks(child_frame:newChild{title='renderStationLinks', args={}}) ~= '1号线从[[高桥西站 (宁波市)|高桥西]]\n|到[[霞浦站 (宁波市)|霞浦]]' then
error('renderStationLinks test failed: short=true.')
end
child_frame = frame:newChild{title='RenderStations', args={system='宁波轨道交通', short='0', '3号线从$$金海路$$\n', '到$$骆驼桥$$\n'}}
if p.renderStationLinks(child_frame:newChild{title='renderStationLinks', args={}}) ~= '3号线从[[金海路站 (宁波市)|金海路站]]\n|到[[骆驼桥站]]' then
error('renderStationLinks test failed: short=false.')
end
end
return p