Spec-Zone.ru › Go

Пакет tabwriter

  • import "text/tabwriter"
  • Обзор
  • Указатель
  • Примеры

Обзор

Пакет tabwriter реализует фильтр записи (tabwriter.Writer), преобразующий столбцы, разделённые табуляцией во входных данных, в текст с правильным выравниванием.

В пакете используется алгоритм Elastic Tabstops, описанный по адресу http://nickgravgaard.com/elastictabstops/index.html.

Пакет text/tabwriter заморожен: новые функции не добавляются.

Пример (Elastic)

Код:

// 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

Пример (TrailingTab)

Код:

// 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|

Указатель

  • Константы
  • тип Writer
  • функция NewWriter(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer
  • функция (b *Writer) Flush() error
  • функция (b *Writer) Init(output io.Writer, minwidth, tabwidth, padding int, padchar byte, flags uint) *Writer
  • функция (b *Writer) Write(buf []byte) (n int, err error)

Примеры

Writer.Init
Пакет (Elastic)
Пакет (TrailingTab)

Файлы пакета

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. Например, табуляция в этой строке "Ignore this tab: \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 должен буферизовать входные данные, поскольку правильное форматирование одной строки может зависеть от ячеек в последующих строках. По завершении вызовов Writer.Write необходимо вызвать Flush.

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

После последнего вызова Writer.Write следует вызвать Flush, чтобы гарантировать запись в выходной поток всех данных, буферизованных в 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API