# 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
}
CLITEATER (nl) - Cliteaten Back To Life (2013)
Label : War Anthem Records
Sortie du Scud : 8 mars 2013
Pays : Pays-Bas
Genre : Goregrind
Type : Album
Playtime : 18 Titres - 42 Mins
Après avoir parodié le Kill 'Em All de METALLICA avec Clit 'Em All en 2003, après avoir moqué le Speak English Or Die de STORMTROOPERS OF DEATH avec Eat Clit Or Die en 2005, après avoir raillé le Scream Bloody Gore de DEATH avec Scream Bloody Clit en 2008 puis le The Great Southern Trendkill de PANTERA avec The Great Southern Clitkill en 2010, les affreux polissons de CLITEATER s'attaquent en 2013 à un nouveau monument du monde Metal. A quelques jours du 1er avril, jour de fête pour les poissons du monde entier, ces Néerlandais se lancent dans le détournement d'un des groupes les plus mythiques du Death Metal : CANNIBAL CORPSE. Comme souvent avec eux, c'est le premier album des formations ciblées (en l'occurrence, le Eaten Back To Life de 1990) qui sera l'objet d'une réinterprétation visuelle et orthographique aussi drôle que le coup du caca sous le paillasson enflammé. Sauf que comme souvent avec eux, la blague tourne au drame avec au bout, des corps d'enfants carbonisés dans des appartements dévastés. On ne rit plus.
Cliteaten Back To Life, c'est l'album de Goregrind chiant comme la mort par excellence. Tout s'enchaîne à une vitesse démesurée, dans le plus grand irrespect des normes musicales traditionnelles. Ce n'est pas choquant, ce n'est pas dérangeant, pour la simple et bonne raison que Goregrind rime avec second degré, m'en-foutisme, légèreté et parfois, puérilité. Ce qui est chagrinant, par contre, c'est que ces garçons font un peu ce que faisaient leurs compatriotes de LAST DAYS OF HUMANITY, en moins jusqu'au-boutiste. Aux Pays-Bas, il y a ROMPEPROP, il y a RECTAL SMEGMA, il y a SKULLHOG qui œuvrent déjà dans des registres similaires et je pense que si on connaît ces trois là, on a tout de suite compris l'essence d'un CLITEATER. Ce cinquième album en devient alors inintéressant, pas parce qu'il est particulièrement désagréable à l'oreille, mais parce qu'il ne se démarque pas dans un style où l'excentricité autorise les dérapages les plus improbables. Grouillant de samples et de morceaux expéditifs qui défilent machinalement, Cliteaten Back To Life s'articule autour de guitares grasses et broyées en soutien d'un chant gargarisé assez performant pour le style. C'est peut-être la force de CLITEATER, qui a tort de miser sur le traditionalisme pour s'en sortir. Pour preuve, il ne se passe rien les trois quarts du temps, sauf sur les compositions qui sortent du schéma Grind bête et méchant (plus bête que méchant d'ailleurs). La simpliste "Redneck Rampage" fonctionne assez bien, le groove de "The Beast" et de "Slimming Party At Kelly's" également mais par-dessus tout, c'est "Positive Aspects Of Collective Chaos" qui obtiendra mon vote. D'une, pour l'hystérie apocalyptique qui surgit dès la première seconde. De deux, pour la cassure "flower-power-baba-cool-laisse-moi-tirer-une-latte-cousin" à partir de 0'49''. Cette création originale et délirante suffirait presque à mon bonheur, mais c'est oublier trop vite qu'à côté de ça, il y a une quinzaine de compositions qui galèrent pour rendre CLITEATER crédible.
On s'en sort donc avec un trauma facial pour seul et unique plaisir. Cliteaten Back To Life a beau être spontané, pas très sérieux (voir franchement débile), on a déjà passé de meilleurs moments sur des albums du même style. Pour un groupe originaire d'Helden, dont la traduction est "Héros" en allemand, être la caricature de l'antihéros de base du Goregrind, c'est quand même sacrément culoté, et au final pas très glorifiant. Pour y croire encore, on peut toujours se dire que l'inspiration viendra le jour où ils parodieront les Grands Succès Du Musette d'Yvette Horner, ce qui serait, avouons-le, autrement plus culte.
Ajouté : Mercredi 25 Septembre 2013 Chroniqueur : Stef. Score : Lien en relation: Cliteater Website Hits: 8318
|