Module:Alexa
MyWikiBiz, Author Your Legacy — Wednesday November 13, 2024
Jump to navigationJump to searchImplements {{WikidataAlexa}}
-- Module to implement Template:Alexa with Wikidata fetch p = {} local i18n = { ["months"] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" } } -- should use Module:Arguments if non-Wikidata values are allowed or required by RfC p.main = function(frame) local args = frame.args -- can take a named parameter |qid which is the Wikidata ID for the article. -- This will not normally be used because it's an expensive call. local qid = frame.args.qid if qid and (#qid == 0) then qid = nil end -- can take a date format parameter df= ["dmy" / "mdy" / "y"] -- default will be "dmy" local datefmt = string.lower(frame.args.df or "dmy") local out = "" -- See what's on Wikidata: local entity = mw.wikibase.getEntityObject(qid) if entity and entity.claims then local props = entity.claims["P1661"] if props and props[1] then -- item has Alexa rank property local rank = {} local rankdate = {} for k, v in pairs(props) do local rnk = tonumber(v.mainsnak.datavalue.value.amount) if rnk then rank[#rank+1] = rnk if v.qualifiers and v.qualifiers["P585"] then local rd = v.qualifiers["P585"][1].datavalue.value.time if rd then rankdate[#rank] = rd:sub(2, 11) else -- this shouldn't happen rankdate[#rank] = "! no date !" end else -- we might have to look in references for date if v.references and v.references[1].snaks["P585"] then local rd = v.references[1].snaks["P585"][1].datavalue.value.time if rd then rankdate[#rank] = rd:sub(2, 11) else -- this shouldn't happen rankdate[#rank] = "! no ref !" end else -- no refs or point-in-time rankdate[#rank] = "1952-04-27" end end -- test for qualifiers end -- test for Alexa rank end -- loop through properties -- We have one or more Alexa ranks -- find the last two local now = "1900-01-01" local prev = now local ranknow = rank[1] local rankprev = rank[1] for k, v in ipairs(rankdate) do if v > now then prev = now now = v rankprev = ranknow ranknow = rank[k] end end -- pick the icon to display local icon = "" local alt = "" if ranknow == rankprev then icon = "Steady2.svg" alt = "Same rank (no relative change in site traffic)" elseif ranknow < rankprev then icon = "Decrease Positive.svg" alt = "Lower rank (relative increase in site traffic)" else icon = "Increase Negative.svg" alt = "Higher rank (relative decrease in site traffic)" end -- format the date if datefmt == 'y' then now = now:sub(1, 4) elseif datefmt == 'mdy' then now = i18n.months[tonumber(now:sub(6, 7))] .. " " .. tonumber(now:sub(9, 10)) .. ", " .. now:sub(1, 4) else now = tonumber(now:sub(9, 10)) .. " " .. i18n.months[tonumber(now:sub(6, 7))] .. " " .. now:sub(1, 4) end -- assemble the output out = "[[File:" .. icon .. "|11px|alt=" .. alt .. "|" .. alt .. "|link=]] " .. ranknow .. " (" .. now .. ")" else -- no property on Wikidata out = "No Alexa rank" --nil end -- test for properties elseif args[1] and args[2] and args[3] and args[4] then -- args.url or args[5] should be reference link, args.archive1 or args[6] should be newer archive URL and args.archive2 or args[7] should be older archive URL. alternately parameters could be reordered to sort of encourage archiving the URLs args[1] = mw.ustring.gsub(args[1], "%p", "") args[3] = mw.ustring.gsub(args[3], "%p", "") local icon = "" local alt = "" if args[1] == args[3] then icon = "Steady2.svg" alt = "Same rank (no relative change in site traffic)" elseif args[1] < args[3] then icon = "Decrease Positive.svg" alt = "Lower rank (relative increase in site traffic)" else icon = "Increase Negative.svg" alt = "Higher rank (relative decrease in site traffic)" end out = "[[File:" .. icon .. "|11px|alt=" .. alt .. "|" .. alt .. "|link=]] " .. args[1] .. " (" .. args[2] .. ")" else -- no item on Wikidata out = "No Wikidata item" --nil end -- test for item return out end return p