Есть ли опция lang-vb или lang-basic для prettify.js из Google?

Код Visual Basic не отображается корректно с prettify.js от Google.

при переполнении стека:

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>

Я не вижу lang-vb или lang-basic. Кто-нибудь знает, существует ли он как надстройка?


Примечание. Это связано с предложением VB.NET для.

Ответ 1

/EDIT: я переписал всю публикацию.

Ниже приведено довольно полное решение проблемы подсветки 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;|([-+*/\\^[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

Ответ 2

Prettify поддерживает комментарии VB от 8 января 2009 года.

Для правильной работы подсветки синтаксиса 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", поэтому он здесь не работает.

для получения подробных сведений о проблеме: см. журнал проблем с сообщением

Ответ 3

Тем временем вы можете добавить дополнительный комментарий в конце своих комментариев, чтобы он выглядел хорошо. Например:

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

Вам также необходимо избежать внутренних символов комментария в обычном режиме vb:

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

Prettify все еще рассматривает его как строковый литерал, а не комментарий, но, по крайней мере, он выглядит нормально.

Еще один метод, который я видел, - это запустить комментарии с дополнительным '//, например:

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

Затем он обрабатывается как комментарий, но вам приходится иметь дело с маркерами комментариев в стиле C