package tabwriter

import "text/tabwriter"

Package tabwriter 实现了一个写入过滤器(tabwriter.Writer),可将输入中的制表符分隔列 转换为格式正确的对齐文本。

该包使用 Elastic Tabstops 算法,描述见 http://nickgravgaard.com/elastictabstops/index.html

text/tabwriter 包已冻结,不接受新功能。

Example (Elastic)
package main

import (
	"fmt"
	"os"
	"text/tabwriter"
)

func main() {
	// Observe how the b's and the d's, despite appearing in the
	// second cell of each line, belong to different columns.
	w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, '.', tabwriter.AlignRight|tabwriter.Debug)
	fmt.Fprintln(w, "a\tb\tc")
	fmt.Fprintln(w, "aa\tbb\tcc")
	fmt.Fprintln(w, "aaa\t") // trailing tab
	fmt.Fprintln(w, "aaaa\tdddd\teeee")
	w.Flush()

}

Output:

....a|..b|c
...aa|.bb|cc
..aaa|
.aaaa|.dddd|eeee
Example (TrailingTab)
package main

import (
	"fmt"
	"os"
	"text/tabwriter"
)

func main() {
	// Observe that the third line has no trailing tab,
	// so its final cell is not part of an aligned column.
	const padding = 3
	w := tabwriter.NewWriter(os.Stdout, 0, 0, padding, '-', tabwriter.AlignRight|tabwriter.Debug)
	fmt.Fprintln(w, "a\tb\taligned\t")
	fmt.Fprintln(w, "aa\tbb\taligned\t")
	fmt.Fprintln(w, "aaa\tbbb\tunaligned") // no trailing tab
	fmt.Fprintln(w, "aaaa\tbbbb\taligned\t")
	w.Flush()

}

Output:

------a|------b|---aligned|
-----aa|-----bb|---aligned|
----aaa|----bbb|unaligned
---aaaa|---bbbb|---aligned|

Index

Examples

Constants

const (
	// 忽略 html 标签,并将实体(以 '&' 开头,以 ';' 结尾)视为单个字符(宽度 = 1)。
	FilterHTML uint = 1 << iota

	// 剥离括住转义文本段的 Escape 字符,
	// 而不是与文本一起不变地传递。
	StripEscape

	// 强制单元格内容右对齐。
	// 默认是左对齐。
	AlignRight

	// 将空列视为它们首先不存在于输入中。
	DiscardEmptyColumns

	// 始终使用制表符进行缩进列(即左侧前导空单元格的填充),
	// 独立于 padchar。
	TabIndent

	// 在列之间打印垂直条('|')(格式化后)。
	// 丢弃的列显示为零宽度的列("||")。
	Debug
)

可以使用以下标志控制格式化。

const Escape = '\xff'

要转义文本段,请用 Escape 字符将其括起来。 例如,此字符串中的制表符 "Ignore this tab: \xff\t\xff" 不终止单元格,在格式化时被视为宽度为 1 的单个字符。

选择值 0xff 是因为它不能出现在有效的 UTF-8 序列中。

Types

type Writer

type Writer struct {
	// contains filtered or unexported fields
}

Writer 是一个过滤器,它在输入的制表符分隔列周围插入填充以使其在输出中对齐。

Writer 将传入的字节视为由单元格组成的 UTF-8 编码文本,单元格由水平('\t') 或垂直('\v')制表符以及换行符('\n')或换页符('\f')终止; 换行符和换页符都作为换行处理。

连续行中的制表符终止单元格构成一列。Writer 根据需要插入填充, 使列中的所有单元格具有相同的宽度,从而有效地对齐列。它假设所有字符具有相同的宽度, 制表符除外,必须指定 tabwidth。列单元格必须由制表符终止,而非制表符分隔: 行尾非制表符终止的尾随文本形成一个单元格,但该单元格不属于对齐列。 例如,在以下示例中(其中 | 代表水平制表符):

aaaa|bbb|d
aa  |b  |dd
a   |
aa  |cccc|eee

b 和 c 在不同的列中(b 列并未完全连续)。d 和 e 完全不在任何列中 (没有终止制表符,而且该列也不会连续)。

Writer 假设所有 Unicode 码点具有相同的宽度;在某些字体中, 或者如果字符串包含组合字符,这可能不成立。

如果设置了 DiscardEmptyColumns,则完全由垂直(或"软")制表符终止的空列被丢弃。 由水平(或"硬")制表符终止的列不受此标志影响。

如果 Writer 配置为过滤 HTML,则 HTML 标签和实体会被传递过去。 标签和实体的宽度在格式化时被假定为零(标签)和一(实体)。

文本段可以通过用 Escape 字符将其括起来进行转义。 tabwriter 传递转义的文本段时保持不变。特别是,它不会解释段内的任何制表符或换行符。 如果设置了 StripEscape 标志,Escape 字符会从输出中被剥离; 否则它们也会被传递过去。在格式化时,转义文本的宽度始终不包括 Escape 字符。

换页符的行为类似于换行符,但它也会终止当前行中的所有列(相当于调用 Writer.Flush)。 下一行中以制表符终止的单元格开始新的列。除非出现在 HTML 标签内或转义文本段内, 换页符在输出中显示为换行符。

Writer 必须在内部缓冲输入,因为正确的一行间距可能取决于后续行中的单元格。 客户端在完成调用 Writer.Write 后必须调用 Flush。

func NewWriter

func NewWriter(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer

NewWriter 分配并初始化一个新的 Writer。 参数与 Init 函数相同。

func (*Writer) Flush

func (b *Writer) Flush() error

在最后一次调用 Writer.Write 后应调用 Flush,以确保 Writer 中缓冲的任何数据都被写入输出。 末尾任何不完整的转义序列在格式化时被视为完整。

func (*Writer) Init

func (b *Writer) Init(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer

必须通过调用 Init 初始化 Writer。第一个参数(output)指定过滤器输出。 其余参数控制格式化:

minwidth	最小单元格宽度,包括任何填充
tabwidth	制表符宽度(等效空格数)
padding		计算单元格宽度前添加到单元格的填充
padchar		用于填充的 ASCII 字符
		如果 padchar == '\t',Writer 将假定格式化输出中 '\t' 的宽度为 tabwidth,
		并且单元格左对齐,独立于 align_left
		(要获得正确的结果,tabwidth 必须与显示结果的查看器中的制表符宽度对应)
flags		格式化控制
Example
package main

import (
	"fmt"
	"os"
	"text/tabwriter"
)

func main() {
	w := new(tabwriter.Writer)

	// Format in tab-separated columns with a tab stop of 8.
	w.Init(os.Stdout, 0, 8, 0, '\t', 0)
	fmt.Fprintln(w, "a\tb\tc\td\t.")
	fmt.Fprintln(w, "123\t12345\t1234567\t123456789\t.")
	fmt.Fprintln(w)
	w.Flush()

	// Format right-aligned in space-separated columns of minimal width 5
	// and at least one blank of padding (so wider column entries do not
	// touch each other).
	w.Init(os.Stdout, 5, 0, 1, ' ', tabwriter.AlignRight)
	fmt.Fprintln(w, "a\tb\tc\td\t.")
	fmt.Fprintln(w, "123\t12345\t1234567\t123456789\t.")
	fmt.Fprintln(w)
	w.Flush()

}

Output:

a	b	c	d		.
123	12345	1234567	123456789	.

    a     b       c         d.
  123 12345 1234567 123456789.

func (*Writer) Write

func (b *Writer) Write(buf []byte) (n int, err error)

Write 将 buf 写入 writer b。 返回的唯一错误是在写入底层输出流时遇到的错误。