Revert "Export"
[framework/web/web-ui-fw.git] / build-tools / lib / wordwrap / 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 };