# Copyright (C) 2002-2004 gregoire HUBERT.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Author : gregoire HUBERT
#
# XML_node.objet
#
# This object is an XML node representation
#
# /- name (string)
# xml_node --- attributes (array)
# \- children (array) or value (string)
class xml_node {
var $name;
var $attributes = array();
var $children = array();
var $value = "";
function xml_node($name,$attributes,$children=array(),$value="") {
$this->name = $name;
if (is_array($attributes)) {
$this->attributes = $attributes;
}
$this->children = $children;
$this->value = $value;
}
}
# Copyright (C) 2003-2004 gregoire HUBERT.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Author : gregoire HUBERT
#
# xml_tree class
#
# This object parses an XML stream and offers a tree composed by xml_nodes
#
class xml_tree {
var $xml_stream;
var $current_node;
var $root_node;
var $index;
var $value;
function xml_tree() {
$this->root_node = new xml_node("__ROOT_NODE",array());
$this->current_node = $this->root_node;
}
function add_tree($xml_stream) {
# Managing the parser
$this->xml_stream = $xml_stream;
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
if (!xml_parse_into_struct($xml_parser,$this->xml_stream,$this->value,$this->index)) {
xml_parser_free($xml_parser);
die("XML Parse error");
}
xml_parser_free($xml_parser);
# Now, $this->value and $this->index are informed, we can use the get_node methode.
$tab_result = $this->get_node(0,count($this->value) - 1);
$this->root_node->children[] = $tab_result[0];
$this->current_node = $this->root_node;
}
function get_node($index_start,$index_stop) {
#echo " \n";
#echo "GET-NODE($index_start,$index_stop) \n";
# What we are going to return is an array of xml_nodes
$return_tab = array();
# depth is only here to check if everything is all right
$tab_node = $this->value[$index_start];
$depth = $tab_node["level"]-1;
# Now we have to be sure we do not forget a single node
for ($index = $index_start;$index <= $index_stop;$index++) {
#echo "\$index = $index ";
# get the current node
$tab_node = $this->value[$index];
# what type of node is it ?
switch($tab_node["type"]) {
case "complete" :
# Depth integrity check
if ($tab_node["level"] != $depth+1) {
die("ERREUR # contrainte d'intégrité au noeud complet $index, niveau $depth + 1 au lieu de ".$tab_node["level"]);
}
#echo "Noeud complet trouvé position $index TAG ".$tab_node["tag"]." \n";
# Easy one, no children to manage, only a value...
$return_tab[] = new xml_node($tab_node["tag"],$tab_node["attributes"],"",$tab_node["value"]);
break;
case "open" :
# Depth integrity check
if ($tab_node["level"] != $depth +1 ) {
die("ERREUR # contrainte d'intégrité au noeud ouvert $index, niveau $depth au lieu de ".$tab_node["level"]);
}
# Open tag, we re-use this methode to return its children
# Where is the correspondong close tag ?
$node_index = $this->index[$tab_node["tag"]];
$flipped_node_index = array_flip($node_index);
#echo "This ".$tab_node["tag"]." is at coords ".$flipped_node_index[$index]." ";
$i=1;
do {
$next_index = $node_index[$flipped_node_index[$index] + $i++];
$next_tag=$this->value[$next_index];
}
while ($next_tag["level"]!=$tab_node["level"]);
#echo "Ouverture de noeud détectée pos $index TAG ".$tab_node["tag"]." \n Parcours jusqu au $next_index \n";
# good, we can now instanciate our node
$return_tab[] = new xml_node($tab_node["tag"],$tab_node["attributes"],$this->get_node($index+1,$next_index),"");
# As we called the get_node methode, we are sure that nodes have been parsed to the corresponding close tag
$index = $next_index;
break;
case "close" :
# Depth integrity check
if ($tab_node["level"] != $depth ){
die("ERREUR # contrainte d'intégrité au noeud fermé $index, niveau $depth au lieu de ".$tab_node["level"]);
}
#echo "Fermeture de noeud detectée pos $index TAG ".$tab_node["tag"]."
\n";
# This ugly thing is useless because reaching a close tag means that $index==$index_stop but who knows ? =)
# it will be skipped soon
$index = $index_stop;
break;
default:
die("Erreur de type de TAG non déterminé :'".$tab_node["type"]."'");
}
}
# We are out ... returns the array with collected children...
return ($return_tab);
}
# this function browse the xml tree and set the current node to the selected node
function give_node($path) {
if ($path[0]=="/") {
$current_node=$this->root_node;
$path=substr($path,1);
#echo "ABSOLUTE PATH GIVEN=$path ";
}
else {
$current_node = $this->current_node;
}
#echo "PATH GIVEN=$path ";
$tab_path = split("/",$path);
foreach ($tab_path as $node_expr) {
#echo "STUDYING EXPR='$node_expr' ";
$node = $current_node;
$expr_tab = split("\?",$node_expr);
$node_name = $expr_tab[0];
$attr_tab = 0;
if (count($expr_tab)>1) {
##echo "TROUVE AU MOINS UNE CONDITION SUR LES ATTRIBUTS... ";
$attr_expr_tab=split(",",$expr_tab[1]);
$attr_tab=array();
foreach($attr_expr_tab as $attr_expr) {
$attr_split_expr=split("=",$attr_expr);
$attr_tab[$attr_split_expr[0]]=$attr_split_expr[1];
}
}
$last=0;
foreach ($node->children as $children) {
#echo "COMPARING WITH '$children->name' ";
if ($children->name == $node_name) {
##echo "TROUVE NOEUD CORRESPONDANT $node_name ";
if (is_array($attr_tab)) {
$node_attributes = $children->attributes;
foreach ($attr_tab as $key=>$value) {
if ($node_attributes[$key] == $value) {
#echo "ATTRIBUTE & CHANGE CURRENT NODE TO ".$children->name." ";
$current_node = $children;
$last = 1;
}
}
}
else {
##echo "CHILD=".$children->name." ";
#echo "CHANGE CURRENT NODE TO ".$children->name." ";
$current_node = $children;
$last=1;
}
}
if ($last) {
break;
}
}
if (!$last) {
#echo "PATH ERROR $node_name ";
#die("MMmmmh It seems that this file is not a DIA XML format...sorry...");
return 0;
}
}
return $current_node;
}
function browse_tree($path) {
$node = $this->give_node($path);
if (is_object($node)) {
$this->current_node = $node;
return 1;
}
return 0;
}
# this method dumps an html representation of the xml tree
function xml_show($node = "",$level=0,$last=0) {
if ($node=="") {
$node=$this->root_node;
}
if (!is_object($node)) {
die("ERROR : node is not an object");
}
$line="";
for($i=1;$i<=$level;$i++) {
if ((i==$level-1) and ($last)) {
$line.=" ";
}
else {
$line.=" |";
}
if ($i==$level) {
$line.="`-";
}
}
$line.=$node->name;
#echo $line;
$line.="".count($node->children)."";
if (count($node->children)==1) {
$line.=" (".$node->value.") \n";
echo "$line";
}
else {
$line.=" \n";
echo "$line";
$i=1;
foreach($node->children as $children) {
if ($i==count($node->children)) {
$this->xml_show($children,$level+1,1);
}
else {
$this->xml_show($children,$level+1);
}
$i++;
}
}
}
#END_CLASS
}
REAPTER (it) - M.I.N.D (2013)
Label : Buil2kill Records
Sortie du Scud : 1er avril 2013
Pays : Italie
Genre : Thrash / Heavy Metal
Type : Album
Playtime : 10 Titres - 39 Mins
Il est frappant de constater que dans une ville comme Rome, ô combien ancestrale et chargée d'Histoire mais désespérément crasseuse, poussiéreuse et jonchée de déchets humains, certains entament en musique un semblant de spring cleaning. Il est frappant de constater que depuis des années, au cœur du Thrash Metal, style ô combien ancestral et chargé d'Histoire mais désespérément soumis aux conventions et sujet à l'entartrage, certains cherchent à lui offrir une seconde jeunesse. Eternelle ? REAPTER cumule les bizarreries, les paramètres peu orthodoxes, les coïncidences de caniveau, comme de vouloir passer un coup de Swiffer sur une musique qui, à mon humble avis (et n'y voyez aucun sous-entendu vaseux), mérite un bon coup de Karcher. Le tout dans une capitale italienne, camaïeu de couleurs ternes ou brûlées par un soleil de plomb, l'antihéros de Madame Doubtfire.
Pardonnez cet ersatz de hors-sujet. Je ne me suis pas encore remis des émotions collectées dans la cité aux sept collines et derrière cette prose à deux balles, un seul constat. Avec M.I.N.D, son premier album (paru en 2010 mais réédité en 2013 par Buil2kill Records), REAPTER fait dans le Revival Thrash à l'européenne. "A l'européenne" parce que HAVOK, VEKTOR, MUNICIPAL WASTE, WARBRINGER et les autres n'en sont pas. Et au final, qu'il est méritant ce Thrash Metal. De SLAYER à METALLICA, d'ANTHRAX à OVERKILL, les Italiens ont emmagasiné, suffisamment pour rendre leur disque hautement crédible. Avec "Zarathustra", REAPTER commence par se donner une bonne conscience philosophique. Référence nietzschéenne à l'appui, nos malfrats se lancent dans une course contre la montre sans merci. Et bizarrement, s'ils ont effectivement choisi de donner une seconde jeunesse au Thrash, on remarquera surtout dans un premiers temps leur côté old-school ("Self-Destruction"). Ce n'est qu'à l'arrivée d'une chanson comme "Carnage", très martiale et Heavy, que les Italiens dévoilent leur visage le plus évolutif. Respectueux des consignes, parfois même un peu trop ("Speak My Name"), on leur préférera la douce folie d'un "Run For Glory" à la cadence robotique mais au groove assumé. C'est principalement dans ces moments légers, qui se jouent de l'institution, que M.I.N.D prend un virage stupéfiant et décape son style de prédilection. Sans forcément en faire trop, fort d'un chanteur au timbre naturel, se permettant même une petite power-balade ("Pain"), ce premier essai fait un bien fou. Il confirme surtout la tendance qui fait de ces groupes émergents talentueux une bonne raison de ne plus se limiter aux classiques. Car REAPTER n'est pas un faire-valoir, une voiture-balai ou un second couteau. C'est un pur groupe qui cristallise sa passion en musique et qui n'a pas pour ambition de ressortir un Master Of Puppets, un Bonded By Blood ou un Rust In Peace 2.0. A l'endroit où des formations comme EVILE ou VIOLATOR semblent avoir trois trains de retard, eux légitiment leur place à grands coups de fraîcheur, d'idées neuves et d'allant. L'album se terminera un peu prématurément et trop brutalement à mon goût avec un "Sea Storm" ultra-mélodique, un poil épique, comme pour achever de nous convaincre que ces Transalpins ne boudent jamais la moindre oscillation stylistique, tout en restant profondément fidèles au patrimoine de "La Baie".
Pour avoir constaté de mes propres yeux (et oreilles) que les VEKTOR, SSS, GAMA BOMB et compagnie font actuellement très bonne figure aux côtés d'un Dave Mustaine en état de délabrement avancé (pour ne pas dire en phase terminale, par respect pour tous les cancéreux de ce monde), je préfère cent fois chouchouter un groupe comme REAPTER. Ce n'est pas une question d'être "true"ou que sais-je et loin de moi l'idée de vouloir minimiser l'aura d'un MEGADETH ou d'un METALLICA. Mais avec des albums comme M.I.N.D entre les mains, qui transpirent l'effort, la perspicacité et la lucidité, il ne peut en être autrement. Le futur est là, pas dans le rétro.
Ajouté : Samedi 08 Mars 2014 Chroniqueur : Stef. Score : Lien en relation: Reapter Website Hits: 5668
|