diff --git a/vlib/term/term.v b/vlib/term/term.v index 501f63e328..399df46fdb 100644 --- a/vlib/term/term.v +++ b/vlib/term/term.v @@ -6,7 +6,6 @@ const ( default_columns_size = 80 default_rows_size = 25 ) - // can_show_color_on_stdout returns true if colors are allowed in stdout; // returns false otherwise. pub fn can_show_color_on_stdout() bool { @@ -34,11 +33,26 @@ pub fn fail_message(s string) string { // h_divider returns a horizontal divider line with a dynamic width, // that depends on the current terminal settings. pub fn h_divider(divider string) string { - cols, _ := get_terminal_size() + cols,_ := get_terminal_size() result := divider.repeat(1 + (cols / divider.len)) return result[0..cols] } +// header returns a horizontal divider line with a centered text in the middle. +// e.g: term.header('TEXT', '=') +// =============== TEXT =============== +pub fn header(text, divider string) string { + if text.len == 0 { + return h_divider(divider) + } + cols,_ := get_terminal_size() + tlimit := if cols > text.len + 2 + 2 * divider.len { text.len } else { cols - 3 - 2 * divider.len } + tlimit_alligned := if (tlimit % 2) != (cols % 2) { tlimit + 1 } else { tlimit } + tstart := (cols - tlimit_alligned) / 2 + ln := divider.repeat(1 + cols / divider.len)[0..cols] + return ln[0..tstart] + ' ' + text[0..tlimit] + ' ' + ln[tstart + tlimit + 2..cols] +} + fn supports_escape_sequences(fd int) bool { $if windows { return (is_atty(fd) & 0x0004) > 0 && os.getenv('TERM') != 'dumb' // ENABLE_VIRTUAL_TERMINAL_PROCESSING diff --git a/vlib/term/term_test.v b/vlib/term/term_test.v new file mode 100644 index 0000000000..70a005c765 --- /dev/null +++ b/vlib/term/term_test.v @@ -0,0 +1,57 @@ +import term + +fn test_get_terminal_size() { + cols,_ := term.get_terminal_size() + assert cols > 0 +} + +fn test_h_divider() { + divider := term.h_divider('-') + assert divider.len > 0 + assert divider[0] == `-` + assert divider[divider.len - 1] == `-` +} + +fn test_h_divider_multiple_characters() { + xdivider := term.h_divider('abc') + assert xdivider.len > 0 + assert xdivider.contains('abcabc') +} + +fn test_header() { + divider := term.h_divider('-') + term_width := divider.len + assert term_width > 0 + empty_header := term.header('', '-') + short_header := term.header('reasonable header', '-') + very_long_header := term.header(['abc'].repeat(500).join(' '), '-') + very_long_header_2 := term.header(['abcd'].repeat(500).join(' '), '-') + /* + eprintln(divider) + eprintln(empty_header) + eprintln(short_header) + eprintln(term.header('another longer header', '_-/\\')) + eprintln(term.header('another longer header', '-')) + eprintln(term.header('short', '-')) + eprintln(term.header('12345', '-')) + eprintln(term.header('1234', '-')) + eprintln(term.header('123', '-')) + eprintln(term.header('12', '-')) + eprintln(term.header('1', '-')) + eprintln(very_long_header) + eprintln(divider) + eprintln(very_long_header_2) + eprintln(term.header(['abcd'].repeat(500).join(' '), '_-/\\')) + eprintln(term.header(['abcd'].repeat(500).join(' '), '_-//')) + eprintln(term.header('1', '_-/\\\/')) + eprintln(term.header('12', '_-/\\\/')) + eprintln(term.header('123', '_-/\\\/')) + eprintln(term.header('1234', '_-/\\/\\')) + eprintln(term.header('', '-')) + */ + assert term_width == empty_header.len + assert term_width == short_header.len + assert term_width == very_long_header.len + assert term_width == very_long_header_2.len + assert term_width == term.header('1234', '_-/\\/\\').len +}