[F] Fix incorrect cell width evaluation in case of invisible symbols
This commit is contained in:
		
							
								
								
									
										17
									
								
								lib/fort.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								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) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								src/table.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user