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: use Peach\Util\Values;
30:
31: /**
32: * HTML や XML などを出力する際に使う, デフォルトの Builder です.
33: * このクラスは, 以下の条件をカスタマイズすることが出来ます.
34: *
35: * - インデントの文字列 (半角スペース, タブ文字)
36: * - 改行コードの種類 (LF, CRLF, CR)
37: * - 空要素タグや boolean 属性の出力方法 (SGML, XML)
38: */
39: class DefaultBuilder extends Builder
40: {
41: /**
42: * DefaultContext のコンストラクタに渡される Indent オブジェクトです.
43: * @var Indent
44: */
45: private $indent;
46:
47: /**
48: * DefaultContext のコンストラクタに渡される Renderer オブジェクトです.
49: * @var Renderer
50: */
51: private $renderer;
52:
53: /**
54: * DefaultContext のコンストラクタに渡される BreakControl オブジェクトです.
55: * @var BreakControl
56: */
57: private $breakControl;
58:
59: /**
60: * デフォルトの設定を持つ DefaultBuilder インスタンスを生成します.
61: */
62: public function __construct()
63: {
64: $this->indent = null;
65: $this->renderer = null;
66: $this->breakControl = null;
67: }
68:
69: /**
70: * この Builder にセットされている Indent オブジェクトを返します.
71: * もしも Indent オブジェクトがセットされていない場合は null を返します.
72: *
73: * @return Indent Indent オブジェクト (セットされていない場合は null)
74: */
75: public function getIndent()
76: {
77: return $this->indent;
78: }
79:
80: /**
81: * この Builder に指定された Indent オブジェクトをセットします.
82: * null を指定した場合は設定を解除します.
83: *
84: * @param Indent $indent セットする Indent オブジェクト
85: */
86: public function setIndent(Indent $indent = null)
87: {
88: $this->indent = $indent;
89: }
90:
91: /**
92: * この Builder にセットされている Renderer オブジェクトを返します.
93: * もしも Renderer オブジェクトがセットされていない場合は null を返します.
94: *
95: * @return Renderer Renderer オブジェクト (セットされていない場合は null)
96: */
97: public function getRenderer()
98: {
99: return $this->renderer;
100: }
101:
102: /**
103: * この Builder に指定された Renderer オブジェクトをセットします.
104: * 引数によって以下のように動作します.
105: *
106: * - Renderer オブジェクトを指定した場合: そのオブジェクトをセットします
107: * - 文字列 "xml" または "xhtml" を指定した場合 (大小問わず) : {@link XmlRenderer} オブジェクトをセットします
108: * - 文字列 "sgml" または "html" を指定した場合 (大小問わず) : {@link SgmlRenderer} オブジェクトをセットします
109: * - null を指定した場合 : 現在セットされている Renderer を解除します
110: * - それ以外: InvalidArgumentException をスローします
111: *
112: * @param Renderer|string $renderer セットする Renderer または対応する文字列
113: * @throws \InvalidArgumentException 不正な引数をセットした場合
114: */
115: public function setRenderer($renderer = null)
116: {
117: $this->renderer = $this->initRenderer($renderer);
118: }
119:
120: /**
121: * 指定された引数で Renderer オブジェクトを初期化します.
122: *
123: * @see Renderer::setRenderer()
124: * @param Renderer|string $var
125: * @return Renderer
126: * @throws \InvalidArgumentException
127: */
128: private function initRenderer($var)
129: {
130: if ($var instanceof Renderer) {
131: return $var;
132: }
133: if ($var === null) {
134: return null;
135: }
136:
137: $type = strtolower(Values::stringValue($var));
138: $xmlList = array("xml", "xhtml");
139: if (in_array($type, $xmlList)) {
140: return XmlRenderer::getInstance();
141: }
142: $sgmlList = array("sgml", "html");
143: if (in_array($type, $sgmlList)) {
144: return SgmlRenderer::getInstance();
145: }
146:
147: throw new \InvalidArgumentException("Invalid type name: {$type}.");
148: }
149:
150: /**
151: * この Builder にセットされている BreakControl オブジェクトを返します.
152: * もしも BreakControl オブジェクトがセットされていない場合は null を返します.
153: *
154: * @return BreakControl BreakControl オブジェクト (セットされていない場合は null)
155: */
156: public function getBreakControl()
157: {
158: return $this->breakControl;
159: }
160:
161: /**
162: * この Builder に指定された BreakControl をセットします.
163: * null を指定した場合は設定を解除します.
164: *
165: * @param BreakControl $breakControl セットする BreakControl
166: */
167: public function setBreakControl(BreakControl $breakControl = null)
168: {
169: $this->breakControl = $breakControl;
170: }
171:
172: /**
173: * この Builder にセットされている Indent, Renderer, BreakControl
174: * を使って新しい DefaultContext を生成します.
175: *
176: * @return DefaultContext 新しい DefaultContext
177: */
178: protected function createContext()
179: {
180: $indent = isset($this->indent) ? clone($this->indent) : new Indent();
181: $renderer = isset($this->renderer) ? $this->renderer : XmlRenderer::getInstance();
182: $breakControl = isset($this->breakControl) ? $this->breakControl : DefaultBreakControl::getInstance();
183: return new DefaultContext($renderer, $indent, $breakControl);
184: }
185: }
186: