Go to the documentation of this file.00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00029 class DoctypeDeclaration
00030 {
00031 const SPACER_MASK = '[ \r\n\t]';
00032 const ID_FIRST_CHAR_MASK = '[A-Za-z]';
00033 const ID_CHAR_MASK = '[-_:.A-Za-z0-9]';
00034
00035 protected $fpi = null;
00036
00037 private $rootElement = null;
00038
00039 private $inline = false;
00040 private $declarations = null;
00041
00042 private $public = false;
00043
00044 private $uri = null;
00045
00049 public static function create()
00050 {
00051 return new self;
00052 }
00053
00057 public function setRootElement($rootElement)
00058 {
00059 $this->rootElement = $rootElement;
00060
00061 return $this;
00062 }
00063
00064 public function getRootElement()
00065 {
00066 return $this->rootElement;
00067 }
00068
00072 public function setInline($isInline)
00073 {
00074 Assert::isBoolean($isInline);
00075
00076 $this->inline = $isInline;
00077 $this->public = false;
00078
00079 return $this;
00080 }
00081
00082 public function isInline()
00083 {
00084 return $this->inline;
00085 }
00086
00090 public function setPublic($isPublic)
00091 {
00092 Assert::isBoolean($isPublic);
00093
00094 $this->public = $isPublic;
00095 $this->inline = false;
00096
00097 return $this;
00098 }
00099
00100 public function isPublic()
00101 {
00102 return $this->public;
00103 }
00104
00105 public function isSystem()
00106 {
00107 return !$this->public;
00108 }
00109
00113 public function setDeclarations($declarations)
00114 {
00115 $this->declarations = $declarations;
00116
00117 return $this;
00118 }
00119
00120 public function getDeclarations()
00121 {
00122 return $this->declarations;
00123 }
00124
00128 public function setFpi($fpi)
00129 {
00130 $this->fpi = $fpi;
00131
00132 return $this;
00133 }
00134
00135 public function getFpi()
00136 {
00137 return $this->fpi;
00138 }
00139
00143 public function setUri($uri)
00144 {
00145 $this->uri = $uri;
00146
00147 return $this;
00148 }
00149
00150 public function getUri()
00151 {
00152 return $this->uri;
00153 }
00154
00160 public function parse($string)
00161 {
00162 $matches = array();
00163
00164 if (
00165 !preg_match(
00166 '~^('.self::ID_FIRST_CHAR_MASK.self::ID_CHAR_MASK.'*)'
00167 .self::SPACER_MASK.'+(.*)$~s',
00168 $string, $matches
00169 )
00170 ) {
00171 return null;
00172 }
00173
00174 $this->rootElement = $matches[1];
00175 $remainigString = $matches[2];
00176
00177 if (
00178 preg_match(
00179 '~^PUBLIC'.self::SPACER_MASK.'+"(.+?)"'
00180 .'('.self::SPACER_MASK.'*"(.+)")?$~is',
00181 $remainigString, $matches
00182 )
00183 ) {
00184 $this->public = true;
00185
00186 $this->inline = false;
00187 $this->declarations = null;
00188
00189 $this->setFpi($matches[1]);
00190
00191 if (isset($matches[3]))
00192 $this->uri = $matches[3];
00193
00194 } elseif (
00195 preg_match(
00196 '~^SYSTEM'.self::SPACER_MASK.'+"(.+?)"$~is',
00197 $remainigString, $matches
00198 )
00199 ) {
00200 $this->public = false;
00201
00202 $this->inline = false;
00203 $this->declarations = null;
00204
00205 $this->setFpi(null);
00206 $this->uri = $matches[1];
00207
00208 } else {
00209 $this->public = false;
00210
00211 $this->inline = true;
00212 $this->declarations = $remainigString;
00213
00214 $this->setFpi(null);
00215 $this->uri = null;
00216 }
00217
00218 return $this;
00219 }
00220
00221 public function toString()
00222 {
00223 if ($this->inline)
00224 return $this->rootElement.' '.$this->declarations;
00225
00226 elseif ($this->public)
00227 return
00228 $this->rootElement.' PUBLIC "'.$this->getFpi().'"'
00229 .(
00230 $this->uri
00231 ? ' "'.$this->uri.'"'
00232 : null
00233 );
00234 else
00235 return
00236 $this->rootElement.' SYSTEM "'.$this->getFpi().'"';
00237 }
00238 }
00239 ?>