mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-22 17:18:39 +00:00
Add button_url[] and hypertext element to allow mods to open web pages (#13825)
Fixes #12500
This commit is contained in:
parent
6c4a110679
commit
24cc33e704
17 changed files with 530 additions and 37 deletions
113
src/util/colorize.cpp
Normal file
113
src/util/colorize.cpp
Normal file
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
Part of Minetest
|
||||
Copyright (C) 2024 rubenwardy
|
||||
|
||||
Permission to use, copy, modify, and distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "colorize.h"
|
||||
|
||||
#ifdef USE_CURL
|
||||
|
||||
#include <curl/urlapi.h>
|
||||
#include "log.h"
|
||||
#include "string.h"
|
||||
#include <sstream>
|
||||
|
||||
std::string colorize_url(const std::string &url)
|
||||
{
|
||||
// Forbid escape codes in URL
|
||||
if (url.find('\x1b') != std::string::npos) {
|
||||
throw std::runtime_error("Unable to open URL as it contains escape codes");
|
||||
}
|
||||
|
||||
auto urlHandleRAII = std::unique_ptr<CURLU, decltype(&curl_url_cleanup)>(
|
||||
curl_url(), curl_url_cleanup);
|
||||
CURLU *urlHandle = urlHandleRAII.get();
|
||||
|
||||
auto rc = curl_url_set(urlHandle, CURLUPART_URL, url.c_str(), 0);
|
||||
if (rc != CURLUE_OK) {
|
||||
throw std::runtime_error("Unable to open URL as it is not valid");
|
||||
}
|
||||
|
||||
auto url_get = [&] (CURLUPart what) -> std::string {
|
||||
char *tmp = nullptr;
|
||||
curl_url_get(urlHandle, what, &tmp, 0);
|
||||
std::string ret(tmp ? tmp : "");
|
||||
curl_free(tmp);
|
||||
return ret;
|
||||
};
|
||||
|
||||
auto scheme = url_get(CURLUPART_SCHEME);
|
||||
auto user = url_get(CURLUPART_USER);
|
||||
auto password = url_get(CURLUPART_PASSWORD);
|
||||
auto host = url_get(CURLUPART_HOST);
|
||||
auto port = url_get(CURLUPART_PORT);
|
||||
auto path = url_get(CURLUPART_PATH);
|
||||
auto query = url_get(CURLUPART_QUERY);
|
||||
auto fragment = url_get(CURLUPART_FRAGMENT);
|
||||
auto zoneid = url_get(CURLUPART_ZONEID);
|
||||
|
||||
std::ostringstream os;
|
||||
|
||||
std::string_view red = COLOR_CODE("#faa");
|
||||
std::string_view white = COLOR_CODE("#fff");
|
||||
std::string_view grey = COLOR_CODE("#aaa");
|
||||
|
||||
os << grey << scheme << "://";
|
||||
if (!user.empty())
|
||||
os << user;
|
||||
if (!password.empty())
|
||||
os << ":" << password;
|
||||
if (!(user.empty() && password.empty()))
|
||||
os << "@";
|
||||
|
||||
// Print hostname, escaping unsafe characters
|
||||
os << white;
|
||||
bool was_alphanum = true;
|
||||
std::string host_s = host;
|
||||
for (size_t i = 0; i < host_s.size(); i++) {
|
||||
char c = host_s[i];
|
||||
bool is_alphanum = isalnum(c) || ispunct(c);
|
||||
if (is_alphanum == was_alphanum) {
|
||||
// skip
|
||||
} else if (is_alphanum) {
|
||||
os << white;
|
||||
} else {
|
||||
os << red;
|
||||
}
|
||||
was_alphanum = is_alphanum;
|
||||
|
||||
if (is_alphanum) {
|
||||
os << c;
|
||||
} else {
|
||||
os << "%" << std::setfill('0') << std::setw(2) << std::hex
|
||||
<< (static_cast<unsigned int>(c) & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
os << grey;
|
||||
if (!zoneid.empty())
|
||||
os << "%" << zoneid;
|
||||
if (!port.empty())
|
||||
os << ":" << port;
|
||||
os << path;
|
||||
if (!query.empty())
|
||||
os << "?" << query;
|
||||
if (!fragment.empty())
|
||||
os << "#" << fragment;
|
||||
|
||||
return os.str();
|
||||
}
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue