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

generate_utf_confusables.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 6.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  if (php_sapi_name() != 'cli')
 012  {
 013      die("This program must be run from the command line.\n");
 014  }
 015   
 016  //
 017  // Security message:
 018  //
 019  // This script is potentially dangerous.
 020  // Remove or comment the next line (die(".... ) to enable this script.
 021  // Do NOT FORGET to either remove this script or disable it after you have used it.
 022  //
 023  die("Please read the first lines of this script for instructions on how to enable it");
 024   
 025  set_time_limit(0);
 026   
 027  define('IN_PHPBB', true);
 028  $phpbb_root_path = '../';
 029  $phpEx = substr(strrchr(__FILE__, '.'), 1);
 030   
 031  echo "Checking for required files\n";
 032  download('http://unicode.org/reports/tr39/data/confusables.txt');
 033  download('http://unicode.org/Public/UNIDATA/CaseFolding.txt');
 034  echo "\n";
 035   
 036   
 037  /**
 038  * Load the confusables table
 039  */
 040  echo "Loading confusables\n";
 041  $unidata = file_get_contents('confusables.txt');
 042   
 043  /**
 044  * Load the CaseFolding table
 045  */
 046  echo "Loading CaseFolding\n";
 047  $casefolds = file_get_contents('CaseFolding.txt');
 048   
 049   
 050  function utf8_chr($cp)
 051  {
 052      if ($cp > 0xFFFF)
 053      {
 054          return chr(0xF0 | ($cp >> 18)) . chr(0x80 | (($cp >> 12) & 0x3F)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
 055      }
 056      else if ($cp > 0x7FF)
 057      {
 058          return chr(0xE0 | ($cp >> 12)) . chr(0x80 | (($cp >> 6) & 0x3F)) . chr(0x80 | ($cp & 0x3F));
 059      }
 060      else if ($cp > 0x7F)
 061      {
 062          return chr(0xC0 | ($cp >> 6)) . chr(0x80 | ($cp & 0x3F));
 063      }
 064      else
 065      {
 066          return chr($cp);
 067      }
 068  }
 069   
 070  preg_match_all('/^([0-9A-F]+) ;\s((?:[0-9A-F]+ )*);.*?$/im', $unidata, $array, PREG_SET_ORDER);
 071  preg_match_all('/^([0-9A-F]+); ([CFS]); ([0-9A-F]+(?: [0-9A-F]+)*);/im', $casefolds, $casefold_array);
 072   
 073  // some that we defined ourselves
 074  $uniarray = array(
 075          "\xC2\xA1"            =>    "\x69",    // EXCLAMATION MARK, INVERTED => LATIN SMALL LETTER I
 076          "\xC7\x83"            =>    "\x21",    // LATIN LETTER RETROFLEX CLICK => EXCLAMATION MARK
 077          "\xCE\xB1"            =>    "\x61",    // GREEK SMALL LETTER ALPHA => LATIN SMALL LETTER A
 078          "\xE1\x9A\x80"        =>    "\x20",    // OGHAM SPACE MARK
 079   
 080          "\xC2\xAD"            =>    '',        // HYPHEN, SOFT => empty string
 081          "\xDB\x9D"            =>    '',        // ARABIC END OF AYAH
 082          "\xDC\x8F"            =>    '',        // SYRIAC ABBREVIATION MARK
 083          "\xE1\xA0\x86"        =>    '',        // MONGOLIAN TODO SOFT HYPHEN
 084          "\xE1\xA0\x8E"        =>    '',        // MONGOLIAN VOWEL SEPARATOR
 085          "\xE2\x80\x8B"        =>    '',        // ZERO WIDTH SPACE
 086          "\xE2\x80\x8C"        =>    '',        // ZERO WIDTH NON-JOINER
 087          "\xE2\x80\x8D"        =>    '',        // ZERO WIDTH JOINER
 088          "\xE2\x80\xA8"        =>    '',        // LINE SEPARATOR
 089          "\xE2\x80\xA9"        =>    '',        // PARAGRAPH SEPARATOR
 090          "\xE2\x81\xA0"        =>    '',        // WORD JOINER
 091          "\xE2\x81\xA1"        =>    '',        // FUNCTION APPLICATION
 092          "\xE2\x81\xA2"        =>    '',        // INVISIBLE TIMES
 093          "\xE2\x81\xA3"        =>    '',        // INVISIBLE SEPARATOR
 094          "\xE2\x81\xAA"        =>    '',        // [CONTROL CHARACTERS]
 095          "\xE2\x81\xAB"        =>    '',        // [CONTROL CHARACTERS]
 096          "\xE2\x81\xAC"        =>    '',        // [CONTROL CHARACTERS]
 097          "\xE2\x81\xAD"        =>    '',        // [CONTROL CHARACTERS]
 098          "\xE2\x81\xAE"        =>    '',        // [CONTROL CHARACTERS]
 099          "\xE2\x81\xAF"        =>    '',        // [CONTROL CHARACTERS]
 100          "\xEF\xBB\xBF"        =>    '',        // ZERO WIDTH NO-BREAK SPACE
 101          "\xEF\xBF\xB9"        =>    '',        // [CONTROL CHARACTERS]
 102          "\xEF\xBF\xBA"        =>    '',        // [CONTROL CHARACTERS]
 103          "\xEF\xBF\xBB"        =>    '',        // [CONTROL CHARACTERS]
 104          "\xEF\xBF\xBC"        =>    '',        // [CONTROL CHARACTERS]
 105          "\xF0\x9D\x85\xB3"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 106          "\xF0\x9D\x85\xB4"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 107          "\xF0\x9D\x85\xB5"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 108          "\xF0\x9D\x85\xB6"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 109          "\xF0\x9D\x85\xB7"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 110          "\xF0\x9D\x85\xB8"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 111          "\xF0\x9D\x85\xB9"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 112          "\xF0\x9D\x85\xBA"    =>    '',        // [MUSICAL CONTROL CHARACTERS]
 113  );
 114   
 115  $copy = $uniarray;
 116   
 117  foreach ($array as $value)
 118  {
 119      $temp_hold = implode(array_map('utf8_chr', array_map('hexdec', explode(' ', trim($value[2])))));
 120      
 121      if (isset($copy[utf8_chr(hexdec((string)$value[1]))]))
 122      {
 123          $num = '';
 124          $string = utf8_chr(hexdec((string)$value[1]));
 125          for ($i = 0; $i < strlen($string); $i++)
 126          {
 127              $num .= '\x' . str_pad(base_convert(ord($string[$i]), 10, 16), 2, '0', STR_PAD_LEFT);
 128          }
 129          echo $num . "\n";
 130          if ($uniarray[$string] != $temp_hold)
 131          {
 132              echo "  --> $string\n";
 133              echo "  --> " . $temp_hold . "\n";
 134          }
 135      }
 136   
 137      // do some tests for things that transform into something with the number one
 138      if (strpos($temp_hold, utf8_chr(0x0031)) !== false)
 139      {
 140          // any kind of letter L?
 141          if (strpos($value[0], 'LETTER L') !== false || strpos($value[0], 'IOTA') !== false || strpos($value[0], 'SMALL L ') !== false || preg_match('/SMALL LIGATURE [^L]*L /', $value[0]))
 142          {
 143              // replace all of the mappings that transform some sort of letter l to number one instead to some sort of letter l to latin small letter l
 144              $temp_hold = str_replace(utf8_chr(0x0031), utf8_chr(0x006C), $temp_hold);
 145          }
 146      }
 147   
 148      // uppercased chars that were folded do not exist in this universe,
 149      // no amount of normalization could ever "trick" this into not working
 150      if (in_array($value[1], $casefold_array[1]))
 151      {
 152          continue;
 153      }
 154   
 155      $uniarray[utf8_chr(hexdec((string)$value[1]))] = $temp_hold;
 156  }
 157   
 158  echo "Writing to confusables.$phpEx\n";
 159   
 160  $fp = fopen($phpbb_root_path . 'includes/utf/data/confusables.' . $phpEx, 'wb');
 161  fwrite($fp, '<?php return ' . my_var_export($uniarray) . ';');
 162  fclose($fp);
 163   
 164  /**
 165  * Return a parsable string representation of a variable
 166  *
 167  * This is function is limited to array/strings/integers
 168  *
 169  * @param    mixed    $var        Variable
 170  * @return    string                PHP code representing the variable
 171  */
 172  function my_var_export($var)
 173  {
 174      if (is_array($var))
 175      {
 176          $lines = array();
 177   
 178          foreach ($var as $k => $v)
 179          {
 180              $lines[] = my_var_export($k) . '=>' . my_var_export($v);
 181          }
 182   
 183          return 'array(' . implode(',', $lines) . ')';
 184      }
 185      else if (is_string($var))
 186      {
 187          return "'" . str_replace(array('\\', "'"), array('\\\\', "\\'"), $var) . "'";
 188      }
 189      else
 190      {
 191          return $var;
 192      }
 193  }
 194   
 195  /**
 196  * Download a file to the develop/ dir
 197  *
 198  * @param    string    $url        URL of the file to download
 199  * @return    void
 200  */
 201  function download($url)
 202  {
 203      global $phpbb_root_path;
 204   
 205      if (file_exists($phpbb_root_path . 'develop/' . basename($url)))
 206      {
 207          return;
 208      }
 209   
 210      echo 'Downloading from ', $url, ' ';
 211   
 212      if (!$fpr = fopen($url, 'rb'))
 213      {
 214          die("Can't download from $url\nPlease download it yourself and put it in the develop/ dir, kthxbai");
 215      }
 216   
 217      if (!$fpw = fopen($phpbb_root_path . 'develop/' . basename($url), 'wb'))
 218      {
 219          die("Can't open develop/" . basename($url) . " for output... please check your permissions or something");
 220      }
 221   
 222      $i = 0;
 223      $chunk = 32768;
 224      $done = '';
 225   
 226      while (!feof($fpr))
 227      {
 228          $i += fwrite($fpw, fread($fpr, $chunk));
 229          echo str_repeat("\x08", strlen($done));
 230   
 231          $done = ($i >> 10) . ' KiB';
 232          echo $done;
 233      }
 234      fclose($fpr);
 235      fclose($fpw);
 236   
 237      echo "\n";
 238  }
 239   
 240  ?>