11

使用Google的prettify.js无法正确呈现 Visual Basic 代码。

关于堆栈溢出:

Partial Public Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'set page title
        Page.Title = "Something"
    End Sub

End Class

在 Visual Studio 中...

Visual Studio 中的 Visual Basic

我在README文档中找到了这个:

如何指定我的代码使用的语言?

您不需要指定语言,因为 prettyprint() 会猜测。您可以通过指定语言扩展名以及 prettyprint 类来指定语言,如下所示:

<pre class="prettyprint lang-html">
  The lang-* class specifies the language file extensions.
  Supported file extensions include
    "c", "cc", "cpp", "cs", "cyc", "java", "bsh", "csh", "sh",
    "cv", "py", "perl", "pl", "pm", "rb", "js",
    "html", "html", "xhtml", "xml", "xsl".
</pre>

我看不到lang-vblang-basic选项。有谁知道是否存在作为加载项?


注意:这与 Stack Overflow 的VB.NET 代码块建议有关。

4

3 回答 3

8

/编辑:我已经重写了整个帖子。

下面是 VB 高亮问题的一个非常完整的解决方案。如果 SO 没有更好的,使用它。VB 语法高亮是绝对需要的。

我还添加了一个代码示例,其中包含一些正确突出显示的复杂代码文字。但是,我什至没有尝试让 Xlinq 正确。不过,可能仍然有效。关键字列表取自 MSDN 。不包括上下文关键字。你认识GetXmlNamespace运营商吗?

该算法知道文字类型字符。它也应该能够处理标识符类型的字符,但我还没有测试过这些。请注意,该代码适用于HTML。因此,&、< 和 > 需要被读取为命名 (!) 实体,而不是单个字符。

对不起,很长的正则表达式。

var highlightVB = function(code) {
    var regex = /("(?:""|[^"])+"c?)|('.*$)|#.+?#|(&amp;[HO])?\d+(\.\d*)?(e[+-]?\d+)?U?([SILDFR%@!#]|&amp;)?|\.\d+[FR!#]?|\s+|\w+|&amp;|&lt;|&gt;|([-+*/\\^$@!#%&<>()\[\]{}.,:=]+)/gi;

    var lines = code.split("\n");
    for (var i = 0; i < lines.length; i++) {
        var line = lines[i];

        var tokens;
        var result = "";

        while (tokens = regex.exec(line)) {
            var tok = getToken(tokens);
            switch (tok.charAt(0)) {
                case '"':
                    if (tok.charAt(tok.length - 1) == "c")
                        result += span("char", tok);
                    else
                        result += span("string", tok);
                    break;
                case "'":
                    result += span("comment", tok);
                    break;
                case '#':
                    result += span("date", tok);
                    break;
                default:
                    var c1 = tok.charAt(0);

                    if (isDigit(c1) ||
                        tok.length > 1 && c1 == '.' && isDigit(tok.charAt(1)) ||
                        tok.length > 5 && (tok.indexOf("&amp;") == 0 &&
                        tok.charAt(5) == 'H' || tok.charAt(5) == 'O')
                    )
                        result += span("number", tok);
                    else if (isKeyword(tok))
                        result += span("keyword", tok);
                    else
                        result += tok;
                    break;
            }
        }

        lines[i] = result;
    }

    return lines.join("\n");
}

var keywords = [
    "addhandler", "addressof", "alias", "and", "andalso", "as", "boolean", "byref",
    "byte", "byval", "call", "case", "catch", "cbool", "cbyte", "cchar", "cdate",
    "cdec", "cdbl", "char", "cint", "class", "clng", "cobj", "const", "continue",
    "csbyte", "cshort", "csng", "cstr", "ctype", "cuint", "culng", "cushort", "date",
    "decimal", "declare", "default", "delegate", "dim", "directcast", "do", "double",
    "each", "else", "elseif", "end", "endif", "enum", "erase", "error", "event",
    "exit", "false", "finally", "for", "friend", "function", "get", "gettype",
    "getxmlnamespace", "global", "gosub", "goto", "handles", "if", "if",
    "implements", "imports", "in", "inherits", "integer", "interface", "is", "isnot",
    "let", "lib", "like", "long", "loop", "me", "mod", "module", "mustinherit",
    "mustoverride", "mybase", "myclass", "namespace", "narrowing", "new", "next",
    "not", "nothing", "notinheritable", "notoverridable", "object", "of", "on",
    "operator", "option", "optional", "or", "orelse", "overloads", "overridable",
    "overrides", "paramarray", "partial", "private", "property", "protected",
    "public", "raiseevent", "readonly", "redim", "rem", "removehandler", "resume",
    "return", "sbyte", "select", "set", "shadows", "shared", "short", "single",
    "static", "step", "stop", "string", "structure", "sub", "synclock", "then",
    "throw", "to", "true", "try", "trycast", "typeof", "variant", "wend", "uinteger",
    "ulong", "ushort", "using", "when", "while", "widening", "with", "withevents",
    "writeonly", "xor", "#const", "#else", "#elseif", "#end", "#if"
]

var isKeyword = function(token) {
    return keywords.indexOf(token.toLowerCase()) != -1;
}

var isDigit = function(c) {
    return c >= '0' && c <= '9';
}

var getToken = function(tokens) {
    for (var i = 0; i < tokens.length; i++)
        if (tokens[i] != undefined)
            return tokens[i];
    return null;
}

var span = function(class, text) {
    return "<span class=\"" + class + "\">" + text + "</span>";
}

测试代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    'set page title
    Page.Title = "Something"
    Dim r As String = "Say ""Hello"""
    Dim i As Integer = 1234
    Dim d As Double = 1.23
    Dim s As Single = .123F
    Dim l As Long = 123L
    Dim ul As ULong = 123UL
    Dim c As Char = "x"c
    Dim h As Integer = &amp;H0
    Dim t As Date = #5/31/1993 1:15:30 PM#
    Dim f As Single = 1.32e-5F
End Sub
于 2008-08-28T08:43:06.850 回答
2

自 2009 年 1 月 8 日起,Prettify 支持 VB 评论。

要使 vb 语法突出显示正常工作,您需要三件事;

<script type="text/javascript" src="/External/css/prettify/prettify.js"></script>
<script type="text/javascript" src="/External/css/prettify/lang-vb.js"></script>

和代码周围的 PRE 块,例如:

<PRE class="prettyprint lang-vb">
 Function SomeVB() as string
   ' do stuff
   i = i + 1
 End Function
</PRE>

Stackoverflow 缺少 lang-vb.js 包含,以及通过 Markdown 指定哪种语言的能力,即:class="prettyprint lang-vb"这就是它在这里不起作用的原因。

有关该问题的详细信息:请参阅Prettify 问题日志

于 2009-05-20T01:40:36.920 回答
0

同时,您可以在评论末尾添加一个额外的评论字符,以使其看起来不错。例如:

Sub TestMethod()
    'Method body goes here'
End Sub

您还需要在普通的 vb-fashion 中转义内部注释字符:

Sub TestMethod2()
    'Here''s another comment'
End Sub

Prettify 仍然将其视为字符串文字而不是注释,但至少看起来还不错。

我见过的另一种方法是用一个额外的开始评论'//,像这样:

Sub TestMethod3()
    ''// one final comment
End Sub

然后像注释一样处理它,但是你必须处理 C 风格的注释标记

于 2008-09-29T17:19:03.390 回答