@@ -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