mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-09-17 16:38:09 +08:00
Feature: hyperlink
support. (#665)
See the [OSC 8 page](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda). FTXUI support proposed by @aaleino in [#662](https://github.com/ArthurSonzogni/FTXUI/issues/662). API: ```cpp auto link = text("Click here") | hyperlink("https://github.com/FTXUI") ``` Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/662
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
#include <cstdint> // for uint8_t
|
||||
#include <cstdint> // for size_t
|
||||
#include <iostream> // for operator<<, stringstream, basic_ostream, flush, cout, ostream
|
||||
#include <map> // for _Rb_tree_const_iterator, map, operator!=, operator==
|
||||
#include <memory> // for allocator
|
||||
#include <memory> // for allocator, allocator_traits<>::value_type
|
||||
#include <sstream> // IWYU pragma: keep
|
||||
#include <utility> // for pair
|
||||
|
||||
@@ -50,11 +50,13 @@ void WindowsEmulateVT100Terminal() {
|
||||
#endif
|
||||
|
||||
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
|
||||
void UpdatePixelStyle(std::stringstream& ss,
|
||||
void UpdatePixelStyle(const Screen* screen,
|
||||
std::stringstream& ss,
|
||||
Pixel& previous,
|
||||
const Pixel& next) {
|
||||
if (next == previous) {
|
||||
return;
|
||||
// See https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
|
||||
if (next.hyperlink != previous.hyperlink) {
|
||||
ss << "\x1B]8;;" << screen->Hyperlink(next.hyperlink) << "\x1B\\";
|
||||
}
|
||||
|
||||
if ((!next.bold && previous.bold) || //
|
||||
@@ -435,20 +437,20 @@ std::string Screen::ToString() {
|
||||
|
||||
for (int y = 0; y < dimy_; ++y) {
|
||||
if (y != 0) {
|
||||
UpdatePixelStyle(ss, previous_pixel, final_pixel);
|
||||
UpdatePixelStyle(this, ss, previous_pixel, final_pixel);
|
||||
ss << "\r\n";
|
||||
}
|
||||
bool previous_fullwidth = false;
|
||||
for (const auto& pixel : pixels_[y]) {
|
||||
if (!previous_fullwidth) {
|
||||
UpdatePixelStyle(ss, previous_pixel, pixel);
|
||||
UpdatePixelStyle(this, ss, previous_pixel, pixel);
|
||||
ss << pixel.character;
|
||||
}
|
||||
previous_fullwidth = (string_width(pixel.character) == 2);
|
||||
}
|
||||
}
|
||||
|
||||
UpdatePixelStyle(ss, previous_pixel, final_pixel);
|
||||
UpdatePixelStyle(this, ss, previous_pixel, final_pixel);
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
@@ -517,6 +519,10 @@ void Screen::Clear() {
|
||||
}
|
||||
cursor_.x = dimx_ - 1;
|
||||
cursor_.y = dimy_ - 1;
|
||||
|
||||
hyperlinks_ = {
|
||||
"",
|
||||
};
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
@@ -545,9 +551,28 @@ void Screen::ApplyShader() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clang-format on
|
||||
|
||||
uint8_t Screen::RegisterHyperlink(std::string link) {
|
||||
for (size_t i = 0; i < hyperlinks_.size(); ++i) {
|
||||
if (hyperlinks_[i] == link) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
if (hyperlinks_.size() == 255) {
|
||||
return 0;
|
||||
}
|
||||
hyperlinks_.push_back(link);
|
||||
return hyperlinks_.size() - 1;
|
||||
}
|
||||
|
||||
const std::string& Screen::Hyperlink(uint8_t id) const {
|
||||
if (id >= hyperlinks_.size()) {
|
||||
return hyperlinks_[0];
|
||||
}
|
||||
return hyperlinks_[id];
|
||||
}
|
||||
|
||||
} // namespace ftxui
|
||||
|
||||
// Copyright 2020 Arthur Sonzogni. All rights reserved.
|
||||
|
Reference in New Issue
Block a user