To add a new WikiWork function, simply add the function to the statistics section of the module and include it in the columns table. Use getCount()
to get the number of articles with a given class and importance. The function must return a number, which will be displayed in the table on User:Happy5214/New WikiWork.
local p = {}
local calculators = {}
-- Global imports
local getArgs = require('Module:Arguments').getArgs
local math = require "Module:Math"
local round = math._precision_format
local concat = table.concat
local format = string.format
local insert = table.insert
-- Statistics
local stats, total
local top, high, mid, low
local fa, a, ga, b, c, start, stub
local taskForce
-- Utility
local function pad(number)
return round(tostring(number), '3')
end
local function getCount(type)
return stats[type] or 0
end
-- Setup
local function setup()
top = getCount(taskForce .. 'topFA') + getCount(taskForce .. 'topA') + getCount(taskForce .. 'topGA') + getCount(taskForce .. 'topB') + getCount(taskForce .. 'topC') + getCount(taskForce .. 'topStart') + getCount(taskForce .. 'topStub')
high = getCount(taskForce .. 'highFA') + getCount(taskForce .. 'highA') + getCount(taskForce .. 'highGA') + getCount(taskForce .. 'highB') + getCount(taskForce .. 'highC') + getCount(taskForce .. 'highStart') + getCount(taskForce .. 'highStub')
mid = getCount(taskForce .. 'midFA') + getCount(taskForce .. 'midA') + getCount(taskForce .. 'midGA') + getCount(taskForce .. 'midB') + getCount(taskForce .. 'midC') + getCount(taskForce .. 'midStart') + getCount(taskForce .. 'midStub')
low = getCount(taskForce .. 'lowFA') + getCount(taskForce .. 'lowA') + getCount(taskForce .. 'lowGA') + getCount(taskForce .. 'lowB') + getCount(taskForce .. 'lowC') + getCount(taskForce .. 'lowStart') + getCount(taskForce .. 'lowStub')
fa = getCount(taskForce .. 'topFA') + getCount(taskForce .. 'highFA') + getCount(taskForce .. 'midFA') + getCount(taskForce .. 'lowFA')
a = getCount(taskForce .. 'topA') + getCount(taskForce .. 'highA') + getCount(taskForce .. 'midA') + getCount(taskForce .. 'lowA')
ga = getCount(taskForce .. 'topGA') + getCount(taskForce .. 'highGA') + getCount(taskForce .. 'midGA') + getCount(taskForce .. 'lowGA')
b = getCount(taskForce .. 'topB') + getCount(taskForce .. 'highB') + getCount(taskForce .. 'midB') + getCount(taskForce .. 'lowB')
c = getCount(taskForce .. 'topC') + getCount(taskForce .. 'highC') + getCount(taskForce .. 'midC') + getCount(taskForce .. 'lowC')
start = getCount(taskForce .. 'topStart') + getCount(taskForce .. 'highStart') + getCount(taskForce .. 'midStart') + getCount(taskForce .. 'lowStart')
stub = getCount(taskForce .. 'topStub') + getCount(taskForce .. 'highStub') + getCount(taskForce .. 'midStub') + getCount(taskForce .. 'lowStub')
total = top + high + mid + low
end
-- Calculators
function constantGenerator(classes, importances, func)
local constants = {}
for class,classValue in pairs(classes) do
for imp,impValue in pairs(importances) do
constants[imp .. class] = func(classValue, impValue)
end
end
return constants
end
function calculators.constant(classes)
local importances = {top=1, high=1, mid=1, low=1}
return constantGenerator(classes, importances, function (class, importance) return class end)
end
function calculators.linear(classes, importances)
return constantGenerator(classes, importances, function (class, importance) return class * importance end)
end
function calculators.exponential(classes, importances)
return constantGenerator(classes, importances, function (class, importance) return class ^ importance end)
end
function sumOfCountsWithConstantMultipliers(constants)
local sum = 0.0
for classImp,multiplier in pairs(constants) do
sum = sum + (multiplier * getCount(taskForce .. classImp))
end
return sum
end
function calculators.sum(constants)
return sumOfCountsWithConstantMultipliers(constants)
end
function calculators.average(constants)
return sumOfCountsWithConstantMultipliers(constants) / total
end
-- Statistics
local function original()
local classes = {FA=0, A=1, GA=2, B=3, C=4, Start=5, Stub=6}
return calculators.sum(calculators.constant(classes))
end
local function originalRelative()
local classes = {FA=0, A=1, GA=2, B=3, C=4, Start=5, Stub=6}
return calculators.average(calculators.constant(classes))
end
local function importanceAdjusted()
local classes = {FA=0, A=1, GA=2, B=3, C=4, Start=5, Stub=6}
local importances = {top=2, high=1.5, mid=1, low=0.5}
return calculators.average(calculators.linear(classes, importances))
end
local function reverseImportanceAdjusted()
local classes = {FA=0, A=1, GA=2, B=3, C=4, Start=5, Stub=6}
local importances = {top=0.5, high=1, mid=1.5, low=2}
return calculators.average(calculators.linear(classes, importances))
end
local function exponentialImportanceAdjusted()
local classes = {FA=0, A=0.25, GA=0.5, B=1, C=2, Start=3, Stub=4}
local importances = {top=4, high=2, mid=1, low=0.5}
return calculators.average(calculators.exponential(classes, importances))
end
---- Ratios
local function importanceRatio()
return (2*top + 1.5*high + 1*mid + 0.5*low) / total
end
local function importanceAdjustedRatio()
return importanceAdjusted() / original()
end
local function reverseImportanceAdjustedRatio()
return reverseImportanceAdjusted() / original()
end
-- Table definitions
local columns = {{"ω", original},
{"Ω", originalRelative},
{"Importance-adjusted WikiWork", importanceAdjusted},
{"Importance ratio", importanceRatio},
{"Exponential importance-adjusted WikiWork", exponentialImportanceAdjusted},
}
function p._row(rowTaskForce)
taskForce = rowTaskForce
setup()
local cells = {}
for k,v in ipairs(columns) do
insert(cells, pad(v[2]()))
end
return '| ' .. concat(cells, ' || ')
end
function p.row(frame)
stats = getArgs(frame)
return p._row('')
end
function p.header(frame)
return p._header()
end
function p._header()
local headers = {}
for k,v in ipairs(columns) do
insert(headers, v[1])
end
return '! ' .. concat(headers, ' !! ')
end
local taskForces = {
"USRD",
"IH",
"USH",
"TRL",
"US66",
"AL",
"AK",
"AZ",
"AR",
"CA",
"CO",
"CT",
"DE",
"DC",
"FL",
"GA",
"HI",
"ID",
"IL",
"IN",
"IA",
"KS",
"KY",
"LA",
"ME",
"MD",
"MA",
"MI",
"MN",
"MS",
"MO",
"MT",
"NE",
"NV",
"NH",
"NJ",
"NM",
"NY",
"NC",
"ND",
"OH",
"OK",
"OR",
"PA",
"RI",
"SC",
"SD",
"TN",
"TX",
"UT",
"VT",
"VA",
"WA",
"WV",
"WI",
"WY",
"GU",
"PR",
"VI",
}
local shields = {
USRD = "USRD logo.svg",
IH = "I-blank.svg",
USH = "US blank.svg",
TRL = "Auto Trails logo.svg",
US66 = "US 66 (CA).svg",
AL = "Alabama blank.svg",
AK = "Alaska blank shield.svg",
AZ = "Arizona blank.svg",
AR = "Arkansas blank.svg",
CA = "California blank.svg",
CO = "Colorado blank.svg",
CT = "Connecticut Highway blank.svg",
DE = "Elongated circle blank 2-digit.svg",
DC = "DC-blank.svg",
FL = "Florida blank.svg",
GA = "Georgia blank.svg",
HI = "HI-blank.svg",
ID = "ID-blank.svg",
IL = "Illinois blank.svg",
IN = "Indiana blank.svg",
IA = "Iowa blank.svg",
KS = "K-blank.svg",
KY = "Elongated circle blank 2-digit.svg",
LA = "Louisiana blank.svg",
ME = "MA Route blank.svg",
MD = "MD blank.svg",
MA = "MA Route blank.svg",
MI = "M-Blank.svg",
MN = "MN-blank.svg",
MS = "Ellipse sign blank.svg",
MO = "MO-blank.svg",
MT = "MT-blank.svg",
NE = "Nebraska state highway marker.svg",
NV = "Nevada blank.svg",
NH = "NH Route blank.svg",
NJ = "Ellipse sign blank.svg",
NM = "New Mexico blank.svg",
NY = "NY-blank.svg",
NC = "NC blank.svg",
ND = "North Dakota blank.svg",
OH = "OH-blank.svg",
OK = "Oklahoma State Highway blank.svg",
OR = "OR blank 2.svg",
PA = "PA-blank2di.svg",
RI = "Rhode Island blank.svg",
SC = "South Carolina blank.svg",
SD = "SD Blank-2d.svg",
TN = "Tennessee blank.svg",
TX = "Texas blank.svg",
UT = "Utah blank.svg",
VT = "Vermont blank border.svg",
VA = "Virginia blank.svg",
WA = "WA-blank.svg",
WV = "WV-blank.svg",
WI = "WIS blank.svg",
WY = "WY-blank.svg",
GU = "Guam Route blank.svg",
PR = "Puerto Rico Highway blank.svg",
VI = "Circle sign blank.svg",
}
local function fullRow(taskForce)
local headerTemplate = '! scope="row" |'
local image = format("[[File:%s|20px|link=]]", shields[taskForce])
local link = taskForce == 'USRD' and '[[WP:USRD|USRD]]' or format("[[WP:USRD/%s|%s]]", taskForce, taskForce)
local separator = '\n|'
local row = {headerTemplate, image, link, separator, p._row(taskForce)}
return concat(row, ' ')
end
function p._wikiwork()
rows = {'{| class="wikitable sortable plainlinks"'}
insert(rows, '! class="unsortable" | Task force\n' .. p._header())
for _,taskForce in ipairs(taskForces) do
insert(rows, fullRow(taskForce))
end
insert(rows, '|}')
return concat(rows, "\n|-\n")
end
function p.wikiwork(frame)
stats = getArgs(frame)
return p._wikiwork()
end
return p