来自Google的prettify.js有lang-vb或lang-basic选项吗?

时间:2008-08-27 20:05:31

标签: javascript vb.net prettify

使用来自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 Basic in Visual Studio

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

  

如何指定我的语言   代码在?

     

您无需指定语言   因为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-vb lang-basic 选项。有谁知道一个是否作为加载项存在?


注意:这与Stack Overflow的VB.NET code blocks建议有关。

3 个答案:

答案 0 :(得分:8)

/编辑:我改写了整个帖子。

以下是VB突出显示问题的完整解决方案。如果SO没有更好的,使用它。绝对需要VB语法高亮。

我还添加了一个代码示例,其中包含一些可以正确突出显示的复杂代码文字。但是,我甚至没有尝试让XLinq正确。但是仍然可以工作。 keywords list取自MSDN。不包括上下文关键字。您知道GetXmlNamespace运营商吗?

算法知道文字类型字符。它也应该能够处理标识符类型字符,但我还没有测试过这些。请注意,代码适用于 HTML 。结果,&amp;,&lt;和&gt;需要被读作命名(!)实体,而不是单个字符。

对于长正则表达式抱歉。

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

答案 1 :(得分:2)

Prettify确实支持截至2009年1月8日的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"这就是为什么它在这里不起作用的原因。

有关该问题的详细信息:请参阅the Prettify issues log

答案 2 :(得分:0)

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

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

您还需要以正常的vb-style转义内部注释字符:

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

Prettify仍将它视为字符串文字而非评论,但至少看起来没问题。

我看到的另一种方法是使用额外的'//开始评论,如下所示:

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

然后它像评论一样处理,但你必须处理C风格的评论标记