UNPKG

ilib

Version:

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

1 lines 5.44 kB
var JSUtils=require("./JSUtils.js"),MathUtils=require("./MathUtils.js"),Locale=require("./Locale.js");function round(number,precision){precision=Math.pow(10,precision);return MathUtils.halfdown(number*precision)/precision}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}},systems=(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 locale=Measurement.getMeasurementSystemForLocale(locale),fromSystem=this.getMeasurementSystem();return locale!==fromSystem&&(fromSystem=this.systems.conversions[fromSystem]&&this.systems.conversions[fromSystem][locale]&&this.systems.conversions[fromSystem][locale][this.unit])?this.newUnit({unit:fromSystem,amount:this.convert(fromSystem)}):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)return from=this.ratios[from],to=this.ratios[to],this.amount*from[to[0]]}},convertSystem:function(measurementSystem){return measurementSystem&&measurementSystem!==this.getMeasurementSystem()&&(measurementSystem=(measurementSystem=this.systems.conversions[this.getMeasurementSystem()][measurementSystem])&&measurementSystem[this.unit])?this.newUnit({unit:measurementSystem,amount:this.convert(measurementSystem)}):this},scale:function(measurementsystem,units){var mSystem,systemName=this.getMeasurementSystem();return(mSystem=(mSystem=units?units[measurementsystem]&&-1<JSUtils.indexOf(units[measurementsystem],this.unit)?units[measurementsystem]:units[systemName]:mSystem)||(this.systems[measurementsystem]&&-1<JSUtils.indexOf(this.systems[measurementsystem],this.unit)?this.systems[measurementsystem]:this.systems[systemName]))?this.newUnit(this.scaleUnits(mSystem)):this},expand:function(measurementsystem,units,constrain,scale){var systemName=this.getMeasurementSystem(),units=units&&units[systemName]?units[systemName]:this.systems[systemName]||this.systems.metric;return this.list(units,this.ratios,constrain,scale).map(function(item){return this.newUnit(item)}.bind(this))},list:function(measures,ratios,constrain,scale){var row=ratios[this.unit],ret=[],unit=this.unit,amount=this.amount,start=(constrain=constrain||round,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]);for(var amount=constrain(amount),j=start;0<j;j--){var scaled=amount*row[ratios[unit=measures[j]][0]],scaled=Math.floor(scaled);scaled&&(ret.push({unit:unit,amount:scaled}),amount-=scaled*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)return this.getUnitId(unit)||(unit=unit.toLowerCase(),this.aliasesLower&&void 0!==this.aliasesLower[unit]?this.aliasesLower[unit]: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(),unit=Measurement.getUnitId(measurement,unit);if(unit)return unit;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}},{uscustomary:["US","FM","MH","LR","PR","PW","GU","WS","AS","VI","MP"],imperial:["MM"]});Measurement.getMeasurementSystemForLocale=function(locale){locale=("object"==typeof locale?locale:new Locale(locale)).getRegion();if(locale){if(-1<JSUtils.indexOf(systems.uscustomary,locale))return"uscustomary";if(-1<JSUtils.indexOf(systems.imperial,locale))return"imperial"}return"metric"},module.exports=Measurement;