Skip to content

Commit

Permalink
papergrid/ fixes issues && add usage in tabled
Browse files Browse the repository at this point in the history
Signed-off-by: Maxim Zhiburt <zhiburt@gmail.com>
  • Loading branch information
zhiburt committed Nov 15, 2021
1 parent 92aa02a commit b14ca29
Show file tree
Hide file tree
Showing 8 changed files with 436 additions and 204 deletions.
406 changes: 260 additions & 146 deletions papergrid/src/lib.rs

Large diffs are not rendered by default.

60 changes: 14 additions & 46 deletions papergrid/tests/render.rs
Expand Up @@ -10,13 +10,12 @@
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

use papergrid::{AlignmentHorizontal, AlignmentVertical, Border, Entity, Grid, Settings};
use papergrid::{AlignmentHorizontal, AlignmentVertical, Border, DEFAULT_CELL_STYLE, Entity, Grid, Settings};

#[test]
fn render() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("0-0"));
grid.set(&Entity::Cell(0, 1), Settings::new().text("0-1"));
Expand All @@ -37,8 +36,7 @@ fn render() {
#[test]
fn render_multilane() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("left\ncell"));
grid.set(&Entity::Cell(0, 1), Settings::new().text("right one"));
Expand Down Expand Up @@ -72,8 +70,7 @@ fn render_multilane() {
#[test]
fn render_multilane_alignment() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(
&Entity::Cell(0, 0),
Expand Down Expand Up @@ -114,8 +111,7 @@ fn render_multilane_alignment() {
#[test]
fn render_multilane_vertical_alignment() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(
&Entity::Cell(0, 0),
Expand Down Expand Up @@ -158,8 +154,7 @@ fn render_multilane_vertical_alignment() {
#[test]
fn render_one_line() {
let mut grid = Grid::new(1, 1);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("one line"));

Expand All @@ -171,8 +166,7 @@ fn render_one_line() {
#[test]
fn render_not_quadratic() {
let mut grid = Grid::new(1, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("hello"));
grid.set(&Entity::Cell(0, 1), Settings::new().text("world"));
Expand All @@ -194,8 +188,7 @@ fn render_empty() {
#[test]
fn render_empty_cell() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("0-0"));
grid.set(&Entity::Cell(0, 1), Settings::new().text(""));
Expand All @@ -216,8 +209,7 @@ fn render_empty_cell() {
#[test]
fn render_row_span() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(
&Entity::Cell(0, 0),
Expand All @@ -244,8 +236,7 @@ fn render_row_span() {
#[test]
fn render_miltiline_span() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(
&Entity::Cell(0, 0),
Expand Down Expand Up @@ -273,8 +264,7 @@ fn render_miltiline_span() {
#[test]
fn render_row_span_multilane() {
let mut grid = Grid::new(4, 3);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(
&Entity::Cell(0, 0),
Expand Down Expand Up @@ -312,8 +302,7 @@ fn render_row_span_multilane() {
#[test]
fn render_row_span_with_horizontal_ident() {
let mut grid = Grid::new(3, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("0-0").span(2));
grid.set(
Expand Down Expand Up @@ -344,8 +333,7 @@ fn render_row_span_with_horizontal_ident() {
#[test]
fn render_row_span_with_odd_length() {
let mut grid = Grid::new(2, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("3 ").span(2));
grid.set(&Entity::Cell(1, 0), Settings::new().text("2"));
Expand All @@ -359,8 +347,7 @@ fn render_row_span_with_odd_length() {
#[test]
fn render_only_row_spaned() {
let mut grid = Grid::new(3, 2);
grid.add_split_grid();
add_cell_borders(&mut grid, DEFAULT_CELL_STYLE.clone());
grid.set_cell_borders(DEFAULT_CELL_STYLE.clone());

grid.set(&Entity::Cell(0, 0), Settings::new().text("0-0").span(2));
grid.set(&Entity::Cell(1, 0), Settings::new().text("1-0").span(2));
Expand Down Expand Up @@ -612,22 +599,3 @@ fn render_only_row_spaned() {

// assert_eq!(expected, grid.to_string());
// }

fn add_cell_borders(grid: &mut Grid, border: Border) {
for row in 0 .. grid.count_rows() {
for column in 0 .. grid.count_columns() {
grid.set(&Entity::Cell(row, column), Settings::new().border(border.clone()));
}
}
}

const DEFAULT_CELL_STYLE: Border = Border {
top: Some('-'),
bottom: Some('-'),
left: Some('|'),
right: Some('|'),
top_right_corner: Some('+'),
bottom_left_corner: Some('+'),
top_left_corner: Some('+'),
bottom_right_corner: Some('+'),
};
3 changes: 2 additions & 1 deletion src/lib.rs
Expand Up @@ -245,7 +245,8 @@ impl Table {
pub fn new<T: Tabled>(iter: impl IntoIterator<Item = T>) -> Self {
let grid = build_grid(iter);

Self { grid }
let table = Self { grid };
table.with(Style::default())
}

/// With is a generic function which applies options to the [Table].
Expand Down
63 changes: 61 additions & 2 deletions src/rotate.rs
Expand Up @@ -21,8 +21,27 @@ impl TableOption for Rotate {
for (lhs_column, rhs_column) in
(0..grid.count_columns()).zip((0..grid.count_columns()).rev())
{
let border = grid.get_settings(row, lhs_column).span(1);
new.set(&Entity::Cell(rhs_column, row), border)
{
let border = grid.get_border(row, lhs_column);
if border.left.is_some() && !new.is_vertical_split_set(row) {
new.add_vertical_split(row)
}

if border.right.is_some() && !new.is_vertical_split_set(row+1) {
new.add_vertical_split(row+1)
}

if border.top.is_some() && !new.is_horizontal_split_set(rhs_column) {
new.add_horizontal_split(rhs_column)
}

if border.bottom.is_some() && !new.is_horizontal_split_set(rhs_column+1) {
new.add_horizontal_split(rhs_column+1)
}
}

let settings = grid.get_settings(row, lhs_column).span(1);
new.set(&Entity::Cell(rhs_column, row), settings)
}
}

Expand All @@ -34,6 +53,26 @@ impl TableOption for Rotate {
for row in 0..grid.count_rows() {
last_row -= 1;
for column in 0..grid.count_columns() {
{
let border = grid.get_border(row, column);

if border.left.is_some() && !new.is_vertical_split_set(last_row) {
new.add_vertical_split(last_row)
}

if border.right.is_some() && !new.is_vertical_split_set(last_row+1) {
new.add_vertical_split(last_row+1)
}

if border.top.is_some() && !new.is_horizontal_split_set(column) {
new.add_horizontal_split(column)
}

if border.bottom.is_some() && !new.is_horizontal_split_set(column+1) {
new.add_horizontal_split(column+1)
}
}

let border = grid.get_settings(row, column).span(0);
new.set(&Entity::Cell(column, last_row), border);
}
Expand All @@ -45,6 +84,26 @@ impl TableOption for Rotate {
let mut new = Grid::new(grid.count_rows(), grid.count_columns());
for column in 0..grid.count_columns() {
for row in 0..grid.count_rows() {
{
let last_row = grid.count_rows() - 1 - row;
let border = grid.get_border(last_row, column);
if border.left.is_some() && !new.is_vertical_split_set(column) {
new.add_vertical_split(column)
}

if border.right.is_some() && !new.is_vertical_split_set(column+1) {
new.add_vertical_split(column+1)
}

if border.top.is_some() && !new.is_horizontal_split_set(last_row) {
new.add_horizontal_split(last_row)
}

if border.bottom.is_some() && !new.is_horizontal_split_set(last_row+1) {
new.add_horizontal_split(last_row+1)
}
}

let last_row = grid.count_rows() - 1 - row;
let border = grid.get_settings(row, column).span(0);
new.set(&Entity::Cell(last_row, column), border)
Expand Down
43 changes: 38 additions & 5 deletions src/style.rs
@@ -1,7 +1,8 @@
#[allow(unused)]
use crate::Table;
use crate::TableOption;
use papergrid::{Border, Grid};
use papergrid::{Border, Entity, Grid, Settings};
use std::collections::HashMap;

/// Style is responsible for a look of a [Table].
///
Expand All @@ -25,6 +26,7 @@ pub struct Style {
header_split_line: Option<Line>,
split: Option<Line>,
inner_split_char: char,
highlight: Vec<(Entity, Border)>,
}

impl Style {
Expand Down Expand Up @@ -196,12 +198,20 @@ impl Style {
self
}

/// Add highlight for a given cell.
pub fn highlight(mut self, entity: Entity, border: Border) -> Self {
// suppose to be LeftToRight algorithm
self.highlight.push((entity, border));
self
}

fn new(frame: Frame, header: Option<Line>, split: Option<Line>, inner: char) -> Self {
Self {
frame,
split,
header_split_line: header,
inner_split_char: inner,
highlight: Vec::new(),
}
}
}
Expand Down Expand Up @@ -246,20 +256,43 @@ struct Frame {

impl TableOption for Style {
fn change(&mut self, grid: &mut Grid) {
grid.clear_split_grid();

let count_rows = grid.count_rows();
let count_columns = grid.count_columns();
for row in 0..count_rows {
for column in 0..count_columns {
let border = grid.get_border_mut(row, column);
*border = make_style(
let border = make_style(
self,
row == 0,
row + 1 == count_rows,
column == 0,
column + 1 == count_columns,
);

if border.left.is_some() && !grid.is_vertical_split_set(column) {
grid.add_vertical_split(column)
}

if border.right.is_some() && !grid.is_vertical_split_set(column+1) {
grid.add_vertical_split(column+1)
}

if border.top.is_some() && !grid.is_horizontal_split_set(row) {
grid.add_horizontal_split(row)
}

if border.bottom.is_some() && !grid.is_horizontal_split_set(row+1) {
grid.add_horizontal_split(row+1)
}

grid.set(&Entity::Cell(row, column), Settings::default().border(border));
}
}

for (entity, brush) in &self.highlight {
grid.set(entity, Settings::default().border(brush.clone()));
}
}
}

Expand Down Expand Up @@ -385,7 +418,7 @@ fn make_style(
top: style.split.as_ref().map(|l| l.main),
bottom: style.frame.bottom.as_ref().map(|l| l.main),
left: style.frame.left,
left_top_corner: style.split.as_ref().map(|l| l.intersection),
left_top_corner: style.split.as_ref().and_then(|l| l.left_corner),
left_bottom_corner: style.frame.bottom.as_ref().and_then(|l| l.left_corner),
right: Some(style.inner_split_char),
right_top_corner: style.split.as_ref().map(|l| l.intersection),
Expand All @@ -398,7 +431,7 @@ fn make_style(
left_top_corner: style.split.as_ref().map(|l| l.intersection),
left_bottom_corner: style.frame.bottom.as_ref().map(|l| l.intersection),
right: style.frame.right,
right_top_corner: style.split.as_ref().map(|l| l.intersection),
right_top_corner: style.split.as_ref().and_then(|l| l.right_corner),
right_bottom_corner: style.frame.bottom.as_ref().and_then(|l| l.right_corner),
},
(false, true, false, false) => Border {
Expand Down
13 changes: 9 additions & 4 deletions tests/disable_test.rs
Expand Up @@ -28,17 +28,21 @@ fn disable_rows() {
];

let expected = concat!(
" id | destribution | link \n",
"----+--------------+--------------------------\n",
" 3 | Endeavouros | https://endeavouros.com/ \n",
"+----+--------------+--------------------------+\n",
"| id | destribution | link |\n",
"+----+--------------+--------------------------+\n",
"| 3 | Endeavouros | https://endeavouros.com/ |\n",
"+----+--------------+--------------------------+\n",
);

let table = Table::new(&data)
.with(Style::psql())
.with(Style::default())
.with(Modify::new(Full).with(Alignment::left()))
.with(Disable::Row(1..=2))
.to_string();

println!("{}", table);

assert_eq!(table, expected);
}

Expand All @@ -63,6 +67,7 @@ fn disable_header() {
];

let expected = concat!(
"---+-------------+---------------------------\n",
" 0 | Fedora | https://getfedora.org/ \n",
" 2 | OpenSUSE | https://www.opensuse.org/ \n",
" 3 | Endeavouros | https://endeavouros.com/ \n",
Expand Down

0 comments on commit b14ca29

Please sign in to comment.