[ Index ] |
PHP Cross Reference of phpBB-3.2.11-deutsch |
[Summary view] [Print] [Text view]
1 <?php 2 3 /* 4 * @package s9e\TextFormatter 5 * @copyright Copyright (c) 2010-2019 The s9e Authors 6 * @license http://www.opensource.org/licenses/mit-license.php The MIT License 7 */ 8 namespace s9e\TextFormatter\Configurator\Helpers; 9 use DOMAttr; 10 use DOMDocument; 11 use DOMText; 12 use DOMXPath; 13 abstract class TemplateModifier 14 { 15 const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform'; 16 public static function replaceTokens($template, $regexp, $fn) 17 { 18 $dom = TemplateLoader::load($template); 19 $xpath = new DOMXPath($dom); 20 foreach ($xpath->query('//@*') as $attribute) 21 self::replaceTokensInAttribute($attribute, $regexp, $fn); 22 foreach ($xpath->query('//text()') as $node) 23 self::replaceTokensInText($node, $regexp, $fn); 24 return TemplateLoader::save($dom); 25 } 26 protected static function createReplacementNode(DOMDocument $dom, array $replacement) 27 { 28 if ($replacement[0] === 'expression') 29 { 30 $newNode = $dom->createElementNS(self::XMLNS_XSL, 'xsl:value-of'); 31 $newNode->setAttribute('select', $replacement[1]); 32 } 33 elseif ($replacement[0] === 'passthrough') 34 { 35 $newNode = $dom->createElementNS(self::XMLNS_XSL, 'xsl:apply-templates'); 36 if (isset($replacement[1])) 37 $newNode->setAttribute('select', $replacement[1]); 38 } 39 else 40 $newNode = $dom->createTextNode($replacement[1]); 41 return $newNode; 42 } 43 protected static function replaceTokensInAttribute(DOMAttr $attribute, $regexp, $fn) 44 { 45 $attrValue = \preg_replace_callback( 46 $regexp, 47 function ($m) use ($fn, $attribute) 48 { 49 $replacement = $fn($m, $attribute); 50 if ($replacement[0] === 'expression' || $replacement[0] === 'passthrough') 51 { 52 $replacement[] = '.'; 53 return '{' . $replacement[1] . '}'; 54 } 55 else 56 return $replacement[1]; 57 }, 58 $attribute->value 59 ); 60 $attribute->value = \htmlspecialchars($attrValue, \ENT_COMPAT, 'UTF-8'); 61 } 62 protected static function replaceTokensInText(DOMText $node, $regexp, $fn) 63 { 64 $parentNode = $node->parentNode; 65 $dom = $node->ownerDocument; 66 \preg_match_all($regexp, $node->textContent, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE); 67 $lastPos = 0; 68 foreach ($matches as $m) 69 { 70 $pos = $m[0][1]; 71 $text = \substr($node->textContent, $lastPos, $pos - $lastPos); 72 $parentNode->insertBefore($dom->createTextNode($text), $node); 73 $lastPos = $pos + \strlen($m[0][0]); 74 $_m=[];foreach($m as $v)$_m[]=$v[0];$replacement = $fn($_m, $node); 75 $newNode = self::createReplacementNode($dom, $replacement); 76 $parentNode->insertBefore($newNode, $node); 77 } 78 $text = \substr($node->textContent, $lastPos); 79 $parentNode->insertBefore($dom->createTextNode($text), $node); 80 $parentNode->removeChild($node); 81 } 82 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Nov 11 20:33:01 2020 | Cross-referenced by PHPXref 0.7.1 |