Correct column widths

This commit is contained in:
Your Name 2025-04-21 22:16:37 +12:00
parent 9ce14495b7
commit b6626cad30

View File

@ -16,7 +16,11 @@ enum kTextColors {
kTextColor_Yellow, kTextColor_Yellow,
kTextColor_Blue, kTextColor_Blue,
kTextColor_Magenta, kTextColor_Magenta,
kTextColor_Cyan kTextColor_Cyan,
kTextColor_White,
kTextColor_DarkGrey,
kTextColor_DarkYellow,
kTextColor_LightGrey
}; };
struct coloredText { struct coloredText {
@ -42,47 +46,100 @@ std::string get_color_code(kTextColors color) {
case kTextColor_Blue: return "\033[1;34m"; case kTextColor_Blue: return "\033[1;34m";
case kTextColor_Magenta: return "\033[1;35m"; case kTextColor_Magenta: return "\033[1;35m";
case kTextColor_Cyan: return "\033[1;36m"; case kTextColor_Cyan: return "\033[1;36m";
case kTextColor_White: return "\033[1;37m";
case kTextColor_DarkGrey: return "\033[90m";
case kTextColor_DarkYellow: return "\033[38;5;142m";
case kTextColor_LightGrey: return "\033[38;5;250m";
default: return "\033[0m"; default: return "\033[0m";
} }
} }
// Helper function to process a cell with replacements int get_codepoints(const std::string& str) {
std::string process_cell(const std::string& cell) { int num_code_points = 0;
std::string result; for (char byte: str) {
if((byte & 0xC0) != 0x80) {
num_code_points++;
}
}
return num_code_points;
}
int get_visible_length(const std::string& str) {
int length = get_codepoints(str);
size_t pos = 0; size_t pos = 0;
while (pos < cell.length()) { while (pos < str.length()) {
for (const auto& [key, value] : kReplacements) {
if (str.compare(pos, key.length(), key) == 0) {
length = length - get_codepoints(key) + get_codepoints(value.text);
pos += key.length();
break;
}
}
pos++;
}
return length;
}
std::string process_cell(std::string str,std::string rowcolor) {
std::string result;
size_t pos = 0;
while (pos < str.length()) {
bool found_replacement = false; bool found_replacement = false;
for (const auto& [key, value] : kReplacements) { for (const auto& [key, value] : kReplacements) {
if (cell.compare(pos, key.length(), key) == 0) { if (str.compare(pos, key.length(), key) == 0) {
result += get_color_code(value.color) + value.text + "\033[0m";
pos += key.length();
found_replacement = true; found_replacement = true;
result += get_color_code(value.color) + value.text + rowcolor;
pos += key.length();
break; break;
} }
} }
if (!found_replacement) { if (!found_replacement) {
result += cell[pos]; result += str[pos];
pos++; pos++;
} }
} }
return result; return result;
} }
// Helper function to get visible length (ignoring color codes) // // Helper function to process a cell with replacements
size_t get_visible_length(const std::string& str) { // std::string process_cell(const std::string& cell) {
size_t length = 0; // std::string result;
bool in_color_code = false; // size_t pos = 0;
for (size_t i = 0; i < str.length(); ++i) { // while (pos < cell.length()) {
if (str[i] == '\033') { // bool found_replacement = false;
while (i < str.length() && str[i] != 'm') { // for (const auto& [key, value] : kReplacements) {
i++; // if (cell.compare(pos, key.length(), key) == 0) {
} // result += get_color_code(value.color) + value.text + "\033[0m";
} else { // pos += key.length();
length++; // found_replacement = true;
} // break;
} // }
return length; // }
} // if (!found_replacement) {
// result += cell[pos];
// pos++;
// }
// }
// return result;
// }
// // Helper function to get visible length (ignoring color codes)
// size_t get_visible_length(const std::string& str) {
// size_t length = 0;
// bool in_color_code = false;
// for (size_t i = 0; i < str.length(); ++i) {
// if (str[i] == '\033') {
// while (i < str.length() && str[i] != 'm') {
// i++;
// }
// } else {
// length++;
// }
// }
// return length;
// }
tableprint::tableprint(const std::string title) : title(title) { tableprint::tableprint(const std::string title) : title(title) {
// Set locale for wide character support // Set locale for wide character support
@ -113,21 +170,19 @@ void tableprint::add_row(const std::vector<std::string>& row) {
void tableprint::print() { void tableprint::print() {
if (rows.empty()) return; if (rows.empty()) return;
// First, process all cells and store the processed versions // Calculate column widths based on header text
std::vector<std::vector<std::string>> processed_rows; std::vector<size_t> col_widths(rows[0].size(), 0);
for (const auto& row : rows) { for (size_t i = 0; i < rows[0].size(); ++i) {
std::vector<std::string> processed_row; col_widths[i] = rows[0][i].length();
for (const auto& cell : row) {
processed_row.push_back(process_cell(cell));
}
processed_rows.push_back(processed_row);
} }
// Calculate column widths based on processed cells (ignoring color codes) // Adjust widths for any cells with replacements
std::vector<size_t> col_widths(rows[0].size(), 0); for (size_t row_idx = 1; row_idx < rows.size(); ++row_idx) {
for (const auto& row : processed_rows) { const auto& row = rows[row_idx];
for (size_t i = 0; i < row.size(); ++i) { for (size_t i = 0; i < row.size(); ++i) {
col_widths[i] = std::max(col_widths[i], get_visible_length(row[i])); int l = get_visible_length(row[i]);
if (l > col_widths[i])
col_widths[i] = l;
} }
} }
@ -186,9 +241,9 @@ void tableprint::print() {
// Print header // Print header
std::cout << ""; std::cout << "";
std::cout << "\033[1;36m"; // Cyan color for header std::cout << "\033[1;36m"; // Cyan color for header
for (size_t i = 0; i < processed_rows[0].size(); ++i) { for (size_t i = 0; i < rows[0].size(); ++i) {
std::cout << " " << std::setw(col_widths[i]) << std::left << processed_rows[0][i] << " "; std::cout << " " << std::setw(col_widths[i]) << std::left << rows[0][i] << " ";
if (i < processed_rows[0].size() - 1) { if (i < rows[0].size() - 1) {
std::cout << "\033[90m│\033[1;36m"; // Border color then back to cyan std::cout << "\033[90m│\033[1;36m"; // Border color then back to cyan
} else { } else {
std::cout << "\033[90m│"; // Just border color for last column std::cout << "\033[90m│"; // Just border color for last column
@ -207,21 +262,24 @@ void tableprint::print() {
std::cout << "" << std::endl; std::cout << "" << std::endl;
// Print rows // Print rows
for (size_t row_idx = 1; row_idx < processed_rows.size(); ++row_idx) { for (size_t row_idx = 1; row_idx < rows.size(); ++row_idx) {
const auto& row = processed_rows[row_idx]; const auto& row = rows[row_idx];
std::cout << ""; std::cout << "";
for (size_t i = 0; i < row.size(); ++i) { for (size_t i = 0; i < row.size(); ++i) {
// Set the appropriate color for the row // Set the appropriate color for the row
if (row_idx % 2 == 1) { std::string rowcolor = (row_idx % 2 == 1) ? "\033[38;5;142m" : "\033[38;5;250m";
std::cout << " " << "\033[38;5;142m" << std::setw(col_widths[i]) << std::left << row[i] << "\033[90m" << "";
} else { std::cout << rowcolor;
std::cout << " " << "\033[38;5;250m" << std::setw(col_widths[i]) << std::left << row[i] << "\033[90m" << ""; std::string processed_cell = process_cell(row[i],rowcolor);
} int l = get_visible_length(row[i]);
for (int i = l+1 ; i < col_widths[i]; i++)
processed_cell += " ";
std::cout << processed_cell << "\033[90m" << "";
} }
std::cout << std::endl; std::cout << std::endl;
// Print row separator if not the last row // Print row separator if not the last row
if (row_idx < processed_rows.size() - 1) { if (row_idx < rows.size() - 1) {
std::cout << ""; std::cout << "";
for (size_t i = 0; i < rows[0].size(); ++i) { for (size_t i = 0; i < rows[0].size(); ++i) {
for (size_t j = 0; j < col_widths[i] + 2; ++j) { for (size_t j = 0; j < col_widths[i] + 2; ++j) {