Módulo:Ficha de proteína

Icono de documentación de módulo Documentación del módulo[ver] [editar] [historial] [purgar]

A continuación se muestra la documentación transcluida desde la subpágina /doc. [salta a la caja de código]


Este módulo es una copia de Module:Infobox gene de la Wikipedia en inglés, el cual implementa {{Ficha de proteína/pruebas}}, pretendiendo ser un reemplazo de {{Ficha de proteína}}. Según la documentación de Wikipedia en inglés, el módulo se considera estable. En realidad, la versión en inglés de {{Ficha de proteína}} es Template:Infobox protein, la que usa la sintaxis Wiki markup en lugar de Lua.

El módulo es complejo, puesto que no utiliza el Módulo:Ficha como tradicionalmente se hace en Wikipedia en español, sino que el formateo y estilos se hace dentro del mismo módulo. Sería ideal convertirlo al formato usado aquí para una mejor manejabilidad.

Se muestra correctamente en artículos donde se ha probado su uso, pero falla en páginas no enlazadas a Wikidata (a pesar de establecer el parámetro |id=).

El módulo requiere los siguientes módulos:

Transclusiones

Este ejemplo usa Glucosa-6-fosfato isomerasa (Q418097)

Original
Glucosa fosfato isomerasa
Estructuras disponibles
PDB

Buscar ortólogos: PDBe, RCSB

 Lista de códigos PDB
 Estructuras enzimáticas
Identificadores
Nomenclatura
 Otros nombres
Fosfohexosa isomerasa, fosfohexomutasa, oxoisomerasa, hexosa fosfato isomerasa, fosfosacaromutasa, fosfoglucoisomerasa, fosfohexoisomerasa, fosfoglucosa isomerasa, glucosa-fosfato isomerasa, D-glucosa-6-fosfato cetol-isomerasa, neuroleucina, antígeno espermático-36
Símbolos GPI (HGNC: 4458) AMF; NLK; PGI; PHI; GNPI; SA-36
Identificadores
externos
Número EC 5.3.1.9
Locus Cr. 19 q13.1
Patrón de expresión de ARNm
ancho=250px
Más información
Estructura/Función proteica
Tamaño 558 (aminoácidos)
Tipo de proteína Isomerasa
Datos enzimáticos
Actividad catalítica Isomerización de Glc-6P a Fru-6P
Datos biotecnológicos/médicos
Enfermedades Anemia hemolítica, por deficiencia de GPI
Información adicional
Ruta(s) Glucólisis, Gluconeogénesis, Ruta de las pentosas fosfato, Metabolismo de almidón y sacarosa
Ortólogos
Especies
Humano Ratón
Entrez
2821 14751
Ensembl
Véase HS Véase MM
UniProt
P06744 P06745
RefSeq
(ARNm)
NM_000175 NM_008155
RefSeq
(proteína) NCBI
NP_000166 NP_032181
Ubicación (UCSC)
Cr. 19:
34.85 – 34.89 Mb
Cr. 7:
34.2 – 34.23 Mb
PubMed (Búsqueda)
[1]


[2]

Esta documentación está transcluida desde Módulo:Ficha de proteína/doc.
Por favor, añade las categorías en la subpágina de documentación y los interwikis en Wikidata. Subpáginas de este módulo.

local p = { }

local navbar = require('Module:Navbar')._navbar
local infobox = require('Module:Infobox3cols').infobox
local infoboxImage = require('Module:InfoboxImage').InfoboxImage

local ModuloWikidata			= require('Módulo:Wikidata')
local ModuloPaginas				= require('Módulo:Páginas')
local ModuloArgs   				= require('Módulo:Argumentos')
local argumentos				= ModuloArgs.obtenerValorDeArgumentos
local Entidad, InstanciaDe, InstanciaDeID

-- :: Estilos por defecto
local Colores			= mw.loadData('Módulo:Ficha_de_taxón/colores')
local EstiloTabla		= 'border-spacing:2px;padding:2px;'
local EstiloEtiqueta	= 'width:30%;'
local EstiloDatos		= 'width:70%;'
local anchoImagen		= '245px'
local ColorTituloFondo	= '#FEE16A'
local ColorTituloTexto	= '#ffffff'
local ColorEtiqueta		= '#fffae6'
local EstiloTitulo		= 'font-weight:bold;'

-- wrapped "protected call", return "value error" with error info on error
local function check_values(f,args)
	    --local u= table.upack(args)
		local exist, val = pcall(f, unpack(args))
		if exist and val ~= nil then
			return(val)
		else
			-- Leaking some debugging info won't hurt....
			return("'''VALUE_ERROR''' (" .. tostring(val) .. ")")
		end
end
--[[
	texts relevant to localization are tagged with --**lclz** and/or *lclz*
	on a page {{#invoke:Sandbox/genewiki/alllua|getTemplateData|QID=Q14865053}}
	in debug window 
		frame = mw.getCurrentFrame()
		frame.args = {QID="Q14865053"} Q18031325
		print(p.getTemplateData(frame))
]]
p.getTemplateData = function(frame)
	
	ModuloArgs.obtenerTablaDeArgumentos(frame)

	--make some guesses about whether the provided QID is a good one
	--could expand here if we had some kind of error handling framework
	--did we get it from the page
	
	--try to get it from the args
	local root_qid = mw.text.trim(argumentos{'QID', 'id'} or '') 
	local mm_qid = ''
	--pull all the entity objects that we will need
	local	entity = {} 
	local	entity_protein = {}
	local	entity_mouse = {}
	local	entity_mouse_protein = {}
	local	checkOrtholog = "" --flag used to see if mouse data avaliable
	
	--actually ortholog property additional orthologs can exist
	local mouse_propertyID = "P684" 
	local protein_propertyID = "P688" 

	--get root gene entity
	if root_qid == "" then
		entity = mw.wikibase.getEntityObject()
		if entity then root_qid = entity.id else root_qid = "" end
	else
		--assuming we think its good make one call to retrieve and store its wikidata representation
		entity = mw.wikibase.getEntity(root_qid)
	end
	
  	--need to figure out if it is protein or gene here
	local subclass = p.getValue(entity, "P31") or ""
	if string.find(subclass, 'protein') then --if protein switch entity to gene
		if entity.claims then
	 		claims = entity.claims["P702"] --encoded by
	 	end
		if claims then
			--go through each index and reassign entity
			entity = {}
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				for k, v in pairs(claims) do --this would be problematic if multiple genes for the protein
					local itemID = "Q" .. claims[#entity + 1].mainsnak.datavalue.value["numeric-id"]
					entity[#entity + 1] = mw.wikibase.getEntity(itemID)
					root_qid = itemID
				end
				
			end --will return nothing if no claims are found
		end
		 entity = mw.wikibase.getEntity(root_qid) 	
	 end
	
	
	--get the other related entities
	if entity then
		local claims = ""
	 	--get protein entity object
	 	if entity.claims then
	 		claims = entity.claims[protein_propertyID]
	 	end
		if claims then
			--go through each index and then make entity_protein indexed
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				for k, v in pairs(claims) do
					local protein_itemID = "Q" .. claims[#entity_protein + 1].mainsnak.datavalue.value["numeric-id"]
					entity_protein[#entity_protein + 1] = mw.wikibase.getEntity(protein_itemID)
				end
				
			end --will return nothing if no claims are found
		end
	
	 	--get mouse entity object
	 	if entity.claims then
			claims = entity.claims[mouse_propertyID]
		end
		local qualifierID = "P703" --found in taxon
		local mouse_qual = "Q83310"
		if claims then
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				for k, v in pairs(claims) do
					if checkOrtholog == 1 then -- Don't have to go on if we already got it
						break
					end

				  	local mouse_itemID = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
					local quals 
					if v.qualifiers then
						quals = v.qualifiers.P703
					end
					if quals then
						for qk, qv in pairs(quals) do
							--get the taxon qualifier id
							local qual_obj_id = "Q"..qv.datavalue.value["numeric-id"]
							if qual_obj_id == mouse_qual then --check if this is mouse or other
								mm_qid = mouse_itemID 
								entity_mouse = mw.wikibase.getEntity(mouse_itemID)
								checkOrtholog = 1
								break
							end
						end
					end
				end
			end --will return nothing if no claims are found
		else
			checkOrtholog = 0
		end
	
	 	--get mouse protein entity object
	 	if entity_mouse and entity_mouse.claims then
			claims = entity_mouse.claims[protein_propertyID]
		end
	 	if claims then
	 		if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				for k, v in pairs(claims) do
					local protein_itemID = "Q" .. claims[#entity_mouse_protein + 1].mainsnak.datavalue.value["numeric-id"]
					entity_mouse_protein[#entity_mouse_protein + 1] = mw.wikibase.getEntity(protein_itemID)
				end
			end --will return nothing if no claims are found
	 	end	
	
	end
	
	--argumentos{'', '', {
	
	if entity then --only require the main gene entity
		--a list variables of all the data in the info box
		local name				= argumentos{'nombre', 'Name', {ModuloWikidata.obtenerEtiquetaWikidata}, {ModuloPaginas.nombrePagina, {desambiguar='sí'}}, {check_values, p.getLabel,{entity}}}
		local entrez_gene		= argumentos{'Hs_EntrezGene', 'EntrezGene', {check_values, p.getValue, {entity, "P351", "n/a"}}}
		local entrez_gene_mm	= argumentos{'Mm_EntrezGene', check_values, {check_values, p.getValue, {entity_mouse, "P351", "n/a"}}}
		local image				= check_values(p.getImage, {entity, "P18", " ", "250px", argumentos{'imagen', 'image'}}) --need to set size
		local uniprotID_hs		= argumentos{'Hs_Uniprot', 'UniProt', {check_values, p.getValueProtein, {entity_protein, "P352", "n/a"}}}
	    local uniprotID_mm		= argumentos{'Mm_Uniprot', {check_values, p.getValueProtein, {entity_mouse_protein, "P352", "n/a"}}}
	    local pdbIDs			= argumentos{'PDB', {check_values, p.getPDB, {entity_protein}}} --makes a list with links to RCSB
	    local aliases			= argumentos{'alias', {check_values, p.getAliases, {entity}}}
	    local gene_symbol		= argumentos{'Symbol', 'Símbolo', 'símbolo', {check_values, p.getValue, {entity, "P353"}}}
	    local hgnc_id			= argumentos{'HGNCid', {check_values, p.getValue, {entity, "P354"}}}
	    local homologene_id		= argumentos{'Homologen', 'Homologene', {check_values, p.getValue, {entity, "P593"}}}
	    local omim_id			= argumentos{'OMIM', {check_values, p.getValue, {entity, "P492"}}}
	    local mgi_id			= argumentos{'MGIid', {check_values, p.getValue, {entity_mouse, "P671"}}}
	    local ChEMBL_id			= argumentos{'ChEMBL', {check_values, p.getValue, {entity_protein, "P592"}}}
	    local IUPHAR_id			= argumentos{'IUPHAR', {check_values, p.getValue, {entity_protein, "P595"}}}
	    local ec_no				= argumentos{'ECnumber', 'EC_number', 'Número_EC', {check_values, p.getValueProtein, {entity_protein, "P591"}}}
	    local mol_funct			= argumentos{'Función', 'Function', {check_values, p.getGO, {entity_protein, "P680"}}}
	    local cell_comp			= argumentos{'Componente', 'Component', {check_values, p.getGO, {entity_protein, "P681"}}}
	    local bio_process		= argumentos{'Proceso', 'Process', {check_values, p.getGO, {entity_protein, "P682"}}}
		local expression_images = check_values(p.getImage, {entity,"P692","<br><br>","250px"})
		local ensembl			= argumentos{'Hs_Ensembl', {check_values, p.getValue, {entity, "P594", "n/a"}}}
		local ensembl_mm		= argumentos{'Mm_Ensembl', {check_values, p.getValue, {entity_mouse, "P594", "n/a"}}}
		local refseq_mRNA		= argumentos{'Hs_RefseqmRNA', 'RefSeq', {check_values, p.getRefseq_mRNA, {entity, "P639", "n/a"}}}
		local refseq_mRNA_mm	= argumentos{'Mm_RefseqmRNA', {check_values, p.getRefseq_mRNA, {entity_mouse, "P639", "n/a"}}}
	    local refseq_prot		= argumentos{'Hs_RefseqProtein', 'NCBI', {check_values, p.getRefseq_protein, {entity_protein, "P637", "n/a"}}}
		local refseq_prot_mm	= argumentos{'Mm_RefseqProtein', {check_values, p.getRefseq_protein, {entity_mouse_protein, "P637", "n/a"}}}
		local gstart			= argumentos{'Hs_GenLoc_start', {check_values, p.getChromosomeLoc, {entity, "P644", "hg"}}}
		local gend				= argumentos{'Hs_GenLoc_end', {check_values, p.getChromosomeLoc, {entity, "P645", "hg"}}}
		local chr				= argumentos{'Hs_GenLoc_chr', {check_values, p.trimChromosome, {entity}}}
		local cytoband			= argumentos{'Hs_GenLoc_chr', {check_values, p.getValue, {entity, "P4196", "n/a"}}} -- ?
		local db				= argumentos{'Hs_GenLoc_db', {check_values, p.getAliasFromGenomeAssembly, {entity,"hg"}}}
		local gstart_mm			= argumentos{'Mm_GenLoc_start', {check_values, p.getChromosomeLoc, {entity_mouse, "P644", "mm"}}}
		local gend_mm			= argumentos{'Mm_GenLoc_end', {check_values, p.getChromosomeLoc, {entity_mouse, "P645", "mm"}}}
		local chr_mm			= argumentos{'Mm_GenLoc_chr', {check_values, p.trimChromosome, {entity_mouse}}}
		local db_mm				= argumentos{'Mm_GenLoc_db', {check_values, p.getAliasFromGenomeAssembly, {entity_mouse,"mm"}}}
		local cytoband_mm		= argumentos{'Mm_GenLoc_chr', {check_values, p.getValue, {entity_mouse, "P4196", "n/a"}}}
		local disease, dis_ref	= ''
		if p.getDisease(entity, "P2293") then disease, dis_ref = p.getDisease(entity, "P2293") else disease, dis_ref = {"'''VALUE_ERROR'''","'''VALUE_ERROR'''" } end
		if p.getDrug(entity_protein, "P129") then drug, drug_ref, drug_pqid, drug_pname = p.getDrug(entity_protein, "P129") else drug, drug_ref, drug_pqid, drug_pname = {"'''VALUE_ERROR'''","'''VALUE_ERROR'''" } end
		--local drug = check_values(p.getDrug, {entity_protein, "P129"})
		
		--define Global Color Scheme
		rowBGcolor = '#eee'
		titleBGcolor = '#ddd'
		sideTitleBGcolor = '#c3fdb8'

		p.createTable()
    	p.renderUpperTitle(name)
    	--p.renderCaption()
    	p.renderImage(image)
    	p.renderAvailableStructures(uniprotID_hs, uniprotID_mm, checkOrtholog, pdbIDs) --PDB info
		p.renderIdentifiers(aliases, hgnc_id, gene_symbol, homologene_id, omim_id, mgi_id, ChEMBL_id, IUPHAR_id, ec_no, entrez_gene)
		--uncomment here to add a section of the infobox about genetically related diseases, with references
		--if (disease ~= "" and dis_ref ~= "") then --removes section from those items without disease info
		--	p.renderDiseases(frame, disease, dis_ref, name, root_qid)
		--end
        
        --uncomment here to add a section of the infobox about drugs that target the protein product of this gene, with references
		--if (drug ~= "" ) then --removes section from those items without drug info
		--	p.renderDrug(frame,drug, drug_ref, drug_pqid, drug_pname)
    	--end
		
		if (chr ~= "" and gstart ~= "" and gend ~= "") or (chr_mm ~= "" and gstart_mm ~= "" and gend_mm ~= "") then
			p.renderGeneLocation(frame, chr, gstart, gend, db, cytoband, ensembl, chr_mm, gstart_mm, gend_mm, db_mm, cytoband_mm, ensembl_mm, name)
		end
		if expression_images ~= ""  then
			p.renderRNAexpression(expression_images, entrez_gene)
		end
		if (mol_funct ~= "" and cell_comp ~= "" and bio_process ~= "") then
			p.renderGeneOntology(mol_funct, cell_comp, bio_process, uniprotID_hs)
		end
		p.renderOrthologs(frame, entrez_gene, entrez_gene_mm, ensembl, ensembl_mm, uniprotID_hs, uniprotID_mm, refseq_mRNA, refseq_mRNA_mm, refseq_prot, refseq_prot_mm, db, chr, gstart, gend, db_mm, chr_mm, gstart_mm, gend_mm)
		p.renderFooter(root_qid, mm_qid)        
		
		return tostring(root)
        --return table.concat(drug_pqid)
        
	else return "An Error has occurred retrieving Wikidata item for infobox"
	end	
end

p.createTable = function(subbox)

    if subbox == 'sub' then --doesn't work 
    	 root
        	:tag('table') 
            :css('padding', '0')
            :css('border', 'none')
            :css('margin', '0')
            :css('width', 'auto')
            :css('min-width', '100%')
            :css('font-size', '100%')
            :css('clear', 'none')
            :css('float', 'none')
            :css('background-color', 'transparent')
           
    else
    	root = mw.html.create('table')
    	root
	    	-- *lclz*: Some projects, like zhwiki (again), use inline styles on 
	    	-- infobox modules in addition to the class. Be sure to check them out.
    		:addClass('infobox')
        	:css('width', '26.4em')
    end

end

--Title above image
p.renderUpperTitle = function(name)
	local title = name
    if not title then return "error: failed to get label"; end
    
    root
        :tag('tr')
            :tag('th')
                :attr('colspan', 4)
                :attr('class', 'cabecera')
                :css('text-align', 'center')
                :css('font-size', '125%')
                :css('font-weight', 'bold')
                :css('background-color', '#ddd')
                :wikitext(title)
                :done() --end th
            :done() --end tr
end

--This is a place holder for the image caption, which is stored in wikicommons comments unsure how to access 
p.renderCaption = function(entity)
	--caption
end

--gets default image
p.renderImage = function(image)

	root
			:tag('tr')
        		:tag('td')
   					:attr('colspan', 4)
            		:css('text-align', 'center')
            		:wikitext(image)
         			:done() --end td
         		:done() --end tr
         		
end



p.renderAvailableStructures = function(uniprotID_hs, uniprotID_mm, checkOrtholog, pdbIDs)

    local title = 'Estructuras disponibles' --**lclz**
    local pdb_link = "[[Protein_Data_Bank|PDB]]" --**lclz**
    local searchTitle = "" 
    local listTitle = "Lista de identificadores PDB" --**lclz**
    local PDBe_base = 'https://www.ebi.ac.uk/pdbe/searchResults.html?display=both&amp;term='
    local RCSB_base = 'http://www.rcsb.org/pdb/search/smartSubquery.do?smartSearchSubtype=UpAccessionIdQuery&amp;accessionIdList='
    local url_uniprot = " " 
    
    
    if checkOrtholog == 1 and uniprotID_mm ~= 'n/a' then
    	searchTitle = 'Buscar ortólogos: '
    	url_uniprot = uniprotID_mm..','..uniprotID_hs
    else
    	searchTitle = 'Búsqueda UniProt humano: '
    	url_uniprot = uniprotID_hs
    end
    local PDBe_list = " " --create a list with " or " if there is more than one uniprot
    --get first uniprot in a list
	if url_uniprot:match("([^,]+),") then--first check if there is a list if not just assume one value
		PDBe_list = string.gsub(url_uniprot, ",", "%%20or%%20") --add or's inststead of commas
	else
		PDBe_list = url_uniprot
	end
    
    local PDBe = "["..PDBe_base..PDBe_list.." PDBe] "
    local RCSB = "["..RCSB_base..url_uniprot.." RCSB] "
    
    if string.match(pdbIDs, '%w+') then --if there aren't any PDB_ID don't display this part of the infobox
    	--p.formatRow(title)---how to not close the tags is a mystery and I could condense code once I figure out
    	root
	 		:tag('tr')
        		:tag('td')
   					:attr('colspan', 4)
            		:css('text-align', 'center')
            		:css('background-color', rowBGcolor)
            		:tag('table') 
            			:css('padding', '0')
            			:css('border', 'none')
            			:css('margin', '0')
            			:css('width', '100%')
            			:css('text-align', 'left')
            			:tag('tr')    --create title header
            				:tag('th')
            					:attr('colspan', '4')
            					:css('text-align', 'center')
            					:css('background-color',titleBGcolor)
            					--:css('width', '30%')
            					:wikitext(title)
            					:done() --end th
            				:done() --end tr
            			
    					:tag('tr')
        					:tag('th')
        						:attr('rowspan', '2')
        						:css('background-color', sideTitleBGcolor)
        						:css('width', '40%')
         						:wikitext(pdb_link)
        						:done() --end th
            				:tag('td')
            					:attr('colspan', '2')
            					:css('background-color', rowBGcolor)
            					:wikitext(searchTitle)
            					:tag('span')
            						:attr('class', 'plainlinks')
            						:wikitext(PDBe)
            						:wikitext(RCSB)
            						:done() --end span
            					:done() --end td
            				:done() --end tr
           		
            			:tag('tr') --new row for collapsible list of PDB codes
            				:tag('td')
            					:tag('table')
            						:attr('class', 'collapsible collapsed')
            						:css('padding', '0')
            						:css('border', 'none')
            						:css('margin', '0')
            						:css('width', '100%')
            						:css('text-align', 'left')
            						:tag('tr')
            							:css('background-color',titleBGcolor)
            							:css('text-align', 'center')
            							:tag('th')
            								:attr('colspan', '2')
            								:wikitext(listTitle)
            								:done() --end th
            							:done() --end tr
            						:tag('tr')
            							:tag('td')
            								:attr('colspan', '2')
            								:css('background-color', rowBGcolor)
            								:tag('p')
            									:tag('span')
            										:attr('class', 'plainlinks')
            										:wikitext(pdbIDs)
            										:done() --end span
            									:done() --end p
            								:done() --end td
            							:done() --end tr
            						:done() --end table
            					:done() --end td
            				:done() --end tr
            			:done() --end table
            		:done() --end td
            	:done() --end tr
    else
    	return ""
	end

end

p.renderIdentifiers = function(aliases, hgnc_id, gene_symbol, homologene_id, omim_id, mgi_id, ChEMBL_id, IUPHAR_id, ec_no, entrez_gene)
	local title = "Identificadores" --**lclz**
	local label_aliases = "[[Nomenclatura genética|Otros nombres]]" --**lclz**
	local symbol_url 
	if gene_symbol == "" or gene_symbol == nil  then
		symbol_url = ""
	else
		if hgnc_id == "" or hgnc_id == nil  then
			symbol_url = gene_symbol
			
		else
			symbol_url = "[//www.genenames.org/cgi-bin/gene_symbol_report?hgnc_id="..hgnc_id.." "..gene_symbol.."]"
		end
    end

	-- *lclz*: see getAliases. You can, say, use another punctuation for your language.
    aliases = string.gsub(aliases, ', '..gene_symbol..'$', '') --get rid of gene name if last in alias list
    aliases = string.gsub(aliases, gene_symbol..', ', '') --get rid of gene name if first in aliases list
    aliases = string.gsub(aliases, ', '..gene_symbol..',', ',') --get rid of gene name if in aliases list
    aliases = string.gsub(aliases, ", ,", ",") --remove comma from middle
    aliases = string.gsub(aliases, ", $", "") --remove comma from end
	local label_ext_id = "Identificadores externos" --**lclz**
	
	omim_id = string.gsub(omim_id, "%s", "")
	local omim_list = mw.text.split(omim_id, ",")
	local omim = ""
	if (omim_id ~= nil and omim_id ~= "") then
		omim = "[[Mendelian_Inheritance_in_Man|OMIM:]]".." " --**lclz**
	end
	for i, v in ipairs(omim_list) do
		if string.match(v, '%w+') then
			omim = omim.."[//omim.org/entry/"..v.." "..v.."], "
		end
	end
	omim = string.gsub(omim, ", $"," ")	--remove comma from end
	
	homologene_id = string.gsub(homologene_id, "%s", "")
	local homolo_list = mw.text.split(homologene_id, ",")
	local homolo =""
	if (homologene_id ~= nil and homologene_id ~= "") then
		homolo = "[[HomoloGene|HomoloGene:]]".." "
	end
	for i, v in ipairs(homolo_list) do
		if string.match(v, '%w+') then
			homolo = homolo.."[//www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=homologene&dopt=HomoloGene&list_uids="..v.." "..v.."] "
		end
	end
	homolo = string.gsub(homolo, ", $"," ")	--remove comma from end

	
	local genecards = "[[GeneCards|GeneCards:]]".." "
	genecards = genecards.."[//www.genecards.org/cgi-bin/carddisp.pl?gene="..gene_symbol.." "..gene_symbol.."] "

	mgi_id = string.gsub(mgi_id, "%s", "")
	local mgi_list = mw.text.split(mgi_id, ",")
	local mgi = "" 
	if (mgi_id ~= nil and mgi_id ~= "") then
		mgi = "[[Mouse_Genome_Informatics|MGI:]]".." " --**lclz**
	end
	for i, v in ipairs(mgi_list) do
		if string.match(v, '%w+') then
			local mgi_number = string.sub(mgi_id, 5)
			mgi = mgi.."[http://www.informatics.jax.org/marker/"..mgi_id.." "..mgi_number.."] "
		end
	end
	mgi = string.gsub(mgi, ", $"," ")--remove comma from end

	local ChEMBL = ""
	if string.match(ChEMBL_id, '%w+') then
		ChEMBL = "[[ChEMBL|ChEMBL:]]".." ".."[//www.ebi.ac.uk/chembldb/index.php/target/inspect/CHEMBL"..ChEMBL_id.." "..ChEMBL_id.."] "
	end
	local IUPHAR = ""
	if string.match(IUPHAR_id, '%w+') then 
		IUPHAR = "[[International_Union_of_Basic_and_Clinical_Pharmacology|IUPHAR:]]".." ".."[//www.guidetopharmacology.org/GRAC/ObjectDisplayForward?objectId="..IUPHAR_id.." "..IUPHAR_id.."] " --**lclz**
	end -- *lclz*
	local label_EC = "[[Número EC]]" --**lclz**
	ec_no = string.gsub(ec_no, "%d%.%d+%.%d+%.%-,", "")--remove those with"-" in list
	ec_no = string.gsub(ec_no, "%d%.%d+%.%d+%.%-", "")--remove those with"-" not in list
	local link_ec_no = string.gsub(ec_no, "," ,"+") --create format for link

	local EC = "[//www.genome.jp/dbget-bin/www_bget?enzyme+" .. link_ec_no .. " " .. ec_no .. "]"
	
	root
		:tag('tr')
        	:tag('th')
        		:attr('colspan', '4')
        		:css('text-align', 'center')
        		:css('background-color', titleBGcolor)
        		:css('width', '40%')
         		:wikitext(title)
        		:done() --end th
        	:done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:tag('span')
            		:attr('class', 'plainlinks')
        			:wikitext(label_aliases)
        			:done() --end span
        		:done() --end th
   
        		:tag('td')
        			:attr('colspan','3')
        			:css('background', rowBGcolor)
        			:tag('span')
            		 	:attr('class', 'plainlinks')
        			 	:wikitext(symbol_url)
        				:done() --end span
        			:wikitext(aliases)
        			:done() --end td
        		:done() --end tr		
         	:done() --end tr
         	
        :tag('tr')
         	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
         		:wikitext(label_ext_id)
    			:done() --end th
        	:tag('td')
        		:attr('colspan', '3')
        		:css('background-color', rowBGcolor)
        		:tag('span')
            		:attr('class', 'plainlinks')
        			:wikitext(omim)
        			:wikitext(mgi)
        			:wikitext(homolo)
        			:wikitext(ChEMBL)
        			:wikitext(IUPHAR)
        			:wikitext(genecards)
        			:done() --end span
        		 :done() --end td
        	:done() --end tr

	if ec_no ~= ""  then
	  root
      	:tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
         		:wikitext(label_EC)
        		:done() --end th
        	:tag('td')
        		:attr('colspan', '3')
        		:css('background-color', rowBGcolor)
        		:tag('span')
            		:attr('class', 'plainlinks')
        			:wikitext(EC)
        			:done() --end span
				:done() --end td
			:done() --end tr
    end
end

p.renderDiseases = function(frame, disease, dis_ref, name, qid) 
	local title = "Genetically Related Diseases" --**lclz**

	--check first to see if any of the diseases have references
	local ref_flag_all = false --check if any disease have references if not then don't render the headers
	local disease_name = '' --local disease_name = table.concat(disease, ", ")
	for index,value in ipairs(disease) do
		if (dis_ref[index] ~= nil and dis_ref[index] ~= '') then
			if disease_name == '' then
				disease_name = value
			else
				disease_name = disease_name..", "..value -- *lclz*: punctuation
			end
			ref_flag_all = true
		end		
	end
    if ref_flag_all then
    	root
			:tag('tr')
				:tag('td')
   					:attr('colspan', 4)
            		:css('text-align', 'center')
            		:css('background-color', rowBGcolor)
					:tag('tr') --create title bar
						:tag('th')
							:attr('colspan', '3')
							:css('text-align', 'center')
							:css('background-color', titleBGcolor)
							:css('width', '40%')
							:wikitext(title)
							:done() --end th
						:done() --end tr
					:done() --end td
				:done() --end tr

	
			    
		local ref_url =   "https://www.wikidata.org/wiki/"..qid.."#P2293" --direct page to property genetically associated disease
		local title = "Diseases that are genetically associated with "..name.." view/edit references on wikidata"
		local ref_link = disease_name..frame:extensionTag("ref",frame:expandTemplate{ title = 'cita_web', args = { title = title, url = ref_url} })

		root
			:tag('tr')
	   			:attr('colspan', 4)
	            :css('text-align', 'center')
	            :css('background-color', rowBGcolor)
				:tag('td')
					:css('background-color', rowBGcolor)
					:attr('scope', 'row')
					:attr('colspan', '3')
					:wikitext(ref_link)
					:done() --end td 
	        	:done() --end tr
    end			
    
end

 
p.renderDrug = function(frame,drug, drug_ref, drug_pqid, drug_pname) 
	local title = "Targeted by Drug" --**lclz**

    --check first to see if any of the drugs have references
	local ref_flag_all = false --check if any drugs have references if not then don't render the headers
	drug_list_per_protein = {} -- a list of lists of drugs to put in reference string each protein will have a list 
	--for i,v in ipairs(drug_pqid) do -- set all lists keys to empty so can append without key errors 
		
	--end
	for index,value in ipairs(drug) do
		if (drug_ref[index] ~= nil and drug_ref[index] ~= '') then
			protein_qid = drug_pqid[index]
			if drug_list_per_protein[protein_qid] == '' or drug_list_per_protein[protein_qid] == nil then
				drug_list_per_protein[protein_qid] = value
			else
				-- *lclz*: comma
			    drug_list_per_protein[protein_qid] = drug_list_per_protein[protein_qid]..', '..value --each list of drugs keyed on protein qid 
			end
			ref_flag_all = true
		end		
	end

    if ref_flag_all then
    	root
			:tag('tr')
				:tag('td')
   					:attr('colspan', 4)
            		:css('text-align', 'center')
            		:css('background-color', rowBGcolor)
					:tag('tr') --create title bar
						:tag('th')
							:attr('colspan', '3')
							:css('text-align', 'center')
							:css('background-color', titleBGcolor)
							
							:wikitext(title)
							:done() --end th
						:done() --end tr
					:done() --end td
				:done() --end tr

    	--loop to create reference links from drug lists
    	for k,v in pairs(drug_list_per_protein) do
        	local drug_name = v
	    	local ref_url =   "https://www.wikidata.org/wiki/"..k.."#P129" --direct page to property genetically associated disease
        	local title = "Drugs that physically interact with "..drug_pname[k].." view/edit references on wikidata"
	    	local ref_link = drug_name..frame:extensionTag("ref",frame:expandTemplate{ title = 'cita_web', args = { title = title, url = ref_url} })
				
		  	root
		    	:tag('tr')
   					:attr('colspan', 4)
            		:css('text-align', 'center')
            		:css('background-color', rowBGcolor)
					:tag('td')
						:css('background-color', rowBGcolor)
						:attr('scope', 'row')
						:attr('colspan', '3')
						:wikitext(ref_link)
						:done() --end td
	        		:done() --end tr
        end
    end
    
end

p.renderGeneLocation = function(frame, chr, gstart, gend, db, cytoband, ensembl, chr_mm, gstart_mm, gend_mm, db_mm, cytoband_mm, ensembl_mm, name)
		local titleHuman = "Ubicación del gen (humano)" --**lclz**
		local titleMouse = "Ubicación del gen (ratón)" --**lclz**
        local label_chr = "[[Cromosoma|Crom.]]" --**lclz**
        local label_locus = "[[Locus]]" --**lclz**
        local label_gstart = "Inicio" --**lclz**
        local label_gend = "Fin" --**lclz**
		local tooltip_arrowSign = "Ubicación genómica para "..name --**lclz**
        local arrowSign_width = 14
		
	if chr ~= "" and gstart ~= "" and gend ~= "" then
		--Chromosome lengths are from GRCh38.p10 https://www.ncbi.nlm.nih.gov/grc/human/data?asm=GRCh38.p10
		--This table is used only for calculating "Where should red-rectangle put?"
		--Curretly, Aug 2017, it seems all gene data, which are stored in Wikidata, have start/end positions based on GRCh38.
		local chrLengthTable = {}
				chrLengthTable["1"] = 248956422
				chrLengthTable["2"] = 242193529 
				chrLengthTable["3"] = 198295559 
				chrLengthTable["4"] = 190214555 
				chrLengthTable["5"] = 181538259 
				chrLengthTable["6"] = 170805979 
				chrLengthTable["7"] = 159345973 
				chrLengthTable["8"] = 145138636 
				chrLengthTable["9"] = 138394717 
				chrLengthTable["10"] = 133797422 
				chrLengthTable["11"] = 135086622 
				chrLengthTable["12"] = 133275309 
				chrLengthTable["13"] = 114364328 
				chrLengthTable["14"] = 107043718 
				chrLengthTable["15"] = 101991189 
				chrLengthTable["16"] = 90338345 
				chrLengthTable["17"] = 83257441 
				chrLengthTable["18"] = 80373285 
				chrLengthTable["19"] = 58617616 
				chrLengthTable["20"] = 64444167 
				chrLengthTable["21"] = 46709983 
				chrLengthTable["22"] = 50818468 
				chrLengthTable["X"] = 156040895 
				chrLengthTable["Y"] = 57227415
				chrLengthTable["MT"] = 16569
		local chrLength = chrLengthTable[chr]
		
		--Different languages have different word order.
		local chrTextTable = {}--**lclz**
				chrTextTable["1"] = "Cromosoma 1 (humano)"
				chrTextTable["2"] = "Cromosoma 2 (humano)"
				chrTextTable["3"] = "Cromosoma 3 (humano)"
				chrTextTable["4"] = "Cromosoma 4 (humano)"
				chrTextTable["5"] = "Cromosoma 5 (humano)"
				chrTextTable["6"] = "Cromosoma 6 (humano)"
				chrTextTable["7"] = "Cromosoma 7 (humano)"
				chrTextTable["8"] = "Cromosoma 8 (humano)"
				chrTextTable["9"] = "Cromosoma 9 (humano)"
				chrTextTable["10"] = "Cromosoma 10 (humano)"
				chrTextTable["11"] = "Cromosoma 11 (humano)"
				chrTextTable["12"] = "Cromosoma 12 (humano)"
				chrTextTable["13"] = "Cromosoma 13 (humano)"
				chrTextTable["14"] = "Cromosoma 14 (humano)"
				chrTextTable["15"] = "Cromosoma 15 (humano)"
				chrTextTable["16"] = "Cromosoma 16 (humano)"
				chrTextTable["17"] = "Cromosoma 17 (humano)"
				chrTextTable["18"] = "Cromosoma 18 (humano)"
				chrTextTable["19"] = "Cromosoma 19 (humano)" 
				chrTextTable["20"] = "Cromosoma 20 (humano)"
				chrTextTable["21"] = "Cromosoma 21 (humano)"
				chrTextTable["22"] = "Cromosoma 22 (humano)"
				chrTextTable["X"] = "Cromosoma X (humano)"
				chrTextTable["Y"] = "Cromosoma Y (humano)"
				chrTextTable["MT"] = "ADN mitocondrial (humano)"
		local chrText = chrTextTable[chr]
		
		--about the calculation below, see https://en.wikipedia.org/wiki/User:Was_a_bee/Gene#3._Calculation_detail
		local markerWidth = ((gend - gstart) * 294.133 )/ chrLength
		if markerWidth < 2 then
			markerWidth = 2
		else
			markerWidth = math.ceil(markerWidth)
		end
		local markerLocation =  (147.0666 * (gstart + gend) / chrLength ) + 1.6 -  (markerWidth / 2)
		local arrowSignLocation =  markerLocation + (markerWidth / 2) - (arrowSign_width / 2)
		markerLocation = math.floor( markerLocation * 10 + 0.5 ) / 10
		
		
		local source_link_chr = ""
		local source_link_gstart = ""
		local source_link_gend = ""
		if( db == "hg38" ) then
			source_link_chr = frame:extensionTag("ref", "[//www.ensembl.org/Homo_sapiens/Gene/Summary?db=core;g="..ensembl.." GRCh38: Ensembl release 89: "..ensembl.."] - [[Ensembl genome database project|Ensembl]], May 2017", {name = "refGRCh38Ensembl"}) --**lclz**
			source_link_gstart = frame:extensionTag("ref", "", {name = "refGRCh38Ensembl"})
			source_link_gend = frame:extensionTag("ref", "", {name = "refGRCh38Ensembl"})
			elseif( db == "hg37") then			
			source_link_chr = frame:extensionTag("ref", "[//grch37.ensembl.org/Homo_sapiens/Gene/Summary?db=core;&g="..ensembl.." GRCh37: Ensembl release 89: "..ensembl.."] - [[Ensembl genome database project|Ensembl]], May 2017", {name = "refGRCh37Ensembl"}) --**lclz**	
			source_link_gstart = frame:extensionTag("ref", "", {name = "refGRCh37Ensembl"})
			source_link_gend = frame:extensionTag("ref", "", {name = "refGRCh37Ensembl"})
			else
			source_link = ""
			source_link_gstart = ""
			source_link_gend = ""
		end
		
		local wikitext_for_ideogram_image = "" --wikitext used for showing gene location
		if chr == "MT" then -- wikitext for mitochondrial DNA
			--wikitext_for_ideogram_image  = wikitext_for_ideogram_image.."<div align=\"center\">"
			--wikitext_for_ideogram_image  = wikitext_for_ideogram_image.."<div style=\"position\: relative\; width\: 300px\;\">"
			--wikitext_for_ideogram_image  = wikitext_for_ideogram_image.."[[File:Map of the human mitochondrial genome.svg|300px|"..chrText.."]]"
			--wikitext_for_ideogram_image  = wikitext_for_ideogram_image.."</div>"
			--wikitext_for_ideogram_image  = wikitext_for_ideogram_image.."</div>"
		
		else -- wikitext for autosome and sex chromosome
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."<div align=\"center\">"
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."<div style=\"position\: relative\; width\: 300px\;\">"
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."[[File:Human chromosome "..chr.." ideogram.svg|300px|"..chrText.."]]"
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."<div style=\"position\: absolute\; left\: "..arrowSignLocation.."px\; top\: 2px\; padding\: 0\;\">"
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."[[File:HSR 1996 II 3.5e.svg|"..arrowSign_width.."px|"..tooltip_arrowSign.."]]</div>"
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."<div style=\"position\: absolute\; left\: "..markerLocation.."px\; top\: 19px\; padding\: 0\;\">[[File:Red rectangle "..markerWidth.."x18.png|"..markerWidth.."px|"..tooltip_arrowSign.."]]</div>"
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."</div>"
			wikitext_for_ideogram_image = wikitext_for_ideogram_image.."</div>"
		end
		
	root
		:tag('tr')
        	:tag('td')
   				:attr('colspan', 4)
            	:css('text-align', 'center')
            	:css('background-color', rowBGcolor)
            	:tag('table')
            		:attr('class', 'collapsible expand')
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'left')
					:tag('tr')
						:tag('th')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', titleBGcolor)
							:css('width', '40%')
							:wikitext(titleHuman)
							:done() --end th
						:done() --end tr
					:tag('tr')
						:tag('td')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', rowBGcolor)
							:wikitext("[[File:Ideogram human chromosome "..chr..".svg|300px|"..chrText.."]]")
							:done() --end td
						:done() --end tr
					:tag('tr')
						:tag('th')
							:attr('scope', 'row')
							:attr('width', '15%')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_chr)
							:done() --end th
						:tag('td')
							:attr('colspan', '3')
							:attr('width', '85%')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext("[["..chrText.."]]"..source_link_chr)
								:done() --end span
							 :done() --end td
						:done() --end tr
					:tag('tr')
						:tag('td')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', rowBGcolor)
							:wikitext(wikitext_for_ideogram_image)
							:done() --end td
						:done() --end tr
					:tag('tr')
						:tag('th')
							:attr('scope', 'row')
							:attr('rowspan', '2')
							:attr('width', '15%')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_locus)
							:done() --end th
						:tag('td')
							:attr('rowspan', '2')
							:attr('width', '35%')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(cytoband)
								:done() --end span
							 :done() --end td
						:tag('th')
							:attr('scope', 'row')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_gstart)
							:done() --end th
						:tag('td')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(p.separateWithComma(gstart).." [[Par de bases|pb]]"..source_link_gstart)
								:done() --end span
							 :done() --end td
						:done() --end tr
					:tag('tr')
						:tag('th')
							:attr('scope', 'row')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_gend)
							:done() --end th
						:tag('td')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(p.separateWithComma(gend).." [[Par de bases|pb]]"..source_link_gend)
								:done() --end span
							 :done() --end td
						:done() --end tr
					:done() --end table
				 :done() --end td
			:done() --end tr
	end
	
	if chr_mm ~= "" and gstart_mm ~= "" and gend_mm ~= "" then
		--Chromosome lengths are from GRCm38.p5 https://www.ncbi.nlm.nih.gov/grc/mouse/data?asm=GRCm38.p5
		local chrLengthTable_mm = {}
				chrLengthTable_mm["1"] = 195471971
				chrLengthTable_mm["2"] = 182113224
				chrLengthTable_mm["3"] = 160039680
				chrLengthTable_mm["4"] = 156508116
				chrLengthTable_mm["5"] = 151834684
				chrLengthTable_mm["6"] = 149736546 
				chrLengthTable_mm["7"] = 145441459 
				chrLengthTable_mm["8"] = 129401213 
				chrLengthTable_mm["9"] = 124595110 
				chrLengthTable_mm["10"] = 130694993 
				chrLengthTable_mm["11"] = 122082543 
				chrLengthTable_mm["12"] = 120129022
				chrLengthTable_mm["13"] = 120421639 
				chrLengthTable_mm["14"] = 124902244
				chrLengthTable_mm["15"] = 104043685
				chrLengthTable_mm["16"] = 98207768
				chrLengthTable_mm["17"] = 94987271 
				chrLengthTable_mm["18"] = 90702639 
				chrLengthTable_mm["19"] = 61431566 
				chrLengthTable_mm["X"] = 171031299
				chrLengthTable_mm["Y"] = 91744698
				chrLengthTable_mm["MT"] = 16299
		local chrLength_mm = chrLengthTable_mm[chr_mm]
			
		--Different languages have different word order.
		local chrTextTable_mm = {}--**lclz**
				chrTextTable_mm["1"] = "Cromosoma 1 (ratón)"
				chrTextTable_mm["2"] = "Cromosoma 2 (ratón)"
				chrTextTable_mm["3"] = "Cromosoma 3 (ratón)"
				chrTextTable_mm["4"] = "Cromosoma 4 (ratón)"
				chrTextTable_mm["5"] = "Cromosoma 5 (ratón)"
				chrTextTable_mm["6"] = "Cromosoma 6 (ratón)"
				chrTextTable_mm["7"] = "Cromosoma 7 (ratón)"
				chrTextTable_mm["8"] = "Cromosoma 8 (ratón)"
				chrTextTable_mm["9"] = "Cromosoma 9 (ratón)"
				chrTextTable_mm["10"] = "Cromosoma 10 (ratón)"
				chrTextTable_mm["11"] = "Cromosoma 11 (ratón)"
				chrTextTable_mm["12"] = "Cromosoma 12 (ratón)"
				chrTextTable_mm["13"] = "Cromosoma 13 (ratón)"
				chrTextTable_mm["14"] = "Cromosoma 14 (ratón)"
				chrTextTable_mm["15"] = "Cromosoma 15 (ratón)"
				chrTextTable_mm["16"] = "Cromosoma 16 (ratón)"
				chrTextTable_mm["17"] = "Cromosoma 17 (ratón)"
				chrTextTable_mm["18"] = "Cromosoma 18 (ratón)"
				chrTextTable_mm["19"] = "Cromosoma 19 (ratón)" 
				chrTextTable_mm["X"] = "Cromosoma X (ratón)"
				chrTextTable_mm["Y"] = "Cromosoma Y (ratón)"
				chrTextTable_mm["MT"] = "ADN mitocondrial (ratón)" 
		local chrText_mm = chrTextTable_mm[chr_mm]
		
		--about the calculation below, see https://en.wikipedia.org/wiki/User:Was_a_bee/Gene#3._Calculation_detail
		local markerWidth_mm = ((gend_mm - gstart_mm) * 294.133 )/ chrLength_mm
		if markerWidth_mm < 2 then
			markerWidth_mm = 2
		else
			markerWidth_mm = math.ceil(markerWidth_mm)
		end
		local markerLocation_mm =  (147.0666 * (gstart_mm + gend_mm) / chrLength_mm ) + 1.6 -  (markerWidth_mm / 2)
		local arrowSignLocation_mm =  markerLocation_mm + (markerWidth_mm / 2) - (arrowSign_width / 2)
		markerLocation_mm = math.floor( markerLocation_mm * 10 + 0.5 ) / 10
		local source_link_chr_mm = ""
		local source_link_gstart_mm = ""
		local source_link_gend_mm = ""
		if( db_mm == "mm10" or db_mm == "mm0") then
			--"mm0" happens because of function "getAliasFromGenomeAssembly()" is not prepared for mouse data.
			--But as of now, Aug. 2017, it seems that all data which is stored in Wikidata are based on GRCm38/mm10.
			--So treating mouse genomic data as GRCm38/mm10 if not specified.
			source_link_chr_mm = frame:extensionTag("ref", "[//May2017.archive.ensembl.org/Mus_musculus/Gene/Summary?db=core;g="..ensembl_mm.." GRCm38: Ensembl release 89: "..ensembl_mm.."] - [[Ensembl genome database project|Ensembl]], May 2017", {name = "refGRCm38Ensembl"}) --**lclz**	
			source_link_gstart_mm = frame:extensionTag("ref", "", {name = "refGRCm38Ensembl"}) 
			source_link_gend_mm = frame:extensionTag("ref", "", {name = "refGRCm38Ensembl"}) 
			else
			source_link_chr_mm = ""
			source_link_gstart_mm = ""
			source_link_gend_mm = ""
		end
		local wikitext_for_ideogram_image_mm = "" --wikitext used for showing gene location
		if chr_mm == "MT" then -- wikitext for mitochondrial DNA
			--wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."<div align=\"center\">"
			--wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."<div style=\"position\: relative\; width\: 300px\;\">"
			--wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."[[File:Map of the human mitochondrial genome.svg|300px|"..chrText_mm.."]]"
			--wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."</div>"
			--wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."</div>"
		
		else -- wikitext for autosome and sex chromosome
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."<div align=\"center\">"
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."<div style=\"position\: relative\; width\: 300px\;\">"
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."[[File:Ideogram of house mouse chromosome "..chr_mm..".svg|300px|"..chrText_mm.."]]"
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."<div style=\"position\: absolute\; left\: "..arrowSignLocation_mm.."px\; top\: 2px\; padding\: 0\;\">"
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."[[File:HSR 1996 II 3.5e.svg|"..arrowSign_width.."px|"..tooltip_arrowSign.."]]</div>"
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."<div style=\"position\: absolute\; left\: "..markerLocation_mm.."px\; top\: 19px\; padding\: 0\;\">[[File:Red rectangle "..markerWidth_mm.."x18.png|"..markerWidth_mm.."px|"..tooltip_arrowSign.."]]</div>"
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."</div>"
			wikitext_for_ideogram_image_mm = wikitext_for_ideogram_image_mm.."</div>"
		end
		
	root	
		:tag('tr')
        	:tag('td')
   				:attr('colspan', 4)
            	:css('text-align', 'center')
            	:css('background-color', rowBGcolor)
            	:tag('table')
            		:attr('class', 'collapsible collapsed')
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'left')
					:tag('tr')
						:tag('th')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', titleBGcolor)
							:css('width', '40%')
							:wikitext(titleMouse)
							:done() --end th
						:done() --end tr
					:tag('tr')
						:tag('td')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', rowBGcolor)
							:wikitext("[[File:Ideogram house mouse chromosome "..chr_mm..".svg|260px|"..chrText_mm.."]]")
							:done() --end td
						:done() --end tr
					:tag('tr')
						:tag('th')
							:attr('scope', 'row')
							:attr('width', '15%')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_chr)
							:done() --end th
						:tag('td')
							:attr('colspan', '3')
							:attr('width', '85%')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(chrText_mm..source_link_chr_mm)
								:done() --end span
							 :done() --end td
						:done() --end tr
					:tag('tr')
						:tag('td')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', rowBGcolor)
							:wikitext(wikitext_for_ideogram_image_mm)
							:done() --end td
						:done() --end tr
					:tag('tr')
						:tag('th')
							:attr('scope', 'row')
							:attr('rowspan', '2')
							:attr('width', '15%')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_locus)
							:done() --end th
						:tag('td')
							:attr('rowspan', '2')
							:attr('width', '35%')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(cytoband_mm)
								:done() --end span
							:done() --end td
						:tag('th')
							:attr('scope', 'row')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_gstart)
							:done() --end th
						:tag('td')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(p.separateWithComma(gstart_mm).." [[Par de bases|pb]]"..source_link_gstart_mm)
								:done() --end span
							 :done() --end td
						:done() --end tr
					:tag('tr')
						:tag('th')
							:attr('scope', 'row')
							:css('background-color', sideTitleBGcolor)
							:wikitext(label_gend)
							:done() --end th
						:tag('td')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(p.separateWithComma(gend_mm).." [[Par de bases|pb]]"..source_link_gend_mm)
								:done() --end span
							 :done() --end td
						:done() --end tr
					:done() --end table
				 :done() --end td
			:done() --end tr
	end
end

p.renderRNAexpression = function(expression_images, entrez_gene)
	local title = "Patrón de [[Expresión génica|expresión RNA]]" --**lclz**
	local biogps_link = "[http://biogps.org/gene/"..entrez_gene.."/ Más información]" --**lclz**
	root
		:tag('tr')
        	:tag('td')
   				:attr('colspan', 4)
            	:css('text-align', 'center')
            	:css('background-color', rowBGcolor)
            	:tag('table')
            		:attr('class', 'collapsible expand')
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'left')
					:tag('tr')
						:tag('th')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', titleBGcolor)
							:css('width', '40%')
							:wikitext(title)
							:done() --end th
						:done() --end tr
					:tag('tr')
						:tag('td')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', rowBGcolor)
							:wikitext(expression_images)
							:done() --end td
						:done() --end tr
					:tag('tr')
						:tag('td')
							:attr('colspan', '4')
							:css('text-align', 'center')
							:css('background-color', rowBGcolor)
							:tag('span')
								:attr('class', 'plainlinks')
								:wikitext(biogps_link)
								:done() --end span
							:done() --end td
						:done() --end tr
					:done() --end table
				:done() --end td
			:done() --end tr
end

p.renderGeneOntology = function(mol_funct, cell_comp, bio_process, uniprotID)
	local title = "[[Ontología génica]]" --**lclz**
	local mol_funct_title = "Función molecular" --**lclz**
	local cell_comp_title = "Componente celular" --**lclz**
	local bio_process_title = "Proceso biológico" --**lclz**
	local amigo_link = "[http://amigo.geneontology.org/" .. " Amigo]"
	local quickGO_link = "[//www.ebi.ac.uk/QuickGO/" .. " QuickGO]"


	root
		:tag('tr')
        	:tag('td')
   				:attr('colspan', 4)
            	:css('text-align', 'center')
            	:css('background-color', rowBGcolor)
            	:tag('table')
            		:attr('class', 'collapsible collapsed')
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'left')
            		:tag('tr') --create title bar
        				:tag('th')
        					:attr('colspan', '4')
        					:css('text-align', 'center')
        					:css('background-color', titleBGcolor)
        					:css('width', '40%')
         					:wikitext(title)
        					:done() --end th
        				:done() --end tr
        			:tag('tr')
            			:tag('th')
            				:css('background-color', sideTitleBGcolor)
            				:wikitext(mol_funct_title)
            				:done() --end th
            			:tag('td')
            				:css('background-color', rowBGcolor)
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(mol_funct)
            					:done() --end span
            				:done() --end td
           				:done() --end tr
        			:tag('tr')
        				:tag('th')
            				:css('background-color', sideTitleBGcolor)
            				:wikitext(cell_comp_title)
            				:done() --end th
            			:tag('td')
            				:css('background-color', rowBGcolor)
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(cell_comp)
            					:done() --end span
            				:done() --end td
            			:done() --end tr
        			:tag('tr')
        				:tag('th')
            				:css('background-color', sideTitleBGcolor)
            				:wikitext(bio_process_title)
            				:done() --end th
            			:tag('td')
            				:css('background-color', rowBGcolor)
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(bio_process)
            					:done() --end span
            				:done() --end td
            			:done() --end tr
					
        			:tag('tr')
            			:tag('td')
            				:css('background-color', rowBGcolor)
            				:css('text-align', 'center')
            				:attr('colspan', '4')
            				:wikitext("Fuentes:")
            				:wikitext(amigo_link)
            				:wikitext(" / ")
            				:wikitext(quickGO_link)
            				:done() --end td
       					:done() --end tr
					:done() --end table
				:done() --end td
			:done() --end tr
end 

p.renderOrthologs = function(frame, entrez_gene, entrez_gene_mm, ensembl, ensembl_mm, uniprot, uniprot_mm, refseq_mRNA, refseq_mRNA_mm, refseq_prot, refseq_prot_mm, db, chr, gstart, gend,  db_mm, chr_mm,gstart_mm, gend_mm) 
	local title = "[[Homología de secuencia|Ortólogos]]" --**lclz**
	--to do make the list creation a function
	--create list for entrez ids
	
	
	local category_chromosome = '[[Categoría:Genes en el cromosoma humano '..chr..']]'-- *lclz*: Category name
	if chr == "MT" then
		category_chromosome = '[[Genes mitocondriales humanos]]'-- *lclz*: Category name for mtDNA genes
	end
	if mw.title.getCurrentTitle().namespace ~= 0 then
		category_chromosome = ""
	end
	local entrezTitle = "[[Entrez|Entrez]]"
	entrez_gene = string.gsub(entrez_gene, "%s", "")
	local entrez_link = "n/a"
	local entrez_collapse 
	local entrez_default = ""
	local split_entrez = mw.text.split(entrez_gene, ",")
	local entrez_link_list = {}
	for k,v in ipairs(split_entrez) do 
		if string.match(v, '%w+') and v ~= "n/a" then
			entrez_link_list[#entrez_link_list+1] = "[//www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&amp;cmd=retrieve&amp;dopt=default&amp;list_uids="..entrez_gene.."&amp;rn=1 "..entrez_gene.."]"
		end
	end
	--if less than 5 don't create collapsible list
	if  table.getn(entrez_link_list) < 5 then
		entrez_collapse = "none"
		if entrez_default == nil and table.getn(entrez_link_list) == 0 then entrez_link = "n/a" end
	else	
		entrez_collapse = "collapsible collapsed"
		entrez_default = table.remove(entrez_link_list, 1) .. '<br>' .. table.remove(entrez_link_list, 1) .. '<br>' ..table.remove(entrez_link_list, 1) .. '<br>' .. table.remove(entrez_link_list, 1) .. '<br>' .. table.remove(entrez_link_list, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	if entrez_link_list[#entrez_link_list] then
		entrez_link = table.concat(entrez_link_list, "<br>")
	end
	
	--create list for mouse Entrez id
	entrez_gene_mm = string.gsub(entrez_gene_mm, "%s", "")
	local entrez_mm_link = "n/a"
	local entrez_mm_collapse 
	local entrez_mm_default = ""
	local split_entrez_mm = mw.text.split(entrez_gene_mm, ",")
	local entrez_mm_link_list = {}
	for k,v in ipairs(split_entrez_mm) do 
		if string.match(v, '%w+') and v ~= "n/a" then
			entrez_mm_link_list[#entrez_mm_link_list+1] = "[//www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&amp;cmd=retrieve&amp;dopt=default&amp;list_uids="..v.."&amp;rn=1 "..v.."]"
		end
	end
	--if less than 5 don't create collapsible list
	if  table.getn(entrez_mm_link_list) < 5 then
		entrez_mm_collapse = "none"
		if entrez_mm_default == nil and table.getn(entrez_mm_link_list) == 0 then entrez_mm_link = "n/a" end
	else	
		entrez_mm_collapse = "collapsible collapsed"
		entrez_mm_default = table.remove(entrez_mm_link_list, 1) .. '<br>' .. table.remove(entrez_mm_link_list, 1) .. '<br>' ..table.remove(entrez_mm_link_list, 1) .. '<br>' .. table.remove(entrez_mm_link_list, 1) .. '<br>' .. table.remove(entrez_mm_link_list, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	if entrez_mm_link_list[#entrez_mm_link_list] then
		entrez_mm_link = table.concat(entrez_mm_link_list, "<br>")
	end
	
	--create list of ensembl id
	local ensemblTitle = "[[Ensembl|Ensembl]]"
	ensembl = string.gsub(ensembl, "%s", "")
	local ensembl_link = "n/a"
	local ensembl_collapse 
	local ensembl_default = ""
	local split_ensembl = mw.text.split(ensembl, ",")
	local ensembl_link_list = {}
	for k,v in ipairs(split_ensembl) do 
		if string.match(v, '%w+') and v ~= "n/a" then
			ensembl_link_list[#ensembl_link_list+1] = "[//www.ensembl.org/Homo_sapiens/geneview?gene="..v..";db=core".." "..v.."]"
		end
	end
	--if less than 5 don't create collapsible list
	if  table.getn(ensembl_link_list) < 5 then
		ensembl_collapse = "none"
		if ensembl_default == nil and table.getn(ensembl_link_list) == 0 then ensembl_link = "n/a" end
	else	
		ensembl_collapse = "collapsible collapsed"
		ensembl_default = table.remove(ensembl_link_list, 1) .. '<br>' .. table.remove(ensembl_link_list, 1) .. '<br>' ..table.remove(ensembl_link_list, 1) .. '<br>' .. table.remove(ensembl_link_list, 1) .. '<br>' .. table.remove(ensembl_link_list, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	if ensembl_link_list[#ensembl_link_list] then
		ensembl_link = table.concat(ensembl_link_list, "<br>")
	end
	
	--create list of mouse ensembl id
	local ensemblTitle = "[[Ensembl|Ensembl]]"
	ensembl_mm = string.gsub(ensembl_mm, "%s", "")
	local ensembl_mm_link = "n/a"
	local ensembl_mm_collapse 
	local ensembl_mm_default = ""
	local split_ensembl_mm = mw.text.split(ensembl_mm, ",")
	local ensembl_mm_link_list = {}
	for k,v in ipairs(split_ensembl_mm) do 
		if string.match(v, '%w+') and v ~= "n/a" then
			ensembl_mm_link_list[#ensembl_mm_link_list+1] = "[//www.ensembl.org/Mus_musculus/geneview?gene="..v..";db=core".." "..v.."]"
		end
	end
	--if less than 5 don't create collapsible list
	if  table.getn(ensembl_mm_link_list) < 5 then
		ensembl_mm_collapse = "none"
		if ensembl_mm_default == nil and table.getn(ensembl_mm_link_list) == 0 then ensembl_mm_link = "n/a" end
	else	
		ensembl_mm_collapse = "collapsible collapsed"
		ensembl_mm_default = table.remove(ensembl_mm_link_list, 1) .. '<br>' .. table.remove(ensembl_mm_link_list, 1) .. '<br>' ..table.remove(ensembl_mm_link_list, 1) .. '<br>' .. table.remove(ensembl_mm_link_list, 1) .. '<br>' .. table.remove(ensembl_mm_link_list, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	if ensembl_mm_link_list[#ensembl_mm_link_list] then
		ensembl_mm_link = table.concat(ensembl_mm_link_list, "<br>")
	end


	--create lists of uniprot ID
	local uniprotTitle = "[[UniProt|UniProt]]"
	local uniprot_url = "https://www.uniprot.org/uniprot/"
	
	local uniprot_link = "n/a"
	local uniprot_collapse
	local uniprot_default = ""
	--split string and loop through concatenate by <br>
	local split_uniprot = mw.text.split(uniprot, ",")
	local uniprot_link_list = {}
	local uniprot_first = {} --preferred values only display [O,P,Q] prefixed entries if they exist
	local uniprot_alternate = {} --[A-N,R-Z] entries
	local hash = {} --storage to look for duplicated values 
	for k,v in ipairs(split_uniprot) do 
		if not hash[v] then --only add if not found previously..some encodes uniprotID dup in different encodes
			local label = mw.text.trim(v)
			local concat_uniprot_link = uniprot_url .. label
			if string.match(v, '%w+') and v ~= "n/a" then
				if string.match(v, '^O') or string.match(v,'^P') or string.match(v, '^Q') then
				    uniprot_first[#uniprot_first+1] = "[" .. concat_uniprot_link .. " " ..label .. "]"
				else
					uniprot_alternate[#uniprot_alternate+1] = "[" .. concat_uniprot_link .. " " ..label .. "]"
				end
			end
			hash[v] = true
		end
	end
    if table.getn(uniprot_first)>0 then --if there is something in the preferred values display else display anything else
		uniprot_link_list  = uniprot_first
	else
		uniprot_link_list  = uniprot_alternate
	end
	
	--if less than 5 don't create collapsible list
	if  table.getn(uniprot_link_list) < 5 then
		uniprot_collapse = "none"
		if uniprot_default == nil and table.getn(uniprot_link_list) == 0 then uniprot_link = "n/a" end
	else	
		uniprot_collapse = "collapsible collapsed"
		uniprot_default = table.remove(uniprot_link_list, 1) .. '<br>' .. table.remove(uniprot_link_list, 1) .. '<br>' ..table.remove(uniprot_link_list, 1) .. '<br>' .. table.remove(uniprot_link_list, 1) .. '<br>' .. table.remove(uniprot_link_list, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	
	if uniprot_link_list[#uniprot_link_list] then
		uniprot_link = table.concat(uniprot_link_list, "<br>")
	end
	
    --mouse uniprot lists
	local uniprot_mm_link = "n/a"
	local uniprot_mm_collapse
	local uniprot_mm_default = ""
	--split string and loop through concatenate by <br>
	local split_uniprot_mm = mw.text.split(uniprot_mm, ",")
    local uniprot_mm_link_list = {}	
    local uniprot_mm_first = {} --preferred values only display [O,P,Q] prefixed entries if they exist
    local uniprot_mm_alternate = {} --[A-N,R-Z] entries
    local hash = {} --storage to look for duplicated values
	for k,v in ipairs(split_uniprot_mm) do 
	    if not hash[v] then --only add if not found previously..some encodes uniprotID dup in different encodes
		    local label = mw.text.trim(v)
		    local concat_uniprot_link = uniprot_url .. label
		    if string.match(v, '%w+') and v ~= "n/a" then
			    if string.match(v, '^O') or string.match(v,'^P') or string.match(v, '^Q') then 
					uniprot_mm_first[#uniprot_mm_first+1] = "[" .. concat_uniprot_link .. " " ..label .. "]"
				else
					uniprot_mm_alternate[#uniprot_mm_alternate+1] = "[" .. concat_uniprot_link .. " " ..label .. "]"
				end
		    end
			hash[v] = true
		end
	end
	if table.getn(uniprot_mm_first)>0 then --if there is something in the preferred values display else display anything else
		uniprot_mm_link_list  = uniprot_mm_first
	else
		uniprot_mm_link_list  = uniprot_mm_alternate
	end

	--if less than 5 don't create collapsible list
	if  table.getn(uniprot_mm_link_list) < 5 then
		uniprot__mm_collapse = "none"
		if uniprot_mm_default == nil and table.getn(uniprot_mm_link_list) == 0 then uniprot_mm_link = "n/a" end
	else	
		uniprot_mm_collapse = "collapsible collapsed"
		uniprot_mm_default = table.remove(uniprot_mm_link_list, 1) .. '<br>' .. table.remove(uniprot_mm_link_list, 1) .. '<br>' ..table.remove(uniprot_mm_link_list, 1) .. '<br>' .. table.remove(uniprot_mm_link_list, 1) .. '<br>' .. table.remove(uniprot_mm_link_list, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	
	if uniprot_mm_link_list[#uniprot_mm_link_list] then
		uniprot_mm_link = table.concat(uniprot_mm_link_list, "<br>")
	end
	
	
	
	local ncbi_link = "https://www.ncbi.nlm.nih.gov/entrez/viewer.fcgi?val="
	local refseq_mRNATitle = "RefSeq (mRNA)" -- *lclz*: sometimes
	
	--create list of links for refSeq mRNA
	local refseq_mRNA_link = "n/a"
	local refseq_mRNA_collapse
	local refseq_mRNA_default = ""
	--split string and loop through concatenate by <br>
	local split_refseq_mRNA = mw.text.split(refseq_mRNA, ",")
	local link_list_first = {} --hold those the have NM or NP values
	local link_list_alternate = {} --hold those that are XM or XP values
	local link_list = {} --if NM,NP display if not display XM, XP values 
	for k,v in ipairs(split_refseq_mRNA) do
		local label = mw.text.trim(v)
		local concat_ncbi_link = ncbi_link .. label
		if string.match(v, '%w+') and v ~= "n/a" then
			if string.match(v, 'NM') or string.match(v, 'NP') then
			    link_list_first[#link_list_first+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			elseif string.match(v, 'XM') or string.match(v, 'XP') then
				link_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			end
		end
   end
   	if table.getn(link_list_first)>0 then
		link_list = link_list_first
	else
		link_list = link_list_alternate
	end
	
	--if less than 5 don't create collapsible list
	if  table.getn(link_list) < 6 then
		refseq_mRNA_collapse = "none"
		if refseq_mRNA_default == nil and table.getn(link_list) == 0 then refseq_mRNA_link = "n/a" end
	else	
		refseq_mRNA_collapse = "collapsible collapsed"
		refseq_mRNA_default  = table.remove(link_list, 1) .. '<br>' .. table.remove(link_list, 1) .. '<br>' ..table.remove(link_list, 1) .. '<br>' .. table.remove(link_list, 1) .. '<br>' .. table.remove(link_list, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	
	if link_list[#link_list] then
		refseq_mRNA_link = table.concat(link_list, "<br>")
	end
	
	
	--create list of links for refSeq mRNA for mouse
	local refseq_mRNA_mm_link = "n/a"
	local refseq_mRNA_mm_collapse
	local refseq_mRNA_mm_default = ""
	local split_refseq_mRNA_mm = mw.text.split(refseq_mRNA_mm, ",")
	local link_list_mm = {} --if NM,NP display if not display XM, XP values
	local link_list_first = {} --hold those the have NM or NP values
	local link_list_alternate = {} --hold those that are XM or XP values
  
	for k,v in ipairs(split_refseq_mRNA_mm) do
		local label = mw.text.trim(v)
		local concat_ncbi_link = ncbi_link .. label
		if string.match(v, '%w+') and v ~= "n/a" then
			if string.match(v, 'NM') or string.match(v, 'NP') then
			    link_list_first[#link_list_first+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			elseif string.match(v, 'XM') or string.match(v, 'XP') then
				link_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			end
		end
    end
	if table.getn(link_list_first)>0 then
		link_list_mm = link_list_first
	else
		link_list_mm = link_list_alternate
	end
	--if less than 5 don't create collapsible list
	if  table.getn(link_list_mm) < 6 then
		refseq_mRNA_mm_collapse = "none"
		if refseq_mRNA_mm_default == nil and table.getn(link_list_mm) == 0 then refseq_mRNA_mm_link = "n/a" end
	else	
		refseq_mRNA_mm_collapse = "collapsible collapsed"
		refseq_mRNA_mm_default = table.remove(link_list_mm, 1) .. '<br>' .. table.remove(link_list_mm, 1) .. '<br>' ..table.remove(link_list_mm, 1) .. '<br>' .. table.remove(link_list_mm, 1) .. '<br>' .. table.remove(link_list_mm, 1) .. '<br>'--get first 5 elements in table and use for display
	end

	if link_list_mm[#link_list_mm] then
		refseq_mRNA_mm_link = table.concat(link_list_mm, "<br>")
	end
	
    -- *lclz*: sometimes
	local refseq_protTitle = "RefSeq (proteína)"
	--create list of links for human refseq protein
	local refseq_prot_link = "n/a"
	local refseq_prot_collapse 
	local refseq_prot_default = ""
	local split_refseq_prot = mw.text.split(refseq_prot, ",")
	local link_list_prot = {}
    local link_list_first = {} --hold those the have NM or NP values
	local link_list_alternate = {} --hold those that are XM or XP values
	for k,v in ipairs(split_refseq_prot) do
		local label = mw.text.trim(v)
		local concat_ncbi_link = ncbi_link .. label
		if string.match(v, '%w+') and v ~= "n/a" then
			if string.match(v, 'NM') or string.match(v, 'NP') then
			    link_list_first[#link_list_first+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			elseif string.match(v, 'XM') or string.match(v, 'XP') then
				link_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			end
		end
	end
	if table.getn(link_list_first)>0 then
		link_list_prot  = link_list_first
	else
		link_list_prot  = link_list_alternate
	end
	--if less than 5 don't create collapsible list
	if  table.getn(link_list_prot) < 6 then
		refseq_prot_collapse  = "none"
		if refseq_prot_default == nil and table.getn(link_list_prot) == 0 then refseq_prot_link = "n/a" end
	else	
		refseq_prot_collapse = "collapsible collapsed"
		refseq_prot_default = table.remove(link_list_prot, 1) .. '<br>' .. table.remove(link_list_prot, 1) .. '<br>' ..table.remove(link_list_prot, 1) .. '<br>' .. table.remove(link_list_prot, 1) .. '<br>' .. table.remove(link_list_prot, 1) .. '<br>'--get first 5 elements in table and use for display
	end

   
	if link_list_prot[#link_list_prot] then
		refseq_prot_link = table.concat(link_list_prot, "<br>")
	end
	
	
	--create list of links for mouse refseq protein
	local refseq_prot_mm_link = "n/a"
	local refseq_prot_mm_collapse
	local refseq_prot_mm_default = ""
	local split_refseq_prot_mm = mw.text.split(refseq_prot_mm, ",")
	local link_list_prot_mm = {}
	local link_list_first = {} --hold those the have NM or NP values
	local link_list_alternate = {} --hold those that are XM or XP values
  
	for k,v in ipairs(split_refseq_prot_mm) do
		local label = mw.text.trim(v)
		local concat_ncbi_link = ncbi_link .. label
		if string.match(v, '%w+') and v ~= "n/a" then
			if string.match(v, 'NM') or string.match(v, 'NP') then
			    link_list_first[#link_list_first+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			elseif string.match(v, 'XM') or string.match(v, 'XP') then
				link_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"
			end
		end
	end
	if table.getn(link_list_first)>0 then
		link_list_prot_mm  = link_list_first
	else
		link_list_prot_mm  = link_list_alternate
	end
	--if less than 5 don't create collapsible list
	if  table.getn(link_list_prot_mm) < 6 then
		refseq_prot_mm_collapse  = "none"
		if refseq_prot_mm_default == nil and table.getn(link_list_prot_mm) == 0 then refseq_prot_mm_link = "n/a" end
	else	
		refseq_prot_mm_collapse = "collapsible collapsed"
		refseq_prot_mm_default = table.remove(link_list_prot_mm, 1) .. '<br>' .. table.remove(link_list_prot_mm, 1) .. '<br>' ..table.remove(link_list_prot_mm, 1) .. '<br>' .. table.remove(link_list_prot_mm, 1) .. '<br>' .. table.remove(link_list_prot_mm, 1) .. '<br>'--get first 5 elements in table and use for display
	end
	if link_list_prot_mm[#link_list_prot_mm] then
		refseq_prot_mm_link = table.concat(link_list_prot_mm, "<br>")
	end
	

	local locTitle = "Ubicación (UCSC)" -- *lclz*
	local gstart_mb = p.locToMb(gstart, 2)
	local gend_mb = p.locToMb(gend, 2)
	local chr_loc_link =  ""
	if (string.match(db, '%w+') and string.match(chr, '%w+') and string.match(gstart, '%w+') and string.match(gend, '%w+') )then
		local chr_ucsc 
		if chr == "MT" then  
			chr_ucsc = "M" --UCSC uses "M" (not "MT") in URL for mitochondrial DNA
		else
			chr_ucsc = chr
		end	
		chr_loc_link = "[//genome.ucsc.edu/cgi-bin/hgTracks?org=Human&db="..db.."&position=chr"..chr_ucsc..":"..gstart.."-"..gend.." ".."Chr "..chr_ucsc..": "..gstart_mb.." – "..gend_mb.." Mb]" 
	else
		chr_loc_link = "n/a"	
	end
	local gstart_mm_mb = p.locToMb(gstart_mm, 2)
	local gend_mm_mb = p.locToMb(gend_mm, 2)
	local chr_loc_mm_link = ""
	if (string.match(db_mm, '%w+') and string.match(chr_mm, '%w+') and string.match(gstart_mm, '%w+') and string.match(gend_mm, '%w+') )then
		local chr_mm_ucsc 
		if chr_mm == "MT" then  
			chr_mm_ucsc = "M" --UCSC uses "M" (not "MT") in URL for mitochondrial DNA
		else
			chr_mm_ucsc = chr_mm
		end
		chr_loc_mm_link =  "[//genome.ucsc.edu/cgi-bin/hgTracks?org=Mouse&db="..db_mm.."&position=chr"..chr_mm_ucsc..":"..gstart_mm.."-"..gend_mm.." ".."Chr "..chr_mm_ucsc..": "..gstart_mm_mb.." – "..gend_mm_mb.." Mb]"
	else
		chr_loc_mm_link = "n/a"	
	end

	local pubmedTitle = "Búsqueda [[PubMed]]" -- *lclz*
	local pubmed_link = entrez_gene
	if string.match(entrez_gene, '%w+') and entrez_gene ~= "n/a" then
		pubmed_link = frame:extensionTag("ref",frame:expandTemplate{ title = 'cita_web', args = { title ="Referencia Human PubMed:" , url = "https://www.ncbi.nlm.nih.gov/sites/entrez?db=gene&cmd=Link&LinkName=gene_pubmed&from_uid="..entrez_gene, website = "National Center for Biotechnology Information, U.S. National Library of Medicine" } } )--expandTemplate creates cite web template {{cite web|title=value|url=ref_link..ect}} 
	end
	local pubmed_mm_link = entrez_gene_mm
	if string.match(entrez_gene_mm, '%w+') and entrez_gene_mm ~= "n/a" then
		pubmed_mm_link = frame:extensionTag("ref",frame:expandTemplate{ title = 'cita_web', args = { title ="Referencia Mouse PubMed:" , url ="https://www.ncbi.nlm.nih.gov/sites/entrez?db=gene&cmd=Link&LinkName=gene_pubmed&from_uid="..entrez_gene_mm, website = "National Center for Biotechnology Information, U.S. National Library of Medicine" } } )--expandTemplate creates cite web template {{cite web|title=value|url=ref_link..ect}}
	end
	
	root
		:tag('tr')
        	:tag('th')
        		:attr('colspan', '4')
        		:css('text-align', 'center')
        		:css('background-color', titleBGcolor)
        		:css('width', '40%')
         		:wikitext(title)
        		:done() --end th
        	:done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext("Especies") --**lclz**
        		:done() --end th
        	:tag('td')
        		:wikitext("'''Humano'''") --**lclz**
        		:done() --end td
        	:tag('td')
        		:wikitext("'''Ratón'''") --**lclz**
        		:done() --end td
        	:done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext(entrezTitle)
        		:done() --end th
        	:tag('td')
        		:tag('table')
            		:attr('class', entrez_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(entrez_default)
            					:done() --end span
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:attr('class', 'plainlinks')
            					:wikitext(entrez_link)
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td
			:tag('td')
        		:tag('table')
            		:attr('class', entrez_mm_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(entrez_mm_default)
            					:done() --end span
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:attr('class', 'plainlinks')
            					:wikitext(entrez_mm_link)
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td
            :done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext(ensemblTitle)
        		:done() --end th
        	:tag('td')
        		:tag('table')
            		:attr('class', ensembl_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(ensembl_default)
            					:done() --end span
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:attr('class', 'plainlinks')
            					:wikitext(ensembl_link)
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td
			:tag('td')
        		:tag('table')
            		:attr('class', ensembl_mm_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(ensembl_mm_default)
            					:done() --end span
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:attr('class', 'plainlinks')
            					:wikitext(ensembl_mm_link)
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td
            :done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext(uniprotTitle)
        		:done() --end th
        	:tag('td')
        		:tag('table')
            		:attr('class', uniprot_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(uniprot_default)
            					:done() --end span
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:attr('class', 'plainlinks')
            					:wikitext(uniprot_link)
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td
        	:tag('td')
        		:tag('table')
            		:attr('class', uniprot_mm_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:tag('span')
            					:attr('class', 'plainlinks')
            					:wikitext(uniprot_mm_default)
            					:done() --end span
            				:done() --end th
            			:done() --end th
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:attr('class', 'plainlinks')
            					:wikitext(uniprot_mm_link)
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
        		:done() --end td
        	:done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext(refseq_mRNATitle)
        		:done() --end th
        	:tag('td') --RNASeq mRNA collapsible table 
        		:tag('table')
            		:attr('class', refseq_mRNA_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:attr('class', 'plainlinks')
            				:wikitext(refseq_mRNA_default)
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:tag('span')
            						:attr('class', 'plainlinks')
            						:wikitext(refseq_mRNA_link)
            						:done() --end span
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td	
        	:tag('td') --RNASeq mRNA collapsible table for mouse 
        		:tag('table')
            		:attr('class', refseq_mRNA_mm_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:attr('class', 'plainlinks')
            				:wikitext(refseq_mRNA_mm_default)
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:tag('span')
            						:attr('class', 'plainlinks')
            						:wikitext(refseq_mRNA_mm_link)
            						:done() --end span
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table	
        		:done() --end td
        	:done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext(refseq_protTitle)
        		:done() --end th
        	:tag('td') --RNASeq protein collapsible table 
        		:tag('table')
            		:attr('class', refseq_prot_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:attr('class', 'plainlinks')
            				:wikitext(refseq_prot_default)
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:tag('span')
            						:attr('class', 'plainlinks')
            						:wikitext(refseq_prot_link)
            						:done() --end span
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td	
			:tag('td') --RNASeq protein collapsible table for mouse
        		:tag('table')
            		:attr('class', refseq_prot_mm_collapse)
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'right')
            		:tag('tr')
            			:tag('th')
            				:attr('colspan', '1')
            				:attr('class', 'plainlinks')
            				:wikitext(refseq_prot_mm_default)
            				:done() --end th
            			:done() --end tr
            		:tag('tr')
            			:tag('td')
            				:attr('colspan', '1')
            				:tag('p')
            					:tag('span')
            						:attr('class', 'plainlinks')
            						:wikitext(refseq_prot_mm_link)
            						:done() --end span
            					:done() --end p
            				:done() --end td
            			:done() --end tr
            		:done() --end table
            	:done() --end td
    		:done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext(locTitle)
        		:done() --end th
        	:tag('td')
        		:tag('span')
            		:attr('class', 'plainlinks')
        			:wikitext(chr_loc_link)
        			:done() --end span
        		:done() --end td
        	:tag('td')
        		:tag('span')
            		:attr('class', 'plainlinks')
        			:wikitext(chr_loc_mm_link)
        			:done() --end span
        		:done() --end td
        	:done() --end tr
        :tag('tr')
        	:tag('th')
        		:attr('scope', 'row')
        		:css('background-color', sideTitleBGcolor)
        		:wikitext(pubmedTitle)
        		:done() --end th
        	:tag('td')
        		:tag('span')
            		:attr('class', 'plainlinks')
        			:wikitext(pubmed_link)
        			:done() --end span
        		:done() --end td
        	:tag('td')
        		:tag('span')
            		:attr('class', 'plainlinks')
        			:wikitext(pubmed_mm_link)
        			:done() --end span
        		:wikitext(category_chromosome)
        		:done() --end td
    		:done() --end tr
end

p.formatRow = function(title)
	 root
	 	:tag('tr')
        	:tag('td')
   				:attr('colspan', '4')
            	:css('text-align', 'center')
            	:css('background-color', rowBGcolor)
            	:tag('table') 
            		:css('padding', '0')
            		:css('border', 'none')
            		:css('margin', '0')
            		:css('width', '100%')
            		:css('text-align', 'left')
            		:tag('tr')    --create title header
            			:css('background-color',titleBGcolor)
            			:css('text-align', 'center')
            			:tag('th')
            				:attr('colspan',"2")
            				:wikitext(title)
            				:done() --end th
            			:done() --end tr
            		:done() --end table
            	:done() --end td
            :done() --end tr
end

p.renderFooter = function(Qid, Qid_mm)
 local text = "[[Wikidata|Wikidata]]" --**lclz**
 local hs_link = "[[d:"..Qid.."|Ver/editar humano]]" --**lclz**
 local mm_link = ""
 local link_no_hs
 local link_no_mm
 
 if Qid_mm == "" then
 	link_no_mm = 0
 	link_no_hs = 4
 else 
 	link_no_mm = 2
 	link_no_hs = 2
 	mm_link = "[[d:"..Qid_mm.."|Ver/editar humano]]" --**lclz**
 end
 
 root
 	:tag('tr')
 		:tag('td')
 			:attr('colspan', '4')
 			:css('text-align', 'center')
 			:css('font-size','x-small')
 			:css('background-color', rowBGcolor)
 			:wikitext(text)
 			:done() --end td
       :tag('tr')
 		:tag('td')
 			:attr('colspan', '4')
 			:css('text-align', 'center')
 			:css('font-size','x-small')
 			:css('background-color', rowBGcolor)
 		:tag('table')
          	:css('padding', '0')
          	:css('border', 'none')
          	:css('margin', '0')
          	:css('width', '100%')
          	:css('text-align', 'center')
 			:tag('tr')
 				:tag('td')
 					:attr('colspan', link_no_hs)
 					:css('background-color', rowBGcolor)
 					:css('text-align', 'center')
					:css('font-size','x-small')
					:wikitext(hs_link)
					:done() --end td
				:tag('td')
 					:attr('colspan', link_no_mm)
 					:css('background-color', rowBGcolor)
 					:css('text-align', 'center')
					:css('font-size','x-small')
					:wikitext(mm_link)
					:done() --end td
				:done() --end tr
			:done() --end table
		:done() --end tr
	root:done() --end root table
end


--this code isn't used was hoping could do some generalization of rows
p.rowLabel=function(label)
	root
	    :tag('tr')
        :tag('th')
        	:attr('rowspan', '2')
        	:css('background-color', sideTitleBGcolor)
        	:css('width', '43px')
         	:wikitext(label)
        	--:done()
end

-- look into entity object
p.getLabel = function(entity)
	local data = entity

	local f = {'labels','en','value'}

	local i = 1
	while true do
		local index = f[i]
		if not index then
			if type(data) == "table" then
				return mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)
			else
				return tostring(data)
			end
		end
		
		data = data[index] or data[tonumber(index)]
		if not data then
			return
		end
		
		i = i + 1
	end
end



--general function to get value given an entity and property
p.getValue = function(entity, propertyID, return_val)

	local claims
	if return_val == nil then return_val = "" end
    local sep = " " --could ad as input parameter if need be
	if entity and entity.claims then
		claims = entity.claims[propertyID]
	end
	if claims then
		-- if wiki-linked value output as link if possible
		if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
			local out = {}
			for k, v in pairs(claims) do
				local datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
				if datav == nil then datav = " " end 
				out[#out + 1] = datav			
			end
			return table.concat(out, sep)
		else
		-- just return best values
			return entity:formatPropertyValues(propertyID).value
		end
	else
		return return_val
	end
end

p.getValueProtein = function(protein_entities, propertyID, return_val)
	if return_val == nil then return_val = "" end
	local sep = ","
    local overall_results = {} --should return empty if nothing assigned
	for key, val in pairs(protein_entities) do --in cases where there are multiple encodes we loop through each and return concatenated data as a whole
		local claims
		local entity = val --each protein in encodes
		if entity and entity.claims then
			claims = entity.claims[propertyID]
		end
		if claims then
			local results
			-- if wiki-linked value output as link if possible
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				local out = {}
				for k, v in pairs(claims) do
					local datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
					if datav == nil then datav = " " end 
					out[#out + 1] = datav			
				end
				results = table.concat(out, sep)
			else
				results = entity:formatPropertyValues(propertyID).value
			end
			overall_results[#overall_results+1] = results --individual propertyID value stored in this index	
		end
	end

	local str_overall_results = table.concat(overall_results, sep) --weirdness happens when add a sep = " " otherwise each value represented one time
	if string.match(str_overall_results, '%w+') then
		return str_overall_results 
	else
		return return_val
	end
end


--general function to get value given an entity and property
p.getQid = function(entity)
	local Qid
	if entity and entity.id then
		Qid = entity.id
		return Qid
	else
		return ""
	end
end

--get random value that is preferred ranked 
-- *lclz*: Sometimes Wikibase returns punctuations other than "," depending on
--         your site's language. Consider adding a gsub here.
p.getRefseq_mRNA = function(entity, propertyID, return_val)
	if return_val == nil then return_val = "" end
	local input_rank = "RANK_PREFERRED" ---this is mostly like won't do anything because ranking isn't maintained in wikidata 
	local claims
	
	if entity.claims then
		claims = entity.claims[propertyID]
	end
	if claims then
		-- if wiki-linked value output as link if possible
		if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid" ) then
			local out = {}
			for k, v in pairs(claims) do
				local sitelink = mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])
				local label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
				if label == nil then label = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end
							
				if sitelink then
					out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
				else
					out[#out + 1] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]"
				end
			end
			return table.concat(out, ", ")
		else
			local results = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).value 
			
			--loop through results until get a NP or NM or just return whatever is in first element
			--[[local results_split = mw.text.split(results, ",")
			
			local preffered_results = " "
			if results_split[1] then
				preferred_result = mw.text.trim(results_split[1]) --return first element if desired prefix not found and remove whitespace
			end
			local id --refseq id in question
			for i, id in ipairs(results_split) do
				local trim_id = mw.text.trim(id)
  				if string.match( trim_id, '^NM_%d+') then 
  					preferred_result = trim_id --overwrite each time found only need one to display
  				end
			end
			if preferred_result then
				return preferred_result --return a id starting with NP or NM
			else
				return return_val --return first element because desired prefix not found and remove whitespaces
			end
			--]]
			return results
		end
	else
		return return_val
	end
end

-- *lclz*: same as getRefseq_mRNA
p.getRefseq_protein = function(protein_entities, propertyID, return_val)
local sep = ","
local overall_results = {} --should return empty if nothing assigned

	for key, val in pairs(protein_entities) do --in cases where there are multiple encodes we loop through each and return concatenated data as a whole
	
		local claims
		local entity = val --each protein in encodes
		if entity.claims then
			claims = entity.claims["P637"]
		end
		if claims then
			local results
			-- if wiki-linked value output as link if possible
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid" ) then
				local out = {}
				for k, v in pairs(claims) do
					local datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
					if datav == nil then datav = " " end 
					out[#out + 1] = datav			
				end
				results = table.concat(out, sep)
			else
				results = entity:formatPropertyValues("P637", mw.wikibase.entity.claimRanks).value 
			end
			overall_results[#overall_results+1] = results --a list is in each index 
		end	
		
	end
	--why are there duplicate results here
	local str_overall_results = table.concat(overall_results, sep)
	return str_overall_results

end
	--[[
	local results_split = mw.text.split(str_overall_results, sep) --split complete list so can loop through..probably a more direct way to do this
				--loop through results until get a NP or NM or just return whatever is in first element
	

	local preffered_result = results_split[1] or ""

	for i, id in ipairs(results_split) do
		local trim_id = mw.text.trim(id)
		--check of id starts with NP or NM
		if string.match( trim_id, '^NP_%d+') then 
			preferred_result = trim_id --overwrite each time found only need one to display
		end
	end
	--check if something in preffered_result if not get first element in result_split
	if p.isempty(preffered_result) then
		return return_val
	else
		return preferred_result --return a id starting with NP or NM
	end

end --]]

-- Obtiene una imagen
p.getImage = function(entity, propertyID, sep, imgsize, altFile)
	
	local ImgSize = (function()
		if imgsize then
			if type(imgsize) == 'string' then return imgsize end
			if type(imgsize) == 'number' then return imgsize .. 'px' end
		end
		return '250px'
	end)()

 	if altFile then 
 		if type(altFile) == 'string' then
 			local Obj = mw.title.new(altFile, 6)
 			if Obj.fileExists then return "[[Archivo:" .. altFile .. "|" .. ImgSize .. "]]" end
 		end
 	end

 	local claims
 	if entity and entity.claims then  
 		claims = entity.claims[propertyID]  

	 	if claims then
	 		if (claims[1] and claims[1].mainsnak.datatype == "commonsMedia") then  
	 			local out = {}  
	 			for k, v in pairs(claims) do  
	 				local filename = v.mainsnak.datavalue.value  
	 				out[#out + 1] = "[[File:" .. filename .. "|" .. ImgSize .. "]]" 
	 			end   
	 				return table.concat(out, sep)   
	 		end
 		end
 	end
 	return '' 
end

p.getPDB = function(protein_entities)
	local pdb_propertyID = "P638"
	local overall_results = {}
	for key, val in pairs(protein_entities) do --in cases where there are multiple encodes we loop through each and return concatenated data as a whole
		local claims
		local entity = val
		if entity and entity.claims then
			claims = entity.claims[pdb_propertyID]
		end
		local sitelink = "https://www.rcsb.org/structure/"
		if claims then
			local results
			if (claims[1] and claims[1].mainsnak.snaktype == "value") then
			
			
				local out = {}
				for k, v in pairs(claims) do
					local label = mw.wikibase.label(v.mainsnak.datavalue.value)
					if label == nil then label = v.mainsnak.datavalue.value end
				
					if sitelink then
						out[#out + 1] = "[" .. sitelink .. label .. " " ..label .. "]"
					else
						out[#out + 1] = "[[:d:Q" .. v.mainsnak.datavalue.value .. "|" .. label .. "]]"
					end
				end
				results = table.concat(out, ", ") -- *lclz*: punctuation (CJK comma, etc.)
			else
				results = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).value
			end
			overall_results[#overall_results+1] = results --individual propertyID values stored in this index
		end
	end
	return table.concat(overall_results, ",%%s")
end

function p.getAliases(entity)
	a = ''
	if entity['aliases'] ~= nil then
		-- *lclz*: You will need a different language here.
		--         If you are aiming for an "en" fallback, consider a set data structure.
		
		-- zhwp went a bit further here: they moved this call after "gene_symbol",
		-- so that this function can perform the deduplication here instead of
		-- in renderIdentifiers. That way they skip messing with commas and spaces.
        local test = entity['aliases']['es']
        if test then
			for key, value in ipairs(test) do
				a = a .. ', ' ..  value['value']
			end
			return a
		else
			return ""
		end
	else
		return ""
	end
	
end


--get a geneome start P644 or end P645
p.getChromosomeLoc = function(entity, propertyID, prefix)
	-- will contain the numeric value for the requested coordinate
	local output = ""
	local sep = " "
	-- can only be P644 (genomic start) or P645 (genomic end) for this to work
	-- should probably try to catch that.  Might also increase legibility to use specific variable names when possible
--	local propertyID = mw.text.trim(frame.args[1] or "") 
	-- this can really only be P659 right now.  I'm not sure of the value of including it as a parameter as other values will likely break this function
	local qualifierID = "P659" --mw.text.trim(frame.args[2] or "")
	-- Why do we include this here?  What should happen if FETCH_WIKIDATA is not included? 
	--local input_parm = mw.text.trim(frame.args[3] or "")
	-- this can needs to be fed to the function either by a call to {{#invoke:Wikidata|pageId}} or by setting it directly (e.g. if the function was applied on a page other than the targeted gene)
	--alert if this id is not a valid thing in wikidata, a Lua error will occur that says
	--The ID entered is unknown to the system. Please use a valid entity ID.
	--local itemID = mw.text.trim(frame.args[4] or "")
	-- will track the different builds pulled from the qualifiers
	local newest_build = "0"
	-- starts the process
	--local entity = mw.wikibase.getEntityObject(itemID)
	local claims
	--gets a table of claims on the (genomic start or end) property Q19847637
	if entity and entity.claims then
		claims = entity.claims[propertyID]
	end
	--will return nothing if no claims are found
	if claims then
		--checking to be sure claims is populated, not sure it its needed
		if (claims[1] ) then
			--useful for debugging
			--local out = {}
			--pulls the genome location from the claim
			for k, v in pairs(claims) do
				local location = v.mainsnak.datavalue.value
				--debugging
				--out[#out + 1] = k.." location:" .. location.. " || " 
				--gets the qualifiers linked to the current claim
				local quals 
				if v.qualifiers then
					quals = v.qualifiers.P659
				end
				--if there are any
				if quals then
					for qk, qv in pairs(quals) do
						local qual_obj_id = "Q"..qv.datavalue.value["numeric-id"]
						--get to the entity targeted by the qualifier property.  Genome builds are Items in wikidata
						local qual_obj = mw.wikibase.getEntityObject(qual_obj_id)
						local alias = ""
						--this uses the aliases to pull out version numbers
						--seems like there ought to be a better way to do this, but likely would need to change the data added by the bot
						if qual_obj["aliases"] ~= nil then
							local test = qual_obj["aliases"]["en"]
							for key, value in ipairs(test) do
								if string.match(value['value'], prefix) then
									alias = value['value']
									local build_no = alias:gsub(prefix,"")
									--report only the most location associated with the most recent build
									--if there is more than one location per build, just give one back as that is not our problem right now.
									if build_no > newest_build then
										output = location
										newest_build = build_no
									end
								end
							end
						end
					end
				--in case there are no qualifiers, but there is a location, might as well return it
				else output = location 
				end
			end
				return output
		else
			return ""
		end
	else
		return ""
		--debug
		--"no claims for "..itemID.." prop "..propertyID
	end
end

p.getAliasFromGenomeAssembly = function(entity, prefix)
	-- will contain the numeric value for the requested coordinate
	local output = ""
	local sep = " "
	local propertyID = "P644" --genomic start used 
	local qualifierID = "P659" --genomic assembly

	local newest_build = "0"
	local claims
	if entity.claims then
	 claims = entity.claims[propertyID]
	end
	--will return nothing if no claims are found
	if claims then
		--checking to be sure claims is populated, not sure it its needed
		if (claims[1] ) then
			--useful for debugging
			--local out = {}
			--pulls the genome location from the claim
			for k, v in pairs(claims) do
				local quals
				if v.qualifiers then
					quals = v.qualifiers.P659
				end
				--if there are any
				--as of Aug. 2017, P659-genomic assembly is stored only in human genomic data. GRCh38 (newer) or GRCh37(older).
				--Mouse genomic data doesn't have P659-genomic assembly data. But mouse has only one version. GRCm38/mm10.
				if quals then
					for qk, qv in pairs(quals) do
						local qual_obj_id = "Q"..qv.datavalue.value["numeric-id"]
						--get to the entity targeted by the qualifier property.  Genome builds are Items in wikidata
						local qual_obj = mw.wikibase.getEntityObject(qual_obj_id)
						local alias = ""
						--this uses the aliases to pull out version numbers
						--seems like there ought to be a better way to do this, but likely would need to change the data added by the bot
						if qual_obj["aliases"] ~= nil then
							local test = qual_obj["aliases"]["en"]
							for key, value in ipairs(test) do
								if string.match(value['value'], prefix) then
									alias = value['value']
									local build_no = alias:gsub(prefix,"")
									--For example, prefix is "hg" (this is set when the function was called),
									--alias is "hg38" (which is data stored in Wikidata). Then "build_no" becomes "38".
									--report only the most location associated with the most recent build
									--if there is more than one location per build, just give one back as that is not our problem right now.
									if build_no > newest_build then
										newest_build = build_no
									end
								end
							end
						end
					end
				--in case there are no qualifiers, but there is a location, might as well return it
				else output = location 
				end
			end
				return prefix..newest_build
		else
			return ""
		end
	else
		return ""
	end
end

-- *lclz*: Your language's wikidata may have different nouns for chromosome and
--         mitochodria.
p.trimChromosome = function(entity)
	local string_to_trim = p.getValue(entity, "P1057")
	local out = ''
	
	--"mitochondrion" and "chromosome MT" is used for mitochondrial DNA.
	--See [[d:Special:WhatLinksHere/Q18694495]]
	if string.find(string_to_trim, 'chromosome MT') or string.find(string_to_trim, 'mitochondri') then --match both 'mitochondrio'/'mitochondrial'
		out = "MT"
	elseif string.find(string_to_trim, 'chromosome') then
		out = string.match(string_to_trim, "%d+")--extract number from string
		if out == nil then
			out = string.match(string_to_trim, "X") or string.match(string_to_trim, "Y")
		end
	end
	return out	
end

p.locToMb = function(num, idp)
  num = tonumber(num)
  if num == nil then 
  	return ""
  else
  	local mb = num/1000000
  	local mult = 10^(idp or 0)
  	return math.floor(mb * mult + 0.5) / mult
  end
end

p.isempty = function(s)
  	return s == nil or s == ''
end


p.getGO = function(protein_entities, propertyID)
	--propertyID ie molecular, cellular, function
	
	local overall_results = {}
	local results = "" --string to return
	
	for key, val in pairs(protein_entities) do
	
		local claims
		local entity = val
		if entity.claims then
			claims = entity.claims[propertyID] -- ie molecular, cellular, function
		end
		local propertyID_child = "P686" -- Gene Ontology ID
		
		if claims then
			
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				--local out = {}
				for k, v in pairs(claims) do
					local itemID_child = "Q" .. v.mainsnak.datavalue.value["numeric-id"] --get Qid of property item so can get the GOid
					local entity = mw.wikibase.getEntityObject(itemID_child)
					local claims
					local result_GOID = ''
					if entity and entity.claims then claims = entity.claims[propertyID_child] end
					if claims then
						result_GOID = entity:formatPropertyValues(propertyID_child, mw.wikibase.entity.claimRanks).value
					else
						result_GOID = nil --no GO ID
					end
					local sitelink = "http://amigo.geneontology.org/amigo/term/"
					local label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
					if label == nil then label = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end
					local wiki_link	= ""
					if sitelink and result_GOID ~= nil then
						wiki_link = "<big>•</big> [" .. sitelink .. result_GOID .. " " .. label .."]<br>"
					else
						wiki_link = "<big>•</big> [[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]<br>"
					end
					overall_results[#overall_results+1] = wiki_link
				end
				
			else
				results = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).value
			end
			
		end
		--overall_results[#overall_results+1] = results --each protein GO terms stored in this index, so table contains all the GO terms with duplicates 
	end

	local hash = {} --temp check
	local res = {} --no dups

	for _,v in ipairs(overall_results) do
   		if (not hash[v]) then
       		res[#res+1] = v 
       		hash[v] = true
   		end
	end
	return table.concat(res, "")
end

local function getReference(qID, entity, property_id, ref_index)
	local f = {"claims",property_id, ref_index, "references"} 
	local id = qID
	--if id and (#id == 0) then
	--	id = nil
	--end
	local data = entity
	if not data then
		return nil
	end
	
    
	local i = 1
	while true do
		local index = f[i]
		if not index then
			if type(data) == "table" then
				return mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)
			else
				return tostring(data)
			end
		end
		
		data = data[index] or data[tonumber(index)]
		if not data then
			return ""
		end
		i = i + 1
	end
end

p.getDisease= function(entity, propertyID)
    local claims
	if return_val == nil then return_val = "" end
	if entity and entity.claims then
		claims = entity.claims[propertyID]
	end
	if claims then
		-- if wiki-linked value output as link if possible
		
		if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then

			local out = {}
			local datasource = {}
			--{{#invoke:Wikidata |ViewSomething |id=Q18023174 |claims|P2293|1|references|1|snaks|P854|1|datavalue|value}}
			--maybe there is a more direct way to find this than looping through the json object
			
			for k, v in pairs(claims) do
				local datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
				
				if datav == nil then datav = " " end 
			   
				local id = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
				local linkTarget = mw.wikibase.sitelink(id)
				local refLink = ""
				local ref = ""
				ref = getReference("", entity, "P2293", k)
				if (ref ~= nil and ref ~= '') then
				     --refLink = refLink..","..ref
				     refLink = ref
				end
		    
                --if refLink = "" then --skip if there isn't a reference found
				
				if linkTarget then
					out[#out + 1] = "[["..linkTarget.."|"..datav.."]]"
				else
					out[#out + 1] = "[[:d:" .. id .. "|" .. datav .. "]]"
				end
				datasource[#out] = refLink
				--end				
			end
			return out, datasource
		else
		-- just return best values
			--return entity:formatPropertyValues(propertyID).value
			return return_val, return_val
		end
	else
		return return_val
	end	
   return return_val
end

p.getDrug= function(protein_entities, propertyID)
    local out = {}
	local datasource = {}
	local pname = {}
	local pqid = {}


	for key, val in pairs(protein_entities) do
		local claims
		local entity = val
		local name = check_values(p.getLabel,{entity})
		if entity.claims then
			claims = entity.claims[propertyID] -- ie physically interacts with
		end
		local protein_id
		if entity then protein_id = entity.id else protein_id = "" end
		if claims then
			if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
				for k, v in pairs(claims) do
					local datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
				
					if datav == nil then datav = "" end
					local id = "Q" .. v.mainsnak.datavalue.value["numeric-id"]
					local linkTarget = mw.wikibase.sitelink(id)
					local refLink = ""
					local ref = getReference(protein_id, entity, "P129",k)  --just check if anything returned
					if (ref ~= nil and ref ~= '') then
				    	refLink = ref
				    end
					if linkTarget then
					    out[#out + 1] = "[["..linkTarget.."|"..datav.."]]"
				    else
					    out[#out + 1] = "[[:d:" .. id .. "|" .. datav .. "]]"
				    end
					pname[protein_id] = name
				    pqid[#out] = protein_id
					datasource[#out] = refLink
				end --end k,v claims loop
			end --end claims[1]
		end --if claims
    end -- end protein_entities loop
	return out, datasource, pqid, pname
end

p.separateWithComma= function(bp)
	--Separate number with comma. For example when this function gets "12345678", returns "12,345,678"
  local commaSeparated = bp
  while true do  
    commaSeparated, k = string.gsub(commaSeparated, "^(-?%d+)(%d%d%d)", '%1,%2')
    if (k==0) then
      break
    end
  end
  return commaSeparated
end

return p