Module:Sandbox/genewiki/experimental

--uncomment and add this to the debug console to run code. --frame = mw.getCurrentFrame --frame.args = {"a", "b", from ="Q14865053"} --print(p.hello(frame))

---require('Module:Wikidata')

-- All Lua modules on Wikipedia must begin by defining a variable that will hold their -- externally accessible functions. They can have any name and may also hold data. p = { devmode	 = false }

p.getQualifierID = function(frame) local propertyID = mw.text.trim(frame.args[1] or "") local qualifierID = mw.text.trim(frame.args[2] or "") local input_parm = mw.text.trim(frame.args[3] or "") local itemID = mw.text.trim(frame.args[4] or "") --if direct link from wikidata item if input_parm == "FETCH_WIKIDATA" then local entity = "" if itemID ~= "" then entity = mw.wikibase.getEntityObject(itemID) else entity = mw.wikibase.getEntityObject end if entity.claims[propertyID] ~= nil then local out = {} for k, v in pairs(entity.claims[propertyID]) do				for k2, v2 in pairs(v.qualifiers[qualifierID]) do					if v2.snaktype == 'value' then out[#out + 1] = "Q" .. v2.datavalue.value["numeric-id"] end end end return table.concat(out, ", ") else return "" end else return input_parm end end

--- Try to replace this with one function that fails gracefully --- Get the image URL associated the current article --- --- breaks apart to be --- --- testing on ARF6 Q14865053

p.testEntityId = function(wikidata_qid) --pcall pattern does not not work for this.. --local entity = mw.wikibase.getEntity(wikidata_qid) --but it does for locally generated errors like this local entity = 2+"error" return entity end

-- test entry point -- local qid = mw.text.trim(frame.args['from']) p.hello = function( frame ) local qid = "1Q14865053" local out = "" --this is like a try statement local worked,value = pcall(p.testEntityId, qid) if(worked) then out = value else out = "error! "..value end return out end

--gets an image for a qif, doesn't die if no qid is given to it. --frame = mw.getCurrentFrame --frame.args = {QID="Q14865053"} --print(p.getDefaultImage(frame))

p.getDefaultImage = function(frame) local wikidata_id = mw.text.trim(frame.args['QID'] or "") -- "nil" (a string, not the value nil), "number", "string", "boolean", "table", "function", "thread", and "userdata". if wikidata_id == nil then return "" elseif string.len(wikidata_id) < 3 then return "" end local propertyID = "P18" local sep = mw.text.trim(" ") local imgsize = mw.text.trim("220px") local entity = mw.wikibase.getEntity(wikidata_id) 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] = "" end return table.concat(out, sep) else return "" end else return input_parm end end

function p.ViewSomething(frame) local itemID ="Q14865053" local data = mw.wikibase.getEntityObject(itemID) if not data then return nil end

---	local f = frame.args[1] and frame or frame:getParent

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

p.getChromosomeLocJulia = function(frame) local propertyID = mw.text.trim(frame.args[1] or "") local qualifierID = mw.text.trim(frame.args[2] or "") local input_parm = mw.text.trim(frame.args[3] or "") local qualifierIds = p.getQualifierID(frame) local newest_build = "" local preferred_value = "not set" if qualifierIds then local list_itemID = mw.text.split(qualifierIds,",") for index,value in ipairs(list_itemID) do 			local entity = mw.wikibase.getEntityObject(value) local alias = "" if entity['aliases'] ~= nil then local test = entity['aliases']['en'] for key, value in ipairs(test) do					if string.match(value['value'], '^hg') then alias = value['value'] end end local build_no = alias:gsub("hg", "") if newest_build < build_no or newest_build == "" then newest_build = build_no preferred_value = "path here" end end end return preferred_value else return "nnn" end return "mmm" end

---getChromosomeLoc ---input propertyID ie(Genomic start) P644 ---     qualifierID (ie GenLoc Assembly) P659 ---     input_parm (ie FETCH_WIKIDATA) ---     ---output preferred chromosome location start value in this case it would be 49893092

--for debug window -- Q14865053 --frame = mw.getCurrentFrame --frame.args = {"P644","P659","FETCH_WIKIDATA","Q14865053"} --print(p.getChromosomeLoc(frame))

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

-- All modules end by returning the variable containing its functions to Wikipedia. return p

-- We can now use this module by calling. -- The #invoke command begins with the module's name, in this case "HelloWorld", -- then takes the name of one of its functions as an argument, in this case "hello".