Test Setup Failed
Push — master ( d60e73...a71a5d )
by
unknown
04:37 queued 10s
created

underscore.js ➔ define   B

Complexity

Conditions 1
Paths 2304

Size

Total Lines 141

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
nc 2304
dl 0
loc 141
rs 8.2857
c 1
b 0
f 0
nop 2

9 Functions

Rating   Name   Duplication   Size   Complexity  
A underscore.js ➔ ... ➔ _.mixin.capitalize 0 3 1
B underscore.js ➔ ... ➔ _.mixin.trunc 0 8 6
A underscore.js ➔ ... ➔ _.mixin.trim 0 3 1
A underscore.js ➔ ... ➔ _.mixin.isDesktop 0 3 1
A underscore.js ➔ ... ➔ _.mixin.nl2br 0 4 1
A underscore.js ➔ ... ➔ _.mixin.isMobile 0 6 1
A underscore.js ➔ ... ➔ _.wrap 0 51 3
C underscore.js ➔ ... ➔ _.mixin.isSafeInteger 0 27 8
A underscore.js ➔ ... ➔ _.mixin.haveEqualSet 0 3 1

How to fix   Long Method   

Long Method

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:

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 || '&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(/\&lt\;\%/g, '&amp;lt;%').replace(/<%/g, '&lt;%').replace(/%>/g, '%&gt;');
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