/** * Récupérer toutes les informations dans un fichier DocBook. * @param string $filename nom du fichier à analyser * @return object DocInfos objet contenant les infos de l'article, ou un tableau de chaînes contenant des messages d'erreurs * @todo Relire le code, il ne vérifie parfois pas assez les données d'entrées/les erreurs qui peuvent survenir pendant le traitement. */ function docbookGetArticleInfoFromFile($filename) { $doc = new DocInfos(); /* Extrait du XML toutes les informations pour remplir la classe Article */ /* Obtenir un arbre à partir du fichier XML */ $xmltree = new XML_Tree($filename); /* lecture du fichier qui récupère la balise <article> */ $article = $xmltree->getTreeFromFile(); if ($xmltree->isError($article)) { $erreur = $article->getUserInfo(); if ($erreur == '') { $erreur = 'probablement un document mal formé'; } return array('Impossible de parser le fichier XML (' . $erreur . ')'); } preg_match('/^\\s*<\\?xml(.*?)encoding="(.+?)"/', file_get_contents($filename), $charset); $charset = $charset[2]; $doc->repertoire = _toUtf8($charset, trim($article->getAttribute("id"))); $doc->type = _toUtf8($charset, array_key_exists("role", $article->attributes) ? $article->getAttribute("role") : "article"); $doc->lang = _toUtf8($charset, array_key_exists("lang", $article->attributes) ? $article->getAttribute("lang") : "fr"); $artinfonode = getElementsByTagName($article, "articleinfo"); if (count($artinfonode) == 0) { return array('Impossible de continuer à parser le fichier XML : il manque la section articleinfo du docbook'); } /* Traitement particulier pour les balises <author> */ $auteurs = array(); foreach (getElementsByTagName($artinfonode[0], "author") as $author) { $firstnames = getElementsByTagName($author, "firstname"); $surnames = getElementsByTagName($author, "surname"); $auteurs[] = (count($firstnames) ? ucfirst(trim(tree2text($firstnames[0]))) : "") . ' ' . (count($surnames) ? ucfirst(trim(tree2text($surnames[0]))) : ""); } $doc->auteurs = _toUtf8($charset, implode(', ', $auteurs)); $doc->classement = array(); foreach ($artinfonode[0]->children as $child) { /* Récupération des balises <title>, <pubdate> et <date> */ if (!strcmp($child->name, "title")) { $doc->titre = _toUtf8($charset, tree2text($child)); } if (!strcmp($child->name, "titleabbrev")) { $doc->titremini = _toUtf8($charset, tree2text($child)); } if (!strcmp($child->name, "pubdate")) { $doc->pubdate = _toUtf8($charset, tree2text($child)); } if (!strcmp($child->name, "date")) { $doc->update = _toUtf8($charset, tree2text($child)); } if (!strcmp($child->name, "subjectset")) { foreach (getElementsByTagName($child, "subject") as $subjnode) { $attribute = _toUtf8($charset, $subjnode->getAttribute("role")); $doc->classement[$attribute] = array(); foreach (getElementsByTagName($subjnode, "subjectterm") as $entry) { $doc->classement[$attribute][] = _toUtf8($charset, tree2text($entry)); } } } if (!strcmp($child->name, "abstract")) { $doc->accroche = _toUtf8($charset, tree2text($child)); } } return $doc; }