tabwriter

package
v1.22.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 26, 2024 License: MIT Imports: 1 Imported by: 0

Documentation

Overview

tabwriterパッケージは、入力のタブ区切りの列を適切に整列したテキストに変換する 書き込みフィルタ(tabwriter.Writer)を実装します。

このパッケージは、http://nickgravgaard.com/elastictabstops/index.html で 説明されているElastic Tabstopsアルゴリズムを使用しています。

text/tabwriterパッケージは凍結されており、新しい機能は受け入れていません。

Example (Elastic)
package main

import (
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/os"
	"github.com/shogo82148/std/text/tabwriter"
)

func main() {
	// bとdがどちらも各行の2番目のセルに表示されているにもかかわらず、
	// 異なる列に属していることに注目してください。
	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 (
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/os"
	"github.com/shogo82148/std/text/tabwriter"
)

func main() {
	// 3行目には末尾のタブがないことに注意してください。
	// したがって、その最終セルは整列した列の一部ではありません。
	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") // 末尾にタブがない
	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

View Source
const (
	// HTMLタグを無視し、エンティティ('&'で始まり';'で終わる)を単一の文字(幅=1)として扱います。
	FilterHTML uint = 1 << iota

	// エスケープされたテキストセグメントを括るエスケープ文字を削除します。
	// テキストと一緒に変更せずにそれらを通過させる代わりに。
	StripEscape

	// セルの内容を右揃えに強制します。
	// デフォルトは左揃えです。
	AlignRight

	// 空の列を、最初から入力に存在しなかったかのように扱います。
	DiscardEmptyColumns

	// 常にタブをインデント列(つまり、左側の先頭の空セルのパディング)に使用します。
	// padcharに関係なく。
	TabIndent

	// 列の間に垂直バー ('|') を印刷します(フォーマット後)。
	// 破棄された列はゼロ幅の列として表示されます ("||")。
	Debug
)

これらのフラグを使用して、フォーマットを制御できます。

View Source
const Escape = '\xff'

テキストセグメントをエスケープするには、Escape文字でそれを括ります。 例えば、この文字列 "Ignore this tab: \xff\t\xff" のタブはセルを終了せず、 フォーマットの目的で幅一の単一文字を構成します。

値0xffは、有効なUTF-8シーケンスには現れないため選ばれました。

Variables

This section is empty.

Functions

This section is empty.

Types

type Writer

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

Writerは、入力のタブ区切りの列の周囲にパディングを挿入して、 出力でそれらを整列させるフィルタです。

Writerは、入力バイトを水平('\t')または垂直('\v')のタブ、 改行('\n')またはフォームフィード('\f')文字で終了するセルとして 扱います。改行とフォームフィードの両方が行の区切りとして機能します。

連続する行のタブで終了するセルは列を構成します。Writerは、 列内のすべてのセルが同じ幅になるように必要に応じてパディングを挿入し、 事実上、列を整列させます。すべての文字が同じ幅を持つと仮定していますが、 タブについてはタブ幅を指定する必要があります。列のセルはタブで終了する必要があり、 タブで区切られるべきではありません:行の終わりの非タブで終了する末尾のテキストは セルを形成しますが、そのセルは整列した列の一部ではありません。 例えば、この例では(ここで | は水平タブを表します):

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文字を除いて計算されます。

フォームフィード文字は改行のように機能しますが、現在の行のすべての列も終了します (事実上Flushを呼び出します)。次の行のタブで終了するセルは新しい列を開始します。 HTMLタグ内やエスケープされたテキストセグメント内で見つからない限り、 フォームフィード文字は出力で改行として表示されます。

Writerは、適切な行の間隔が将来の行のセルに依存する可能性があるため、 入力を内部的にバッファリングする必要があります。クライアントは、 Writeの呼び出しが終了したらFlushを呼び出す必要があります。

func NewWriter

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

NewWriterは新しいtabwriter.Writerを割り当てて初期化します。 パラメータはInit関数と同じです。

func (*Writer) Flush

func (b *Writer) Flush() error

Writeの最後の呼び出し後にFlushを呼び出す必要があります。これにより、 Writerにバッファリングされたデータがすべて出力に書き込まれます。終了時に不完全な エスケープシーケンスは、フォーマットの目的で完全と見なされます。

func (*Writer) Init

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

Writerは、Initへの呼び出しで初期化する必要があります。最初のパラメータ(output)は フィルタ出力を指定します。残りのパラメータはフォーマットを制御します:

minwidth	パディングを含む最小セル幅
tabwidth	タブ文字の幅(相当するスペースの数)
padding		セルの幅を計算する前にセルに追加されるパディング
padchar		パディングに使用されるASCII文字
		もし padchar == '\t' なら、Writerはフォーマットされた出力の
		'\t'の幅がtabwidthであると仮定し、align_leftに関係なく
		セルは左揃えになります
		(正確に見える結果のために、tabwidthは結果を表示するビューアの
		タブ幅に対応している必要があります)
flags		フォーマット制御
Example
package main

import (
	"github.com/shogo82148/std/fmt"
	"github.com/shogo82148/std/os"
	"github.com/shogo82148/std/text/tabwriter"
)

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

	// タブストップ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()

	// 最小幅5のスペースで区切られた列に右揃えでフォーマットします。
	// そして少なくとも1つの空白のパディング(よって、より広い列のエントリーが
	// お互いに触れないようにします)。
	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をライターbに書き込みます。 返されるエラーは、基礎となる出力ストリームへの書き込み中に遭遇したものだけです。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL