Moduł:odmiana-przymiotnik-niemiecki

Z Wikisłownika – wolnego słownika wielojęzycznego

Moduł wykorzystywany przez szablon {{odmiana-przymiotnik-niemiecki}}.


local mergeForms = function ( arr, ending )
	local temp = {}
	
	for i, v in ipairs( arr ) do
		if v ~= nil then table.insert( temp, v .. ending ) end
	end
	
	return table.concat( temp, '/' )
end

function appendMainHeaderTo( t )
	local frame = mw.getCurrentFrame()
	local moreInfo = '(zob. [[b:Niemiecki/Gramatyka/Deklinacja_przymiotników|deklinacja przymiotnikowa]])'
	
	t:tag( 'tr' )
		:tag( 'th' ):attr( 'colspan', 2 )
			:tag( 'small' ):wikitext( moreInfo ):done():done()
		:tag( 'th' ):attr( 'colspan', 3 ):wikitext( '[[liczba pojedyncza#pl|liczba pojedyncza]]' ):done()
		:tag( 'th' ):attr( 'colspan', 1 ):wikitext( '[[liczba mnoga#pl|liczba mnoga]]' ):done()
	
	t:tag( 'tr' )
		:tag( 'th' ):wikitext( '[[przypadek#pl|przypadek]]' ):done()
		:tag( 'th' ):wikitext( '[[deklinacja#pl|deklinacja]]' ):done()
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'm' } ):done()
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'ż' } ):done()
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'n' } ):done()
		:tag( 'th' ):wikitext(
				frame:expandTemplate{ title = 'm' } .. ' ' ..
				frame:expandTemplate{ title = 'ż' } .. ' ' ..
				frame:expandTemplate{ title = 'n' }
			):done()
end

function appendNestedHeaderTo( t, title )
	local frame = mw.getCurrentFrame()
	
	t:tag( 'tr' )
		:tag( 'th' ):attr( 'colspan', 6 ):css( 'font-weight', 'normal' ):wikitext( ' ' .. title ):done()
	
	t:tag( 'tr' )
		:tag( 'th' ):attr( 'rowspan', 2 ):wikitext( '[[przypadek#pl|przypadek]]' ):done()
		:tag( 'th' ):attr( 'rowspan', 2 ):wikitext( '[[deklinacja#pl|deklinacja]]' ):done()
		:tag( 'th' ):attr( 'colspan', 3 ):wikitext( '[[liczba pojedyncza#pl|liczba pojedyncza]]' ):done()
		:tag( 'th' ):attr( 'colspan', 1 ):wikitext( '[[liczba mnoga#pl|liczba mnoga]]' ):done()
	
	t:tag( 'tr' )
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'm' } ):done()
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'ż' } ):done()
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'n' } ):done()
		:tag( 'th' ):wikitext(
				frame:expandTemplate{ title = 'm' } .. ' ' ..
				frame:expandTemplate{ title = 'ż' } .. ' ' ..
				frame:expandTemplate{ title = 'n' }
			):done()
end

function appendDeclensionFormsTo( t, base, isInvariable )
	local frame = mw.getCurrentFrame()
	local merger = isInvariable and function ( _ ) return mergeForms( base, '' ) end or mergeForms
	
	local makeCell = function ( articles, endings )
		return articles[ 1 ] .. ' ' .. merger( base, endings[ 1 ] ) .. '<br>' ..
			(#articles > 1 and articles[ 2 ] .. ' ' or '') .. merger( base, endings[ 2 ] ) .. '<br>' ..
			merger( base, endings[ 3 ] )
	end
	
	local declCell = '[[deklinacja słaba#pl|słaba]]<br>[[deklinacja mieszana#pl|mieszana]]<br>[[deklinacja mocna#pl|mocna]]'
	
	t:tag( 'tr' )
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'Nom' } ):done()
		:tag( 'th' ):wikitext( declCell ):done()
		:tag( 'td' ):wikitext( makeCell( { 'der', 'ein' }, { 'e', 'er', 'er' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'die', 'eine' }, { 'e', 'e', 'e' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'das', 'ein' }, { 'e', 'es', 'es' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'die' }, { 'en', 'en', 'e' } ) ):done()
	
	t:tag( 'tr' )
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'Gen' } ):done()
		:tag( 'th' ):wikitext( declCell ):done()
		:tag( 'td' ):wikitext( makeCell( { 'des', 'eines' }, { 'en', 'en', 'en' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'der', 'einer' }, { 'en', 'en', 'er' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'des', 'eines' }, { 'en', 'en', 'en' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'der' }, { 'en', 'en', 'er' } ) ):done()
	
	t:tag( 'tr' )
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'Dat' } ):done()
		:tag( 'th' ):wikitext( declCell ):done()
		:tag( 'td' ):wikitext( makeCell( { 'dem', 'einem' }, { 'en', 'en', 'em' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'der', 'einer' }, { 'en', 'en', 'er' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'dem', 'einem' }, { 'en', 'en', 'em' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'den' }, { 'en', 'en', 'en' } ) ):done()
	
	t:tag( 'tr' )
		:tag( 'th' ):wikitext( frame:expandTemplate{ title = 'Akk' } ):done()
		:tag( 'th' ):wikitext( declCell ):done()
		:tag( 'td' ):wikitext( makeCell( { 'den', 'einen' }, { 'en', 'en', 'en' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'die', 'eine' }, { 'e', 'e', 'e' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'das', 'ein' }, { 'e', 'es', 'es' } ) ):done()
		:tag( 'td' ):wikitext( makeCell( { 'die' }, { 'en', 'en', 'e' } ) ):done()
	
	return t
end

function main( frame )
	local pargs = frame:getParent().args
	
	local arg1 = mw.text.trim( pargs[ 1 ] or '' )
	local arg2 = mw.text.trim( pargs[ 2 ] or '' )
	local arg3 = mw.text.trim( pargs[ 3 ] or '' )
	
	local pos, comp, sup
	
	if arg1 ~= '' and arg2 ~= '' and arg3 ~= '' then -- {{...|pos|comp|sup}}
		pos = arg1
		comp = arg2
		sup = arg3
	elseif arg1 ~= '' and arg2 ~= '' and arg3 == '' then -- {{...|comp|sup}}
		pos = mw.title.getCurrentTitle().text
		comp = arg1
		sup = arg2
	elseif arg1 ~= '' and arg2 == '' and arg3 == '' then -- {{...|pos}}
		pos = arg1
	elseif arg1 == '' and arg2 == '' and arg3 == '' then -- {{...}}
		pos = mw.title.getCurrentTitle().text
	else
		error( 'nieprawidłowa kombinacja parametrów stopnia prostego/wyższego/najwyższego', 0 )
	end
	
	if mw.ustring.sub( pos, -1 ) == 'e' then
		pos = mw.ustring.sub( pos, 1, -2 ) -- trim trailing 'e', if present
	end
	
	local comp2, sup2 = pargs.comp2, pargs.sup2
	local stopn, temat = pargs.stopn, pargs.temat
	local nieodm = pargs.nieodm
	
	local hasRegularCompSup = stopn == 'tak' or stopn == 'reg'
	local hasNoCompSup = stopn == 'nie' or stopn == 'brak'
	local isInvariable = nieodm == 'tak'
	
	if not hasRegularCompSup and not hasNoCompSup and stopn ~= '' and stopn ~= nil then
		error( 'nieprawidłowa wartość parametru "stopn"; obsługiwane: "tak"/"reg", "nie"/"brak"', 0 )
	end
	
	if ( comp or sup ) and ( hasRegularCompSup or hasNoCompSup ) then
		error( 'nie używaj "stopn", jeżeli osobno wskazano formy stopnia (naj)wyższego', 0 )
	end
	
	if not isInvariable and nieodm ~= '' and nieodm ~= nil then
		error( 'nieprawidłowa wartość parametru "nieodm"; obsługiwane: "tak"', 0 )
	end
	
	if hasRegularCompSup then
		comp = ( temat or pos ) .. 'er'
		sup = pos .. 'st'
	end
	
	local t = mw.html.create( 'table' ):addClass( 'wikitable odmiana adj' ):css{
		[ 'text-align' ] = 'center',
		border = 'none'
	}
	
	appendMainHeaderTo( t )
	appendDeclensionFormsTo( t, { temat or pos }, isInvariable )
	
	if hasNoCompSup then
		local nested = mw.html.create( 'table' ):addClass( 'wikitable odmiana' ):css{
			width = '100%',
			margin = '5px 0 0 0',
		}
		
		nested:tag( 'tr' ):tag( 'th' ):attr( 'colspan', 6 ):wikitext( '&nbsp;' .. "'''nie stopniuje się'''" )
		t:tag( 'tr' ):tag( 'td' ):attr( 'colspan', 6 ):css{ padding = 0, border = 'none' }:node( nested )
	elseif comp and sup then
		local compForms = mergeForms( { comp, comp2 }, '-' )
		local compTitle = "stopień wyższy (''[[Komparativ#de|Komparativ]]'') '''" .. compForms .. "'''"
		
		local compNested = mw.html.create( 'table' ):addClass( 'wikitable adj collapsible collapsed' ):css{
			width = '100%',
			margin = '5px 0 0 0'
		}
		
		appendNestedHeaderTo( compNested, compTitle )
		appendDeclensionFormsTo( compNested, { comp, comp2 } )
		t:tag( 'tr' ):tag( 'td' ):attr( 'colspan', 6 ):css{ padding = 0, border = 'none' }:node( compNested )
		
		local supForms = mergeForms( { sup, sup2 }, '-' )
		local supTitle = "stopień najwyższy (''[[Superlativ#de|Superlativ]]'') '''" .. supForms .. "'''"
		
		local supNested = mw.html.create( 'table' ):addClass( 'wikitable adj collapsible collapsed' ):css{
			width = '100%',
			margin = '5px 0 0 0'
		}
		
		appendNestedHeaderTo( supNested, supTitle )
		appendDeclensionFormsTo( supNested, { sup, sup2 } )
		t:tag( 'tr' ):tag( 'td' ):attr( 'colspan', 6 ):css{ padding = 0, border = 'none' }:node( supNested )
	end
	
	local nav = mw.html.create( 'div' ):addClass( 'NavFrame collapse-odmiana' ):css( 'display', 'inline' )
	
	nav:tag( 'div' ):addClass( 'NavHead' ):css{
		background = 'transparent',
		[ 'text-align' ] = 'left',
		[ 'padding-left' ] = '60px',
		display = 'inline'
	}
	
	nav:tag( 'div' ):addClass( 'NavContent' ):css{
		[ 'text-align' ] = 'left',
		display = 'inline'
	}:node( t )
	
	return nav
end

return { main = main }