github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/text/template/parse/node.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 // Parse nodes. 6 7 package parse 8 9 import ( 10 "github.com/shogo82148/std/strings" 11 ) 12 13 // Nodeはパースツリーの要素です。インターフェースは極めて単純です。 14 // インターフェースには未エクスポートのメソッドが含まれているため、 15 // このパッケージのローカルタイプのみがそれを満たすことができます。 16 type Node interface { 17 Type() NodeType 18 String() string 19 Copy() Node 20 Position() Pos 21 22 tree() *Tree 23 24 writeTo(*strings.Builder) 25 } 26 27 // NodeTypeは、パースツリーノードのタイプを識別します。 28 type NodeType int 29 30 // Posは、このテンプレートがパースされた元の入力テキストのバイト位置を表します。 31 type Pos int 32 33 func (p Pos) Position() Pos 34 35 // Typeは自身を返し、Nodeに埋め込むための簡単なデフォルト実装を提供します。 36 // すべての非自明なノードに埋め込まれています。 37 func (t NodeType) Type() NodeType 38 39 const ( 40 NodeText NodeType = iota 41 NodeAction 42 NodeBool 43 NodeChain 44 NodeCommand 45 NodeDot 46 47 NodeField 48 NodeIdentifier 49 NodeIf 50 NodeList 51 NodeNil 52 NodeNumber 53 NodePipe 54 NodeRange 55 NodeString 56 NodeTemplate 57 NodeVariable 58 NodeWith 59 NodeComment 60 NodeBreak 61 NodeContinue 62 ) 63 64 // ListNodeは、ノードのシーケンスを保持します。 65 type ListNode struct { 66 NodeType 67 Pos 68 tr *Tree 69 Nodes []Node 70 } 71 72 func (l *ListNode) String() string 73 74 func (l *ListNode) CopyList() *ListNode 75 76 func (l *ListNode) Copy() Node 77 78 // TextNodeはプレーンテキストを保持します。 79 type TextNode struct { 80 NodeType 81 Pos 82 tr *Tree 83 Text []byte 84 } 85 86 func (t *TextNode) String() string 87 88 func (t *TextNode) Copy() Node 89 90 // CommentNode holds a comment. 91 type CommentNode struct { 92 NodeType 93 Pos 94 tr *Tree 95 Text string 96 } 97 98 func (c *CommentNode) String() string 99 100 func (c *CommentNode) Copy() Node 101 102 // PipeNodeは、オプションの宣言を持つパイプラインを保持します。 103 type PipeNode struct { 104 NodeType 105 Pos 106 tr *Tree 107 Line int 108 IsAssign bool 109 Decl []*VariableNode 110 Cmds []*CommandNode 111 } 112 113 func (p *PipeNode) String() string 114 115 func (p *PipeNode) CopyPipe() *PipeNode 116 117 func (p *PipeNode) Copy() Node 118 119 // ActionNodeはアクション(デリミタで区切られた何か)を保持します。 120 // 制御アクションはそれぞれが独自のノードを持ち、ActionNodeはフィールド評価や 121 // 括弧付きパイプラインのような単純なものを表します。 122 type ActionNode struct { 123 NodeType 124 Pos 125 tr *Tree 126 Line int 127 Pipe *PipeNode 128 } 129 130 func (a *ActionNode) String() string 131 132 func (a *ActionNode) Copy() Node 133 134 // CommandNodeは、コマンド(評価アクション内のパイプライン)を保持します。 135 type CommandNode struct { 136 NodeType 137 Pos 138 tr *Tree 139 Args []Node 140 } 141 142 func (c *CommandNode) String() string 143 144 func (c *CommandNode) Copy() Node 145 146 // CommandNodeは、コマンド(評価アクション内のパイプライン)を保持します。 147 type IdentifierNode struct { 148 NodeType 149 Pos 150 tr *Tree 151 Ident string 152 } 153 154 // NewIdentifierは、指定された識別子名を持つ新しい [IdentifierNode] を返します。 155 func NewIdentifier(ident string) *IdentifierNode 156 157 // SetPosは位置を設定します。[NewIdentifier] は公開メソッドなので、そのシグネチャを変更することはできません。 158 // 便宜上チェーン化されています。 159 // TODO: いつか修正する? 160 func (i *IdentifierNode) SetPos(pos Pos) *IdentifierNode 161 162 // SetTreeは、ノードの親ツリーを設定します。[NewIdentifier] は公開メソッドなので、そのシグネチャを変更することはできません。 163 // 便宜上チェーン化されています。 164 // TODO: いつか修正する? 165 func (i *IdentifierNode) SetTree(t *Tree) *IdentifierNode 166 167 func (i *IdentifierNode) String() string 168 169 func (i *IdentifierNode) Copy() Node 170 171 // VariableNodeは、チェーンフィールドへのアクセスが可能な変数名のリストを保持します。 172 // ドル記号は(最初の)名前の一部です。 173 type VariableNode struct { 174 NodeType 175 Pos 176 tr *Tree 177 Ident []string 178 } 179 180 func (v *VariableNode) String() string 181 182 func (v *VariableNode) Copy() Node 183 184 // DotNodeは、特別な識別子'.'を保持します。 185 type DotNode struct { 186 NodeType 187 Pos 188 tr *Tree 189 } 190 191 func (d *DotNode) Type() NodeType 192 193 func (d *DotNode) String() string 194 195 func (d *DotNode) Copy() Node 196 197 // NilNodeは、型指定されていないnil定数を表す特別な識別子'nil'を保持します。 198 type NilNode struct { 199 NodeType 200 Pos 201 tr *Tree 202 } 203 204 func (n *NilNode) Type() NodeType 205 206 func (n *NilNode) String() string 207 208 func (n *NilNode) Copy() Node 209 210 // FieldNodeはフィールド('.'で始まる識別子)を保持します。 211 // 名前はチェーン可能です('.x.y'など)。 212 // 各識別子からピリオドは削除されます。 213 type FieldNode struct { 214 NodeType 215 Pos 216 tr *Tree 217 Ident []string 218 } 219 220 func (f *FieldNode) String() string 221 222 func (f *FieldNode) Copy() Node 223 224 // ChainNodeは、フィールドアクセスのチェーン('.'で始まる識別子)に続く項を保持します。 225 // 名前はチェーン可能です('.x.y'など)。 226 // 各識別子からピリオドは削除されます。 227 type ChainNode struct { 228 NodeType 229 Pos 230 tr *Tree 231 Node Node 232 Field []string 233 } 234 235 // Addは、名前付きフィールド(ピリオドで始まるべき)をチェーンの末尾に追加します。 236 func (c *ChainNode) Add(field string) 237 238 func (c *ChainNode) String() string 239 240 func (c *ChainNode) Copy() Node 241 242 // BoolNodeは、ブール型の定数を保持します。 243 type BoolNode struct { 244 NodeType 245 Pos 246 tr *Tree 247 True bool 248 } 249 250 func (b *BoolNode) String() string 251 252 func (b *BoolNode) Copy() Node 253 254 // NumberNodeは、符号付きまたは符号なしの整数、浮動小数点数、または複素数を保持します。 255 // 値は解析され、その値を表現できるすべての型の下に格納されます。 256 // これはGoの理想的な定数の振る舞いを少量のコードでシミュレートします。 257 type NumberNode struct { 258 NodeType 259 Pos 260 tr *Tree 261 IsInt bool 262 IsUint bool 263 IsFloat bool 264 IsComplex bool 265 Int64 int64 266 Uint64 uint64 267 Float64 float64 268 Complex128 complex128 269 Text string 270 } 271 272 func (n *NumberNode) String() string 273 274 func (n *NumberNode) Copy() Node 275 276 // StringNodeは文字列定数を保持します。値は"引用符を外され"ています。 277 type StringNode struct { 278 NodeType 279 Pos 280 tr *Tree 281 Quoted string 282 Text string 283 } 284 285 func (s *StringNode) String() string 286 287 func (s *StringNode) Copy() Node 288 289 // BranchNodeは、if、range、およびwithの共通の表現です。 290 type BranchNode struct { 291 NodeType 292 Pos 293 tr *Tree 294 Line int 295 Pipe *PipeNode 296 List *ListNode 297 ElseList *ListNode 298 } 299 300 func (b *BranchNode) String() string 301 302 func (b *BranchNode) Copy() Node 303 304 // IfNodeは{{if}}アクションとそのコマンドを表します。 305 type IfNode struct { 306 BranchNode 307 } 308 309 func (i *IfNode) Copy() Node 310 311 // BreakNodeは{{break}}アクションを表します。 312 type BreakNode struct { 313 tr *Tree 314 NodeType 315 Pos 316 Line int 317 } 318 319 func (b *BreakNode) Copy() Node 320 func (b *BreakNode) String() string 321 322 // ContinueNodeは{{continue}}アクションを表します。 323 type ContinueNode struct { 324 tr *Tree 325 NodeType 326 Pos 327 Line int 328 } 329 330 func (c *ContinueNode) Copy() Node 331 func (c *ContinueNode) String() string 332 333 // RangeNodeは{{range}}アクションとそのコマンドを表します。 334 type RangeNode struct { 335 BranchNode 336 } 337 338 func (r *RangeNode) Copy() Node 339 340 // WithNodeは{{with}}アクションとそのコマンドを表します。 341 type WithNode struct { 342 BranchNode 343 } 344 345 func (w *WithNode) Copy() Node 346 347 // TemplateNodeは{{template}}アクションを表します。 348 type TemplateNode struct { 349 NodeType 350 Pos 351 tr *Tree 352 Line int 353 Name string 354 Pipe *PipeNode 355 } 356 357 func (t *TemplateNode) String() string 358 359 func (t *TemplateNode) Copy() Node