|
|
@@ -1378,13 +1378,27 @@ struct ArgumentsExpression {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-static std::string strip(const std::string & s) {
|
|
|
- auto start = s.find_first_not_of(" \t\n\r");
|
|
|
+static std::string strip(const std::string & s, const std::string & chars = "", bool left = true, bool right = true) {
|
|
|
+ auto charset = chars.empty() ? " \t\n\r" : chars;
|
|
|
+ auto start = left ? s.find_first_not_of(charset) : 0;
|
|
|
if (start == std::string::npos) return "";
|
|
|
- auto end = s.find_last_not_of(" \t\n\r");
|
|
|
+ auto end = right ? s.find_last_not_of(charset) : s.size() - 1;
|
|
|
return s.substr(start, end - start + 1);
|
|
|
}
|
|
|
|
|
|
+static std::vector<std::string> split(const std::string & s, const std::string & sep) {
|
|
|
+ std::vector<std::string> result;
|
|
|
+ size_t start = 0;
|
|
|
+ size_t end = s.find(sep);
|
|
|
+ while (end != std::string::npos) {
|
|
|
+ result.push_back(s.substr(start, end - start));
|
|
|
+ start = end + sep.length();
|
|
|
+ end = s.find(sep, start);
|
|
|
+ }
|
|
|
+ result.push_back(s.substr(start));
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
static std::string capitalize(const std::string & s) {
|
|
|
if (s.empty()) return s;
|
|
|
auto result = s;
|
|
|
@@ -1467,8 +1481,26 @@ public:
|
|
|
} else if (obj.is_string()) {
|
|
|
auto str = obj.get<std::string>();
|
|
|
if (method->get_name() == "strip") {
|
|
|
- vargs.expectArgs("strip method", {0, 0}, {0, 0});
|
|
|
- return Value(strip(str));
|
|
|
+ vargs.expectArgs("strip method", {0, 1}, {0, 0});
|
|
|
+ auto chars = vargs.args.empty() ? "" : vargs.args[0].get<std::string>();
|
|
|
+ return Value(strip(str, chars));
|
|
|
+ } else if (method->get_name() == "lstrip") {
|
|
|
+ vargs.expectArgs("lstrip method", {0, 1}, {0, 0});
|
|
|
+ auto chars = vargs.args.empty() ? "" : vargs.args[0].get<std::string>();
|
|
|
+ return Value(strip(str, chars, /* left= */ true, /* right= */ false));
|
|
|
+ } else if (method->get_name() == "rstrip") {
|
|
|
+ vargs.expectArgs("rstrip method", {0, 1}, {0, 0});
|
|
|
+ auto chars = vargs.args.empty() ? "" : vargs.args[0].get<std::string>();
|
|
|
+ return Value(strip(str, chars, /* left= */ false, /* right= */ true));
|
|
|
+ } else if (method->get_name() == "split") {
|
|
|
+ vargs.expectArgs("split method", {1, 1}, {0, 0});
|
|
|
+ auto sep = vargs.args[0].get<std::string>();
|
|
|
+ auto parts = split(str, sep);
|
|
|
+ Value result = Value::array();
|
|
|
+ for (const auto& part : parts) {
|
|
|
+ result.push_back(Value(part));
|
|
|
+ }
|
|
|
+ return result;
|
|
|
} else if (method->get_name() == "capitalize") {
|
|
|
vargs.expectArgs("capitalize method", {0, 0}, {0, 0});
|
|
|
return Value(capitalize(str));
|