Option Explicit
'===============================================================================
'Contexte : slc66.net - Outils
'===============================================================================
'Nom du fichier : IndenterHTML.vbs
'
'Auteur   : stephane.lecaer@slc66.net
'
'Version :	1.0	08/03/2006	Version initiale
'
'-------------------------------------------------------------------------------
'Description :
'	Indenter un fichier HTML.
'
'	Refait l'indentation du fichier HTML dont le nom est passé en paramètre
'	en s'appuyant sur les balises :
'		<head>,<body>,<table>,<tr> et <td>
'
'Utilisation :
'		IndenterHTML.vbs <nom_du_fichier>
'
'===============================================================================

'===============================================================================
'Déclaration des constantes
'===============================================================================
Const K_FSO_FOR_READING 	= 1		'FSO Mode ouverture fichier
Const K_FSO_FOR_WRITING		= 2 	
Const K_FSO_FOR_APPENDING	= 3 	
Const K_FSO_FORMAT_DEFAULT	= -2	'FSO Format fichier texte
Const K_FSO_FORMAT_UNICODE	= -1	
Const K_FSO_FORMAT_ASCII	= 0 	
Const K_FSO_FOLDER_WIN		= 0		'FSO Dossiers Spéciaux
Const K_FSO_FOLDER_SYS		= 1
Const K_FSO_FOLDER_TMP		= 2

'===============================================================================
'Déclaration des variables
'===============================================================================
Dim objArgs
Dim strFilePath
Dim strTmpFilePath
Dim strTmpFilename
Dim objFSO
Dim objTempFolder
Dim objFile
Dim objTmpFile
Dim objTextStream 
Dim strLine
Dim intNbIndent
Dim intPhase
Dim blnError

'===============================================================================
'DEBUT DU PROGRAMME
'===============================================================================

'Initialisation
'--------------
blnError = False

'Lire les arguments de la ligne de commande
'------------------------------------------
Set objArgs = WScript.Arguments

'Si un nom de fichier est passé en paramètre
'-------------------------------------------
If (objArgs.Count >= 1) Then

	'Récupérer le nom de fichier à traiter
	'-------------------------------------
	strFilePath = objArgs(0)

	Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")

	'Si le fichier existe
	'--------------------
	If objFSO.FileExists(strFilePath) Then
	
		'Créer un fichier temporaire
		'---------------------------
		Set objFile = objFSO.GetFile(strFilePath)
		Set objTempFolder = objFSO.GetSpecialFolder(K_FSO_FOLDER_TMP)
		strTmpFilename = objFSO.GetTempName    

		'Traiter en 2 passes
		'-------------------
		For intPhase = 1 to 2
		
			Select Case intPhase
				'Insérer un retour chariot après chaque balise traitée
				'-----------------------------------------------------
				Case 1
					Set objTextStream = objFile.OpenAsTextStream(K_FSO_FOR_READING, K_FSO_FORMAT_DEFAULT)
					Set objTmpFile = objTempFolder.CreateTextFile(strTmpFilename)

					Do While Not objTextStream.AtEndOfStream
						strLine = objTextStream.ReadLine
						
						If (strLine <> "") Then
							objTmpFile.WriteLine InsertCrLf(strLine)
						End if
						
					Loop
				
					objTextStream.Close
					objTmpFile.Close
					
					strTmpFilePath = objTempFolder.Path & "\\" & strTmpFilename
					objFSO.CopyFile strTmpFilePath, strFilePath
					objFSO.DeleteFile strTmpFilePath

				'Indenter le fichier
				'-------------------
				Case 2
					Set objTextStream = objFile.OpenAsTextStream(K_FSO_FOR_READING, K_FSO_FORMAT_DEFAULT)
					Set objTmpFile = objTempFolder.CreateTextFile(strTmpFilename)

					intNbIndent = 0
						
					Do While Not objTextStream.AtEndOfStream
						strLine = ReadStreamLine(objTextStream)
						
						If (strLine <> "") Then
							If Not objTextStream.AtEndOfStream Then
								objTmpFile.WriteLine Indent(intNbIndent, strLine)
							Else
								objTmpFile.Write Indent(intNbIndent, strLine)
							End if
						End if
						
					Loop
				
					objTextStream.Close
					objTmpFile.Close
					
					strTmpFilePath = objTempFolder.Path & "\\" & strTmpFilename
					objFSO.CopyFile strTmpFilePath, strFilePath
					objFSO.DeleteFile strTmpFilePath
					
			End Select
		Next
	
	End If

Else
	'Afficher l'aide
	'---------------
	WScript.Echo "IndenterHTML.vbs - 1.0                                                     " & vbCrLf & _
				 "par stephane.lecaer@slc66.net                                              " & vbCrLf & _
				 "                                                                           " & vbCrLf & _
				 "  Description :                                                            " & vbCrLf & _
				 "    Indenter un fichier HTML.                                              " & vbCrLf & _
				 "                                                                           " & vbCrLf & _
				 "    Refait l'indentation du fichier HTML dont le nom est passé en paramètre" & vbCrLf & _
				 "    en s'appuyant sur les balises :                                        " & vbCrLf & _
				 "      <head>,<body>,<table>,<tr> et <td>                                   " & vbCrLf & _
				 "                                                                           " & vbCrLf & _
				 "  Utilisation :                                                            " & vbCrLf & _
				 "    CompresserLigne.vbs <nom_du_fichier>                                   " & vbCrLf & _
				 "	                                                                         "
	
	blnError = True

End If

'Sortir du programme
'-------------------
If blnError Then
	WScript.Quit -1
Else
	WScript.Quit 0
End If

'===============================================================================
'FIN DU PROGRAMME
'===============================================================================

'==============================================================================
Private Function InsertCrLf(strLine)
Dim objRegExp

	Set objRegExp = New RegExp
	objRegExp.Global = True
	
	objRegExp.Pattern = "<br>"
	strLine = objRegExp.Replace(strLine, vbCrLf & "<br>")

	objRegExp.Pattern = "<head"
	strLine = objRegExp.Replace(strLine, vbCrLf & "<head")
	
	objRegExp.Pattern = "<body"
	strLine = objRegExp.Replace(strLine, vbCrLf & "<body")
	
	objRegExp.Pattern = "<table"
	strLine = objRegExp.Replace(strLine, vbCrLf & "<table")
	
	objRegExp.Pattern = "<tbody"
	strLine = objRegExp.Replace(strLine, vbCrLf & "<tbody")
	
	objRegExp.Pattern = "<tr"
	strLine = objRegExp.Replace(strLine, vbCrLf & "<tr")
		
	objRegExp.Pattern = "<td"
	strLine = objRegExp.Replace(strLine, vbCrLf & "<td")
	
	objRegExp.Pattern = "<\/head"
	strLine = objRegExp.Replace(strLine, vbCrLf & "</head")
	
	objRegExp.Pattern = "<\/body"
	strLine = objRegExp.Replace(strLine, vbCrLf & "</body")
	
	objRegExp.Pattern = "<\/table"
	strLine = objRegExp.Replace(strLine, vbCrLf & "</table")
	
	objRegExp.Pattern = "<\/tbody"
	strLine = objRegExp.Replace(strLine, vbCrLf & "</tbody")
	
	objRegExp.Pattern = "<\/tr"
	strLine = objRegExp.Replace(strLine, vbCrLf & "</tr")
		
	objRegExp.Pattern = "<\/td"
	strLine = objRegExp.Replace(strLine, vbCrLf & "</td")
	
	InsertCrLf = strLine
	
End Function

'==============================================================================
Private Function ReadStreamLine(objStream)
Dim strLine
Dim objRegExp

	Set objRegExp = New RegExp
	
	Do
		strLine = objStream.Readline
		
		objRegExp.Pattern = "\t"
		objRegExp.Global = True

		strLine = Trim(objRegExp.Replace(strLine, " "))
		
	Loop Until (strLine <> "") or objStream.AtEndOfStream
	
	ReadStreamLine = strLine
	
End Function

'==============================================================================
Private Function Indent(intNbIndent, strLine)
Dim objRegExpIndent
Dim objRegExpUnindent
Dim intIndent

	set objRegExpIndent = New RegExp
	set objRegExpUnIndent = New RegExp
	intIndent = intNbIndent
	
	objRegExpIndent.Pattern = "<head|<body|<table|<tr|<td"
	objRegExpIndent.IgnoreCase = True
	objRegExpIndent.Global = True
	
	objRegExpUnindent.Pattern = "<\/head|<\/body|<\/table|<\/tr|<\/td"
	objRegExpUnindent.IgnoreCase = True
	objRegExpUnindent.Global = True

	If objRegExpIndent.Test(strLine) Then
		intNbIndent = intNbIndent + 1
	End if
	
	If objRegExpUnindent.Test(strLine) Then
		intNbIndent = intNbIndent - 1
		If (intNbIndent < 0) Then
			intNbIndent = 0
		End if
		intIndent = intNbIndent
	End if
	
	Indent = String(intIndent, vbTab) & strLine
	
End Function