parent
5e2d57b2b2
commit
7cf64f6bee
1 changed files with 37 additions and 5 deletions
|
@ -1378,13 +1378,27 @@ struct ArgumentsExpression {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string strip(const std::string & s) {
|
static std::string strip(const std::string & s, const std::string & chars = "", bool left = true, bool right = true) {
|
||||||
auto start = s.find_first_not_of(" \t\n\r");
|
auto charset = chars.empty() ? " \t\n\r" : chars;
|
||||||
|
auto start = left ? s.find_first_not_of(charset) : 0;
|
||||||
if (start == std::string::npos) return "";
|
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);
|
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) {
|
static std::string capitalize(const std::string & s) {
|
||||||
if (s.empty()) return s;
|
if (s.empty()) return s;
|
||||||
auto result = s;
|
auto result = s;
|
||||||
|
@ -1467,8 +1481,26 @@ public:
|
||||||
} else if (obj.is_string()) {
|
} else if (obj.is_string()) {
|
||||||
auto str = obj.get<std::string>();
|
auto str = obj.get<std::string>();
|
||||||
if (method->get_name() == "strip") {
|
if (method->get_name() == "strip") {
|
||||||
vargs.expectArgs("strip method", {0, 0}, {0, 0});
|
vargs.expectArgs("strip method", {0, 1}, {0, 0});
|
||||||
return Value(strip(str));
|
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") {
|
} else if (method->get_name() == "capitalize") {
|
||||||
vargs.expectArgs("capitalize method", {0, 0}, {0, 0});
|
vargs.expectArgs("capitalize method", {0, 0}, {0, 0});
|
||||||
return Value(capitalize(str));
|
return Value(capitalize(str));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue