From 3cc961f958de042ef577c229aca63a739be1fd35 Mon Sep 17 00:00:00 2001 From: seleznevae Date: Mon, 3 Feb 2020 21:41:11 +0300 Subject: [PATCH] [F] Fix incorrect cell width evaluation in case of invisible symbols --- lib/fort.c | 17 +++++ src/table.c | 17 +++++ tests/bb_tests/test_table_basic.c | 108 ++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) diff --git a/lib/fort.c b/lib/fort.c index ef4b00d..1a11fb3 100644 --- a/lib/fort.c +++ b/lib/fort.c @@ -7001,6 +7001,7 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table, return FT_ERROR; } + size_t column_visible_width = 0; size_t cols = 0; size_t rows = 0; int status = get_table_sizes(table, &rows, &cols); @@ -7022,6 +7023,17 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table, for (col = 0; col < cols; ++col) { col_width_arr[col] = 0; size_t row = 0; + if (geom == INTERN_REPR_GEOMETRY) { + column_visible_width = 0; + for (row = 0; row < rows; ++row) { + const f_row_t *row_p = get_row_c(table, row); + const f_cell_t *cell = get_cell_c(row_p, col); + if (!cell) + continue; + size_t cell_vis_width = hint_width_cell(cell, &context, VISIBLE_GEOMETRY); + column_visible_width = MAX(column_visible_width, cell_vis_width); + } + } for (row = 0; row < rows; ++row) { const f_row_t *row_p = get_row_c(table, row); const f_cell_t *cell = get_cell_c(row_p, col); @@ -7049,6 +7061,11 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table, } } } + + if (geom == INTERN_REPR_GEOMETRY && + col_width_arr[col] > column_visible_width) { + col_width_arr[col] += column_visible_width; + } } if (combined_cells_found) { diff --git a/src/table.c b/src/table.c index 7874d22..20b9747 100644 --- a/src/table.c +++ b/src/table.c @@ -143,6 +143,7 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table, return FT_ERROR; } + size_t column_visible_width = 0; size_t cols = 0; size_t rows = 0; int status = get_table_sizes(table, &rows, &cols); @@ -164,6 +165,17 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table, for (col = 0; col < cols; ++col) { col_width_arr[col] = 0; size_t row = 0; + if (geom == INTERN_REPR_GEOMETRY) { + column_visible_width = 0; + for (row = 0; row < rows; ++row) { + const f_row_t *row_p = get_row_c(table, row); + const f_cell_t *cell = get_cell_c(row_p, col); + if (!cell) + continue; + size_t cell_vis_width = hint_width_cell(cell, &context, VISIBLE_GEOMETRY); + column_visible_width = MAX(column_visible_width, cell_vis_width); + } + } for (row = 0; row < rows; ++row) { const f_row_t *row_p = get_row_c(table, row); const f_cell_t *cell = get_cell_c(row_p, col); @@ -191,6 +203,11 @@ f_status table_rows_and_cols_geometry(const ft_table_t *table, } } } + + if (geom == INTERN_REPR_GEOMETRY && + col_width_arr[col] > column_visible_width) { + col_width_arr[col] += column_visible_width; + } } if (combined_cells_found) { diff --git a/tests/bb_tests/test_table_basic.c b/tests/bb_tests/test_table_basic.c index 191b4a9..8988693 100644 --- a/tests/bb_tests/test_table_basic.c +++ b/tests/bb_tests/test_table_basic.c @@ -188,6 +188,114 @@ void test_bug_fixes(void) ft_destroy_table(table); } #endif /* FT_HAVE_UTF8 */ + + SCENARIO("Issue 37 - https://github.com/seleznevae/libfort/issues/37") { + ft_table_t *table = ft_create_table(); + ft_set_border_style(table, FT_BASIC_STYLE); + ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER); + ft_write_ln(table, "xxx"); + ft_write_ln(table, + "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n1\n2\n3\n4\n5\n6\n7\n8"); + ft_set_cell_prop(table, 1, 0, FT_CPROP_CONT_FG_COLOR, FT_COLOR_RED); + + const char *table_str = ft_to_string(table); + assert_true(table_str != NULL); + const char *table_str_etalon = + "+-----+\n" + "| xxx |\n" + "+-----+\n" + "| \033[31m1\033[0m |\n" + "| \033[31m2\033[0m |\n" + "| \033[31m3\033[0m |\n" + "| \033[31m4\033[0m |\n" + "| \033[31m5\033[0m |\n" + "| \033[31m6\033[0m |\n" + "| \033[31m7\033[0m |\n" + "| \033[31m8\033[0m |\n" + "| \033[31m9\033[0m |\n" + "| \033[31m0\033[0m |\n" + "| \033[31m1\033[0m |\n" + "| \033[31m2\033[0m |\n" + "| \033[31m3\033[0m |\n" + "| \033[31m4\033[0m |\n" + "| \033[31m5\033[0m |\n" + "| \033[31m6\033[0m |\n" + "| \033[31m7\033[0m |\n" + "| \033[31m8\033[0m |\n" + "+-----+\n"; + assert_str_equal(table_str, table_str_etalon); + + ft_destroy_table(table); + } + + SCENARIO("Issue 37 - https://github.com/seleznevae/libfort/issues/37") { + ft_table_t *table = ft_create_table(); + ft_set_border_style(table, FT_BASIC_STYLE); + ft_set_cell_prop(table, 0, FT_ANY_COLUMN, FT_CPROP_ROW_TYPE, FT_ROW_HEADER); + + ft_write_ln(table, "hdr1", "hdr2", "xxx"); + ft_write_ln(table, "3", "", + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||||||||||||||||||||||||||\n" + "||||||"); + + ft_set_cell_prop(table, 1, FT_ANY_COLUMN, FT_CPROP_CONT_FG_COLOR, FT_COLOR_RED); + const char *table_str = ft_to_string(table); + assert_true(table_str != NULL); + + const char *table_str_etalon = + "+------+------+--------------------------------+\n" + "| hdr1 | hdr2 | xxx |\n" + "+------+------+--------------------------------+\n" + "| \033[31m3\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||||||||||||||||||||||||||\033[0m |\n" + "|\033[31m\033[0m |\033[31m\033[0m | \033[31m||||||\033[0m |\n" + "+------+------+--------------------------------+\n"; + assert_str_equal(table_str, table_str_etalon); + ft_destroy_table(table); + } } void test_table_basic(void)