[ Index ] |
PHP Cross Reference of phpBB-3.3.2-deutsch |
[Summary view] [Print] [Text view]
1 <?php declare(strict_types=1); 2 3 /** 4 * @package s9e\SweetDOM 5 * @copyright Copyright (c) 2019-2020 The s9e authors 6 * @license http://www.opensource.org/licenses/mit-license.php The MIT License 7 */ 8 namespace s9e\SweetDOM; 9 10 use BadMethodCallException; 11 use DOMElement; 12 use DOMNode; 13 use DOMNodeList; 14 use InvalidArgumentException; 15 16 /** 17 * @method self appendXslApplyTemplates(string $select = null) 18 * @method self appendXslApplyTemplatesSibling(string $select = null) 19 * @method self appendXslAttribute(string $name, string $text = '') 20 * @method self appendXslAttributeSibling(string $name, string $text = '') 21 * @method self appendXslChoose() 22 * @method self appendXslChooseSibling() 23 * @method self appendXslComment(string $text = '') 24 * @method self appendXslCommentSibling(string $text = '') 25 * @method self appendXslCopyOf(string $select) 26 * @method self appendXslCopyOfSibling(string $select) 27 * @method self appendXslIf(string $test, string $text = '') 28 * @method self appendXslIfSibling(string $test, string $text = '') 29 * @method self appendXslOtherwise(string $text = '') 30 * @method self appendXslOtherwiseSibling(string $text = '') 31 * @method self appendXslText(string $text = '') 32 * @method self appendXslTextSibling(string $text = '') 33 * @method self appendXslValueOf(string $select) 34 * @method self appendXslValueOfSibling(string $select) 35 * @method self appendXslVariable(string $name, string $select = null) 36 * @method self appendXslVariableSibling(string $name, string $select = null) 37 * @method self appendXslWhen(string $test, string $text = '') 38 * @method self appendXslWhenSibling(string $test, string $text = '') 39 * @method self prependXslApplyTemplates(string $select = null) 40 * @method self prependXslApplyTemplatesSibling(string $select = null) 41 * @method self prependXslAttribute(string $name, string $text = '') 42 * @method self prependXslAttributeSibling(string $name, string $text = '') 43 * @method self prependXslChoose() 44 * @method self prependXslChooseSibling() 45 * @method self prependXslComment(string $text = '') 46 * @method self prependXslCommentSibling(string $text = '') 47 * @method self prependXslCopyOf(string $select) 48 * @method self prependXslCopyOfSibling(string $select) 49 * @method self prependXslIf(string $test, string $text = '') 50 * @method self prependXslIfSibling(string $test, string $text = '') 51 * @method self prependXslOtherwise(string $text = '') 52 * @method self prependXslOtherwiseSibling(string $text = '') 53 * @method self prependXslText(string $text = '') 54 * @method self prependXslTextSibling(string $text = '') 55 * @method self prependXslValueOf(string $select) 56 * @method self prependXslValueOfSibling(string $select) 57 * @method self prependXslVariable(string $name, string $select = null) 58 * @method self prependXslVariableSibling(string $name, string $select = null) 59 * @method self prependXslWhen(string $test, string $text = '') 60 * @method self prependXslWhenSibling(string $test, string $text = '') 61 */ 62 class Element extends DOMElement 63 { 64 public function __call(string $name, array $arguments) 65 { 66 if (preg_match('(^(append|prepend)(xsl\\w+?)(sibling|)$)', strtolower($name), $m)) 67 { 68 $callback = [$this->ownerDocument, 'create' . $m[2]]; 69 if (is_callable($callback)) 70 { 71 $element = call_user_func_array($callback, $arguments); 72 $where = [ 73 'append' => 'beforeend', 74 'appendsibling' => 'afterend', 75 'prepend' => 'afterbegin', 76 'prependsibling' => 'beforebegin' 77 ]; 78 79 return $this->insertAdjacentElement($where[$m[1] . $m[3]], $element); 80 } 81 } 82 83 throw new BadMethodCallException; 84 } 85 86 /** 87 * Evaluate and return the result of a given XPath expression using this element as context node 88 * 89 * @param string $expr XPath expression 90 * @return mixed 91 */ 92 public function evaluate(string $expr) 93 { 94 return $this->ownerDocument->evaluate($expr, $this); 95 } 96 97 /** 98 * Evaluate and return the first element of a given XPath query using this element as context node 99 * 100 * @param string $expr XPath expression 101 * @return DOMNode|null 102 */ 103 public function firstOf(string $expr): ?DOMNode 104 { 105 return $this->ownerDocument->firstOf($expr, $this); 106 } 107 108 /** 109 * Insert given element relative to this element's position 110 * 111 * @param string $where One of 'beforebegin', 'afterbegin', 'beforeend', 'afterend' 112 * @param self $element 113 * @return self 114 */ 115 public function insertAdjacentElement(string $where, self $element): self 116 { 117 $this->insertAdjacentNode($where, $element); 118 119 return $element; 120 } 121 122 /** 123 * Insert given text relative to this element's position 124 * 125 * @param string $where One of 'beforebegin', 'afterbegin', 'beforeend', 'afterend' 126 * @param string $text 127 * @return void 128 */ 129 public function insertAdjacentText(string $where, string $text): void 130 { 131 $this->insertAdjacentXML($where, htmlspecialchars($text, ENT_XML1)); 132 } 133 134 /** 135 * Insert given XML relative to this element's position 136 * 137 * @param string $where One of 'beforebegin', 'afterbegin', 'beforeend', 'afterend' 138 * @param string $xml 139 * @return void 140 */ 141 public function insertAdjacentXML(string $where, string $xml): void 142 { 143 $fragment = $this->ownerDocument->createDocumentFragment(); 144 $fragment->appendXML($this->addMissingNamespaceDeclarations($xml)); 145 146 $this->insertAdjacentNode($where, $fragment); 147 } 148 149 /** 150 * Evaluate and return the result of a given XPath query using this element as context node 151 * 152 * @param string $expr XPath expression 153 * @return DOMNodeList 154 */ 155 public function query(string $expr): DOMNodeList 156 { 157 return $this->ownerDocument->query($expr, $this); 158 } 159 160 /** 161 * Remove this element from the document 162 * 163 * @return self This element 164 */ 165 public function remove(): self 166 { 167 return $this->parentNode->removeChild($this); 168 } 169 170 /** 171 * Replace this element with given element 172 * 173 * @param self $element Replacement element 174 * @return self This element 175 */ 176 public function replace(self $element): self 177 { 178 return $this->parentNode->replaceChild($element, $this); 179 } 180 181 /** 182 * Add namespace declarations that may be missing in given XML 183 * 184 * @param string $xml Original XML 185 * @return string Modified XML 186 */ 187 protected function addMissingNamespaceDeclarations(string $xml): string 188 { 189 preg_match_all('(xmlns:\\K[-\\w]++(?==))', $xml, $m); 190 $prefixes = array_flip($m[0]); 191 192 return preg_replace_callback( 193 '(<([-\\w]++):[^>]*?\\K\\s*/?>)', 194 function ($m) use ($prefixes) 195 { 196 $return = $m[0]; 197 $prefix = $m[1]; 198 if (!isset($prefixes[$prefix])) 199 { 200 $nsURI = $this->lookupNamespaceURI($prefix); 201 $return = ' xmlns:' . $prefix . '="' . htmlspecialchars($nsURI, ENT_XML1) . '"' . $return; 202 } 203 204 return $return; 205 }, 206 $xml 207 ); 208 } 209 210 /** 211 * Insert given node relative to this element's position 212 * 213 * @param string $where One of 'beforebegin', 'afterbegin', 'beforeend', 'afterend' 214 * @param DOMNode $node 215 * @return void 216 */ 217 protected function insertAdjacentNode(string $where, DOMNode $node): void 218 { 219 $where = strtolower($where); 220 if ($where === 'beforebegin') 221 { 222 $this->parentNode->insertBefore($node, $this); 223 } 224 elseif ($where === 'beforeend') 225 { 226 $this->appendChild($node); 227 } 228 elseif ($where === 'afterend') 229 { 230 $this->parentNode->insertBefore($node, $this->nextSibling); 231 } 232 elseif ($where === 'afterbegin') 233 { 234 $this->insertBefore($node, $this->firstChild); 235 } 236 else 237 { 238 throw new InvalidArgumentException; 239 } 240 } 241 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Nov 11 20:28:18 2020 | Cross-referenced by PHPXref 0.7.1 |