This is split up into two different macro modules, one named Utilities, and the other named what ever you want. Then add them to your Visual Studio tool bar so you have something convenient you can click on (Right click the tool bar, click Customize, click Commands, then Macros under categories, find what you named the macro and then drag it up to your tool bar. You can either drag it to an existing tool strip, or create your own. Finally right click on the item while still in customize mode and add an image).
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module MoreMacros
Public Sub AspTextLiteral()
Dim resx as ProjectItem = DTE.ActiveWindow.Object.GetItem("solution\project\folder\ResourceFile.resx")
Utilities.AspTextLiteral(resx)
End Sub
Public Sub InQuoteLiteral()
DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate()
Dim resx as ProjectItem = DTE.ActiveWindow.Object.GetItem("solution\project\folder\ResourceFile.resx")
Utilities.InQuoteLiteral(resx)
End Sub
End Module
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports System.Xml
Public Module Utilities
Public Sub AspTextLiteral(ByRef resourceFile As ProjectItem)
Const literalFormat = "<asp:Literal runat=""server"" Text=""<%$ Resources:{0},{1}%>"" />"
Const inQuotesFormat = "<%$ Resources:{0},{1}%>"
LiteralReplacer(resourceFile, literalFormat, 4)
End Sub
Public Sub InQuoteLiteral(ByRef resourceFile As ProjectItem)
Const inQuotesFormat = "<%$ Resources:{0},{1}%>"
LiteralReplacer(resourceFile, inQuotesFormat, 3)
End Sub
Private Sub LiteralReplacer(ByRef resourceFile As ProjectItem, ByVal template As String, ByVal delete As Int16)
Dim ts As TextSelection = DTE.ActiveDocument.Selection
Dim name As String = StripNonAllowedChars(ts.Text).Trim.ToLower
Dim value As String = ts.Text
Dim path As String = resourceFile.Properties.Item("LocalPath").Value
Dim resName As String = System.IO.Path.GetFileNameWithoutExtension(resourceFile.Name)
name = AddResourceEntry(path, name, value)
ts.Text = String.Format(template, resName, name)
DTE.ActiveDocument.Selection.Delete(delete)
End Sub
'Returns the value of the name used
Public Function AddResourceEntry(ByRef resourceFilePath As String, ByVal name As String, ByVal value As String) As String
Dim doc As XmlDocument = New XmlDocument
doc.Load(resourceFilePath)
'See if it exists first
Dim root As XmlElement = doc.DocumentElement
Dim e As XmlElement = root.SelectSingleNode(String.Format("data[@name=""{0}""]", name))
If e Is Nothing Then
name = CreateUniqueName(root, name)
Dim elem As XmlElement = CreateResourceFileElement(doc, name, value)
root.AppendChild(elem)
Else
If e.SelectSingleNode("value").InnerText.ToLower = value.ToLower Then
Return name
Else
name = CreateUniqueName(root, name)
Dim elem As XmlElement = CreateResourceFileElement(doc, name, value)
root.AppendChild(elem)
End If
End If
doc.Save(resourceFilePath)
Return name
End Function
Private Function CreateUniqueName(ByRef root As XmlElement, ByVal name As String) As String
If IsNumeric(name.Substring(0, 1)) Then
name = "n" & name
End If
'Name doesn't exist, use it
If Not CheckNameExists(root, name) Then
Return name
End If
Dim result As String
'Build a unique name
For I As Int16 = 1 To 100
result = name & I
If Not CheckNameExists(root, result) Then
Return result
End If
Next
Return name & Guid.NewGuid.ToString
End Function
Private Function CheckNameExists(ByRef root As XmlElement, ByVal name As String) As Boolean
Dim e As XmlElement = root.SelectSingleNode(String.Format("data[@name=""{0}""]", name))
Return Not (e Is Nothing)
End Function
Private Function CreateResourceFileElement(ByRef doc As XmlDocument, ByVal name As String, ByVal value As String) As XmlElement
Dim result As XmlElement = doc.CreateElement("data")
SetAttribute(result, "name", name)
SetAttribute(result, "xml:space", "preserve")
Dim valueElem As XmlElement = doc.CreateElement("value")
valueElem.InnerText = value
result.AppendChild(valueElem)
Return result
End Function
Private Function SetAttribute(ByRef element As XmlElement, ByVal attr As String, ByVal value As String) As XmlElement
If element.Attributes.GetNamedItem(attr) Is Nothing Then
Dim attrib As XmlAttribute = element.OwnerDocument.CreateAttribute(attr)
attrib.Value = value
element.Attributes.Append(attrib)
Else
element.Attributes.Item(attr).Value = value
End If
Return element
End Function
Private Function StripNonAllowedChars(ByVal text As String) As String
Const non_allowed = """';:,<.>/?\|`~!@#$%^&*()-=+[{]} "
For I As Integer = 0 To non_allowed.Length - 1
text = text.Replace(non_allowed(I).ToString, "")
Next
Return text
End Function
End Module