UNPKG

handlebars.numeral

Version:

Handlebars helpers for numeral.js and wolsey

233 lines (209 loc) 7.14 kB
(function (moduleFactory) { if(typeof exports === "object") { module.exports = moduleFactory(require("lodash"), require("numeral"), require("wolsey")); } else if (typeof define === "function" && define.amd) { define(["lodash", "numeral", "wolsey"], moduleFactory); } }(function (_, numeral, Wolsey) {/** * @module handlebars%numeral * @description Helpers providing functionality of [Numeral.js](http://numeraljs.com) and [Wolsey](http://wolsey.solidgoldpig.com) * * var Handlebars = require("handlebars"); * var NumeralHelper = require("handlebars.numeral"); * NumeralHelper.registerHelpers(Handlebars); * * @returns {object} NumeralHelper instance */ var cardinal = new Wolsey(); var NumeralHelpers = function (Handlebars) { /* numeral.js language configuration * language : english united kingdom (uk) * author : Dan Ristic : https://github.com/dristic */ var enLanguage = { delimiters: { thousands: ",", decimal: "." }, abbreviations: { thousand: "k", million: "m" }, ordinal: function (number) { var b = number % 10; return (~~ (number % 100 / 10) === 1) ? "th" : (b === 1) ? "st" : (b === 2) ? "nd" : (b === 3) ? "rd" : "th"; }, currency: { symbol: "£" } }; numeral.language("en", enLanguage); var defaults = {}; var lang = "en"; defaults.en = { zero: "n/a", number: "0,000[.]00", currency: "$0,000.00", byte: "0,000b" }; function numeralHelper () { var args = Array.prototype.slice.call(arguments), options = args.pop(), helperType = args.shift(), number = args.shift(), format = args.shift(), formatParams = args.shift(), formatParams1 = args.shift(), formatParams2 = args.shift(); if (options.hash && options.hash.params) { options.hash = _.extend({}, options.hash.params, options.hash); delete options.hash.params; } var params = options.hash; if (!number) { number = params.number; } number = +number; if (isNaN(number)) { number = 0; } var defaultFormat = defaults[lang][helperType]; if (format === undefined) { format = params.format; if (format === undefined) { format = defaultFormat; } } var numeralObj = numeral(number); return numeralObj.format(format); } /** * @template number * @block helper * @param {number} 0 Number * @param {string} [1] Format * @param {string} [format] Alternative way to pass format * * @description Formats a number * * {{number n}} * * Using an explicit format * * {{number n f}} * {{number n format=f}} */ Handlebars.registerHelper("number", function () { [].unshift.call(arguments, "number"); return numeralHelper.apply(this, arguments); }); /** * @template currency * @block helper * @param {number} 0 Number * @description Formats a number as currency * * {{currency n}} */ Handlebars.registerHelper("currency", function () { [].unshift.call(arguments, "currency"); return numeralHelper.apply(this, arguments); }); /** * @template byte * @block helper * @param {number} 0 Number * @description Formats a number as human-readable computer size * * {{byte n}} */ Handlebars.registerHelper("byte", function () { [].unshift.call(arguments, "byte"); return numeralHelper.apply(this, arguments); }); /** * @template numeral * @block helper * @param {number} 0 Number * @description Outputs a number as a word * * {{numeral n}} */ Handlebars.registerHelper("numeral", function () { var args = Array.prototype.slice.call(arguments); var options; if (typeof args[args.length-1] === "object") { options = args.pop(); } var number = args.shift(); if (options.hash && options.hash.params) { options.hash = _.extend({}, options.hash.params, options.hash); delete options.hash.params; } var params = options.hash; return cardinal.numeral(number, params); }); /** * @template ordinal * @block helper * @param {number} 0 Number * @param {boolean} [1] Output as number * @param {boolean} [number=false] Output as number * * @description Outputs a number as an ordinal * * {{ordinal n}} * * As a number * * {{ordinal n true}} * {{ordinal n number=true}} * */ Handlebars.registerHelper("ordinal", function () { var args = Array.prototype.slice.call(arguments); var options; if (typeof args[args.length-1] === "object") { options = args.pop(); } var number = args.shift(); var asNumber = args.shift(); if (options.hash && options.hash.params) { options.hash = _.extend({}, options.hash.params, options.hash); delete options.hash.params; } var params = options.hash; if (!number) { number = params.number; } if (asNumber === undefined) { if (params.number !== undefined) { asNumber = params.number; } else { asNumber = params.asnumber; } } number = +number; var method = asNumber ? "ordinalAsNumber" : "ordinal"; return cardinal[method](number, params); }); }; var external = { /** * @method registerHelpers * @static * @param {object} hbars Handlebars instance * @description Register NumeralHelper helpers with Handlebars * * - {@link template:moment} * - {@link template:duration} */ registerHelpers: function (hbars) { NumeralHelpers(hbars); } }; return external; }));