* @version $Id$ * @license http://opensource.org/licenses/gpl-2.0.php GNU GPL 2 */ die('Pour pouvoir utiliser ce fichier veuillez decommenter cette ligne. Cefichier est une faille potentielle de securite, ne l\'utilisez qu\'en local, ou si vous etes certain de ce que vous faites'); /** * Ce fichier parse et affiche correctement une documentation XML */ error_reporting(E_ALL); $id = (isset($_GET['id'])) ? $_GET['id'] : null; $data = array( 'map' => '../doc/maps.txt', 'mod' => '../doc/mods.txt', 'procedure' => '../doc/procedure.txt', 'fsbcard' => '../doc/fsbcard.txt', ); $filename = (isset($data[$id])) ? $data[$id] : $data['map']; $xml_explain = new Xml_explain; $xml_explain->load_file($filename); ?> <?php echo $xml_explain->title ?> output(); ?>
load_content(file_get_contents($filename)); } // Charge un code descripteur public function load_content($code) { // parse titre et description if (preg_match("#\n\s*@title=(.*?)\n#si", $code, $t)) { $this->title = $t[1]; } if (preg_match("#\n\s*@description=(.*?)\n#si", $code, $d)) { $this->description = $d[1]; } // Parse des commentaires et sauts de ligne $code = preg_replace('#<\!--.*?-->#si', '', $code); $code = str_replace(array("\r\n", "\r"), array("\n", "\n"), $code); $this->code = $code; } // Parse et affichage public function output() { // Parcours ligne par ligne $level = 0; $last_level = -1; $right = $left = ''; $open = false; $attr = array(); foreach (explode("\n", $this->code) AS $i => $line) { if (!trim($line)) { continue ; } // Gestion du niveau de profondeur (tabulations) avec ouverture / fermeture des DIV if (preg_match("#^(\t*)[^\t]#", $line, $m)) { $level = (strlen($m[1])) ? count(str_split($m[1])) : 0; } else { $level = 0; } $line = trim($line); if ($line[0] == '*') { $item = 'tag'; } else if ($line[0] == '-') { $item = 'attr'; } else { continue ; } if ($item == 'tag') { if ($level > $last_level) { // Ouverture if ($level > $last_level + 1) { die("Trop de tabulations a la ligne $i"); } $left .= ''; $right .= ''; } } $last_level = $level; } // Parse de la ligne if (preg_match('#^([^:]*?):(.*?)$#i', $line, $m)) { $info = trim(substr($m[1], 1)); $description = $m[2]; if ($item == 'tag') { // Tag de la balise if (!preg_match('#^<([a-zA-Z0-9\-_]*?)(\s*/)?>#i', $info, $m)) { die("Il manque une balise a la ligne $i"); } $tag = $m[1]; $end = @$m[2]; // Contenu de la balise $contain = ''; if (preg_match('#\(\.\.\.\)#', $info)) { $contain = 'cette balise contient du texte.'; } else if (preg_match('#<\.\.\.>#', $info)) { $contain = 'cette balise contient d\'autres balises.'; } else if (preg_match('#\((([a-zA-Z0-9_\- ]*?)(\|[a-zA-Z0-9_\- ]*?)+)\)#', $info, $n)) { $split = explode('|', $n[1]); $contain = 'cette balise peut prendre la valeur ' . implode(' ou ', $split) . '.'; } $repeat = ''; if (preg_match('#\#\.\.\.\##', $info)) { $repeat = '
Cette balise peut se repeter indefiniment.
';; } $not_implemented = false; if (strpos($info, '(!)') !== false) { $not_implemented = true ; } $left .= '
  • ' . (($not_implemented) ? '! ' : '') . $tag . '
  • '; $open = true ; $right .= '

    <' . $tag . (($end) ? ' /' : '') . '>' . (($not_implemented) ? ' Non implemente' : '') . '

    '; if ($contain) { $right .= '
    Contenu : ' . $contain . '
    '; } $right .= $repeat; $right .= '' . htmlspecialchars($description) . '{ATTR_' . $tag . '}'; $right .= '
    '; } else { if (!isset($attr[$tag])) { $attr[$tag] = array(); } $attr[$tag][$info] = $description; } } } // Attributs foreach ($attr AS $tag => $info) { $str = '

    Attributs :

    '; $right = str_replace('{ATTR_' . $tag . '}', $str, $right); } $right = preg_replace('#\{ATTR_[a-z0-9A-Z\-_]*?\}#', '', $right); // Fermeture des DIV for ($j = 0; $j <= $last_level; $j++) { $left .= ''; $right .= ''; } // Affichage echo '
    ' . $left . '
    '; } } ?>