1: <?php
2: /*
3: * Copyright (c) 2014 @trashtoy
4: * https://github.com/trashtoy/
5: *
6: * Permission is hereby granted, free of charge, to any person obtaining a copy of
7: * this software and associated documentation files (the "Software"), to deal in
8: * the Software without restriction, including without limitation the rights to use,
9: * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
10: * Software, and to permit persons to whom the Software is furnished to do so,
11: * subject to the following conditions:
12: *
13: * The above copyright notice and this permission notice shall be included in all
14: * copies or substantial portions of the Software.
15: *
16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18: * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
19: * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
20: * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21: * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22: */
23: /**
24: * PHP class file.
25: * @auhtor trashtoy
26: * @since 2.0.0
27: */
28: namespace Peach\Markup;
29:
30: /**
31: * 内部に子ノードを含めることができる要素です.
32: * 子ノードが存在しない場合は "<tag></tag>" のように書式化されます.
33: *
34: * HTML の SCRIPT 要素などはこのクラスを使って表現します.
35: */
36: class ContainerElement extends Element implements Container
37: {
38: /**
39: * この要素に登録されている子ノードの一覧です.
40: * @var NodeList
41: */
42: private $childNodes;
43:
44: /**
45: * 指定された要素名を持つコンテナ要素を構築します.
46: *
47: * @param string $name 要素名
48: */
49: public function __construct($name)
50: {
51: parent::__construct($name);
52: $this->childNodes = new NodeList(null, $this);
53: }
54:
55: /**
56: * この要素に子ノードを追加します.
57: *
58: * @param mixed $var 追加する値
59: * @throws \InvalidArgumentException 指定されたノードの中にこのノードが存在している場合
60: */
61: public function appendNode($var)
62: {
63: $this->childNodes->appendNode($var);
64: }
65:
66: /**
67: * すべての子ノードを配列で返します.
68: * @return array Node の配列
69: */
70: public function getChildNodes()
71: {
72: return $this->childNodes->getChildNodes();
73: }
74:
75: /**
76: * 指定された Context にこのノードを処理させます.
77: * {@link Context::handleContainerElement()} を呼び出します.
78: * @param Context $context このノードを処理する Context
79: */
80: public function accept(Context $context)
81: {
82: $context->handleContainerElement($this);
83: }
84:
85: /**
86: * この要素が持つ子要素の個数を返します.
87: * @return int 子要素の個数
88: */
89: public function size()
90: {
91: return $this->childNodes->size();
92: }
93: }
94: