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: */
33: class Indent
34: {
35: /**
36: * 半角スペース 4 個です.
37: * @var string
38: */
39: const SPACE4 = " ";
40:
41: /**
42: * タブ文字です.
43: * @var string
44: */
45: const TAB = "\t";
46:
47: /**
48: * 改行コード CR です.
49: * @var string
50: */
51: const CR = "\r";
52:
53: /**
54: * 改行コード LF です.
55: * @var string
56: */
57: const LF = "\n";
58:
59: /**
60: * 改行コード CRLF です.
61: * @var string
62: */
63: const CRLF = "\r\n";
64:
65: /**
66: * 現在のインデントレベルです.
67: * @var int
68: */
69: private $level;
70:
71: /**
72: * インデント一つ分の文字列です.
73: * @var string
74: */
75: private $unit;
76:
77: /**
78: * 改行コードです.
79: * @var string
80: */
81: private $breakCode;
82:
83: /**
84: * 新しい Indent オブジェクトを構築します.
85: *
86: * @param int $level インデントレベルの初期値です. デフォルトは 0 です. レベルは 0 未満でも構いません.
87: * @param string $unit インデント一つ分の文字列です. デフォルトは半角スペース 4 個です.
88: * @param string $breakCode 改行コードです. デフォルトは CRLF です.
89: */
90: public function __construct($level = 0, $unit = self::SPACE4, $breakCode = self::CRLF)
91: {
92: $this->level = $level;
93: $this->unit = $unit;
94: $this->breakCode = $breakCode;
95: }
96:
97: /**
98: * インデント文字列を構築します.
99: * @param int $level
100: * @return string
101: */
102: private function handleIndent($level)
103: {
104: return ($level < 1) ? "" : $this->handleIndent($level - 1) . $this->unit;
105: }
106:
107: /**
108: * 現在のインデントレベルを返します.
109: * @return int インデントレベル
110: */
111: public function getLevel()
112: {
113: return $this->level;
114: }
115:
116: /**
117: * インデント一つ分の文字列です.
118: * @return string インデント一つ分の文字列
119: */
120: public function getUnit()
121: {
122: return $this->unit;
123: }
124:
125: /**
126: * 現在のレベルでインデントします.
127: * インデントレベルが 0 以下の場合は空文字列を返します.
128: * @return string 現在のレベルのインデント文字列
129: */
130: public function indent()
131: {
132: return $this->handleIndent($this->level);
133: }
134:
135: /**
136: * 改行コードを返します.
137: * @return string 改行コード ("\n" や "\r\n" など)
138: */
139: public function breakCode()
140: {
141: return $this->breakCode;
142: }
143:
144: /**
145: * インデントレベルを一つ上げます.
146: * 改行コードを返します.
147: * @return string 改行コード
148: */
149: public function stepUp()
150: {
151: $this->level ++;
152: return $this->breakCode;
153: }
154:
155: /**
156: * インデントレベルを一つ下げます.
157: * 新しいレベルのインデント文字列を返します.
158: *
159: * @return string 現在の一つ下のレベルのインデント文字列
160: */
161: public function stepDown()
162: {
163: $this->level --;
164: return $this->indent($this->level);
165: }
166: }
167: