@@ -1379,13 +1379,27 @@ struct ArgumentsExpression {
1379
1379
}
1380
1380
};
1381
1381
1382
- static std::string strip (const std::string & s) {
1383
- auto start = s.find_first_not_of (" \t\n\r " );
1382
+ static std::string strip (const std::string & s, const std::string & chars = " " , bool left = true , bool right = true ) {
1383
+ auto charset = chars.empty () ? " \t\n\r " : chars;
1384
+ auto start = left ? s.find_first_not_of (charset) : 0 ;
1384
1385
if (start == std::string::npos) return " " ;
1385
- auto end = s.find_last_not_of (" \t\n\r " ) ;
1386
+ auto end = right ? s.find_last_not_of (charset) : s. size () - 1 ;
1386
1387
return s.substr (start, end - start + 1 );
1387
1388
}
1388
1389
1390
+ static std::vector<std::string> split (const std::string & s, const std::string & sep) {
1391
+ std::vector<std::string> result;
1392
+ size_t start = 0 ;
1393
+ size_t end = s.find (sep);
1394
+ while (end != std::string::npos) {
1395
+ result.push_back (s.substr (start, end - start));
1396
+ start = end + sep.length ();
1397
+ end = s.find (sep, start);
1398
+ }
1399
+ result.push_back (s.substr (start));
1400
+ return result;
1401
+ }
1402
+
1389
1403
static std::string capitalize (const std::string & s) {
1390
1404
if (s.empty ()) return s;
1391
1405
auto result = s;
@@ -1468,8 +1482,26 @@ class MethodCallExpr : public Expression {
1468
1482
} else if (obj.is_string ()) {
1469
1483
auto str = obj.get <std::string>();
1470
1484
if (method->get_name () == " strip" ) {
1471
- vargs.expectArgs (" strip method" , {0 , 0 }, {0 , 0 });
1472
- return Value (strip (str));
1485
+ vargs.expectArgs (" strip method" , {0 , 1 }, {0 , 0 });
1486
+ auto chars = vargs.args .empty () ? " " : vargs.args [0 ].get <std::string>();
1487
+ return Value (strip (str, chars));
1488
+ } else if (method->get_name () == " lstrip" ) {
1489
+ vargs.expectArgs (" lstrip method" , {0 , 1 }, {0 , 0 });
1490
+ auto chars = vargs.args .empty () ? " " : vargs.args [0 ].get <std::string>();
1491
+ return Value (strip (str, chars, /* left= */ true , /* right= */ false ));
1492
+ } else if (method->get_name () == " rstrip" ) {
1493
+ vargs.expectArgs (" rstrip method" , {0 , 1 }, {0 , 0 });
1494
+ auto chars = vargs.args .empty () ? " " : vargs.args [0 ].get <std::string>();
1495
+ return Value (strip (str, chars, /* left= */ false , /* right= */ true ));
1496
+ } else if (method->get_name () == " split" ) {
1497
+ vargs.expectArgs (" split method" , {1 , 1 }, {0 , 0 });
1498
+ auto sep = vargs.args [0 ].get <std::string>();
1499
+ auto parts = split (str, sep);
1500
+ Value result = Value::array ();
1501
+ for (const auto & part : parts) {
1502
+ result.push_back (Value (part));
1503
+ }
1504
+ return result;
1473
1505
} else if (method->get_name () == " capitalize" ) {
1474
1506
vargs.expectArgs (" capitalize method" , {0 , 0 }, {0 , 0 });
1475
1507
return Value (capitalize (str));
0 commit comments