UNPKG

ilib

Version:

iLib is a cross-engine library of internationalization (i18n) classes written in pure JS

1 lines 5.46 kB
var JSUtils=require("./JSUtils.js"),MathUtils=require("./MathUtils.js"),Locale=require("./Locale.js");function round(number,precision){var factor=Math.pow(10,precision);return MathUtils.halfdown(number*factor)/factor}var Measurement=function(options){if(options){if(void 0!==options.unit&&(this.originalUnit=options.unit,this.unit=this.normalizeUnits(options.unit)||options.unit),"object"==typeof options.amount){if(options.amount.getMeasure()!==this.getMeasure())throw"Cannot convert unit "+options.amount.unit+" to a "+this.getMeasure();this.amount=options.amount.convert(this.unit)}else void 0!==options.amount&&(this.amount=Number(options.amount));if(void 0===this.ratios[this.unit])throw"Unknown unit: "+options.unit}};Measurement._constructors={},Measurement.prototype={normalizeUnits:function(name){return this.constructor&&(Measurement.getUnitId(this.constructor,name)||Measurement.getUnitIdCaseInsensitive(this.constructor,name))||name},getUnit:function(){return this.unit},getOriginalUnit:function(){return this.originalUnit},getAmount:function(){return this.amount},getMeasure:function(){},getMeasures:function(){return Object.keys(this.ratios)},getMeasurementSystem:function(){if(this.unit){if(-1<JSUtils.indexOf(this.systems.uscustomary,this.unit))return"uscustomary";if(-1<JSUtils.indexOf(this.systems.imperial,this.unit))return"imperial"}return"metric"},localize:function(locale){var to,toSystem=Measurement.getMeasurementSystemForLocale(locale),fromSystem=this.getMeasurementSystem();return toSystem===fromSystem?this:(to=this.systems.conversions[fromSystem]&&this.systems.conversions[fromSystem][toSystem]&&this.systems.conversions[fromSystem][toSystem][this.unit])?this.newUnit({unit:to,amount:this.convert(to)}):this},convert:function(to){if(to&&void 0!==this.ratios[this.normalizeUnits(to)]){var from=this.getUnitIdCaseInsensitive(this.unit)||this.unit;if(to=this.getUnitIdCaseInsensitive(to)||to,void 0!==from&&void 0!==to){var fromRow=this.ratios[from],toRow=this.ratios[to];return this.amount*fromRow[toRow[0]]}}},convertSystem:function(measurementSystem){if(!measurementSystem||measurementSystem===this.getMeasurementSystem())return this;var map=this.systems.conversions[this.getMeasurementSystem()][measurementSystem],newunit=map&&map[this.unit];return newunit?this.newUnit({unit:newunit,amount:this.convert(newunit)}):this},scale:function(measurementsystem,units){var mSystem,systemName=this.getMeasurementSystem();return units&&(mSystem=units[measurementsystem]&&-1<JSUtils.indexOf(units[measurementsystem],this.unit)?units[measurementsystem]:units[systemName]),mSystem||(mSystem=this.systems[measurementsystem]&&-1<JSUtils.indexOf(this.systems[measurementsystem],this.unit)?this.systems[measurementsystem]:this.systems[systemName]),mSystem?this.newUnit(this.scaleUnits(mSystem)):this},expand:function(measurementsystem,units,constrain,scale){var systemName=this.getMeasurementSystem(),mSystem=units&&units[systemName]?units[systemName]:this.systems[systemName]||this.systems.metric;return this.list(mSystem,this.ratios,constrain,scale).map(function(item){return this.newUnit(item)}.bind(this))},list:function(measures,ratios,constrain,scale){var scaled,row=ratios[this.unit],ret=[],unit=this.unit,amount=this.amount;constrain=constrain||round;var start=JSUtils.indexOf(measures,this.unit);(scale||-1===start)&&(start=measures.length-1),this.unit!==measures[0]&&(unit=measures[0],amount=this.amount*row[ratios[unit][0]],row=ratios[unit]),amount=constrain(amount);for(var j=start;0<j;j--){scaled=amount*row[ratios[unit=measures[j]][0]];var xf=Math.floor(scaled);if(xf){var item={unit:unit,amount:xf};ret.push(item),amount-=xf*ratios[unit][ratios[measures[0]][0]]}}return 0!==amount&&ret.push({unit:measures[0],amount:constrain(amount)}),ret},scaleUnits:function(mSystem){for(var tmp,munit,amount=0x10000000000000000,fromRow=this.ratios[this.unit],m=0;m<mSystem.length;m++)(1<=(tmp=this.amount*fromRow[this.ratios[mSystem[m]][0]])&&tmp<amount||0x10000000000000000===amount)&&(amount=tmp,munit=mSystem[m]);return{unit:munit,amount:amount}},getUnitId:function(unit){if(unit)return this.aliases&&void 0!==this.aliases[unit]?this.aliases[unit]:this.ratios&&void 0!==this.ratios[unit]?unit:void 0},getUnitIdCaseInsensitive:function(unit){if(unit){var ret=this.getUnitId(unit);if(ret)return ret;var u=unit.toLowerCase();return this.aliasesLower&&void 0!==this.aliasesLower[u]?this.aliasesLower[u]:void 0}}},Measurement.getUnitId=function(measurement,unit){if(unit)return void 0!==measurement.aliases[unit]?measurement.aliases[unit]:measurement.ratios&&void 0!==measurement.ratios[unit]?unit:void 0},Measurement.getUnitIdCaseInsensitive=function(measurement,unit){if(unit){var u=unit.toLowerCase(),ret=Measurement.getUnitId(measurement,unit);if(ret)return ret;if(measurement.aliases&&!measurement.aliasesLower)for(var a in measurement.aliasesLower={},measurement.aliases)measurement.aliasesLower[a.toLowerCase()]=measurement.aliases[a];return void 0!==measurement.aliasesLower[u]?measurement.aliasesLower[u]:void 0}};var systems={uscustomary:["US","FM","MH","LR","PR","PW","GU","WS","AS","VI","MP"],imperial:["GB","MM"]};Measurement.getMeasurementSystemForLocale=function(locale){var region=("object"==typeof locale?locale:new Locale(locale)).getRegion();if(region){if(-1<JSUtils.indexOf(systems.uscustomary,region))return"uscustomary";if(-1<JSUtils.indexOf(systems.imperial,region))return"imperial"}return"metric"},module.exports=Measurement;