}
};
-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;
} 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));