var map = require('./map'); var reduce = require('./reduce'); var concat = require('./concat'); var last = require('./last'); var trim = require('./trim'); exports = function(txt, width) { var lines = txt.split('\n'); return map(lines, function(line) { return wrap(line, width); }).join('\n'); }; var regWordBoundary = /(\S+\s+)/; function wrap(txt, width) { var chunks = reduce( txt.split(regWordBoundary), function(chunks, word) { if (trim(word) === '') return chunks; if (word.length > width) { chunks = concat( chunks, word.match(new RegExp('.{1,'.concat(width, '}'), 'g')) ); } else { chunks.push(word); } return chunks; }, [] ); var lines = reduce( chunks, function(lines, chunk) { var lastLine = last(lines); if (lastLine.length + chunk.length > width) { if (trim(lastLine) === '') { lines.pop(); } lines.push(chunk); } else { lines[lines.length - 1] = lastLine + chunk; } return lines; }, [chunks.shift()] ); return lines.join('\n'); } module.exports = exports;