@@ -1378,13 +1378,27 @@ struct ArgumentsExpression {
13781378 }
13791379};
13801380
1381- static std::string strip (const std::string & s) {
1382- auto start = s.find_first_not_of (" \t\n\r " );
1381+ static std::string strip (const std::string & s, const std::string & chars = " " , bool left = true , bool right = true ) {
1382+ auto charset = chars.empty () ? " \t\n\r " : chars;
1383+ auto start = left ? s.find_first_not_of (charset) : 0 ;
13831384 if (start == std::string::npos) return " " ;
1384- auto end = s.find_last_not_of (" \t\n\r " ) ;
1385+ auto end = right ? s.find_last_not_of (charset) : s. size () - 1 ;
13851386 return s.substr (start, end - start + 1 );
13861387}
13871388
1389+ static std::vector<std::string> split (const std::string & s, const std::string & sep) {
1390+ std::vector<std::string> result;
1391+ size_t start = 0 ;
1392+ size_t end = s.find (sep);
1393+ while (end != std::string::npos) {
1394+ result.push_back (s.substr (start, end - start));
1395+ start = end + sep.length ();
1396+ end = s.find (sep, start);
1397+ }
1398+ result.push_back (s.substr (start));
1399+ return result;
1400+ }
1401+
13881402static std::string capitalize (const std::string & s) {
13891403 if (s.empty ()) return s;
13901404 auto result = s;
@@ -1467,8 +1481,26 @@ class MethodCallExpr : public Expression {
14671481 } else if (obj.is_string ()) {
14681482 auto str = obj.get <std::string>();
14691483 if (method->get_name () == " strip" ) {
1470- vargs.expectArgs (" strip method" , {0 , 0 }, {0 , 0 });
1471- return Value (strip (str));
1484+ vargs.expectArgs (" strip method" , {0 , 1 }, {0 , 0 });
1485+ auto chars = vargs.args .empty () ? " " : vargs.args [0 ].get <std::string>();
1486+ return Value (strip (str, chars));
1487+ } else if (method->get_name () == " lstrip" ) {
1488+ vargs.expectArgs (" lstrip method" , {0 , 1 }, {0 , 0 });
1489+ auto chars = vargs.args .empty () ? " " : vargs.args [0 ].get <std::string>();
1490+ return Value (strip (str, chars, /* left= */ true , /* right= */ false ));
1491+ } else if (method->get_name () == " rstrip" ) {
1492+ vargs.expectArgs (" rstrip method" , {0 , 1 }, {0 , 0 });
1493+ auto chars = vargs.args .empty () ? " " : vargs.args [0 ].get <std::string>();
1494+ return Value (strip (str, chars, /* left= */ false , /* right= */ true ));
1495+ } else if (method->get_name () == " split" ) {
1496+ vargs.expectArgs (" split method" , {1 , 1 }, {0 , 0 });
1497+ auto sep = vargs.args [0 ].get <std::string>();
1498+ auto parts = split (str, sep);
1499+ Value result = Value::array ();
1500+ for (const auto & part : parts) {
1501+ result.push_back (Value (part));
1502+ }
1503+ return result;
14721504 } else if (method->get_name () == " capitalize" ) {
14731505 vargs.expectArgs (" capitalize method" , {0 , 0 }, {0 , 0 });
14741506 return Value (capitalize (str));
0 commit comments