Модуль:Lexer

Материал из Указатель частей и соединений РККА 1941-1945
Перейти к:навигация, поиск

Для документации этого модуля может быть создана страница Модуль:Lexer/doc

local lexer = {}
local cargo = mw.ext.cargo


local ending = { -- и = р,д,в,т,п,мн
['гв.'] = { 'гв.',   'гв.',   'гв.',   'гв.',   'гв.',   'гв.',   },
['и']   = { 'и',     'и',     'и',     'и',     'и',     'и',     },
['тд.'] = { 'тд.',   'тд.',   'тд.',   'тд.',   'тд.',   'тд.',   },
['ада'] = { 'ады',   'аде',   'аду',   'адой',  'аде',   'ады',   stop = 'ж', },    -- бригада
['арк'] = { 'арка',  'арку',  'арк',   'арком', 'арке',  'арки',  stop = 'м', },    -- парк
['езд'] = { 'езда',  'езду',  'езд',   'ездом', 'езде',  'езда',  stop = 'м', },    -- бронепоезд
['ерв'] = { 'ерва',  'ерву',  'ерв',   'ервом', 'ерве',  'ервы',  stop = 'м', },    -- резерв
['зия'] = { 'зии',   'зии',   'зию',   'зией',  'зии',   'зии',   stop = 'ж', },    -- дивизия
['илы'] = { 'ил',    'илам',  'илы',   'илами', 'илах',  'илы',   stop = 'х', },    -- силы
['ион'] = { 'иона',  'иону',  'ион',   'ионом', 'ионе',  'ионы',  stop = 'м', },    -- дивизион
['йон'] = { 'йона',  'йону',  'йон',   'йоном', 'йоне',  'йоны',  stop = 'м', },    -- район
['ище'] = { 'ища',   'ищу',   'ище',   'ищем',  'ище',   'ища',   stop = 'с', },    -- училище
['лия'] = { 'лии',   'лии',   'лию',   'лией',  'лии',   'лии',   stop = 'ж', },    -- флотилия
['лот'] = { 'лота',  'лоту',  'лот',   'лотом', 'лоте',  'лоты',  stop = 'м', },    -- флот
['лья'] = { 'льи',   'лье',   'лью',   'льей',  'лье',   'льи',   stop = 'ж', },    -- эскадрилья
['мия'] = { 'мии',   'мии',   'мию',   'мией',  'мии',   'мии',   stop = 'ж', },    -- армия
['ние'] = { 'ния',   'нию',   'ние',   'нием',  'нии',   'ния',   stop = 'с', },    -- управление
['нкт'] = { 'нкта',  'нкту',  'нкт',   'нктом', 'нкте',  'нкты',  stop = 'м', },    -- пункт
['олк'] = { 'олка',  'олку',  'олк',   'олком', 'олке',  'олки',  stop = 'м', },    -- полк
['она'] = { 'оны',   'оне',   'ону',   'оной',  'оне',   'оны',   stop = 'ж', },    -- зона
['онт'] = { 'онта',  'онту',  'онт',   'онтом', 'онте',  'онты',  stop = 'м', },    -- фронт
['ота'] = { 'оты',   'оте',   'оту',   'отой',  'оте',   'оты',   stop = 'ж', },    -- рота
['ппа'] = { 'ппы',   'ппе',   'ппу',   'ппой',  'ппе',   'ппы',   stop = 'ж', },    -- группа
['пус'] = { 'пуса',  'пусу',  'пус',   'пусом', 'пусе',  'пуса',  stop = 'м', },    -- корпус
['рея'] = { 'реи',   'рее',   'рею',   'реей',  'рее',   'реи',   stop = 'ж', },    -- батарея
['руг'] = { 'руга',  'ругу',  'руг',   'ругом', 'руге',  'руга',  stop = 'м', },    -- округ
['ряд'] = { 'ряда',  'ряду',  'ряд',   'рядом', 'ряде',  'ряды',  stop = 'м', },    -- отряд
['ска'] = { 'ск',    'скам',  'ска',   'сками', 'сках',  'ска',   stop = 'х', },    -- войска
['ток'] = { 'тка',   'тку',   'ток',   'тком',  'тке',   'тки',   stop = 'м', },    -- участок
['тор'] = { 'тора',  'тору',  'тор',   'тором', 'торе',  'тора',  stop = 'м', },    -- сектор
['ция'] = { 'ции',   'ции',   'цию',   'цеей',  'ции',   'ции',   stop = 'ж', },    -- Авиация
['ьон'] = { 'ьона',  'ьону',  'ьон',   'ьоном', 'ьоне',  'ьоны',  stop = 'м', },    -- батальон
['бая'] = { 'бой',   'бой',   'бую',   'бой',   'бой',   'бые',   },
['бый'] = { 'бого',  'бому',  'бый',   'бым',   'бом',   'бые',   },
['вая'] = { 'вой',   'вой',   'вую',   'вой',   'вой',   'вые',   },
['вое'] = { 'вого',  'вому',  'вое',   'вым',   'вом',   'вые',   },
['вой'] = { 'вого',  'вому',  'вой',   'вым',   'вом',   'вые',   },
['вый'] = { 'вого',  'вому',  'вый',   'вым',   'вом',   'вые',   },
['кая'] = { 'кой',   'кой',   'кую',   'кой',   'кой',   'кие',   },
['кий'] = { 'кого',  'кому',  'кий',   'ким',   'ком',   'кие',   },
['кое'] = { 'кого',  'кому',  'кое',   'ким',   'ком',   'кие',   },
['кой'] = { 'кого',  'кому',  'кой',   'ким',   'ком',   'кие',   },
['лая'] = { 'лой',   'лой',   'лую',   'лой',   'лой',   'лые',   },
['лый'] = { 'лого',  'лому',  'лый',   'лым',   'лом',   'лые',   },
['ная'] = { 'ной',   'ной',   'ную',   'ной',   'ной',   'ные',   },
['ний'] = { 'него',  'нему',  'ний',   'ним',   'ном',   'ние',   },
['ное'] = { 'ного',  'ному',  'ное',   'ным',   'ном',   'ные',   },
['ной'] = { 'ного',  'ному',  'ной',   'ным',   'ном',   'ные',   },
['ные'] = { 'ных',   'ным',   'ные',   'ными',  'ных',   'ные',   },
['ный'] = { 'ного',  'ному',  'ный',   'ным',   'ном',   'ные',   },
['чая'] = { 'чей',   'чей',   'чую',   'чей',   'чей',   'чие',   },
['чья'] = { 'чьей',  'чьей',  'чью',   'чьей',  'чьей',  'чьи',   },
}
local endingGv = { -- и,р,д,в,т,п
['м'] = { 'гвардейский',   'гвардейского',  'гвардейскому',  'гвардейский',   'гвардейским',   'гвардейском',   },
['ж'] = { 'гвардейская',   'гвардейской',   'гвардейской',   'гвардейскую',   'гвардейской',   'гвардейской',   },
['с'] = { 'гвардейское',   'гвардейского',  'гвардейскому',  'гвардейское',   'гвардейским',   'гвардейском',   },
['х'] = { 'гвардейские',   'гвардейских',   'гвардейским',   'гвардейские',   'гвардейскими',  'гвардейских',   },
}
local endingOtd = {
['м'] = { 'отдельный',   'отдельного',  'отдельному',  'отдельный',   'отдельным',   'отдельном',   },
['ж'] = { 'отдельная',   'отдельной',   'отдельной',   'отдельную',   'отдельной',   'отдельной',   },
['с'] = { 'отдельное',   'отдельного',  'отдельному',  'отдельное',   'отдельным',   'отдельном',   },
['х'] = { 'отдельные',   'отдельных',   'отдельным',   'отдельные',   'отдельными',  'отдельных',   },
}

function lexer.declension( str, form )
	local words = mw.text.split( str, ' ' )
--	local err = {}
	for i, word in ipairs( words ) do
		local x = mw.ustring.sub( word, -3, -1 )
		local u = ending[x]
		if u then
			words[i] = mw.ustring.sub( word, 1, -4 ) .. u[form]
			if u.stop then
				break
			end
		elseif not tonumber( word ) then
			if not tonumber( mw.ustring.sub( word, 1, 1 ) ) then
				return nil, word
			end
		end
	end
	return table.concat( words, ' ' )
end

function lexer._declension( str, form, text, abbr )
	local report = require( 'Module:Report' )
	local unit = report.fuller( str )
	if text then
		if text == '!' then
			return unit
		end
	elseif abbr then
		text = report.shorter( unit )
	elseif form == 0 then
		text = unit
	else
		text = lexer.declension( unit, form )
	end
	return '[[' .. unit .. '|' .. text .. ']]'
end

function lexer.Declension( frame )
	local args = require( 'Module:Tools' ).checkargs( frame:getParent().args, {
			true, true
--			form = 0, text = true, abbr = true,
		} )
	local form = tonumber( frame.args.form or 0 )
	local text = args[2]
	local abbr = text == '.'
	if abbr then 
		text = nil
	end
	return lexer._declension( args[1], form, text, abbr )
end	

function lexer.Check( frame )
	local cq
	local out = {}
	local offset = 0
	repeat
		cq = cargo.query( 'unitpages', '_pageName, unit,special', { offset = offset, limit = 5000, orderBy = 'unit,special' } )
		for _, u in ipairs( cq ) do
			local unit = u.unit
			local v, err = lexer.declension( unit, 1 )
			if v then
				table.insert( out, unit .. ' / ' .. v )
			else
				table.insert( out, unit .. ': <span class=error>' .. err .. '</span>' )
			end
--[[
			local ctg = lexer.category( unit ) or '—'
			local ctgGood = categories.names[ctg] or { group = '—' }
			local abbr = lexer.shorter( unit ) or '—'
			if abbr == unit then
				local unitLow = mw.ustring.lower( mw.ustring.sub( unit, 1, 1 ) ) .. mw.ustring.sub( unit, 2, -1 )
				abbr = lexer.shorter( unitLow )
			end
			table.insert( out, unit .. '/' .. ctg .. '/' .. ctgGood.group .. '/' .. abbr )
			lexer.gene = nil
--]]
		end
		offset = offset + #cq
	until #cq == 0
	return table.concat( out, '<br>' )
end



return lexer