Пакет tabwriter
Обзор
Пакет tabwriter реализует фильтр записи (tabwriter.Writer), который преобразует табулированные столбцы во входных данных в правильно выровненные текст.
Пакет использует алгоритм упругих отступов, описанный на http://nickgravgaard.com/elastictabstops/index.html.
Пакет text/tabwriter заморожен и не принимает новые возможности.
Пример (Упругий)
Код:
// 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()
Вывод:
....a|..b|c ...aa|.bb|cc ..aaa| .aaaa|.dddd|eeee
Пример (Завершающая табуляция)
Код:
// 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()
Вывод:
------a|------b|---aligned| -----aa|-----bb|---aligned| ----aaa|----bbb|unaligned ---aaaa|---bbbb|---aligned|
Индекс
Файлы пакета
tabwriter.go
Константы
Форматирование можно контролировать с помощью этих флагов.
const (
// Ignore html tags and treat entities (starting with '&'
// and ending in ';') as single characters (width = 1).
FilterHTML uint = 1 << iota
// Strip Escape characters bracketing escaped text segments
// instead of passing them through unchanged with the text.
StripEscape
// Force right-alignment of cell content.
// Default is left-alignment.
AlignRight
// Handle empty columns as if they were not present in
// the input in the first place.
DiscardEmptyColumns
// Always use tabs for indentation columns (i.e., padding of
// leading empty cells on the left) independent of padchar.
TabIndent
// Print a vertical bar ('|') between columns (after formatting).
// Discarded columns appear as zero-width columns ("||").
Debug
) Чтобы экранировать фрагмент текста, заключите его в Escape-символы. Например, табуляция в этой строке "Проигнорировать эту табуляцию: \xff\t\xff" не завершает ячейку и представляет собой один символ ширины для целей форматирования.
Значение 0xff было выбрано, потому что оно не может появиться в допустимой последовательности UTF-8.
const Escape = '\xff'
тип Writer
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 должен буферизовать входные данные внутри, потому что правильное расстояние одной строки может зависеть от ячеек в последующих строках. Клиенты должны вызывать Flush, когда закончат вызывать Writer.Write.
type Writer struct {
// contains filtered or unexported fields
}
функция NewWriter
func NewWriter(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer
NewWriter выделяет и инициализирует новый Writer. Параметры такие же, как и для функции Init.
функция (*Writer) Flush
func (b *Writer) Flush() error
Flush следует вызывать после последнего вызова Writer.Write, чтобы убедиться, что все данные, буферизованные в Writer, записаны в вывод. Любая незавершенная последовательность escape в конце считается завершенной для целей форматирования.
функция (*Writer) Init
func (b *Writer) Init(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer
Writer должен быть инициализирован вызовом Init. Первый параметр (output) определяет вывод фильтра. Остальные параметры контролируют форматирование:
minwidth minimal cell width including any padding tabwidth width of tab characters (equivalent number of spaces) padding padding added to a cell before computing its width padchar ASCII char used for padding if padchar == '\t', the Writer will assume that the width of a '\t' in the formatted output is tabwidth, and cells are left-aligned independent of align_left (for correct-looking results, tabwidth must correspond to the tab width in the viewer displaying the result) flags formatting control
Пример
Код:
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()
Вывод:
a b c d .
123 12345 1234567 123456789 .
a b c d.
123 12345 1234567 123456789.
функция (*Writer) Write
func (b *Writer) Write(buf []byte) (n int, err error)
Write записывает buf в Writer b. Единственные возвращаемые ошибки — это ошибки, возникшие при записи в базовом потоке вывода.
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/text/tabwriter/