123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package tablib
- import (
- "github.com/bndr/gotabulate"
- "regexp"
- "strings"
- "unicode/utf8"
- )
- var (
- // TabularGrid is the value to be passed to gotabulate to render the table
- // as ASCII table with grid format
- TabularGrid = "grid"
- // TabularSimple is the value to be passed to gotabulate to render the table
- // as ASCII table with simple format
- TabularSimple = "simple"
- // TabularCondensed is the value to be passed to gotabulate to render the table
- // as ASCII table with condensed format
- TabularCondensed = "condensed"
- // TabularMarkdown is the value to be passed to gotabulate to render the table
- // as ASCII table with Markdown format
- TabularMarkdown = "markdown"
- )
- // Markdown returns a Markdown table Exportable representation of the Dataset.
- func (d *Dataset) Markdown() *Exportable {
- return d.Tabular(TabularMarkdown)
- }
- // Tabular returns a tabular Exportable representation of the Dataset.
- // format is either grid, simple, condensed or markdown.
- func (d *Dataset) Tabular(format string) *Exportable {
- back := d.Records()
- t := gotabulate.Create(back)
- if format == TabularCondensed || format == TabularMarkdown {
- rendered := regexp.MustCompile("\n\n\\s").ReplaceAllString(t.Render("simple"), "\n ")
- if format == TabularMarkdown {
- firstLine := regexp.MustCompile("-\\s+-").ReplaceAllString(strings.Split(rendered, "\n")[0], "- | -")
- // now just locate the position of pipe characterds, and set them
- positions := make([]int, 0, d.cols-1)
- x := 0
- for _, c := range firstLine {
- if c == '|' {
- positions = append(positions, x)
- }
- x += utf8.RuneLen(c)
- }
- b := newBuffer()
- lines := strings.Split(rendered, "\n")
- for _, line := range lines[1 : len(lines)-2] {
- ipos := 0
- b.WriteString("| ")
- for _, pos := range positions {
- if ipos < len(line) && pos < len(line) {
- b.WriteString(line[ipos:pos])
- b.WriteString(" | ")
- ipos = pos + 1
- }
- }
- if ipos < len(line) {
- b.WriteString(line[ipos:])
- }
- b.WriteString(" | \n")
- }
- return newExportable(b)
- }
- return newExportableFromString(rendered)
- }
- return newExportableFromString(t.Render(format))
- }
|