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: * このクラスは Visitor パターンにより設計されています (Visitor クラスに相当します).
33: * {@link Builder} クラスと連携して以下のように動作します.
34: *
35: * 1. エンドユーザーが Builder オブジェクトの {@link Builder::build()} メソッドを実行します
36: * 2. build() メソッドの内部で新しい Context オブジェクトが生成されます
37: * 3. Context オブジェクトの {@link Context::handle()} メソッドが呼び出され, build() の引数に指定されたノードを変換します
38: * 4. 変換結果を {@link Context::getResult()} から取り出し, build() メソッドの返り値として返します
39: */
40: abstract class Context
41: {
42: /**
43: * 指定されたオブジェクトを処理します.
44: * オブジェクトの種類に応じて, このクラスの具象クラスで定義された各 handle メソッドに処理が割り当てられます.
45: * Visitor パターンの visit メソッドに相当します.
46: *
47: * @param Component $c 処理対象の Component
48: */
49: public final function handle(Component $c)
50: {
51: $c->accept($this);
52: }
53:
54: /**
55: * 処理結果を取得します. まだ handle() が実行されていない場合は NULL を返します.
56: *
57: * @return mixed 処理結果
58: */
59: public abstract function getResult();
60:
61: /**
62: * コンテナ要素を処理します.
63: * @param ContainerElement $node 処理対象のコンテナ要素
64: */
65: public abstract function handleContainerElement(ContainerElement $node);
66:
67: /**
68: * 空要素を処理します.
69: * @param EmptyElement $node 処理対象の空要素
70: */
71: public abstract function handleEmptyElement(EmptyElement $node);
72:
73: /**
74: * テキストノードを処理します.
75: * @param Text $node 処理対象のテキスト
76: */
77: public abstract function handleText(Text $node);
78:
79: /**
80: * 整形済テキストを処理します.
81: * @param Code $node 処理対象の整形済テキスト
82: */
83: public abstract function handleCode(Code $node);
84:
85: /**
86: * コメントノードを処理します.
87: * @param Comment $node 処理対象のコメント
88: */
89: public abstract function handleComment(Comment $node);
90:
91: /**
92: * NodeList を処理します.
93: * @param NodeList $nodeList 処理対象の NodeList
94: */
95: public abstract function handleNodeList(NodeList $nodeList);
96:
97: /**
98: * None を処理します.
99: * @param None $none 処理対象の None オブジェクト
100: */
101: public abstract function handleNone(None $none);
102: }
103: