github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/html/template/template.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package template
     6  
     7  import (
     8  	"github.com/shogo82148/std/io"
     9  	"github.com/shogo82148/std/io/fs"
    10  	"github.com/shogo82148/std/text/template"
    11  	"github.com/shogo82148/std/text/template/parse"
    12  )
    13  
    14  // Templateは、安全なHTMLドキュメントフラグメントを生成する"text/template"からの特化したTemplateです。
    15  type Template struct {
    16  	// Sticky error if escaping fails, or escapeOK if succeeded.
    17  	escapeErr error
    18  	// We could embed the text/template field, but it's safer not to because
    19  	// we need to keep our version of the name space and the underlying
    20  	// template's in sync.
    21  	text *template.Template
    22  	// The underlying template's parse tree, updated to be HTML-safe.
    23  	Tree *parse.Tree
    24  	*nameSpace
    25  }
    26  
    27  // Templatesは、t自体を含む、tに関連付けられたテンプレートのスライスを返します。
    28  func (t *Template) Templates() []*Template
    29  
    30  // Optionは、テンプレートのオプションを設定します。オプションは
    31  // 文字列で記述され、単純な文字列または "key=value" の形式を取ります。オプション文字列には
    32  // 最大で一つの等号が含まれます。オプション文字列が認識できない、または無効な場合、
    33  // Optionはパニックを起こします。
    34  //
    35  // 既知のオプション:
    36  //
    37  // missingkey: マップが存在しないキーでインデックス付けされた場合の、実行中の振る舞いを制御します。
    38  //
    39  //	"missingkey=default" または "missingkey=invalid"
    40  //		デフォルトの振る舞い: 何もせずに実行を続けます。
    41  //		印刷される場合、インデックス操作の結果は文字列
    42  //		"<no value>" です。
    43  //	"missingkey=zero"
    44  //		操作はマップタイプの要素のゼロ値を返します。
    45  //	"missingkey=error"
    46  //		エラーで直ちに実行が停止します。
    47  func (t *Template) Option(opt ...string) *Template
    48  
    49  // Executeは、解析されたテンプレートを指定されたデータオブジェクトに適用し、
    50  // 出力をwrに書き込みます。
    51  // テンプレートの実行中またはその出力の書き込み中にエラーが発生した場合、
    52  // 実行は停止しますが、部分的な結果はすでに出力ライターに書き込まれている可能性があります。
    53  // テンプレートは並行して安全に実行できますが、並行実行がWriterを共有する場合、
    54  // 出力が交互になる可能性があります。
    55  func (t *Template) Execute(wr io.Writer, data any) error
    56  
    57  // ExecuteTemplateは、指定された名前を持つtに関連付けられたテンプレートを
    58  // 指定されたデータオブジェクトに適用し、出力をwrに書き込みます。
    59  // テンプレートの実行中またはその出力の書き込み中にエラーが発生した場合、
    60  // 実行は停止しますが、部分的な結果はすでに出力ライターに書き込まれている可能性があります。
    61  // テンプレートは並行して安全に実行できますが、並行実行がWriterを共有する場合、
    62  // 出力が交互になる可能性があります。
    63  func (t *Template) ExecuteTemplate(wr io.Writer, name string, data any) error
    64  
    65  // DefinedTemplatesは、定義されたテンプレートのリストを返します。
    66  // それは文字列 "; defined templates are: " で始まります。もし定義されたテンプレートがなければ、
    67  // 空の文字列を返します。エラーメッセージを生成するために使用されます。
    68  func (t *Template) DefinedTemplates() string
    69  
    70  // Parseは、tのテンプレートボディとしてテキストを解析します。
    71  // テキスト内の名前付きテンプレート定義 ({{define ...}}または{{block ...}}ステートメント) は、
    72  // tに関連付けられた追加のテンプレートを定義し、t自体の定義からは削除されます。
    73  //
    74  // テンプレートは、tまたは関連するテンプレートの [Template.Execute] が初めて使用される前に、
    75  // Parseを連続して呼び出すことで再定義できます。
    76  // ボディが空白とコメントのみで構成されるテンプレート定義は空とみなされ、
    77  // 既存のテンプレートのボディを置き換えません。
    78  // これにより、Parseを使用して新しい名前付きテンプレート定義を追加することができますが、
    79  // メインのテンプレートボディを上書きすることはありません。
    80  func (t *Template) Parse(text string) (*Template, error)
    81  
    82  // AddParseTreeは、名前とパースツリーを持つ新しいテンプレートを作成し、
    83  // それをtに関連付けます。
    84  //
    85  // tまたは関連するテンプレートがすでに実行されている場合、エラーを返します。
    86  func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error)
    87  
    88  // Cloneは、テンプレートの複製を返します。これには、すべての関連テンプレートも含まれます。
    89  // 実際の表現はコピーされませんが、関連テンプレートの名前空間はコピーされるため、
    90  // コピーでの [Template.Parse] へのさらなる呼び出しは、コピーにテンプレートを追加しますが、元のテンプレートには追加しません。
    91  // [Template.Clone] は、共通のテンプレートを準備し、それらを他のテンプレートのバリアント定義とともに使用するために使用できます。
    92  // バリアントは、クローンが作成された後に追加します。
    93  //
    94  // tがすでに実行されている場合、エラーを返します。
    95  func (t *Template) Clone() (*Template, error)
    96  
    97  // Newは、指定された名前を持つ新しいHTMLテンプレートを割り当てます。
    98  func New(name string) *Template
    99  
   100  // Newは、指定された名前を持つ新しいHTMLテンプレートを割り当て、
   101  // それを与えられたテンプレートと同じデリミタと関連付けます。この関連付けは推移的で、
   102  // 一つのテンプレートが{{template}}アクションで別のテンプレートを呼び出すことを可能にします。
   103  //
   104  // 指定された名前を持つテンプレートがすでに存在する場合、新しいHTMLテンプレートは
   105  // それを置き換えます。既存のテンプレートはリセットされ、tとの関連付けが解除されます。
   106  func (t *Template) New(name string) *Template
   107  
   108  // Nameはテンプレートの名前を返します。
   109  func (t *Template) Name() string
   110  
   111  type FuncMap = template.FuncMap
   112  
   113  // Funcsは引数のマップの要素をテンプレートの関数マップに追加します。
   114  // これはテンプレートが解析される前に呼び出す必要があります。
   115  // マップの値が適切な戻り値型を持つ関数でない場合、パニックを起こします。ただし、
   116  // マップの要素を上書きすることは合法です。戻り値はテンプレートなので、
   117  // 呼び出しはチェーンできます。
   118  func (t *Template) Funcs(funcMap FuncMap) *Template
   119  
   120  // Delimsは、アクションのデリミタを指定された文字列に設定します。これは、
   121  // その後の [Template.Parse]、[ParseFiles]、または [ParseGlob] への呼び出しで使用されます。ネストしたテンプレート
   122  // 定義はこの設定を継承します。空のデリミタは、対応するデフォルトを表します: {{ または }}。
   123  // 戻り値はテンプレートなので、呼び出しはチェーンできます。
   124  func (t *Template) Delims(left, right string) *Template
   125  
   126  // Lookupは、tに関連付けられた指定された名前のテンプレートを返します。
   127  // もし該当するテンプレートがなければ、nilを返します。
   128  func (t *Template) Lookup(name string) *Template
   129  
   130  // Mustは、([*Template], error)を返す関数への呼び出しをラップし、
   131  // エラーが非nilの場合にパニックを起こすヘルパーです。これは変数の初期化での使用を意図しています。
   132  // 例えば、
   133  //
   134  //	var t = template.Must(template.New("name").Parse("html"))
   135  func Must(t *Template, err error) *Template
   136  
   137  // ParseFilesは新しい [Template] を作成し、
   138  // 指定されたファイルからテンプレート定義を解析します。返されるテンプレートの名前は、
   139  // 最初のファイルの(ベース)名と(解析された)内容になります。少なくとも一つのファイルが必要です。
   140  // エラーが発生した場合、解析は停止し、返される [*Template] はnilになります。
   141  //
   142  // 異なるディレクトリにある同じ名前の複数のファイルを解析するとき、
   143  // 最後に指定されたものが結果となります。
   144  // 例えば、ParseFiles("a/foo", "b/foo")は "b/foo" を "foo" という名前のテンプレートとして保存し、
   145  // "a/foo" は利用できません。
   146  func ParseFiles(filenames ...string) (*Template, error)
   147  
   148  // ParseFilesは指定されたファイルを解析し、結果として得られるテンプレートを
   149  // tに関連付けます。エラーが発生した場合、解析は停止し、返されるテンプレートはnilになります。
   150  // それ以外の場合、それはtです。少なくとも一つのファイルが必要です。
   151  //
   152  // 異なるディレクトリにある同じ名前の複数のファイルを解析するとき、
   153  // 最後に指定されたものが結果となります。
   154  //
   155  // ParseFilesは、tまたは関連するテンプレートがすでに実行されている場合、エラーを返します。
   156  func (t *Template) ParseFiles(filenames ...string) (*Template, error)
   157  
   158  // ParseGlobは新しい [Template] を作成し、パターンによって識別されたファイルから
   159  // テンプレート定義を解析します。ファイルはfilepath.Matchのセマンティクスに従ってマッチし、
   160  // パターンは少なくとも一つのファイルとマッチしなければなりません。
   161  // 返されるテンプレートの名前は、パターンによって最初にマッチしたファイルの(ベース)名と
   162  // (解析された)内容になります。ParseGlobは、パターンにマッチしたファイルのリストで
   163  // [ParseFiles] を呼び出すのと同等です。
   164  //
   165  // 異なるディレクトリにある同じ名前の複数のファイルを解析するとき、
   166  // 最後に指定されたものが結果となります。
   167  func ParseGlob(pattern string) (*Template, error)
   168  
   169  // ParseGlobは、パターンによって識別されたファイルのテンプレート定義を解析し、
   170  // 結果として得られるテンプレートをtに関連付けます。ファイルはfilepath.Matchのセマンティクスに従ってマッチし、
   171  // パターンは少なくとも一つのファイルとマッチしなければなりません。
   172  // ParseGlobは、パターンにマッチしたファイルのリストでt.ParseFilesを呼び出すのと同等です。
   173  //
   174  // 異なるディレクトリにある同じ名前の複数のファイルを解析するとき、
   175  // 最後に指定されたものが結果となります。
   176  //
   177  // ParseGlobは、tまたは関連するテンプレートがすでに実行されている場合、エラーを返します。
   178  func (t *Template) ParseGlob(pattern string) (*Template, error)
   179  
   180  // IsTrueは、値がその型のゼロでない「真」であるか、
   181  // そして値が意味のある真偽値を持っているかどうかを報告します。
   182  // これはifやその他のアクションで使用される真実の定義です。
   183  func IsTrue(val any) (truth, ok bool)
   184  
   185  // ParseFSは [ParseFiles] や [ParseGlob] と似ていますが、ホストのオペレーティングシステムのファイルシステムではなく、
   186  // ファイルシステムfsから読み取ります。
   187  // それはグロブパターンのリストを受け入れます。
   188  // (ほとんどのファイル名は、自分自身のみにマッチするグロブパターンとして機能することに注意してください。)
   189  func ParseFS(fs fs.FS, patterns ...string) (*Template, error)
   190  
   191  // ParseFSは [Template.ParseFiles] や [Template.ParseGlob] と似ていますが、ホストのオペレーティングシステムのファイルシステムではなく、
   192  // ファイルシステムfsから読み取ります。
   193  // それはグロブパターンのリストを受け入れます。
   194  // (ほとんどのファイル名は、自分自身のみにマッチするグロブパターンとして機能することに注意してください。)
   195  func (t *Template) ParseFS(fs fs.FS, patterns ...string) (*Template, error)