OVH Cloud OVH Cloud

substitution dans des fichiers

24 réponses
Avatar
Nicolas Pontoizeau
Bonjour,

J'ai fait un menu pour un site web et maintenant je souhaite recopier ce
menu sur toutes les pages de mon site.

Existe-t-il un moyen pour copier tout ce qui se trouve entre les
commentaires :

<!-- here starts the menu-->

<div id="topmenu">

<div id="menu">
[...]
</div><!--menu-->
</div><!--topmenu-->

<!-- here end the menu-->

et de mettre à jour tout le contenu des pages du site entre les
commentaires :
<!-- here starts the menu-->
[...]
<!-- here end the menu--> ?

J'ai pensé à perl car ça ressemble à :
for i in *.htm; do perl -pe "s/htm/php/g" -i $i; done
qui me permet de remplacer html par php mais là c'est un plus complexe
et je connais très mal perl.

Merci d'avance,

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

10 réponses

1 2 3
Avatar
Alex Marandon
On 2005-04-14, Nicolas Pontoizeau <pontoize*NOSPAM*@Efrei.fr.invalid> wrote:
et de mettre à jour tout le contenu des pages du site entre les
commentaires :
<!-- here starts the menu-->
[...]
<!-- here end the menu--> ?
[...]


Je n'ai pas vraiment compris ton problème, mais si ton HTML est du XHTML
tu peux utiliser un parseur XML. En l'occurence un processeur SAX te
permettrait de distinguer facilement ce qui se trouve entre tes
commentaires.

Avatar
Nicolas Pontoizeau
Je n'ai pas vraiment compris ton problème, mais si ton HTML est du XHTML
tu peux utiliser un parseur XML. En l'occurence un processeur SAX te
permettrait de distinguer facilement ce qui se trouve entre tes
commentaires.


Ok merci pour l'info, malheureusement ce n'est pas tout le temps du
xml bien formé que je traite.

L'idée est simple : je fais une fois le menu correctement et ensuite je
voudrais le recopier sur toutes les pages du site. Pour cela j'ai mis
des commentaires comme marque de repère. Si ça ne tenait que sur une
ligne on pourrait faire un truc du style :
perl -pi -e 's/<!-- here starts the menu--> rien <!-- here end the menu-->/
<!-- here starts the menu--> [tout le code du menu] <!-- here end the menu-->/g' /rep/*.html

Je sais pas si c'est plus clair...

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

Avatar
DoMinix
"Nicolas Pontoizeau" <pontoize*NOSPAM*@Efrei.fr.invalid> a écrit dans le
message de news: slrnd5tbrd.q7l.pontoize*NOSPAM*@choam.unix.efrei.fr...
...

L'idée est simple : je fais une fois le menu correctement et ensuite je
voudrais le recopier sur toutes les pages du site. Pour cela j'ai mis
des commentaires comme marque de repère. Si ça ne tenait que sur une
ligne on pourrait faire un truc du style :
perl -pi -e 's/<!-- here starts the menu--> rien <!-- here end the
menu-->/
<!-- here starts the menu--> [tout le code du menu] <!-- here end the
menu-->/g' /rep/*.html

Je sais pas si c'est plus clair...



c'est plus clair,
tu doit pouvoir faire cela en mode slurp
genre : attention c'est gready :

perl -p00i~ -e 's/<!-- here starts the menu-->.*<!-- here end the menu-->/
<!-- here starts the menu-->$ToutLeCode<!-- here end the menu-->/gm'

(non testé)

--
dominix

Avatar
Emmanuel Florac
Le Thu, 14 Apr 2005 18:27:44 +0000, Nicolas Pontoizeau a écrit :


L'idée est simple : je fais une fois le menu correctement et ensuite je
voudrais le recopier sur toutes les pages du site.


Dans ce cas, il faut plutôt utiliser un moteur de template fait pour ça,
par exemple HTML::Template est excellent et très très simple.
Sinon, quand mon besoin est simple au lieu de mettre un commentaire je
fais ça:

<div id="menu" class="menu">
%MENU%
</div>

Ensuite un script très simple remplace la "balise" %MENU% avec le MENU
qui lui est dans un autre fichier html:

fichier part.menu.html

<div id="menu1" class="menuitem><a href="truc">truc</a></div>
<div id="menu2" class="menuitem><a href="truc2">machin</a></div>
<div id="menu3" class="menuitem><a href="truc3">chouette</a></div>
<div id="menu4" class="menuitem><a href="truc4">chose</a></div>

Et le script est comme ceci (j'ai 3 éléments à insérer dans toutes les
pages : MENU, HEADER et FOOTER mais le principe est le même):

script genhtml.pl (prend en paramètre tous les fichiers à traiter)

#!/usr/bin/perl -w

use strict;

my $nomfich;
my %parms = ("header"=>'',
"menu"=>'',
"footer"=>''
);

while (my $nomfich=shift ) {
foreach (keys %parms) {
open ( TT, "<./part.$_.html") or warn "pas trouvé 'part.$_.html!'!n";
$parms{$_}=join('', <TT>);
close TT ;
}

if ( -f $nomfich) {
open (FICHIER, "<$nomfich");
my $fichier = join ('', <FICHIER>);
close FICHIER;
foreach (keys %parms) {
$fichier =~ s/%U$_%/$parms{$_}/g ;
}

open (FICHOUT, ">autogen/$nomfich")
or die "impossible d'écrire 'autogen/$nomfich'!";
print FICHOUT $fichier;
close FICHOUT;

} else { warn "'$nomfich' pas trouvé...";}
}





--
entia non sont multiplicanda praeter necessitatem.
Guillaume d'Ockham.

Avatar
kurtz_le_pirate
"Nicolas Pontoizeau" <pontoize*NOSPAM*@Efrei.fr.invalid> a écrit dans le
message de news:slrnd5tbrd.q7l.pontoize*NOSPAM*@choam.unix.efrei.fr...
Je n'ai pas vraiment compris ton problème, mais si ton HTML est du XHTML
tu peux utiliser un parseur XML. En l'occurence un processeur SAX te
permettrait de distinguer facilement ce qui se trouve entre tes
commentaires.


Ok merci pour l'info, malheureusement ce n'est pas tout le temps du
xml bien formé que je traite.

L'idée est simple : je fais une fois le menu correctement et ensuite je
voudrais le recopier sur toutes les pages du site. Pour cela j'ai mis
des commentaires comme marque de repère. Si ça ne tenait que sur une
ligne on pourrait faire un truc du style :
perl -pi -e 's/<!-- here starts the menu--> rien <!-- here end the
menu-->/

<!-- here starts the menu--> [tout le code du menu] <!-- here end the
menu-->/g' /rep/*.html

- Promotion EFREI 2005

pourquoi ne pas utiliser ssi plutot que perl ?
tu fais un include de ton fichier texte qui contient ton menu


Avatar
Nicolas Pontoizeau

"Nicolas Pontoizeau" <pontoize*NOSPAM*@Efrei.fr.invalid> a écrit dans le
message de news: slrnd5tbrd.q7l.pontoize*NOSPAM*@choam.unix.efrei.fr...
...

L'idée est simple : je fais une fois le menu correctement et ensuite je
voudrais le recopier sur toutes les pages du site. Pour cela j'ai mis
des commentaires comme marque de repère. Si ça ne tenait que sur une
ligne on pourrait faire un truc du style :
perl -pi -e 's/<!-- here starts the menu--> rien <!-- here end the
menu-->/
<!-- here starts the menu--> [tout le code du menu] <!-- here end the
menu-->/g' /rep/*.html

Je sais pas si c'est plus clair...



c'est plus clair,
tu doit pouvoir faire cela en mode slurp
genre : attention c'est gready :

perl -p00i~ -e 's/<!-- here starts the menu-->.*<!-- here end the menu-->/
<!-- here starts the menu-->$ToutLeCode<!-- here end the menu-->/gm'


j'ai testé (je passe le fichier a traiter en argument) est ça m'a rien donné :

#!/bin/bash

CODE=$(cat menu.txt)

perl -p00i~ -e 's/<!-- here starts the menu-->.*<!-- here end the menu-->/$CODE/gm' $1

mais c'est sûrement pas la meilleure technique en y réfléchissant...

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005


Avatar
Nicolas Pontoizeau
pourquoi ne pas utiliser ssi plutot que perl ?
tu fais un include de ton fichier texte qui contient ton menu


Oui c'est une bonne idée! Mais qu'est ce que c'est ssi? J'ai pas trouvé
dans le cache debian. C'est un preprocesseur de texte ou un truc du
style?

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

Avatar
Nicolas George
"kurtz_le_pirate" wrote in message
<425f6345$0$2013$:
tu fais un include de ton fichier texte qui contient ton menu


Pour que le travail soit fait une seule fois et pas à chaque chargement de
la page ?

Avatar
Nicolas Pontoizeau
Dans ce cas, il faut plutôt utiliser un moteur de template fait pour ça,
par exemple HTML::Template est excellent et très très simple.
Sinon, quand mon besoin est simple au lieu de mettre un commentaire je
fais ça:


C'est un module perl. J'irai voir.

<div id="menu" class="menu">
%MENU%
</div>

Ensuite un script très simple remplace la "balise" %MENU% avec le MENU
qui lui est dans un autre fichier html:

fichier part.menu.html

<div id="menu1" class="menuitem><a href="truc">truc</a></div>
<div id="menu2" class="menuitem><a href="truc2">machin</a></div>
<div id="menu3" class="menuitem><a href="truc3">chouette</a></div>
<div id="menu4" class="menuitem><a href="truc4">chose</a></div>


j'ai mis un menu plus long style :
<!-- here starts the menu-->

<div id="topmenu">

<div id="menu">
<dl>
<dt class="main" onmouseout="HideDelay();" onmouseover="Show('smenu1');"><a href="index.html" onmouseover="Show('smenu1')" >&nbsp;Home</a></dt>
<dd style="display: none;" id="smenu1" onmouseover="CancelHide();" onmouseout="HideDelay();" >
<ul>

[...] ~ 100 lignes mais je ne pense que ça pose un réel problème.

Et le script est comme ceci (j'ai 3 éléments à insérer dans toutes les
pages : MENU, HEADER et FOOTER mais le principe est le même):

script genhtml.pl (prend en paramètre tous les fichiers à traiter)


$ sudo genhtml.pl svc_bdrp.html
pas trouvé 'part.footer.html!'!
readline() on closed filehandle TT at /usr/local/bin/genhtml.pl line 14.
pas trouvé 'part.header.html!'!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ erreur normale

readline() on closed filehandle TT at /usr/local/bin/genhtml.pl line 14.
impossible d'écrire 'autogen/svc_bdrp.html'! at /usr/local/bin/genhtml.pl line 26.

Là je comprends pas (ça vient surement du fait que je n'ai jamais fait de perl)

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005

Avatar
Nicolas Pontoizeau
"kurtz_le_pirate" wrote in message
<425f6345$0$2013$:
tu fais un include de ton fichier texte qui contient ton menu


Pour que le travail soit fait une seule fois et pas à chaque chargement de
la page ?


? Non je pense qu'il voulait dire de mettre dans la page :

#include "menu.txt"

puis de faire :
$cpp svc_bdrp.html > svc_bdrpc.html
svc_bdrp.html:70:186: caractère ' de terminaison manquant

Bon là je viens de tester avec cpp le processeur de texte du C dispo
partout je pense (même sous windows non?). Quelques truc à regler (là
encore je comprends pas le message d'erreur) mais sinon ça fait bien le
boulot en rajoutant quelques commentaires parasites en début et fin
d'include.

--
http://www.nicolas.pontoizeau.org/
Nicolas Pontoizeau - Promotion EFREI 2005


1 2 3