# 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
}
TAROT (fi) - Crows Fly Back (2007)
Label : Nuclear Blast / Nocturne
Sortie du Scud : 19 janvier 2007
Pays : Finlande
Genre : Heavy Metal Priestien
Type : Album
Playtime : 10 Titres - 46 Mins
Le tout en musique est d’avoir la bonne main au départ. Style une bonne poignée d’atouts, un ou deux bouts, et une coupe franche. Et hop, on part pour la garde contre, à compter que le partenaire appelé sache lire entre les lignes. On emmène le petit au bout, et la partie est enlevée. Ou alors, on part avec pas grand-chose. Quelques atouts, trois piques histoire de contrecarrer les plans de conquête, et on sait rester patient. En tout cas, ce sont les postulats d’usage du tarot à cinq (le tarot à quatre étant plus hasardeux, puisqu’on se retrouve seul…). C’est un peu l’histoire du TAROT. Le groupe, pas le jeu. Ils ont éclos à l’aube des années 80, sous le nom de PURGATORY, à l’initiative des frères Hietala. Oui, le même Hietala de NIGHTWISH, ceux qui ont indiqué la porte de sortie à leur lyrique chanteuse il n’y a pas si longtemps (grand bien leur en ait pris !). Après une carrière erratique et pas vraiment flamboyante hors de leur pays natal, les deux frères se sont retrouvés pour quelques concerts concentrés sur leurs deux premiers albums, signé un nouveau contrat, et retourné en studio pour nous concocter ce fabuleux Crows Fly Back.
Ils ont été servis, on regardé leur main, ont vu les 10 atouts, petit, 21 et excuse compris, pas de piques, et ils ont lancé la garde contre. Ils ont gardé le petit jusqu’au bout. Les adversaires au tapis, ils savourent leur victoire. Tu m’étonnes. Un triomphe dans la forme et le fond. Pochette superbe, production au dessus de tout soupçon, musiciens irréprochables, tout y est. La musique ? A l’image de la partie, évidente, lumineuse, sans accrocs. Tenez, vous voulez qu’on égrène les coups ? Facile !
Le joueur de gauche lance son roi de cœur, TAROT réplique avec « Crows Fly Back », riff d’intro en avant, son de basse à décoiffer Rob Halford (si, c’est possible !), chœurs angéliques en arrière plan, mélodie qui tue. La main est prise. On appelle le partenaire, qui lance à pique. Le joueur de droite se laisse avoir, jette le roi. TAROT réplique derechef avec « Traitor », plus PRIEST que l’original, avec solo Downing/Tipton en prime. Les doutes se lisent déjà sur les visages des trois pigeons. On repart de plus belle avec « Ashes To Ashes », sui sent le single de l’année. Exit RHAPSODY, HAMMERFALL et consorts, le vrai Metal qui tue est là. Dès lors, la partie est gagnée. Mais il faut aller au bout avec panache, les meilleures cartouches ne sont pas tirées. « Before The Skies Come Down » et son break très années 80 (on ne se refait pas !), « Tides », power ballade si il en est, adoucit le climat pour mieux écraser les derniers doutes. Harmonies imparables, rythme hypnotique, les ultimes grosses cartes tombent sans rien pouvoir faire en face, sinon admirer le travail. Pour annihiler toute résistance, on envoie en guise d’assommoir les derniers atouts, « Bleeding Dust », power Metal hyper méchant, dans la plus droite lignée Painkiller. Les opposants sont lessivés, ils n’ont plus qu’à pleurer en regardant les 3 de trèfle ou les 6 de carreaux qu’il leur reste. « You », le single officiel, passe le dernier coup de balai, avant la chute finale, « Howl » et son intro acoustique, et « Grey », deux pépites Heavy que n’aurait pas renié le HELLOWEEN de la grande époque.
Le tout au TAROT est de vaincre avec la manière. Pas de victoire à la Pyrrhus. Le nombre de points est certes primordial, mais la façon de les acquérir l’est tout autant. Crows Fly Back est le parfait guide du gagnant opiniâtre. Celui qui sait attendre son tour pour miser gros. Gageons qu’avec un jeu pareil, ils atteindront les cimes enneigées des charts nordiques (ce qui est déjà partiellement fait, puisque le single « You », a été numéro 1). Reste à partir à l’assaut du reste de l’Europe. Gageons que Marco Hietala regrette de moins en moins d’avoir abandonné sa castafiore. De toutes façons, elle n’arrêtait pas de gueuler. Et elle trouvait le tarot trop vulgaire. Pff, l’opéra c’est trop chiant…
Ajouté : Mardi 19 Décembre 2006 Chroniqueur : Mortne2001 Score : Lien en relation: Tarot Website Hits: 15755
|