Dokumentaci tohoto modulu lze vytvořit na stránce Nápověda:Modul:Textinfo

-- @brief
--  Backend for {{Textinfo}} & {{NavigacePaP}}.
-- 
-- @author
--  [[meta:User:Danny B.]]
local _module = {}
----------------------------------------


-- @brief
--  Escapes the string, so it can be safely used in patterns.
-- 
-- @param
--  value String to be escaped
-- 
-- @return
--  String Escaped input string
local function escapeForPattern( value )

	return mw.ustring.gsub( value, "([%(%)%[%]%.%+%-%*%?%%])", "%%%1" )
	
end


local function params2table ( param, ... )
	
	return param ~= nil and { param, ... } or nil
	
end


local Patterns = {
	["disambiguationSuffix"] = " %(%d%d%d%d–%d%d%d%d%)",
	["extlink"] = "%[[^%[][^%]]+%]",
	["nowiki"] = "\127'\"`UNIQ%-%-nowiki%-%x%x%x%x%x%x%x%x%-QINU`\"'\127",
	["plaintext"] = "[^%]\127]*",
	["ref"] = "\127'\"`UNIQ%-%-ref%-%x%x%x%x%x%x%x%x%-QINU`\"'\127",
	["wikilink"] = "%[%[[^%]]+%]%]"
}


local Wikilink = {}


function Wikilink.getType( link )
	
	local output
	local prefix
	
	local target = mw.ustring.match( link, "%[%[([^|%]]+)[|%]]" ) or ""
	
	output, prefix = Wikilink.getTargetType( target )
	
	if mw.ustring.find( link, "|" ) ~= nil then
		output = string.format( "%s s textem (%s)", output, Wikilink.getTextType( link, prefix ) )
	end
	
	return output
	
end


function Wikilink.getTargetType( target )
	
	local output = ""
	local prefix = ""
	
	local titleObject = mw.title.new( target )
	-- expensive++
	
	if titleObject then
		
		output = titleObject.isRedirect and "přesměrování" or "odkaz"
		
		if titleObject.nsText ~= "" then
			output = string.format( "%s %s", output, titleObject.nsText )
			prefix = string.match( target, "([^:]+:).*" )
		end
		
	end

	return output, prefix
	
end


function Wikilink.getTextType( link, prefix )
	
	local linkTextTypes = {
		{
			["name"] = "stejné",
			["target"] = "([^|]+)",
			["text"] = "%1"
		}, {
			["name"] = "bez rozlišovače",
			["target"] = "([^|]+)" .. Patterns.disambiguationSuffix,
			["text"] = "%1"
		}, {
			["name"] = "rozšířené",
			["target"] = "([^|]+)",
			["text"] = "[^%]]-%1[^%]]-"
		}, {
			["name"] = "odlišné",
			["target"] = "[^|]+",
			["text"] = "[^]]+"
		}
	}
	
	local output = ""
	
	local _
	local linkTextType
	
	for _, linkTextType in ipairs( linkTextTypes ) do
		
		local pattern = string.format( "%%[%%[%s%s|%s%%]%%]", prefix, linkTextType["target"], linkTextType["text"] )
		
		if mw.ustring.match( link, pattern ) ~= nil then
			output = linkTextType["name"]
			break
		end
		
	end
	
	return output
	
end


_module.authorPrefix = mw.site.namespaces[100]["name"] .. ":"


function _module._getLinkType( value )
	
	local output
	
	value = select( 3, mw.ustring.find( value, "(" .. Patterns.wikilink .. ")" ) )
	
	output = Wikilink.getType( value )
	
	return output
	
end


function _module._replaceLink( value )
	
	return mw.ustring.gsub( value, Patterns.wikilink, "⌂" )
	
end


function _module._trimDisambiguationSuffix ( value )
	
	return mw.ustring.match( value, "^(.*)" .. Patterns.disambiguationSuffix .. "$" ) or value
	
end


function _module._createAuthorsPattern( count )
	
	local authorPattern = "%[%[" .. _module.authorPrefix .. "([^%]|]+)|%1%]%]"
	local output = authorPattern
	
	for i = 2, count do
		output = output .. ", " .. string.gsub( authorPattern, "%%1", "%%" .. i )
	end
	
	output = "^" .. output .. "$"
	
	return output
	
end


-- @brief
--  Categorizes the page according to the "AUTOR" parameter, if it has value in defined simple formats.
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.printAuthorCategory( frame )
	
	local titleObject = mw.title.getCurrentTitle()
	
	if titleObject.namespace ~= 0 then
		return
	end
	
	local output = ""
	
	local authorParam = mw.text.trim( frame:getParent().args["AUTOR"] or "" )
	
	local valueType
	local pageContent = titleObject:getContent()
	local authorNames = {}
	
	authorNames = params2table( nil
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)%]%]$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|%1%]%]$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "(([^%]|]+)" .. Patterns.disambiguationSuffix .. ")|%2%]%]$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]-%1[^%]]-%]%]$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%]$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%], neuveden$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%], neuveden, redakce$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%], neznámý$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%], neznámý, redakce$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%], redakce$" )
		or mw.ustring.match( authorParam, "^%[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%], redakce, neuveden$" )
		or mw.ustring.match( authorParam, "^neuveden, %[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%]$" )
		or mw.ustring.match( authorParam, "^neznámý, %[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%]$" )
		or mw.ustring.match( authorParam, "^redakce, %[%[" .. _module.authorPrefix .. "([^%]|]+)|[^%]]+%]%]$" )
	)
	
	for i = 2, 9 do
		if authorNames then
			break
		end
		authorNames = params2table( string.match( authorParam, _module._createAuthorsPattern( i ) ) )
	end
	
	if authorNames then
		for _, authorName in ipairs( authorNames ) do
			if mw.ustring.match( pageContent, "%[%[ *[Kk]ategorie *: *" .. escapeForPattern( authorName ) .. " *%]%]" ) ~= nil then
				valueType = "obsahující kategorii autora"
			elseif mw.ustring.match( pageContent, "%[%[ *[Kk]ategorie *: *" .. escapeForPattern( authorName ) .. " *|[^%]]*%]%]" ) ~= nil then
				valueType = "obsahující kategorii autora s řadicím klíčem"
			else
				valueType = "neobsahující kategorii autora"
			end
			output = output .. string.format( "[[Kategorie:%s]][[Kategorie:Monitoring:Textinfo automaticky kategorizující stránku %s]]", authorName, valueType )
		end
	elseif ( authorParam == "neuveden" or authorParam == "neznámý" ) then
		output = output .. "[[Kategorie:Monitoring:Textinfo automaticky nekategorizující stránku s vyhrazeným autorem]]"
	elseif authorParam == "" then
		output = output .. "[[Kategorie:Monitoring:Textinfo automaticky nekategorizující stránku s nevyplněným autorem]]"
	else
		output = output .. "[[Kategorie:Monitoring:Textinfo automaticky nekategorizující stránku podle autora]]"
	end
	
	output = frame:preprocess( output )
	
	return output
	
end


-- @brief
--  Prints the author name trimmed of the disambiguation suffix if any,
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.printTrimmedAuthorName( frame )
	
	local output
	
	output = _module._trimDisambiguationSuffix( frame.args[1] or "" )
	
	output = frame:preprocess( output )
	
	return output
	
end


-- @brief
--  Prints the list of authors.
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.printAuthors( frame )
	
	local output
	
	local authors = mw.text.split( ( frame.args[1] or "" ), " *; *" )
	
	for index, author in ipairs( authors ) do
		author = mw.text.trim( author )
		authors[index] = string.format( "[[Autor:%s|%s]]", author, _module._trimDisambiguationSuffix( author ) )
	end
	
	output = table.concat( authors, "; " )
	
	output = frame:preprocess( output )
	
	return output
	
end


-- @brief
--  Checks the legitimacy of usage of given argument.
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.checkArgumentUsageLegitimacy( frame )
	
	local argumentsLegitimacy = {
		["WIKIPEDIA-HESLO"] = {
			["subpageOf"] = {
				"Encyklopedie Britannica 1911",
				"Encyklopedie československé mládeže",
				"Hudební lexikon",
				"Masarykův slovník naučný",
				"Meyers Konversations-Lexikon 1885-1892",
				"Ottův slovník naučný",
				"Riegrův Slovník naučný",
				"Vlastenský slovník historický",
				"Všeobecná německá biografie",
				"Židovská encyklopedie",
				"Židovská encyklopedie Brockhause a Efrona"
			}
		}
	}
	
	local output = ""
	
	local titleObject = mw.title.getCurrentTitle()
	local argumentName = mw.text.trim( frame.args[1] )
	local argumentValue = mw.text.trim( frame:getParent().args[argumentName] or "" )
	
	if argumentValue == "" then
		return
	end
	
	for criteria, criteriaData in pairs( argumentsLegitimacy[argumentName] ) do
		if criteria == "subpageOf" then
			local errorMessage = "{{Chyba|šablona=Textinfo|text=Nesprávné použití parametru „" .. argumentName .. "“|kategorie=Opravit použití parametru „" .. argumentName .. "“}}"
			for _, subpage in ipairs( criteriaData ) do
				if mw.ustring.match( titleObject.text, "^" .. escapeForPattern( subpage ) .. "/" ) then
					errorMessage = ""
				end
			end
			output = output .. errorMessage
		end
	end
	
	output = frame:preprocess( output )
	
	return output
	
end


-- @brief
--  Monitors the "AUTOR", "AUTOR2" & "PŘELOŽIL" parameters in {{Textinfo}}
--  and the "AUTOR" & "AUTOR2" parameters in {{NavigacePaP}}.
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.monitorAuthors( frame )
	
	if mw.title.getCurrentTitle().namespace ~= 0 then
		return
	end
	
	local output = ""
	
	local template = frame:getParent()
	local templateName = mw.title.new( template:getTitle() ).text
	local variableName = mw.text.trim( frame.args[1] )
	local value = mw.text.trim( template.args[variableName] or "" )
	
	local valueType = ""
	
	value = mw.ustring.gsub( value, "[<>\n]", { ["<"]="⧀", [">"]="⧁", ["\n"]="⏎" } )
	
	if value == "" then
		valueType = "(nevyplněno)"
	elseif value == "neuveden" then
		valueType = "neuveden"
	elseif value == "neznámý" then
		valueType = "neznámý"
	elseif mw.ustring.match( value, "^" .. Patterns.nowiki ) ~= nil then
		valueType = "nowiki"
	elseif mw.ustring.match( value, "^%[%[" .. _module.authorPrefix .. "Anonym|[^%]]*%]%]$" ) ~= nil then
		valueType = "Anonym/" .. mw.ustring.match( value, "^%[%[" .. _module.authorPrefix .. "Anonym|([^%]]*)%]%]$" )
	elseif mw.ustring.match( value, "^%[%[ *Uživatel:[^%]]+%]%]$" ) ~= nil then
		valueType = "Uživatel"
	elseif mw.ustring.match( value, "^%*" ) ~= nil then
		valueType = "seznam/" .. select( 2, mw.ustring.gsub( value, "%*", "%0" ) )
	elseif mw.ustring.match( value, "%]%].*%[%[" ) ~= nil then
		valueType = "více odkazů/" .. select( 2, mw.ustring.gsub( value, Patterns.wikilink, "%0" ) )
	elseif mw.ustring.match( value, "^" .. Patterns.wikilink .. "$" ) ~= nil then
		valueType = _module._getLinkType( value )
	elseif mw.ustring.match( value, "^" .. Patterns.wikilink .. Patterns.ref .. "$" ) ~= nil then
		valueType = _module._getLinkType( value ) .. " + ref"
	elseif mw.ustring.match( value, "^" .. Patterns.wikilink .. ".+$" ) ~= nil then
		valueType = _module._getLinkType( value ) .. " + plaintext/" .. _module._replaceLink( value )
	elseif mw.ustring.match( value, "^.+" .. Patterns.wikilink .. "$" ) ~= nil then
		valueType = "plaintext + " .. _module._getLinkType( value ) .. "/" .. _module._replaceLink( value )
	elseif mw.ustring.match( value, "^.+" .. Patterns.wikilink .. Patterns.ref .. "$" ) ~= nil then
		valueType = "plaintext + " .. _module._getLinkType( value ) .. " + ref"
	elseif mw.ustring.match( value, "^.+" .. Patterns.wikilink .. ".+$" ) ~= nil then
		valueType = "plaintext + " .. _module._getLinkType( value ) .. " + plaintext/" .. _module._replaceLink( value )
	elseif mw.ustring.match( value, "^[^%[%]]*" .. Patterns.ref .. "$" ) ~= nil then
		valueType = "plaintext + ref"
	elseif mw.ustring.match( value, ";" ) ~= nil then
		valueType = "více položek plaintext/"
		local authors = mw.text.split( value, " *; *" )
		for index, author in ipairs( authors ) do
			author = mw.text.trim( author )
			local titleObject = mw.title.new( _module.authorPrefix .. author )
			-- expensive++
			if titleObject then
				if titleObject.exists then
					authors[index] = "autor"
					if titleObject.isRedirect then
						authors[index] = authors[index] .. " redirect"
					end
				else
					authors[index] = "plaintext"
				end
			end
		end
		valueType = valueType .. table.concat( authors, "; " )
	else
		local titleObject = mw.title.new( _module.authorPrefix .. value )
		-- expensive++
		if titleObject then
			if titleObject.exists then
				valueType = "plaintext autor"
				if titleObject.isRedirect then
					valueType = valueType .. " redirect"
				end
			else
				valueType = "plaintext/" .. value
			end
		else
			valueType = "nerozeznáno"
		end
	end
	
	output = string.format( "[[Kategorie:Monitoring:%s/%s/=%s]]", templateName, variableName, valueType )
	
	output = frame:preprocess( output )
	
	return output
	
end


-- @brief
--  Monitors the equivalence of passed argument with the page title or its part.
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.monitorTitleEquivalence( frame )
	
	if mw.title.getCurrentTitle().namespace ~= 0 then
		return
	end
	
	local output = ""
	
	local template = frame:getParent()
	local templateName = mw.title.new( template:getTitle() ).text
	local variableName = mw.text.trim( frame.args[1] )
	local titleValue, nbspReplaces = mw.ustring.gsub( mw.text.trim( template.args[variableName] or "" ), "&nbsp;", " " )
	
	local titleObject = mw.title.getCurrentTitle()
	
	local valueType
	local withNbsp = nbspReplaces > 0 and " s nepřerušitelnou mezerou" or ""
	
	if titleValue == titleObject.text then
		valueType = "název stránky"
		if mw.ustring.match( titleValue, "/" ) ~= nil then
			valueType = valueType .. " obsahující lomítko"
		end
	elseif titleValue == titleObject.subpageText then
		valueType = "název podstránky"
	elseif titleValue == titleObject.rootText then
		valueType = "název kořenové stránky"
	elseif mw.ustring.match( titleObject.text, "^.-/" .. escapeForPattern( titleValue ) .. "/.-$" ) ~= nil then
		valueType = "název mezistránky"
	elseif mw.ustring.match( titleObject.text, "^" ..  escapeForPattern( titleValue ) .. " %(.-%)$" ) ~= nil then
		valueType = "název stránky bez rozlišovače"
	elseif mw.ustring.match( titleObject.subpageText, "^" .. escapeForPattern( titleValue ) .. " %(.-%)$" ) ~= nil then
		valueType = "název podstránky bez rozlišovače"
	elseif mw.ustring.match( titleObject.rootText, "^" .. escapeForPattern( titleValue ) .. " %(.-%)$" ) ~= nil then
		valueType = "název kořenové stránky bez rozlišovače"
	elseif mw.ustring.match( titleValue, "^" .. escapeForPattern( titleObject.text ) .. Patterns.ref ) ~= nil then
		valueType = "název stránky + ref"
	elseif mw.ustring.match( titleValue, "^" .. escapeForPattern( titleObject.subpageText ) .. Patterns.ref ) ~= nil then
		valueType = "název podstránky + ref"
	elseif mw.ustring.match( titleValue, "^" .. escapeForPattern( titleObject.rootText ) .. Patterns.ref ) ~= nil then
		valueType = "název kořenové stránky + ref"
	else
		valueType = "vlastní"
	end
	
	output = string.format( "[[Kategorie:Monitoring:%s/%s/=%s%s]]", templateName, variableName, valueType, withNbsp )
	
	output = frame:preprocess( output )
	
	return output
	
end


-- @brief
--  Monitors the "ZDROJ" parameter of Ottův slovník naučný.
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.monitorSourceOsn( frame )
	
	if not mw.ustring.match( mw.title.getCurrentTitle().text, "^Ottův slovník naučný" ) then
		return
	end
	
	local osnSources = {
		["První"] = {
			1888,
			{ "15-otto" }
		},
		["Druhý"] = {
			1889,
			{ "07-otto", "34-otto" }
		},
		["Třetí"] = {
			1890,
			{ "00-otto", "33-otto" }
		},
		["Čtvrtý"] = {
			1891,
			{ "25-otto" }
		},
		["Pátý"] = {
			1892,
			{ "22-otto", "55-otto" }
		},
		["Šestý"] = {
			1893,
			{ "19-otto", "51-otto" }
		},
		["Sedmý"] = {
			1893,
			{ "11-otto", "27-otto" }
		},
		["Osmý"] = {
			1894,
			{ "14-otto", "48-otto" }
		},
		["Devátý"] = {
			1895,
			{ "08-otto", "09-otto", "26-otto" }
		},
		["Desátý"] = {
			1896,
			{ "02-otto", "38-otto" }
		},
		["Jedenáctý"] = {
			1897,
			{ "04-otto", "10-otto", "23-otto" }
		},
		["Dvanáctý"] = {
			1897,
			{ "30-otto", "44-otto" }
		},
		["Třináctý"] = {
			1898,
			{ "17-otto" }
		},
		["Čtrnáctý"] = {
			1899,
			{ "00-stud", "42-otto" }
		},
		["Patnáctý"] = {
			1900,
			{ "28-otto" }
		},
		["Šestnáctý"] = {
			1900,
			{ "01-otto", "29-otto", "32-otto" }
		},
		["Sedmnáctý"] = {
			1901,
			{ "40-otto", "50-otto" }
		},
		["Osmnáctý"] = {
			1902,
			{ "01-stud", "31-otto", "56-otto" }
		},
		["Devatenáctý"] = {
			1902,
			{ "37-otto", "57-otto" }
		},
		["Dvacátý"] = {
			1903,
			{ "13-otto" }
		},
		["Dvacátýprvý"] = {
			1904,
			{ "35-otto", "53-otto" }
		},
		["Dvacátýdruhý"] = {
			1904,
			{ "16-otto", "36-otto" }
		},
		["Dvacátýtřetí"] = {
			1905,
			{ "47-otto" }
		},
		["Dvacátýčtvrtý"] = {
			1906,
			{ "21-otto", "24-otto", "39-otto" }
		},
		["Dvacátýpátý"] = {
			1906,
			{ "12-otto" }
		},
		["Dvacátýšestý"] = {
			1907,
			{ "41-otto" }
		},
		["Dvacátýsedmý"] = {
			1908,
			{ "20-otto", "43-otto" }
		}
	}
	
	local output = ""
	local moduleArgs = frame.args
	
	local value = mw.text.trim( moduleArgs[1] or "" )
	
	local valueType
	
	if mw.ustring.match( value, "https?://" ) ~= nil then
		
		if mw.ustring.match( value, "https?://.*https?://" ) ~= nil then
			
			valueType = "(více URL)"
			
		else
			
			local dil, rok, protocol, www, idNum, idStr
			
			dil, rok, protocol, idNum, idStr = mw.ustring.match( value, "''Ottův slovník naučný.'' (.-) díl%..-(%d%d%d%d).-(https?)://archive.org/stream/ottvslovnknauni(%d%d)(%l%l%l%l)goog#page/n%d-" )
			www = "∅"
			
			if not dil then
				dil, rok, protocol, idNum, idStr = mw.ustring.match( value, "''Ottův slovník naučný.'' (.-) díl%..-(%d%d%d%d).-(https?)://www.archive.org/stream/ottvslovnknauni(%d%d)(%l%l%l%l)goog#page/n%d-" )
				www = "www"
			end
			
			if dil then
				local mode = mw.ustring.match( value, "''Ottův slovník naučný.'' .- díl%..-%d%d%d%d.-ottvslovnknauni%d%d%l%l%l%lgoog#page/n%d-/mode/(%d)up" )
				if mode then
					valueType = string.format( "archive-%s-%s-%s-%s-%s-%s-%s", dil, rok, protocol, www, idNum, idStr, mode )
				else
					valueType = string.format( "archive-%s-%s-%s-%s-%s-%s", dil, rok, protocol, www, idNum, idStr )
				end
				if not osnSources[dil] then
					output = output .. "{{Chyba|text=OSN: Neznámý název dílu|kategorie=Opravit zdroj OSN hesla}}"
				else
					if tonumber( rok ) ~= osnSources[dil][1] then
						output = output .. "{{Chyba|text=OSN: Nekorespondující rok vydání k číslu dílu|kategorie=Opravit zdroj OSN hesla}}"
					end
					local validUrl = false
					for _, url in ipairs( osnSources[dil][2] ) do
						if idNum .. "-" .. idStr == url then
							validUrl = true
						end
					end
					if not validUrl then
						output = output .. "{{Chyba|text=OSN: Nekorespondující URL k číslu dílu|kategorie=Opravit zdroj OSN hesla}}"
					end
				end
			elseif mw.ustring.match( value, "kramerius" ) then
				valueType = "kramerius"
			else
				valueType = "(nestandardní zápis)"
			end
			
		end
		
	else
		valueType = "(bez URL)"
	end
	
	output = output .. string.format( "[[Kategorie:Monitoring:Textinfo/ZDROJ/= OSN-%s]]", valueType )
	
	output = frame:preprocess( output )
	
	return output
	
end


-- @brief
--  Monitors the presence of tables in Ottův slovník naučný pages.
-- 
-- @param
--  frame The current frame object
-- 
-- @return
--  Preprocessed wikitext
function _module.monitorOsnTables( frame )
	
	local titleObject = mw.title.getCurrentTitle()
	
	if not mw.ustring.match( titleObject.text, "^Ottův slovník naučný" ) then
		return
	end
	
	local tableTypes = {
		["wiki"] = "{|",
		["HTML"] = "<table"
	}
	
	local output = ""
	
	for tableType, tableCode in pairs( tableTypes ) do
		
		local n = select( 2, mw.ustring.gsub( titleObject:getContent(), tableCode, "%0" ) )
		
		if n > 0 then 
			output = string.format( "%s[[Kategorie:Monitoring:Heslo Ottova slovníku naučného obsahující %s tabulku (%d×)]]", output, tableType, n )
		end
		
	end
	
	output = frame:preprocess( output )
	
	return output
	
end


----------------------------------------
return _module