Files
lix/lix/libutil/hilite.cc
T
Katalin Rebhan 643b9f3c62 Add missing includes
Change-Id: Id0000000da37acce2438e2a2a3937ffafe6fe90a
2025-05-03 23:16:48 +02:00

47 lines
1.2 KiB
C++

#include "lix/libutil/hilite.hh"
#include <algorithm>
namespace nix {
std::string hiliteMatches(
std::string_view s,
std::vector<std::smatch> matches,
std::string_view prefix,
std::string_view postfix)
{
// Avoid extra work on zero matches
if (matches.size() == 0)
return std::string(s);
std::sort(matches.begin(), matches.end(), [](const auto & a, const auto & b) {
return a.position() < b.position();
});
std::string out;
ssize_t last_end = 0;
for (auto it = matches.begin(); it != matches.end();) {
auto m = *it;
size_t start = m.position();
out.append(s.substr(last_end, m.position() - last_end));
// Merge continous matches
ssize_t end = start + m.length();
for (++it; it != matches.end() && (*it).position() <= end; ++it) {
auto n = *it;
ssize_t nend = start + (n.position() - start + n.length());
if (nend > end)
end = nend;
}
out.append(prefix);
out.append(s.substr(start, end - start));
out.append(postfix);
last_end = end;
}
out.append(s.substr(last_end));
return out;
}
}