# 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
}
SOLEKAHN (FRA) - The Great Divider (2004)
Label : Sacral Productions
Sortie du Scud : janvier 2004
Pays : France
Genre : Death / Dark Metal
Type : Album
Playtime : 10 Titres - 56 Mins
Le 30 janvier 2002, Blasphy de Blasphèmar, notre maître à tous, prophète parmi les oracles, déclarait à propos de Suffering Winds, premier EP de ce groupe strasbourgeois que l'évolution de SOLEKAHN devrait être intéressante à suivre. Après cette déclaration fracassante qui ne laissait guère de place à des arguments plus intenses, on ne pouvait qu'aller dans son sens, et pour tout vous dire, la sortie successive de The Great Divider, leur premier album, allait lui donner encore plus raison. Car SOLEKAHN maniait jadis le Death Metal avec beaucoup de fermeté et une pointe de noirceur atmosphérique. Ce n'était pas du Death bête et méchant, prévisible jusqu'à la moelle, suintant graisse et sueur, vivant à travers la mort et vociférant son amour de la haine. C'était un petit peu plus que ça, et l'annonce récente de leur grand retour pour le mois d'octobre 2013 ne peut finalement laisser indifférent. Dix ans après qui se souvient encore de The Great Divider ? Et qui devrait ?
Il y a tout d'abord ce côté macabre, angoissant, décadent qui fuite des tripes de "The Announcement", une introduction instrumentale sinistre, et vous aurez bientôt l'occasion de comprendre que les instrumentales, chez SOLEKAHN, c'est une affaire presque meurtrière. Derrière ça, "The Choice Of Path" déboule dans une veine Death plutôt classique, illuminé par une production rustique de chez camembert. Rien de bien neuf sous le soleil, si ce n'est une intensité prodigieuse, répercutée dans la foulée sur un "Lambs Breeding Monsters" curieusement orienté IMMOLATION et auréolé d'une cassure rythmique lancinante. Pas franchement fantaisiste mais davantage original, The Great Divider semble s'affranchir de cette sensation d'étouffement non-stop inhérent aux bons albums de Death traditionnel pour tourner la chose à son avantage, dans une sorte de délire glauque et fantomatique qui mêle arrangements et brutalité. Je parlais plus haut de la crédibilité des instrumentales, alors laissez-moi vous dire que "Woodland Choir" fera son petit effet. Ce ne sont que des grincements, du vieux bois, probablement rongé par les termites, soumis à un poids trop lourd pour rester silencieux. Mais c'est aussi ce genre de grincement que les petits enfants n'expliquent pas au-dessus de leurs têtes, alors que le grenier est censé n'être rempli que de vieilles malles poussiéreuses. Instantanément, on pourrait se dire que SOLEKAHN a tout compris, que c'est en travaillant sur les terreurs infantiles que le croquemitaine prendra possession de The Great Divider, mais ce serait également encourager la simplicité d'une telle démarche, heureusement appuyée ici par un Death classique mais de bonne facture, qui ravira le métalleux lambda fan de vieilleries inestimables. Même si ce premier album s'essouffle un peu en seconde partie, avec un enchainement anecdotique entre "Magnetic Storm" et "Sentences Open", la pureté reprendra le dessus avec "A Stream", une fermeture longue de seize minutes qui passe par différents états : la quiétude, l'inquiétude, la haine froide et la furie furieuse. Un beau patchwork pour conclure.
Sorti des entrailles de la Terre pour ressurgir presque dix ans après, The Great Divider, en dépit de son âge désormais avancé (tout va très vite actuellement), n'a pas pris beaucoup de rides au cul. En une décennie, personne n'a été suffisamment malin pour égaler ou pour démocratiser ce genre d'œuvre à la fois basique et paradoxalement complexe, qui se fout de la technique pure et se concentre sur les peurs. SOLEKAHN, après un long silence, s'apprête maintenant à sortir un second opus, en espérant probablement assumer son statut inconnu de visionnaire.
Ajouté : Lundi 31 Mars 2014 Chroniqueur : Stef. Score : Lien en relation: Solekahn Website Hits: 16128
|