Bonjour,
Je cherche une fonction pour indenter des fichiers html bruts (c'est à dire sans saut à la ligne, ni indentation) généré par Excel.
Pouvez-vous s'il vous plaît m'aviser ?
Merci par avance !
Version imprimable
Bonjour,
Je cherche une fonction pour indenter des fichiers html bruts (c'est à dire sans saut à la ligne, ni indentation) généré par Excel.
Pouvez-vous s'il vous plaît m'aviser ?
Merci par avance !
bonjour
La sub pour tester la fonction avec le texte ci dessus :Citation:
il n'est pas si facile d'indenter un code html automatiquement
voici quand meme ma methode issue de mon wysiwyg vba perso
La fonction :Code:
1
2
3
4 Sub test() html$ = " <P><font color=""red"">il n'est pas si <i><B>facile</B></i></font><font color=""blue""> d'indenter un <S>code html</S></font> <U>automatiquement</U></P><P> <i>voici quand meme ma methode</i> <B>issue de mon wysiwyg vba perso</B></P>" MsgBox indented_code(html) End Sub
elle a quelque defaut notament l'indentation de fermeture de balise body mais on y vois largement plus clair apres ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 Function indented_code(html As String) As String Dim doc As Object, I&, elem As Object, code$, EL1$, EL2$, TbL Set doc = CreateObject("htmlfile") 'creation d'un htmldocument en memoire(late binding) With doc .body.innerhtml = html 'inscription du code dans le htmldocument For Each elem In .all: elem.setattribute "esp", 1: Next ' on donne l'attribut esp =1 a tout!!!! les elements(c'est provisoire!!!) 'maintenant on modifie cet attribut en fonction du parentelement de chaque elements+2 par rapport a son parent directe For Each elem In .all If I >= 1 Then elem.setattribute "esp", Val(elem.parentelement.getattribute("esp")) + 2 I = I + 1 Next code = .all(0).outerhtml 'on re recupere le code ainsi modifié dans la variable code 'comme il y a de forte chance que des elements soient imbriqués (enfant,subenfant,etc...) 'on met l'attribut dans la fin de chaque balises 'comme cela l'ors de l'indentation la fermeture chaque de balise aura le meme indice que son ouverture meme si entre le debut et la fin il y a des sub enfants For Each elem In .all(0).all EL1 = elem.outerhtml EL2 = Replace(EL1, Mid(EL1, InStrRev(EL1, "</") + 2), elem.tagname & " esp=""" & elem.getattribute("esp") & """" & ">") code = Replace(code, EL1, EL2) Next code = Replace(code, "<", vbCrLf & "<") 'on ajoute maintenant un saut de ligne avant les "<" TbL = Split(code, vbCrLf) 'on coupe le code par les sauts de lignes For I = 0 To UBound(TbL) If TbL(I) Like "*esp*" Then X = Val(Split(TbL(I), "esp=""")(1)) 'on repere la valeur de l'attribut TbL(I) = String(X, " ") & TbL(I) 'on a joute devant le outerhtml le meme nombre d'espace que la valeur des attributs End If Next ' il y a forcement maintenant des fermetures de balises sans enfant qui sont dans la ligne du dessous ' il n'est pas necessaire de les laisser tel quel For I = UBound(TbL) To 1 Step -1 If TbL(I) Like "*esp*" And TbL(I - 1) Like "*esp*" Then If Replace(Split(TbL(I), "esp")(0), "/", "") = Split(TbL(I - 1), "esp")(0) Then 'si la fermeture est sur la ligne en dessous TbL(I - 1) = TbL(I - 1) & Replace(TbL(I), " ", "") 'on la rameme sur la ligne d'ouverture de balise TbL(I) = "" 'on supprime la ligne de la fermeture de balise End If End If Next 'encore une petite etape et c'est presque fini 'suppression des lignes vides code = "" For I = 0 To UBound(TbL) If TbL(I) <> "" Then code = code & TbL(I) & vbCrLf Next ' 'youpi!!!le code est maintenant indenté 'il nous reste plus qu'a supprimer les atributs qui nous ont servi de repere pour l'indentation ,on en a plus besoins 'au passage on supprime aussi quelques espaces a l'interieur des symboles de balise(outertext) For I = 1 To 1000 code = Replace(Replace(code, "esp=""" & I & """", ""), " >", ">") Next End With Debug.Print code indented_code = code End Function
Pièce jointe 428533
re
je n'avais jamais pris le temps depuis 2 ans ,de coriger les NODETEXT
pour le coup c'est fait
j'ai aussi ajouté un argument "large_indenter" pour que l'indentation puisse etre visuellement parlant plus significative
La sub pour tester avec une indentation de 8 espaces :
La fonction :Code:
1
2
3
4 Sub test() html$ = " <P><font color=""red"">il n'est pas si <i><B>facile</B></i></font><font color=""blue""> d'indenter un <S>code html</S></font> <U>automatiquement</U></P><P> <i>voici quand meme ma methode</i> <B>issue de mon wysiwyg vba perso</B></P>" MsgBox indented_code(html, 8) End Sub
le visuel en mode internet ne change pasCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 Function indented_code(html As String, Optional large_indenter As Long = 2) As String Dim doc As Object, I&, elem As Object, code$, EL1$, EL2$, TbL Set doc = CreateObject("htmlfile") 'creation d'un htmldocument en memoire(latebinding) With doc .body.innerhtml = html 'inscription du code dans le htmldocument For Each elem In .all: elem.setattribute "esp", 1: Next ' on donne l'attribut esp =1 a tout!!!! les elements(c'est provisoire!!!) 'maintenant on modifie cet attribut en fonction du parentelement de chaque elements+2 par rapport a son parent directe For Each elem In .all If I >= 1 Then elem.setattribute "esp", Val(elem.parentelement.getattribute("esp")) + large_indenter I = I + 1 Next code = .all(0).outerhtml 'on re recupere le code ainsi modifié dans la variable code 'comme il y a de forte chance que des elements soient imbriqués (enfant,subenfant,etc...) 'on met l'attribut dans la fin de chaque balises 'comme cela l'ors de l'indentation la fermeture chaque de balise aura le meme indice que son ouverture meme si entre le debut et la fin il y a des sub enfants For Each elem In .all(0).all EL1 = elem.outerhtml EL2 = Replace(EL1, Mid(EL1, InStrRev(EL1, "</") + 2), elem.tagname & " esp=""" & elem.getattribute("esp") & """" & ">") code = Replace(code, EL1, EL2) Next code = Replace(code, "<", vbCrLf & "<") 'on ajoute maintenant un saut de ligne avant les "<" TbL = Split(code, vbCrLf) 'on coupe le code par les sauts de lignes For I = 0 To UBound(TbL) If TbL(I) Like "*esp*" Then X = Val(Split(TbL(I), "esp=""")(1)) 'on repere la valeur de l'attribut TbL(I) = String(X, " ") & TbL(I) 'on a joute devant le outerhtml le meme nombre d'espace que la valeur des attributs End If Next ' il y a forcement maintenant des fermetures de balises sans enfant qui sont dans la ligne du dessous ' il n'est pas necessaire de les laisser tel quel For I = UBound(TbL) To 1 Step -1 If TbL(I) Like "*esp*" And TbL(I - 1) Like "*esp*" Then If Replace(Split(TbL(I), "esp")(0), "/", "") = Split(TbL(I - 1), "esp")(0) Then 'si la fermeture est sur la ligne en dessous TbL(I - 1) = TbL(I - 1) & Replace(TbL(I), " ", "") 'on la rameme sur la ligne d'ouverture de balise TbL(I) = "" 'on supprime la ligne de la fermeture de balise End If End If Next 'encore une petite etape et c'est presque fini 'suppression des lignes vides code = "" For I = 0 To UBound(TbL) 'If TbL(I) <> "" Then code = code & TbL(I) & vbCrLf If TbL(I) <> "" Then code = code & IIf(TbL(I) Like "*<*" And Right(TbL(I), 1) <> ">", Split(TbL(I), ">")(0) & ">" & vbCrLf & Split(TbL(I), "<")(0) & String(large_indenter, " ") & Split(TbL(I), ">")(1) & " //NODETEXT" & vbCrLf, TbL(I) & vbCrLf) Next ' 'youpi!!!le code est maintenant indenté 'il nous reste plus qu'a supprimer les atributs qui nous ont servi de repere pour l'indentation ,on en a plus besoins 'au passage on supprime aussi quelques espaces a l'interieur des symboles de balise(outertext) For I = 1 To 1000 code = Replace(Replace(code, "esp=""" & I & """", ""), " >", ">") Next End With Debug.Print code indented_code = code End Function
Pièce jointe 428599
edit :
j'oubliais un exemple d'indentation de code d'un fichier local avec le meme code html
Code:
1
2
3
4
5
6
7 Sub test2() Dim html$, x&, fichier$ fichier = "C:\Users\polux\DeskTop\aaaaaaaaa.html" x = FreeFile Open fichier For Binary Access Read As #x: html = String(LOF(x), " "): Get #x, , html: Close #x MsgBox indented_code(Replace(html, vbCrLf, ""), 8) End Sub