All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.rahulsom.jansitable.Table Maven / Gradle / Ivy

package com.github.rahulsom.jansitable;

import org.fusesource.jansi.Ansi;
import org.fusesource.jansi.AnsiString;

import java.io.PrintStream;
import java.util.List;

import static com.github.rahulsom.jansitable.Column.Alignment.RIGHT;
import static org.fusesource.jansi.Ansi.Color.BLACK;

public class Table {
    private final List columns;
    private final int padding;
    private final PrintStream out;

    Table(List columns, int padding, PrintStream out) {
        this.columns = columns;
        this.padding = padding;
        this.out = out;
    }

    private static final String[] INTERSECTIONS = {
            "┌┬┐",
            "├┼┤",
            "└┴┘"
    };
    private static final char H_BORDER = '─';
    private static final char V_BORDER = '│';

    public Table printHeader() {
        return line(INTERSECTIONS[0]);
    }

    public Table printDivider() {
        return line(INTERSECTIONS[1]);
    }

    public Table printFooter() {
        return line(INTERSECTIONS[2]);
    }

    private static String repeat(char c, int times) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < times; i ++) {
            sb.append(c);
        }
        return sb.toString();
    }

    private Table line(String chars) {
        Ansi ansi = Ansi.ansi().fg(BLACK);
        for (int i = 0; i <= columns.size(); i++) {
            if (i == 0) {
                ansi.a(chars.charAt(0)).a(repeat(H_BORDER, columns.get(i).width + padding));
            } else if (i == columns.size()) {
                ansi.a(repeat(H_BORDER, padding)).a(chars.charAt(2));
            } else {
                ansi.a(repeat(H_BORDER, padding)).a(chars.charAt(1)).a(repeat(H_BORDER, columns.get(i).width + padding));
            }
        }
        out.println(ansi.reset().toString());
        return this;
    }

    public Table print(Object... data) {
        assert data.length == columns.size();
        Ansi ansi = Ansi.ansi();
        for (int i = 0; i <= columns.size(); i++) {
            if (i < columns.size()) {
                ansi.fg(BLACK).a(V_BORDER).reset().a(repeat(' ', padding));
                Column column = columns.get(i);
                String field = data[i].toString();
                AnsiString printable = new AnsiString(field);
                int cellPadding = column.width - printable.length();
                if (column.alignment == RIGHT) {
                    ansi.a(repeat(' ', cellPadding)).a(field);
                } else {
                    ansi.a(field).a(repeat(' ', cellPadding));
                }
                ansi.a(repeat(' ', padding));
            } else {
                ansi.a(Ansi.ansi().fg(BLACK).a(V_BORDER).reset());
            }
        }
        out.println(ansi);
        return this;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy