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 geslang < 7 then
      	if mw.ustring.sub(s,geslang-2,geslang) == "tun"
      	then
      		slang = geslang - 3
      	else
      		return ""
      	end
      else
        slang = geslang - 4
      end
      if slang >= 14 then
      	if (mw.ustring.sub(s,1,14) == "hintereinander")
      	then
      		vlang = 14
      		return mw.ustring.sub(s,1,vlang)
      	end
      end
            if slang >= 13 then
      	if (mw.ustring.sub(s,1,13) == "durcheinander" or
      		mw.ustring.sub(s,1,13) == "gegeneinander" or
      		mw.ustring.sub(s,1,13) == "nebeneinander" or
	      	mw.ustring.sub(s,1,13) == "untereinander" or
	      	mw.ustring.sub(s,1,13) == "widereinander")
      	then
      		vlang = 13
      		return mw.ustring.sub(s,1,vlang)
      	end
      end

      if slang >= 12 then
      	if mw.ustring.sub(s,1,12) == "übereinander"
      	then
      		vlang = 12
      		return mw.ustring.sub(s,1,vlang)
      	end
      end
	  if slang>= 11 then
	  	if (mw.ustring.sub(s,1,11) == "aufeinander" or 
	  		mw.ustring.sub(s,1,11) == "auseinander" or
	  		mw.ustring.sub(s,1,11) == "beieinander" or
	  		mw.ustring.sub(s,1,11) == "miteinander" or
	  		mw.ustring.sub(s,1,11) == "voneinander")
	  	then
	  		vlang = 11
      		return mw.ustring.sub(s,1,vlang)
	  	end
	  end
      if slang >= 10 then
      	if (mw.ustring.sub(s,1,10) == "aneinander" or
		   mw.ustring.sub(s,1,10) == "dazwischen" or
		   mw.ustring.sub(s,1,10) == "hintenüber" or
		   mw.ustring.sub(s,1,10) == "ineinander" or
		   mw.ustring.sub(s,1,10) == "zueinander")
      	then
      		vlang = 10
      		return mw.ustring.sub(s,1,vlang)
      	end
      end
	  if slang >= 9 then
	  	if (mw.ustring.sub(s,1,9) == "gegenüber" or
	  		mw.ustring.sub(s,1,9) == "hernieder" or
	  		mw.ustring.sub(s,1,9) == "hinterher") then
	  		vlang = 9
      		return mw.ustring.sub(s,1,vlang)
	  	end
	  end
	  if slang >= 8 then
	  	if (mw.ustring.sub(s,1,8) == "beiseite" or
	  		mw.ustring.sub(s,1,8) == "dahinter" or
	  		mw.ustring.sub(s,1,8) == "drauflos" or
	  		mw.ustring.sub(s,1,8) == "einwärts" or
		  	mw.ustring.sub(s,1,8) == "entgegen" or
	  		mw.ustring.sub(s,1,8) == "herunter" or
	  		mw.ustring.sub(s,1,8) == "hindurch" or
	  		mw.ustring.sub(s,1,8) == "hinunter" or
	  		mw.ustring.sub(s,1,8) == "vornüber" or
	  		mw.ustring.sub(s,1,8) == "zunichte" or
	  		mw.ustring.sub(s,1,8) == "zusammen" or
	  		mw.ustring.sub(s,1,8) == "zwischen")
	  	then
	  		vlang = 8
      		return mw.ustring.sub(s,1,vlang)
	  	end
	  end
	  if slang >= 7 then
	  	if (mw.ustring.sub(s,1,7) == "dagegen" or
	  		mw.ustring.sub(s,1,7) == "daneben" or
	  		mw.ustring.sub(s,1,7) == "darüber" or
	  		mw.ustring.sub(s,1,7) == "entlang" or
	  		mw.ustring.sub(s,1,7) == "entzwei" or
	  		mw.ustring.sub(s,1,7) == "fürlieb" or
	  		mw.ustring.sub(s,1,7) == "herüber" or
	  		mw.ustring.sub(s,1,7) == "hierher" or
	  		mw.ustring.sub(s,1,7) == "hinüber" or
	  		mw.ustring.sub(s,1,7) == "instand" or
		 	mw.ustring.sub(s,1,7) == "schwarz" or
		 	mw.ustring.sub(s,1,7) == "trocken" or
		 	mw.ustring.sub(s,1,7) == "überein" or
	  		mw.ustring.sub(s,1,7) == "vorüber" or
			mw.ustring.sub(s,1,7) == "zurecht")
		then
	  		vlang = 7
      		return mw.ustring.sub(s,1,vlang)
      	end
	  end
	  if slang >= 6 then
	  	if (mw.ustring.sub(s,1,6) == "einher" or
		  	mw.ustring.sub(s,1,6) == "falsch" or
		  	mw.ustring.sub(s,1,6) == "fertig" or
	  		mw.ustring.sub(s,1,6) == "gerade" or
	  		mw.ustring.sub(s,1,6) == "gleich" or
			mw.ustring.sub(s,1,6) == "herauf" or
	  		mw.ustring.sub(s,1,6) == "heraus" or
	  		mw.ustring.sub(s,1,6) == "herbei" or
	  		mw.ustring.sub(s,1,6) == "herein" or
	  		mw.ustring.sub(s,1,6) == "hervor" or
	  		mw.ustring.sub(s,1,6) == "hinauf" or
		 	mw.ustring.sub(s,1,6) == "hinaus" or
	  		mw.ustring.sub(s,1,6) == "hinein" or
	  		mw.ustring.sub(s,1,6) == "hinter" or
	  		mw.ustring.sub(s,1,6) == "hinweg" or
	  		mw.ustring.sub(s,1,6) == "kaputt" or
	  		mw.ustring.sub(s,1,6) == "nieder" or
	  		mw.ustring.sub(s,1,6) == "runter" or
	  		mw.ustring.sub(s,1,6) == "scharf" or
	  		mw.ustring.sub(s,1,6) == "schutz" or
	  		mw.ustring.sub(s,1,6) == "voraus" or
	  		mw.ustring.sub(s,1,6) == "vorbei" or
	  		mw.ustring.sub(s,1,6) == "vorher" or
	  		mw.ustring.sub(s,1,6) == "weiter" or
	  		mw.ustring.sub(s,1,6) == "wieder" or
			mw.ustring.sub(s,1,6) == "zurück")
		then
	  		vlang = 6
	  		return mw.ustring.sub(s,1,vlang)
      	end
      end
	  if slang >= 5 then
	  	if (mw.ustring.sub(s,1,5) == "bauch" or
		  	mw.ustring.sub(s,1,5) == "blond" or
	  		mw.ustring.sub(s,1,5) == "breit" or
	  		mw.ustring.sub(s,1,5) == "dafür" or
	  		mw.ustring.sub(s,1,5) == "daher" or
			mw.ustring.sub(s,1,5) == "dahin" or
			mw.ustring.sub(s,1,5) == "daran" or
			mw.ustring.sub(s,1,5) == "davon" or
			mw.ustring.sub(s,1,5) == "davor" or
			mw.ustring.sub(s,1,5) == "drein" or
			mw.ustring.sub(s,1,5) == "durch" or
			mw.ustring.sub(s,1,5) == "empor" or
			mw.ustring.sub(s,1,5) == "flott" or
			mw.ustring.sub(s,1,5) == "fremd" or
			mw.ustring.sub(s,1,5) == "gegen" or
			mw.ustring.sub(s,1,5) == "glatt" or
			mw.ustring.sub(s,1,5) == "herab" or
			mw.ustring.sub(s,1,5) == "heran" or
			mw.ustring.sub(s,1,5) == "herum" or
			mw.ustring.sub(s,1,5) == "hinab" or
			mw.ustring.sub(s,1,5) == "hinan" or
			mw.ustring.sub(s,1,5) == "hinzu" or
			mw.ustring.sub(s,1,5) == "klein" or
			mw.ustring.sub(s,1,5) == "krank" or
			mw.ustring.sub(s,1,5) == "näher" or
			mw.ustring.sub(s,1,5) == "schön" or
			mw.ustring.sub(s,1,5) == "still" or
			mw.ustring.sub(s,1,5) == "übrig" or
			mw.ustring.sub(s,1,5) == "umher" or
			mw.ustring.sub(s,1,5) == "unter" or
			mw.ustring.sub(s,1,5) == "voran" or
			mw.ustring.sub(s,1,5) == "weich")
		then
	  		vlang = 5
	  		return mw.ustring.sub(s,1,vlang)
	  	end
      end
	  if slang >= 4 then
	  	if (mw.ustring.sub(s,1,4) == "acht" or
	  		mw.ustring.sub(s,1,4) == "blau" or
	  		mw.ustring.sub(s,1,4) == "bloß" or
			mw.ustring.sub(s,1,4) == "dazu" or
			mw.ustring.sub(s,1,4) == "dort" or
			mw.ustring.sub(s,1,4) == "dran" or
			mw.ustring.sub(s,1,4) == "fehl" or
			mw.ustring.sub(s,1,4) == "feil" or
			mw.ustring.sub(s,1,4) == "fein" or
			mw.ustring.sub(s,1,4) == "fern" or
			mw.ustring.sub(s,1,4) == "fest" or
			mw.ustring.sub(s,1,4) == "fort" or
			mw.ustring.sub(s,1,4) == "frei" or
			mw.ustring.sub(s,1,4) == "gelb" or
			mw.ustring.sub(s,1,4) == "groß" or
			mw.ustring.sub(s,1,4) == "grün" or
			mw.ustring.sub(s,1,4) == "heim" or
			mw.ustring.sub(s,1,4) == "hoch" or
			mw.ustring.sub(s,1,4) == "kahl" or
			mw.ustring.sub(s,1,4) == "kalt" or
			mw.ustring.sub(s,1,4) == "kurz" or
			mw.ustring.sub(s,1,4) == "lieb" or
			mw.ustring.sub(s,1,4) == "leer" or
			mw.ustring.sub(s,1,4) == "mies" or
			mw.ustring.sub(s,1,4) == "miss" or
			mw.ustring.sub(s,1,4) == "nach" or
			mw.ustring.sub(s,1,4) == "nass" or
			mw.ustring.sub(s,1,4) == "raus" or
			mw.ustring.sub(s,1,4) == "rein" or
			mw.ustring.sub(s,1,4) == "rück" or
			mw.ustring.sub(s,1,4) == "satt" or
			mw.ustring.sub(s,1,4) == "seil" or
			mw.ustring.sub(s,1,4) == "über" or
			mw.ustring.sub(s,1,4) == "voll" or
			mw.ustring.sub(s,1,4) == "wahr" or
			mw.ustring.sub(s,1,4) == "warm" or
			mw.ustring.sub(s,1,4) == "weis" or
			mw.ustring.sub(s,1,4) == "weiß")
		then
	  		vlang = 4
	  		return mw.ustring.sub(s,1,vlang)
	  	end
      end
	  if slang >= 3 then
	  	if (mw.ustring.sub(s,1,3) == "auf" or
			mw.ustring.sub(s,1,3) == "aus" or
			mw.ustring.sub(s,1,3) == "bei" or
			mw.ustring.sub(s,1,3) == "dar" or
			mw.ustring.sub(s,1,3) == "ein" or
			mw.ustring.sub(s,1,3) == "gut" or
			mw.ustring.sub(s,1,3) == "her" or
			mw.ustring.sub(s,1,3) == "hin" or
			mw.ustring.sub(s,1,3) == "los" or
			mw.ustring.sub(s,1,3) == "mit" or
			mw.ustring.sub(s,1,3) == "out" or
			mw.ustring.sub(s,1,3) == "rum" or
			mw.ustring.sub(s,1,3) == "tot" or
			mw.ustring.sub(s,1,3) == "vor" or
			mw.ustring.sub(s,1,3) == "weg")
		then
	  		vlang = 3
	  		return mw.ustring.sub(s,1,vlang)
	  	end
      end
	  if slang >= 2 then
	  	if (mw.ustring.sub(s,1,2) == "ab" or
		  	mw.ustring.sub(s,1,2) == "an" or
		  	mw.ustring.sub(s,1,2) == "da" or
		  	mw.ustring.sub(s,1,2) == "um" or
		  	mw.ustring.sub(s,1,2) == "zu")
		  then
	  		vlang = 2
	  		return mw.ustring.sub(s,1,vlang)
	  	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    	
 return Verb