La documentación para este módulo puede ser creada en Módulo:ejemplo/doc

--Parámetros deprecados: apellidos, nombre, enlaceautor, fecha, año, mes, coautores, URL

local export = {}
local generar_error = require("Módulo:traza")
local strfind = require("Módulo:String").find
local substr = require("Módulo:String").sub

local params = {
    [1] = {}, --ejemplo
    ["tradtrad"] = {}, --solo para debug
    ["trad"] = {}, -- traducción
    ["traducción"] = {alias_de = "trad"},
    ["traduccion"] = {alias_de = "trad"},
    --Parámetros viejos
    ["apellido"] = {obs = true},
    ["apellidos"] = {obs = true},
    ["nombre"] = {obs = true},
    ["nombres"] = {obs = true},
    ["publicación"] = {obs = true},
    ["publicacion"] = {obs = true},
    ["first"] = {obs = true},
    ["last"] = {obs = true},
    ["accessdate"] = {obs = true},
    ["obra"] = {obs = true},
    ["urlarchivo"] = {obs = true},
    ["fechaarchivo"] = {obs = true},
    ["urltrad"] = {obs = true},
    ["año"] = {obs = true},
    ["mes"] = {obs = true},
    ["URL"] = {obs = true},
    ["ISBN"] = {obs = true},
    ["ISSN"] = {obs = true},
    ["fechaacceso"] = {obs = true},
    ["URLcapítulo"] = {obs = true},
    ["URLcapitulo"] = {obs = true},
    ["cita"] = {obs = true},
    ["otros"] = {obs = true},
    ["enlaceautor"] = {obs = true},
    ["coautores"] = {obs = true},
    -- resto de parámetros para referencia
    ["c"] = {},
    ["cat"] = {alias_de = "c"},
    ["categoría"] = {alias_de = "c"},
    --Libros, artículos y general
    ["a"] = {lista = true},
    ["autor"] = {alias_de = "a"},
    ["artista"] = {alias_de = "a"},
    ["remitente"] = {alias_de = "a"},
    ["de"] = {alias_de = "a"},
    ["v"] = {},
    ["version"] = {alias_de = "v"},
    ["versión"] = {alias_de = "v"},
    ["editor"] = {lista = true},
    ["ilustrador"] = {lista = true},
    ["compositor"] = {lista=true},
    ["traductor"] = {lista=true},
    ["compilador"] = {lista=true},
    ["interprete"] = {lista=true},
    ["intérprete"] = {alias_de = "interprete"},
    --Títulos
    ["t0"] = {},
    ["revista"] = {alias_de = "t0"},
    ["colección"] = {alias_de = "t0"},
    ["coleccion"] = {alias_de = "t0"},
    ["t"] = {},
    ["t1"] = {alias_de = "t"},
    ["título"] = {alias_de = "t"},
    ["titulo"] = {alias_de = "t"},
    ["t2"] = {},
    ["subtítulo"] = {alias_de = "t2"},
    ["subtitulo"] = {alias_de = "t2"},
    ["parte"] = {alias_de = "t2"},
    ["art"] = {alias_de = "t2"},
    ["artículo"] = {alias_de = "t2"},
    ["termino"] = {alias_de = "t2"},
    ["término"] = {alias_de = "t2"},
    ["t3"] = {},
    ["cap"] = {alias_de = "t3"},
    ["capítulo"] = {alias_de = "t3"},
    ["capitulo"] = {alias_de = "t3"},
    ["subsubtítulo"] = {alias_de = "t3"},
    ["subsubtitulo"] = {alias_de = "t3"},
    ["sección"] = {alias_de = "t3"},
    ["seccion"] = {alias_de = "t3"},
    ["sec"] = {alias_de = "t3"},
    ["inc"] = {alias_de = "t3"},
    ["inciso"] = {alias_de = "t3"},
    ---Otros campos de libros
    ["p"] = {},
    ["pp"] = {alias_de = "p"},
    ["pag"] = {alias_de = "p"},
    ["pág"] = {alias_de = "p"},
    ["pags"] = {alias_de = "p"},
    ["págs"] = {alias_de = "p"},
    ["pagina"] = {alias_de = "p"},
    ["página"] = {alias_de = "p"},
    ["paginas"] = {alias_de = "p"},
    ["páginas"] = {alias_de = "p"},
    ["tomo"] = {tipo = "num"},
    ["vol"] = {tipo = "num"},
    ["volumen"] = {alias_de = "vol"},
    ["edicion"] = {tipo = "num"},
    ["edición"] = {alias_de = "edicion"},
    ["pasaje"] = {}, --Por ejemplo LA Biblia o las obras griegas clásicas; también aplica para revistas de artículos
    --Instituciones, editoriales, etc.
    ["editorial"] = {},
    ["sitio"] = {alias_de = "editorial"},
    ["diario"] = {alias_de = "editorial"},
    ["inst"] = {}, --institución
    ["institución"] = {alias_de = "inst"},
    ["institucion"] = {alias_de = "inst"},
    ["org"] = {alias_de = "inst"},
    ["organizacion"] = {alias_de = "inst"},
    ["organización"] = {alias_de = "inst"},
    --Fecha YYYY-MM-DD
    ["f"] = {},
    ["fecha"] = {alias_de = "f"},
    ["fo"] = {},
    ["fechaoriginal"] = {alias_de = "fo"},
    ["fecha original"] = {},
    --también fc = fecha consulta
    --Lugar
    ["l"] = {},
    ["lugar"] = {alias_de = "l"},
    ["ubicacion"] = {alias_de = "l"},
    ["ubicación"] = {alias_de = "l"},
    ["lo"] = {},
    ["lugaroriginal"] = {alias_de = "lo"},
    ["lugar original"] = {},
    ["ubicaciónoriginal"] = {alias_de = "lo"},
    ["lugar original"] = {},
    --Códigos de identifiación
    ["id"] = {},
    ["pid"] = {alias_de = "id"},
    ["patenteid"] = {alias_de = "id"},
    ["doi"] = {},
    ["isan"] = {},
    ["isbn"] = {},
    ["ismn"] = {},
    ["isrc"] = {},
    ["issn"] = {},
    ["iswc"] = {},
    ["oclc"] = {},
    -- diccionario
    ["urlprefijo"] = {},
    ["urlsufijo"] = {},
    --musica y audio
    ["album"] = {},
    ["álbum"] = {alias_de = "album"},
    ["n"] = {tipo = "num"},
    ["num"] = {alias_de = "n"},
    ["núm"] = {alias_de = "n"},
    ["nro"] = {alias_de = "n"},
    ["numero"] = {alias_de = "n"},
    ["número"] = {alias_de = "n"},
    ["estudio"] = {},
    --audiovisual
    ["clip"] = {},
    ["temporada"] = {tipo = "num"},
    ["m"] = {},
    ["modo"] = {alias_de = "m"},
    ["formato"] = {alias_de = "m"},
    ["plataforma"] = {alias_de = "m"},
    --cartas e emails
    ["destinatario"] = {lista = true},
    ["receptor"] = {alias_de = "destinatario"},
    ["para"] = {alias_de = "destinatario"},
    ["lr"] = {alias_de = "l"},
    ["lugarremitente"] = {alias_de = "l"},
    ["lugar remitente"] = {},
    ["ld"] = {},
    ["lugardestinatario"] = {alias_de = "ld"},
    ["lugar destinatario"] = {},
    --URL
    ["u"] = {},
    ["url"] = {alias_de = "u"},
    ["fc"] = {},
    ["fechaconsulta"] = {alias_de = "fc"},
    ["fecha consulta"] = {},
    ["fechaacceso"] = {alias_de = "fc"},
    --Si es esbozo o no
    ["esbozo"] = {tipo = "bool"},
    ["borrador"] = {alias_de = "esbozo"},
    --Observaciones
    ["obs"] = {},
    ["nota"] = {alias_de = "obs"},
    
    -- Parámetros duplicados por si se quiere incluir ref de traduccion
    ["tradc"] = {},
    ["tradcat"] = {alias_de = "tradc"},
    ["tradcategoría"] = {alias_de = "tradc"},
    --Libros, artículos y general
    ["trada"] = {lista = true},
    ["tradautor"] = {alias_de = "trada"},
    ["tradartista"] = {alias_de = "trada"},
    ["tradremitente"] = {alias_de = "trada"},
    ["tradde"] = {alias_de = "trada"},
    ["tradv"] = {},
    ["tradversion"] = {alias_de = "tradv"},
    ["tradversión"] = {alias_de = "tradv"},
    ["tradeditor"] = {lista = true},
    ["tradilustrador"] = {lista = true},
    ["tradcompositor"] = {lista=true},
    ["tradtraductor"] = {lista=true},
    ["tradcompilador"] = {lista=true},
    ["tradinterprete"] = {lista=true},
    ["tradintérprete"] = {alias_de = "tradinterprete"},
    --Títulos
    ["tradt0"] = {},
    ["tradrevista"] = {alias_de = "tradt0"},
    ["tradcolección"] = {alias_de = "tradt0"},
    ["tradcoleccion"] = {alias_de = "tradt0"},
    ["tradt"] = {},
    ["tradt1"] = {alias_de = "tradt"},
    ["tradtítulo"] = {alias_de = "tradt"},
    ["tradtitulo"] = {alias_de = "tradt"},
    ["tradt2"] = {},
    ["tradsubtítulo"] = {alias_de = "tradt2"},
    ["tradsubtitulo"] = {alias_de = "tradt2"},
    ["tradparte"] = {alias_de = "tradt2"},
    ["tradart"] = {alias_de = "tradt2"},
    ["tradartículo"] = {alias_de = "tradt2"},
    ["tradtermino"] = {alias_de = "tradt2"},
    ["tradtérmino"] = {alias_de = "tradt2"},
    ["tradt3"] = {},
    ["tradcap"] = {alias_de = "tradt3"},
    ["tradcapítulo"] = {alias_de = "tradt3"},
    ["tradcapitulo"] = {alias_de = "tradt3"},
    ["tradsubsubtítulo"] = {alias_de = "tradt3"},
    ["tradsubsubtitulo"] = {alias_de = "tradt3"},
    ["tradsección"] = {alias_de = "tradt3"},
    ["tradseccion"] = {alias_de = "tradt3"},
    ["tradsec"] = {alias_de = "tradt3"},
    ["tradinc"] = {alias_de = "tradt3"},
    ["tradinciso"] = {alias_de = "tradt3"},
    ---Otros campos de libros
    ["tradp"] = {},
    ["tradpp"] = {alias_de = "tradp"},
    ["tradpag"] = {alias_de = "tradp"},
    ["tradpág"] = {alias_de = "tradp"},
    ["tradpags"] = {alias_de = "tradp"},
    ["tradpágs"] = {alias_de = "tradp"},
    ["tradpagina"] = {alias_de = "tradp"},
    ["tradpágina"] = {alias_de = "tradp"},
    ["tradpaginas"] = {alias_de = "tradp"},
    ["tradpáginas"] = {alias_de = "tradp"},
    ["tradtomo"] = {tipo = "num"},
    ["tradvol"] = {tipo = "num"},
    ["tradvolumen"] = {alias_de = "tradvol"},
    ["tradedicion"] = {tipo = "num"},
    ["tradedición"] = {alias_de = "tradedicion"},
    ["tradpasaje"] = {}, --Por ejemplo LA Biblia o las obras griegas clásicas; también aplica para revistas de artículos
    --Instituciones, editoriales, etc.
    ["tradeditorial"] = {},
    ["tradsitio"] = {alias_de = "tradeditorial"},
    ["traddiario"] = {alias_de = "tradeditorial"},
    ["tradinst"] = {}, --institución
    ["tradinstitución"] = {alias_de = "tradinst"},
    ["tradinstitucion"] = {alias_de = "tradinst"},
    ["tradorg"] = {alias_de = "tradinst"},
    ["tradorganizacion"] = {alias_de = "tradinst"},
    ["tradorganización"] = {alias_de = "tradinst"},
    --Fecha YYYY-MM-DD
    ["tradf"] = {},
    ["tradfecha"] = {alias_de = "tradf"},
    ["tradfo"] = {},
    ["tradfechaoriginal"] = {alias_de = "tradfo"},
    ["tradfecha original"] = {},
    --también fc = fecha consulta
    --Lugar
    ["tradl"] = {},
    ["tradlugar"] = {alias_de = "tradl"},
    ["tradubicacion"] = {alias_de = "tradl"},
    ["tradubicación"] = {alias_de = "tradl"},
    ["tradlo"] = {},
    ["tradlugaroriginal"] = {alias_de = "tradlo"},
    ["tradubicaciónoriginal"] = {alias_de = "tradlo"},
    ["tradlugar original"] = {},
    --Códigos de identifiación
    ["tradid"] = {},
    ["tradpid"] = {alias_de = "tradid"},
    ["tradpatenteid"] = {alias_de = "tradid"},
    ["traddoi"] = {},
    ["tradisan"] = {},
    ["tradisbn"] = {},
    ["tradismn"] = {},
    ["tradisrc"] = {},
    ["tradissn"] = {},
    ["tradiswc"] = {},
    ["tradoclc"] = {},
    -- diccionario
    ["tradurlprefijo"] = {},
    ["tradurlsufijo"] = {},
    --musica y audio
    ["tradalbum"] = {},
    ["tradálbum"] = {alias_de = "tradalbum"},
    ["tradn"] = {tipo = "num"},
    ["tradnum"] = {alias_de = "tradn"},
    ["tradnúm"] = {alias_de = "tradn"},
    ["tradnro"] = {alias_de = "tradn"},
    ["tradnumero"] = {alias_de = "tradn"},
    ["tradnúmero"] = {alias_de = "tradn"},
    ["tradestudio"] = {},
    --audiovisual
    ["tradclip"] = {},
    ["tradtemporada"] = {tipo = "num"},
    ["tradm"] = {},
    ["tradmodo"] = {alias_de = "tradm"},
    ["tradformato"] = {alias_de = "tradm"},
    ["tradplataforma"] = {alias_de = "tradm"},
    --cartas e emails
    ["traddestinatario"] = {lista = true},
    ["tradreceptor"] = {alias_de = "traddestinatario"},
    ["tradpara"] = {alias_de = "traddestinatario"},
    ["tradlr"] = {alias_de = "tradl"},
    ["tradlugarremitente"] = {alias_de = "tradl"},
    ["tradlugar remitente"] = {},
    ["tradld"] = {},
    ["tradlugardestinatario"] = {alias_de = "tradld"},
    ["tradlugar destinatario"] = {},
    --URL
    ["tradu"] = {},
    ["tradurl"] = {alias_de = "tradu"},
    ["tradfc"] = {},
    ["tradfechaconsulta"] = {alias_de = "tradfc"},
    ["tradfecha consulta"] = {},
    ["tradfechaacceso"] = {alias_de = "tradfc"},
    --Si es esbozo o no
    ["tradesbozo"] = {tipo = "bool"},
    ["tradborrador"] = {alias_de = "tradesbozo"},
    --Observaciones
    ["tradobs"] = {},
    ["tradnota"] = {alias_de = "tradobs"}
}

local function args_tiene_ref(args)
	for arg, val in pairs(args) do
		if type(arg) ~= "number" and ((type(val) == "table" and #val > 0) or (type(val) ~= "table" and type(val) ~= "nil")) then
			return true
		end
	end
	return false
end

local function separar_args_trad(args)
	local args2 = {}
	for arg, val in pairs(args) do
		if type(arg) == "string" and (arg ~= "traductor") then
			tradarg = {arg:match("^trad(.+)$")}
			if tradarg[1] then
				args2[tradarg[1]] = val
				args[arg] = nil
			end
		end
	end
	return args2
end

local function obtener_ejemplo(args, frame, titulo_de_ejemplo)
	if not args[1] or args[1] == "" then
		local title = mw.title.getCurrentTitle().fullText
    	if title == "Plantilla:ejemplo" then
    		return "Use esta plantilla en el espacio principal."	
    	end	    	
    	if title == "Plantilla:cita" then
    		return "Use esta plantilla fuera del espacio principal."	
    	end
		error("Ejemplo vacío. Rellene todos los parámetros tal como está indicado en la documentación de la plantilla.")
	end
	
	local function esta_desbalanceada(s)
	    local cursiva_abierta = false
	    local negrita_abierta = false
	    local parentesis_abierto = false
	    local comillas_previas = 0
	    if not s or s == "" then
	    	return false	
	    end
	    for i=1,#s do
	        if substr(s, i, i) == "'" then
	            comillas_previas = comillas_previas + 1
	        else
	            if comillas_previas == 2 then
	                cursiva_abierta = not cursiva_abierta
	            elseif comillas_previas == 3 then
	                negrita_abierta = not negrita_abierta
	            end
	            comillas_previas = 0
	            
	            if substr(s, i, i) == "(" then
	            	if parentesis_abierto then
	            		return true
	            	end
	            	parentesis_abierto = true
	            elseif substr(s, i, i) == ")" then
	            	if not parentesis_abierto then
	            		return true
	            	end
	            	parentesis_abierto = false
	            end
	        end
	    end
	    return cursiva_abierta or negrita_abierta or parentesis_abierto
	end
	
	if esta_desbalanceada(args[1]) or esta_desbalanceada(args["trad"]) then
		generar_error("desbalance")
	end
	
	if strfind(args[1], "h?t?t?p?s?:?/?/?.?w?w?w?%.?[-a-zA-Z0-9@:%%%._%+~#=]+%.[a-z]+") or strfind(args[1], "%[%[[wsb]:") then
		generar_error("url")
	end
	
	local tradtrad = args["tradtrad"]
	args["tradtrad"] = nil
	if tradtrad then
		generar_error("tradtrad")	
	end
	
	local ejemplo = args[1]
	local traduccion = args["trad"]
	args[1] = nil
	args["trad"] = nil
    
    local args_trad = separar_args_trad(args)
    local ref, ref2 = nil, nil
    
    if args_tiene_ref(args) then
		ref = require("Módulo:referencia").generar_referencia_con_link_implicito(args)
    end
    if args_tiene_ref(args_trad) then
    	if not args_trad["c"] or args_trad["c"] == "" then
    		args_trad["c"] = args["c"]
    	end
		ref2 = require("Módulo:referencia").generar_referencia_con_link_implicito(args_trad)
    end
    
    if titulo_de_ejemplo and not traduccion and (type(ref) ~= "string" or ref == "") and #ejemplo < 200 and not ejemplo:find("<br>") then
    	return ":*'''Ejemplo:''' "..ejemplo
    end
    
    local ej = {}
    if titulo_de_ejemplo then
    	table.insert(ej, ":*'''Ejemplo:'''&nbsp;<span class='mw-collapsible mw-collapsed' data-expandtext='▼' data-collapsetext='▲'>")
    end
    table.insert(ej, frame:extensionTag("templatestyles", nil, {src = "Plantilla:ejemplo/estilo.css"}).."<blockquote><span class='cita'>"..ejemplo.."</span>")
    if traduccion then
    	table.insert(ej, "<span class='trad'>''→&nbsp;''"..traduccion.."</span>")
    end
    
    if type(ref) == "string" and ref ~= "" then
    	table.insert(ej, "<span class='ref'>"..ref)    
    	if type(ref2) == "string" and ref2 ~= "" then
    		table.insert(ej, "<br>Traducción: "..ref2)
    	end
    	table.insert(ej, "</span>")
    end
    
    table.insert(ej, "</blockquote></span>")
    
    return table.concat(ej)
end

function export.generar_ejemplo_test(argumentos_plantilla)
	local args = require("Módulo:parámetros").obtener_parametros(argumentos_plantilla, params)
	return obtener_ejemplo(args, frame)
end

function export.generar_ejemplo(frame)
    local parent_frame = frame:getParent()
	local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
	return obtener_ejemplo(args, frame, true)
end

function export.generar_cita(frame)
    local parent_frame = frame:getParent()
	local args = require("Módulo:parámetros").obtener_parametros(parent_frame.args, params)
	return obtener_ejemplo(args, frame, false)
end

return export