Модуль:Московский транспорт

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация

Этот модуль предназначен для обработки и проверки номеров маршрутов наземного общественного транспорта, наименований остановочных пунктов (терминалов) на территории города Москвы в шаблоне {{Московский транспорт}}

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