UNPKG

carbone

Version:

Fast, Simple and Powerful report generator. Injects JSON and produces PDF, DOCX, XLSX, ODT, PPTX, ODS, ...!

305 lines (286 loc) 7.57 kB
var toMd5 = require('./md5'); const LINEBREAK = { odt : '<text:line-break/>', docx : '</w:t><w:br/><w:t>' }; /** * Lower case all letters * * @version 0.12.5 * * @example [ "My Car" ] * @example [ "my car" ] * @example [ null ] * @example [ 1203 ] * * @param {String} d string to parse * @return {String} lower case on all letters, or `d` is it not a string */ function lowerCase (d) { if (typeof d === 'string') { return d.toLowerCase(); } return d; } /** * Upper case all letters * * @version 0.12.5 * * @example [ "My Car" ] * @example [ "my car" ] * @example [ null ] * @example [ 1203 ] * * @param {String} d string to parse * @return {String} upper case on all letters, or `d` is it not a string */ function upperCase (d) { if (typeof d === 'string') { return d.toUpperCase(); } return d; } /** * Upper case first letter * * @version 0.12.5 * * @example [ "My Car" ] * @example [ "my car" ] * @example [ null ] * @example [ ] * @example [ 1203 ] * * @param {String} d string to parse * @return {String} upper case on the first letter, or `d` is it not a string */ function ucFirst (d) { if (typeof d === 'string') { return d.charAt(0).toUpperCase() + d.slice(1); } return d; } /** * Upper case the first letter of all words * * @version 0.12.5 * * @example [ "my car" ] * @example [ "My cAR" ] * @example [ null ] * @example [ ] * @example [ 1203 ] * * @param {String} d string to parse * @return {String} upper case on all words, or `d` is it not a string */ function ucWords (d) { if (typeof d === 'string') { return d.replace(/(?:^|\s)\S/g, function (a) { return a.toUpperCase(); }); } return d; } /** * Always return the same message if called (sort of "catch all" formatter) * * @version 0.13.0 * * @example [ "My Car", "hello!" ] * @example [ "my car", "hello!" ] * @example [ null , "hello!" ] * @example [ 1203 , "hello!" ] * * @param {Mixed} d data * @param {String} message text to print * @return {String} `message` is always printed */ function print (d, message) { return message; } /** * Convert user-defined enums to human readable values * * User-defined enums must be passed in `options` of `carbone.render`. * * @version 0.13.0 * * @exampleContext { "enum" : { "ORDER_STATUS" : ["pending", "sent", "delivered"] } } * @example [ 0 , "ORDER_STATUS" ] * @example [ 1 , "ORDER_STATUS" ] * @example [ 5 , "ORDER_STATUS" ] * * @exampleContext { "enum" : { "YES_NO" : {"true" : "Yes", "false" : "No"} } } * @example [ false, "YES_NO" ] * @example [ true , "YES_NO" ] * @example [ null , "YES_NO" ] * @example [ 3 , "UNKNOWN_ENUM" ] * * @param {Integer|String} d * @param {String} type enum name passed in `options` of `carbone.render(data, options)` * @return {String} return human readable enum or original value if it cannot be converted */ function convEnum (d, type) { if (this.enum !== undefined) { var _type = this.enum[type]; if (_type !== undefined && _type[d] !== undefined) { return _type[d]; } } return d; } /** * Removes accents from text * * @version 1.1.0 * * @example [ "crème brulée" ] * @example [ "CRÈME BRULÉE" ] * @example [ "être" ] * @example [ "éùïêèà" ] * * @param {String} d string to parse * @return {String} string without accent */ function unaccent (d) { if (typeof d === 'string') { return d.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); } return d; } /** * Convert carriage return `\\r\\n` and line feed `\\n` to XML-specific code in rendered document * * Compatible with odt, and docx (beta) * * @version 1.1.0 * * @exampleContext { "extension" : "odt" } * @example [ "my blue \\n car" ] * @example [ "my blue \\r\\n car" ] * * @exampleContext { "extension" : "docx" } * @example [ "my blue \\n car" ] * @example [ "my blue \\r\\n car" ] * * @param {Integer|String} d * @return {String} return "XML carriage return" for odt and docx */ function convCRLF (d) { if (typeof d === 'string') { var _lineBreak = LINEBREAK[this.extension]; if (_lineBreak) { return d.replace(/\r?\n/g, _lineBreak); } } return d; } // this formatter is separately to inject code convCRLF.canInjectXML = true; /** * Slice a string with a begin and an end * * @version 1.2.0 * * @example ["foobar" , 0 , 3 ] * @example ["foobar" , 1 ] * @example ["foobar" , -2 ] * @example ["foobar" , 2 , -1] * * @param {String} d * @param {Integer} begin Zero-based index at which to begin extraction. * @param {Integer} end Zero-based index before which to end extraction * @return {String} return the formatted string */ function substr (d, begin, end) { if (typeof d === 'string') { return d.slice(begin, end); } return d; } /** * Pad the string from the start with another string * * @version 3.0.0 new * * @example ["abc", 10 ] * @example ["abc", 10, "foo" ] * @example ["abc", 6, "123465"] * @example ["abc", 8, "0" ] * @example ["abc", 1 ] * * @param {String} d * @param {number} targetLength The length of the resulting string once the string has been padded. * If the value is less than string length, then string is returned as-is. * @param {String} padString The string to pad the current str with. If padString is too long to stay * within the targetLength, it will be truncated from the end. The default value is " " * @return {String} return the padded left string */ function padl (d, targetLength, padString) { var _padString = ' '; if (padString !== undefined) { _padString = padString; } if (typeof d === 'string') { return d.padStart(targetLength, _padString); } if (typeof d === 'number') { return d.toString().padStart(targetLength, _padString); } return d; } /** * Pad the string from the end with another string * * @version 3.0.0 new * * @example ["abc", 10 ] * @example ["abc", 10, "foo" ] * @example ["abc", 6, "123465"] * @example ["abc", 8, "0" ] * @example ["abc", 1 ] * * @param {String} d * @param {number} targetLength The length of the resulting string once the string has been padded. * If the value is less than string length, then string is returned as-is. * @param {String} padString The string to pad the current str with. If padString is too long to stay * within the targetLength, it will be truncated from the end. The default value is " " * @return {String} return the padded right string */ function padr (d, targetLength, padString) { var _padString = ' '; if (padString !== undefined) { _padString = padString; } if (typeof d === 'string') { return d.padEnd(targetLength, _padString); } if (typeof d === 'number') { return d.toString().padEnd(targetLength, _padString); } return d; } function md5 (d) { return toMd5(d); } function prepend (d, toPrepend) { return toPrepend + d; } module.exports = { lowerCase : lowerCase, upperCase : upperCase, ucFirst : ucFirst, ucWords : ucWords, convEnum : convEnum, convCRLF : convCRLF, unaccent : unaccent, print : print, substr : substr, slice : substr, padl : padl, padr : padr, md5 : md5, prepend : prepend };