[ Index ]

PHP Cross Reference of phpBB-3.3.14-deutsch

title

Body

[close]

/vendor/s9e/text-formatter/src/Plugins/HTMLElements/ -> Parser.php (source)

   1  <?php
   2  
   3  /**
   4  * @package   s9e\TextFormatter
   5  * @copyright Copyright (c) 2010-2022 The s9e authors
   6  * @license   http://www.opensource.org/licenses/mit-license.php The MIT License
   7  */
   8  namespace s9e\TextFormatter\Plugins\HTMLElements;
   9  
  10  use s9e\TextFormatter\Parser\Tag;
  11  use s9e\TextFormatter\Plugins\ParserBase;
  12  
  13  class Parser extends ParserBase
  14  {
  15      /**
  16      * {@inheritdoc}
  17      */
  18  	public function parse($text, array $matches)
  19      {
  20          foreach ($matches as $m)
  21          {
  22              // Test whether this is an end tag
  23              $isEnd = (bool) ($text[$m[0][1] + 1] === '/');
  24  
  25              $pos    = $m[0][1];
  26              $len    = strlen($m[0][0]);
  27              $elName = strtolower($m[2 - $isEnd][0]);
  28  
  29              // Use the element's alias if applicable, or the  name of the element (with the
  30              // configured prefix) otherwise
  31              $tagName = (isset($this->config['aliases'][$elName]['']))
  32                       ? $this->config['aliases'][$elName]['']
  33                       : $this->config['prefix'] . ':' . $elName;
  34  
  35              if ($isEnd)
  36              {
  37                  $this->parser->addEndTag($tagName, $pos, $len);
  38                  continue;
  39              }
  40  
  41              // Test whether it's a self-closing tag or a start tag.
  42              //
  43              // A self-closing tag will become one start tag consuming all of the text followed by a
  44              // 0-width end tag. Alternatively, it could be replaced by a pair of 0-width tags plus
  45              // an ignore tag to prevent the text in between from being output
  46              $tag = (preg_match('/(<\\S+|[\'"\\s])\\/>$/', $m[0][0]))
  47                   ? $this->parser->addTagPair($tagName, $pos, $len, $pos + $len, 0)
  48                   : $this->parser->addStartTag($tagName, $pos, $len);
  49  
  50              $this->captureAttributes($tag, $elName, $m[3][0]);
  51          }
  52      }
  53  
  54      /**
  55      * Capture all attributes in given string
  56      *
  57      * @param  Tag    $tag    Target tag
  58      * @param  string $elName Name of the HTML element
  59      * @param  string $str    String containing the attribute declarations
  60      * @return void
  61      */
  62  	protected function captureAttributes(Tag $tag, $elName, $str)
  63      {
  64          $regexp = '/([a-z][-a-z0-9]*)(?>\\s*=\\s*("[^"]*"|\'[^\']*\'|[^\\s"\'=<>`]+))?/i';
  65          preg_match_all($regexp, $str, $matches, PREG_SET_ORDER);
  66  
  67          foreach ($matches as $m)
  68          {
  69              /**
  70              * If there's no value, it's a boolean attribute and we generate a value equal
  71              * to the attribute's name, lowercased
  72              *
  73              * @link http://www.w3.org/html/wg/drafts/html/master/single-page.html#boolean-attributes
  74              */
  75              $attrName  = strtolower($m[1]);
  76              $attrValue = $m[2] ?? $attrName;
  77  
  78              // Use the attribute's alias if applicable
  79              if (isset($this->config['aliases'][$elName][$attrName]))
  80              {
  81                  $attrName = $this->config['aliases'][$elName][$attrName];
  82              }
  83  
  84              // Remove quotes around the value
  85              if ($attrValue[0] === '"' || $attrValue[0] === "'")
  86              {
  87                  $attrValue = substr($attrValue, 1, -1);
  88              }
  89  
  90              $tag->setAttribute($attrName, html_entity_decode($attrValue, ENT_QUOTES, 'UTF-8'));
  91          }
  92      }
  93  }


Generated: Mon Nov 25 19:05:08 2024 Cross-referenced by PHPXref 0.7.1