簡體   English   中英

來自Google的prettify.js有lang-vb或lang-basic選項嗎?

[英]Is there a lang-vb or lang-basic option for prettify.js from Google?

使用來自Google的prettify.js無法正確呈現Visual Basic代碼。

在Stack Overflow:

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代碼塊建議有關。

/編輯:我改寫了整篇文章。

以下是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

截至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問題日志

在此期間,您可以在評論的最后添加一個額外的評論字符,以使其看起來沒問題。 例如:

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

您還需要以正常的vb方式轉義內部注釋字符:

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

Prettify仍將它視為字符串文字而非評論,但至少看起來沒問題。

我看到的另一種方法是用額外的'//開始注釋,像這樣:

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

然后它像評論一樣處理,但你必須處理C風格的評論標記

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM