https://wiki.climatefresk.org/?title=Module:Unit%C3%A9&feed=atom&action=history
Module:Unité - Historique des versions
2024-03-28T11:43:13Z
Historique des versions pour cette page sur le wiki
MediaWiki 1.39.3
https://wiki.climatefresk.org/index.php?title=Module:Unit%C3%A9&diff=1948&oldid=prev
Arthirob : Page créée avec « local p = {} -- local Delink = require( 'Module:Delink' ) -- chargé uniquement si nécessaire -- Chargement de la base de données des nom d'unités avec gestion d'erre… »
2020-12-29T16:15:32Z
<p>Page créée avec « local p = {} -- local Delink = require( 'Module:Delink' ) -- chargé uniquement si nécessaire -- Chargement de la base de données des nom d'unités avec gestion d'erre… »</p>
<p><b>Nouvelle page</b></p><div>local p = {}<br />
<br />
-- local Delink = require( 'Module:Delink' ) -- chargé uniquement si nécessaire<br />
<br />
-- Chargement de la base de données des nom d'unités avec gestion d'erreur.<br />
local moduleData = 'Module:Unité/Data'<br />
local dataSuccess, Data = pcall ( mw.loadData, moduleData )<br />
if dataSuccess and type( Data ) == 'table' then<br />
dataSuccess = type( Data.unit ) == 'table'<br />
and type( Data.prefix ) == 'table'<br />
and type( Data.exposant ) == 'table'<br />
end<br />
<br />
local errorCat = '[[Catégorie:Page incorrectement traitée par le Module:Unité]]'<br />
local addErrorCat = false<br />
<br />
local supUnicode = { ['0'] = '⁰', ['1'] = '¹', ['2'] = '²', ['3'] = '³', ['4'] = '⁴', ['5'] = '⁵', ['6'] = '⁶', ['7'] = '⁷', ['8'] = '⁸', ['9'] = '⁹',<br />
['+'] = '⁺', ['-'] = '⁻', ['='] = '⁼', ['('] = '⁽', [')'] = '⁾', ['n'] = 'ⁿ' }<br />
local subUnicode = { ['0'] = '₀', ['1'] = '₁', ['2'] = '₂', ['3'] = '₃', ['4'] = '₄', ['5'] = '₅', ['6'] = '₆', ['7'] = '₇', ['8'] = '₈', ['9'] = '₉',<br />
['+'] = '₊', ['-'] = '₋', ['='] = '₌', ['('] = '₍', [')'] = '₎',<br />
['a'] = 'ₐ', ['e'] = 'ₑ', ['o'] = 'ₒ', ['x'] = 'ₓ', ['h'] = 'ₕ', ['k'] = 'ₖ', ['l'] = 'ₗ',<br />
['m'] = 'ₘ', ['n'] = 'ₙ', ['p'] = 'ₚ', ['s'] = 'ₛ', ['t'] = 'ₜ',<br />
}<br />
--- Copie de Outils.trim acceptant les nombres.<br />
local function trim( texte )<br />
if type( texte ) == 'string' then<br />
texte = texte:gsub( '^%s*(%S?.-)%s*$', '%1' )<br />
if texte ~= '' then<br />
return texte<br />
end<br />
elseif type( texte ) == 'number' then<br />
return tostring( texte )<br />
end<br />
end<br />
<br />
function p.sanitizeNum( nombre )<br />
if type( nombre ) == 'number' then<br />
return tostring( nombre )<br />
elseif type( nombre ) == 'string' then<br />
if nombre:match( '^%-?[%d.,]+$' ) then<br />
return nombre<br />
end<br />
local result = nombre<br />
-- remplacement des signes moins ou demi-cadratin par un tiret<br />
:gsub( '%−%f[%d]', '-') -- U+2212<br />
:gsub( '&minus;%f[%d]', '-') -- html &minus;<br />
:gsub( '\226\128[\146\147]%f[%d]', '-') -- U+2212, U+2213 (tiret numérique et demi-cadratin)<br />
-- remplacement des espaces insécable par des espace simple<br />
:gsub( '\194\160', ' ' )<br />
:gsub( '&nbsp;', ' ' )<br />
:gsub( '\226\128[\128-\138\175]', ' ' ) -- U+2002 à U+200A et U+202F<br />
-- trim<br />
:gsub( '^%s*(%S?.-)%s*$', '%1' )<br />
return result<br />
else<br />
return ''<br />
end<br />
end<br />
<br />
---<br />
-- parseNum transforme si possible une chaine formatée en un chaine interprétable par tonumber()<br />
-- retourne une chaine pour éviter les arrondi éventuels de lua.<br />
-- si "nombre" est une chaine non reconnue comme un nombre par la fonction, retourne "nombre".<br />
-- si "nombre" n'est pas un number ou une chaine retourne une chaine vide.<br />
function p.parseNombre( nombre )<br />
local result<br />
if type( nombre ) == 'number' then<br />
return tostring( nombre )<br />
else<br />
-- remplacement des signes moins ou demi-cadratin par un tiret<br />
result = p.sanitizeNum( nombre )<br />
if result == '' then<br />
return ''<br />
elseif not result:match( '^%-?[%d., ]*%d$' ) then<br />
return nombre<br />
end<br />
end<br />
<br />
-- suppression espaces<br />
result = result:gsub( ' ', '' )<br />
<br />
-- gestion des points et des virgules<br />
if result:match( '[.,]' ) then<br />
if result:match( '%d%.%d%d%d%.%d' ) then<br />
-- type 12.345.678<br />
result = result:gsub( '%.', '' ):gsub( ',', '.' )<br />
elseif result:match( '%d,%d%d%d,%d' ) -- type 1,234,567 ou 1.234,567,8<br />
or result:match( '%d,%d%d%d%.%d' ) -- format anglo-saxon type 1,234.5<br />
or result:match( '%d%.%d%d%d,%d' ) -- type 1.123,56 (utilisé en exemple pour sépararer les décimales avec l'ancien modèle unité ou formatnum)<br />
then<br />
result = result:gsub( ',', '' )<br />
else<br />
result = result:gsub( ',', '.' )<br />
end<br />
end<br />
<br />
return result<br />
end<br />
<br />
---<br />
-- _formantNum transforme un nombre ou une chaine représentant un nombre en chaine formatée suivant les conventions du français<br />
-- si le paramètre ne représente pas un nombre lua il est retourné sans modification<br />
-- Le paramètre peut être transmis sous forme de table pour ajouter des options :<br />
-- * round : arrondi à n chiffre après la virgule (peut être négatif)<br />
-- * decimals : nombre de décimales affichées (peut être négatif, dans ce cas équivalent à round)<br />
-- * noHtml : n'utilise pas de balise HTML pour affiché les puissance de 10 (pour pouvoir être utilisé en title)<br />
function p.formatNum( num )<br />
local params = {}<br />
if type( num ) == 'table' then<br />
params = num<br />
num = params[1]<br />
end<br />
if type( num ) == 'number' then<br />
num = tostring( num )<br />
elseif type( num ) ~= 'string' or num == '' then<br />
return num<br />
end<br />
<br />
-- séparation exposant<br />
local n, exponent = num:match( '^([-%d.]+)[eE]([+-]?%d+)$' )<br />
if exponent then<br />
num = n<br />
if params.noHtml then<br />
exponent = exponent:gsub('+?%f[%d]0', '' )<br />
:gsub( '[%d-]', supUnicode )<br />
else<br />
exponent = '<sup>' .. exponent:gsub('^%+?(%-?)0?', { ['-'] = '−', [''] = '' } ) .. '</sup>'<br />
end<br />
exponent = ' ×10' .. exponent<br />
else<br />
exponent = ''<br />
end<br />
<br />
-- arrondi<br />
local decimals = tonumber( params.decimals )<br />
local round = tonumber( params.round ) or decimals<br />
if round and tonumber( num ) then<br />
local mult = 10 ^ round<br />
num = tostring( math.floor( num * mult + 0.5 ) / mult )<br />
end<br />
<br />
local moins, entier, fraction = num:match( '^(%-?)(%d*)%.?(%d*)$' )<br />
if not entier then<br />
return num<br />
end<br />
<br />
if moins == '-' then<br />
moins = '−' -- signe moins (U+2212)<br />
end<br />
<br />
if entier == '' then<br />
entier = '0'<br />
elseif entier:len() > 3 then<br />
local ini = math.fmod( entier:len() - 1, 3 ) + 1<br />
entier = ( entier:sub( 1, ini ) or '') .. entier:sub( ini + 1 ):gsub( '(%d%d%d)', '\194\160%1' )<br />
end<br />
if fraction ~= '' or ( decimals and decimals > 0 ) then<br />
if decimals and decimals > #fraction then<br />
fraction = fraction .. string.rep( '0', decimals - #fraction )<br />
end<br />
if #fraction > 3 then<br />
fraction = ',' .. fraction:gsub( '(%d%d%d)', '%1\194\160' ):gsub( '\194\160$', '' )<br />
else<br />
fraction = ',' .. fraction<br />
end<br />
end<br />
<br />
return moins .. entier .. fraction .. exponent<br />
end<br />
<br />
---<br />
-- formatNombre transforme un nombre formaté ou non en chaine formatée suivant les convention du français.<br />
-- si la chaine n'est pas reconnu comme un nombre, elle n'est pas modifiée.<br />
function p.formatNombre( num, round, decimals )<br />
return p.formatNum{ p.parseNombre( num ), round = round, decimals = decimals }<br />
end<br />
<br />
--- formatNombres transforme tous les nombres d'une chaine en nombre formaté suivant les conventions du français.<br />
function p.formatNombres( nombres, round, decimals )<br />
if type( nombres ) == 'number' then<br />
return p.formatNum( nombres, round, decimals )<br />
elseif type( nombres ) == 'string' then<br />
-- retire les chiffres des strip marker<br />
local strip, i = {}, 0<br />
nombres = nombres:gsub(<br />
'UNIQ%-%-%a+%-%x%x%x%x%x%x%x%x%-QINU',<br />
function ( marker )<br />
i = i + 1<br />
strip[ tostring( i ) ] = marker<br />
return 'UNIQ^' .. i .. '¤QINU'<br />
end<br />
)<br />
-- formatage proprement dit<br />
nombres = p.sanitizeNum( nombres )<br />
local formatN = function ( n )<br />
return p.formatNombre( n, round, decimals )<br />
end<br />
nombres = nombres<br />
:gsub( '%-?%f[%d.,][%d., ]*%de[+-]?%d+', formatN )<br />
:gsub( '%-?%f[%d.,][%d., ]*%d', formatN )<br />
<br />
-- réintroduction des strip marker<br />
nombres = nombres:gsub( 'UNIQ^(%d+)¤QINU', strip )<br />
return nombres<br />
else<br />
return ''<br />
end<br />
end<br />
<br />
function p.parseUnit( texte )<br />
local toParse = p.sanitizeNum( texte )<br />
if toParse ~= '' then<br />
local result<br />
local specificArgs = {<br />
['à'] = 'à',<br />
et = 'et',<br />
ou = 'ou',<br />
['/'] = '/',<br />
['–'] = '–', ['-'] = '–', -- demi cadratin et tiret<br />
['±'] = '±', ['+-'] = '±', ['+/-'] = '±',<br />
['+'] = '+',<br />
['−'] = '−', -- signe moins<br />
['×'] = '×', x = '×', ['*'] = '×',<br />
['××'] = '××', xx = '××', ['**'] = '××',<br />
}<br />
<br />
-- valeur numérique<br />
local match, capture = toParse:match( '^(([%d., ]+%f[^d%(])%s*)' )<br />
local prefix<br />
if not match then<br />
-- cas ou le nombre est remplcé par un ou plusieurs points d'interrogation<br />
match, prefix = toParse:match( '^((%?+)%s*)' )<br />
end<br />
if not match then<br />
-- cas ou un mot type "vers", "environ" précède le nombre (mot simple, sans accent pour ne pas complexifier pour des cas minoritaires)<br />
match, prefix, capture = toParse:match( '^(([%a]+[.,]?[: ]* )([+-]?%f[%d.,][%d., ]*%d%f[%D])%s*)' )<br />
end<br />
if not match then<br />
-- cas ou le nombre est précédé par un signe, un symbole ASCII, ou suivit d'une incerititude entre parenthèse<br />
match, prefix, capture = toParse:match( '^(([(<>=~ ]*)([+-]?%f[%d.,][%d., ]*%d%(?%d*%)?)%s*)' )<br />
end<br />
if not match then<br />
-- cas ou le nombre est précédé par un symbole ≤, ≥ ou ≈<br />
match, prefix, capture = toParse:match( '^((\226\137[\164\165\136] ?)([+-]?%f[%d.,][%d., ]*%d%f[%D])%s*)' )<br />
end<br />
result = { capture or false, prefix = prefix }<br />
if match then<br />
toParse = toParse:sub( match:len() + 1 )<br />
<br />
-- point de suspensions (ex π = 3.14159...)<br />
match = toParse:match( '^…%s*' )<br />
if not match then<br />
match, capture = toParse:match( '^%.%.%.%s*' )<br />
end<br />
if match then<br />
result[1] = result[1] .. '…'<br />
toParse = toParse:sub( match:len() + 1 )<br />
end<br />
<br />
-- fraction<br />
match, capture = toParse:match( '^((%d*/%d+)%s*)' )<br />
if not match then<br />
match, capture = toParse:match( '^((\194[\188-\190])%s*)' ) -- ¼ à ¾<br />
end<br />
if not match then<br />
match, capture = toParse:match( '^((\226\133[\144-\158])%s*)' ) -- ⅐ à ⅞<br />
end<br />
if match then<br />
if capture:match( '^/' ) then<br />
local n = result[1]:match( ' %d+$' ) or result[1]:match( '^%d+$' ) or ''<br />
result[1] = result[1]:sub( 1, -1 - #n )<br />
result.fraction = n:gsub( '^ ', '' ) .. capture<br />
else<br />
result.fraction = capture<br />
end<br />
toParse = toParse:sub( match:len() + 1 )<br />
end<br />
<br />
-- lien avec un deuxième nombre<br />
local match2, conj, num = mw.ustring.match( toParse, '^(([àetouM+/−x*×±–-]+) ?(%-?%f[%d.,][%d., ]*%d%f[%D]%)?)%s*)' )<br />
if match2 and specificArgs[ conj ]<br />
and not ( specificArgs[ conj ] == '×' and mw.ustring.match( toParse, '^[×x] ?10 ?e') ) then<br />
result[ specificArgs[ conj ] ] = num<br />
toParse = toParse:sub( match2:len() + 1 )<br />
end<br />
if result['+'] or result['×'] then<br />
match2, conj, num = mw.ustring.match( toParse, '^(([x*×−-]) ?(%-?%f[%d.,][%d., ]*%d%f[%D])%s*)' )<br />
if match2 then<br />
if specificArgs[ conj ] == '×' then<br />
result['××'] = num<br />
else<br />
result['−'] = num<br />
end<br />
toParse = toParse:sub( match2:len() + 1 )<br />
end<br />
end<br />
end<br />
<br />
-- 10 exposant ( \195\151 = ×, signe multiplié)<br />
match, capture = toParse:match( '^(%s*e(%-?%d+)%s*)' )<br />
if not match then<br />
match, capture = toParse:match( '^(%s*[x\195]\151?10e(%-?%d+)%s*)' )<br />
end<br />
if match then<br />
result.e = capture<br />
toParse = toParse:sub( match:len() + 1 )<br />
end<br />
<br />
-- unités<br />
if Data.unit[ toParse ] or mw.ustring.match( toParse, '^%a+$' ) or toParse:match( '%b<>' ) then<br />
table.insert( result, toParse )<br />
toParse = ''<br />
elseif toParse ~= '' then<br />
local unit, exp<br />
toParse = toParse:gsub( '²', '2' ):gsub( '³', '3' )<br />
repeat<br />
-- unité contenant un lien<br />
match, unit, exp = mw.ustring.match( toParse, '^((/?[^%s%d/%[%]]*%b[][^%s%d/]*) ?(%-?%d*)%s*)' )<br />
if not match then<br />
-- unité ne contenant pas de lien<br />
match, unit, exp = mw.ustring.match( toParse, '^((/?[^%s%d/]+) ?(%-?%d*)%s*)' )<br />
end<br />
if not match then<br />
-- l/100 km<br />
match, unit, exp = mw.ustring.match( toParse, '^((/100 ?[^%s%d/]+) ?(%-?%d*)%s*)' )<br />
end<br />
if match then<br />
if unit:match( '%-$' ) and exp ~= '' then<br />
unit = unit:gsub( '%-$', '' )<br />
exp = '-' .. exp<br />
elseif exp == '-' then<br />
unit = match<br />
exp = ''<br />
end<br />
if Data.unit[ unit ] or mw.ustring.match( unit, '[%a€£$«»]' ) then<br />
table.insert( result, unit )<br />
table.insert( result, exp )<br />
toParse = toParse:sub( match:len() + 1 )<br />
else<br />
break<br />
end<br />
end<br />
until toParse == '' or not match<br />
end<br />
<br />
if toParse == '' then<br />
if #result > 1 and result[ #result ] == '' then<br />
result[ #result ] = nil<br />
end<br />
return result<br />
else<br />
-- une partie de la chaine n'a pas pu être décodée, on retourne la chaine originale<br />
addErrorCat = true<br />
return { texte }<br />
end<br />
else<br />
return { }<br />
end<br />
end<br />
<br />
---<br />
-- nomUtnit retourne le nom français du code d'une unité et de son exposant.<br />
-- si le code de l'unité n'est pas reconnu retourne 1 et false, de façon à ajouter false en première position d'une table.<br />
function p.nomUnit( unit, exposant )<br />
if not dataSuccess or type( unit ) ~= 'string' then<br />
return 1, false<br />
end<br />
<br />
-- nettoyage des liens et balise HTML<br />
unit = unit:gsub( '^/' , '' )<br />
if unit:match( '%[' ) then<br />
local Delink = require( 'Module:Delink' )<br />
unit = Delink._delink{ unit }<br />
end<br />
if unit:match( '<' ) then<br />
unit = unit:gsub( '%b<>', '' )<br />
end<br />
<br />
-- récupère le nom de l'unité<br />
local unitTab = Data.unit[ unit ]<br />
local unitPrefix = { nom = '' }<br />
if not unitTab then<br />
unitTab = Data.unit[ unit:sub( 2 ) ]<br />
unitPrefix = Data.prefix[ unit:sub( 1, 1 ) ]<br />
if not ( unitTab and unitPrefix ) then<br />
-- pour µ, Ki, Mi, Gi... qui sont codé sur deux octets<br />
unitTab = Data.unit[ unit:sub( 3 ) ]<br />
unitPrefix = Data.prefix[ unit:sub( 1, 2 ) ]<br />
if not ( unitTab and unitPrefix ) then<br />
unitTab = false<br />
end<br />
end<br />
end<br />
<br />
-- récupère le nom de l'exposant<br />
if trim( exposant ) then<br />
local exp = tonumber( exposant )<br />
exp = exp and Data.exposant[ math.abs( exp ) ]<br />
exposant = exp or ' puissance ' .. exposant<br />
else<br />
exposant = ''<br />
end<br />
<br />
-- assemble les deux partie<br />
if type( unitTab ) == 'table' and type( unitTab.nom ) == 'string' then<br />
return unitPrefix.nom .. unitTab.nom .. exposant<br />
elseif unit:match( '[/%d]' ) then<br />
-- ce n'est pas du texte simple, on anule l'infobule<br />
return 1, false<br />
else<br />
return unit .. exposant<br />
end<br />
end<br />
<br />
function p._unite( args )<br />
-- remplacement de certains caractères, pour simplifier les pattern<br />
local nombre = p.sanitizeNum( args[1] )<br />
if nombre == '' then<br />
nombre = nil<br />
else<br />
-- formatage du nombre<br />
nombre = p.formatNombres( nombre, args.arrondi, args['décimales'] )<br />
end<br />
<br />
local wiki = { args.prefix or '', nombre } -- prefix est un paramètre interne défini par p.parseUnit, utile notamment lorsque {{unité}} est utilisé dans les infobox<br />
<br />
-- fraction<br />
if args.fraction then<br />
local nom, den = args.fraction:match( '^(.-)/(.+)$' )<br />
if nom then<br />
if nom:match( '^[ %dn()=+-]+$' ) and den:match( '^[ %daeoxhklmnpst()=+-]$' ) then<br />
nom = nom:gsub( '[%dn()=+-]', supUnicode )<br />
den = den:gsub( '[%daeoxhklmnpst()=+-]', subUnicode )<br />
else<br />
nom = '<sup style="font-size: 70%; vertical-align: 0.4em;">' .. nom .. '</sup>'<br />
den = '<sub style="font-size: 70%; vertical-align: 0em;">' .. den .. '</sub>'<br />
end<br />
args.fraction = nom .. '⁄' .. den<br />
end<br />
<br />
if nombre then<br />
table.insert( wiki, '\194\160' )<br />
end<br />
table.insert( wiki, args.fraction )<br />
end<br />
<br />
-- à, et, ou, ×, – (tiret cadratin)<br />
local specificArgs = { '–', 'à', 'et', 'ou', '/', '×', '××', '±' }<br />
for _, name in ipairs( specificArgs ) do<br />
local v = trim( args[ name ] )<br />
if v then<br />
v = p.formatNombres( v )<br />
if name == '–' and nombre and nombre:match( '^[^−]' ) and v:match( '^[^−]' ) then<br />
-- pas d'espace pour le tiret cadratin entre deux nombres positifs<br />
table.insert( wiki, '–' )<br />
elseif name == '/' then<br />
-- espace demi-cadratin (U+2002 ou &ensp;) avec /<br />
table.insert( wiki, ' / ' )<br />
elseif name == '××' then<br />
table.insert( wiki, '\194\160×\194\160' )<br />
elseif name == '×' or name == '±' then<br />
table.insert( wiki, '\194\160' .. name .. '\194\160' )<br />
else<br />
table.insert( wiki, ' ' .. name .. ' ' )<br />
end<br />
table.insert( wiki, v )<br />
end<br />
end<br />
<br />
-- analyse de l'unité pour la conversion (mais ne sera affiché qu'après l'incertitude + et - séparé<br />
local i = 1<br />
local unit = trim( args[ 2 * i ] )<br />
local units = ''<br />
local nomUnits, par = {}, false<br />
while unit do<br />
local exp = p.parseNombre( args[ 2 * i + 1 ] )<br />
local sep = ''<br />
-- gestion des exposants<br />
local expUnit = ''<br />
if exp == '' then<br />
if unit:sub( -2 ) == '²' then<br />
exp = '2'<br />
unit = unit:sub( 1, -3 )<br />
elseif unit:sub( -2 ) == '³' then<br />
exp = '3'<br />
unit = unit:sub( 1, -3 )<br />
end<br />
end<br />
if #exp > 0 then<br />
expUnit = '<sup>' .. exp:gsub( '^-', '−') .. '</sup>' -- remplace le tiret par un vrai signe moins<br />
end<br />
-- gestion de la séparation des unités et des unités en dénominateur<br />
if units ~= '' then<br />
if unit:sub( 1, 1 ) == '/' then<br />
sep = '/'<br />
unit = unit:sub( 2 )<br />
if not par then<br />
par = true<br />
table.insert( nomUnits, 'par' )<br />
end<br />
else<br />
sep = '\194\160' -- point médian désactivé : '⋅\194\160'<br />
end<br />
end<br />
if exp:match( '^-' ) and not par then<br />
par = true<br />
table.insert( nomUnits, 'par' )<br />
end<br />
-- remplacement de l'unité par son symbole<br />
if Data.unit[ unit ] then<br />
-- unit = Data.unit[ unit ].symbole<br />
-- désactivé car ne gère pas les multiple tel mL<br />
end<br />
units = units .. sep .. unit .. expUnit<br />
table.insert( nomUnits, p.nomUnit( unit, exp ) )<br />
i = i + 1<br />
unit = trim( args[ 2 * i ] )<br />
end<br />
<br />
-- conversion<br />
local unitNameString = nomUnits[1] and table.concat( nomUnits, ' ' ) or ''<br />
unitNameString = mw.ustring.gsub( unitNameString, '(%a)s%f[%A]', '%1' )<br />
local multiple = 1<br />
local convertTable = Data.convert[ unitNameString ]<br />
if not convertTable and #unitNameString > 5 then<br />
-- gesion des multiples (Kilo, méga, mili...)<br />
local prefix = Data.prefix[ unitNameString:sub( 1, 4 ) ] or Data.prefix[ unitNameString:sub( 1, 5 ) ]<br />
local _, par = unitNameString:find( ' par ' )<br />
local prefix2<br />
if par then<br />
prefix2 = Data.prefix[ unitNameString:sub( par + 1, 4 ) ] or Data.prefix[ unitNameString:sub( par + 1, 5 ) ]<br />
end<br />
if prefix and Data.convert[ unitNameString:gsub( '^' .. prefix.nom, '' ) ] then<br />
convertTable = Data.convert[ unitNameString:gsub( '^' .. prefix.nom, '' ) ]<br />
multiple = 10 ^ prefix.puissance<br />
elseif prefix2 and Data.convert[ unitNameString:gsub( ' par ' .. prefix2.nom, '' ) ] then<br />
convertTable = Data.convert[ unitNameString:gsub( ' par ' .. prefix2.nom, '' ) ]<br />
multiple = 1 / 10 ^ prefix2.puissance<br />
elseif prefix and prefix2 and Data.convert[ unitNameString:gsub( '^' .. prefix.nom, '' ):gsub( ' par ' .. prefix2.nom, '' ) ] then<br />
convertTable = Data.convert[ unitNameString:gsub( '^' .. prefix.nom, '' ):gsub( ' par ' .. prefix2.nom, '' ) ]<br />
multiple = 10 ^ prefix.puissance / 10 ^ prefix2.puissance<br />
end<br />
end<br />
if convertTable then<br />
if type( convertTable[1] ) ~= 'table' then<br />
convertTable = { convertTable }<br />
end<br />
for i, v in ipairs( wiki ) do<br />
local n = tonumber( p.parseNombre( v ) )<br />
if n then<br />
n = n * 10 ^ ( tonumber( p.parseNombre( args.e ) ) or 0 )<br />
local converted = {}<br />
for _, c in ipairs( convertTable ) do<br />
local nConverted = n<br />
if c.inverse then<br />
nConverted = 1 / n<br />
end<br />
if c.M then<br />
-- M = masse molaire<br />
local M = tonumber( args.M )<br />
if not M then<br />
break<br />
end<br />
if c.M == '*' then<br />
nConverted = nConverted * M<br />
elseif c.M == '/' then<br />
nConverted = nConverted / M<br />
end<br />
end<br />
nConverted = nConverted * multiple * c[2] + ( c[3] or 0 )<br />
-- format<br />
nConverted = p.formatNum{ nConverted, round = c.round or 6, noHtml = true }<br />
local sep = ' '<br />
if mw.ustring.sub( c[1], 1, 1 ) == '°' then<br />
sep = ''<br />
end<br />
mw.log( c[1], mw.ustring.codepoint( sep, 1, 1))<br />
table.insert( converted, nConverted .. sep.. c[1] )<br />
end<br />
wiki[ i ] = '<span title="' .. table.concat( converted, ' ou ' ) ..'">' .. v ..'</span>'<br />
end<br />
end<br />
end<br />
<br />
-- incertitude avec + et − séparés<br />
if trim( args['+'] ) then<br />
local approximation = '+' .. p.formatNombre( args['+'] ) .. ''<br />
if trim( args['−'] ) then<br />
approximation = approximation .. '<br> −' .. p.formatNombre( args['−'] )<br />
end<br />
table.insert( wiki, '<span class="nowrap"><span style="display:inline-block; padding-left:0.2em; vertical-align:top; line-height:1em; font-size:80%; text-align:left;">' )<br />
table.insert( wiki, approximation .. '</span></span>' )<br />
end<br />
<br />
-- puissance de 10<br />
local exposant = trim( args.e )<br />
if exposant then<br />
exposant = p.formatNombre( exposant )<br />
if nombre then<br />
if trim( args['±'] ) and not nombre:match( '^%(' ) then<br />
table.insert( wiki, 1, '(' )<br />
table.insert( wiki, ')' )<br />
end<br />
table.insert( wiki, '\194\160× 10<sup>' .. exposant .. '</sup>' )<br />
else<br />
table.insert( wiki, '10<sup>' .. exposant .. '</sup>' )<br />
end<br />
end<br />
<br />
if units ~= '' then<br />
local sep = '\194\160'<br />
if not ( nombre or args.fraction or exposant ) then<br />
sep = ''<br />
else<br />
local symbole = Data.unit[ units ] and Data.unit[ units ].symbole<br />
if symbole == '°' or symbole == '′' or symbole == '″' then<br />
sep = ''<br />
end<br />
end<br />
-- ajoute une abréviation si le nom de l'unité est différent de l'unité (en retirant les espaces qui peuvent être devenus insécables)<br />
if nomUnits[1] and table.concat( nomUnits ):gsub( ' ', '' ):gsub( '\194\160', '' ) ~= units:gsub( ' ', '' ):gsub( '\194\160', '' ) then<br />
units = string.format( '<abbr class=abbr title="%s">%s</abbr>', table.concat( nomUnits, ' ' ), units )<br />
end<br />
table.insert( wiki, sep .. units )<br />
end<br />
<br />
if #wiki > 0 then<br />
return table.concat( wiki )<br />
end<br />
end<br />
<br />
function p.unite( frame )<br />
local args<br />
if type( frame ) == 'table' then<br />
if type( frame.getParent ) == 'function' then<br />
args = frame:getParent().args;<br />
else<br />
args = frame<br />
end<br />
end<br />
if args then<br />
args[1] = trim( args[1] ) or false<br />
if args[1] then<br />
if args[1]:match('[^%d,. -]') then<br />
local tempArgs = p.parseUnit( args[1] )<br />
if not ( args[2] and tempArgs[2] ) then<br />
for k, v in pairs( tempArgs ) do<br />
args[k] = v<br />
end<br />
end<br />
end<br />
args[2] = trim( args[2] ) or false<br />
if args[2] and not args[3] and args[2]:match('/') then<br />
local tempArgs = p.parseUnit( args[2] )<br />
args[2] = false<br />
if tempArgs[1] ~= false then<br />
table.insert( tempArgs, 1, false )<br />
end<br />
for k, v in pairs( tempArgs ) do<br />
if args[k] and v then<br />
addErrorCat = true<br />
end<br />
args[k] = args[k] or v<br />
end<br />
end<br />
end<br />
-- args alias<br />
args['×'] = args['×'] or args['x'] -- lettre x → signe multiplié<br />
args['±'] = args['±'] or args['+-'] or args['+/-']<br />
if args['+'] then<br />
args['−'] = args['−'] or args['-'] -- tiret → signe moins<br />
else<br />
args['–'] = args['–'] or args['-'] -- tiret → demi-cadratin<br />
end<br />
local cat = ''<br />
if addErrorCat then<br />
cat = errorCat<br />
end<br />
return p._unite( args ) .. cat<br />
end<br />
end<br />
<br />
return p</div>
Arthirob