Модуль:Московский транспорт
Перейти к навигации
Перейти к поиску
Этот модуль предназначен для обработки и проверки номеров маршрутов наземного общественного транспорта, наименований остановочных пунктов (терминалов) на территории города Москвы в шаблоне {{Московский транспорт}}
require('strict')
local Mostrans = {}
Mostrans.__index = Mostrans
local colorconv = {
['maroon'] = '#800000',
['green'] = '#008000',
['blue'] = '#0000FF',
['red'] = '#FF0000',
['purple'] = '#800080',
['yellow'] = '#FFDE00',
['navy'] = '#000080',
['gray'] = '#858585',
['SlateGray'] = '#708090',
['RoyalBlue'] = '#4169E1',
['ForestGreen'] = '#228B22'
}
local Mostransconfig =
{
['C'] = {--согласованные городские и смежные маршруты (маршрутные такси частных перевозчиков)
['bus'] = 'RoyalBlue', --маршрутные такси - автобусы малого класса (МК)
['express'] = 'red', --экспрессы и полуэкспрессы на согласованных маршрутах
},
['R'] = {--пригородные и межрегиональные (смежные) маршруты проходящие по территории города Москвы
['mbus'] ='ForestGreen',--муниципальные автобусы
['bus'] = 'ForestGreen', -- частные автобусы
['express'] = 'red', --экспрессы пригородные и межрегиональные частных и муниципальных перевозчиков
},
['S'] = {--терминалы и остановочные пункты (павильоны)
['terminus'] = 'gray',--пассажирские пересадочные терминалы на территории города и Большой Москвы
['stop'] = 'SlateGray'--остановочные пункты (павильоны) на территории города и Большой Москвы
},
['М'] = {--Московские городские маршруты
['ebus'] = '#F0FFFF',--электробус
['trolley'] = '#3399FF',--троллейбус
['tram'] = 'blue',--трамвай
['mbus'] = 'RoyalBlue',--муниципальный транспорт (СК, БК, ОБК)
['bus'] = 'RoyalBlue',--частные автобусы (МК, СК, БК, ОБК)
['nroute'] = 'navy',--ночные маршруты частных и муниципальных перевозчиков
['express'] = 'red',--экспрессы на внутригородских маршрутах + Большая Москва
}
}
local function status_get(transtype)
if (transtype~=nil) and (transtype~='') then
for array,content in pairs(Mostransconfig) do
if type(content)=='table' then
for k,v in pairs(content) do
if content[transtype] then
return array
end
end
end
end
end
return 'M' -- fallback
end
local function hex_lab(color)
if colorconv[color] and colorconv[color]~=nil then
color = colorconv[color]
end
color=mw.ustring.sub(color,2,-1) -- убираем '#'
local r,g,b
r=tonumber(mw.ustring.sub('0x'..mw.ustring.sub(color,1,2))) or 0
g=tonumber(mw.ustring.sub('0x'..mw.ustring.sub(color,3,4))) or 0
b=tonumber(mw.ustring.sub('0x'..mw.ustring.sub(color,5,6))) or 0
r,g,b = r/255, g/255, b/255
local x,y,z,l,a,B
if r>0.04045 then r = math.pow((r+0.055)/1.055,2.4) else r = r / 12.92 end
if g>0.04045 then g = math.pow((g+0.055)/1.055,2.4) else g = g / 12.92 end
if b>0.04045 then b = math.pow((b+ 0.055)/1.055,2.4) else b = b / 12.92 end
r, g, b = r*100, g*100, b*100
x = r * 0.4124 + g * 0.3576 + b * 0.1805
y = r * 0.2126 + g * 0.7152 + b * 0.0722
z = r * 0.0193 + g * 0.1192 + b * 0.9505
local xi,yi,zi = 94.811,100.000,107.304 -- D65-белый, 10°
x,y,z = x/xi, y/yi, z/zi
if x>0.008856 then x = math.pow(x,1/3) else x = (7.787*x)+(16/116) end
if y>0.008856 then y = math.pow(y,1/3) else y = (7.787*y)+(16/116) end
if z>0.008856 then z = math.pow(z,1/3) else z = (7.787*z)+(16/116) end
l = ( 116 * y ) - 16
a = 500 * ( x - y )
B = 200 * ( y - z )
return {['l']=l, ['a']=a, ['b']=B}
end
local function whitedelta(color)
local colorl
local whitel=hex_lab('#FFFFFF').l
if color then
colorl=hex_lab(color).l
else
color1=whitel
end
return whitel-colorl
end
local BDlist = {--базы данных для статусов
['М'] = '3221',
['R'] = '758',
['C'] = '760',
['S'] = '1881'
}
function Mostrans:checkarray(arr, val)
local ret
if type(arr)=='table' then
ret = arr[val]
else
ret = arr
end
if ret ~=nil then return ret
else return nil end
end
function Mostrans:coregen()
local nowaystart
nowaystart = false
local bgcolor
local transtype
local BDID
local URLID
local tstatus
local argdecrement
argdecrement=0
tstatus = self.args['1'] or 'М'
if ((tstatus==nil) or (Mostransconfig[tstatus]==nil)) then tstatus = status_get(self.args['тип'])
argdecrement=1
end
BDID=self:checkarray(BDlist[tstatus],self.args['тип'])
if self:checkarray(Mostransconfig[tstatus],self.args['тип'])~= nil then bgcolor=self:checkarray(Mostransconfig[tstatus],self.args['тип']) else
bgcolor = '#cfe3ff'
end
local num = self.args[tostring(2-argdecrement)] or ''
-- if self.args[tostring(2-argdecrement)]==nil then argdecrement = argdecrement + 1 end
local waystart = self.args[tostring(3-argdecrement)] or ''
if waystart=='NWS' then nowaystart = true end
--if self.args[tostring(2-argdecrement)]==nil then argdecrement = argdecrement + 1 end
local waytype = self.args[tostring(4-argdecrement)] or '↔'
local wayend = self.args[tostring(5-argdecrement)] or ''
local way = self.args[tostring(6-argdecrement)] or ''
return {['bgcolor']=bgcolor, ['BDID']=BDID, ['num']=num, ['waystart']=waystart, ['nowaystart']=nowaystart, ['waytype']=waytype, ['wayend']=wayend, ['way']=way}
end
function Mostrans:numgen(num, color, BD, link)
local fontcolor
if whitedelta(color)>20 then fontcolor = 'white' else fontcolor = 'black' end
local wttopaste
if link~='' then
wttopaste='<span class="plainlinks" style="text-decoration: none; !important">[http://data.mos.ru/opendata/'..BD..'/row/'..link..' '..'<span style="color:'..fontcolor..' !important; text-decoration: none; !important">'..num..'</span>]</span>'
else
wttopaste = num
end
local buildernum = mw.html.create()
buildernum=buildernum:tag('table')
:css('text-align','center')
:css('vertical-align','middle')
:attr('align','center')
:css('margin','auto')
:tag('tr')
:tag('td')
:css('padding','0px 5px')
:css('text-align','center')
:css('vertical-align','middle')
:css('border','2px solid '..fontcolor..' !important')
:css('border-radius','4px')
:css('color',''..fontcolor..' !important')
:css('font-weight','bold')
:wikitext(wttopaste)
--:done()
:done()
:done()
buildernum=buildernum:done()
buildernum=tostring(buildernum)
return buildernum
end
function Mostrans:render()
local argpass = self:coregen()
local munimage
munimage = self:numgen(argpass.num, argpass.bgcolor, argpass.BDID, (self.args['ссылка'] or ''))
local builder = mw.html.create()
builder=builder:tag('tr')
:tag('td'):attr('align','center'):css('background',argpass.bgcolor):css('text-align','center'):css('margin', 'auto'):css('vertical-align','middle'):wikitext(munimage):done()
if argpass.nowaystart==false then
builder=builder:tag('td'):wikitext(argpass.waystart):done()
end
builder=builder:tag('th'):css('font-size','140%'):wikitext(argpass.waytype):done()
:tag('td'):wikitext(argpass.wayend):done()
:tag('td'):wikitext(argpass.way):done()
builder = builder:done()
return builder
end
function Mostrans:getcolor()
local argpass = self:coregen()
return argpass.bgcolor
end
function Mostrans.new(frame, args)
if not args then
args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:Московский транспорт'}})
--return
end
local obj = {
frame = frame,
args = args
}
return setmetatable(obj, Mostrans)
end
local p = {}
function p.main(frame)
return Mostrans.new(frame):render()
end
function p.bgcolor(frame)
return Mostrans.new(frame):getcolor()
end
return p