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

  local p = {}
  -- Ergänzt bei Titelformatierungen in Abhängigkeit der letzten Zeichen ein Punkt am Ende des Titels hinzu oder nicht. Test für Vorlage:Internetquelle / Vorlage:TitelFormat
  -- Aufruf: {{#invoke:Zitation|TitelFormat|titel=IrgendeinTitel}}
  function p.TitelFormat(frame)
      local titel = frame.args[1] or frame.args.titel
      if (titel == '') or (titel == nil) then
         return ''
      elseif (mw.ustring.find(titel, '[\.!?!.?…][%]»«›‹‘’”“"\']*$')) or (mw.ustring.find(titel, '[\.!?!.?…]</[%s%w]*>$')) then
         return  '<i>' .. titel .. '</i>'
      else
         return  '<i>' .. titel .. '.</i>'
      end
    end

  -- Entscheidet anhand der letzten Zeichen, ob ein Punkt gesetzt wird oder nicht. Test für Vorlage:Internetquelle
  -- Aufruf: {{#invoke:Zitation|Endpunkt|titel=IrgendeinTitel}}
  function p.Endpunkt(frame)
      local titel = frame.args[1] or frame.args.titel
      if (titel == '') or (mw.ustring.find(titel, '[\.!?!.?…][%]»«›‹‘’”“"\']*$')) or (mw.ustring.find(titel, '[\.!?!.?…]</[%s%w]*>$')) then
         return  ''
      else
         return  '.'
      end
    end
  
  -- Funktion zum Ersetzen von ausgewählten Elementen der Wiki-Syntax. Wird benötigt, um die durch Vorlage:Coins eingebundnenen Datensätze frei von Wiki-Syntax zu halten.
  -- Aufruf: {{#invoke:Zitation|RemoveWikiSyntax|text=IrgendeinTitel}}
  -- derzeit funktioniert die Ersetzung nicht, da die eingegeben Zeichenkette statt <math>..</math> einen UNIQ..QINU String enhält, vgl. http://www.mediawiki.org/wiki/QINU_fix
  function p.RemoveWikiSyntax(frame)
      local text = frame.args[1] or frame.args.text
      text = mw.ustring.gsub(text,'(UNIQ.+QINU)',"FEHLER %1")
      --text = "Test - Electroweak corrections to the charm quark contribution to <math>K</math>"      
      -- internen Link entfernen (z. B. bei Autorenartikelverknüpfungen)
      text = mw.ustring.gsub(text,'%[%[([^%[%]]*)%]%]',"%1")
      -- math-Tag in TeX-Math-Umgebung umwandeln, u.a. weil math-Tags zu fehlenden COinS-Tags führen
      text = mw.ustring.gsub(text,'(<%s*/*%s*math[^>]*>)',"$")
      return  text
  end
  
  -- Funktion zum Bereinigen von ISBN-Angaben. Wird benötigt, um unnötige Fehler durch Bindestriche oder Leerzeichen bei der Nutrzung der Vorlage:bibISBN zu umgehen.
  -- Aufruf: {{#invoke:Zitation|CleanISBN|isbn=IrgendeinTitel}}
  function p.CleanISBN(frame)
      local isbn = frame.args[1] or frame.args.isbn
      isbn = mw.ustring.gsub(isbn,'[- ]+',"")
      return  isbn
  end
  
  -- Test einer Umsetzung von Vorlage:Literatur in Lua, Ziel: Abschätzung des Ressourcenverbrauchs.
  -- Aufruf: {{#invoke:Zitation|Literatur|Autor, Herausgeber, Titel, TitelErg, Sammelwerk, WerkErg, Reihe, Band, Nummer, Auflage, Verlag, Ort, Jahr, Monat, Tag, Datum, Kapitel, Seiten, Spalten, ISBN, ISBNistFormalFalsch, ISSN, Kommentar, Originaltitel, Originalsprache, Uebersetzer, DOI, PMID, DB, DBcode, Online, Zugriff, Typ}}
  -- Änderungen:
  -- 10. April 2013: erste Testversion
  -- 11. April 2013: Korrektur der Ausgabe von Band und Nummer
  -- 21. April 2013: Flexibilisierung des Parameters-Auflage (Ergänzung von "Auflage" nur bei Bedarf)
  -- 22. April 2013: Ausgabe des abschließenden Punktes korrigiert
  -- 30. April 2013: Umstellung der Abfrage für Trennzeichen
  
  function p.Literatur(frame)
    function AddDelimiterIfNeeded(text, delimiter)
        --local text = frame.args[1] or frame.args.text
        if delimiter == nil then
            delimiter = '.'
        end
        
        if (text == '') or (mw.ustring.find(text, '[\.:!?!.?…][%]»«›‹‘’”“"\']*[%s(&#160;)]*$')) or (mw.ustring.find(text, '[\.:!?!.?…]</[%s%w]*>$')) then
    		return  ''
		else
			return  delimiter
		end
    end

   function FormatDate(Datum)
       if not mw.ustring.find(frame:expandTemplate{ title = 'FormatDate', args = {Datum} }, 'Fehler') then
           return frame:expandTemplate{ title = 'FormatDate', args = {Datum} } --{{#iferror: {{FormatDate|' .. Datum .. '}}|' .. Datum .. '}}
       else
           return Datum
       end
   end

 local args = frame.args
 local Autor = args.Autor or ''
 local Herausgeber = args.Herausgeber or ''
 local Titel = args.Titel or ''
 local TitelErg = args.TitelErg or ''
 local Sammelwerk = args.Sammelwerk or ''
 local WerkErg = args.WerkErg or ''
 local Reihe = args.Reihe or ''
 local Band = args.Band or ''
 local Nummer = args.Nummer or ''
 local Auflage = args.Auflage or ''
 local Verlag = args.Verlag or ''
 local Ort = args.Ort or ''
 local Jahr = args.Jahr or ''
 local Monat = args.Monat or ''
 local Tag = args.Tag or ''
 local Datum = args.Datum or ''
 local Kapitel = args.Kapitel or ''
 local Seiten = args.Seiten or ''
 local Spalten = args.Spalten or ''
 local ISBN = args.ISBN or ''
 local ISBNistFormalFalsch = args.ISBNistFormalFalsch or ''
 local ISSN = args.ISSN or ''
 local Kommentar = args.Kommentar or ''
 local Originaltitel = args.Originaltitel or ''
 local Originalsprache = args.Originalsprache or ''
 local Uebersetzer = args.Uebersetzer or ''
 local DOI = args.DOI or ''
 local PMID = args.PMID or ''
 local DB = args.DB  or ''
 local DBcode = args.DBcode or ''
 local Online = args.Online or ''
 local Zugriff = args.Zugriff or ''
 local Typ = args.Typ or ''
 
	local Ausgabe = ''

	 if (Autor ~= '') and (Typ ~= 'wl') then
		if (Sammelwerk == '') and (Herausgeber ~= '') then
			Ausgabe = Autor .. ', ' .. Herausgeber .. '&#160;(Hrsg.):'
		else
			Ausgabe = Autor .. ':'
		end
	 elseif (Sammelwerk == '') and (Herausgeber ~= '') then
		Ausgabe = Herausgeber .. '&#160;(Hrsg.):'
	 end

     if Titel ~= '' then
    	Ausgabe = Ausgabe .. ' <i>' .. Titel .. '</i>'
		if TitelErg ~= '' then
			Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Titel, '.') ..' ' .. TitelErg
		end
		if (Sammelwerk == '') and (Reihe ~= '') then
			Ausgabe = Ausgabe .. ' (=&#160;<i>' .. Reihe .. '</i>'
    		if (Band ~= '') and (Nummer ~= '') then
                Ausgabe = Ausgabe .. ' ' .. Band .. ', Nr.&#160;' .. Nummer 
            elseif (Band ~= '') then
                Ausgabe = Ausgabe .. ' ' .. Band
            elseif (Nummer ~= '') then
				Ausgabe = Ausgabe .. ' Nr.&#160;' .. Nummer
			end
			Ausgabe = Ausgabe .. ').'
		elseif TitelErg ~= '' then
			Ausgabe = Ausgabe .. AddDelimiterIfNeeded(TitelErg, '.')
        else
            Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Titel, '.')
		end
	 end
 
	 if Sammelwerk ~= '' then
		if Herausgeber ~= '' then
			Ausgabe = Ausgabe .. ' In: ' .. Herausgeber .. '&#160;(Hrsg.): <i>' .. Sammelwerk .. '</i>'
		else
			Ausgabe = Ausgabe .. ' In: <i>' .. Sammelwerk .. '</i>'
		end

		if WerkErg ~= '' then
			Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Werk, '.') ..  ' ' .. WerkErg 
		end

		if Auflage ~= '' then
            Auflage = Auflage:gsub("^%s*(.-)%s*$", "%1"):gsub('Auflage$', 'Aufl.'):gsub('[eE]dition', 'ed.')
        	if (Auflage:find('Aufl[%.]*$') == nil) and (Auflage:find('[eE]d[%.]*$') == nil) then
        	    Auflage = Auflage ..  ' Aufl.'
        	end
            Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. Auflage
		end

		if (Reihe ~= '') then
			Ausgabe = Ausgabe .. ' (=&#160;<i>' .. Reihe .. '</i>'
    		if (Band ~= '') and (Nummer ~= '') then
                Ausgabe = Ausgabe .. ' ' .. Band .. ', Nr.&#160;' .. Nummer 
            elseif (Band ~= '') then
                Ausgabe = Ausgabe .. ' ' .. Band
            elseif (Nummer ~= '') then
				Ausgabe = Ausgabe .. ' Nr.&#160;' .. Nummer
			end
			Ausgabe = Ausgabe .. ').'
		else
			if (Band ~= '') and (Nummer ~= '') then
                Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. Band .. ', Nr.&#160;' .. Nummer 
            elseif (Band ~= '') then
                Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. Band
            elseif (Nummer ~= '') then
				Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' Nr.&#160;' .. Nummer
			end
	     end
    else
         if Auflage ~= '' then
            Auflage = Auflage:gsub("^%s*(.-)%s*$", "%1"):gsub('Auflage$', 'Aufl.'):gsub('[eE]dition', 'ed.')
        	if (Auflage:find('Aufl[%.]*$') == nil) and (Auflage:find('[eE]d[%.]*$') == nil) then
        	    Auflage = Auflage ..  ' Aufl.'
        	end
            Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. Auflage
		end
		
		if (Band ~= '') and (Nummer ~= '') then
			Ausgabe = Ausgabe .. ' ' .. Band .. ', Nr.&#160;' .. Nummer 
		elseif (Band ~= '') then
			Ausgabe = Ausgabe .. ' ' .. Band
		elseif (Nummer ~= '') then
			Ausgabe = Ausgabe .. ' Nr.&#160;' .. Nummer
		end		
	 end
	 
	 if Verlag ~= '' then
		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. Verlag
	 end

	 if Datum ~= '' then
		Jahr = '<span style="white-space:nowrap;">' .. FormatDate(Datum) .. '</span>'
	 else
		if Monat ~= '' then
			iMonat = tonumber(Monat)
			if iMonat then
				if (iMonat > 0) and (iMonat <10) then
					Monat = '0' .. tonumber(Monat)
				end
			end
			iTag = tonumber(Tag)
			if iTag then
				if (tonumber(iTag) < 0) or (tonumber(iTag) > 31) then
					Tag = '00'
				end
			end
			Jahr = '<span style="white-space:nowrap;">' .. FormatDate(Jahr ..'-' .. Monat .. '-' .. Tag) .. '</span>'
		end
	 end

	if (Ort ~= '') or (Jahr ~= '') then
        if (Ort ~= '') and (Jahr ~= '') then   
    		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',').. ' ' .. Ort .. ' ' .. Jahr
        elseif (Ort ~= '') then
            Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',').. ' ' .. Ort
    	else
    		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',').. ' ' .. Jahr
        end
    end
     -- ISBN oder ISSN, aber nicht beides
	 if ISBN ~= '' then
	    if ISBNistFormalFalsch ~= '' then
			Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. frame:expandTemplate{ title = 'Falsche ISBN', args = {ISBN} }
		else
		    Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ISBN ' .. ISBN
        end
	 elseif ISSN ~= '' then
		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. frame:expandTemplate{ title = 'ISSN', args = {ISSN} }
	 end

	if Kapitel ~= '' then
		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' ' .. Kapitel
	end
    
    if (Seiten ~= '') or (Spalten ~= '') then
    	if (Seiten ~= '') and (Spalten ~= '') then
            Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' S.&#160;' .. Seiten .. ' Sp.&#160;' .. Spalten
    	elseif  Seiten ~= '' then
    		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' S.&#160;' .. Seiten
    	else
    		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' Sp.&#160;' .. Spalten
    	end
    end

	if DOI  ~= '' then
		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' [[doi:' .. DOI .. ']]'
	end
	if PMID  ~= '' then
		Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',') .. ' PMID ' .. PMID .. ''
	end

	if (DB ~= '') and (DBcode ~= '') then
        Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, ',')  -- .. ','
		if (DB == 'arxiv') or (DB == 'arXiv') then
			Ausgabe = Ausgabe .. ' ' .. frame:expandTemplate{ title = 'arxiv', args = {DBcode} }
		elseif DB == 'DNB' then
			Ausgabe = Ausgabe .. ' <span class="plainlinks-print">[http://d-nb.info/' .. DBcode .. ' DNB:' .. DBcode .. ']'
		elseif DB == 'ZDB' then
			Ausgabe = Ausgabe .. ' <span class="plainlinks-print">[http://dispatch.opac.d-nb.de/DB=1.1/CMD?ACT=SRCHA&IKT=8506&TRM=' .. DBcode .. ' ZDB-ID:' .. DBcode .. ']'
		elseif DB == 'LCCN' then
			Ausgabe = Ausgabe .. ' ' .. frame:expandTemplate{ title = 'LCCN', args = {DBcode} }
		elseif DB == 'OCLC' then
			Ausgabe = Ausgabe .. ' [http://worldcat.org/oclc/' .. DBcode .. ' OCLC:' .. DBcode .. ']'
		elseif DB == 'PMC' then
			Ausgabe = Ausgabe .. ' [http://www.ncbi.nlm.nih.gov/pmc/articles/PMC'.. DBcode .. ' PMC:' .. DBcode .. ']'
		elseif DB == 'Bibcode' then
			Ausgabe = Ausgabe .. ' [http://adsabs.harvard.edu/abs/' .. DBcode .. ' Bibcode:' .. DBcode .. ']'
		elseif DB == 'JSTOR' then
			Ausgabe = Ausgabe .. ' [http://www.jstor.org/stable/' .. DBcode .. ' JSTOR:' .. DBcode .. ']'
		else
		end
	end

	if (Kommentar ~= '') or (Online ~= '') then
	    Klammerinhalt = ''
		if (Kommentar ~= '') and (Online ~= '') then
			Klammerinhalt = Klammerinhalt .. Kommentar .. ', '
		else
			Klammerinhalt = Klammerinhalt .. Kommentar
		end
		if Online ~= '' then
			Klammerinhalt = Klammerinhalt .. Online
			if Zugriff ~= '' then
				Klammerinhalt = Klammerinhalt .. ', abgerufen am <span style="white-space:nowrap;">' ..FormatDate(Zugriff) .. '</span>'
			end
		end
		Ausgabe = Ausgabe .. ' (' .. Klammerinhalt .. ')'
	end

    -- Abschließender Punkt
    Ausgabe = Ausgabe .. AddDelimiterIfNeeded(Ausgabe, '.')

	return Ausgabe

  end
  
----------
  return p