使用IDE宏遍历代码中的非ASCII字符

    在产品开发的时候,虽然大家知道需要做I18N的支持。不过在开发代码的过程中,由于需要首先关注逻辑实现,所以文件中也难免会hardcode中文文字什么的。在代码的UI描述和业务逻辑都很稳定后,最后还需要清理一下代码中是否还有中文资源,因为那些类似错误提示一类的描述,在程序未出错时Tester几乎是无法发现的。

    不过这个检查如果靠眼睛看,也是非常之郁闷的事情,那么除了编写额外的工具分析文档,还有没有其它简单又自动的方法帮我们解决问题呢?由于VS.NET 2003给我提供了非常强大的宏功能(可以在宏中使用.NET Framework类库!),所以对于这种小case使用宏来解决就太合适不过了。下面这个宏的功能就是在当前文档中找出非ASCII字符,并把出现的行号和内容输出到Output工具窗口中。代码如下:
使用IDE宏遍历代码中的非ASCII字符Imports EnvDTE
使用IDE宏遍历代码中的非ASCII字符Imports System.Windows.Forms
使用IDE宏遍历代码中的非ASCII字符Imports System.Text
使用IDE宏遍历代码中的非ASCII字符Imports System.Globalization
使用IDE宏遍历代码中的非ASCII字符Imports System.Text.RegularExpressions
使用IDE宏遍历代码中的非ASCII字符Imports System.Diagnostics
使用IDE宏遍历代码中的非ASCII字符Imports MyMacros.Util
使用IDE宏遍历代码中的非ASCII字符
使用IDE宏遍历代码中的非ASCII字符使用IDE宏遍历代码中的非ASCII字符Public Module BirdshomeModule Birdshome
使用IDE宏遍历代码中的非ASCII字符使用IDE宏遍历代码中的非ASCII字符    Sub FindChineseWords()Sub FindChineseWords()
使用IDE宏遍历代码中的非ASCII字符        Dim doc As Document = DTE.ActiveDocument
使用IDE宏遍历代码中的非ASCII字符        Dim docText As TextDocument = doc.Object
使用IDE宏遍历代码中的非ASCII字符        Dim lineCount = docText.EndPoint.Line
使用IDE宏遍历代码中的非ASCII字符        Dim ep As EditPoint = docText.StartPoint.CreateEditPoint()
使用IDE宏遍历代码中的非ASCII字符        Dim strLine As String
使用IDE宏遍历代码中的非ASCII字符        Dim i As Integer
使用IDE宏遍历代码中的非ASCII字符        Dim regex As Regex = New Regex("[^\u0000-\u00ff]+")
使用IDE宏遍历代码中的非ASCII字符        Dim strbResult As StringBuilder = New StringBuilder
使用IDE宏遍历代码中的非ASCII字符        For i = 1 To lineCount - 1
使用IDE宏遍历代码中的非ASCII字符            strLine = ep.GetLines(i, i + 1)
使用IDE宏遍历代码中的非ASCII字符            Dim m As MatchCollection = regex.Matches(strLine)
使用IDE宏遍历代码中的非ASCII字符            If m.Count > 0 Then
使用IDE宏遍历代码中的非ASCII字符                strbResult.Append(i.ToString())
使用IDE宏遍历代码中的非ASCII字符                strbResult.Append(". ")
使用IDE宏遍历代码中的非ASCII字符                Dim j As Integer
使用IDE宏遍历代码中的非ASCII字符                For j = 0 To m.Count - 1
使用IDE宏遍历代码中的非ASCII字符                    strbResult.Append(m(j).Value)
使用IDE宏遍历代码中的非ASCII字符                    strbResult.Append(", ")
使用IDE宏遍历代码中的非ASCII字符                Next
使用IDE宏遍历代码中的非ASCII字符                strbResult.Length = strbResult.Length - 2
使用IDE宏遍历代码中的非ASCII字符                strbResult.Append(";")
使用IDE宏遍历代码中的非ASCII字符                strbResult.Append(System.Environment.NewLine)
使用IDE宏遍历代码中的非ASCII字符            End If
使用IDE宏遍历代码中的非ASCII字符        Next
使用IDE宏遍历代码中的非ASCII字符        'MessageBox.Show(strbResult.ToString)
使用IDE宏遍历代码中的非ASCII字符
        Dim win As Window = DTE.Windows.Item(Constants.vsWindowKindCommandWindow)
使用IDE宏遍历代码中的非ASCII字符        Dim target As Object
使用IDE宏遍历代码中的非ASCII字符        If (DTE.ActiveWindow Is win) Then
使用IDE宏遍历代码中的非ASCII字符            target = win.Object
使用IDE宏遍历代码中的非ASCII字符        Else
使用IDE宏遍历代码中的非ASCII字符            target = GetOutputWindowPane("Chinese Words")
使用IDE宏遍历代码中的非ASCII字符            target.clear()
使用IDE宏遍历代码中的非ASCII字符        End If
使用IDE宏遍历代码中的非ASCII字符        target.OutputString(strbResult.ToString())
使用IDE宏遍历代码中的非ASCII字符    End Sub
使用IDE宏遍历代码中的非ASCII字符End Module

    方法GetOutputWindowPane在如下公用模块中:
使用IDE宏遍历代码中的非ASCII字符Imports EnvDTE
使用IDE宏遍历代码中的非ASCII字符Imports System.Diagnostics
使用IDE宏遍历代码中的非ASCII字符
使用IDE宏遍历代码中的非ASCII字符使用IDE宏遍历代码中的非ASCII字符Public Module UtilModule Util
使用IDE宏遍历代码中的非ASCII字符使用IDE宏遍历代码中的非ASCII字符    Function GetOutputWindowPane()Function GetOutputWindowPane(ByVal Name As StringOptional ByVal show As Boolean = TrueAs OutputWindowPane
使用IDE宏遍历代码中的非ASCII字符        Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
使用IDE宏遍历代码中的非ASCII字符        If show Then win.Visible = True
使用IDE宏遍历代码中的非ASCII字符        Dim ow As OutputWindow = win.Object
使用IDE宏遍历代码中的非ASCII字符        Dim owpane As OutputWindowPane
使用IDE宏遍历代码中的非ASCII字符        Try
使用IDE宏遍历代码中的非ASCII字符            owpane = ow.OutputWindowPanes.Item(Name)
使用IDE宏遍历代码中的非ASCII字符        Catch e As System.Exception
使用IDE宏遍历代码中的非ASCII字符            owpane = ow.OutputWindowPanes.Add(Name)
使用IDE宏遍历代码中的非ASCII字符        End Try
使用IDE宏遍历代码中的非ASCII字符        owpane.Activate()
使用IDE宏遍历代码中的非ASCII字符        Return owpane
使用IDE宏遍历代码中的非ASCII字符    End Function
使用IDE宏遍历代码中的非ASCII字符End Module
// 多写写VB,觉得它的语法还是挺自然的:)

    以中文google首页的html代码(Formatted by IDE)为示例,运行本脚本代码的结果如下图:
    使用IDE宏遍历代码中的非ASCII字符

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

上一篇:iOS 使用AFNetworking


下一篇:细谈WEB标准