index.js
 1  var wordwrap = module.exports = function (start, stop, params) {
 2      if (typeof start === 'object') {
 3          params = start;
 4          start = params.start;
 5          stop = params.stop;
 6      }
 7      
 8      if (typeof stop === 'object') {
 9          params = stop;
10          start = start || params.start;
11          stop = undefined;
12      }
13      
14      if (!stop) {
15          stop = start;
16          start = 0;
17      }
18      
19      if (!params) params = {};
20      var mode = params.mode || 'soft';
21      var re = mode === 'hard' ? /\b/ : /(\S+\s+)/;
22      
23      return function (text) {
24          var chunks = text.toString()
25              .split(re)
26              .reduce(function (acc, x) {
27                  if (mode === 'hard') {
28                      for (var i = 0; i < x.length; i += stop - start) {
29                          acc.push(x.slice(i, i + stop - start));
30                      }
31                  }
32                  else acc.push(x)
33                  return acc;
34              }, [])
35          ;
36          
37          return chunks.reduce(function (lines, rawChunk) {
38              if (rawChunk === '') return lines;
39              
40              var chunk = rawChunk.replace(/\t/g, '    ');
41              
42              var i = lines.length - 1;
43              if (lines[i].length + chunk.length > stop) {
44                  lines[i] = lines[i].replace(/\s+$/, '');
45                  
46                  chunk.split(/\n/).forEach(function (c) {
47                      lines.push(
48                          new Array(start + 1).join(' ')
49                          + c.replace(/^\s+/, '')
50                      );
51                  });
52              }
53              else if (chunk.match(/\n/)) {
54                  var xs = chunk.split(/\n/);
55                  lines[i] += xs.shift();
56                  xs.forEach(function (c) {
57                      lines.push(
58                          new Array(start + 1).join(' ')
59                          + c.replace(/^\s+/, '')
60                      );
61                  });
62              }
63              else {
64                  lines[i] += chunk;
65              }
66              
67              return lines;
68          }, [ new Array(start + 1).join(' ') ]).join('\n');
69      };
70  };
71  
72  wordwrap.soft = wordwrap;
73  
74  wordwrap.hard = function (start, stop) {
75      return wordwrap(start, stop, { mode : 'hard' });
76  };