From a64a18bef8ddd8bda2afea7b383d9309c7a4cae6 Mon Sep 17 00:00:00 2001 From: Dennis Shtatnov Date: Sun, 16 Dec 2018 09:35:15 -0500 Subject: [PATCH] fix(polyfill) String.prototype.repeat --- src/helpers.js | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/helpers.js b/src/helpers.js index 33cefd7..8ef04ba 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -357,6 +357,45 @@ showdown.helper.encodeEmailAddress = function (mail) { }; /** + * String.prototype.repeat polyfill + * + * @param str + * @param count + * @returns {string} + */ +function repeat (str, count) { + 'use strict'; + str = '' + str; + if (count < 0) { + throw new RangeError('repeat count must be non-negative'); + } + if (count === Infinity) { + throw new RangeError('repeat count must be less than infinity'); + } + count = Math.floor(count); + if (str.length === 0 || count === 0) { + return ''; + } + // Ensuring count is a 31-bit integer allows us to heavily optimize the + // main part. But anyway, most current (August 2014) browsers can't handle + // strings 1 << 28 chars or longer, so: + /*jshint bitwise: false*/ + if (str.length * count >= 1 << 28) { + throw new RangeError('repeat count must not overflow maximum string size'); + } + /*jshint bitwise: true*/ + var maxCount = str.length * count; + count = Math.floor(Math.log(count) / Math.log(2)); + while (count) { + str += str; + count--; + } + str += str.substring(0, maxCount - str.length); + return str; +} + +/** + * String.prototype.padEnd polyfill * * @param str * @param targetLength @@ -375,7 +414,7 @@ showdown.helper.padEnd = function padEnd (str, targetLength, padString) { } else { targetLength = targetLength - str.length; if (targetLength > padString.length) { - padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed + padString += repeat(padString, targetLength / padString.length); //append to original to ensure we are longer than needed } return String(str) + padString.slice(0,targetLength); }