Module:BSto
Appearance
local p = {}
local function base(t1,t2,link,stn,italic,it,it2,bold,align,style,bg1,bg2,line,fs1,fs2,lh,v1,swap,inp,bs)
--Creates an inline table with two rows of text. Can be used in any Routemap text cell.
--Implemented in the BSsplit, BSto, BSsrws and BScvt templates.
if not align then
if bs == 'cvt' then
align = 'right'
else
align = 'inherit'
end
end
style = style or ''
local result = ' <table cellspacing="0" cellpadding="0" style="font-size:80%; font-weight:inherit; color:inherit; background-color:transparent; margin-top:-2px; margin-bottom:-2px; display:inline-table; vertical-align:middle; text-align:'..align
if italic or it == 'all' then result = result..';font-style:italic' end
if bold then result = result..';font-weight:bold' end
local rowstart = '<tr><td style="text-align:inherit;padding:0;line-height:'
result = result..';'..style..'">'..rowstart..lh
if line then result = result..';border-bottom:1px solid gray' end
local bgpad = ';padding-left:.5em;padding-right:.5em'
local function bgtext(v)
return ';color:'..greatercontrast{v, '#FFF', rgb_black}
end
if bg1 then
result = result..bgpad..bgtext(bg1)..';background-color:'..bg1
elseif bg2 then
result = result..bgpad
end
if fs1 then result = result..';font-size:'..fs1 end
result = result..'">'
if not t1 or string.find(t1, '^%s*$') then
if not t2 then t2 = '' end
if string.find(t2, '<br ?/?>') == nil then t1 = ' ' end
end
if not t2 or string.find(t2, '^%s*$') then
if not t1 then t1 = '' end
if string.find(t1, '<br ?/?>') == nil then t2 = ' ' end
end
if bs == 'srws' then
if stn then
link = t1..' '..t2..' '..stn
else
link = t1..' '..t2..' railway station'
end
elseif bs == 'cvt' then
local split, floor, outp, v2, mult = mw.text.split, math.floor
local function trim(x)
return string.gsub(x, '%s', '')
end
local cvt = { -- conversion values
['mi'] = 1.609344,
['ch'] = 20.1168,
['mi;ch'] = 80,
['m'] = 1 / .9144,
['yd'] = .9144,
['ft'] = .3048,
}
local sf = { -- 10 ^ floor(log10(cvt[inp]) + .5); or 10 ^ floor(log10(cvt[inps[1]] * cvt[inp]) + .5) for dual-unit inputs. this corrects the accuracy of result so that it usually has same significant figures
['mi'] = 1,
['ch'] = 10,
['mi;ch'] = .01,
['m'] = 1,
['yd'] = 1,
['ft'] = .1,
}
if not inp then inp = 'mi' end
inp = string.lower(trim(inp))
if inp == 'ch' or inp == 'yd' or inp == 'ft' then -- output unit
outp = 'm'
elseif inp == 'm' then
outp = 'yd'
else
if inp ~= 'mi;ch' then inp = 'mi' end
outp = 'km'
end
local pos = string.find(v1, '%.')
if not pos then
mult = 1
else
mult = 10 ^ (string.len(v1) - pos)
end
local inps = string.find(inp, ';')
if inps then
inps = split(inp, ';')
if swap then
t1 = v1..' '..outp
v1 = tonumber(v1)
t2 = floor(v1 / cvt[inps[1]])..' '..inps[1]..' '..floor(v1 % cvt[inps[1]] / cvt[inps[1]] * cvt[inp] * mult * sf[inp] + .5) / mult / sf[inp]..' '..inps[2]
else
v1 = split(trim(v1), ';')
t1 = v1[1]..' '..inps[1]..' '..v1[2]..' '..inps[2]
t2 = floor((tonumber(v1[1]) * cvt[inps[1]] + tonumber(v1[2]) * cvt[inps[1]] / cvt[inp]) * mult / sf[inp] + .5) / mult * sf[inp]..' '..outp
end
else
if swap then
v2 = floor(tonumber(v1) / cvt[inp] * mult * sf[inp] + .5) / mult / sf[inp]
inp, outp = outp, inp
else
v2 = floor(tonumber(v1) * cvt[inp] * mult / sf[inp] + .5) / mult * sf[inp]
end
t1 = v1..' '..inp
t2 = v2..' '..outp
end
end
if t1 then
if link then
result = result..'[['..link..'|'..t1..']]'
else
result = result..t1
end
end
local rowend = '</td></tr>'
result = result..rowend..rowstart..lh
if bg2 then
result = result..bgpad..bgtext(bg2)..';background-color:'..bg2
elseif bg1 then
result = result..bgpad
end
if fs2 then result = result..';font-size:'..fs2 end
if (it ~= 'off' and bs == 'to') or it2 == 'italic' then
result = result..';font-style:italic'
elseif it == 'off' then
result = result..';font-style:normal'
end
result = result..'">'
if t2 then
if link then
result = result..'[['..link..'|'..t2..']]'
else
result = result..t2
end
end
result = result..rowend..'</table> '
if bs == 'to' or bs == 'srws' then
if t1 == ' ' or t2 == ' ' then result = result..(i18n['error-categories']['missing-text-values'] or i18n['error-categories'].default) end
end
if string.find(t1, '<br ?/?>') ~= nil or string.find(t2, '<br ?/?>') ~= nil then result = result..(i18n['error-categories']['br-tags'] or i18n['error-categories'].default) end
if bs == 'split' then
if link and t1 and t2 then
if string.find(link, '^'..t1..' '..t2..' ') then result = result..(i18n['error-categories']['srws'] or i18n['error-categories'].default) end
end
end
return result
end
p.BSto = makeInvokeFunction('_BSto')
function p._BSto(args)
args[3] = args[3] or args.L
args[4] = args[4] or args.it or args.i
args[5] = args[5] or args.b
return base(args[1],args[2],args[3],nil,nil,args[4],nil,args[5],args.align,args.style,args.bg1,args.bg2,args.line,'105%','92%','.9',nil,nil,nil,'to')
end
p.BSsplit = makeInvokeFunction('_BSsplit')
function p._BSsplit(args)
args[3] = args[3] or args.L
args[4] = args[4] or args.it or args.i
args[5] = args[5] or args.b
return base(args[1],args[2],args[3],nil,args[4],nil,nil,args[5],args.align,args.style,args.bg1,args.bg2,args.line,'inherit','inherit','.9',nil,nil,nil,'split')
end
p.BSsrws = makeInvokeFunction('_BSsrws')
function p._BSsrws(args)
args[3] = args[3] or args.S
args[4] = args[4] or args.it or args.i
args[5] = args[5] or args.b
return base(args[1],args[2],nil,args[3],args[4],nil,nil,args[5],args.align,args.style,args.bg1,args.bg2,args.line,'inherit','inherit','.9',nil,nil,nil,'srws')
end
p.BScvt = makeInvokeFunction('_BScvt')
function p._BScvt(args)
return base(nil,nil,nil,nil,nil,nil,args.alt,nil,args.align,args.style,args.bg1,args.bg2,args.line,'inherit','inherit','.9',args[1],args[2],args['in'],'cvt')
end
return p