/*
Plain-text/markdown/HTML/custom rendering of tables.
**Custom rendering.**
Example:
package main
import "core:io"
import "core:text/table"
main :: proc() {
stdout := table.stdio_writer()
tbl := table.init(&table.Table{})
table.padding(tbl, 0, 1)
table.row(tbl, "A_LONG_ENUM", "= 54,", "// A comment about A_LONG_ENUM")
table.row(tbl, "AN_EVEN_LONGER_ENUM", "= 1,", "// A comment about AN_EVEN_LONGER_ENUM")
table.build(tbl, table.unicode_width_proc)
for row in 0.. (result: int) {
for r in str {
result += 2
}
return
}
table.write_plain_table(stdout, tbl, simple_cjk_width_proc)
This procedure will output 2 times the number of UTF-8 runes in a string, a
simple heuristic for CJK-only wide text.
**Unicode Support:**
This package makes use of the `grapheme_count` procedure from the
`core:unicode/utf8` package. It is a complete, standards-compliant
implementation for counting graphemes and calculating visual width of a Unicode
grapheme cluster in monospace cells.
Example:
package main
import "core:fmt"
import "core:io"
import "core:os"
import "core:text/table"
scripts :: proc(w: io.Writer) {
t: table.Table
table.init(&t)
defer table.destroy(&t)
table.caption(&t, "Tést Suite")
table.padding(&t, 1, 3)
table.header_of_aligned_values(&t, {{.Left, "Script"}, {.Center, "Sample"}})
table.row(&t, "Latin", "At vero eos et accusamus et iusto odio dignissimos ducimus,")
table.row(&t, "Cyrillic", "Ру́сский язы́к — язык восточнославянской группы славянской")
table.row(&t, "Greek", "Η ελληνική γλώσσα ανήκει στην ινδοευρωπαϊκή οικογένεια")
table.row(&t, "Younger Futhark", "ᚴᚢᚱᛘᛦ ᚴᚢᚾᚢᚴᛦ ᚴᛅᚱᚦᛁ ᚴᚢᛒᛚ ᚦᚢᛋᛁ ᛅᚠᛏ ᚦᚢᚱᚢᛁ ᚴᚢᚾᚢ ᛋᛁᚾᛅ ᛏᛅᚾᛘᛅᚱᚴᛅᛦ ᛒᚢᛏ")
table.row(&t, "Chinese hanzi", "官話為汉语的一支,主體分布在中国北部和西南部的大部分地区。")
table.row(&t, "Japanese kana", "いろはにほへとちりぬるをわかよたれそつねならむ")
table.row(&t, "Korean hangul", "한글, 조선글은 한국어의 공식문자로서, 세종이 한국어를")
table.row(&t, "Thai", "ภาษาไทย หรือ ภาษาไทยกลาง เป็นภาษาในกลุ่มภาษาไท ซึ่งเป็นกลุ่มย่อยของตระกูลภาษาขร้า-ไท")
table.row(&t, "Georgian", "ქართული ენა — ქართველურ ენათა ოჯახის ენა. ქართველების მშობლიური ენა,")
table.row(&t, "Armenian", "Իր շուրջ հինգհազարամյա գոյության ընթացքում հայերենը շփվել է տարբեր")
table.row(&t)
table.row_of_aligned_values(&t, {{.Left, "Arabic"}, {.Right, "ٱللُّغَةُ ٱلْعَرَبِيَّة هي أكثر اللغات السامية تحدثًا، وإحدى أكثر"}})
table.row_of_aligned_values(&t, {{.Left, "Hebrew"}, {.Right, "עִבְרִית היא שפה שמית, ממשפחת השפות האפרו-אסייתיות, הידועה"}})
table.row(&t)
table.row(&t, "Swedish", "Växjö [ˈvɛkːˌɧøː] är en tätort i södra Smålands inland samt centralort i Växjö kommun")
table.row(&t, "Saxon", "Hwæt! We Gardena in geardagum, þeodcyninga, þrym gefrunon, hu ða æþelingas ellen fremedon.")
table.row(&t)
table.aligned_row_of_values(&t, .Center, "Emoji (Single codepoints)", "\U0001f4ae \U0001F600 \U0001F201 \U0001F21A")
table.row(&t, "Excessive Diacritics", "H̷e̶l̵l̸o̴p̵e̷ ̸w̶o̸r̵l̶d̵!̴")
table.write_plain_table(w, &t)
fmt.println()
}
main :: proc() {
scripts(os.to_stream(os.stdout))
}
Output:
+----------------------------------------------------------------------------------------------------------------------------+
| Tést Suite |
+-----------------------------+----------------------------------------------------------------------------------------------+
| Script | Sample |
+-----------------------------+----------------------------------------------------------------------------------------------+
| Latin | At vero eos et accusamus et iusto odio dignissimos ducimus, |
| Cyrillic | Ру́сский язы́к — язык восточнославянской группы славянской |
| Greek | Η ελληνική γλώσσα ανήκει στην ινδοευρωπαϊκή οικογένεια |
| Younger Futhark | ᚴᚢᚱᛘᛦ ᚴᚢᚾᚢᚴᛦ ᚴᛅᚱᚦᛁ ᚴᚢᛒᛚ ᚦᚢᛋᛁ ᛅᚠᛏ ᚦᚢᚱᚢᛁ ᚴᚢᚾᚢ ᛋᛁᚾᛅ ᛏᛅᚾᛘᛅᚱᚴᛅᛦ ᛒᚢᛏ |
| Chinese hanzi | 官話為汉语的一支,主體分布在中国北部和西南部的大部分地区。 |
| Japanese kana | いろはにほへとちりぬるをわかよたれそつねならむ |
| Korean hangul | 한글, 조선글은 한국어의 공식문자로서, 세종이 한국어를 |
| Thai | ภาษาไทย หรือ ภาษาไทยกลาง เป็นภาษาในกลุ่มภาษาไท ซึ่งเป็นกลุ่มย่อยของตระกูลภาษาขร้า-ไท |
| Georgian | ქართული ენა — ქართველურ ენათა ოჯახის ენა. ქართველების მშობლიური ენა, |
| Armenian | Իր շուրջ հինգհազարամյա գոյության ընթացքում հայերենը շփվել է տարբեր |
| | |
| Arabic | ٱللُّغَةُ ٱلْعَرَبِيَّة هي أكثر اللغات السامية تحدثًا، وإحدى أكثر |
| Hebrew | עִבְרִית היא שפה שמית, ממשפחת השפות האפרו-אסייתיות, הידועה |
| | |
| Swedish | Växjö [ˈvɛkːˌɧøː] är en tätort i södra Smålands inland samt centralort i Växjö kommun |
| Saxon | Hwæt! We Gardena in geardagum, þeodcyninga, þrym gefrunon, hu ða æþelingas ellen fremedon. |
| | |
| Emoji (Single codepoints) | 💮 😀 🈁 🈚 |
| Excessive Diacritics | H̷e̶l̵l̸o̴p̵e̷ ̸w̶o̸r̵l̶d̵!̴ |
+-----------------------------+----------------------------------------------------------------------------------------------+
**Decorated Tables:**
If you'd prefer to change the borders used by the plain-text table printing,
there is the `write_decorated_table` procedure that allows you to change the
corners and dividers.
Example:
package main
import "core:fmt"
import "core:io"
import "core:os"
import "core:text/table"
box_drawing :: proc(w: io.Writer) {
t: table.Table
table.init(&t)
defer table.destroy(&t)
table.caption(&t, "Box Drawing Example")
table.padding(&t, 2, 2)
table.header_of_aligned_values(&t, {{.Left, "Operating System"}, {.Center, "Year Introduced"}})
table.row(&t, "UNIX", "1973")
table.row(&t, "MS-DOS", "1981")
table.row(&t, "Commodore 64 KERNAL", "1982")
table.row(&t, "Mac OS", "1984")
table.row(&t, "Amiga", "1985")
table.row(&t, "Windows 1.0", "1985")
table.row(&t, "Linux", "1991")
table.row(&t, "Windows 3.1", "1992")
decorations := table.Decorations {
"┌", "┬", "┐",
"├", "┼", "┤",
"└", "┴", "┘",
"│", "─",
}
table.write_decorated_table(w, &t, decorations)
fmt.println()
}
main :: proc() {
box_drawing(os.to_stream(os.stdout))
}
While the decorations support multi-codepoint Unicode graphemes, do note that
each border character should not be larger than one monospace cell.
*/
package text_table