Module:Utils
From WikiApiary, monitoring the MediaWiki universe
Documentation for this module may be created at Module:Utils/doc
local p = {}
function p.getHostFromURL( frame )
s = frame.args[1]
return (s.."/"):match("://(.-)[:/]")
end
function p.stripAPIURL( frame )
s = frame.args[1]
return s:match("https?://(.+)")
end
function p.getBranchNumber( frame )
s = frame.args[1]
return s:match("%.(%d+)")
end
--[=[ replacing
{{#if:{{{Type|}}}
|<!--extension type provided, use it-->{{#arraymap:{{{Type|}}}|,|@@@@|[[Has extension type::@@@@]]}}
|<!--no extension type provided, find what the wiki knows-->{{#arraydefine:extension_types
|{{#ask:[[Has extension::{{FULLPAGENAME}}]] [[Has extension type::+]] [[Has website::+]]
|?Has extension type
|format=array
|limit=1000
|link=none
|sort=Has extension type
|headers=hide
|mainlabel=-
|sep=,
|manysep=,
}}
| , |sort=asc, unique
}}{{#arrayprint:extension_types|, |@@@@|[[Has extension type::@@@@]]}} }}
--]=]
function p.getDataFromWiki(frame)
local parent = frame:getParent()
local default = mw.text.trim(frame.args.default or parent.args.default or '')
local prop = mw.text.trim(frame.args.prop or parent.args.prop)
local page = frame.args.page or parent.args.page or mw.title.getCurrentTitle().prefixedText
local format = mw.text.unstripNoWiki( frame.args.format or parent.args.format or '[[' .. prop .. '::@@@@]]' )
mw.log(format)
local sep = frame.args.sep or parent.args.sep or ', '
local results = {}
if default ~= '' then
results = mw.text.split( default, ',%s*' )
else
local count = 1
local query = {
'[[' .. prop .. '::+]]',
'[[Has extension::' .. page .. ']]',
'[[Has website::+]]',
'?' .. prop .. '=prop',
'mainlabel=-',
sort = prop,
order = 'asc',
limit = 1
}
qr = mw.smw.ask( query )
while qr ~= nil and #qr >= 1 and count < 25 do
count = count + 1
if type(qr[1].prop) == 'table' then
-- FIXME, i don't know how to do query operations on props with multiple values
query.sort = 'Has branch number,Has extension version'
query.order = 'desc,desc'
qr = mw.smw.ask( query )
for j = 1, #qr[1].prop do
results[#results+1] = qr[1].prop[j]
end
break -- fixme
end
results[#results+1] = qr[1].prop
query[1] = ' [[' .. prop .. '::>>' .. qr[1].prop .. ']]'
qr = mw.smw.ask( query )
end
end
local out = ''
for i = 1, #results do
out = out .. format:gsub('@@@@', results[i])
if i ~= #results then
out = out .. sep
end
end
return frame:preprocess( out )
end
local function getCount( extensionName, extensionVersion, mwVersion )
local query = {
'[[Has extension::Extension:'..extensionName..']]',
'[[Has extension version::' .. extensionVersion .. ']]',
'[[Has branch number::' .. mwVersion ..']]',
'[[Has extension version::!~*MLEB*]]',
'?Has extension version=extVersion',
'?Has branch number=mwVersion',
'sort=Has branch number,Has extension version',
'order=desc,desc',
'mainlabel=-',
'format=count'
}
return mw.smw.ask( query )
end
-- Hopefully more efficient to get all the labels and count them separately.
local function getVersions(extensionName)
local extVer = {}
local query = {
'[[Has extension::Extension:'..extensionName..']]',
'[[Has extension version::!~*MLEB*]]',
'?Has extension version=extVersion',
'?Has branch number=mwVersion',
'sort=Has branch number,Has extension version',
'order=desc,desc',
'mainlabel=-'
}
query.limit = 1
local result = mw.smw.ask( query )
local count = 1
local outerCount = 1
local allExtVersions = {}
local allMWVersions = {}
query[8] = ''
while result ~= nil and #result > 0 and outerCount < 20 do
outerCount = outerCount + 1
if extVer[result[1].extVersion] == nil then
extVer[result[1].extVersion] = {}
end
extVer[result[1].extVersion][result[1].mwVersion] = getCount( extensionName, result[1].extVersion, result[1].mwVersion )
allExtVersions[result[1].extVersion] = true
allMWVersions[result[1].mwVersion] = true
local extVersion = result[1].extVersion
repeat
count = count+1
query[9] = '[[Has branch number::<<' .. result[1].mwVersion .. ']]'
result = mw.smw.ask( query )
if result == nil or #result == 0 or result[1].extVersion ~= extVersion then
break
end
extVer[result[1].extVersion][result[1].mwVersion] = getCount( extensionName, result[1].extVersion, result[1].mwVersion )
allExtVersions[result[1].extVersion] = true -- not strictly needed
allMWVersions[result[1].mwVersion] = true
until #result < 0 or count > 40
query[8] = '[[Has extension version::<<' .. extVersion .. ']]'
query[9] = nil
result = mw.smw.ask( query )
end
return extVer, allExtVersions, allMWVersions
end
p.g = getVersions
function p.getExtensionVersions( frame )
extensionName = frame.args[1]
local extVersions = getVersions(extensionName)
local counts, extVersions, mwVersions = getVersions(extensionName)
local extKeys = {}
for k in pairs(extVersions) do
table.insert(extKeys, k)
end
table.sort(extKeys)
local mwKeys = {}
for k in pairs(mwVersions) do
table.insert(mwKeys, k)
end
table.sort(mwKeys)
local output = '\n{| width=80% class="wikitable sortable"\n' ..
'|+ Version Breakdown for [[Extension:' .. extensionName .. '|' .. extensionName .. ']]\n' ..
'! Versions\n'
local columnCount = 1
for column = #extKeys, 1, -1 do
output = output .. '!' .. extKeys[column] .. '\n'
columnCount = columnCount + 1
if columnCount > 10 then
break
end
end
local rowCount = 1
for row = #mwKeys, 1, -1 do
output = output .. '|-\n'
output = output .. '! 1.' .. mwKeys[row] .. '\n'
columnCount = 1
for column = #extKeys, 1, -1 do
if counts[extKeys[column]] and counts[extKeys[column]][mwKeys[row]] then
result = counts[extKeys[column]][mwKeys[row]]
else
result = ''
end
output = output .. '|' .. result .. '\n'
columnCount = columnCount + 1
if columnCount > 10 then
break
end
end
rowCount = rowCount + 1
if rowCount > 20 then
break
end
end
output = output .. '|}\n'
return output
end
return p