Lier des fichiers HTML multiples avec un CSS avec l'aide de Perl.

Si vous faites face a un site web large dont les pages ne sont pas liés a un CSS, et vous voulez les lier a un tel page, a quoi faire? Vous devrez écrire dans chacunes des fichiers la ligne dans la section <HEAD> la ligne qui lie la page a la page CSS. Il doit avoir une meilleure facon de ce faire.
Il y a bien une meilleure facon. Pour reussir ceci, il vous faut un interpreteur Perl. Vous avez besoin également une copie de votre site dans votre ordinateur local. Dernièrement, vous avez besoin de composer un script Perl et de l'executer. Apres ceci, chacun de vos fichiers seraient liés au CSS. Prochainement, je vais vous indiquer comment le faire.

Le changement ce fait ici

Une ligne de code simple dans le script Perl replace <HEAD> avec <head> <link rel = “stylesheet” type = “text/css” href= “style/stylesheet.css”> Le changement est fait avec une expression reguliere, ou regex:

$line =~ s/<HEAD> /<head><link rel=\”stylesheet\” type=\”text/css\” href=\”style\/stylesheet.css\”/;

Ce regex indique a l'interpreteur que nous cherchons le texte a remplacer; on le cherche dans la chaine de texte representée par la variable scalaire $line. Nous donnons cette commande en placant $line a la gauche de l'operateur =~ . Ainsi, en $line, nous substituerons (representé par le s) chaque <HEAD> avec la chaine de texte avec lequel on va le replacer. Ce regex indique que le texte a replacer est immediatement suivi par le texte de remplacement et celles la sont separes avec le symbole “/” . Les “\” sont mis dans les textes comme requis, devant chaque charactere speciale. En ce cas, on le voit a “<href=\”style\/stylesheet.css\”

Ou ce trouve dans notre script?

Vous vous demanderiez ou ce trouve dans le script. Qu'est est ce que c'est cette variable scalaire nommee $line? Ceci est une chaine de texte, et on cherche ce texte pour ce qu'on veut replacer, ce qui est la chaine de texte <HEAD>. Comment trouvons-nous ce chaine de texte? On doit commencer en ouvrant l' un des fichiers HTML pour que'on puisse obtenir une telle chaine. Alors, ceci ouvre le fichier.

unless (open(INPUT, "C:/file/file1.html")) {
die ("Ne peut pas ouvrir file1.html\n");

Avec ceci, nous ouvrons le ficher et affecte son contenu au "file handle" que l'on appelle “INPUT”. Si ce n'est pas ouvert, la fonction "die" est executée, qui va terminer le programme et informer l'ultilisateur l'impossibilité d'ouvrir file1.html.

Ou ce trouve $line?

$line est encore non-existante. Le fichier et son contenu est represente par INPUT. Prochainement, on doit cueillir le contenu du fichier en affectant le contenu de FILE a un tableau de chaines de texte qui representera le texte. Les tableaux en Perl sont connus par le prefixe “@”, en meme sens que les variables scalaires sont connus par leur prefixes “$”. $line est une variable scalaire. Ceci est le nom qu'on va donner a chaque element de notre tableau @input.

@input = <INPUT>;

En faisant ainsi, nous affectons le contenu de notre ficher au tableau @input. Chaque ligne du ficher HTML devient un element individuel du tableau. Notre fichier est donc represente par @input et avec le prochain code, chaque ligne de notre fichier HTML est representee par $ligne en passant a travers le tableau @array. On passe a travers ce tableau en cherchant le texte <HEAD> pour le replacer avec le code qui va lier notre fichier HTML a notre CSS.

foreach $line(@input) {
$line =~ s/<HEAD> /<head><link rel=\”stylesheet\” type=\”text/css\” href=\”style\/stylesheet.css\”/;
}

On a déja vu ce code; c'est celui qui fait le remplacement. Avec une expression de controle foreach, nous passons a travers chaque $line dans notre tableau @input qui contient le contenu de notre fichier HTML. Le programme alors cherche chaque ligne la chaine de texte <HEAD> et etant trouvée, elle est replacée. Le resultat se trouve dans le tableau @input. Par consequence, @input répresente maintenant le contenu de notre fichier HTML transformé. Le fichier lui-meme ne change pas car cette operation sert seulement a lire du fichier et non a l'écrire. Le programme a lu du fichier, a placé ses contenus dans le tableau et a changé celles ci en iterant a travers chaque élement du tableau et en subissant chaqun de ces a un regex qui execute le replacement.
Alors, on ferme le ficher avec ce qui suit;

close (INPUT);

Quand est le ficher modifié?

Les prochaines lignes de code change le fichier actuel. Ceci est fait en rouvrant le meme fichier en mode écriture seulement. Ceci éfface le fichier. Alors, a ce point, le fichier est vide.

unless (open(OUTPUT, ">$C:/file/file1.html")) {
die ("Ne peut pas ouvrir file OUTPUT\n");
}

Vous voyez comment ce fichier a un nouvel file handle; OUTPUT. The “>” en avant le nom de fichier dit a l'interpreteur qui ceci est une operation a écriture seulement. On a maintenant un fichier vide, mais on il nous reste aussi le tableau de chaines de texte nommé @input, qui contient le contenu du fichier HTML modifié. Il nous reste qu' affecter le contenu de ce tableau @input a notre fichier HTML vide, réprésenté par OUTPUT. Apres ceci, on peut fermer le fichier.

print OUTPUT "@input";
close(OUTPUT);

Le tableau de chaines de texte nommé @input est ainsi affecté au fichier representé par OUTPUT.

A ce point, le code est qui suit .

unless (open(INPUT, "C:/file/file1.html")) {
die ("Cannot open file file1.html");
@input = <INPUT>;
foreach $line(@input) {
$line =~ s/<HEAD> /<head><link rel=\”stylesheet\” type=\”text/css\” href=\”style\/stylesheet.css\”/;
}
close (INPUT);
unless (open(OUTPUT, ">C:/file/file.html")) {
die ("Cannot open file OUTPUT\n");
}

print OUTPUT "@input";
close(OUTPUT);

Ca change qu'un fichier? Comment changer les autres?

Le fichier est introduit a notre script Perl avec la ligne de code qui suit:

unless (open(INPUT, "C:/file/file1.html")) {

En regardant ceci, on voit que “C:/file/file1.html” est qu'une chaine de texte. Une telle chaine peut etre representé par une variable scalaire ou comme élement d'un tableau de chaines de texte, chacune qui represente un nom de fichier HTML.
On peut décrire le tableau avec le syntaxe @array, ou $array[], avec les parantheses carrées representant les élements du tableau; $array[0], $array[1], $array[2], etc. . Appellons ce tableau @file. Le premier élément de notre tableau, $file[0], va etre nommé “C:/file/file1.html”. Notre prochain, $file[1] va etre nommé “C:/file/file2.html”, et cela continue a travers le tableau jusqu'au point ou tous nos fichiers soient inclus dans le tableau.

@file = (
"C:/file/file1.html",
"C:/file/file2.html",
"C:/file/file3.html",
"C:/file/file4.html”);

On a pas encore decrit un élément avec le syntax $file[0] ; ca doit attendre a notre prochain sélection de code. Ici, on replace

unless (open(INPUT, "C:/file/file1.html")) {
die ("Cannot open file file1.html");

avec

unless (open(INPUT, $file[0]{
die ("Cannot open file $file[0]");

Ce code ne change qu'un fichier répresenté dans notre tableau; $file[0]. On doit iterer a travers chaque element de notre tableau, et en faisant ainsi, changer chaque fichier réprésenté dans le tableau. Ceci est fait avec une expression de controle for, en ultilisant un compteur qui sert aussi a indexer les elements du tableau.

for ($i=0; $i<@file; $i++)

{

unless (open(INPUT, "$file[$i]")) {
die ("Cannot open file $file[$i]\n");

En Perl, une expression comme @file peut retourner un valeur entier égal au nombre d'élements dans le tableau. Ainsi, le variable $i compte au nombre d'élements dans le tableau. En faisant ainsi, chaque fichier est modifié comme voulu.

Le code entier.

#!/usr/bin/perl

@file = ("C:/file/file1.html",
"C:/file/file2.html",
"C:/file/file3.html"
) ;

for ($i=0; $i<@file; $i++)

{

unless (open(INPUT, "$file[$i]")) {
die ("Cannot open file $file[$i]\n");
@input = <INPUT>;
foreach $line(@input) {
$line =~ s/.html /.html/;
}
close (INPUT);
unless (open(OUTPUT, ">$file[$i]")) {
die ("Cannot open file OUTPUT\n");
}

print OUTPUT "@input";
close(OUTPUT);
}