Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

indenter un code html par vba

patricktoulon

XLDnaute Barbatruc
bonjour a tous
je cherche a créer un indenteur de code html et ça fait longtemps que je cherche
j'ai du mal avec les textnodes et/ou les fermeture de balise
si vous avez des idées je suis preneur

le model1
l'ai un soucis pour indenter les textnodes
VB:
Option Explicit
Sub test()
    Dim code$, i&, elem As Object, t, x&
    code = "<html><body><div><font color=red>toto<B>la <em>grosse</em> fritte</b></font><font><S>toto</s><B>la grosse anguille</b></font></div></body></html>"
    With CreateObject("htmlfile")
        .body.innerhtml = code
        For Each elem In .body.all: elem.setattribute "esp", 0: Next: code = .body.innerhtml    '  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+5 par rapport a son parent direct
        For Each elem In .body.all
            If i >= 1 Then elem.setattribute "esp", Val(elem.parentelement.getattribute("esp")) + 5
            i = i + 1
        Next
        code = .body.innerhtml
        For Each elem In .body.all
            code = Replace(code, "</" & elem.tagname & ">", "</" & elem.tagname & " esp=""" & elem.getattribute("esp") & """>")
        Next    '  on inscrit aussi l'attribut esp  adans toutes !!!! les fermetures de balise  elements(c'est provisoire!!!)
        code = Replace(code, "<", vbCrLf & "<")
    End With
    MsgBox "element avec attribut nombre de tab " & vbCrLf & code 'voir le code avec les attribut

    t = Split(code, vbCrLf)
    For i = LBound(t) To UBound(t)
        If InStr(t(i), "esp") > 0 Then
            x = Val(Split(t(i), "esp=""")(1))
            t(i) = String(x, " ") & t(i)
        End If
    Next
    code = Join(t, vbCrLf)
    For i = 0 To 10000
        If InStr(1, code, "esp=""", vbTextCompare) > 0 Then code = Replace(code, "esp=""" & i & Chr(34), "") else exit for
    Next
    MsgBox "code indenté" & vbCrLf & Replace(code, " >", ">")
End Sub

le model2
pareil je ne sais pas comment aligner les textnodes et les fermetures de balise
VB:
Option Explicit
Sub test2()
    Dim code, i&, x&, elem As Object, t
    code = "<html><body><div><font color=red>toto<B>la <em>grosse</em> fritte</b></font><font><S>toto</s><B>la frosse anguille</b></font></div></body></html>"
    With CreateObject("htmlfile")
        .body.innerhtml = code
        For Each elem In .body.all: elem.setattribute "esp", 0: Next: code = .body.innerhtml    '  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 .body.all
            If i >= 1 Then elem.setattribute "esp", Val(elem.parentelement.getattribute("esp")) + 5
            i = i + 1
        Next
        code = .body.innerhtml
        For Each elem In .body.all
            code = Replace(code, elem.outerhtml, vbCrLf & elem.outerhtml)
        Next    '  on donne l'attribut esp =1 a tout!!!! les elements(c'est provisoire!!!)
        code = Replace(code, "><", ">" & vbCrLf & "<")
    End With
    MsgBox "element avec attribut nombre de tab " & vbCrLf & code

    t = Split(code, vbCrLf)
    For i = LBound(t) To UBound(t)
        If InStr(t(i), "esp") > 0 Then
            x = Val(Split(t(i), "esp=""")(1))
            t(i) = String(x, " ") & t(i)
        End If
    Next
    code = Join(t, vbCrLf)
    For i = 0 To 10000
        If InStr(1, code, "esp=""", vbTextCompare) > 0 Then code = Replace(code, "esp=""" & i & Chr(34), "")
    Next
    MsgBox "code indenté" & vbCrLf & code
End Sub
 
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour Patrick,
il faut utiliser les expressions régulières!

je suis moins compétant que toi sur le sujet mais je sais que tu peux également indenter le <Body,<Table,<TD,<TR etc...

j'avais un collègue qui mettait en forme des requêtes SQL avec indentation avec tabulation!
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour robert
je me suis dit si robert passe par par là je mange mon clavier
les tagname importent peu
c'est les textnodes et fermetures de balises qui me posent problème

exemple avec ceci
<font> bonjour<em>robert</em></font>
j'arrive à (les traits d'unions représentent des espaces)
<font> bonjour
----<em>robert</em>
</font>


et je voudrais arriver à
<font>
---bonjour
//ceci est un textnode
----<em>robert</em>
</font>
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…