Module:Person weight
Appearance
| This Lua module is used on approximately 84,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
| This module is rated as beta. It is considered ready for widespread use, but as it is still relatively new, it should be applied with some caution to ensure results are as expected. |
| This module is currently protected from editing. See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected. |
Usage
Intended for use in infoboxes; {{#invoke:person weight|weight|75 kg}} → 75 kg (165 lb). See Template:Infobox person/weight for details.
See also
-- This module implements [[Template:Infobox person/weight]]
local p = {}
local function clean_weight(s)
s = mw.ustring.gsub(s, 'kilogram', 'kg')
s = mw.ustring.gsub(s, 'kgs', 'kg')
s = mw.ustring.gsub(s, 'kg[%.,]', 'kg')
s = mw.ustring.gsub(s, 'pound', 'lb')
s = mw.ustring.gsub(s, 'lbs', 'lb')
s = mw.ustring.gsub(s, 'lb[%.,]', 'lb')
s = mw.ustring.gsub(s, 'stone', 'st')
s = mw.ustring.gsub(s, 'sts', 'st')
s = mw.ustring.gsub(s, 'st[%.,]', 'st')
s = mw.ustring.gsub(s, '%[%[kg%]%]s', '[[Kilogram|kg]]')
s = mw.ustring.gsub(s, '1,(%d%d%d)', '1%1') -- Remove commas from 4 digit numbers up to 1,999
return s
end
local function isnumber(s)
if s then
s = mw.ustring.gsub(s, '%+%s*%d+%s*/%s*%d+%s*$', '')
s = mw.ustring.gsub(s, '%s*[–%-]%s*', '')
return tonumber(s)
end
return nil
end
local function get_convert_weight_args(s, kg_stlb, lb_stlb)
local prefer_m = (prefer or '') == 'm'
local force_m = (enforce or '') == 'm'
local prefer_cm = (prefer or '') == 'cm'
local force_cm = (enforce or '') == 'cm'
unconverted = clean_weight(s or '') -- basic unit cleaning
s = mw.ustring.gsub(unconverted, '&[Nn][Bb][Ss][Pp];', ' ')
local kg = mw.ustring.find(s, 'kg')
local st = mw.ustring.find(s, 'st')
local lb = mw.ustring.find(s, 'lb')
if kg == nil and st == nil and lb == nil then
return '', unconverted
end
if kg ~= nil and st == nil and lb == nil then
local n = mw.ustring.sub(s, 1, kg - 1)
if isnumber(n) then
return {n,'kg',kg_stlb and 'lb stlb' or 'lb',0,['abbr']='on'}, mw.ustring.sub(s, kg+2)
end
return '', unconverted
end
if lb ~= nil and kg == nil and st == nil then
local n = mw.ustring.sub(s, 1, lb - 1)
if isnumber(n) then
return {n,'lb',lb_stlb and 'kg stlb' or 'kg',0,['abbr']='on'}, mw.ustring.sub(s, lb+2)
end
return '', unconverted
end
if st ~= nil and kg == nil and lb == nil then
local n = mw.ustring.sub(s, 1, st - 1)
if isnumber(n) then
return {n,'st','lb kg',0,['abbr']='on'}, mw.ustring.sub(s, st+2)
end
return '', unconverted
end
if lb ~= nil and st ~=nil and kg == nil then
local n1 = mw.ustring.sub(s, 1, st - 1)
local n2 = mw.ustring.sub(s, st+2, lb - 1)
if isnumber(n1) and isnumber(n2) then
return {n1,'st',n2,'lb', 'lb kg',0,['abbr']='on'}, mw.ustring.sub(s, lb+2)
end
return '', unconverted
end
return '', unconverted
end
function convert_weight(frame, args)
local targs, str = get_convert_weight_args(args[1], (args['kg-stlb'] or '') ~= '', (args['lb-stlb'] or '') ~= '')
if type(targs) == 'table' then
return frame:expandTemplate{ title = 'convert', args = targs} .. str
else
return str
end
end
function p.weight(frame)
return convert_weight(frame, frame.args[1] and frame.args or frame:getParent().args)
end
return p