0 votes

Besoin d'aide pour améliorer une macro Visual Studio

Voici ma macro actuelle

Public Module CopyrightCode
    Sub AddCopyrightHeader()

        Dim doc As Document
        Dim docName As String
        Dim companyName As String = "Urban Now"
        Dim authorName As String = "Chase Florell"
        Dim authorEmail As String = "chase@infinitas.ws"
        Dim copyrightText As String = "'     All code is Copyright © " & vbCrLf & _
        "'      -   Urban Now (http://mysite.com)" & vbCrLf & _
        "'      -   Infinitas Advantage (http://infinitas.ws)" & vbCrLf & _
        "'     All Rights Reserved"

        ' Get the name of this object from the file name
        doc = DTE.ActiveDocument

        ' Get the name of the current document
        docName = doc.Name

        ' Set selection to top of document
        DTE.ActiveDocument.Selection.StartOfDocument()
        DTE.ActiveDocument.Selection.NewLine()

        Dim sb As New StringBuilder
        sb.Append("' --------------------------------")
        sb.Append(vbCrLf)
        sb.Append("' <copyright file='" & docName & "' company='" & companyName & "'>")
        sb.Append(vbCrLf)
        sb.Append(copyrightText)
        sb.Append(vbCrLf)
        sb.Append("' </copyright>")
        sb.Append(vbCrLf)
        sb.Append("' <author>" & authorName & "</author>")
        sb.Append(vbCrLf)
        sb.Append("' <email>" & authorEmail & "</email>")
        sb.Append(vbCrLf)
        sb.Append("' <lastedit>" & FormatDateTime(Date.Now, vbLongDate) & "</lastedit>")
        sb.Append(vbCrLf)
        sb.Append("' ---------------------------------")

        ' Write first line
        DTE.ActiveDocument.Selection.LineUp()
        DTE.ActiveDocument.Selection.Text = sb.ToString

    End Sub
End Module

Ce que je dois faire, c'est d'abord rechercher dans le fichier la ligne ' <lastedit>Monday, July 05, 2010</lastedit> (évidemment sous forme de REGEX car la date sera toujours différente)

et s'il existe, remplacez la date par la date du jour, et s'il n'existe pas, exécutez l'insertion complète.

Ensuite, ce que je veux faire, c'est qu'à chaque fois que je ferme un fichier, la macro s'exécute pour mettre à jour la date d'édition.

1voto

Peter Boughton Points 49510

Je ne suis pas sûr de ce que vous faites, mais s'il s'agit de XML (comme cela semble être le cas), vous devriez utiliser XQuery ou autre pour localiser/mettre à jour le nœud lastedit, puisque cela gérera les complexités des commentaires, de l'imbrication et ainsi de suite.

Si vous êtes sûr de la nature du texte à saisir et que vous êtes certain qu'il n'y a pas d'éléments indésirables, vous pouvez faire correspondre ce format de date spécifique de manière rapide et pratique :

<lastedit>\w{6,9}, \w{3,9} \d\d, \d{4}</lastedit>

Ou encore plus rapide et plus sale :

<lastedit>[^<]+<lastedit>

Cela dépend de vos besoins, de votre confiance dans le contenu du fichier, etc.

Oh. J'étais donc curieux et j'ai cherché à savoir comment Visual Studio fait ses regex, et bien... La personne qui a créé la regex VS doit être frappée à la tête. .

Traduisez la regex standard ci-dessus en regex VS, vous obtenez ceci :

\<lastedit\>:i+, :i+ :d:d, :d:d:d:d\</lastedit\>

et

\<lastedit\>[^<]+</lastedit\>

Peut-être. C'est difficile à lire la documentation parce que Microsoft ne semble pas vouloir écrire des sites web qui fonctionnent dans les navigateurs modernes.

Bien sûr, cela suppose que les macros utilisent cette regex insensée au lieu de la regex .NET normale - si c'est cette dernière, la partie supérieure sera correcte et vous pouvez ignorer cette folie :)

Pour la mise en œuvre, essayez quelque chose comme ceci :

Dim reLastEdit As Regex = New Regex("<lastedit>[^<]+<lastedit>")

Dim matches AS MatchCollection = reLastEdit.Matches(Input)

If matches.Count > 0
Then
    ' Change Header
    Dim NewLastEdit As String = "<lastedit>" & FormatDateTime(Date.Now, vbLongDate) & "</lastedit>"
    reLastEdit.Replace(Input,NewLastEdit)
Else
    ' Add Header
EndIf

Ou similaire. Info ici : http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex_methods.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X