Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

bbcode.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 16.11 KiB


 001  <?php
 002  /**
 003  *
 004  * This file is part of the phpBB Forum Software package.
 005  *
 006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
 007  * @license GNU General Public License, version 2 (GPL-2.0)
 008  *
 009  * For full copyright and license information, please see
 010  * the docs/CREDITS.txt file.
 011  *
 012  */
 013   
 014  /**
 015  * @ignore
 016  */
 017  if (!defined('IN_PHPBB'))
 018  {
 019      exit;
 020  }
 021   
 022  /**
 023  * BBCode class
 024  */
 025  class bbcode
 026  {
 027      var $bbcode_uid = '';
 028      var $bbcode_bitfield = '';
 029      var $bbcode_cache = array();
 030      var $bbcode_template = array();
 031   
 032      var $bbcodes = array();
 033   
 034      var $template_bitfield;
 035   
 036      /**
 037      * Constructor
 038      * Init bbcode cache entries if bitfield is specified
 039      */
 040      function bbcode($bitfield = '')
 041      {
 042          if ($bitfield)
 043          {
 044              $this->bbcode_bitfield = $bitfield;
 045              $this->bbcode_cache_init();
 046          }
 047      }
 048   
 049      /**
 050      * Second pass bbcodes
 051      */
 052      function bbcode_second_pass(&$message, $bbcode_uid = '', $bbcode_bitfield = false)
 053      {
 054          if ($bbcode_uid)
 055          {
 056              $this->bbcode_uid = $bbcode_uid;
 057          }
 058   
 059          if ($bbcode_bitfield !== false)
 060          {
 061              $this->bbcode_bitfield = $bbcode_bitfield;
 062   
 063              // Init those added with a new bbcode_bitfield (already stored codes will not get parsed again)
 064              $this->bbcode_cache_init();
 065          }
 066   
 067          if (!$this->bbcode_bitfield)
 068          {
 069              // Remove the uid from tags that have not been transformed into HTML
 070              if ($this->bbcode_uid)
 071              {
 072                  $message = str_replace(':' . $this->bbcode_uid, '', $message);
 073              }
 074   
 075              return;
 076          }
 077   
 078          $str = array('search' => array(), 'replace' => array());
 079          $preg = array('search' => array(), 'replace' => array());
 080   
 081          $bitfield = new bitfield($this->bbcode_bitfield);
 082          $bbcodes_set = $bitfield->get_all_set();
 083   
 084          $undid_bbcode_specialchars = false;
 085          foreach ($bbcodes_set as $bbcode_id)
 086          {
 087              if (!empty($this->bbcode_cache[$bbcode_id]))
 088              {
 089                  foreach ($this->bbcode_cache[$bbcode_id] as $type => $array)
 090                  {
 091                      foreach ($array as $search => $replace)
 092                      {
 093                          ${$type}['search'][] = str_replace('$uid', $this->bbcode_uid, $search);
 094                          ${$type}['replace'][] = $replace;
 095                      }
 096   
 097                      if (sizeof($str['search']))
 098                      {
 099                          $message = str_replace($str['search'], $str['replace'], $message);
 100                          $str = array('search' => array(), 'replace' => array());
 101                      }
 102   
 103                      if (sizeof($preg['search']))
 104                      {
 105                          // we need to turn the entities back into their original form to allow the
 106                          // search patterns to work properly
 107                          if (!$undid_bbcode_specialchars)
 108                          {
 109                              $message = str_replace(array('&#58;', '&#46;'), array(':', '.'), $message);
 110                              $undid_bbcode_specialchars = true;
 111                          }
 112   
 113                          $message = preg_replace($preg['search'], $preg['replace'], $message);
 114                          $preg = array('search' => array(), 'replace' => array());
 115                      }
 116                  }
 117              }
 118          }
 119   
 120          // Remove the uid from tags that have not been transformed into HTML
 121          $message = str_replace(':' . $this->bbcode_uid, '', $message);
 122      }
 123   
 124      /**
 125      * Init bbcode cache
 126      *
 127      * requires: $this->bbcode_bitfield
 128      * sets: $this->bbcode_cache with bbcode templates needed for bbcode_bitfield
 129      */
 130      function bbcode_cache_init()
 131      {
 132          global $phpbb_root_path, $phpEx, $config, $user, $phpbb_extension_manager, $phpbb_path_helper;
 133   
 134          if (empty($this->template_filename))
 135          {
 136              $this->template_bitfield = new bitfield($user->style['bbcode_bitfield']);
 137   
 138              $template = new phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new phpbb\template\context(), $phpbb_extension_manager);
 139              $template->set_style();
 140              $template->set_filenames(array('bbcode.html' => 'bbcode.html'));
 141              $this->template_filename = $template->get_source_file_for_handle('bbcode.html');
 142          }
 143   
 144          $bbcode_ids = $rowset = $sql = array();
 145   
 146          $bitfield = new bitfield($this->bbcode_bitfield);
 147          $bbcodes_set = $bitfield->get_all_set();
 148   
 149          foreach ($bbcodes_set as $bbcode_id)
 150          {
 151              if (isset($this->bbcode_cache[$bbcode_id]))
 152              {
 153                  // do not try to re-cache it if it's already in
 154                  continue;
 155              }
 156              $bbcode_ids[] = $bbcode_id;
 157   
 158              if ($bbcode_id > NUM_CORE_BBCODES)
 159              {
 160                  $sql[] = $bbcode_id;
 161              }
 162          }
 163   
 164          if (sizeof($sql))
 165          {
 166              global $db;
 167   
 168              $sql = 'SELECT *
 169                  FROM ' . BBCODES_TABLE . '
 170                  WHERE ' . $db->sql_in_set('bbcode_id', $sql);
 171              $result = $db->sql_query($sql, 3600);
 172   
 173              while ($row = $db->sql_fetchrow($result))
 174              {
 175                  // To circumvent replacing newlines with <br /> for the generated html,
 176                  // we use carriage returns here. They are later changed back to newlines
 177                  $row['bbcode_tpl'] = str_replace("\n", "\r", $row['bbcode_tpl']);
 178                  $row['second_pass_replace'] = str_replace("\n", "\r", $row['second_pass_replace']);
 179   
 180                  $rowset[$row['bbcode_id']] = $row;
 181              }
 182              $db->sql_freeresult($result);
 183          }
 184   
 185          foreach ($bbcode_ids as $bbcode_id)
 186          {
 187              switch ($bbcode_id)
 188              {
 189                  case 0:
 190                      $this->bbcode_cache[$bbcode_id] = array(
 191                          'str' => array(
 192                              '[/quote:$uid]'    => $this->bbcode_tpl('quote_close', $bbcode_id)
 193                          ),
 194                          'preg' => array(
 195                              '#\[quote(?:=&quot;(.*?)&quot;)?:$uid\]((?!\[quote(?:=&quot;.*?&quot;)?:$uid\]).)?#ise'    => "\$this->bbcode_second_pass_quote('\$1', '\$2')"
 196                          )
 197                      );
 198                  break;
 199   
 200                  case 1:
 201                      $this->bbcode_cache[$bbcode_id] = array(
 202                          'str' => array(
 203                              '[b:$uid]'    => $this->bbcode_tpl('b_open', $bbcode_id),
 204                              '[/b:$uid]'    => $this->bbcode_tpl('b_close', $bbcode_id),
 205                          )
 206                      );
 207                  break;
 208   
 209                  case 2:
 210                      $this->bbcode_cache[$bbcode_id] = array(
 211                          'str' => array(
 212                              '[i:$uid]'    => $this->bbcode_tpl('i_open', $bbcode_id),
 213                              '[/i:$uid]'    => $this->bbcode_tpl('i_close', $bbcode_id),
 214                          )
 215                      );
 216                  break;
 217   
 218                  case 3:
 219                      $this->bbcode_cache[$bbcode_id] = array(
 220                          'preg' => array(
 221                              '#\[url:$uid\]((.*?))\[/url:$uid\]#s'            => $this->bbcode_tpl('url', $bbcode_id),
 222                              '#\[url=([^\[]+?):$uid\](.*?)\[/url:$uid\]#s'    => $this->bbcode_tpl('url', $bbcode_id),
 223                          )
 224                      );
 225                  break;
 226   
 227                  case 4:
 228                      if ($user->optionget('viewimg'))
 229                      {
 230                          $this->bbcode_cache[$bbcode_id] = array(
 231                              'preg' => array(
 232                                  '#\[img:$uid\](.*?)\[/img:$uid\]#s'        => $this->bbcode_tpl('img', $bbcode_id),
 233                              )
 234                          );
 235                      }
 236                      else
 237                      {
 238                          $this->bbcode_cache[$bbcode_id] = array(
 239                              'preg' => array(
 240                                  '#\[img:$uid\](.*?)\[/img:$uid\]#s'        => str_replace('$2', '[ img ]', $this->bbcode_tpl('url', $bbcode_id, true)),
 241                              )
 242                          );
 243                      }
 244                  break;
 245   
 246                  case 5:
 247                      $this->bbcode_cache[$bbcode_id] = array(
 248                          'preg' => array(
 249                              '#\[size=([\-\+]?\d+):$uid\](.*?)\[/size:$uid\]#s'    => $this->bbcode_tpl('size', $bbcode_id),
 250                          )
 251                      );
 252                  break;
 253   
 254                  case 6:
 255                      $this->bbcode_cache[$bbcode_id] = array(
 256                          'preg' => array(
 257                              '!\[color=(#[0-9a-f]{3}|#[0-9a-f]{6}|[a-z\-]+):$uid\](.*?)\[/color:$uid\]!is'    => $this->bbcode_tpl('color', $bbcode_id),
 258                          )
 259                      );
 260                  break;
 261   
 262                  case 7:
 263                      $this->bbcode_cache[$bbcode_id] = array(
 264                          'str' => array(
 265                              '[u:$uid]'    => $this->bbcode_tpl('u_open', $bbcode_id),
 266                              '[/u:$uid]'    => $this->bbcode_tpl('u_close', $bbcode_id),
 267                          )
 268                      );
 269                  break;
 270   
 271                  case 8:
 272                      $this->bbcode_cache[$bbcode_id] = array(
 273                          'preg' => array(
 274                              '#\[code(?:=([a-z]+))?:$uid\](.*?)\[/code:$uid\]#ise'    => "\$this->bbcode_second_pass_code('\$1', '\$2')",
 275                          )
 276                      );
 277                  break;
 278   
 279                  case 9:
 280                      $this->bbcode_cache[$bbcode_id] = array(
 281                          'preg' => array(
 282                              '#(\[\/?(list|\*):[mou]?:?$uid\])[\n]{1}#'    => "\$1",
 283                              '#(\[list=([^\[]+):$uid\])[\n]{1}#'            => "\$1",
 284                              '#\[list=([^\[]+):$uid\]#e'                    => "\$this->bbcode_list('\$1')",
 285                          ),
 286                          'str' => array(
 287                              '[list:$uid]'        => $this->bbcode_tpl('ulist_open_default', $bbcode_id),
 288                              '[/list:u:$uid]'    => $this->bbcode_tpl('ulist_close', $bbcode_id),
 289                              '[/list:o:$uid]'    => $this->bbcode_tpl('olist_close', $bbcode_id),
 290                              '[*:$uid]'            => $this->bbcode_tpl('listitem', $bbcode_id),
 291                              '[/*:$uid]'            => $this->bbcode_tpl('listitem_close', $bbcode_id),
 292                              '[/*:m:$uid]'        => $this->bbcode_tpl('listitem_close', $bbcode_id)
 293                          ),
 294                      );
 295                  break;
 296   
 297                  case 10:
 298                      $this->bbcode_cache[$bbcode_id] = array(
 299                          'preg' => array(
 300                              '#\[email:$uid\]((.*?))\[/email:$uid\]#is'            => $this->bbcode_tpl('email', $bbcode_id),
 301                              '#\[email=([^\[]+):$uid\](.*?)\[/email:$uid\]#is'    => $this->bbcode_tpl('email', $bbcode_id)
 302                          )
 303                      );
 304                  break;
 305   
 306                  case 11:
 307                      if ($user->optionget('viewflash'))
 308                      {
 309                          $this->bbcode_cache[$bbcode_id] = array(
 310                              'preg' => array(
 311                                  '#\[flash=([0-9]+),([0-9]+):$uid\](.*?)\[/flash:$uid\]#'    => $this->bbcode_tpl('flash', $bbcode_id),
 312                              )
 313                          );
 314                      }
 315                      else
 316                      {
 317                          $this->bbcode_cache[$bbcode_id] = array(
 318                              'preg' => array(
 319                                  '#\[flash=([0-9]+),([0-9]+):$uid\](.*?)\[/flash:$uid\]#'    => str_replace('$1', '$3', str_replace('$2', '[ flash ]', $this->bbcode_tpl('url', $bbcode_id, true)))
 320                              )
 321                          );
 322                      }
 323                  break;
 324   
 325                  case 12:
 326                      $this->bbcode_cache[$bbcode_id] = array(
 327                          'str'    => array(
 328                              '[/attachment:$uid]'    => $this->bbcode_tpl('inline_attachment_close', $bbcode_id)
 329                          ),
 330                          'preg'    => array(
 331                              '#\[attachment=([0-9]+):$uid\]#'    => $this->bbcode_tpl('inline_attachment_open', $bbcode_id)
 332                          )
 333                      );
 334                  break;
 335   
 336                  default:
 337                      if (isset($rowset[$bbcode_id]))
 338                      {
 339                          if ($this->template_bitfield->get($bbcode_id))
 340                          {
 341                              // The bbcode requires a custom template to be loaded
 342                              if (!$bbcode_tpl = $this->bbcode_tpl($rowset[$bbcode_id]['bbcode_tag'], $bbcode_id))
 343                              {
 344                                  // For some reason, the required template seems not to be available, use the default template
 345                                  $bbcode_tpl = (!empty($rowset[$bbcode_id]['second_pass_replace'])) ? $rowset[$bbcode_id]['second_pass_replace'] : $rowset[$bbcode_id]['bbcode_tpl'];
 346                              }
 347                              else
 348                              {
 349                                  // In order to use templates with custom bbcodes we need
 350                                  // to replace all {VARS} to corresponding backreferences
 351                                  // Note that backreferences are numbered from bbcode_match
 352                                  if (preg_match_all('/\{(URL|LOCAL_URL|EMAIL|TEXT|SIMPLETEXT|INTTEXT|IDENTIFIER|COLOR|NUMBER)[0-9]*\}/', $rowset[$bbcode_id]['bbcode_match'], $m))
 353                                  {
 354                                      foreach ($m[0] as $i => $tok)
 355                                      {
 356                                          $bbcode_tpl = str_replace($tok, '$' . ($i + 1), $bbcode_tpl);
 357                                      }
 358                                  }
 359                              }
 360                          }
 361                          else
 362                          {
 363                              // Default template
 364                              $bbcode_tpl = (!empty($rowset[$bbcode_id]['second_pass_replace'])) ? $rowset[$bbcode_id]['second_pass_replace'] : $rowset[$bbcode_id]['bbcode_tpl'];
 365                          }
 366   
 367                          // Replace {L_*} lang strings
 368                          $bbcode_tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $bbcode_tpl);
 369   
 370                          if (!empty($rowset[$bbcode_id]['second_pass_replace']))
 371                          {
 372                              // The custom BBCode requires second-pass pattern replacements
 373                              $this->bbcode_cache[$bbcode_id] = array(
 374                                  'preg' => array($rowset[$bbcode_id]['second_pass_match'] => $bbcode_tpl)
 375                              );
 376                          }
 377                          else
 378                          {
 379                              $this->bbcode_cache[$bbcode_id] = array(
 380                                  'str' => array($rowset[$bbcode_id]['second_pass_match'] => $bbcode_tpl)
 381                              );
 382                          }
 383                      }
 384                      else
 385                      {
 386                          $this->bbcode_cache[$bbcode_id] = false;
 387                      }
 388                  break;
 389              }
 390          }
 391      }
 392   
 393      /**
 394      * Return bbcode template
 395      */
 396      function bbcode_tpl($tpl_name, $bbcode_id = -1, $skip_bitfield_check = false)
 397      {
 398          static $bbcode_hardtpl = array();
 399          if (empty($bbcode_hardtpl))
 400          {
 401              global $user;
 402   
 403              $bbcode_hardtpl = array(
 404                  'b_open'    => '<span style="font-weight: bold">',
 405                  'b_close'    => '</span>',
 406                  'i_open'    => '<span style="font-style: italic">',
 407                  'i_close'    => '</span>',
 408                  'u_open'    => '<span style="text-decoration: underline">',
 409                  'u_close'    => '</span>',
 410                  'img'        => '<img src="$1" class="postimage" alt="' . $user->lang['IMAGE'] . '" />',
 411                  'size'        => '<span style="font-size: $1%; line-height: normal">$2</span>',
 412                  'color'        => '<span style="color: $1">$2</span>',
 413                  'email'        => '<a href="mailto:$1">$2</a>'
 414              );
 415          }
 416   
 417          if ($bbcode_id != -1 && !$skip_bitfield_check && !$this->template_bitfield->get($bbcode_id))
 418          {
 419              return (isset($bbcode_hardtpl[$tpl_name])) ? $bbcode_hardtpl[$tpl_name] : false;
 420          }
 421   
 422          if (empty($this->bbcode_template))
 423          {
 424              if (($tpl = file_get_contents($this->template_filename)) === false)
 425              {
 426                  trigger_error('Could not load bbcode template', E_USER_ERROR);
 427              }
 428   
 429              // replace \ with \\ and then ' with \'.
 430              $tpl = str_replace('\\', '\\\\', $tpl);
 431              $tpl = str_replace("'", "\'", $tpl);
 432   
 433              // strip newlines and indent
 434              $tpl = preg_replace("/\n[\n\r\s\t]*/", '', $tpl);
 435   
 436              // Turn template blocks into PHP assignment statements for the values of $bbcode_tpl..
 437              $this->bbcode_template = array();
 438   
 439              $matches = preg_match_all('#<!-- BEGIN (.*?) -->(.*?)<!-- END (?:.*?) -->#', $tpl, $match);
 440   
 441              for ($i = 0; $i < $matches; $i++)
 442              {
 443                  if (empty($match[1][$i]))
 444                  {
 445                      continue;
 446                  }
 447   
 448                  $this->bbcode_template[$match[1][$i]] = $this->bbcode_tpl_replace($match[1][$i], $match[2][$i]);
 449              }
 450          }
 451   
 452          return (isset($this->bbcode_template[$tpl_name])) ? $this->bbcode_template[$tpl_name] : ((isset($bbcode_hardtpl[$tpl_name])) ? $bbcode_hardtpl[$tpl_name] : false);
 453      }
 454   
 455      /**
 456      * Return bbcode template replacement
 457      */
 458      function bbcode_tpl_replace($tpl_name, $tpl)
 459      {
 460          global $user;
 461   
 462          static $replacements = array(
 463              'quote_username_open'    => array('{USERNAME}'    => '$1'),
 464              'color'                    => array('{COLOR}'        => '$1', '{TEXT}'            => '$2'),
 465              'size'                    => array('{SIZE}'        => '$1', '{TEXT}'            => '$2'),
 466              'img'                    => array('{URL}'        => '$1'),
 467              'flash'                    => array('{WIDTH}'        => '$1', '{HEIGHT}'            => '$2', '{URL}'    => '$3'),
 468              'url'                    => array('{URL}'        => '$1', '{DESCRIPTION}'    => '$2'),
 469              'email'                    => array('{EMAIL}'        => '$1', '{DESCRIPTION}'    => '$2')
 470          );
 471   
 472          $tpl = preg_replace('/{L_([A-Z0-9_]+)}/e', "(!empty(\$user->lang['\$1'])) ? \$user->lang['\$1'] : ucwords(strtolower(str_replace('_', ' ', '\$1')))", $tpl);
 473   
 474          if (!empty($replacements[$tpl_name]))
 475          {
 476              $tpl = strtr($tpl, $replacements[$tpl_name]);
 477          }
 478   
 479          return trim($tpl);
 480      }
 481   
 482      /**
 483      * Second parse list bbcode
 484      */
 485      function bbcode_list($type)
 486      {
 487          if ($type == '')
 488          {
 489              $tpl = 'ulist_open_default';
 490              $type = 'default';
 491          }
 492          else if ($type == 'i')
 493          {
 494              $tpl = 'olist_open';
 495              $type = 'lower-roman';
 496          }
 497          else if ($type == 'I')
 498          {
 499              $tpl = 'olist_open';
 500              $type = 'upper-roman';
 501          }
 502          else if (preg_match('#^(disc|circle|square)$#i', $type))
 503          {
 504              $tpl = 'ulist_open';
 505              $type = strtolower($type);
 506          }
 507          else if (preg_match('#^[a-z]$#', $type))
 508          {
 509              $tpl = 'olist_open';
 510              $type = 'lower-alpha';
 511          }
 512          else if (preg_match('#[A-Z]#', $type))
 513          {
 514              $tpl = 'olist_open';
 515              $type = 'upper-alpha';
 516          }
 517          else if (is_numeric($type))
 518          {
 519              $tpl = 'olist_open';
 520              $type = 'decimal';
 521          }
 522          else
 523          {
 524              $tpl = 'olist_open';
 525              $type = 'decimal';
 526          }
 527   
 528          return str_replace('{LIST_TYPE}', $type, $this->bbcode_tpl($tpl));
 529      }
 530   
 531      /**
 532      * Second parse quote tag
 533      */
 534      function bbcode_second_pass_quote($username, $quote)
 535      {
 536          // when using the /e modifier, preg_replace slashes double-quotes but does not
 537          // seem to slash anything else
 538          $quote = str_replace('\"', '"', $quote);
 539          $username = str_replace('\"', '"', $username);
 540   
 541          // remove newline at the beginning
 542          if ($quote == "\n")
 543          {
 544              $quote = '';
 545          }
 546   
 547          $quote = (($username) ? str_replace('$1', $username, $this->bbcode_tpl('quote_username_open')) : $this->bbcode_tpl('quote_open')) . $quote;
 548   
 549          return $quote;
 550      }
 551   
 552      /**
 553      * Second parse code tag
 554      */
 555      function bbcode_second_pass_code($type, $code)
 556      {
 557          // when using the /e modifier, preg_replace slashes double-quotes but does not
 558          // seem to slash anything else
 559          $code = str_replace('\"', '"', $code);
 560   
 561          switch ($type)
 562          {
 563              case 'php':
 564                  // Not the english way, but valid because of hardcoded syntax highlighting
 565                  if (strpos($code, '<span class="syntaxdefault"><br /></span>') === 0)
 566                  {
 567                      $code = substr($code, 41);
 568                  }
 569   
 570              // no break;
 571   
 572              default:
 573                  $code = str_replace("\t", '&nbsp; &nbsp;', $code);
 574                  $code = str_replace('  ', '&nbsp; ', $code);
 575                  $code = str_replace('  ', ' &nbsp;', $code);
 576                  $code = str_replace("\n ", "\n&nbsp;", $code);
 577   
 578                  // keep space at the beginning
 579                  if (!empty($code) && $code[0] == ' ')
 580                  {
 581                      $code = '&nbsp;' . substr($code, 1);
 582                  }
 583   
 584                  // remove newline at the beginning
 585                  if (!empty($code) && $code[0] == "\n")
 586                  {
 587                      $code = substr($code, 1);
 588                  }
 589              break;
 590          }
 591   
 592          $code = $this->bbcode_tpl('code_open') . $code . $this->bbcode_tpl('code_close');
 593   
 594          return $code;
 595      }
 596  }
 597