Die Dokumentation für dieses Modul kann unter Modul:Verb/Doku erstellt werden

local Verb = {} 

-- this function enables the module to be called from a template
function Verb.main(frame)
	if type(Verb[frame.args[1]]) == 'function'
	then
		return Verb[frame.args[1]](frame.args[2], frame.args[3])
	else
		return Verb[frame.args[1]][frame.args[2]]
	end
end

-- Grundform für Gerundivum erzeugen
-- Aufruf von einer Vorlage: {{#invoke:Verb|gerundivum|lemma|params}}
	function Verb.gerundivum(frame)
		local s = frame.args[1]
		local par2 = frame.args[2]
		local geslang = mw.ustring.len(s)
		local prefixe = 0
		local teil1 = ""
		local teil2 = ""
		local lteil1 = 0
		local lteil2 = 0
		local retp = "" -- returnstring
		if (par2) then
			prefixe = tonumber((mw.ustring.sub(par2,1,1)))
		end
		if prefixe > 0
		then
			teil1 = Verb.vorsilbe(s)
			lteil1 = mw.ustring.len(teil1)
			if prefixe > 1
			then
				teil2 = Verb.vorsilbe(mw.ustring.sub(s,lteil1+1,geslang))
				lteil2 = mw.ustring.len(teil2)
			end
			retp = teil1 .. teil2 .. "zu"
		end
		if mw.ustring.sub(s,geslang-2,geslang) == "tun"
		then
			s = mw.ustring.sub(s,1,geslang-3) .. "tuen"
			geslang = geslang + 1
		end
		if prefixe == 0
		then
			retp = s .. "|zu=zu"
		else
			retp = retp .. mw.ustring.sub(s,lteil1+lteil2+1,geslang)
		end
		return retp
	end

-- Variable Daten für regelmäßige Konjugationen erzeugen
-- Aufruf von einer Vorlage: {{#invoke:Verb|vorsilbe|lemma|params}} 
	function Verb.konjugation(frame)
		local s = frame.args[1]
		local par2 = frame.args[2]
		local geslang = mw.ustring.len(s)
		local prefixe = 0
		local ge = ""
		local restlang = geslang - 4
		local rstring = mw.ustring.sub(s,1,restlang)
		local teil1 = ""
		local teil2 = ""
		local retp = "" -- returnstring
		local v2 = ""
		local mt = "|Infinitiv=einteilig|Nebensatzkonjugation=einteilig"
		if par2 then
			prefixe = tonumber((mw.ustring.sub(par2,1,1)))
			if mw.ustring.len(par2) > 1 then
				ge = "ge"
			end
		end
		if (mw.ustring.sub(s,geslang - 4,geslang - 3) == "ch")
		then
			v2 = "ch|"
			restlang = restlang - 1
		else
			v2 = mw.ustring.sub(s,geslang - 3,geslang - 3) .. "|"
		end
		local v3 = mw.ustring.sub(s,geslang - 2,geslang - 2) .. "|"
		local v4 = mw.ustring.sub(s,geslang - 1,geslang - 1) .. "|"
		local v5 = mw.ustring.sub(s,geslang,geslang) .. "|"
		if prefixe > 0
		then
			teil1 = Verb.vorsilbe(s)
			lteil1 = mw.ustring.len(teil1)
			retp = "Teil 1=" .. teil1 .. "|"
			restlang = restlang - lteil1
			rstring = mw.ustring.sub(s,lteil1 + 1,lteil1 + restlang)
			if prefixe > 1
			then
				teil2 = Verb.vorsilbe(mw.ustring.sub(s,lteil1+1,geslang))
				lteil2 = mw.ustring.len(teil2)
				retp = retp .. "Teil 2=" .. teil2 .. "|"
				restlang = restlang - lteil2
				rstring = mw.ustring.sub(rstring,lteil2 + 1,lteil2 + restlang)
			end
		end
		local v1 = mw.ustring.sub(rstring,1,restlang) .. "|"
		retp = retp .. v1 .. v2 .. v3 ..v4 .. v5
		-- Partizip II generieren
		local elim = Verb.PIIt(s)
		if prefixe == 0
		then
			retp = retp .. ge .. mw.ustring.sub(s,1,geslang - elim) .. "t"
		elseif prefixe == 1
		then
			retp = retp .. teil1 .. ge
			retp = retp .. mw.ustring.sub(s,lteil1+1,geslang - elim) .. "t"
			retp = retp .. mt
		elseif prefixe == 2
		then
			retp = retp .. teil1 .. teil2 .. ge
			retp = retp .. mw.ustring.sub(s,lteil1+lteil2+1,geslang - elim) .. "t"
			retp = retp .. mt
		end
		return retp
	end

-- Präfixe von trennbaren Verben ermitteln
-- Aufruf von einer Vorlage: {{#invoke:Verb|main|vorsilbe|lemma}} 
function Verb.vorsilbe(s)
	local geslang = mw.ustring.len(s)
    local slang = 0
    local vlang = 0
  	if mw.ustring.sub(s,geslang-2,geslang) == "tun"
  	then
  		slang = geslang - 3
  	else
  		if geslang >= 7 then
  			slang = geslang - 4
  		else
  			return ""
  		end
  	end
	local vorne = ""
	if slang >= 14 then
		vorne = mw.ustring.sub(s,1,14)
	  	if (vorne == "hintereinander")
	  	then
	  		vlang = 14
	  		return vorne
	  	end
	end
	if slang >= 13 then
	  	vorne = mw.ustring.sub(s,1,13)
      	if (vorne == "durcheinander" or
      		vorne == "gegeneinander" or
      		vorne == "nebeneinander" or
	      	vorne == "untereinander" or
	      	vorne == "widereinander")
      	then
      		vlang = 13
      		return vorne
      	end
    end
    if slang >= 12 then
	  	vorne = mw.ustring.sub(s,1,12)
      	if vorne == "übereinander"
      	then
      		vlang = 12
      		return vorne
      	end
	end
	if slang>= 11 then
	  	vorne = mw.ustring.sub(s,1,11)
	  	if (vorne == "aufeinander" or 
	  		vorne == "auseinander" or
	  		vorne == "beieinander" or
	  		vorne == "miteinander" or
	  		vorne == "voneinander")
	  	then
	  		vlang = 11
      		return vorne
	  	end
	end
    if slang >= 10 then
	  	vorne = mw.ustring.sub(s,1,10)
      	if (vorne == "aneinander" or
		   vorne == "dazwischen" or
		   vorne == "hintenüber" or
		   vorne == "ineinander" or
		   vorne == "zueinander")
      	then
      		vlang = 10
      		return vorne
      	end
    end
	if slang >= 9 then
	  	vorne = mw.ustring.sub(s,1,9)
	  	if (vorne == "gegenüber" or
	  		vorne == "hernieder" or
	  		vorne == "hinterher")
		then
	  		vlang = 9
      		return vorne
	  	end
	end
	if slang >= 8 then
	  	vorne = mw.ustring.sub(s,1,8)
	  	if (vorne == "aufwärts" or
	  		vorne == "beiseite" or
	  		vorne == "dahinter" or
	  		vorne == "drauflos" or
	  		vorne == "einwärts" or
		  	vorne == "entgegen" or
	  		vorne == "herunter" or
	  		vorne == "hindurch" or
	  		vorne == "hinunter" or
	  		vorne == "vornüber" or
	  		vorne == "vorwärts" or
	  		vorne == "zunichte" or
	  		vorne == "zusammen" or
	  		vorne == "zwischen")
	  	then
	  		vlang = 8
      		return vorne
	  	end
	end
	if slang >= 7 then
	  	vorne = mw.ustring.sub(s,1,7)
	  	if (vorne == "abwärts" or
	  		vorne == "dagegen" or
	  		vorne == "daneben" or
	  		vorne == "darüber" or
	  		vorne == "entlang" or
	  		vorne == "entzwei" or
	  		vorne == "fürlieb" or
	  		vorne == "herüber" or
	  		vorne == "hierher" or
	  		vorne == "hinüber" or
	  		vorne == "instand" or
		 	vorne == "schwarz" or
		 	vorne == "trocken" or
		 	vorne == "überein" or
	  		vorne == "vorüber" or
			vorne == "zurecht" or
			vorne == "zuwider")
		then
	  		vlang = 7
      		return vorne
      	end
	end
	if slang >= 6 then
	  	vorne = mw.ustring.sub(s,1,6)
	  	if (vorne == "bereit" or
	  		vorne == "einher" or
		  	vorne == "falsch" or
		  	vorne == "fertig" or
	  		vorne == "gerade" or
	  		vorne == "gleich" or
			vorne == "herauf" or
	  		vorne == "heraus" or
	  		vorne == "herbei" or
	  		vorne == "herein" or
	  		vorne == "hervor" or
	  		vorne == "hinauf" or
		 	vorne == "hinaus" or
	  		vorne == "hinein" or
	  		vorne == "hintan" or
	  		vorne == "hinter" or
	  		vorne == "hinweg" or
	  		vorne == "kaputt" or
	  		vorne == "nieder" or
	  		vorne == "runter" or
	  		vorne == "scharf" or
	  		vorne == "schief" or
	  		vorne == "schutz" or
	  		vorne == "voraus" or
	  		vorne == "vorbei" or
	  		vorne == "vorher" or
	  		vorne == "weiter" or
	  		vorne == "wieder" or
			vorne == "zurück")
		then
	  		vlang = 6
	  		return vorne
      	end
    end
	if slang >= 5 then
	  	vorne = mw.ustring.sub(s,1,5)
	  	if (vorne == "abhin" or
	  		vorne == "anhin" or
	  		vorne == "bauch" or
		  	vorne == "bevor" or
		  	vorne == "blond" or
	  		vorne == "breit" or
	  		vorne == "dabei" or
	  		vorne == "dafür" or
	  		vorne == "daher" or
			vorne == "dahin" or
			vorne == "daran" or
			vorne == "davon" or
			vorne == "davor" or
			vorne == "dicht" or
			vorne == "drauf" or
			vorne == "drein" or
			vorne == "durch" or
			vorne == "empor" or
			vorne == "flach" or
			vorne == "flott" or
			vorne == "fremd" or
			vorne == "gegen" or
			vorne == "glatt" or
			vorne == "herab" or
			vorne == "heran" or
			vorne == "herum" or
			vorne == "hinab" or
			vorne == "hinan" or
			vorne == "hinzu" or
			vorne == "klein" or
			vorne == "krank" or
			vorne == "näher" or
			vorne == "offen" or
			vorne == "reich" or
			vorne == "rüber" or
			vorne == "schön" or
			vorne == "still" or
			vorne == "übrig" or
			vorne == "umher" or
			vorne == "unter" or
			vorne == "voran" or
			vorne == "weich")
		then
	  		vlang = 5
	  		return vorne
	  	end
	end
	if slang >= 4 then
	  	vorne = mw.ustring.sub(s,1,4)
	  	if (vorne == "acht" or
	  		vorne == "blau" or
	  		vorne == "bloß" or
			vorne == "dazu" or
			vorne == "dort" or
			vorne == "dran" or
			vorne == "fehl" or
			vorne == "feil" or
			vorne == "fein" or
			vorne == "fern" or
			vorne == "fest" or
			vorne == "fort" or
			vorne == "frei" or
			vorne == "gelb" or
			vorne == "groß" or
			vorne == "grün" or
			vorne == "heim" or
			vorne == "hier" or
			vorne == "hoch" or
			vorne == "kahl" or
			vorne == "kalt" or
			vorne == "klar" or
			vorne == "kurz" or
			vorne == "lieb" or
			vorne == "leer" or
			vorne == "mies" or
			vorne == "miss" or
			vorne == "nach" or
			vorne == "nahe" or
			vorne == "nass" or
			vorne == "quer" or
			vorne == "raus" or
			vorne == "rein" or
			vorne == "rück" or
			vorne == "satt" or
			vorne == "seil" or
			vorne == "über" or
			vorne == "voll" or
			vorne == "wahr" or
			vorne == "warm" or
			vorne == "weis" or
			vorne == "weiß" or
			vorne == "wohl")
		then
	  		vlang = 4
	  		return vorne
	  	end
    end
	if slang >= 3 then
	  	vorne = mw.ustring.sub(s,1,3)
	  	if (vorne == "auf" or
			vorne == "aus" or
			vorne == "bei" or
			vorne == "dar" or
			vorne == "ein" or
			vorne == "ent" or
			vorne == "gut" or
			vorne == "her" or
			vorne == "hin" or
			vorne == "los" or
			vorne == "mit" or
			vorne == "out" or
			vorne == "rum" or
			vorne == "tot" or
			vorne == "ver" or
			vorne == "vor" or
			vorne == "weg" or
			vorne == "zer")
		then
	  		vlang = 3
	  		return vorne
	  	end
    end
	if slang >= 2 then
	  	vorne = mw.ustring.sub(s,1,2)
	  	if (vorne == "ab" or
		  	vorne == "an" or
		  	vorne == "be" or
		  	vorne == "da" or
		  	vorne == "er" or
		  	vorne == "re" or
		  	vorne == "um" or
		  	vorne == "zu")
		then
	  		vlang = 2
	  		return vorne
	  	end
    end
    return mw.ustring.sub(s,1,vlang)
end

-- Zu eliminierende Zeichen bei der Bildung des Partizip II
-- Aufruf von einer Vorlage: {{#invoke:Verb|main|PIIt|lemma}}
    function Verb.PIIt(s)
		local gl = mw.ustring.len(s)
    	local elim = 0
    	if mw.ustring.len(s) < 5 then
    		return elim
    	end
    	local sm2 = gl - 1
		local sm3 = gl - 2
		local sm4 = gl - 3
		local sm5 = gl - 4

    	if (mw.ustring.sub(s,sm2,gl) == "ln" or
    		mw.ustring.sub(s,sm2,gl) == "rn")
    	then
    		elim = 1
    		return elim
    	end
		if (mw.ustring.sub(s,sm3,gl) == "den" or
			mw.ustring.sub(s,sm3,gl) == "ten")
		then
			elim = 1
			return elim
		end
		if mw.ustring.sub(s,sm3,gl) == "nen" then
			if (mw.ustring.sub(s,sm5,sm4) == "ch" or
			   mw.ustring.sub(s,sm5,sm4) == "ck" or
			   mw.ustring.sub(s,sm5,sm4) == "eb" or
			   mw.ustring.sub(s,sm5,sm4) == "eg" or
			   mw.ustring.sub(s,sm5,sm4) == "ff" or
			   mw.ustring.sub(s,sm5,sm4) == "ig" or
			   mw.ustring.sub(s,sm5,sm4) == "pp" or
			   mw.ustring.sub(s,sm5,sm4) == "rd" or
			   mw.ustring.sub(s,sm5,sm4) == "uf" or
			   mw.ustring.sub(s,sm5,sm4) == "ug")
			then
				elim = 1
			else
				elim = 2
			end
			return elim
		end
		if mw.ustring.sub(s,sm3,gl) == "men" then
			if (mw.ustring.sub(s,sm5,sm4) == "at" or
			   mw.ustring.sub(s,sm5,sm4) == "id" or
			   mw.ustring.sub(s,sm5,sm4) == "is")
			then
				elim = 1
			else
				elim = 2
			end
			return elim
		end
	   	if mw.ustring.sub(s,sm2,gl) == "en"
    	then
    		elim = 2
    	end
  		return elim
    end
-- Herkunftsangabe für zweiteilige Verben erzeugen
-- Aufruf von einer Vorlage: {{#invoke:Verb|herkunft|lemma|params}}
	function Verb.herkunft(frame)
		local lemma = frame.args[1] 		-- Verb
		local art = frame.args[2]			-- Trennbarkeit 
		local wortart = frame.args[3]		-- Wortart (W=)
		local vorspann = frame.args[4]		-- Vorspann (V=)
		local ableitung = frame.args[5] 	-- Ableitung (A=)
		local wortart2 = frame.args[6] 	    -- Wortart zur Ableitung (W2=)
		local strlen = mw.ustring.len(lemma)
		local Blank = "%s" -- whitespace
		local blgef = mw.ustring.find(lemma, Blank, 1)
		local retp = ""
		local partikel = ""
		local dativ = "dem "
		if (vorspann >= "A") then
			partikel = vorspann
		else
			partikel = Verb.vorsilbe(lemma)
		end
		local vlen = mw.ustring.len(partikel)
		local verbname = mw.ustring.sub(lemma,vlen+1,strlen)
		if (art == nil) then
			art = "t"
		end
		if (art == "t") then
			if (wortart > " ") then
				if (wortart == "Präposition" or wortart == "Adverb") then
					wortart = "Partikel"
					dativ = "der "
				elseif (wortart == "Partikel" or wortart == "Partikelverb"
					or wortart == "Interjektion") then
					dativ = "der "
				end
			end
			if (blgef) then -- Wortverbindung
				if (partikel == "") then
					partikel = mw.ustring.sub(lemma,1,blgef-1)
					verbname = mw.ustring.sub(lemma,blgef+1,strlen)
				end
				if (wortart == "") then
					local first = mw.ustring.sub(partikel,1,1)
					if (first < "a" or first == "Ä" or first == "Ö" or 
						first == "Ü") then
						wortart = "Substantiv"
					else
						wortart = "Adjektiv"
					end
				end
				retp = retp .. "[[Wortverbindung]] aus " .. dativ
				retp = retp .. " [[" .. wortart .. "]] "
				retp = retp .. "''[[" .. partikel .. "]]'' und dem Verb ''[["
				retp = retp .. verbname
				retp = retp .. "]]''"
				return retp
			end
			retp = retp .. "gebildet aus "
			if (wortart > " ") then
				retp = retp .. dativ .. "[[" .. wortart .. "]] "
				retp = retp .. "''[[" .. partikel .. "]]'' als [[Verbzusatz]]"
			else
				retp = retp .. "dem [[Verbzusatz]] ''[[" .. partikel .. "]]''"
			end
			if (wortart2 > " ") then -- fiktives Verb
				retp = retp .. " und der Ableitung zum [[" .. wortart2 .. "]] "
				retp = retp .. "''[[" .. ableitung .. "]]'' durch [[Konversion]]"
			else
				retp = retp .. " und dem [[Verb]] ''[[" .. verbname .. "]]''"
			end
		elseif (art == "u") then
			if ((vorspann == nil or vorspann == "") and ableitung > " ") then
				vorspann = ableitung
				vlen = mw.ustring.len(vorspann)
				verbname = mw.ustring.sub(lemma,vlen+1,strlen)
			end
			retp = "[[Derivation]] ([[Ableitung]]) "
			if (wortart == "Adjektiv" or wortart == "Substantiv" or
				wortart == "Verb") then
				retp = retp .. "zum [[" .. wortart .. "]] ''[["
				retp = retp .. ableitung .. "]]'' mit "
			else
				retp = retp .. "zum [[Verb]] ''[["
				retp = retp .. verbname .."]]'' mit "
			end
			retp = retp .. "dem [[Derivatem]] ([[Ableitungsmorphem]]) "
			if (verbname == "eln") then
				retp = retp .. "''[[-el]]'' und der [[Flexionsendung]] ''[[-n]]''"
			elseif (verbname == "en" or verbname == "n") then
				retp = "[[Derivation]] ([[Ableitung]]) "
				retp = retp .. "vom [[" .. wortart .."]] "
				retp = retp .. "''[[" .. ableitung .. "]]'' durch [[Konversion]] "
				retp = retp .. "mit der [[Flexionsendung]] ''[[-" .. verbname .. "]]''"
			elseif (verbname == "ifizieren") then
				retp = retp .. "''[[-ifizier]]'' und der [[Flexionsendung]] ''[[-en]]''"
			elseif (verbname == "isieren") then
				retp = retp .. "''[[-isier]]'' und der [[Flexionsendung]] ''[[-en]]''"
			elseif (verbname == "ieren") then
				retp = retp .. "''[[-ier]]'' und der [[Flexionsendung]] ''[[-en]]''"
			else
				if (ableitung > " " and
					mw.ustring.sub(lemma,1,vlen) == mw.ustring.lower(ableitung)) then
					retp = "[[untrennbar]]e [[Zusammensetzung]] aus " .. dativ
					retp = retp .. "[[" .. wortart .. "]] ''[["
					retp = retp .. vorspann .."]]'' und dem Verb ''[["
					retp = retp .. verbname .. "]]''"
				else
					retp = retp .. "''[[" .. partikel .. "-]]''"
				end
			end
		end
		return retp	
	end    
 return Verb