Module:Dynamic

local p = {} --❗ Year, month and day to date of birth conversion local function calculateAg(dateString) local day, month, year = dateString:match("(%d+)/(%d+)-(%d+)") if not year then day, month, year = dateString:match("(%d+)-(%d+)/(%d+)") end if not year then day, month, year = dateString:match("(%d+)-(%d+)-(%d+)") end if not year then day, month, year = dateString:match("(%d+).(%d+).(%d+)") end if not year then day, month, year = dateString:match("(%d+)/(%d+)/(%d+)") end if not year then day, month, year = dateString:match("(%d+).(%d+)/(%d+)") end if not year then day, month, year = dateString:match("(%d+)/(%d+).(%d+)") end if not year then day, month, year = dateString:match("(%d+).(%d+)-(%d+)") end if not year then day, month, year = dateString:match("(%d+)-(%d+).(%d+)") end

if year and month and day then local currentDate = os.date("*t") local age = currentDate.year - tonumber(year) if currentDate.month < tonumber(month) or (currentDate.month == tonumber(month) and currentDate.day < tonumber(day)) then age = age - 1 end local monthName = os.date("%B", os.time{year=tonumber(year), month=tonumber(month), day=tonumber(day)}) return " ".. monthName .. " "..day.."th, " .. year.. " (Age " .. age.. ")" else local result =" ⚠️ Invalid date format!" result =result:gsub("%d", "").. "".. " ⚠️Invalid date format" return result end end

--❗ --Volume conversions local function litersToGallons(liters) local litersValue = tonumber(liters:match("%d+%.?%d*")) if litersValue then local gallons = litersValue * 0.264172 return "".. string.format("%.2f liters (%.2f gallons)", litersValue, gallons) end return liters end

local function gallonsToLiters(gallons) local gallonsValue = tonumber(gallons:match("%d+%.?%d*")) if gallonsValue then local liters = gallonsValue * 3.78541 return string.format("%.2f gallons (%.2f liters)", gallonsValue, liters) end return gallons end

local function cubicMetersToCubicFeet(cubicMeters) local cubicMetersValue = tonumber(cubicMeters:match("%d+%.?%d*")) if cubicMetersValue then local cubicFeet = cubicMetersValue * 35.3147 return string.format("%.2f cubic meters (%.2f cubic feet)", cubicMetersValue, cubicFeet) end return cubicMeters end

local function cubicFeetToCubicMeters(cubicFeet) local cubicFeetValue = tonumber(cubicFeet:match("%d+%.?%d*")) if cubicFeetValue then local cubicMeters = cubicFeetValue * 0.0283168 return string.format("%.2f cubic feet (%.2f cubic meters)", cubicFeetValue, cubicMeters) end return cubicFeet end

-- Area conversions local function squareMetersToSquareFeet(squareMeters) local squareMetersValue = tonumber(squareMeters:match("%d+%.?%d*")) if squareMetersValue then local squareFeet = squareMetersValue * 10.7639 return string.format("%.2f square meters (%.2f square feet)", squareMetersValue, squareFeet) end return squareMeters end

local function squareFeetToSquareMeters(squareFeet) local squareFeetValue = tonumber(squareFeet:match("%d+%.?%d*")) if squareFeetValue then local squareMeters = squareFeetValue * 0.092903 return string.format("%.2f square feet (%.2f square meters)", squareFeetValue, squareMeters) end return squareFeet end

local function hectaresToAcres(hectares) local hectaresValue = tonumber(hectares:match("%d+%.?%d*")) if hectaresValue then local acres = hectaresValue * 2.47105 return string.format("%.2f hectares (%.2f acres)", hectaresValue, acres) end return hectares end

local function acresToHectares(acres) local acresValue = tonumber(acres:match("%d+%.?%d*")) if acresValue then local hectares = acresValue * 0.404686 return string.format("%.2f acres (%.2f hectares)", acresValue, hectares) end return acres end

-- Time conversions local function hoursToMinutes(hours) local hoursValue = tonumber(hours:match("%d+%.?%d*")) if hoursValue then local minutes = hoursValue * 60 return string.format("%.2f hours (%d minutes)", hoursValue, minutes) end return hours end

local function minutesToHours(minutes) local minutesValue = tonumber(minutes:match("%d+%.?%d*")) if minutesValue then local hours = minutesValue / 60 local decimalPart = minutes:match("%.(%d+)") if decimalPart then hours = hours + tonumber("0." .. decimalPart) end return string.format("%.2f minutes (%.2f hours)", minutesValue, hours) end return minutes end

local function daysToHours(days) local daysValue = tonumber(days:match("%d+%.?%d*")) if daysValue then local hours = daysValue * 24 return string.format("%.2f days (%d hours)", daysValue, hours) end return days end

local function hoursToDays(hours) local hoursValue = tonumber(hours:match("%d+%.?%d*")) if hoursValue then local days = hoursValue / 24 return string.format("%.2f hours (%.2f days)", hoursValue, days) end return hours end

-- Energy conversions local function joulesToCalories(joules) local joulesValue = tonumber(joules:match("%d+%.?%d*")) if joulesValue then local calories = joulesValue * 0.000239006 return string.format("%.2f joules (%.6f calories)", joulesValue, calories) end return joules end

local function caloriesToJoules(calories) local caloriesValue = tonumber(calories:match("%d+%.?%d*")) if caloriesValue then local joules = caloriesValue / 0.000239006 return string.format("%.2f calories (%.2f joules)", caloriesValue, joules) end return calories end

local function kilowattHoursToJoules(kWh) local kWhValue = tonumber(kWh:match("%d+%.?%d*")) if kWhValue then local joules = kWhValue * 3600000 return string.format("%.2e kWh (%.2e joules)", kWhValue, joules) end return kWh end

local function joulesToKilowattHours(joules) local joulesValue = tonumber(joules:match("%d+%.?%d*")) if joulesValue then local kWh = joulesValue / 3600000 return string.format("%.2e joules (%d kWh)", joulesValue, kWh) end return joules end

-- 🔴Pressure conversions local function pascalsToPSI(pascals) local pascalsValue = tonumber(pascals:match("%d+")) if pascalsValue then local psi = pascalsValue * 0.000145038 return string.format("%d pascals (%.6f PSI)", pascalsValue, psi) end return pascals end

local function psiToPascals(psi) local psiValue = tonumber(psi:match("%d+")) if psiValue then local pascals = psiValue / 0.000145038 return string.format("%.6f PSI (%d pascals)", psiValue, pascals) end return psi end

local function atmospheresToPascals(atmospheres) local atmospheresValue = tonumber(atmospheres:match("%d+")) if atmospheresValue then local pascals = atmospheresValue * 101325 return string.format("%d atmospheres (%d pascals)", atmospheresValue, pascals) end return atmospheres end

local function pascalsToAtmospheres(pascals) local pascalsValue = tonumber(pascals:match("%d+")) if pascalsValue then local atmospheres = pascalsValue / 101325 return string.format("%d pascals (%.6f atmospheres)", pascalsValue, atmospheres) end return pascals end

-- Frequency conversions local function hertzToRPM(hertz) local hertzValue = tonumber(hertz:match("%d+")) if hertzValue then local rpm = hertzValue * 60 return string.format("%d Hertz (%d RPM)", hertzValue, rpm) end return hertz end

local function rpmToHertz(rpm) local rpmValue = tonumber(rpm:match("%d+")) if rpmValue then local hertz = rpmValue / 60 return string.format("%d RPM (%.2f Hertz)", rpmValue, hertz) end return rpm end

local function kilohertzToHertz(kHz) local kHzValue = tonumber(kHz:match("%d+")) if kHzValue then local hertz = kHzValue * 1000 return string.format("%d kHz (%d Hertz)", kHzValue, hertz) end return kHz end

local function hertzToKilohertz(hertz) local hertzValue = tonumber(hertz:match("%d+")) if hertzValue then local kHz = hertzValue / 1000 return string.format("%d Hertz (%.2f kHz)", hertzValue, kHz) end return hertz end

-- Power conversions local function wattsToHorsepower(watts) local wattsValue = tonumber(watts:match("%d+")) if wattsValue then local horsepower = wattsValue * 0.00134102 return string.format("%d watts (%.6f horsepower)", wattsValue, horsepower) end return watts end

local function horsepowerToWatts(horsepower) local horsepowerValue = tonumber(horsepower:match("%d+")) if horsepowerValue then local watts = horsepowerValue / 0.00134102 return string.format("%.6f horsepower (%d watts)", horsepowerValue, watts) end return horsepower end

local function megawattsToHorsepower(megawatts) local megawattsValue = tonumber(megawatts:match("%d+")) if megawattsValue then local horsepower = megawattsValue * 1341.02 return string.format("%d megawatts (%.2f horsepower)", megawattsValue, horsepower) end return megawatts end

local function horsepowerToMegawatts(horsepower) local horsepowerValue = tonumber(horsepower:match("%d+")) if horsepowerValue then local megawatts = horsepowerValue / 1341.02 return string.format("%.2f horsepower (%d megawatts)", horsepowerValue, megawatts) end return horsepower end

--❗ local function ftToCm(ft) local ftValue = tonumber(ft:match("%d+%.?%d*")) if ftValue then local cm = ftValue * 30.48 return string.format("%.2f ft (%.2f cm)", ftValue, cm) end return ft end

local function cmToFeetAndInches(cm) local cmValue = tonumber(cm:match("%d+%.?%d*")) if cmValue then local totalInches = cmValue / 2.54 local feet = math.floor(totalInches / 12) local inches = math.floor(totalInches % 12) return string.format("%.2f cm (%d feet %d inches)", cmValue, feet, inches) end return cm end

local function mphToKmh(mph) local mphValue = tonumber(mph:match("%d+%.?%d*")) if mphValue then local kmh = mphValue * 1.60934 return string.format("%.2f mph (%.2f km/h)", mphValue, kmh) end return mph end

local function kmhToMph(kmh) local kmhValue = tonumber(kmh:match("%d+%.?%d*")) if kmhValue then local mph = kmhValue / 1.60934 return string.format("%.2f km/h (%.2f mph)", kmhValue, mph) end return kmh end

local function kmToMi(km) local kmValue = tonumber(km:match("%d+%.?%d*")) if kmValue then local miles = kmValue * 0.621371 return string.format("%.2f km (%.2f mi)", kmValue, miles) end return km end

local function miToKm(mi) local miValue = tonumber(mi:match("%d+%.?%d*")) if miValue then local km = miValue / 0.621371 return string.format("%.2f miles (%.2f km)", miValue, km) end return mi end

local function hpToKw(hp) local hpValue = tonumber(hp:match("%d+%.?%d*")) if hpValue then local kw = hpValue * 0.735499 return string.format("%.2f horsepower (%.2f kW)", hpValue, kw) end return hp end

local function kwToHp(kw) local kwValue = tonumber(kw:match("%d+%.?%d*")) if kwValue then local hp = kwValue / 0.735499 return string.format("%.2f Kilowatt(%.2f hp)", kwValue, hp) end return kw end

local function lbToKg(lb) local lbValue = tonumber(lb:match("%d+%.?%d*")) if lbValue then local kg = lbValue * 0.453592 return string.format("%.2f lb (%.2f kg)", lbValue, kg) end return lb end

local function kgToPounds(kg) --local kgValu = tonumber(kg:match("%d+")) local kgValue = tonumber(kg:match("%d+%.?%d*")) if kgValue>1 then local pounds = kgValue * 2.20462 return string.format("%.2f kgs (%.2f pounds)", kgValue, pounds) else local pounds = kgValue * 2.20462 return string.format("%.2f kg (%.2f pounds)", kgValue, pounds) end return kg end

local function mmToInches(mm) local mmValue = tonumber(mm:match("%d+%.?%d*")) if mmValue then local inches = mmValue * 0.0393701 return string.format("%.2f mm (%.2f inches)", mmValue, inches) end return mm end

local function inchesToMm(inches) local inchesValue = tonumber(inches:match("%d+%.?%d*")) if inchesValue then local mm = inchesValue / 0.0393701 return string.format("%.2f inches (%.2f mm)", inchesValue, mm) end return inches end

local function msToFts(ms) local msValue = tonumber(ms:match("%d+%.?%d*")) if msValue then local fts = msValue * 3.28084 return string.format("%.2f m/s(%.2f ft/s)", msValue, fts) end return ms end

local function ftsToMs(fts) local ftsValue = tonumber(fts:match("%d+%.?%d*")) if ftsValue then local ms = ftsValue / 3.28084 return string.format("%.2f ft/s(%.2f m/s)", ftsValue, ms) end return fts end

local function mToFeet(m) local mValue = tonumber(m:match("%d+%.?%d*")) if mValue then local feet = mValue * 3.28084 return string.format("%.2f meter (%.2f ft)", mValue, feet) end local mValueAlt = tonumber(m:match("(%d+%.?%d*)%s*[mM]")) if mValueAlt then local feetAlt = mValueAlt * 3.28084 return string.format("%.2f m (%.2f ft)", mValueAlt, feetAlt) end local mValueAlt2 = tonumber(m:match("(%d+%.?%d*)%s*[mM][eE][tT][eE]?[rR]?")) if mValueAlt2 then local feetAlt2 = mValueAlt2 * 3.28084 return string.format("%.2f metre (%.2f ft)", mValueAlt2, feetAlt2) end local mValueAlt3 = tonumber(m:match("(%d+%.?%d*)%s*[mM][eE][tT][eE][rR]?")) if mValueAlt3 then local feetAlt3 = mValueAlt3 * 3.28084 return string.format("%.2f meter (%.2f ft)", mValueAlt3, feetAlt3) end return m end --//m///

local function celsiusToFahrenheit(c) local cValue = tonumber(c:match("%d+")) if cValue then local fahrenheit = cValue * 9/5 + 32 return string.format("%.2f°C (%.2f°F)", cValue, fahrenheit) end return c end

local function fahrenheitToCelsius(f) local fValue = tonumber(f:match("%d+")) if fValue then local celsius = (fValue - 32) * 5/9 return string.format("%.2f°F (%.2f°C)", fValue, celsius) end return f end function capitalizeFirstLetter(str) return str:gsub("^%l", string.upper) end

function p.infinite(frame) local args = frame:getParent.args local output = " \n" -- local firstDescriptionFound = false local cmProcessed = false local abvParams = {} -- 🟢 storing th abv parameters separately local abvProcessed = false local upProcessed = false

local values = {} for key, value in pairs(args) do   if key:sub(1, 2) == 'up' and value ~= "" then table.insert(values, {key = key, value = value}) end end table.sort(values, function(a, b) return a.key < b.key end) for _, entry in ipairs(values) do   local key = entry.key local value = entry.value output = output .. ' ' .. value .. '\n \n' end

if args.image then local caption = args.caption or "" local imagesize = args.imagesize or "" output = output .. '|' ..' '.. args.image.. ' '..'' .. caption .. ' \n|-\n' end --/// local values = {} for key, value in pairs(args) do   if key == key and value ~= "" then table.insert(values, {key = key, value = value}) end end

--❗ Insertion Sort algorithm for i = 2, #values do   local current = values[i] local j = i - 1 while j > 0 and values[j].key > current.key do       values[j + 1] = values[j] j = j - 1 end values[j + 1] = current end

for _, entry in ipairs(values) do   local key = entry.key local value = entry.value local modified_key = key:gsub("^[%d]*", "") local found_alpha =false for i = 1, #modified_key do if modified_key:sub(i, i):match("%a") then modified_key = modified_key:sub(1, i - 1) .. modified_key:sub(i, i):upper .. modified_key:sub(i + 1) found_alpha = true break end end if not found_alpha then modified_key = modified_key:gsub("^.", string.upper, 5) end

if key ~= 'image' and key ~= 'imagecaption' and key~="" and key ~= 'caption' and key ~= 'headcolor' and key ~= 'color' and key~='header' and not key:match("^abv%d+$")and not key:match("^up%d+$") and key~=abvParams then if key ~= 'up' and not (key:sub(1, 2) == 'up' and upProcessed) and key ~= 'abv' and not abvProcessed then --if key ~= 'up' and not (key:sub(1, 2) == 'up' and upProcessed) then if key ~= 'abv' and not (key:sub(1, 3) == 'abv' and abvProcessed) then --//m local convertedValue = value local originalValue = value if not cmProcessed and (value:match("%s*cm#%s*")or value:match("%s*centimeters#%s*")or value:match("%s*centimetres#%s*") or value:match("%s*centimeter#%s*") or value:match("%s*centimetre#%s*")) then -- If centimeters conversion not done yet, do it here --cmProcessed = true convertedValue = cmToFeetAndInches(value) end --/////❗                 if type(value) == "string" then if value:match("%d+%d+%d+[/.,~]") then local ag = calculateAg(value) if ag then value = value:gsub("(%d+%d+%d+)[/.,~]", "%1"..ag) end end value = value:gsub("(%d+[/.,-]%d+[/.,-]%d+)", "") if value:match("%s*cm%W%s*")or value:match("%s*centimeters#%s*")or value:match("%s*centimetres#%s*") or value:match("%s*centimeter#%s*") or value:match("%s*centimetre#%s*")  then convertedValue = cmToFeetAndInches(value).."" elseif value:match("%s*kg%W%s*") or value:match("%s*kgs#%s*")or value:match("%s*kilograms#%s*") or value:match("%s*kilogram#%s*") then convertedValue = kgToPounds(value) elseif value:match("%s*mph#%s*")or value:match("%s*mp/h#%s*")or value:match("%s*miles per hour#%s*")or value:match("%s*mile per hour#%s*") then convertedValue = mphToKmh(value) elseif value:match("%s*kmh#%s*")or value:match("%s*km/h#%s*")or value:match("%s*kilometers per hour#%s*")or value:match("%s*kilometer per hour#%s*")or value:match("%s*kilometres per hour#%s*")or value:match("%s*kilometre per hour#%s*") then convertedValue = kmhToMph(value) elseif value:match("%s*kms#%s*")or value:match("%s*km#%s*")or value:match("%s*kilometer#%s*")or value:match("%s*kilometers#%s*")or value:match("%s*kilometre#%s*")or value:match("%s*kilometres#%s*") then convertedValue = kmToMi(value) elseif value:match("%s*mi#%s*")or value:match("%s*mile#%s*")or value:match("%s*miles#%s*") then convertedValue = miToKm(value) elseif value:match("%s*hp#%s*")or value:match("%s*hps#%s*")or value:match("%s*horsepower#%s*")or value:match("%s*horsepowers#%s*") then convertedValue = hpToKw(value) elseif value:match("%s*kw#%s*")or value:match("%s*kws#%s*")or value:match("%s*kilowatt#%s*")or value:match("%s*kilowatts#%s*") then convertedValue = kwToHp(value)                   elseif value:match("%s*ft#%s*") then                                          elseif value:match("%s*lb#%s*")or value:match("%s*pound#%s*")or value:match("%s*pounds#%s*") then convertedValue = lbToKg(value) elseif value:match("%s*mmms#%s*")or value:match("%s*mm#%s*")or value:match("%s*millimeter#%s*")or value:match("%s*millimetre#%s*")or value:match("%s*millimeters#%s*")or value:match("%s*millimetres#%s*") then convertedValue = mmToInches(value) elseif value:match("%s*in#%s*")or value:match("%s*ins#%s*")or value:match("%s*inch#%s*")or value:match("%s*inche#%s*")or value:match("%s*inches#%s*") then convertedValue = inchesToMm(value) elseif value:match("%s*ms#%s*")or value:match("%s*millisecond#%s*")or value:match("%s*milliseconds#%s*") then convertedValue = msToFts(value) elseif value:match("%s*fts#%s*")or value:match("%s*ft/s#%s*")or value:match("%s*fps#%s*")or value:match("%s*footperseconds#%s*") then convertedValue = ftsToMs(value) elseif value:match("%s*°c#%s*") or value:match("%s*celsius#%s*") or value:match("%s*Celsius#%s*") then convertedValue = celsiusToFahrenheit(value) elseif value:match("%s*°f#%s*") or value:match("%s*fahrenheit#%s*") then convertedValue = fahrenheitToCelsius(value) --❗                        elseif value:match("%s*liters#%s*")or value:match("%s*litres#%s*")or value:match("%s*litre#%s*")or value:match("%s*liter#%s*") then convertedValue = litersToGallons(value) elseif value:match("%s*gallons#%s*")or value:match("%s*gallon#%s*") then convertedValue = gallonsToLiters(value) elseif value:match("%s*m³#%s*")or value:match("%s*m3#%s*")or value:match("%s*cubicmeters#%s*")or value:match("%s*cubicmetres#%s*")or value:match("%s*cubicmetre#%s*")or value:match("%s*cubicmeter#%s*") then convertedValue = cubicMetersToCubicFeet(value) elseif value:match("%s*ft³#%s*")or value:match("%s*ft3#%s*")or value:match("%s*cubicfeet#%s*")or value:match("%s*cubicfoot#%s*")or value:match("%s*cubicfeets#%s*")or value:match("%s*cubicfoots#%s*") then convertedValue = cubicFeetToCubicMeters(value)                                        elseif value:match("%s*sqm#%s*")or value:match("%s*sqms#%s*")or value:match("%s*sqmetre#%s*")or value:match("%s*sqmetres#%s*")or value:match("%s*squaremeter#%s*")or value:match("%s*squaremeters#%s*")or value:match("%s*sqmeter#%s*")or value:match("%s*sqmeters#%s*") then convertedValue = squareMetersToSquareFeet(value) elseif value:match("%s*sqft#%s*")or value:match("%s*sqfoot#%s*")or value:match("%s*sqfeet#%s*")or value:match("%s*squarefoots#%s*")or value:match("%s*squarefeets#%s*")or value:match("%s*squarefeet#%s*") then convertedValue = squareFeetToSquareMeters(value) elseif value:match("%s*hectares#%s*")or value:match("%s*hectare#%s*") then convertedValue = hectaresToAcres(value) elseif value:match("%s*acres#%s*")or value:match("%s*acre#%s*") then convertedValue = acresToHectares(value) elseif value:match("%s*hours#%s*")or value:match("%s*hour#%s*") then convertedValue = hoursToMinutes(value) elseif value:match("%s*minutes#%s*")or value:match("%s*minute#%s*") then convertedValue = minutesToHours(value) elseif value:match("%s*days#%s*")or value:match("%s*day#%s*") then convertedValue = daysToHours(value) elseif value:match("%s*joules#%s*")or value:match("%s*joule#%s*") then convertedValue = joulesToCalories(value) elseif value:match("%s*calories#%s*")or value:match("%s*calorie#%s*") then convertedValue = caloriesToJoules(value) elseif value:match("%s*kwh#%s*")or value:match("%s*kilowatthours#%s*")or value:match("%s*kilowatthour#%s*") then convertedValue = kilowattHoursToJoules(value) elseif value:match("%s*psi#%s*")or value:match("%s*pounds per square inch#%s*")or value:match("%s*pound per square inches#%s*") then convertedValue = psiToPascals(value) elseif value:match("%s*pascals#%s*")or value:match("%s*pascal#%s*") then convertedValue = pascalsToPsi(value) elseif value:match("%s*atm#%s*")or value:match("%s*atmospheres#%s*")or value:match("%s*atmosphere#%s*") then convertedValue = atmospheresToPascals(value) elseif value:match("%s*rpm#%s*") then convertedValue = rpmToHertz(value) elseif value:match("%s*kilohertz#%s*")or value:match("%s*khz#%s*") then convertedValue = kilohertzToHertz(value) elseif value:match("%s*hertz#%s*") then convertedValue = hertzToRPM(value) elseif value:match("%s*horsepower#%s*") then convertedValue = horsepowerToWatts(value) elseif value:match("%s*megawatts#%s*") or value:match("%s*megawatt#%s*")then convertedValue = megawattsToHorsepower(value) elseif value:match("%s*watts#%s*") or value:match("%s*watt#%s*")then convertedValue = wattsToHorsepower(value) elseif value:match("%s*hp#%s*") then convertedValue = horsepowerToMegawatts(value) elseif value:match("%s*m#%s*")or value:match("%s*meters#%s*")or value:match("%s*metres#%s*")or value:match("%s*meter#%s*")or value:match("%s*metre#%s*") then convertedValue = mToFeet(value) elseif value:match("%s*ft%W%s*") or value:match("%s*feet%P%s*")or value:match("%s*feets%P%s*")or value:match("%s*foot%P%s*")or value:match("%s*foots%P%s*") then convertedValue = ftToCm(value) end --The output point 😎 output = output .. '| style="font-size:15px; font-weight:bolder;padding-right:1em;" | ' ..modified_key.. "\n" if originalValue ~= convertedValue then output = output .. '| '..convertedValue.. '\n|-\n' else output = output .. '| ' .. value .. '\n|-\n' end end end end end end

local values = {}

for key, value in pairs(args) do   if key:sub(1, 3) == 'abv' and value ~= "" then table.insert(values, {key = key, value = value, position = mw.ustring.match(key, "%d+")}) end end

table.sort(values, function(a, b) return tonumber(a.position) < tonumber(b.position) end)

for _, entry in ipairs(values) do   local key = entry.key local value = entry.value output = output .. '| style="background:lightgray;font-size:20px;text-align:center;background-color:' .. (args.abvheadcolor or "#f2f2f2") .. ';color:' .. (args.abvcolor or "inherit") .. ';font-weight:bold;" | ' .. value .. '\n|-\n' end

output = output .. ' \n' return output end

return p