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: * 汎用的な Helper オブジェクトです.
32: * コンストラクタ引数に指定された Builder および空要素タグ一覧をもとにノードの生成・出力を行います.
33: *
34: * このクラスのインスタンスは, AbstractHelper の各派生クラスにおいて親の
35: * Helper オブジェクトとして使用されることを想定しています.
36: */
37: class BaseHelper implements Helper
38: {
39: /**
40: * 出力の際に使用される Builder です
41: * @var Builder
42: */
43: private $builder;
44:
45: /**
46: * 空要素として扱われる要素名の一覧です
47: * @var array
48: */
49: private $emptyNodeNames;
50:
51: /**
52: * 指定された Builder を使ってマークアップを行う, 新しい Helper インスタンスを生成します.
53: * 第二引数で, 空要素として扱われる要素名の一覧を指定することができます.
54: * @param Builder $builder マークアップに利用する Builder
55: * @param array $emptyNodeNames 空要素の要素名一覧
56: */
57: public function __construct(Builder $builder, array $emptyNodeNames = array())
58: {
59: $this->builder = $builder;
60: $this->emptyNodeNames = $emptyNodeNames;
61: }
62:
63: /**
64: * 新しい HelperObject を生成します.
65: * このメソッドが返す HelperObject は, 引数の型に応じて以下のように振る舞います.
66: *
67: * - 文字列の場合: その文字列を要素名に持つ {@link Element}
68: * - null または空文字列の場合: 空の {@link NodeList}
69: * - Node オブジェクトの場合: その Node 自身
70: *
71: * 第 2 引数に配列を指定した場合, 生成された要素に対して属性をセットすることが出来ます.
72: * (生成された HelperObject が要素ではない場合, 第 2 引数は無視されます)
73: *
74: * @param string|Component $var
75: * @param array $attr
76: * @return HelperObject
77: */
78: public function tag($var, $attr = array())
79: {
80: $object = new HelperObject($this, $var);
81: if (count($attr)) {
82: $object->attr($attr);
83: }
84: return $object;
85: }
86:
87: /**
88: * 指定された HelperObject の変換結果を返します.
89: * このヘルパーに設定されている Builder を使って, 引数の HelperObject を build した結果を返します.
90: * @param HelperObject $object
91: * @return mixed
92: */
93: public function write(HelperObject $object)
94: {
95: return $this->builder->build($object->getNode());
96: }
97:
98: /**
99: * この Helper にセットされている Builder オブジェクトを返します.
100: * 返り値の Builder に対する変更は, この Helper にも影響されます.
101: *
102: * @return Builder
103: */
104: public function getBuilder()
105: {
106: return $this->builder;
107: }
108:
109: /**
110: * この Helper にセットされている Builder を,
111: * 引数の Builder オブジェクトで上書きします.
112: *
113: * @param Builder $builder
114: */
115: public function setBuilder(Builder $builder)
116: {
117: $this->builder = $builder;
118: }
119:
120: /**
121: * 指定された要素名を持つ新しい Element オブジェクトを返します.
122: *
123: * @param string $name 要素名
124: * @return Element 指定された要素名を持つ Element
125: */
126: public function createElement($name)
127: {
128: return in_array($name, $this->emptyNodeNames) ?
129: new EmptyElement($name) : new ContainerElement($name);
130: }
131: }
132: