Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

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:50 - Dateigröße: 15.73 KiB


 001  <?php
 002  /**
 003  *
 004  * @package phpBB3
 005  * @version $Id$
 006  * @copyright (c) 2005 phpBB Group
 007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 008  *
 009  */
 010   
 011  /**
 012  * @ignore
 013  */
 014  if (!defined('IN_PHPBB'))
 015  {
 016      exit;
 017  }
 018   
 019  /**
 020  * BBCode class
 021  * @package phpBB3
 022  */
 023  class bbcode
 024  {
 025      var $bbcode_uid = '';
 026      var $bbcode_bitfield = '';
 027      var $bbcode_cache = array();
 028      var $bbcode_template = array();
 029   
 030      var $bbcodes = array();
 031   
 032      var $template_bitfield;
 033      var $template_filename = '';
 034   
 035      /**
 036      * Constructor
 037      * Init bbcode cache entries if bitfield is specified
 038      */
 039      function bbcode($bitfield = '')
 040      {
 041          if ($bitfield)
 042          {
 043              $this->bbcode_bitfield = $bitfield;
 044              $this->bbcode_cache_init();
 045          }
 046      }
 047   
 048      /**
 049      * Second pass bbcodes
 050      */
 051      function bbcode_second_pass(&$message, $bbcode_uid = '', $bbcode_bitfield = false)
 052      {
 053          if ($bbcode_uid)
 054          {
 055              $this->bbcode_uid = $bbcode_uid;
 056          }
 057   
 058          if ($bbcode_bitfield !== false)
 059          {
 060              $this->bbcode_bitfield = $bbcode_bitfield;
 061   
 062              // Init those added with a new bbcode_bitfield (already stored codes will not get parsed again)
 063              $this->bbcode_cache_init();
 064          }
 065   
 066          if (!$this->bbcode_bitfield)
 067          {
 068              // Remove the uid from tags that have not been transformed into HTML
 069              if ($this->bbcode_uid)
 070              {
 071                  $message = str_replace(':' . $this->bbcode_uid, '', $message);
 072              }
 073   
 074              return;
 075          }
 076   
 077          $str = array('search' => array(), 'replace' => array());
 078          $preg = array('search' => array(), 'replace' => array());
 079   
 080          $bitfield = new bitfield($this->bbcode_bitfield);
 081          $bbcodes_set = $bitfield->get_all_set();
 082   
 083          $undid_bbcode_specialchars = false;
 084          foreach ($bbcodes_set as $bbcode_id)
 085          {
 086              if (!empty($this->bbcode_cache[$bbcode_id]))
 087              {
 088                  foreach ($this->bbcode_cache[$bbcode_id] as $type => $array)
 089                  {
 090                      foreach ($array as $search => $replace)
 091                      {
 092                          ${$type}['search'][] = str_replace('$uid', $this->bbcode_uid, $search);
 093                          ${$type}['replace'][] = $replace;
 094                      }
 095   
 096                      if (sizeof($str['search']))
 097                      {
 098                          $message = str_replace($str['search'], $str['replace'], $message);
 099                          $str = array('search' => array(), 'replace' => array());
 100                      }
 101   
 102                      if (sizeof($preg['search']))
 103                      {
 104                          // we need to turn the entities back into their original form to allow the
 105                          // search patterns to work properly
 106                          if (!$undid_bbcode_specialchars)
 107                          {
 108                              $message = str_replace(array('&#58;', '&#46;'), array(':', '.'), $message);
 109                              $undid_bbcode_specialchars = true;
 110                          }
 111   
 112                          $message = preg_replace($preg['search'], $preg['replace'], $message);
 113                          $preg = array('search' => array(), 'replace' => array());
 114                      }
 115                  }
 116              }
 117          }
 118   
 119          // Remove the uid from tags that have not been transformed into HTML
 120          $message = str_replace(':' . $this->bbcode_uid, '', $message);
 121      }
 122   
 123      /**
 124      * Init bbcode cache
 125      *
 126      * requires: $this->bbcode_bitfield
 127      * sets: $this->bbcode_cache with bbcode templates needed for bbcode_bitfield
 128      */
 129      function bbcode_cache_init()
 130      {
 131          global $user, $phpbb_root_path;
 132   
 133          if (empty($this->template_filename))
 134          {
 135              $this->template_bitfield = new bitfield($user->theme['bbcode_bitfield']);
 136              $this->template_filename = $phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template/bbcode.html';
 137   
 138              if (!@file_exists($this->template_filename))
 139              {
 140                  trigger_error('The file ' . $this->template_filename . ' is missing.', E_USER_ERROR);
 141              }
 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]{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|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-Z_]+)}/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" 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-Z_]+)}/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 = 'arabic-numbers';
 521          }
 522          else
 523          {
 524              $tpl = 'olist_open';
 525              $type = 'arabic-numbers';
 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   
 577                  // remove newline at the beginning
 578                  if (!empty($code) && $code[0] == "\n")
 579                  {
 580                      $code = substr($code, 1);
 581                  }
 582              break;
 583          }
 584   
 585          $code = $this->bbcode_tpl('code_open') . $code . $this->bbcode_tpl('code_close');
 586   
 587          return $code;
 588      }
 589  }
 590   
 591  ?>