MediaWiki:CalculateMass.js: Difference between revisions
Jcblmaster (talk | contribs) (Created page with "addOnloadHook(calculateMassInit); var EXT_MASS = { "C": 12.0, "H": 1.007825035, "O": 15.99491463, "N": 14.003074002, "S": 31.97207070, "P": 30.9737620, "Na": 2...") |
(No difference)
|
Latest revision as of 00:55, 27 March 2017
addOnloadHook(calculateMassInit); var EXT_MASS = { "C": 12.0, "H": 1.007825035, "O": 15.99491463, "N": 14.003074002, "S": 31.97207070, "P": 30.9737620, "Na": 22.9897677, "K": 38.9637074, "Ca": 39.9625906 } var AVE_MASS = { "C": 12.0107, "H": 1.00794, "O": 15.9994, "N": 14.00674, "S": 32.066, "P": 30.973761, "Na": 22.98977, "K": 39.0983, "Ca": 40.078, } function calculateMassInit() { document.getElementById("{{{1}}}").onclick = function(){ var mass = calculateMassFromFormula(document.getElementById("{{{2}}}").value, false); document.getElementById("{{{3}}}").value = mass; } } function calculateMassFromFormula(formula, isAve) { var items = splitFormula(formula); var total = 0; var masses; if(isAve) masses = AVE_MASS; else masses = EXT_MASS; for(var i = 0; i < items.length; i += 2){ if(isFinite(masses[items[i]])) total += masses[items[i]] * items[i+1]; //console.log(masses[items[i]], items[i+1]); } //console.log(items) //console.log(total) return total; } function splitFormula(formula) { if(formula.length == 0) // 組成式が無い return []; var items = []; formula += "$"; // 番兵 var ch = formula.substr(0, 1); if(ch.match(/^[^A-Z]$/)) // フォーマットがおかしい return []; var num = 1; for(var i = 1; i < formula.length; i ++){ var next = formula.substr(i, 1); if(next.match(/^[0-9]$/)){ // 数字が終わるまでを検索する for(var j = i+1; j < formula.length; j ++){ if(formula.substr(j,1).match(/^[^0-9]$/)){ // 終了 num = parseInt(formula.substr(i,j-i), 10); i = j-1; break; } } } else if(next.match(/^[a-z]$/)){ ch += next; } else if(next.match(/^[A-Z]$/)){ items.push(ch); items.push(num); ch = next; num = 1; } else if(next == "$"){ items.push(ch); items.push(num); break; } else { // unknown return []; } } return items; }