Module:Sandbox/genewiki/experimental explained

--uncomment and add this to the debug console to run code.--frame = mw.getCurrentFrame--frame.args = --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 =

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 endend

--- 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 entityend

-- 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 = --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 endend

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 endend

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 = --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 endend

-- 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".