diff options
Diffstat (limited to 'build-tools/lib/wordwrap')
-rw-r--r-- | build-tools/lib/wordwrap/LICENSE | 4 | ||||
-rw-r--r-- | build-tools/lib/wordwrap/index.js | 76 |
2 files changed, 80 insertions, 0 deletions
diff --git a/build-tools/lib/wordwrap/LICENSE b/build-tools/lib/wordwrap/LICENSE new file mode 100644 index 00000000..e65c0b24 --- /dev/null +++ b/build-tools/lib/wordwrap/LICENSE @@ -0,0 +1,4 @@ +Copyright 2011 James Halliday (mail@substack.net) + +This project is free software released under the MIT license: +http://www.opensource.org/licenses/mit-license.php diff --git a/build-tools/lib/wordwrap/index.js b/build-tools/lib/wordwrap/index.js new file mode 100644 index 00000000..c9bc9452 --- /dev/null +++ b/build-tools/lib/wordwrap/index.js @@ -0,0 +1,76 @@ +var wordwrap = module.exports = function (start, stop, params) { + if (typeof start === 'object') { + params = start; + start = params.start; + stop = params.stop; + } + + if (typeof stop === 'object') { + params = stop; + start = start || params.start; + stop = undefined; + } + + if (!stop) { + stop = start; + start = 0; + } + + if (!params) params = {}; + var mode = params.mode || 'soft'; + var re = mode === 'hard' ? /\b/ : /(\S+\s+)/; + + return function (text) { + var chunks = text.toString() + .split(re) + .reduce(function (acc, x) { + if (mode === 'hard') { + for (var i = 0; i < x.length; i += stop - start) { + acc.push(x.slice(i, i + stop - start)); + } + } + else acc.push(x) + return acc; + }, []) + ; + + return chunks.reduce(function (lines, rawChunk) { + if (rawChunk === '') return lines; + + var chunk = rawChunk.replace(/\t/g, ' '); + + var i = lines.length - 1; + if (lines[i].length + chunk.length > stop) { + lines[i] = lines[i].replace(/\s+$/, ''); + + chunk.split(/\n/).forEach(function (c) { + lines.push( + new Array(start + 1).join(' ') + + c.replace(/^\s+/, '') + ); + }); + } + else if (chunk.match(/\n/)) { + var xs = chunk.split(/\n/); + lines[i] += xs.shift(); + xs.forEach(function (c) { + lines.push( + new Array(start + 1).join(' ') + + c.replace(/^\s+/, '') + ); + }); + } + else { + lines[i] += chunk; + } + + return lines; + }, [ new Array(start + 1).join(' ') ]).join('\n'); + }; +}; + +wordwrap.soft = wordwrap; + +wordwrap.hard = function (start, stop) { + return wordwrap(start, stop, { mode : 'hard' }); +}; |