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)