Include en html

Description

Ce script permet de combler le manque de balise Include dans un fichier HTML, comme en PHP.
Le principe n'est pas tout à fait identique. Le code à inclure doit déjà être présent dans le fichier HTML la première fois, repéré par des balises spécifiques.
Ce programme se chargera ensuite de faire les mises à jour automatiquement.
Ce script est idéal pour modifier des parties identiques sur de nombreuses pages (balises méta, link, menu, liens, ...)

Source / Exemple :


' *************************************************************************************************
' Auteur: Alain BENOIST
' Date  : Juillet 2011
' *************************************************************************************************

option explicit

' *************************************************************************************************
'
'   Déclaration des variables et constantes
'
' *************************************************************************************************

dim arrayExt(1)			' Tableau des extentions de fichiers à scruter
redim arrayFile(0)		' Tableau des fichiers à scruter, en fonction des extentions déclarées
redim arrayReport(0)	' Tableau de rapport renseigné lors du traitement
dim i					' compteur de boucle

' Constante des termes à rechercher dans les lignes de code HTML (en minuscule pour la comparaison)
const constStrRemDebut = "<!--"
const constStrInclude  = "include="
const constStrExtInc   = ".inc"
const constStrRemFin   = "-->"

const constFileReport  = "Report.txt"  ' Fichier de rapport des opérations effectuées

' ###########################################################################################################
' #############################                                                     #########################
' ############################# Vous pouvez modifier ces valeurs à votre convenance #########################
' #############################                                                     #########################
' ###########################################################################################################
arrayExt(0)           = "html"		' Extention des fichiers à scruter (plusieurs extentions possibles)
const constPathSource = "."			' Répertoire source des fichiers à scruter ("." = répertoire courant)
const constPathDestin = "temp"			' Répertoire destination des fichiers modifiés ("." = répertoire courant)
' ###########################################################################################################

' *** Recherche des fichiers à scruter dans le répertoire spécifié par constPathSource
if FolderExist(constPathSource) then 
	SearchFileByExt constPathSource, arrayExt, arrayFile, false ' true = recherche également dans les sous-répertoires 
else
	msgbox "Le répertoire [" & constPathSource & "] n'existe pas..."
	wscript.quit
end if

' *** Tri du tableau de fichiers à analyser
Tri_QuickSort arrayFile, true, true

' *** Affichage des noms des fichiers à analyser dans un msgbox
'ShowArrayInMsgbox arrayFile, 0

' *** Création du répertoire de destination des fichiers modifiés spécifié par constPathDestin
' *** s'il est différent du répertoire courant (true = on efface le répertoire pour le recréer)
if not CreateFolder(constPathDestin, true) then
	msgbox "Erreur dans la création du répertoire [" & constPathDestin & "]..."
	wscript.quit
end if

' *** Préparation du fichier de rapport
DeleteFile constFileReport
AddTxtFile constFileReport, "Include.vbs - Rapport de traitement du " & Date() & " à " & Time() & vbCrLf
AddTxtFile constFileReport, "Répertoire courant    : " & CurrentFolder(true)
AddTxtFile constFileReport, "Répertoire d'analyse  : " & constPathSource
AddTxtFile constFileReport, "Répertoire d'écriture : " & constPathDestin
AddTxtFile constFileReport, vbCrLf & string(20, "-") & vbCrLf
AddTxtFile constFileReport, "Fichier(s) à traiter  : " & UBound(arrayFile) & vbCrLf
dim nbDigit
nbDigit = len(FormatNumber(UBound(arrayFile), 0))
for i = 0 To UBound(arrayFile) - 1
	AddTxtFile constFileReport, "[" & FormatInteger(i + 1, nbDigit) & "]" & " " & arrayFile(i)
next
AddTxtFile constFileReport, ""

' *** Boucle de traitement des fichiers contenus dans le tableau arrayFile
dim nbSuccess, nbNoInclude, nbFailure
nbSuccess   = 0
nbNoInclude = 0
nbFailure   = 0
for i = 0 to UBound(arrayFile) - 1
	redim arrayReport(0)
	AddValueInArray  arrayReport, string(20, "-")
	AddValueInArray  arrayReport, ""
	TraiteIncludeInFile arrayFile(i), constPathDestin & "\" & GetFilename(arrayFile(i)), arrayReport
	AddValueInArray  arrayReport, ""
	WriteArrayInFile arrayReport, -1, -1, constFileReport
next

' *** Affichage du rapport de traitement
AddTxtFile constFileReport, string(20, "-")& vbCrLf
AddTxtFile constFileReport, "Réussite      : " & FormatInteger(nbSuccess, nbDigit)
AddTxtFile constFileReport, "Pas d'include : " & FormatInteger(nbNoInclude, nbDigit)
AddTxtFile constFileReport, "Echec         : " & FormatInteger(nbFailure, nbDigit)
AddTxtFile constFileReport, "Total         : " & FormatInteger(nbSuccess + nbNoInclude + nbFailure, nbDigit) & "/" & UBound(arrayFile)
AddTxtFile constFileReport, string(20, "-")& vbCrLf
AddTxtFile constFileReport, "Fin du traitement (" & Time() & ")"
ViewTxtFile constFileReport	

' *** Fin du programme
wscript.quit			
	
' *************************************************************************************************
'
'   Routine de traitement des fichiers
'
' *************************************************************************************************
' 
'   TraiteIncludeInFile
'
'	Traitement des fichiers afin de remplacer les lignes balisées par Include
'
'   Entrée:	FilenameSource - nom du fichier à analyser
' 			FilenameDestin - nom du fichier généré
'			TabReport      - tableau intégrant les lignes de rapport sur le traitement
'
'	Sortie:	TabReport - le tableau de rapport est transmis par référence
'
'	Nota:
'
'	Mode opératoire
'   ---------------
'	1°) Ajout de l'extention ".tmp" au fichier destination
'	2°) Analyse de chaque ligne du fichier source jusqu'à trouver la 1° balise "<!-- Include=Inc\xxxx.inc -->"
'		sinon on écrit la ligne dans le fichier temporaire
'	3°) Si la ligne est trouvée, on teste l'existence du fichier xxxx.inc
'	4°) Si le fichier existe, on parcours le fichier source jusqu'à trouver la 2° ligne (même nom de fichier inc)
'		Les lignes sources ne sont plus recopiées puiqu'elles seront remplacées
'	5°) Si la 2° balise est trouvée, on procède à l'inclusion du fichier xxxx.inc
'	6°) Les cas d'erreur suivants sont testés:
'		- pas de balise include
'		- une seule balise include
'		- le fichier à inclure n'existe pas
'	7°) En cas d'erreur, le fichier source n'est pas modifié
'	8°) En cas de réussite, le fichier destination est renommé de .tmp en son nom initial:
'		- soit dans un répertoire temporaire si celui-ci est défini dans la constante "constPathDestin"
'			Les fichiers sources ne sont pas modifiés, les fichiers générés devront être recopiés 
'		- soit il remplace le fichier d'origine si "constPathDestin" est déclaré "."
'
' *************************************************************************************************
	
sub TraiteIncludeInFile(FilenameSource, FilenameDestin, byref TabReport)
	dim oFsRead, oFtxtRead
	dim oFsWrite, oFtxtWrite
	dim Line, LineReduced, FileNameInclude, PathFileNameInclude, LenFileNameInclude, flagInclude, flagSuccess, NbInclude, strReport
	dim OccurenceRemDebut, OccurenceInclude, OccurenceFileName, OccurenceInc, OccurenceRemFin

	'instanciation pour la lecture du fichier (source)
	set oFsRead = CreateObject("Scripting.FileSystemObject") 
	set oFtxtRead = oFsRead.OpenTextFile(FilenameSource)
	
	'instanciation pour l'écriture dans le fichier FilenameDestin.tmp (destination)
	set oFsWrite = CreateObject("Scripting.FileSystemObject") 
	set oFtxtWrite = oFsWrite.CreateTextFile(FilenameDestin & ".tmp", true) ' true = Ecrase

	'on parcours chaque ligne du fichier texte source
	NbInclude = 0
	flagSuccess = true
	do while not oFtxtRead.AtEndOfStream
		Line = oFtxtRead.Readline
		LineReduced = Replace(LCase(Line)," ", "")
		OccurenceRemDebut = InStr(LineReduced, constStrRemDebut)
		OccurenceInclude  = InStr(LineReduced, constStrInclude)
		OccurenceInc      = InStr(LineReduced, constStrExtInc)
		OccurenceRemFin   = InStr(LineReduced, constStrRemFin)

		' recherche de la ligne de début de l'Include dans le fichier source
		flagInclude = false
		strReport   = FilenameSource
		if OccurenceRemDebut > 0 and OccurenceInclude > OccurenceRemDebut and OccurenceInc > OccurenceInclude and _
			OccurenceRemFin > OccurenceInc then
			NbInclude = NbInclude + 1
			LenFileNameInclude  = OccurenceInc - (OccurenceInclude + Len(constStrInclude))
			FileNameInclude     = LCase(Mid(LineReduced, OccurenceInclude + Len(constStrInclude), LenFileNameInclude) & constStrExtInc)
			PathFileNameInclude = constPathSource & "\" & FileNameInclude
			strReport = strReport & " [" & PathFileNameInclude & "]"
			
			' si le fichier à inclure existe, on recherche la ligne de fin de l'include
			if FileExist(PathFileNameInclude) then
				' recherche de la ligne de fin de l'Include dans le fichier source
				do while (Not oFtxtRead.AtEndOfStream) and not flagInclude
					Line = oFtxtRead.Readline
					LineReduced = Replace(LCase(Line)," ", "")
					OccurenceRemDebut = InStr(LineReduced, constStrRemDebut)
					OccurenceInclude  = InStr(LineReduced, constStrInclude)		
					OccurenceFileName = InStr(LineReduced, FileNameInclude)
					OccurenceInc      = InStr(LineReduced, constStrExtInc)
					OccurenceRemFin   = InStr(LineReduced, constStrRemFin)
					if OccurenceRemDebut > 0 and OccurenceInclude > OccurenceRemDebut and OccurenceFileName > OccurenceInclude and _
						OccurenceInc > OccurenceFileName and OccurenceRemFin > OccurenceInc then
						flagInclude = true
						AppendTxtOpenFile oFtxtWrite, PathFileNameInclude
						strReport = strReport & " Ok"
						AddValueInArray TabReport, strReport
					end if
				loop
				if not flagInclude then
					strReport = strReport & " Le second Include n'a pas été trouvé, arrêt du traitement."
					AddValueInArray TabReport, strReport
					flagSuccess = false
				end if
			else
				strReport = strReport & " Ce fichier n'existe pas."
				AddValueInArray TabReport, strReport
				flagSuccess = false
			end If
						
		else	
			oFtxtWrite.WriteLine(Line)
		end if
		
	loop
	
	oFtxtRead.Close
	set oFsRead = nothing

	oFtxtWrite.Close
	set oFsWrite = nothing
	
	if NbInclude = 0 then
		nbNoInclude = nbNoInclude + 1
		strReport = strReport & " Pas d'Include dans ce fichier."
		AddValueInArray TabReport, strReport
		DeleteFile FilenameDestin & ".tmp"
	else
		if flagSuccess then
			nbSuccess = nbSuccess + 1
			AddValueInArray TabReport, "********** Réussite: le fichier [" & FilenameDestin & "] a été mis à jour"
			RenameFile FilenameDestin & ".tmp", FilenameDestin, true
		else
			nbFailure = nbFailure + 1
			AddValueInArray TabReport, "********** Echec: le fichier [" & FilenameDestin & "] n'a pas été modifié"
			DeleteFile FilenameDestin & ".tmp"
		end if
	end if
		
end sub

	
' *************************************************************************************************
'
'   Procédures et fonctions du programme
'
' *************************************************************************************************

Les procédures sont dans le fichiers ZIP

Conclusion :


Mode opératoire, à titre d'exemple:
----------------------------------

Cas concrèt
-----------
Un répertoire contient toutes les pages html d'un site web.
La page index.html met en oeuvre un menu horizontal pour appeler les autres pages.
Puisque ce menu doit être présent sur toutes les pages, on utilise une IFrame afin
que les autres pages s'affichent à l'intérieur de celle-ci.
Malheureusement, tous les navigateurs ne traitent pas l'IFrame de la même manière
et l'affichage des pages est parfois mal interprétée.

La meilleure solution, si le PHP est exclu, consiste à recopier le même menu sur
chaque page HTML.
Mais le mise à jour devient vite fastidieuse, si l'on à une beaucoup de pages

Solution
--------
Créer une page modele.html, qui servira de base à la construction des autres pages.
Cette page intègrera les parties communes à toutes les pages (meta, menu, ...).
Ces parties communes seront balisées, puis chacune d'elles seront enregistrées dans
des fichiers séparés dans un répertoire spécifiques nommé "Inc".
Exemples de fichiers inc: header.inc, menu.inc, bandeau.inc, ...
'
Lors d'une modification, après avoir effectué les tests sur le fichier modele.html,
le fichier inc correspondant est mis à jour.
Il reste à exécuter le script Include.vbs, et tous les fichiers HTML sont modifiés
avec les nouvelles lignes du fichier inc.
------------------
La syntaxe est la suivante (exemple pour un fichier Include nommé Head.inc):
2 lignes de remarque formatées spécialement pour marquer le début et la fin de la portion
de code à remplacer (les tests sont réalisés sur les termes déclarés en constante).
Les mots Début et Fin n'ont pas de conséquence et peuvent être placés ailleurs.

<!-- Début Include=Head.inc --> ou Head.inc représente le fichier à inclure par remplacement
...
lignes de code à remplacer par ceux du fichier Head.inc
...
<!-- Fin Include=Inc\Head.inc --> fin de la portion de code à remplacer

Nota : Le répertoire ainsi que le type de fichiers à scruter sont à modifier plus bas
Les fichiers Include sont en chemin relatif par rapport au rétertoire HTML
- S'ils se situent dans un répertoire au même niveau que les fichiers HTML,
notez Include=Inc\Head.inc
- S'ils se situent à un niveau plus haut,
notez Include=..\Inc\Head.inc

Résultat
-------
moins de 1 seconde pour traiter 4 Include dans 27 fichiers

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.