Skip to content

Commit dcc141b

Browse files
authored
Allow rendering of the table in GitHub Flavored Markdown (#59)
By adding the :gfm horizontal style, the table will now skip just top top and bottom frames while still rendering the title separator.
1 parent b22f7b0 commit dcc141b

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

lib/table_rex/renderer/text.ex

+17-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ defmodule TableRex.Renderer.Text do
1212
# vertical_styles: [:all, :frame, :off]
1313

1414
# Which horizontal/vertical styles render a specific separator.
15-
@render_horizontal_frame_styles [:all, :frame, :header]
15+
@render_horizontal_frame_styles [:all, :frame, :header, :gfm]
1616
@render_vertical_frame_styles [:all, :frame]
1717
@render_column_separators_styles [:all]
1818
@render_row_separators_styles [:all]
@@ -44,6 +44,7 @@ defmodule TableRex.Renderer.Text do
4444
* `:all`: display separators between and around every row.
4545
* `:header`: display outer and header horizontal separators only.
4646
* `:frame`: display outer horizontal separators only.
47+
* `:gfm`: display all separators except top and bottom to comply with github flavored markdown
4748
* `:off`: display no horizontal separators.
4849
4950
`vertical_styles` controls vertical separators and can be one of:
@@ -61,6 +62,8 @@ defmodule TableRex.Renderer.Text do
6162
render_vertical_frame? = opts[:vertical_style] in @render_vertical_frame_styles
6263
render_column_separators? = opts[:vertical_style] in @render_column_separators_styles
6364
render_row_separators? = opts[:horizontal_style] in @render_row_separators_styles
65+
render_frame_top? = opts[:horizontal_style] != :gfm
66+
render_frame_bottom? = opts[:horizontal_style] != :gfm
6467
table_width = table_width(col_widths, vertical_frame?: render_vertical_frame?)
6568
intersections = intersections(table_width, col_widths, vertical_style: opts[:vertical_style])
6669

@@ -72,7 +75,9 @@ defmodule TableRex.Renderer.Text do
7275
render_horizontal_frame?: render_horizontal_frame?,
7376
render_vertical_frame?: render_vertical_frame?,
7477
render_column_separators?: render_column_separators?,
75-
render_row_separators?: render_row_separators?
78+
render_row_separators?: render_row_separators?,
79+
render_frame_top?: render_frame_top?,
80+
render_frame_bottom?: render_frame_bottom?
7681
}
7782

7883
rendered =
@@ -89,6 +94,10 @@ defmodule TableRex.Renderer.Text do
8994
{:ok, rendered}
9095
end
9196

97+
defp render_top_frame({table, %Meta{render_frame_top?: false} = meta, opts, rendered}) do
98+
{table, meta, opts, rendered}
99+
end
100+
92101
defp render_top_frame({table, %Meta{render_horizontal_frame?: false} = meta, opts, rendered}) do
93102
{table, meta, opts, rendered}
94103
end
@@ -145,7 +154,7 @@ defmodule TableRex.Renderer.Text do
145154
defp render_title_separator(
146155
{table, meta, %{horizontal_style: horizontal_style} = opts, rendered}
147156
)
148-
when horizontal_style in [:all, :header] do
157+
when horizontal_style in [:all, :header, :gfm] do
149158
line =
150159
render_line(
151160
meta.table_width,
@@ -186,7 +195,7 @@ defmodule TableRex.Renderer.Text do
186195
defp render_header_separator(
187196
{table, meta, %{horizontal_style: horizontal_style} = opts, rendered}
188197
)
189-
when horizontal_style in [:all, :header] do
198+
when horizontal_style in [:all, :header, :gfm] do
190199
line =
191200
render_line(
192201
meta.table_width,
@@ -242,6 +251,10 @@ defmodule TableRex.Renderer.Text do
242251

243252
defp vertically_framed(lines, _, _), do: lines
244253

254+
defp render_bottom_frame({table, %Meta{render_frame_bottom?: false} = meta, opts, rendered}) do
255+
{table, meta, opts, rendered}
256+
end
257+
245258
defp render_bottom_frame({table, %Meta{render_horizontal_frame?: false} = meta, opts, rendered}) do
246259
{table, meta, opts, rendered}
247260
end

lib/table_rex/renderer/text/meta.ex

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ defmodule TableRex.Renderer.Text.Meta do
1212
render_horizontal_frame?: false,
1313
render_vertical_frame?: false,
1414
render_column_separators?: false,
15-
render_row_separators?: false
15+
render_row_separators?: false,
16+
render_frame_top?: true,
17+
render_frame_bottom?: true
1618

1719
@doc """
1820
Retrieves the "inner width" of the table, which is the full width minus any frame.

test/table_rex/renderer/text_test.exs

+15
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,21 @@ defmodule TableRex.Renderer.TextTest do
525525
"""
526526
end
527527

528+
test "render in github flavored markdown format", %{table: table} do
529+
{:ok, rendered} =
530+
table
531+
|> Table.put_title("")
532+
|> Table.render(horizontal_style: :gfm)
533+
534+
assert rendered == """
535+
| Artist | Track | Year |
536+
+----------------+----------------------+------+
537+
| Konflict | Cyanide | 1999 |
538+
| Keaton & Hive | The Plague | 2003 |
539+
| Vicious Circle | Welcome To Shanktown | 2007 |
540+
"""
541+
end
542+
528543
test "render with not title or header & horizontal style: frame", %{table: table} do
529544
{:ok, rendered} =
530545
table

0 commit comments

Comments
 (0)