Модуль:Клавиатура компьютера

Документация

Это модуль для шаблона {{Клавиатура компьютера}}

local p = {}
local function getLayout(frame)
	local pframe = frame:getParent()
	local layoutPage = pframe.args[1]
	local layout = pframe.args['раскладка']
	if layout == nil or layout == ''  then
	    if layoutPage == nil or layoutPage == '' then
	        layoutPage='PC ISO'
	    elseif layoutPage=='Apple' or layoutPage=='apple' then
	    	layoutPage='Apple ISO'
	    end
	    local layoutSubpage = mw.title.new('Клавиатура компьютера/'..layoutPage,'шаблон')
	    if layoutSubpage==nil then
	        error('не найдена страница '..'Шаблон:Клавиатура компьютера/' .. layoutPage)
	    end
	    layout=layoutSubpage:getContent()
	end
	   
	local labelsPage = pframe.args[2]
	local labels = pframe.args['обозначения']
	if layoutPage ~= nil and layoutPage ~='' 
    	    and (labels ==nil or labels == '') then
    	if labelsPage == nil or labelsPage == '' then
    		labelsPage = 'RU'
    	end
        local labelsSubpage=mw.title.new('Клавиатура компьютера/'..layoutPage..'/'..labelsPage..'.json','шаблон')
        if labelsSubpage==nil then
        	error('не найден пакет обозначений '..labelsPage)
        end
        labels = labelsSubpage:getContent()
    end
	local labelsArr = mw.text.jsonDecode(labels)
	return {layout,labelsArr}
end
function p.draw(frame)
	local gl=getLayout(frame)
	local layout=gl[1]
	local labelsArr=gl[2]
	local keyPage='Клавиатура компьютера/Клавиша'
	local pframe = frame:getParent()
	if pframe.args['тип клавиши']=='круглая' then
		keyPage='Клавиатура компьютера/Круглая клавиша'
	end
	local result = ''
	local x=0;
	local y=0;
	local nrow = 1;
	local ncol = 1;
	for row in mw.text.gsplit(layout,'\n',true) do
		if row=='--' then break end
		for itm in mw.text.gsplit(row,';',true) do
			local keyCaption=''
			local keyLink=''
			local curLabel = labelsArr[nrow][ncol] 
			if type(curLabel)=='table' then
				keyCaption=curLabel['c']
				keyLink=curLabel['l']
			else
				keyCaption=curLabel or ''
			end
			keyCaption=frame:preprocess(keyCaption)
			keyCaption=string.gsub(keyCaption,'\n','<br>')
			local width=string.match(itm,'[0-9.]+')
			local height=1
			if string.sub(itm,1,1)=='R' then
				y=y-1+width
				nrow=nrow-1
			    break
			end
			if string.sub(itm,1,1)=='V' then
				height=width
				width=1
			end
			if itm=='ISOENTER' then
				width=1
				result=result..frame:expandTemplate{
				  		title=keyPage,
				  		args={'',(x+0.25)*40,(y+1)*40-4,36,30}
				  	}
				result=result..frame:expandTemplate{
				  		title=keyPage,
				  		args={'',x*40,y*40,46}
				}
				result=result..frame:expandTemplate{
				  		title=keyPage,
				  		args={keyCaption,(x+0.25)*40+2,y*40,36,66,keyLink,
				  			['дополнительный стиль']='border-left:none;border-top-left-radius:0;'}
				  	}
				x=x+1.5
				ncol=ncol+1
			elseif itm=='STEPCAPS' then
				result=result..frame:expandTemplate{
				  		title=keyPage,
				  		args={'',x*40,y*40,56}
				}
			  	result=result..frame:expandTemplate{
			  		title=keyPage,
			  		args={keyCaption,x*40,y*40,36,26,keyLink}
			  	}
				x=x+1.75
				ncol=ncol+1
				  	
			elseif width~=nil then
				if string.sub(itm,1,1) ~='S' then
				  	result=result..frame:expandTemplate{
				  		title=keyPage,
				  		args={keyCaption,x*40,y*40,width*40-14,height*40-14,keyLink}
				  	}
			  	  ncol=ncol+1
				end
			  	x=x+width
			end
		end
		x=0
		ncol=1
		nrow=nrow+1
		y=y+1
	end
	
	return '<div style="position:relative">'..result..'</div>'
end
function p.getWidth(frame)
	local gl=getLayout(frame)
	local layout=gl[1]
	maxWidth=0;
	for row in mw.text.gsplit(layout,'\n',true) do
		local curWidth=0
		if row=='--' then break end
		for itm in mw.text.gsplit(row,';',true) do
			local width=string.match(itm,'[0-9.]+')
			if string.sub(itm,1,1)=='V' then
				width=1
			elseif itm=='ISOENTER' then
				width=1.5
			elseif itm=='STEPCAPS' then
				width=1.75
			end
			if width~=nil then
				curWidth=curWidth+width
			end
		end
		if maxWidth<curWidth then
			maxWidth=curWidth
		end
	end
	return (maxWidth*40+5)
end
function p.getHeight(frame)
	local gl=getLayout(frame)
	local layout=gl[1]
	local height=0
	for row in mw.text.gsplit(layout,'\n',true) do
		local curHeight=1
		if string.sub(row,1,1)=='R' then
			curHeight=string.match(row,'[0-9.]+')
		end
		height=height+curHeight
	end
	return (height*40)
end
return p