@@ -1379,13 +1379,27 @@ struct ArgumentsExpression {
13791379 }
13801380};
13811381
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 ;
13841385 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 ;
13861387 return s.substr (start, end - start + 1 );
13871388}
13881389
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+
13891403static std::string capitalize (const std::string & s) {
13901404 if (s.empty ()) return s;
13911405 auto result = s;
@@ -1468,8 +1482,26 @@ class MethodCallExpr : public Expression {
14681482 } else if (obj.is_string ()) {
14691483 auto str = obj.get <std::string>();
14701484 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;
14731505 } else if (method->get_name () == " capitalize" ) {
14741506 vargs.expectArgs (" capitalize method" , {0 , 0 }, {0 , 0 });
14751507 return Value (capitalize (str));
0 commit comments