Module

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|,&nbsp;|@@@@|[[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