From 42b7bc6100b1b78cf4f43e5955ec5bcf2968a695 Mon Sep 17 00:00:00 2001 From: Timothy Su Date: Thu, 26 May 2016 13:14:46 -0400 Subject: [PATCH] Add optional conjunction parameter to oxford --- README.md | 14 ++++++++++++-- __tests__/humanize.spec.js | 9 +++++++++ dist/humanize.js | 8 +++++--- dist/humanize.min.js | 2 +- src/humanize.js | 8 ++++---- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2eb3ecb..ea746af 100644 --- a/README.md +++ b/README.md @@ -256,7 +256,7 @@ Alias for `titleCase` ### Arrays ##### oxford -Converts a list of items to a human readable string with an optional limit. +Converts a list of items to a human readable string with an optional limit, limit string, and conjunction. ```javascript items = ['apple', 'orange', 'banana', 'pear', 'pineapple'] @@ -264,6 +264,7 @@ items = ['apple', 'orange', 'banana', 'pear', 'pineapple'] Humanize.oxford(items) // "apple, orange, banana, pear, and pineapple" +// Limit items shown Humanize.oxford(items, 3) // "apple, orange, banana, and 2 others" @@ -271,8 +272,17 @@ Humanize.oxford(items, 3) Humanize.oxford(items, 4) // "apple, orange, banana, pear, and 1 other" +// Specify a limit string Humanize.oxford(items, 3, "and some other fruits") // "apple, orange, banana, and some other fruits" + +// Pick a conjunction (defaults to 'and') +Humanize.oxford(items, null, null, "or") +// "apple, orange, banana, pear, or pineapple" + +// Also works with a limit +Humanize.oxford(items, 3, null, "with") +// "apple, orange, banana, with 2 others" ``` ##### frequency @@ -317,7 +327,7 @@ Please don't edit files in the `dist` subdirectory as they are generated through ## Compiling -`npm run install && npm run build` +`npm install && npm run build` And that's it! diff --git a/__tests__/humanize.spec.js b/__tests__/humanize.spec.js index b49aee9..0ed0704 100644 --- a/__tests__/humanize.spec.js +++ b/__tests__/humanize.spec.js @@ -243,6 +243,15 @@ describe('Converting a list to a readable, oxford commafied string', () => { expect(Humanize.oxford(items.slice(0), 3, limitStr)).toEqual(`apple, orange, banana${limitStr}`); expect(Humanize.oxford(items.slice(0, 3), 3, limitStr)).toEqual('apple, orange, and banana'); }); + + it('should accept custom conjunctions', () => { + const conjunction = 'or'; + const limitStr = ', and some other fruits'; + + expect(Humanize.oxford(items.slice(0), null, null, conjunction)).toEqual(`apple, orange, banana, pear, ${conjunction} pineapple`); + expect(Humanize.oxford(items.slice(0), 3, limitStr, conjunction)).toEqual(`apple, orange, banana${limitStr}`); + expect(Humanize.oxford(items.slice(0), 3, null, conjunction)).toEqual(`apple, orange, banana, ${conjunction} 2 others`); + }) }); describe('Converting a hashmap to a dictionary-like string', () => { diff --git a/dist/humanize.js b/dist/humanize.js index 876dae9..e0faf72 100644 --- a/dist/humanize.js +++ b/dist/humanize.js @@ -355,20 +355,22 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol // Converts a list of items to a human readable string with an optional limit. oxford: function oxford(items, limit, limitStr) { + var conjunction = arguments.length <= 3 || arguments[3] === undefined ? 'and' : arguments[3]; + var numItems = items.length; var limitIndex = void 0; if (numItems < 2) { return String(items); } else if (numItems === 2) { - return items.join(' and '); + return items.join(' ' + conjunction + ' '); } else if (exists(limit) && numItems > limit) { var extra = numItems - limit; limitIndex = limit; - limitStr = exists(limitStr) ? limitStr : ', and ' + extra + ' ' + Humanize.pluralize(extra, 'other'); + limitStr = exists(limitStr) ? limitStr : ', ' + conjunction + ' ' + extra + ' ' + Humanize.pluralize(extra, 'other'); } else { limitIndex = -1; - limitStr = ', and ' + items[numItems - 1]; + limitStr = ', ' + conjunction + ' ' + items[numItems - 1]; } return items.slice(0, limitIndex).join(', ') + limitStr; diff --git a/dist/humanize.min.js b/dist/humanize.min.js index 30c3a62..da247c3 100644 --- a/dist/humanize.min.js +++ b/dist/humanize.min.js @@ -1,2 +1,2 @@ /* humanize.min.js - v1.8.2 */ -"use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol?"symbol":typeof n};!function(n,e){"object"===("undefined"==typeof exports?"undefined":_typeof(exports))?module.exports=e():"function"==typeof define&&define.amd?define([],function(){return n.Humanize=e()}):n.Humanize=e()}(this,function(){var n=[{name:"second",value:1e3},{name:"minute",value:6e4},{name:"hour",value:36e5},{name:"day",value:864e5},{name:"week",value:6048e5}],e={P:Math.pow(2,50),T:Math.pow(2,40),G:Math.pow(2,30),M:Math.pow(2,20)},t=function(n){return"undefined"!=typeof n&&null!==n},r=function(n){return n!==n},i=function(n){return isFinite(n)&&!r(parseFloat(n))},o=function(n){var e=Object.prototype.toString.call(n);return"[object Array]"===e},a={intword:function(n,e){var t=arguments.length<=2||void 0===arguments[2]?2:arguments[2];return a.compactInteger(n,t)},compactInteger:function(n){var e=arguments.length<=1||void 0===arguments[1]?0:arguments[1];e=Math.max(e,0);var t=parseInt(n,10),r=0>t?"-":"",i=Math.abs(t),o=String(i),a=o.length,u=[13,10,7,4],l=["T","B","M","k"];if(1e3>i)return""+r+o;if(a>u[0]+3)return t.toExponential(e).replace("e+","x10^");for(var f=void 0,c=0;c=v){f=v;break}}var s=a-f+1,d=o.split(""),p=d.slice(0,s),h=d.slice(s,s+e+1),g=p.join(""),m=h.join("");m.length=i)return a.formatNumber(n/i,t,"")+" "+r+"B"}return n>=1024?a.formatNumber(n/1024,0)+" KB":a.formatNumber(n,0)+a.pluralize(n," byte")},filesize:function(){return a.fileSize.apply(a,arguments)},formatNumber:function(n){var e=arguments.length<=1||void 0===arguments[1]?0:arguments[1],t=arguments.length<=2||void 0===arguments[2]?",":arguments[2],r=arguments.length<=3||void 0===arguments[3]?".":arguments[3],i=function(n,e,t){return t?n.substr(0,t)+e:""},o=function(n,e,t){return n.substr(t).replace(/(\d{3})(?=\d)/g,"$1"+e)},u=function(n,e,t){return t?e+a.toFixed(Math.abs(n),t).split(".")[1]:""},l=a.normalizePrecision(e),f=0>n&&"-"||"",c=String(parseInt(a.toFixed(Math.abs(n||0),l),10)),v=c.length>3?c.length%3:0;return f+i(c,t,v)+o(c,t,v)+u(n,r,l)},toFixed:function(n,e){e=t(e)?e:a.normalizePrecision(e,0);var r=Math.pow(10,e);return(Math.round(n*r)/r).toFixed(e)},normalizePrecision:function(n,e){return n=Math.round(Math.abs(n)),r(n)?e:n},ordinal:function(n){var e=parseInt(n,10);if(0===e)return n;var t=e%100;if([11,12,13].indexOf(t)>=0)return e+"th";var r=e%10,i=void 0;switch(r){case 1:i="st";break;case 2:i="nd";break;case 3:i="rd";break;default:i="th"}return""+e+i},times:function(n){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(i(n)&&n>=0){var r=parseFloat(n),o=["never","once","twice"];if(t(e[r]))return String(e[r]);var a=t(o[r])&&o[r].toString();return a||r.toString()+" times"}return null},pluralize:function(n,e,r){return t(n)&&t(e)?(r=t(r)?r:e+"s",1===parseInt(n,10)?e:r):null},truncate:function(n){var e=arguments.length<=1||void 0===arguments[1]?100:arguments[1],t=arguments.length<=2||void 0===arguments[2]?"...":arguments[2];return n.length>e?n.substring(0,e-t.length)+t:n},truncateWords:function(n,e){for(var r=n.split(" "),i="",o=0;e>o;)t(r[o])&&(i+=r[o]+" "),o++;return r.length>e?i+"...":null},truncatewords:function(){return a.truncateWords.apply(a,arguments)},boundedNumber:function(n){var e=arguments.length<=1||void 0===arguments[1]?100:arguments[1],t=arguments.length<=2||void 0===arguments[2]?"+":arguments[2],r=void 0;return i(n)&&i(e)&&n>e&&(r=e+t),(r||n).toString()},truncatenumber:function(){return a.boundedNumber.apply(a,arguments)},oxford:function(n,e,r){var i=n.length,o=void 0;if(2>i)return String(n);if(2===i)return n.join(" and ");if(t(e)&&i>e){var u=i-e;o=e,r=t(r)?r:", and "+u+" "+a.pluralize(u,"other")}else o=-1,r=", and "+n[i-1];return n.slice(0,o).join(", ")+r},dictionary:function(n){var e=arguments.length<=1||void 0===arguments[1]?" is ":arguments[1],r=arguments.length<=2||void 0===arguments[2]?", ":arguments[2],i="";if(t(n)&&"object"===("undefined"==typeof n?"undefined":_typeof(n))&&!o(n)){var a=[];for(var u in n)if(n.hasOwnProperty(u)){var l=n[u];a.push(""+u+e+l)}return a.join(r)}return i},frequency:function(n,e){if(!o(n))return null;var t=n.length,r=a.times(t);return 0===t?r+" "+e:e+" "+r},pace:function(e,t){var r=arguments.length<=2||void 0===arguments[2]?"time":arguments[2];if(0===e||0===t)return"No "+a.pluralize(0,r);for(var i="Approximately",o=void 0,u=void 0,l=e/t,f=0;f1){o=c.name;break}}o||(i="Less than",u=1,o=n[n.length-1].name);var v=Math.round(u);return r=a.pluralize(v,r),i+" "+v+" "+r+" per "+o},nl2br:function(n){var e=arguments.length<=1||void 0===arguments[1]?"
":arguments[1];return n.replace(/\n/g,e)},br2nl:function(n){var e=arguments.length<=1||void 0===arguments[1]?"\r\n":arguments[1];return n.replace(/\/g,e)},capitalize:function(n){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return""+n.charAt(0).toUpperCase()+(e?n.slice(1).toLowerCase():n.slice(1))},capitalizeAll:function(n){return n.replace(/(?:^|\s)\S/g,function(n){return n.toUpperCase()})},titleCase:function(n){var e=/\b(a|an|and|at|but|by|de|en|for|if|in|of|on|or|the|to|via|vs?\.?)\b/i,t=/\S+[A-Z]+\S*/,r=/\s+/,i=/-/,o=void 0;return(o=function(n){for(var u=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],l=arguments.length<=2||void 0===arguments[2]?!0:arguments[2],f=[],c=n.split(u?i:r),v=0;vt?"-":"",i=Math.abs(t),o=String(i),a=o.length,u=[13,10,7,4],l=["T","B","M","k"];if(1e3>i)return""+r+o;if(a>u[0]+3)return t.toExponential(n).replace("e+","x10^");for(var f=void 0,c=0;c=v){f=v;break}}var s=a-f+1,d=o.split(""),p=d.slice(0,s),h=d.slice(s,s+n+1),g=p.join(""),m=h.join("");m.length=i)return a.formatNumber(e/i,t,"")+" "+r+"B"}return e>=1024?a.formatNumber(e/1024,0)+" KB":a.formatNumber(e,0)+a.pluralize(e," byte")},filesize:function(){return a.fileSize.apply(a,arguments)},formatNumber:function(e){var n=arguments.length<=1||void 0===arguments[1]?0:arguments[1],t=arguments.length<=2||void 0===arguments[2]?",":arguments[2],r=arguments.length<=3||void 0===arguments[3]?".":arguments[3],i=function(e,n,t){return t?e.substr(0,t)+n:""},o=function(e,n,t){return e.substr(t).replace(/(\d{3})(?=\d)/g,"$1"+n)},u=function(e,n,t){return t?n+a.toFixed(Math.abs(e),t).split(".")[1]:""},l=a.normalizePrecision(n),f=0>e&&"-"||"",c=String(parseInt(a.toFixed(Math.abs(e||0),l),10)),v=c.length>3?c.length%3:0;return f+i(c,t,v)+o(c,t,v)+u(e,r,l)},toFixed:function(e,n){n=t(n)?n:a.normalizePrecision(n,0);var r=Math.pow(10,n);return(Math.round(e*r)/r).toFixed(n)},normalizePrecision:function(e,n){return e=Math.round(Math.abs(e)),r(e)?n:e},ordinal:function(e){var n=parseInt(e,10);if(0===n)return e;var t=n%100;if([11,12,13].indexOf(t)>=0)return n+"th";var r=n%10,i=void 0;switch(r){case 1:i="st";break;case 2:i="nd";break;case 3:i="rd";break;default:i="th"}return""+n+i},times:function(e){var n=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(i(e)&&e>=0){var r=parseFloat(e),o=["never","once","twice"];if(t(n[r]))return String(n[r]);var a=t(o[r])&&o[r].toString();return a||r.toString()+" times"}return null},pluralize:function(e,n,r){return t(e)&&t(n)?(r=t(r)?r:n+"s",1===parseInt(e,10)?n:r):null},truncate:function(e){var n=arguments.length<=1||void 0===arguments[1]?100:arguments[1],t=arguments.length<=2||void 0===arguments[2]?"...":arguments[2];return e.length>n?e.substring(0,n-t.length)+t:e},truncateWords:function(e,n){for(var r=e.split(" "),i="",o=0;n>o;)t(r[o])&&(i+=r[o]+" "),o++;return r.length>n?i+"...":null},truncatewords:function(){return a.truncateWords.apply(a,arguments)},boundedNumber:function(e){var n=arguments.length<=1||void 0===arguments[1]?100:arguments[1],t=arguments.length<=2||void 0===arguments[2]?"+":arguments[2],r=void 0;return i(e)&&i(n)&&e>n&&(r=n+t),(r||e).toString()},truncatenumber:function(){return a.boundedNumber.apply(a,arguments)},oxford:function(e,n,r){var i=arguments.length<=3||void 0===arguments[3]?"and":arguments[3],o=e.length,u=void 0;if(2>o)return String(e);if(2===o)return e.join(" "+i+" ");if(t(n)&&o>n){var l=o-n;u=n,r=t(r)?r:", "+i+" "+l+" "+a.pluralize(l,"other")}else u=-1,r=", "+i+" "+e[o-1];return e.slice(0,u).join(", ")+r},dictionary:function(e){var n=arguments.length<=1||void 0===arguments[1]?" is ":arguments[1],r=arguments.length<=2||void 0===arguments[2]?", ":arguments[2],i="";if(t(e)&&"object"===("undefined"==typeof e?"undefined":_typeof(e))&&!o(e)){var a=[];for(var u in e)if(e.hasOwnProperty(u)){var l=e[u];a.push(""+u+n+l)}return a.join(r)}return i},frequency:function(e,n){if(!o(e))return null;var t=e.length,r=a.times(t);return 0===t?r+" "+n:n+" "+r},pace:function(n,t){var r=arguments.length<=2||void 0===arguments[2]?"time":arguments[2];if(0===n||0===t)return"No "+a.pluralize(0,r);for(var i="Approximately",o=void 0,u=void 0,l=n/t,f=0;f1){o=c.name;break}}o||(i="Less than",u=1,o=e[e.length-1].name);var v=Math.round(u);return r=a.pluralize(v,r),i+" "+v+" "+r+" per "+o},nl2br:function(e){var n=arguments.length<=1||void 0===arguments[1]?"
":arguments[1];return e.replace(/\n/g,n)},br2nl:function(e){var n=arguments.length<=1||void 0===arguments[1]?"\r\n":arguments[1];return e.replace(/\/g,n)},capitalize:function(e){var n=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return""+e.charAt(0).toUpperCase()+(n?e.slice(1).toLowerCase():e.slice(1))},capitalizeAll:function(e){return e.replace(/(?:^|\s)\S/g,function(e){return e.toUpperCase()})},titleCase:function(e){var n=/\b(a|an|and|at|but|by|de|en|for|if|in|of|on|or|the|to|via|vs?\.?)\b/i,t=/\S+[A-Z]+\S*/,r=/\s+/,i=/-/,o=void 0;return(o=function(e){for(var u=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],l=arguments.length<=2||void 0===arguments[2]?!0:arguments[2],f=[],c=e.split(u?i:r),v=0;v limit) { const extra = numItems - limit; limitIndex = limit; - limitStr = exists(limitStr) ? limitStr : `, and ${extra} ${Humanize.pluralize(extra, 'other')}`; + limitStr = exists(limitStr) ? limitStr : `, ${conjunction} ${extra} ${Humanize.pluralize(extra, 'other')}`; } else { limitIndex = -1; - limitStr = `, and ${items[numItems - 1]}`; + limitStr = `, ${conjunction} ${items[numItems - 1]}`; } return items.slice(0, limitIndex).join(', ') + limitStr;