| Conditions | 1 |
| Paths | 2304 |
| Total Lines | 141 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | define(['underscore', 'asap'], function(_, asap) { |
||
| 2 | 'use strict'; |
||
| 3 | |||
| 4 | _.mixin({ |
||
| 5 | nl2br: function(str) { |
||
| 6 | var breakTag = '<br />'; |
||
| 7 | return String(str).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2'); |
||
| 8 | }, |
||
| 9 | |||
| 10 | trunc: function(str, maxLength, useWordBoundary, hellip) { |
||
| 11 | hellip = hellip || '…'; |
||
| 12 | var toLong = str.length > maxLength; |
||
| 13 | str = toLong ? str.substr(0, maxLength - 1) : str; |
||
| 14 | var lastSpace = str.lastIndexOf(' '); |
||
| 15 | str = useWordBoundary && toLong && lastSpace > 0 ? str.substr(0, lastSpace) : str; |
||
| 16 | return toLong ? str + hellip : str; |
||
| 17 | }, |
||
| 18 | |||
| 19 | isMobile: function() { |
||
| 20 | var elem = document.getElementsByTagName('body')[0]; |
||
| 21 | return elem && (' ' + elem.className + ' ') |
||
| 22 | .replace(/[\t\r\n\f]/g, ' ') |
||
| 23 | .indexOf(' mobile-version ') !== -1; |
||
| 24 | }, |
||
| 25 | |||
| 26 | isDesktop: function() { |
||
| 27 | return !this.isMobile(); |
||
| 28 | }, |
||
| 29 | |||
| 30 | trim: function(text) { |
||
| 31 | return text.replace(/^\s*/, '').replace(/\s*$/, ''); |
||
| 32 | }, |
||
| 33 | |||
| 34 | capitalize: function(text) { |
||
| 35 | return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase(); |
||
| 36 | }, |
||
| 37 | |||
| 38 | /** |
||
| 39 | * Compares two arrays if they have the same set of elements |
||
| 40 | * |
||
| 41 | * @param firstArray {Array} |
||
| 42 | * @param secondArray {Array} |
||
| 43 | * @returns {boolean} |
||
| 44 | */ |
||
| 45 | haveEqualSet: function(firstArray, secondArray) { |
||
| 46 | return firstArray.length === secondArray.length && _.difference(firstArray, secondArray).length === 0; |
||
| 47 | }, |
||
| 48 | |||
| 49 | /** |
||
| 50 | * The Number.isSafeInteger() method determines whether the provided value is a number that is a safe integer. |
||
| 51 | * @param number {testValue} |
||
| 52 | * @return {boolean} |
||
| 53 | */ |
||
| 54 | isSafeInteger: function(number) { |
||
| 55 | // 0. Try use native API |
||
| 56 | if (Number.isSafeInteger) { |
||
| 57 | return Number.isSafeInteger(number); |
||
| 58 | } |
||
| 59 | |||
| 60 | // 1. If Type(number) is not Number, return false. |
||
| 61 | if (typeof(number) !== 'number') { |
||
| 62 | return false; |
||
| 63 | } |
||
| 64 | // 2. If number is NaN, +∞, or -∞, return false. |
||
| 65 | if (this.isNaN(number) || number === Infinity || number === -Infinity) { |
||
| 66 | return false; |
||
| 67 | } |
||
| 68 | // 3. Let integer. |
||
| 69 | var integer = parseInt(number); |
||
| 70 | // 4. If integer is not equal to number, return false. |
||
| 71 | if (integer !== number) { |
||
| 72 | return false; |
||
| 73 | } |
||
| 74 | // 5. If abs(integer) ≤ 2^53-1, return true. |
||
| 75 | if (Math.abs(integer) <= (Math.pow(2, 53) - 1)) { |
||
| 76 | return true; |
||
| 77 | } |
||
| 78 | // 6. Otherwise, return false. |
||
| 79 | return false; |
||
| 80 | } |
||
| 81 | }); |
||
| 82 | |||
| 83 | _.templateSettings.innerTempStart = '<%#'; |
||
| 84 | _.templateSettings.innerTempEnd = '#%>'; |
||
| 85 | |||
| 86 | _.template = _.wrap(_.template, function(original, text, settings, oldSettings) { |
||
| 87 | if (!settings && oldSettings) { |
||
| 88 | settings = oldSettings; |
||
| 89 | } |
||
| 90 | settings = _.defaults({}, settings, _.templateSettings); |
||
| 91 | |||
| 92 | var regexStart = new RegExp('^' + settings.innerTempStart); |
||
| 93 | var regexEnd = new RegExp(settings.innerTempEnd + '$'); |
||
| 94 | var evaluateStart = '(' + _.templateSettings.innerTempStart + ')'; |
||
| 95 | var evaluateEnd = '|(' + _.templateSettings.innerTempEnd + ')'; |
||
| 96 | |||
| 97 | var innerTempEvaluate = new RegExp(evaluateStart + evaluateEnd, 'g'); |
||
| 98 | |||
| 99 | text = _.trim(text).replace(regexStart, '').replace(regexEnd, ''); |
||
| 100 | |||
| 101 | var escapedText = text; |
||
| 102 | |||
| 103 | var levelOffsets = {}; |
||
| 104 | var level = 0; |
||
| 105 | var offsetDelta = 0; |
||
| 106 | |||
| 107 | var escapeText = function(text) { |
||
| 108 | return text.replace(/\<\;\%/g, '&lt;%').replace(/<%/g, '<%').replace(/%>/g, '%>'); |
||
| 109 | }; |
||
| 110 | |||
| 111 | text.replace(innerTempEvaluate, function(match, open, close, offset) { |
||
| 112 | offset += offsetDelta; |
||
| 113 | if (open) { |
||
| 114 | level++; |
||
| 115 | levelOffsets[level] = offset; |
||
| 116 | } |
||
| 117 | if (close && level) { |
||
| 118 | var start = escapedText.slice(0, levelOffsets[level]); |
||
| 119 | var end = escapedText.slice(offset + close.length); |
||
| 120 | var escape = escapedText.slice(levelOffsets[level] + settings.innerTempStart.length, offset); |
||
| 121 | var newEscape = escapeText(escape); |
||
| 122 | |||
| 123 | offsetDelta += newEscape.length - escape.length - (settings.innerTempEnd.length * 2); |
||
| 124 | escapedText = start + newEscape + end; |
||
| 125 | level--; |
||
| 126 | } |
||
| 127 | |||
| 128 | // Adobe VMs need the match returned to produce the correct offset. |
||
| 129 | return match; |
||
| 130 | }); |
||
| 131 | arguments[1] = _.trim(escapedText); |
||
| 132 | |||
| 133 | var func = original.apply(this, _.rest(arguments)); |
||
| 134 | func._source = arguments[1]; |
||
| 135 | return func; |
||
| 136 | }); |
||
| 137 | |||
| 138 | _.defer = asap; |
||
| 139 | |||
| 140 | return _; |
||
| 141 | }); |
||
| 142 |