Formatting
This commit is contained in:
parent
d74a4fab77
commit
6e716296ff
@ -15,15 +15,15 @@
|
|||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace cairo {
|
namespace cairo {
|
||||||
/**
|
/**
|
||||||
* @brief Global pointer to the Freetype library handler
|
* @brief Global pointer to the Freetype library handler
|
||||||
*/
|
*/
|
||||||
static FT_Library g_ftlib;
|
static FT_Library g_ftlib;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Abstract font face
|
* @brief Abstract font face
|
||||||
*/
|
*/
|
||||||
class font {
|
class font {
|
||||||
public:
|
public:
|
||||||
explicit font(cairo_t* cairo, double offset) : m_cairo(cairo), m_offset(offset) {}
|
explicit font(cairo_t* cairo, double offset) : m_cairo(cairo), m_offset(offset) {}
|
||||||
virtual ~font(){};
|
virtual ~font(){};
|
||||||
@ -49,12 +49,12 @@ namespace cairo {
|
|||||||
cairo_font_face_t* m_font_face{nullptr};
|
cairo_font_face_t* m_font_face{nullptr};
|
||||||
cairo_font_extents_t m_extents{};
|
cairo_font_extents_t m_extents{};
|
||||||
double m_offset{0.0};
|
double m_offset{0.0};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Font based on fontconfig/freetype
|
* @brief Font based on fontconfig/freetype
|
||||||
*/
|
*/
|
||||||
class font_fc : public font {
|
class font_fc : public font {
|
||||||
public:
|
public:
|
||||||
explicit font_fc(cairo_t* cairo, FcPattern* pattern, double offset, double dpi_x, double dpi_y)
|
explicit font_fc(cairo_t* cairo, FcPattern* pattern, double offset, double dpi_x, double dpi_y)
|
||||||
: font(cairo, offset), m_pattern(pattern) {
|
: font(cairo, offset), m_pattern(pattern) {
|
||||||
@ -212,14 +212,19 @@ namespace cairo {
|
|||||||
cairo_glyph_t* glyphs{nullptr};
|
cairo_glyph_t* glyphs{nullptr};
|
||||||
cairo_text_cluster_t* clusters{nullptr};
|
cairo_text_cluster_t* clusters{nullptr};
|
||||||
cairo_text_cluster_flags_t cf{};
|
cairo_text_cluster_flags_t cf{};
|
||||||
int nglyphs = 0, nclusters = 0;
|
int nglyphs = 0;
|
||||||
|
int nclusters = 0;
|
||||||
|
|
||||||
string utf8 = string(text);
|
string utf8 = string(text);
|
||||||
auto status = cairo_scaled_font_text_to_glyphs(
|
auto status = cairo_scaled_font_text_to_glyphs(
|
||||||
m_scaled, x, y, utf8.c_str(), utf8.size(), &glyphs, &nglyphs, &clusters, &nclusters, &cf);
|
m_scaled, x, y, utf8.c_str(), utf8.size(), &glyphs, &nglyphs, &clusters, &nclusters, &cf);
|
||||||
|
|
||||||
if (status != CAIRO_STATUS_SUCCESS) {
|
if (status != CAIRO_STATUS_SUCCESS) {
|
||||||
throw application_error(sstream() << "cairo_scaled_font_text_to_glyphs()" << cairo_status_to_string(status));
|
logger::make().notice("ERROR %d", status);
|
||||||
|
for (char& c : utf8) {
|
||||||
|
logger::make().notice("0x%02x", c);
|
||||||
|
}
|
||||||
|
throw application_error(sstream() << "cairo_scaled_font_text_to_glyphs() " << cairo_status_to_string(status));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t bytes = 0;
|
size_t bytes = 0;
|
||||||
@ -240,7 +245,7 @@ namespace cairo {
|
|||||||
m_scaled, x, y, utf8.c_str(), utf8.size(), &glyphs, &nglyphs, &clusters, &nclusters, &cf);
|
m_scaled, x, y, utf8.c_str(), utf8.size(), &glyphs, &nglyphs, &clusters, &nclusters, &cf);
|
||||||
|
|
||||||
if (status != CAIRO_STATUS_SUCCESS) {
|
if (status != CAIRO_STATUS_SUCCESS) {
|
||||||
throw application_error(sstream() << "cairo_scaled_font_text_to_glyphs()" << cairo_status_to_string(status));
|
throw application_error(sstream() << "cairo_scaled_font_text_to_glyphs() " << cairo_status_to_string(status));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,12 +299,12 @@ namespace cairo {
|
|||||||
private:
|
private:
|
||||||
cairo_scaled_font_t* m_scaled{nullptr};
|
cairo_scaled_font_t* m_scaled{nullptr};
|
||||||
FcPattern* m_pattern{nullptr};
|
FcPattern* m_pattern{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Match and create font from given fontconfig pattern
|
* Match and create font from given fontconfig pattern
|
||||||
*/
|
*/
|
||||||
inline decltype(auto) make_font(cairo_t* cairo, string&& fontname, double offset, double dpi_x, double dpi_y) {
|
inline decltype(auto) make_font(cairo_t* cairo, string&& fontname, double offset, double dpi_x, double dpi_y) {
|
||||||
static bool fc_init{false};
|
static bool fc_init{false};
|
||||||
if (!fc_init && !(fc_init = FcInit())) {
|
if (!fc_init && !(fc_init = FcInit())) {
|
||||||
throw application_error("Could not load fontconfig");
|
throw application_error("Could not load fontconfig");
|
||||||
@ -335,7 +340,7 @@ namespace cairo {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
return make_shared<font_fc>(cairo, match, offset, dpi_x, dpi_y);
|
return make_shared<font_fc>(cairo, match, offset, dpi_x, dpi_y);
|
||||||
}
|
}
|
||||||
} // namespace cairo
|
} // namespace cairo
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cairo/cairo-ft.h>
|
#include <cairo/cairo-ft.h>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
@ -8,7 +9,7 @@
|
|||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace cairo {
|
namespace cairo {
|
||||||
namespace utils {
|
namespace utils {
|
||||||
/**
|
/**
|
||||||
* @brief RAII wrapper used acquire cairo_device_t
|
* @brief RAII wrapper used acquire cairo_device_t
|
||||||
*/
|
*/
|
||||||
@ -64,7 +65,7 @@ namespace cairo {
|
|||||||
* @brief Convert a UCS-4 codepoint to a utf-8 encoded string
|
* @brief Convert a UCS-4 codepoint to a utf-8 encoded string
|
||||||
*/
|
*/
|
||||||
size_t ucs4_to_utf8(char* utf8, unsigned int ucs);
|
size_t ucs4_to_utf8(char* utf8, unsigned int ucs);
|
||||||
}
|
} // namespace utils
|
||||||
}
|
} // namespace cairo
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
@ -34,53 +34,53 @@ class sstream {
|
|||||||
};
|
};
|
||||||
|
|
||||||
namespace string_util {
|
namespace string_util {
|
||||||
/**
|
/**
|
||||||
* Hash type
|
* Hash type
|
||||||
*/
|
*/
|
||||||
using hash_type = unsigned long;
|
using hash_type = unsigned long;
|
||||||
|
|
||||||
bool contains(const string& haystack, const string& needle);
|
bool contains(const string& haystack, const string& needle);
|
||||||
bool contains_ignore_case(const string& haystack, const string& needle);
|
bool contains_ignore_case(const string& haystack, const string& needle);
|
||||||
bool ends_with(const string& haystack, const string& suffix);
|
bool ends_with(const string& haystack, const string& suffix);
|
||||||
string upper(const string& s);
|
string upper(const string& s);
|
||||||
string lower(const string& s);
|
string lower(const string& s);
|
||||||
bool compare(const string& s1, const string& s2);
|
bool compare(const string& s1, const string& s2);
|
||||||
|
|
||||||
string replace(const string& haystack, const string& needle, const string& replacement, size_t start = 0,
|
string replace(const string& haystack, const string& needle, const string& replacement, size_t start = 0,
|
||||||
size_t end = string::npos);
|
size_t end = string::npos);
|
||||||
string replace_all(const string& haystack, const string& needle, const string& replacement, size_t start = 0,
|
string replace_all(const string& haystack, const string& needle, const string& replacement, size_t start = 0,
|
||||||
size_t end = string::npos);
|
size_t end = string::npos);
|
||||||
|
|
||||||
string squeeze(const string& haystack, char needle);
|
string squeeze(const string& haystack, char needle);
|
||||||
|
|
||||||
string strip(const string& haystack, char needle);
|
string strip(const string& haystack, char needle);
|
||||||
string strip_trailing_newline(const string& haystack);
|
string strip_trailing_newline(const string& haystack);
|
||||||
|
|
||||||
string ltrim(string value, function<bool(char)> pred);
|
string ltrim(string value, function<bool(char)> pred);
|
||||||
string rtrim(string value, function<bool(char)> pred);
|
string rtrim(string value, function<bool(char)> pred);
|
||||||
string trim(string value, function<bool(char)> pred);
|
string trim(string value, function<bool(char)> pred);
|
||||||
|
|
||||||
string ltrim(string&& value, const char& needle = ' ');
|
string ltrim(string&& value, const char& needle = ' ');
|
||||||
string rtrim(string&& value, const char& needle = ' ');
|
string rtrim(string&& value, const char& needle = ' ');
|
||||||
string trim(string&& value, const char& needle = ' ');
|
string trim(string&& value, const char& needle = ' ');
|
||||||
|
|
||||||
size_t char_len(const string& value);
|
size_t char_len(const string& value);
|
||||||
string utf8_truncate(string&& value, size_t len);
|
string utf8_truncate(string&& value, size_t len);
|
||||||
|
|
||||||
string join(const vector<string>& strs, const string& delim);
|
string join(const vector<string>& strs, const string& delim);
|
||||||
vector<string> split(const string& s, char delim);
|
vector<string> split(const string& s, char delim);
|
||||||
std::vector<std::string> tokenize(const string& str, char delimiters);
|
std::vector<std::string> tokenize(const string& str, char delimiters);
|
||||||
|
|
||||||
size_t find_nth(const string& haystack, size_t pos, const string& needle, size_t nth);
|
size_t find_nth(const string& haystack, size_t pos, const string& needle, size_t nth);
|
||||||
|
|
||||||
string floating_point(double value, size_t precision, bool fixed = false, const string& locale = "");
|
string floating_point(double value, size_t precision, bool fixed = false, const string& locale = "");
|
||||||
string filesize_mib(unsigned long long kibibytes, size_t precision = 0, const string& locale = "");
|
string filesize_mib(unsigned long long kibibytes, size_t precision = 0, const string& locale = "");
|
||||||
string filesize_gib(unsigned long long kibibytes, size_t precision = 0, const string& locale = "");
|
string filesize_gib(unsigned long long kibibytes, size_t precision = 0, const string& locale = "");
|
||||||
string filesize_gib_mib(
|
string filesize_gib_mib(
|
||||||
unsigned long long kibibytes, size_t precision_mib = 0, size_t precision_gib = 0, const string& locale = "");
|
unsigned long long kibibytes, size_t precision_mib = 0, size_t precision_gib = 0, const string& locale = "");
|
||||||
string filesize(unsigned long long kbytes, size_t precision = 0, bool fixed = false, const string& locale = "");
|
string filesize(unsigned long long kbytes, size_t precision = 0, bool fixed = false, const string& locale = "");
|
||||||
|
|
||||||
hash_type hash(const string& src);
|
hash_type hash(const string& src);
|
||||||
} // namespace string_util
|
} // namespace string_util
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
#include <map>
|
|
||||||
|
|
||||||
#include "cairo/utils.hpp"
|
#include "cairo/utils.hpp"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace cairo {
|
namespace cairo {
|
||||||
namespace utils {
|
namespace utils {
|
||||||
|
|
||||||
// implementation : device_lock {{{
|
// implementation : device_lock {{{
|
||||||
|
|
||||||
@ -170,7 +170,7 @@ namespace cairo {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // namespace utils
|
||||||
}
|
} // namespace cairo
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
@ -8,61 +8,61 @@
|
|||||||
POLYBAR_NS
|
POLYBAR_NS
|
||||||
|
|
||||||
namespace string_util {
|
namespace string_util {
|
||||||
/**
|
/**
|
||||||
* Check if haystack contains needle
|
* Check if haystack contains needle
|
||||||
*/
|
*/
|
||||||
bool contains(const string& haystack, const string& needle) {
|
bool contains(const string& haystack, const string& needle) {
|
||||||
return haystack.find(needle) != string::npos;
|
return haystack.find(needle) != string::npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ends_with(const string& haystack, const string& suffix) {
|
bool ends_with(const string& haystack, const string& suffix) {
|
||||||
if (haystack.length() < suffix.length()) {
|
if (haystack.length() < suffix.length()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return haystack.compare(haystack.length() - suffix.length(), suffix.length(), suffix) == 0;
|
return haystack.compare(haystack.length() - suffix.length(), suffix.length(), suffix) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if haystack contains needle ignoring case
|
* Check if haystack contains needle ignoring case
|
||||||
*/
|
*/
|
||||||
bool contains_ignore_case(const string& haystack, const string& needle) {
|
bool contains_ignore_case(const string& haystack, const string& needle) {
|
||||||
return lower(haystack).find(lower(needle)) != string::npos;
|
return lower(haystack).find(lower(needle)) != string::npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert string to uppercase
|
* Convert string to uppercase
|
||||||
*/
|
*/
|
||||||
string upper(const string& s) {
|
string upper(const string& s) {
|
||||||
string str(s);
|
string str(s);
|
||||||
for (auto& c : str) {
|
for (auto& c : str) {
|
||||||
c = toupper(c);
|
c = toupper(c);
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert string to lowercase
|
* Convert string to lowercase
|
||||||
*/
|
*/
|
||||||
string lower(const string& s) {
|
string lower(const string& s) {
|
||||||
string str(s);
|
string str(s);
|
||||||
for (auto& c : str) {
|
for (auto& c : str) {
|
||||||
c = tolower(c);
|
c = tolower(c);
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test lower case equality
|
* Test lower case equality
|
||||||
*/
|
*/
|
||||||
bool compare(const string& s1, const string& s2) {
|
bool compare(const string& s1, const string& s2) {
|
||||||
return lower(s1) == lower(s2);
|
return lower(s1) == lower(s2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replace first occurrence of needle in haystack
|
* Replace first occurrence of needle in haystack
|
||||||
*/
|
*/
|
||||||
string replace(const string& haystack, const string& needle, const string& replacement, size_t start, size_t end) {
|
string replace(const string& haystack, const string& needle, const string& replacement, size_t start, size_t end) {
|
||||||
string str(haystack);
|
string str(haystack);
|
||||||
string::size_type pos;
|
string::size_type pos;
|
||||||
|
|
||||||
@ -73,13 +73,12 @@ namespace string_util {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replace all occurrences of needle in haystack
|
* Replace all occurrences of needle in haystack
|
||||||
*/
|
*/
|
||||||
string replace_all(
|
string replace_all(const string& haystack, const string& needle, const string& replacement, size_t start, size_t end) {
|
||||||
const string& haystack, const string& needle, const string& replacement, size_t start, size_t end) {
|
|
||||||
string result{haystack};
|
string result{haystack};
|
||||||
string::size_type pos;
|
string::size_type pos;
|
||||||
while ((pos = result.find(needle, start)) != string::npos && pos < result.length() &&
|
while ((pos = result.find(needle, start)) != string::npos && pos < result.length() &&
|
||||||
@ -88,69 +87,69 @@ namespace string_util {
|
|||||||
start = pos + replacement.length();
|
start = pos + replacement.length();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replace all consecutive occurrences of needle in haystack
|
* Replace all consecutive occurrences of needle in haystack
|
||||||
*/
|
*/
|
||||||
string squeeze(const string& haystack, char needle) {
|
string squeeze(const string& haystack, char needle) {
|
||||||
string result = haystack;
|
string result = haystack;
|
||||||
while (result.find({needle, needle}) != string::npos) {
|
while (result.find({needle, needle}) != string::npos) {
|
||||||
result = replace_all(result, {needle, needle}, {needle});
|
result = replace_all(result, {needle, needle}, {needle});
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove all occurrences of needle in haystack
|
* Remove all occurrences of needle in haystack
|
||||||
*/
|
*/
|
||||||
string strip(const string& haystack, char needle) {
|
string strip(const string& haystack, char needle) {
|
||||||
string str(haystack);
|
string str(haystack);
|
||||||
string::size_type pos;
|
string::size_type pos;
|
||||||
while ((pos = str.find(needle)) != string::npos) {
|
while ((pos = str.find(needle)) != string::npos) {
|
||||||
str.erase(pos, 1);
|
str.erase(pos, 1);
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove trailing newline
|
* Remove trailing newline
|
||||||
*/
|
*/
|
||||||
string strip_trailing_newline(const string& haystack) {
|
string strip_trailing_newline(const string& haystack) {
|
||||||
string str(haystack);
|
string str(haystack);
|
||||||
if (str[str.length() - 1] == '\n') {
|
if (str[str.length() - 1] == '\n') {
|
||||||
str.erase(str.length() - 1, 1);
|
str.erase(str.length() - 1, 1);
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trims all characters that match pred from the left
|
* Trims all characters that match pred from the left
|
||||||
*/
|
*/
|
||||||
string ltrim(string value, function<bool(char)> pred) {
|
string ltrim(string value, function<bool(char)> pred) {
|
||||||
value.erase(value.begin(), find_if(value.begin(), value.end(), std::not_fn(pred)));
|
value.erase(value.begin(), find_if(value.begin(), value.end(), std::not_fn(pred)));
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trims all characters that match pred from the right
|
* Trims all characters that match pred from the right
|
||||||
*/
|
*/
|
||||||
string rtrim(string value, function<bool(char)> pred) {
|
string rtrim(string value, function<bool(char)> pred) {
|
||||||
value.erase(find_if(value.rbegin(), value.rend(), std::not_fn(pred)).base(), value.end());
|
value.erase(find_if(value.rbegin(), value.rend(), std::not_fn(pred)).base(), value.end());
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trims all characters that match pred from both sides
|
* Trims all characters that match pred from both sides
|
||||||
*/
|
*/
|
||||||
string trim(string value, function<bool(char)> pred) {
|
string trim(string value, function<bool(char)> pred) {
|
||||||
return ltrim(rtrim(move(value), pred), pred);
|
return ltrim(rtrim(move(value), pred), pred);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove needle from the start of the string
|
* Remove needle from the start of the string
|
||||||
*/
|
*/
|
||||||
string ltrim(string&& value, const char& needle) {
|
string ltrim(string&& value, const char& needle) {
|
||||||
if (value.empty()) {
|
if (value.empty()) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -158,12 +157,12 @@ namespace string_util {
|
|||||||
value.erase(0, 1);
|
value.erase(0, 1);
|
||||||
}
|
}
|
||||||
return forward<string>(value);
|
return forward<string>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove needle from the end of the string
|
* Remove needle from the end of the string
|
||||||
*/
|
*/
|
||||||
string rtrim(string&& value, const char& needle) {
|
string rtrim(string&& value, const char& needle) {
|
||||||
if (value.empty()) {
|
if (value.empty()) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -171,37 +170,37 @@ namespace string_util {
|
|||||||
value.erase(value.length() - 1, 1);
|
value.erase(value.length() - 1, 1);
|
||||||
}
|
}
|
||||||
return forward<string>(value);
|
return forward<string>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove needle from the start and end of the string
|
* Remove needle from the start and end of the string
|
||||||
*/
|
*/
|
||||||
string trim(string&& value, const char& needle) {
|
string trim(string&& value, const char& needle) {
|
||||||
if (value.empty()) {
|
if (value.empty()) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return rtrim(ltrim(forward<string>(value), needle), needle);
|
return rtrim(ltrim(forward<string>(value), needle), needle);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Counts the number of codepoints in a utf8 encoded string.
|
* Counts the number of codepoints in a utf8 encoded string.
|
||||||
*/
|
*/
|
||||||
size_t char_len(const string& value) {
|
size_t char_len(const string& value) {
|
||||||
// utf-8 bytes of the form 10xxxxxx are continuation bytes, so we
|
// utf-8 bytes of the form 10xxxxxx are continuation bytes, so we
|
||||||
// simply count the number of bytes not of this form.
|
// simply count the number of bytes not of this form.
|
||||||
//
|
//
|
||||||
// 0xc0 = 11000000
|
// 0xc0 = 11000000
|
||||||
// 0x80 = 10000000
|
// 0x80 = 10000000
|
||||||
return std::count_if(value.begin(), value.end(), [](char c) { return (c & 0xc0) != 0x80; });
|
return std::count_if(value.begin(), value.end(), [](char c) { return (c & 0xc0) != 0x80; });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Truncates a utf8 string at len number of codepoints. This isn't 100%
|
* Truncates a utf8 string at len number of codepoints. This isn't 100%
|
||||||
* matching the user-perceived character count, but it should be close
|
* matching the user-perceived character count, but it should be close
|
||||||
* enough and avoids having to pull in something like ICU to count actual
|
* enough and avoids having to pull in something like ICU to count actual
|
||||||
* grapheme clusters.
|
* grapheme clusters.
|
||||||
*/
|
*/
|
||||||
string utf8_truncate(string&& value, size_t len) {
|
string utf8_truncate(string&& value, size_t len) {
|
||||||
if (value.empty()) {
|
if (value.empty()) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@ -223,23 +222,23 @@ namespace string_util {
|
|||||||
value.erase(it, end);
|
value.erase(it, end);
|
||||||
|
|
||||||
return forward<string>(value);
|
return forward<string>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Join all strings in vector into a single string separated by delim
|
* Join all strings in vector into a single string separated by delim
|
||||||
*/
|
*/
|
||||||
string join(const vector<string>& strs, const string& delim) {
|
string join(const vector<string>& strs, const string& delim) {
|
||||||
string str;
|
string str;
|
||||||
for (auto& s : strs) {
|
for (auto& s : strs) {
|
||||||
str += (str.empty() ? "" : delim) + s;
|
str += (str.empty() ? "" : delim) + s;
|
||||||
}
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Explode string by delim, ignore empty tokens
|
* Explode string by delim, ignore empty tokens
|
||||||
*/
|
*/
|
||||||
vector<string> split(const string& s, char delim) {
|
vector<string> split(const string& s, char delim) {
|
||||||
std::string::size_type pos = 0;
|
std::string::size_type pos = 0;
|
||||||
std::vector<std::string> result;
|
std::vector<std::string> result;
|
||||||
|
|
||||||
@ -250,12 +249,12 @@ namespace string_util {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Explode string by delim, include empty tokens
|
* Explode string by delim, include empty tokens
|
||||||
*/
|
*/
|
||||||
std::vector<std::string> tokenize(const string& str, char delimiters) {
|
std::vector<std::string> tokenize(const string& str, char delimiters) {
|
||||||
std::vector<std::string> tokens;
|
std::vector<std::string> tokens;
|
||||||
std::string::size_type lastPos = 0;
|
std::string::size_type lastPos = 0;
|
||||||
auto pos = str.find_first_of(delimiters, lastPos);
|
auto pos = str.find_first_of(delimiters, lastPos);
|
||||||
@ -269,59 +268,59 @@ namespace string_util {
|
|||||||
|
|
||||||
tokens.emplace_back(str.substr(lastPos, pos - lastPos));
|
tokens.emplace_back(str.substr(lastPos, pos - lastPos));
|
||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find the nth occurrence of needle in haystack starting from pos
|
* Find the nth occurrence of needle in haystack starting from pos
|
||||||
*/
|
*/
|
||||||
size_t find_nth(const string& haystack, size_t pos, const string& needle, size_t nth) {
|
size_t find_nth(const string& haystack, size_t pos, const string& needle, size_t nth) {
|
||||||
size_t found_pos = haystack.find(needle, pos);
|
size_t found_pos = haystack.find(needle, pos);
|
||||||
if (1 == nth || string::npos == found_pos) {
|
if (1 == nth || string::npos == found_pos) {
|
||||||
return found_pos;
|
return found_pos;
|
||||||
}
|
}
|
||||||
return find_nth(haystack, found_pos + 1, needle, nth - 1);
|
return find_nth(haystack, found_pos + 1, needle, nth - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a floating point string
|
* Create a floating point string
|
||||||
*/
|
*/
|
||||||
string floating_point(double value, size_t precision, bool fixed, const string& locale) {
|
string floating_point(double value, size_t precision, bool fixed, const string& locale) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss.imbue(!locale.empty() ? std::locale(locale.c_str()) : std::locale::classic());
|
ss.imbue(!locale.empty() ? std::locale(locale.c_str()) : std::locale::classic());
|
||||||
ss << std::fixed << std::setprecision(precision) << value;
|
ss << std::fixed << std::setprecision(precision) << value;
|
||||||
return fixed ? ss.str() : replace(ss.str(), ".00", "");
|
return fixed ? ss.str() : replace(ss.str(), ".00", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a MiB filesize string
|
* Create a MiB filesize string
|
||||||
*/
|
*/
|
||||||
string filesize_mib(unsigned long long kibibytes, size_t precision, const string& locale) {
|
string filesize_mib(unsigned long long kibibytes, size_t precision, const string& locale) {
|
||||||
return floating_point(kibibytes / 1024.0, precision, true, locale) + " MiB";
|
return floating_point(kibibytes / 1024.0, precision, true, locale) + " MiB";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a GiB filesize string
|
* Create a GiB filesize string
|
||||||
*/
|
*/
|
||||||
string filesize_gib(unsigned long long kibibytes, size_t precision, const string& locale) {
|
string filesize_gib(unsigned long long kibibytes, size_t precision, const string& locale) {
|
||||||
return floating_point(kibibytes / 1024.0 / 1024.0, precision, true, locale) + " GiB";
|
return floating_point(kibibytes / 1024.0 / 1024.0, precision, true, locale) + " GiB";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a GiB string, if the value in GiB is >= 1.0. Otherwise, create a MiB string.
|
* Create a GiB string, if the value in GiB is >= 1.0. Otherwise, create a MiB string.
|
||||||
*/
|
*/
|
||||||
string filesize_gib_mib(
|
string filesize_gib_mib(
|
||||||
unsigned long long kibibytes, size_t precision_mib, size_t precision_gib, const string& locale) {
|
unsigned long long kibibytes, size_t precision_mib, size_t precision_gib, const string& locale) {
|
||||||
if (kibibytes < 1024 * 1024) {
|
if (kibibytes < 1024 * 1024) {
|
||||||
return filesize_mib(kibibytes, precision_mib, locale);
|
return filesize_mib(kibibytes, precision_mib, locale);
|
||||||
} else {
|
} else {
|
||||||
return filesize_gib(kibibytes, precision_gib, locale);
|
return filesize_gib(kibibytes, precision_gib, locale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a filesize string by converting given bytes to highest unit possible
|
* Create a filesize string by converting given bytes to highest unit possible
|
||||||
*/
|
*/
|
||||||
string filesize(unsigned long long bytes, size_t precision, bool fixed, const string& locale) {
|
string filesize(unsigned long long bytes, size_t precision, bool fixed, const string& locale) {
|
||||||
vector<string> suffixes{"TB", "GB", "MB", "KB"};
|
vector<string> suffixes{"TB", "GB", "MB", "KB"};
|
||||||
string suffix{"B"};
|
string suffix{"B"};
|
||||||
double value = bytes;
|
double value = bytes;
|
||||||
@ -331,14 +330,14 @@ namespace string_util {
|
|||||||
value /= 1024.0;
|
value /= 1024.0;
|
||||||
}
|
}
|
||||||
return floating_point(value, precision, fixed, locale) + " " + suffix;
|
return floating_point(value, precision, fixed, locale) + " " + suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute string hash
|
* Compute string hash
|
||||||
*/
|
*/
|
||||||
hash_type hash(const string& src) {
|
hash_type hash(const string& src) {
|
||||||
return std::hash<string>()(src);
|
return std::hash<string>()(src);
|
||||||
}
|
}
|
||||||
} // namespace string_util
|
} // namespace string_util
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
Loading…
Reference in New Issue
Block a user