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