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 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-vbまたはlang-basicオプションが表示されません。アドインとして存在するかどうかは誰にもわかりませんか?


注: これは、スタック オーバーフローに対する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

Prettify は、2009 年 1 月 8 日現在、VB コメントをサポートしています。

vb 構文の強調表示を正しく機能させるには、次の 3 つが必要です。

<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 に答える