local p = { }local navbar = require('Module:Navbar')._navbarlocal infobox = require('Module:Infobox3cols').infoboxlocal infoboxImage = require('Module:InfoboxImage').InfoboxImage-- wrapped "protected call", return "value error" with error info on errorlocal function check_values(f,args)    --local u= table.upack(args)local exist, val = pcall(f, unpack(args))if exist and val ~= nil thenreturn(val)else-- Leaking some debugging info won't hurt....return("'''VALUE_ERROR''' (" .. tostring(val) .. ")")endend--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)--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 pagelocal root_qid = mw.text.trim(frame.args['QID']  or "") --try to get it from the argslocal mm_qid = ""--pull all the entity objects that we will needlocalentity = {} localentity_protein = {}localentity_mouse = {}localentity_mouse_protein = {}localcheckOrtholog = "" --flag used to see if mouse data avaliablelocal mouse_propertyID = "P684" --actually ortholog property additional orthologs can existlocal protein_propertyID = "P688" --get root gene entityif root_qid == "" thenentity = mw.wikibase.getEntityObject()if entity then root_qid = entity.id else root_qid = "" endelse--assuming we think its good make one call to retrieve and store its wikidata representationentity = mw.wikibase.getEntity(root_qid)end  --need to figure out if it is protein or gene herelocal subclass = p.getValue(entity, "P31") or ""if string.find(subclass, 'protein') then --if protein switch entity to geneif entity.claims then claims = entity.claims["P702"] --encoded by endif claims then--go through each index and reassign entityentity = {}if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") thenfor k, v in pairs(claims) do --this would be problematic if multiple genes for the proteinlocal itemID = "Q" .. claims[#entity + 1].mainsnak.datavalue.value["numeric-id"]entity[#entity + 1] = mw.wikibase.getEntity(itemID)root_qid = itemIDendend --will return nothing if no claims are foundend entity = mw.wikibase.getEntity(root_qid)  end--get the other related entitiesif entity thenlocal claims = "" --get protein entity object if entity.claims then claims = entity.claims[protein_propertyID] endif claims then--go through each index and then make entity_protein indexedif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") thenfor k, v in pairs(claims) dolocal protein_itemID = "Q" .. claims[#entity_protein + 1].mainsnak.datavalue.value["numeric-id"]entity_protein[#entity_protein + 1] = mw.wikibase.getEntity(protein_itemID)endend --will return nothing if no claims are foundend --get mouse entity object if entity.claims thenclaims = entity.claims[mouse_propertyID]endlocal qualifierID = "P703" --found in taxonlocal mouse_qual = "Q83310"if claims thenif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") thenfor k, v in pairs(claims) doif checkOrtholog == 1 then -- Don't have to go on if we already got itbreakend  local mouse_itemID = "Q" .. v.mainsnak.datavalue.value["numeric-id"]local quals if v.qualifiers thenquals = v.qualifiers.P703endif quals thenfor qk, qv in pairs(quals) do--get the taxon qualifier idlocal qual_obj_id = "Q"..qv.datavalue.value["numeric-id"]if qual_obj_id == mouse_qual then --check if this is mouse or othermm_qid = mouse_itemID entity_mouse = mw.wikibase.getEntity(mouse_itemID)checkOrtholog = 1breakendendendendend --will return nothing if no claims are foundelsecheckOrtholog = 0end --get mouse protein entity object if entity_mouse and entity_mouse.claims thenclaims = 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") thenfor k, v in pairs(claims) dolocal 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)endend --will return nothing if no claims are found endendif entity then --only require the main gene entity--a list variables of all the data in the info boxlocal name = check_values(p.getLabel,{entity})local entrez_gene = check_values(p.getValue, {entity, "P351", "n/a"} )local entrez_gene_mm = check_values(p.getValue, {entity_mouse, "P351", "n/a"})local image = check_values( p.getImage, {entity, "P18", " ", "250px"}) --need to set sizelocal uniprotID_hs = check_values(p.getValueProtein, {entity_protein, "P352", "n/a"})    local uniprotID_mm = check_values(p.getValueProtein, {entity_mouse_protein, "P352", "n/a"})    local pdbIDs = check_values(p.getPDB, {entity_protein}) --makes a list with links to RCSB    local aliases = check_values(p.getAliases, {entity})    local gene_symbol = check_values(p.getValue, {entity, "P353"})    local hgnc_id = check_values(p.getValue, {entity, "P354"})    local homologene_id = check_values(p.getValue, {entity, "P593"})    local omim_id = check_values(p.getValue, {entity, "P492"})    local mgi_id = check_values(p.getValue, {entity_mouse, "P671"})    local ChEMBL_id = check_values(p.getValue, {entity_protein, "P592"})     local IUPHAR_id = check_values(p.getValue, {entity_protein, "P595"})    local ec_no = check_values(p.getValueProtein, {entity_protein, "P591"})    local mol_funct = check_values(p.getGO, {entity_protein, "P680"})    local cell_comp = check_values(p.getGO, {entity_protein, "P681"})     local bio_process = check_values(p.getGO, {entity_protein, "P682"})    local expression_images = check_values(p.getImage, {entity,"P692","<br><br>","250px"})    local ensembl = check_values(p.getValue, {entity, "P594", "n/a"})    local ensembl_mm = check_values(p.getValue, {entity_mouse, "P594", "n/a"})    local refseq_mRNA = check_values(p.getRefseq_mRNA, {entity, "P639", "n/a"})    local refseq_mRNA_mm = check_values(p.getRefseq_mRNA, {entity_mouse, "P639", "n/a"})     local refseq_prot = check_values(p.getRefseq_protein, {entity_protein, "P637", "n/a"})    local refseq_prot_mm = check_values(p.getRefseq_protein, {entity_mouse_protein, "P637", "n/a"})local gstart = check_values(p.getChromosomeLoc, {entity, "P644", "hg"})local gend = check_values(p.getChromosomeLoc, {entity, "P645", "hg"})local chr = check_values(p.trimChromosome, {entity})    local cytoband = check_values(p.getValue, {entity, "P4196", "n/a"})local db = check_values(p.getAliasFromGenomeAssembly, {entity,"hg"}) local gstart_mm = check_values(p.getChromosomeLoc, {entity_mouse, "P644", "mm"})local gend_mm =  check_values(p.getChromosomeLoc, {entity_mouse, "P645", "mm"})local chr_mm = check_values( p.trimChromosome, {entity_mouse})local db_mm = check_values(p.getAliasFromGenomeAssembly, {entity_mouse,"mm"})    local cytoband_mm = 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'''" } endif 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 SchemerowBGcolor = '#eee'titleBGcolor = '#ddd'sideTitleBGcolor = '#c3fdb8'p.createTable()    p.renderUpperTitle(name)    --p.renderCaption()    p.renderImage(image)    p.renderAvailableStructures(uniprotID_hs, uniprotID_mm, checkOrtholog, pdbIDs) --PDB infop.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)    --endif (chr ~= "" and gstart ~= "" and gend ~= "") or (chr_mm ~= "" and gstart_mm ~= "" and gend_mm ~= "") thenp.renderGeneLocation(frame, chr, gstart, gend, db, cytoband, ensembl, chr_mm, gstart_mm, gend_mm, db_mm, cytoband_mm, ensembl_mm, name)endif expression_images ~= ""  thenp.renderRNAexpression(expression_images, entrez_gene)endif (mol_funct ~= "" and cell_comp ~= "" and bio_process ~= "") thenp.renderGeneOntology(mol_funct, cell_comp, bio_process, uniprotID_hs)endp.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"endendp.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')    endend--Title above imagep.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)                :css('text-align', 'center')                :css('font-size', '125%')                :css('font-weight', 'bold')                :wikitext(title)                :done() --end th            :done() --end trend--This is a place holder for the image caption, which is stored in wikicommons comments unsure how to access p.renderCaption = function(entity)--captionend--gets default imagep.renderImage = function(image)root:tag('tr')        :tag('td')   :attr('colspan', 4)            :css('text-align', 'center')            :wikitext(image)         :done() --end td         :done() --end tr         endp.renderAvailableStructures = function(uniprotID_hs, uniprotID_mm, checkOrtholog, pdbIDs)    local title = 'Available structures' --**lclz**    local pdb_link = "[[Protein_Data_Bank|PDB]]" --**lclz**    local searchTitle = ""     local listTitle = "List of PDB id codes" --**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 = 'Ortholog search: '    url_uniprot = uniprotID_mm..','..uniprotID_hs    else    searchTitle = 'Human UniProt search: '    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 listif url_uniprot:match("([^,]+),") then--first check if there is a list if not just assume one valuePDBe_list = string.gsub(url_uniprot, ",", "%%20or%%20") --add or's inststead of commaselsePDBe_list = url_uniprotend        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)            :wikitext(title)            :done() --end th            :done() --end tr                :tag('tr')        :tag('th')        :attr('rowspan', '2')        :css('background-color', sideTitleBGcolor)        :css('width', '43px')         :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 ""endendp.renderIdentifiers = function(aliases, hgnc_id, gene_symbol, homologene_id, omim_id, mgi_id, ChEMBL_id, IUPHAR_id, ec_no, entrez_gene)local title = "Identifiers" --**lclz**local label_aliases = "[[Gene nomenclature|Aliases]]" --**lclz**local symbol_url if gene_symbol == "" or gene_symbol == nil  thensymbol_url = ""elseif hgnc_id == "" or hgnc_id == nil  thensymbol_url = gene_symbolelsesymbol_url = "[https://www.genenames.org/data/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 endlocal label_ext_id = "External IDs" --**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 ~= "") thenomim = "[[Mendelian_Inheritance_in_Man|OMIM:]]".." " --**lclz**endfor i, v in ipairs(omim_list) doif string.match(v, '%w+') thenomim = omim.."[https://omim.org/entry/"..v.." "..v.."], "endendomim = string.gsub(omim, ", $"," ")--remove comma from endhomologene_id = string.gsub(homologene_id, "%s", "")local homolo_list = mw.text.split(homologene_id, ",")local homolo =""if (homologene_id ~= nil and homologene_id ~= "") thenhomolo = "[[HomoloGene|HomoloGene:]]".." "endfor i, v in ipairs(homolo_list) doif string.match(v, '%w+') thenhomolo = homolo.."[https://www.ncbi.nlm.nih.gov/entrez/query.fcgi?cmd=Retrieve&db=homologene&dopt=HomoloGene&list_uids="..v.." "..v.."] "endendhomolo = string.gsub(homolo, ", $"," ")--remove comma from endlocal genecards = "[[GeneCards|GeneCards:]]".." "genecards = genecards.."[https://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 ~= "") thenmgi = "[[Mouse_Genome_Informatics|MGI:]]".." " --**lclz**endfor i, v in ipairs(mgi_list) doif string.match(v, '%w+') thenlocal mgi_number = string.sub(mgi_id, 5)mgi = mgi.."[http://www.informatics.jax.org/marker/"..mgi_id.." "..mgi_number.."] "endendmgi = string.gsub(mgi, ", $"," ")--remove comma from endlocal ChEMBL = ""if string.match(ChEMBL_id, '%w+') thenChEMBL = "[[ChEMBL|ChEMBL:]]".." ".."[https://www.ebi.ac.uk/chembldb/index.php/target/inspect/CHEMBL"..ChEMBL_id.." "..ChEMBL_id.."] "endlocal IUPHAR = ""if string.match(IUPHAR_id, '%w+') then IUPHAR = "[[International_Union_of_Basic_and_Clinical_Pharmacology|IUPHAR:]]".." ".."[http://www.guidetopharmacology.org/GRAC/ObjectDisplayForward?objectId="..IUPHAR_id.." "..IUPHAR_id.."] " --**lclz**end -- *lclz*local label_EC = "[[Enzyme_Commission_number|EC number]]" --**lclz**ec_no = string.gsub(ec_no, "%d%.%d+%.%d+%.%-,", "")--remove those with"-" in listec_no = string.gsub(ec_no, "%d%.%d+%.%d+%.%-", "")--remove those with"-" not in listlocal link_ec_no = string.gsub(ec_no, "," ,"+") --create format for linklocal EC = "[https://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)         :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 trif 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    endendp.renderDiseases = function(frame, disease, dis_ref, name, qid) local title = "Genetically Related Diseases" --**lclz**--check first to see if any of the diseases have referenceslocal ref_flag_all = false --check if any disease have references if not then don't render the headerslocal disease_name = '' --local disease_name = table.concat(disease, ", ")for index,value in ipairs(disease) doif (dis_ref[index] ~= nil and dis_ref[index] ~= '') thenif disease_name == '' thendisease_name = valueelsedisease_name = disease_name..", "..value -- *lclz*: punctuationendref_flag_all = trueendend    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    local ref_url =   "https://www.wikidata.org/wiki/"..qid.."#P2293" --direct page to property genetically associated diseaselocal title = "Diseases that are genetically associated with "..name.." view/edit references on wikidata"local ref_link = disease_name..frame:extensionTag("ref",frame:expandTemplate{ title = 'cite_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 referenceslocal ref_flag_all = false --check if any drugs have references if not then don't render the headersdrug_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 --endfor index,value in ipairs(drug) doif (drug_ref[index] ~= nil and drug_ref[index] ~= '') thenprotein_qid = drug_pqid[index]if drug_list_per_protein[protein_qid] == '' or drug_list_per_protein[protein_qid] == nil thendrug_list_per_protein[protein_qid] = valueelse-- *lclz*: comma    drug_list_per_protein[protein_qid] = drug_list_per_protein[protein_qid]..', '..value --each list of drugs keyed on protein qid endref_flag_all = trueendend    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 = 'cite_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    endp.renderGeneLocation = function(frame, chr, gstart, gend, db, cytoband, ensembl, chr_mm, gstart_mm, gend_mm, db_mm, cytoband_mm, ensembl_mm, name)local titleHuman = "Gene location (Human)" --**lclz**local titleMouse = "Gene location (Mouse)" --**lclz**        local label_chr = "[[Chromosome|Chr.]]" --**lclz**        local label_locus = "[[Locus (genetics)|Band]]" --**lclz**        local label_gstart = "Start" --**lclz**        local label_gend = "End" --**lclz**local tooltip_arrowSign = "Genomic location for "..name --**lclz**        local arrowSign_width = 14if 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"] = 248956422chrLengthTable["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"] = 57227415chrLengthTable["MT"] = 16569local chrLength = chrLengthTable[chr]--Different languages have different word order.local chrTextTable = {}--**lclz**chrTextTable["1"] = "Chromosome 1 (human)"chrTextTable["2"] = "Chromosome 2 (human)"chrTextTable["3"] = "Chromosome 3 (human)"chrTextTable["4"] = "Chromosome 4 (human)"chrTextTable["5"] = "Chromosome 5 (human)"chrTextTable["6"] = "Chromosome 6 (human)"chrTextTable["7"] = "Chromosome 7 (human)"chrTextTable["8"] = "Chromosome 8 (human)"chrTextTable["9"] = "Chromosome 9 (human)"chrTextTable["10"] = "Chromosome 10 (human)"chrTextTable["11"] = "Chromosome 11 (human)"chrTextTable["12"] = "Chromosome 12 (human)"chrTextTable["13"] = "Chromosome 13 (human)"chrTextTable["14"] = "Chromosome 14 (human)"chrTextTable["15"] = "Chromosome 15 (human)"chrTextTable["16"] = "Chromosome 16 (human)"chrTextTable["17"] = "Chromosome 17 (human)"chrTextTable["18"] = "Chromosome 18 (human)"chrTextTable["19"] = "Chromosome 19 (human)" chrTextTable["20"] = "Chromosome 20 (human)"chrTextTable["21"] = "Chromosome 21 (human)"chrTextTable["22"] = "Chromosome 22 (human)"chrTextTable["X"] = "X chromosome (human)"chrTextTable["Y"] = "Y chromosome (human)"chrTextTable["MT"] = "Mitochondrial DNA (human)"local chrText = chrTextTable[chr]--about the calculation below, see https://www.how.com.vn/wiki/en/User:Was_a_bee/Gene#3._Calculation_detaillocal markerWidth = ((gend - gstart) * 294.133 )/ chrLengthif markerWidth < 2 thenmarkerWidth = 2elsemarkerWidth = math.ceil(markerWidth)endlocal 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 ) / 10local source_link_chr = ""local source_link_gstart = ""local source_link_gend = ""if( db == "hg38" ) thensource_link_chr = frame:extensionTag("ref", "[http://May2017.archive.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") thensource_link_chr = frame:extensionTag("ref", "[http://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"})elsesource_link = ""source_link_gstart = ""source_link_gend = ""endlocal wikitext_for_ideogram_image = "" --wikitext used for showing gene locationif 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 chromosomewikitext_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>"endroot: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):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).." [[Base pair|bp]]"..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).." [[Base pair|bp]]"..source_link_gend):done() --end span :done() --end td:done() --end tr:done() --end table :done() --end td:done() --end trendif 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.p5local chrLengthTable_mm = {}chrLengthTable_mm["1"] = 195471971chrLengthTable_mm["2"] = 182113224chrLengthTable_mm["3"] = 160039680chrLengthTable_mm["4"] = 156508116chrLengthTable_mm["5"] = 151834684chrLengthTable_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"] = 120129022chrLengthTable_mm["13"] = 120421639 chrLengthTable_mm["14"] = 124902244chrLengthTable_mm["15"] = 104043685chrLengthTable_mm["16"] = 98207768chrLengthTable_mm["17"] = 94987271 chrLengthTable_mm["18"] = 90702639 chrLengthTable_mm["19"] = 61431566 chrLengthTable_mm["X"] = 171031299chrLengthTable_mm["Y"] = 91744698chrLengthTable_mm["MT"] = 16299local chrLength_mm = chrLengthTable_mm[chr_mm]--Different languages have different word order.local chrTextTable_mm = {}--**lclz**chrTextTable_mm["1"] = "Chromosome 1 (mouse)"chrTextTable_mm["2"] = "Chromosome 2 (mouse)"chrTextTable_mm["3"] = "Chromosome 3 (mouse)"chrTextTable_mm["4"] = "Chromosome 4 (mouse)"chrTextTable_mm["5"] = "Chromosome 5 (mouse)"chrTextTable_mm["6"] = "Chromosome 6 (mouse)"chrTextTable_mm["7"] = "Chromosome 7 (mouse)"chrTextTable_mm["8"] = "Chromosome 8 (mouse)"chrTextTable_mm["9"] = "Chromosome 9 (mouse)"chrTextTable_mm["10"] = "Chromosome 10 (mouse)"chrTextTable_mm["11"] = "Chromosome 11 (mouse)"chrTextTable_mm["12"] = "Chromosome 12 (mouse)"chrTextTable_mm["13"] = "Chromosome 13 (mouse)"chrTextTable_mm["14"] = "Chromosome 14 (mouse)"chrTextTable_mm["15"] = "Chromosome 15 (mouse)"chrTextTable_mm["16"] = "Chromosome 16 (mouse)"chrTextTable_mm["17"] = "Chromosome 17 (mouse)"chrTextTable_mm["18"] = "Chromosome 18 (mouse)"chrTextTable_mm["19"] = "Chromosome 19 (mouse)" chrTextTable_mm["X"] = "X chromosome (mouse)"chrTextTable_mm["Y"] = "Y chromosome (mouse)" chrTextTable_mm["MT"] = "Mitochondrial DNA (mouse)" local chrText_mm = chrTextTable_mm[chr_mm]--about the calculation below, see https://www.how.com.vn/wiki/en/User:Was_a_bee/Gene#3._Calculation_detaillocal markerWidth_mm = ((gend_mm - gstart_mm) * 294.133 )/ chrLength_mmif markerWidth_mm < 2 thenmarkerWidth_mm = 2elsemarkerWidth_mm = math.ceil(markerWidth_mm)endlocal 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 ) / 10local 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", "[http://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"}) elsesource_link_chr_mm = ""source_link_gstart_mm = ""source_link_gend_mm = ""endlocal wikitext_for_ideogram_image_mm = "" --wikitext used for showing gene locationif 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 chromosomewikitext_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>"endroot: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):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).." [[Base pair|bp]]"..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).." [[Base pair|bp]]"..source_link_gend_mm):done() --end span :done() --end td:done() --end tr:done() --end table :done() --end td:done() --end trendendp.renderRNAexpression = function(expression_images, entrez_gene)local title = "[[Gene expression|RNA expression]] pattern" --**lclz**local biogps_link = "[http://biogps.org/gene/"..entrez_gene.."/ More reference expression data]" --**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):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 trendp.renderGeneOntology = function(mol_funct, cell_comp, bio_process, uniprotID)local title = "[[Gene_ontology|Gene ontology]]" --**lclz**local mol_funct_title = "Molecular function" --**lclz**local cell_comp_title = "Cellular component" --**lclz**local bio_process_title = "Biological process" --**lclz**local amigo_link = "[http://amigo.geneontology.org/" .. " Amigo]"local quickGO_link = "[https://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)         :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("Sources:")            :wikitext(amigo_link)            :wikitext(" / ")            :wikitext(quickGO_link)            :done() --end td       :done() --end tr:done() --end table:done() --end td:done() --end trend 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 = "[[Ortholog|Orthologs]]" --**lclz**--to do make the list creation a function--create list for entrez idslocal category_chromosome = '[[Category:Genes on human chromosome '..chr..']]'-- *lclz*: Category nameif chr == "MT" thencategory_chromosome = '[[Category:Human mitochondrial genes]]'-- *lclz*: Category name for mtDNA genesendif mw.title.getCurrentTitle().namespace ~= 0 thencategory_chromosome = ""endlocal 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" thenentrez_link_list[#entrez_link_list+1] = "[https://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.."]"endend--if less than 5 don't create collapsible listif  table.getn(entrez_link_list) < 5 thenentrez_collapse = "none"if entrez_default == nil and table.getn(entrez_link_list) == 0 then entrez_link = "n/a" endelseentrez_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 displayendif entrez_link_list[#entrez_link_list] thenentrez_link = table.concat(entrez_link_list, "<br>")end--create list for mouse Entrez identrez_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" thenentrez_mm_link_list[#entrez_mm_link_list+1] = "[https://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&amp;cmd=retrieve&amp;dopt=default&amp;list_uids="..v.."&amp;rn=1 "..v.."]"endend--if less than 5 don't create collapsible listif  table.getn(entrez_mm_link_list) < 5 thenentrez_mm_collapse = "none"if entrez_mm_default == nil and table.getn(entrez_mm_link_list) == 0 then entrez_mm_link = "n/a" endelseentrez_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 displayendif entrez_mm_link_list[#entrez_mm_link_list] thenentrez_mm_link = table.concat(entrez_mm_link_list, "<br>")end--create list of ensembl idlocal 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" thenensembl_link_list[#ensembl_link_list+1] = "[http://www.ensembl.org/Homo_sapiens/geneview?gene="..v..";db=core".." "..v.."]"endend--if less than 5 don't create collapsible listif  table.getn(ensembl_link_list) < 5 thenensembl_collapse = "none"if ensembl_default == nil and table.getn(ensembl_link_list) == 0 then ensembl_link = "n/a" endelseensembl_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 displayendif ensembl_link_list[#ensembl_link_list] thenensembl_link = table.concat(ensembl_link_list, "<br>")end--create list of mouse ensembl idlocal 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" thenensembl_mm_link_list[#ensembl_mm_link_list+1] = "[http://www.ensembl.org/Mus_musculus/geneview?gene="..v..";db=core".." "..v.."]"endend--if less than 5 don't create collapsible listif  table.getn(ensembl_mm_link_list) < 5 thenensembl_mm_collapse = "none"if ensembl_mm_default == nil and table.getn(ensembl_mm_link_list) == 0 then ensembl_mm_link = "n/a" endelseensembl_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 displayendif ensembl_mm_link_list[#ensembl_mm_link_list] thenensembl_mm_link = table.concat(ensembl_mm_link_list, "<br>")end--create lists of uniprot IDlocal uniprotTitle = "[[UniProt|UniProt]]"local uniprot_url = "https://www.uniprot.org/uniprot/"local uniprot_link = "n/a"local uniprot_collapselocal 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 existlocal uniprot_alternate = {} --[A-N,R-Z] entrieslocal 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 encodeslocal label = mw.text.trim(v)local concat_uniprot_link = uniprot_url .. labelif string.match(v, '%w+') and v ~= "n/a" thenif string.match(v, '^O') or string.match(v,'^P') or string.match(v, '^Q') then    uniprot_first[#uniprot_first+1] = "[" .. concat_uniprot_link .. " " ..label .. "]"elseuniprot_alternate[#uniprot_alternate+1] = "[" .. concat_uniprot_link .. " " ..label .. "]"endendhash[v] = trueendend    if table.getn(uniprot_first)>0 then --if there is something in the preferred values display else display anything elseuniprot_link_list  = uniprot_firstelseuniprot_link_list  = uniprot_alternateend--if less than 5 don't create collapsible listif  table.getn(uniprot_link_list) < 5 thenuniprot_collapse = "none"if uniprot_default == nil and table.getn(uniprot_link_list) == 0 then uniprot_link = "n/a" endelseuniprot_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 displayendif uniprot_link_list[#uniprot_link_list] thenuniprot_link = table.concat(uniprot_link_list, "<br>")end    --mouse uniprot listslocal uniprot_mm_link = "n/a"local uniprot_mm_collapselocal 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 valuesfor 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 .. "]"elseuniprot_mm_alternate[#uniprot_mm_alternate+1] = "[" .. concat_uniprot_link .. " " ..label .. "]"end    endhash[v] = trueendendif table.getn(uniprot_mm_first)>0 then --if there is something in the preferred values display else display anything elseuniprot_mm_link_list  = uniprot_mm_firstelseuniprot_mm_link_list  = uniprot_mm_alternateend--if less than 5 don't create collapsible listif  table.getn(uniprot_mm_link_list) < 5 thenuniprot__mm_collapse = "none"if uniprot_mm_default == nil and table.getn(uniprot_mm_link_list) == 0 then uniprot_mm_link = "n/a" endelseuniprot_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 displayendif uniprot_mm_link_list[#uniprot_mm_link_list] thenuniprot_mm_link = table.concat(uniprot_mm_link_list, "<br>")endlocal 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 mRNAlocal refseq_mRNA_link = "n/a"local refseq_mRNA_collapselocal 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 valueslocal link_list_alternate = {} --hold those that are XM or XP valueslocal link_list = {} --if NM,NP display if not display XM, XP values for k,v in ipairs(split_refseq_mRNA) dolocal label = mw.text.trim(v)local concat_ncbi_link = ncbi_link .. labelif string.match(v, '%w+') and v ~= "n/a" thenif 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') thenlink_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"endend   end   if table.getn(link_list_first)>0 thenlink_list = link_list_firstelselink_list = link_list_alternateend--if less than 5 don't create collapsible listif  table.getn(link_list) < 6 thenrefseq_mRNA_collapse = "none"if refseq_mRNA_default == nil and table.getn(link_list) == 0 then refseq_mRNA_link = "n/a" endelserefseq_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 displayendif link_list[#link_list] thenrefseq_mRNA_link = table.concat(link_list, "<br>")end--create list of links for refSeq mRNA for mouselocal refseq_mRNA_mm_link = "n/a"local refseq_mRNA_mm_collapselocal 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 valueslocal link_list_first = {} --hold those the have NM or NP valueslocal link_list_alternate = {} --hold those that are XM or XP values  for k,v in ipairs(split_refseq_mRNA_mm) dolocal label = mw.text.trim(v)local concat_ncbi_link = ncbi_link .. labelif string.match(v, '%w+') and v ~= "n/a" thenif 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') thenlink_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"endend    endif table.getn(link_list_first)>0 thenlink_list_mm = link_list_firstelselink_list_mm = link_list_alternateend--if less than 5 don't create collapsible listif  table.getn(link_list_mm) < 6 thenrefseq_mRNA_mm_collapse = "none"if refseq_mRNA_mm_default == nil and table.getn(link_list_mm) == 0 then refseq_mRNA_mm_link = "n/a" endelserefseq_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 displayendif link_list_mm[#link_list_mm] thenrefseq_mRNA_mm_link = table.concat(link_list_mm, "<br>")end    -- *lclz*: sometimeslocal refseq_protTitle = "RefSeq (protein)"--create list of links for human refseq proteinlocal 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 valueslocal link_list_alternate = {} --hold those that are XM or XP valuesfor k,v in ipairs(split_refseq_prot) dolocal label = mw.text.trim(v)local concat_ncbi_link = ncbi_link .. labelif string.match(v, '%w+') and v ~= "n/a" thenif 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') thenlink_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"endendendif table.getn(link_list_first)>0 thenlink_list_prot  = link_list_firstelselink_list_prot  = link_list_alternateend--if less than 5 don't create collapsible listif  table.getn(link_list_prot) < 6 thenrefseq_prot_collapse  = "none"if refseq_prot_default == nil and table.getn(link_list_prot) == 0 then refseq_prot_link = "n/a" endelserefseq_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 displayend   if link_list_prot[#link_list_prot] thenrefseq_prot_link = table.concat(link_list_prot, "<br>")end--create list of links for mouse refseq proteinlocal refseq_prot_mm_link = "n/a"local refseq_prot_mm_collapselocal 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 valueslocal link_list_alternate = {} --hold those that are XM or XP values  for k,v in ipairs(split_refseq_prot_mm) dolocal label = mw.text.trim(v)local concat_ncbi_link = ncbi_link .. labelif string.match(v, '%w+') and v ~= "n/a" thenif 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') thenlink_list_alternate[#link_list_alternate+1] = "[" .. concat_ncbi_link .. " " ..label .. "]"endendendif table.getn(link_list_first)>0 thenlink_list_prot_mm  = link_list_firstelselink_list_prot_mm  = link_list_alternateend--if less than 5 don't create collapsible listif  table.getn(link_list_prot_mm) < 6 thenrefseq_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" endelserefseq_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 displayendif link_list_prot_mm[#link_list_prot_mm] thenrefseq_prot_mm_link = table.concat(link_list_prot_mm, "<br>")endlocal locTitle = "Location (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+') )thenlocal chr_ucsc if chr == "MT" then  chr_ucsc = "M" --UCSC uses "M" (not "MT") in URL for mitochondrial DNAelsechr_ucsc = chrendchr_loc_link = "[https://genome.ucsc.edu/cgi-bin/hgTracks?org=Human&db="..db.."&position=chr"..chr_ucsc..":"..gstart.."-"..gend.." ".."Chr "..chr_ucsc..": "..gstart_mb.." – "..gend_mb.." Mb]" elsechr_loc_link = "n/a"endlocal 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+') )thenlocal chr_mm_ucsc if chr_mm == "MT" then  chr_mm_ucsc = "M" --UCSC uses "M" (not "MT") in URL for mitochondrial DNAelsechr_mm_ucsc = chr_mmendchr_loc_mm_link =  "[https://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]"elsechr_loc_mm_link = "n/a"endlocal pubmedTitle = "[[PubMed|PubMed]] search" -- *lclz*local pubmed_link = entrez_geneif string.match(entrez_gene, '%w+') and entrez_gene ~= "n/a" thenpubmed_link = frame:extensionTag("ref",frame:expandTemplate{ title = 'cite_web', args = { title ="Human PubMed Reference:" , 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}} endlocal pubmed_mm_link = entrez_gene_mmif string.match(entrez_gene_mm, '%w+') and entrez_gene_mm ~= "n/a" thenpubmed_mm_link = frame:extensionTag("ref",frame:expandTemplate{ title = 'cite_web', args = { title ="Mouse PubMed Reference:" , 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}}endroot:tag('tr')        :tag('th')        :attr('colspan', '4')        :css('text-align', 'center')        :css('background-color', titleBGcolor)         :wikitext(title)        :done() --end th        :done() --end tr        :tag('tr')        :tag('th')        :attr('scope', 'row')        :css('background-color', sideTitleBGcolor)        :wikitext("Species") --**lclz**        :done() --end th        :tag('td')        :wikitext("'''Human'''") --**lclz**        :done() --end td        :tag('td')        :wikitext("'''Mouse'''") --**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 trendp.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 trendp.renderFooter = function(Qid, Qid_mm) local text = "[[Wikidata|Wikidata]]" --**lclz** local hs_link = "[[d:"..Qid.."|View/Edit Human]]" --**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.."|View/Edit Mouse]]" --**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 trroot:done() --end root tableend--this code isn't used was hoping could do some generalization of rowsp.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 objectp.getLabel = function(entity)local data = entitylocal f = {'labels','en','value'}local i = 1while true dolocal index = f[i]if not index thenif type(data) == "table" thenreturn mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)elsereturn tostring(data)endenddata = data[index] or data[tonumber(index)]if not data thenreturnendi = i + 1endend--general function to get value given an entity and propertyp.getValue = function(entity, propertyID, return_val)local claimsif return_val == nil then return_val = "" end    local sep = " " --could ad as input parameter if need beif entity and entity.claims thenclaims = entity.claims[propertyID]endif claims then-- if wiki-linked value output as link if possibleif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") thenlocal out = {}for k, v in pairs(claims) dolocal datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])if datav == nil then datav = " " end out[#out + 1] = datavendreturn table.concat(out, sep)else-- just return best valuesreturn entity:formatPropertyValues(propertyID).valueendelsereturn return_valendendp.getValueProtein = function(protein_entities, propertyID, return_val)if return_val == nil then return_val = "" endlocal sep = ","    local overall_results = {} --should return empty if nothing assignedfor key, val in pairs(protein_entities) do --in cases where there are multiple encodes we loop through each and return concatenated data as a wholelocal claimslocal entity = val --each protein in encodesif entity and entity.claims thenclaims = entity.claims[propertyID]endif claims thenlocal results-- if wiki-linked value output as link if possibleif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") thenlocal out = {}for k, v in pairs(claims) dolocal datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])if datav == nil then datav = " " end out[#out + 1] = datavendresults = table.concat(out, sep)elseresults = entity:formatPropertyValues(propertyID).valueendoverall_results[#overall_results+1] = results --individual propertyID value stored in this indexendendlocal str_overall_results = table.concat(overall_results, sep) --weirdness happens when add a sep = " " otherwise each value represented one timeif string.match(str_overall_results, '%w+') thenreturn str_overall_results elsereturn return_valendend--general function to get value given an entity and propertyp.getQid = function(entity)local Qidif entity and entity.id thenQid = entity.idreturn Qidelsereturn ""endend--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 = "" endlocal input_rank = "RANK_PREFERRED" ---this is mostly like won't do anything because ranking isn't maintained in wikidata local claimsif entity.claims thenclaims = entity.claims[propertyID]endif claims then-- if wiki-linked value output as link if possibleif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid" ) thenlocal out = {}for k, v in pairs(claims) dolocal 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"] endif sitelink thenout[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"elseout[#out + 1] = "[[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]"endendreturn table.concat(out, ", ")elselocal 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] thenpreferred_result = mw.text.trim(results_split[1]) --return first element if desired prefix not found and remove whitespaceendlocal id --refseq id in questionfor i, id in ipairs(results_split) dolocal 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  endendif preferred_result thenreturn preferred_result --return a id starting with NP or NMelsereturn return_val --return first element because desired prefix not found and remove whitespacesend--]]return resultsendelsereturn return_valendend-- *lclz*: same as getRefseq_mRNAp.getRefseq_protein = function(protein_entities, propertyID, return_val)local sep = ","local overall_results = {} --should return empty if nothing assignedfor key, val in pairs(protein_entities) do --in cases where there are multiple encodes we loop through each and return concatenated data as a wholelocal claimslocal entity = val --each protein in encodesif entity.claims thenclaims = entity.claims["P637"]endif claims thenlocal results-- if wiki-linked value output as link if possibleif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid" ) thenlocal out = {}for k, v in pairs(claims) dolocal datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])if datav == nil then datav = " " end out[#out + 1] = datavendresults = table.concat(out, sep)elseresults = entity:formatPropertyValues("P637", mw.wikibase.entity.claimRanks).value endoverall_results[#overall_results+1] = results --a list is in each index endend--why are there duplicate results herelocal str_overall_results = table.concat(overall_results, sep)return str_overall_resultsend--[[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 elementlocal preffered_result = results_split[1] or ""for i, id in ipairs(results_split) dolocal trim_id = mw.text.trim(id)--check of id starts with NP or NMif string.match( trim_id, '^NP_%d+') then preferred_result = trim_id --overwrite each time found only need one to displayendend--check if something in preffered_result if not get first element in result_splitif p.isempty(preffered_result) thenreturn return_valelsereturn preferred_result --return a id starting with NP or NMendend --]]--gets an imagep.getImage = function(entity, propertyID, sep, imgsize)   local claims   if entity and entity.claims then   claims = entity.claims[propertyID]   end   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)    else    return ""    end   else    return ""    end   endp.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 wholelocal claimslocal entity = valif entity and entity.claims thenclaims = entity.claims[pdb_propertyID]endlocal sitelink = "https://www.rcsb.org/structure/"if claims thenlocal resultsif (claims[1] and claims[1].mainsnak.snaktype == "value") thenlocal out = {}for k, v in pairs(claims) dolocal label = mw.wikibase.label(v.mainsnak.datavalue.value)if label == nil then label = v.mainsnak.datavalue.value endif sitelink thenout[#out + 1] = "[" .. sitelink .. label .. " " ..label .. "]"elseout[#out + 1] = "[[:d:Q" .. v.mainsnak.datavalue.value .. "|" .. label .. "]]"endendresults = table.concat(out, ", ") -- *lclz*: punctuation (CJK comma, etc.)elseresults = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).valueendoverall_results[#overall_results+1] = results --individual propertyID values stored in this indexendendreturn table.concat(overall_results, ",%%s")endfunction 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']['en']        if test thenfor key, value in ipairs(test) doa = a .. ', ' ..  value['value']endreturn aelsereturn ""endelsereturn ""endend--get a geneome start P644 or end P645p.getChromosomeLoc = function(entity, propertyID, prefix)-- will contain the numeric value for the requested coordinatelocal 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 functionlocal 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 qualifierslocal 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 Q19847637if entity and entity.claims thenclaims = entity.claims[propertyID]end--will return nothing if no claims are foundif claims then--checking to be sure claims is populated, not sure it its neededif (claims[1] ) then--useful for debugging--local out = {}--pulls the genome location from the claimfor k, v in pairs(claims) dolocal location = v.mainsnak.datavalue.value--debugging--out[#out + 1] = k.." location:" .. location.. " || " --gets the qualifiers linked to the current claimlocal quals if v.qualifiers thenquals = v.qualifiers.P659end--if there are anyif quals thenfor qk, qv in pairs(quals) dolocal qual_obj_id = "Q"..qv.datavalue.value["numeric-id"]--get to the entity targeted by the qualifier property.  Genome builds are Items in wikidatalocal 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 botif qual_obj["aliases"] ~= nil thenlocal test = qual_obj["aliases"]["en"]for key, value in ipairs(test) doif string.match(value['value'], prefix) thenalias = 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 thenoutput = locationnewest_build = build_noendendendendend--in case there are no qualifiers, but there is a location, might as well return itelse output = location endendreturn outputelsereturn ""endelsereturn ""--debug--"no claims for "..itemID.." prop "..propertyIDendendp.getAliasFromGenomeAssembly = function(entity, prefix)-- will contain the numeric value for the requested coordinatelocal output = ""local sep = " "local propertyID = "P644" --genomic start used local qualifierID = "P659" --genomic assemblylocal newest_build = "0"local claimsif entity.claims then claims = entity.claims[propertyID]end--will return nothing if no claims are foundif claims then--checking to be sure claims is populated, not sure it its neededif (claims[1] ) then--useful for debugging--local out = {}--pulls the genome location from the claimfor k, v in pairs(claims) dolocal qualsif v.qualifiers thenquals = v.qualifiers.P659end--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 thenfor qk, qv in pairs(quals) dolocal qual_obj_id = "Q"..qv.datavalue.value["numeric-id"]--get to the entity targeted by the qualifier property.  Genome builds are Items in wikidatalocal 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 botif qual_obj["aliases"] ~= nil thenlocal test = qual_obj["aliases"]["en"]for key, value in ipairs(test) doif string.match(value['value'], prefix) thenalias = 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 thennewest_build = build_noendendendendend--in case there are no qualifiers, but there is a location, might as well return itelse output = location endendreturn prefix..newest_buildelsereturn ""endelsereturn ""endend-- *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') thenout = string.match(string_to_trim, "%d+")--extract number from stringif out == nil thenout = string.match(string_to_trim, "X") or string.match(string_to_trim, "Y")endendreturn outendp.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  endendp.isempty = function(s)  return s == nil or s == ''endp.getGO = function(protein_entities, propertyID)--propertyID ie molecular, cellular, functionlocal overall_results = {}local results = "" --string to returnfor key, val in pairs(protein_entities) dolocal claimslocal entity = valif entity.claims thenclaims = entity.claims[propertyID] -- ie molecular, cellular, functionendlocal propertyID_child = "P686" -- Gene Ontology IDif claims thenif (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) dolocal itemID_child = "Q" .. v.mainsnak.datavalue.value["numeric-id"] --get Qid of property item so can get the GOidlocal entity = mw.wikibase.getEntityObject(itemID_child)local claimslocal result_GOID = ''if entity and entity.claims then claims = entity.claims[propertyID_child] endif claims thenresult_GOID = entity:formatPropertyValues(propertyID_child, mw.wikibase.entity.claimRanks).valueelseresult_GOID = nil --no GO IDendlocal 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"] endlocal wiki_link= ""if sitelink and result_GOID ~= nil thenwiki_link = "<big>•</big> [" .. sitelink .. result_GOID .. " " .. label .."]<br>"elsewiki_link = "<big>•</big> [[:d:Q" .. v.mainsnak.datavalue.value["numeric-id"] .. "|" .. label .. "]]<br>"endoverall_results[#overall_results+1] = wiki_linkendelseresults = entity:formatPropertyValues(propertyID, mw.wikibase.entity.claimRanks).valueendend--overall_results[#overall_results+1] = results --each protein GO terms stored in this index, so table contains all the GO terms with duplicates endlocal hash = {} --temp checklocal res = {} --no dupsfor _,v in ipairs(overall_results) do   if (not hash[v]) then       res[#res+1] = v        hash[v] = true   endendreturn table.concat(res, "")endlocal 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--endlocal data = entityif not data thenreturn nilend    local i = 1while true dolocal index = f[i]if not index thenif type(data) == "table" thenreturn mw.text.jsonEncode(data, mw.text.JSON_PRESERVE_KEYS + mw.text.JSON_PRETTY)elsereturn tostring(data)endenddata = data[index] or data[tonumber(index)]if not data thenreturn ""endi = i + 1endendp.getDisease= function(entity, propertyID)    local claimsif return_val == nil then return_val = "" endif entity and entity.claims thenclaims = entity.claims[propertyID]endif claims then-- if wiki-linked value output as link if possibleif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") thenlocal 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 objectfor k, v in pairs(claims) dolocal 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 = refend                    --if refLink = "" then --skip if there isn't a reference foundif linkTarget thenout[#out + 1] = "[["..linkTarget.."|"..datav.."]]"elseout[#out + 1] = "[[:d:" .. id .. "|" .. datav .. "]]"enddatasource[#out] = refLink--endendreturn out, datasourceelse-- just return best values--return entity:formatPropertyValues(propertyID).valuereturn return_val, return_valendelsereturn return_valend   return return_valendp.getDrug= function(protein_entities, propertyID)    local out = {}local datasource = {}local pname = {}local pqid = {}for key, val in pairs(protein_entities) dolocal claimslocal entity = vallocal name = check_values(p.getLabel,{entity})if entity.claims thenclaims = entity.claims[propertyID] -- ie physically interacts withendlocal protein_idif entity then protein_id = entity.id else protein_id = "" endif claims thenif (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") thenfor k, v in pairs(claims) dolocal datav = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])if datav == nil then datav = "" endlocal 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 returnedif (ref ~= nil and ref ~= '') then    refLink = ref    endif linkTarget then    out[#out + 1] = "[["..linkTarget.."|"..datav.."]]"    else    out[#out + 1] = "[[:d:" .. id .. "|" .. datav .. "]]"    endpname[protein_id] = name    pqid[#out] = protein_iddatasource[#out] = refLinkend --end k,v claims loopend --end claims[1]end --if claims    end -- end protein_entities loopreturn out, datasource, pqid, pnameendp.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 commaSeparatedendreturn p
"https:https://www.how.com.vn/wiki/index.php?lang=si&q=Module:Infobox_gene&oldid=458357" වෙතින් සම්ප්‍රවේශනය කෙරිණි
🔥 Top keywords: විශේෂ:ගවේෂණයකාලස් පුයිජ්දෙමොන්මුල් පිටුවඅධ්‍යාපනයවිශේෂ:මෑත වෙනස්වීම්සූනන් ඇඟ වැටීමේ ඵලාඵලවිකිපීඩියා:Contact usදුටුගැමුණු රජසාර ධර්මසාහිත්‍යයසීගිරියසිංහල සාහිත්‍යයසංස්කෘතියගෝලීයකරණයඅනගාරික ධර්මපාලපරිසර දූෂණයකුමාරතුංග මුනිදාසශ්‍රී දළදා මාළිගාවශ්‍රි ලංකාවේ පාසල් ලැයිස්තුවඑස්‌. මහින්ද හිමිශ්‍රී ලංකාවේ ප්‍රාදේශීය ලේකම් කොට්ඨාසශ්‍රී ලංකා පොලිස් සේවයශ්‍රී ලංකාවමාර්ටින් වික්‍රමසිංහරුවන්වැලිසෑයලිංගික සංසර්ගික ඉරියව්වොලිබෝල්ලිංගික සංසර්ගයවිකිපීඩියා:Administrators' noticeboardසාකච්ඡාව:මුල් පිටුවමනෝ විශ්ලේෂණවාදයසාමයපාසල්ස්ත්‍රී ස්වයං වින්දනයස්වයං වින්දනයළමා අපයෝජනයඅපරාධකළමනාකරණයපළමුවන විජයබාහු රජ