Нужна помощь в улучшении макроса Visual Studio - PullRequest
0 голосов
/ 05 июля 2010

Вот мой текущий макрос

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

Что мне нужно сделать, это сначала выполнить поиск файла для строки ' <lastedit>Monday, July 05, 2010</lastedit> (очевидно, как REGEX, потому что дата всегда будет отличаться)

и, если она существует, замените дату на сегодняшнюю, и если она не запустит полную вставку.

Тогда я хочу подключиться каждый раз, когда я закрываю файл, макрос запускается вобновить дату редактирования.

1 Ответ

1 голос
/ 06 июля 2010

Я не уверен, что вы делаете, но если это XML (как это выглядит), вы должны использовать XQuery или что-то еще, чтобы найти / обновить узел lastedit, так как он будет обрабатывать различные сложностикомментарии и вложение и т. д.

Если вы уверены в том, каким будет вводимый текст, и уверены, что там нет никаких мерзостей, вы можете быстро и грязно сопоставить этот конкретный формат даты:

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

Или еще быстрее и грязнее:

<lastedit>[^<]+<lastedit>

Это зависит от ваших потребностей, от того, насколько вы уверены в содержании файла и т. Д.

Ой.Так что мне было любопытно, и я посмотрел, как Visual Studio на самом деле выполняет регулярные выражения, и хорошо ... того, кто сделал регулярное выражение VS, нужно бить по голове .

ПеревестиВыше стандартного регулярного выражения в регулярное выражение VS вы получаете следующие значения:

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

и

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

Возможно.Трудно читать документацию , потому что Microsoft, похоже, не хочет писать сайты, которые работают в современных браузерах.

Конечно, это предполагает, что макросы используют это безумное регулярное выражение вместо обычного.NET регулярное выражение - если это последнее, то верхний материал будет в порядке, и вы можете игнорировать это сумасшествие.:)

Чтобы реализовать, попробуйте что-то вроде этого:

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

или подобное.Информация здесь: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex_methods.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...