1

Suppose we have the following long string:

var str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dignissim viverra elementum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor at neque quis euismod. Mauris sed gravida urna. Donec tempor gravida elit, ut elementum lectus tincidunt nec. Donec arcu ligula, aliquet id eros consectetur, malesuada mollis dui. Aliquam egestas ligula non lobortis adipiscing.";

I want to add new lines (\n) characters after every 30 characters. If 30th character is not space, the next space will be replaced with new line.

str = foo(str, 30);

After this call, console.log(str) will output something like this:

//                           30
// ------------------------- |

> console.log(str);
"Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Vivamus dignissim
viverra elementum. Vestibulum ante
ipsum primis in faucibus orci
luctus et ultrices posuere cubilia
Curae; Vivamus porttitor at neque
quis euismod. Mauris sed gravida
urna. Donec tempor gravida elit,
ut elementum lectus tincidunt 
nec. Donec arcu ligula, aliquet
id eros consectetur, malesuada 
mollis dui. Aliquam egestas ligula
non lobortis adipiscing."

I know it should be possible with some loops, but maybe it's possible with some magic regular expressions (RegExp + split + join, replace?).

What's the cleanest/optimal way?


My first workaround is:

var str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dignissim viverra elementum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor at neque quis euismod. Mauris sed gravida urna. Donec tempor gravida elit, ut elementum lectus tincidunt nec. Donec arcu ligula, aliquet id eros consectetur, malesuada mollis dui. Aliquam egestas ligula non lobortis adipiscing.";

const LIMIT = 30;

var newStr = "";
var last = 0;
for (var i = 0; i < str.length; i += (LIMIT - 1)) {
    var next = last + LIMIT;

    if (str[next] !== " ") {
        for (var ii = next; ii < str.length; ++ii) {
            if (str[ii] === " ") {
                next = ii;
                break;
            }
        }
    }

    newStr += str.substring(last, next).trimLeft() + "\n";
    last = next;
}

console.log(newStr);
Ionică Bizău
  • 109,027
  • 88
  • 289
  • 474

2 Answers2

3
newStr = str.match(/.{1,30}(\s|$)|\S+?(\s|$)/g).join('\n');
MC ND
  • 69,615
  • 8
  • 84
  • 126
2

Your right, there is a fancy way of doing this.

var str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus dignissim viverra elementum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor at neque quis euismod. Mauris sed gravida urna. Donec tempor gravida elit, ut elementum lectus tincidunt nec. Donec arcu ligula, aliquet id eros consectetur, malesuada mollis dui. Aliquam egestas ligula non lobortis adipiscing.";

var foo = function(str, delimiter){
       return str.match(/.{1,30}\W/g).join("\n")
}

str = foo(str, 30);
console.log(str);

EDIT added the 'join' from the other answer

Jan Drewniak
  • 1,316
  • 15
  • 18