From 9ffcaa8e1ccd0001816d57f4bd37db7da5d09e45 Mon Sep 17 00:00:00 2001 From: Niklas Fasching Date: Sun, 21 Jun 2020 22:13:31 +0200 Subject: [PATCH] Add support for table column display width markers see https://orgmode.org/manual/Column-Width-and-Alignment.html#Column-Width-and-Alignment --- org/table.go | 15 ++++++++++----- org/testdata/tables.html | 2 +- org/testdata/tables.org | 5 +++-- org/testdata/tables.pretty_org | 5 +++-- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/org/table.go b/org/table.go index 395588a..244f505 100644 --- a/org/table.go +++ b/org/table.go @@ -23,14 +23,15 @@ type Column struct { } type ColumnInfo struct { - Align string - Len int + Align string + Len int + DisplayLen int } var tableSeparatorRegexp = regexp.MustCompile(`^(\s*)(\|[+-|]*)\s*$`) var tableRowRegexp = regexp.MustCompile(`^(\s*)(\|.*)`) -var columnAlignRegexp = regexp.MustCompile(`^<(l|c|r)>$`) +var columnAlignAndLengthRegexp = regexp.MustCompile(`^<(l|c|r)?(\d+)?>$`) func lexTable(line string) (token, bool) { if m := tableSeparatorRegexp.FindStringSubmatch(line); m != nil { @@ -94,7 +95,7 @@ func getColumnInfos(rows [][]string) []ColumnInfo { columnInfos[i].Len = n } - if m := columnAlignRegexp.FindStringSubmatch(columns[i]); m != nil && isSpecialRow(columns) { + if m := columnAlignAndLengthRegexp.FindStringSubmatch(columns[i]); m != nil && isSpecialRow(columns) { switch m[1] { case "l": columnInfos[i].Align = "left" @@ -103,6 +104,10 @@ func getColumnInfos(rows [][]string) []ColumnInfo { case "r": columnInfos[i].Align = "right" } + if m[2] != "" { + l, _ := strconv.Atoi(m[2]) + columnInfos[i].DisplayLen = l + } } else if _, err := strconv.ParseFloat(columns[i], 32); err == nil { countNumeric++ } else if strings.TrimSpace(columns[i]) != "" { @@ -120,7 +125,7 @@ func getColumnInfos(rows [][]string) []ColumnInfo { func isSpecialRow(rawColumns []string) bool { isAlignRow := true for _, rawColumn := range rawColumns { - if !columnAlignRegexp.MatchString(rawColumn) && rawColumn != "" { + if !columnAlignAndLengthRegexp.MatchString(rawColumn) && rawColumn != "" { isAlignRow = false } } diff --git a/org/testdata/tables.html b/org/testdata/tables.html index 4c42147..f31e84d 100644 --- a/org/testdata/tables.html +++ b/org/testdata/tables.html @@ -127,7 +127,7 @@ table without header
-table with aligned columns +table with aligned and sized columns
diff --git a/org/testdata/tables.org b/org/testdata/tables.org index a3c51b2..215c540 100644 --- a/org/testdata/tables.org +++ b/org/testdata/tables.org @@ -24,10 +24,11 @@ #+CAPTION: table without header | 1 | 2 | 3 | -#+CAPTION: table with aligned columns +#+CAPTION: table with aligned and sized columns | left aligned | right aligned | center aligned | |--------------+---------------+----------------| -| | | | +| | | | +| | <1> | | | 42 | 42 | 42 | | foobar | foobar | foobar | diff --git a/org/testdata/tables.pretty_org b/org/testdata/tables.pretty_org index a3c51b2..215c540 100644 --- a/org/testdata/tables.pretty_org +++ b/org/testdata/tables.pretty_org @@ -24,10 +24,11 @@ #+CAPTION: table without header | 1 | 2 | 3 | -#+CAPTION: table with aligned columns +#+CAPTION: table with aligned and sized columns | left aligned | right aligned | center aligned | |--------------+---------------+----------------| -| | | | +| | | | +| | <1> | | | 42 | 42 | 42 | | foobar | foobar | foobar |