ソースを参照

Change formatFuncCreator to scaledUnits builder.

Abstract out both decimal and binary SI prefixes into builders using
scaledUnits.
Greg Look 10 年 前
コミット
51a589f5a6
1 ファイル変更41 行追加19 行削除
  1. 41 19
      public/app/components/kbn.js

+ 41 - 19
public/app/components/kbn.js

@@ -252,7 +252,10 @@ function($, _) {
     };
   };
 
-  kbn.formatFuncCreator = function(factor, extArray) {
+  // Formatter which scales the unit string geometrically according to the given
+  // numeric factor. Repeatedly scales the value down by the factor until it is
+  // less than the factor in magnitude, or the end of the array is reached.
+  kbn.formatBuilders.scaledUnits = function(factor, extArray) {
     return function(size, decimals, scaledDecimals) {
       if (size === null) {
         return "";
@@ -276,35 +279,54 @@ function($, _) {
     };
   };
 
+  // Extension of the scaledUnits builder which uses SI decimal prefixes. If an
+  // offset is given, it adjusts the starting units at the given prefix; a value
+  // of 0 starts at no scale; -3 drops to nano, +2 starts at mega, etc.
+  kbn.formatBuilders.decimalSIPrefix = function(unit, offset) {
+    var prefixes = ['n', 'µ', 'm', '', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
+    prefixes = prefixes.slice(3 + (offset || 0));
+    var units = prefixes.map(function(p) { return ' ' + p + unit; });
+    return kbn.formatBuilders.scaledUnits(1000, units);
+  };
+
+  // Extension of the scaledUnits builder which uses SI binary prefixes. If
+  // offset is given, it starts the units at the given prefix; otherwise, the
+  // offset defaults to zero and the initial unit is not prefixed.
+  kbn.formatBuilders.binarySIPrefix = function(unit, offset) {
+    var prefixes = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi'].slice(offset);
+    var units = prefixes.map(function(p) { return ' ' + p + unit; });
+    return kbn.formatBuilders.scaledUnits(1024, units);
+  };
+
   ///// VALUE FORMATS /////
 
   // Dimensionless Units
   kbn.valueFormats.none    = kbn.toFixed;
-  kbn.valueFormats.short   = kbn.formatFuncCreator(1000, ['', ' K', ' Mil', ' Bil', ' Tri', ' Quadr', ' Quint', ' Sext', ' Sept']);
+  kbn.valueFormats.short   = kbn.formatBuilders.scaledUnits(1000, ['', ' K', ' Mil', ' Bil', ' Tri', ' Quadr', ' Quint', ' Sext', ' Sept']);
   kbn.valueFormats.ppm     = kbn.formatBuilders.fixedUnit('ppm');
   kbn.valueFormats.percent = kbn.formatBuilders.fixedUnit('%', '');
 
   // Data
-  kbn.valueFormats.bits   = kbn.formatFuncCreator(1024, [' b', ' Kib', ' Mib', ' Gib', ' Tib', ' Pib', ' Eib', ' Zib', ' Yib']);
-  kbn.valueFormats.bytes  = kbn.formatFuncCreator(1024, [' B', ' KiB', ' MiB', ' GiB', ' TiB', ' PiB', ' EiB', ' ZiB', ' YiB']);
-  kbn.valueFormats.kbytes = kbn.formatFuncCreator(1024, [' KiB', ' MiB', ' GiB', ' TiB', ' PiB', ' EiB', ' ZiB', ' YiB']);
-  kbn.valueFormats.mbytes = kbn.formatFuncCreator(1024, [' MiB', ' GiB', ' TiB', ' PiB', ' EiB', ' ZiB', ' YiB']);
-  kbn.valueFormats.gbytes = kbn.formatFuncCreator(1024, [' GiB', ' TiB', ' PiB', ' EiB', ' ZiB', ' YiB']);
+  kbn.valueFormats.bits   = kbn.formatBuilders.binarySIPrefix('b');
+  kbn.valueFormats.bytes  = kbn.formatBuilders.binarySIPrefix('B');
+  kbn.valueFormats.kbytes = kbn.formatBuilders.binarySIPrefix('B', 1);
+  kbn.valueFormats.mbytes = kbn.formatBuilders.binarySIPrefix('B', 2);
+  kbn.valueFormats.gbytes = kbn.formatBuilders.binarySIPrefix('B', 3);
 
   // Data Rate
-  kbn.valueFormats.pps = kbn.formatFuncCreator(1000, [' pps', ' Kpps', ' Mpps', ' Gpps', ' Tpps', ' Ppps', ' Epps', ' Zpps', ' Ypps']);
-  kbn.valueFormats.bps = kbn.formatFuncCreator(1000, [' bps', ' Kbps', ' Mbps', ' Gbps', ' Tbps', ' Pbps', ' Ebps', ' Zbps', ' Ybps']);
-  kbn.valueFormats.Bps = kbn.formatFuncCreator(1000, [' Bps', ' KBps', ' MBps', ' GBps', ' TBps', ' PBps', ' EBps', ' ZBps', ' YBps']);
+  kbn.valueFormats.pps = kbn.formatBuilders.decimalSIPrefix('pps');
+  kbn.valueFormats.bps = kbn.formatBuilders.decimalSIPrefix('bps');
+  kbn.valueFormats.Bps = kbn.formatBuilders.decimalSIPrefix('Bps');
 
   // Energy
-  kbn.valueFormats.watt   = kbn.formatFuncCreator(1000, [' W', ' kW', ' MW', ' GW', ' TW', ' PW', ' EW', ' ZW', ' YW']);
-  kbn.valueFormats.kwatt  = kbn.formatFuncCreator(1000, [' kW', ' MW', ' GW', ' TW', ' PW', ' EW', ' ZW', ' YW']);
-  kbn.valueFormats.watth  = kbn.formatFuncCreator(1000, [' Wh', ' kWh', ' MWh', ' GWh', ' TWh', ' PWh', ' EWh', ' ZWh', ' YWh']);
-  kbn.valueFormats.kwatth = kbn.formatFuncCreator(1000, [' kWh', ' MWh', ' GWh', ' TWh', ' PWh', ' EWh', ' ZWh', ' YWh']);
-  kbn.valueFormats.joule  = kbn.formatFuncCreator(1000, [' J', ' kJ', ' MJ', ' GJ', ' TJ', ' PJ', ' EJ', ' ZJ', ' YJ']);
-  kbn.valueFormats.ev     = kbn.formatFuncCreator(1000, [' eV', ' keV', ' MeV', 'GeV', 'TeV', 'PeV', 'EeV', 'ZeV', 'YeV']);
-  kbn.valueFormats.amp    = kbn.formatFuncCreator(1000, [' A', ' kA', ' MA', ' GA', ' TA', ' PA', ' EA', ' ZA', ' YA']);
-  kbn.valueFormats.volt   = kbn.formatFuncCreator(1000, [' V', ' kV', ' MV', ' GV', ' TV', ' PV', ' EV', ' ZV', ' YV']);
+  kbn.valueFormats.watt   = kbn.formatBuilders.decimalSIPrefix('W');
+  kbn.valueFormats.kwatt  = kbn.formatBuilders.decimalSIPrefix('W', 1);
+  kbn.valueFormats.watth  = kbn.formatBuilders.decimalSIPrefix('Wh');
+  kbn.valueFormats.kwatth = kbn.formatBuilders.decimalSIPrefix('Wh', 1);
+  kbn.valueFormats.joule  = kbn.formatBuilders.decimalSIPrefix('J');
+  kbn.valueFormats.ev     = kbn.formatBuilders.decimalSIPrefix('eV');
+  kbn.valueFormats.amp    = kbn.formatBuilders.decimalSIPrefix('A');
+  kbn.valueFormats.volt   = kbn.formatBuilders.decimalSIPrefix('V');
 
   // Temperature
   kbn.valueFormats.celsius   = kbn.formatBuilders.fixedUnit('°C');
@@ -322,7 +344,7 @@ function($, _) {
   kbn.valueFormats.velocityknot = kbn.formatBuilders.fixedUnit('kn');
 
   // Time
-  kbn.valueFormats.hertz = kbn.formatFuncCreator(1000, [' Hz', ' kHz', ' MHz', ' GHz', ' THz', ' PHz', ' EHz', ' ZHz', ' YHz']);
+  kbn.valueFormats.hertz = kbn.formatBuilders.decimalSIPrefix('Hz');
 
   kbn.valueFormats.ms = function(size, decimals, scaledDecimals) {
     if (size === null) { return ""; }