« Module:Unité » : différence entre les versions

De Lagny-sur-Marne Wiki
Aller à la navigation Aller à la recherche
0x010D (discussion | contributions)
retouche de la modification précédente
0x010D (discussion | contributions)
retouche de la modification précédente : échappement tiret dans les regex
Ligne 30 : Ligne 30 :
:gsub( '^\226\136\147', '-' ) -- U+2212
:gsub( '^\226\136\147', '-' ) -- U+2212
if nombre:match( '^-?[%d., \194\160]*%d$' ) then
if nombre:match( '^%-?[%d., \194\160]*%d$' ) then
-- suppression espaces et espaces insécables
-- suppression espaces et espaces insécables
nombre = nombre:gsub( ' ', '' ):gsub( '\194\160', '' )
nombre = nombre:gsub( ' ', '' ):gsub( '\194\160', '' )
Ligne 63 : Ligne 63 :
end
end
local moins, entier, fraction = num:match( '^(-?)(%d+)%.?(%d*)$' )
local moins, entier, fraction = num:match( '^(%-?)(%d+)%.?(%d*)$' )
if not entier then
if not entier then
return num
return num
Ligne 89 : Ligne 89 :
return p._formatNum( num )
return p._formatNum( num )
elseif type( num ) == 'string' then
elseif type( num ) == 'string' then
return num:gsub( '-?%d*%.?%d+', p.formatNombre )
return num:gsub( '%-?%d*%.?%d+', p.formatNombre )
end
end
end
end
Ligne 100 : Ligne 100 :
if trim( texte ) then
if trim( texte ) then
local result
local result
local nombre = texte:match( '^-?%f[%d][%d., \194\160]+%f[%D]' ) or false
local nombre = texte:match( '^%-?%f[%d][%d., \194\160]+%f[%D]' ) or false
if nombre then
if nombre then
texte = texte:sub( nombre:len() + 1 )
texte = texte:sub( nombre:len() + 1 )
end
end
result = { nombre }
result = { nombre }
local e = texte:match( '^%s*[x\195]\151?10e(-?%d+)' ) or texte:match( '^%s*e(-?%d+)' )
local e = texte:match( '^%s*[x\195]\151?10e(%-?%d+)' ) or texte:match( '^%s*e(%-?%d+)' )
-- \195\151 = × (signe multiplier)
if e then
if e then
table.insert( result, '10' )
table.insert( result, '10' )
table.insert( result, e )
table.insert( result, e )
texte = texte:gsub( '^[%sx10]*e-?%d+', '' )
texte = texte:gsub( '^[%sx×10]*e%-?%d+', '' )
end
end
for unit, exp in mw.ustring.gmatch( texte, '%s*%.?([%a/]+)(-?%d*)' ) do
texte = texte:gsub( '⋅', '.' )
for unit, exp in mw.ustring.gmatch( texte, '%s*%.?([%a/]+)(%-?%d*)' ) do
table.insert( result, unit )
table.insert( result, unit )
table.insert( result, exp )
table.insert( result, exp )
Ligne 130 : Ligne 132 :
-- remplacement des signes moins par des tirets pour facilité les traitements ultérieurs
-- remplacement des signes moins par des tirets pour facilité les traitements ultérieurs
if nombre then
if nombre then
nombre = nombre:gsub( '−%f[d]', '-')  -- U+2212
nombre = nombre:gsub( '%−%f[d]', '-')  -- U+2212
:gsub( '−%f[d]', '-')  -- html −
:gsub( '−%f[d]', '-')  -- html −
:gsub( '\226\128[\146-\147]%f[d]', '-') -- U+2212, U+2213 (tiret numérique et demi-cadratin)
:gsub( '\226\128[\146\147]%f[d]', '-') -- U+2212, U+2213 (tiret numérique et demi-cadratin)
end
end
Ligne 142 : Ligne 144 :
if nombre then
if nombre then
nombre = nombre:gsub( '-?%f[%d][%d., \194\160]+%f[%D]', p.formatNombre )
nombre = nombre:gsub( '%-?%f[%d][%d., \194\160]+%f[%D]', p.formatNombre )
table.insert( wiki, nombre )
table.insert( wiki, nombre )
sep = '\194\160'
sep = '\194\160'
Ligne 167 : Ligne 169 :
exp = trim( args[ 2 * i + 1 ] )
exp = trim( args[ 2 * i + 1 ] )
if exp then
if exp then
table.insert( wiki, '<sup>' .. exp:gsub( '-', '−' ) .. '</sup>' )
table.insert( wiki, '<sup>' .. exp:gsub( '%-', '−' ) .. '</sup>' )
end
end
i = i + 1
i = i + 1

Version du 16 avril 2015 à 12:51

local p = { }

--- Copie de Outils.trim acceptant les nombres. local function trim( texte ) if type( texte ) == 'string' then texte = texte:gsub( '^%s*(.*)%f[%s]%s*$', '%1' ) if texte ~= then return texte end elseif type( texte ) == 'number' then return tostring( texte ) end end

--- -- parseNum transforme si possible une chaine formater en un chaine interprétable par tonumber() -- retourne une chaine pour éviter les arrondi éventuels de lua. -- si nombre n'est pas un nombre ou une chaine retourne une chaine vide. -- function p.parseNombre( nombre ) if type( nombre ) == 'number' then nombre = tostring( nombre ) elseif type( nombre ) ~= 'string' then return end

-- remplacement des signes moins ou demi-cadratin par un tiret nombre = nombre:gsub( '^&minus', '-' ) :gsub( '^\226\128[\146\147]', '-' ) -- U+2012, U+2013 (voir Tiret) :gsub( '^\226\136\147', '-' ) -- U+2212

if nombre:match( '^%-?[%d., \194\160]*%d$' ) then -- suppression espaces et espaces insécables nombre = nombre:gsub( ' ', ):gsub( '\194\160', )

if nombre:match( '[.,]' ) then if nombre:match( '%d+,%d%d%d,%d%d%d%f[%D]' ) -- type 1,234,567 or nombre:match( '%d+,%d%d%d%.%d+' ) -- type 1,234.5 --or nombre:match( '%d+,%d00$' ) -- type 1,200 then -- format anglo-saxon nombre = nombre:gsub( ',', ) elseif nombre:match( '%d+%.%d%d%d,%d' ) or nombre:match( '%d+%.%d%d%d.%d%d%d%f[%D]' ) then -- formant germanique type 1.234,5 nombre = nombre:gsub( '%.', ):gsub( ',', '.' ) else nombre = nombre:gsub( ',', '.' ) end end end

return nombre end

--- -- _formantNum transforme un nombre ou une chaine représentant un nombre en chaine formatée suivant les conventions du français -- si le paramètre ne représente pas un nombre lua il est retourné sans modification function p._formatNum( num ) if type( num ) == 'number' then num = tostring( num ) elseif type( num ) ~= 'string' then return num end

local moins, entier, fraction = num:match( '^(%-?)(%d+)%.?(%d*)$' ) if not entier then return num end

if moins == '-' then moins = '−' -- signe moins (U+2212) end

if entier:len() > 3 then local ini = math.fmod( entier:len(), 3 ) entier = ( entier:sub( 1, ini ) or ) .. entier:sub( ini + 1 ):gsub( '(%d%d%d)', '\194\160%1' ) end if fraction ~= then fraction = ',' .. fraction:gsub( '(%d%d%d)', '%1\194\160' ):gsub( '\194\160$', ) end

return moins .. entier .. fraction end

--- -- formatNum transforme les nombres d'une chaine en chaine formatée suivant les conventions du français function p.formatNum( num ) if type( num ) == 'number' then return p._formatNum( num ) elseif type( num ) == 'string' then return num:gsub( '%-?%d*%.?%d+', p.formatNombre ) end end

function p.formatNombre( nombre ) return p._formatNum( p.parseNombre( nombre ) ) end

function p.parseUnit( texte ) if trim( texte ) then local result local nombre = texte:match( '^%-?%f[%d][%d., \194\160]+%f[%D]' ) or false if nombre then texte = texte:sub( nombre:len() + 1 ) end result = { nombre } local e = texte:match( '^%s*[x\195]\151?10e(%-?%d+)' ) or texte:match( '^%s*e(%-?%d+)' ) -- \195\151 = × (signe multiplier) if e then table.insert( result, '10' ) table.insert( result, e ) texte = texte:gsub( '^[%sx×10]*e%-?%d+', ) end texte = texte:gsub( '⋅', '.' ) for unit, exp in mw.ustring.gmatch( texte, '%s*%.?([%a/]+)(%-?%d*)' ) do table.insert( result, unit ) table.insert( result, exp ) end return result else return { } end end

function p._unite( args ) local wiki = { } local sep = local nombre = trim( args[1] ) local unit = trim( args[2] ) local exp = trim( args.e )

-- remplacement des signes moins par des tirets pour facilité les traitements ultérieurs if nombre then nombre = nombre:gsub( '%−%f[d]', '-') -- U+2212 :gsub( '−%f[d]', '-') -- html − :gsub( '\226\128[\146\147]%f[d]', '-') -- U+2212, U+2213 (tiret numérique et demi-cadratin) end

if nombre and not unit and not exp and nombre:match('[^%d,. -]') then args = p.parseUnit( nombre ) nombre = args[1] unit = args[2] end

if nombre then nombre = nombre:gsub( '%-?%f[%d][%d., \194\160]+%f[%D]', p.formatNombre ) table.insert( wiki, nombre ) sep = '\194\160' end

local i = 1 if not exp and unit == '10' then exp = args[3] i = 2 unit = trim( args[4] ) end if exp then if #wiki > 0 then table.insert( wiki, '×10' .. exp .. '' ) else table.insert( wiki, '10' .. exp .. '' ) end sep = '\194\160' end

while unit do table.insert( wiki, sep ) table.insert( wiki, unit ) exp = trim( args[ 2 * i + 1 ] ) if exp then table.insert( wiki, '' .. exp:gsub( '%-', '−' ) .. '' ) end i = i + 1 unit = trim( args[ 2 * i ] ) sep = '⋅' end

if #wiki > 0 then return '' .. table.concat( wiki ) .. '' end end

function p.unite( frame ) local args if type( frame ) == 'table' and type( frame.getParent ) == 'function' then args = frame:getParent().args; end if args then return p._unite( args ) end end

return p