2008-08-27 19 views
10

來自Google的prettify.js無法正確呈現Visual Basic代碼。Google提供的prettify.js是否有lang-vb或lang-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語言 ()會猜測。您 可以通過指定 語言擴展與 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> 

我看不出有什麼郎-VB郎基本選項。有沒有人知道如果作爲加載項存在?


注意:這與有關Stack Overflow的VB.NET code blocks建議有關。

+0

注意:如果你需要有語法高亮,請使用`< - 語言:朗動 - >` – Laurel 2016-07-08 16:31:00

回答

8

/編輯:我已經重寫了整個發佈。

下面是一個相當完整的解決方案的VB高亮問題。如果SO沒有什麼更好的,使用它。 VB語法突出顯然是想要的。

我還添加了一些代碼示例,其中包含一些複雜的代碼文字,可以正確突出顯示。但是,我甚至沒有試圖讓XLinq正確。雖然可能仍然有效。 keywords list取自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;|([-+*/\\^[email protected]!#%&<>()\[\]{}.,:=]+)/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 
+0

康拉德,這一問題已經得到解決在美化本身,雖然沒有在SO上實施。 – 2009-05-20 01:42:20

+0

@Mark:是的,我知道這一點...請參閱Uservoice的討論。但正如你所說,遺憾的是仍然沒有實施它,並且Uservoice報告已被拒絕。 – 2009-05-20 08:38:10

0

在此期間,您可以在您的意見放在最後一個額外的註釋符讓它看行不行。例如:

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

還需要在正常的VB-方式逃避內部註釋字符:

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

美化仍然把它作爲一個字符串字面量,而不是評論,但至少它看起來好的。

我見過的另一種方法是使用一個額外的'//開始評論,像這樣:

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

然後,它像一個註釋處理,但你必須處理C風格的註釋標記

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塊:

​​

#1缺少郎vb.js包容性,並通過降價來指定語言的能力,即:class="prettyprint lang-vb"這是爲什麼它在這裏不起作用。

關於該問題的詳細信息:看the Prettify issues log

相關問題