Google的prettify.js是否有lang-vb或者lang-basic选项?
Visual Basic代码无法使用Google的prettify.js正确呈现。
在堆栈溢出时:
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中...
我在自述文件中找到了这一点:
How do I specify which language my code is in? You don't need to specify the language since prettyprint() will guess. You can specify a language by specifying the language extension along with the prettyprint class like so: <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选项。有人知道添加组件是否存在吗?
注意:这与有关堆栈溢出的VB.NET代码块建议有关。
解决方案
回答
/编辑:我重写了整个帖子。
下面是VB突出显示问题的完整解决方案。如果SO没有什么更好的,请使用它。绝对需要VB语法突出显示。
我还添加了一个代码示例,其中包含一些可以正确突出显示的复杂代码文字。但是,我什至没有尝试正确使用XLinq。也许仍然可以。关键字列表取自MSDN。不包括上下文关键字。我们知道GetXmlNamespace
运算符吗?
该算法知道文字类型字符。它也应该能够处理标识符类型的字符,但是我还没有测试这些字符。请注意,该代码适用于HTML。因此,&,<和>必须被读取为命名(!)实体,而不是单个字符。
很抱歉长正则表达式。
var highlightVB = function(code) { var regex = /("(?:""|[^"])+"c?)|('.*$)|#.+?#|(&[HO])?\d+(\.\d*)?(e[+-]?\d+)?U?([SILDFR%@!#]|&)?|\.\d+[FR!#]?|\s+|\w+|&|<|>|([-+*/\^$@!#%&<>()\[\]{}.,:=]+)/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("&") == 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 = &H0 Dim t As Date = #5/31/1993 1:15:30 PM# Dim f As Single = 1.32e-5F End Sub
回答
同时,我们可以在评论的末尾添加一个额外的评论字符,以使其看起来还不错。例如:
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样式的注释标记
回答
截至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"
,这就是为什么它在这里不起作用的原因。
有关该问题的详细信息:请参阅整理问题日志