wordWrap.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. var map = require('./map');
  2. var reduce = require('./reduce');
  3. var concat = require('./concat');
  4. var last = require('./last');
  5. var trim = require('./trim');
  6. exports = function(txt, width) {
  7. var lines = txt.split('\n');
  8. return map(lines, function(line) {
  9. return wrap(line, width);
  10. }).join('\n');
  11. };
  12. var regWordBoundary = /(\S+\s+)/;
  13. function wrap(txt, width) {
  14. var chunks = reduce(
  15. txt.split(regWordBoundary),
  16. function(chunks, word) {
  17. if (trim(word) === '') return chunks;
  18. if (word.length > width) {
  19. chunks = concat(
  20. chunks,
  21. word.match(new RegExp('.{1,'.concat(width, '}'), 'g'))
  22. );
  23. } else {
  24. chunks.push(word);
  25. }
  26. return chunks;
  27. },
  28. []
  29. );
  30. var lines = reduce(
  31. chunks,
  32. function(lines, chunk) {
  33. var lastLine = last(lines);
  34. if (lastLine.length + chunk.length > width) {
  35. if (trim(lastLine) === '') {
  36. lines.pop();
  37. }
  38. lines.push(chunk);
  39. } else {
  40. lines[lines.length - 1] = lastLine + chunk;
  41. }
  42. return lines;
  43. },
  44. [chunks.shift()]
  45. );
  46. return lines.join('\n');
  47. }
  48. module.exports = exports;