Существует ли опция lang-vb или lang-basic для prettify.js от Google? - PullRequest
10 голосов
/ 28 августа 2008

Код 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 примерно такой:

<code><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".

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


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

Ответы [ 3 ]

8 голосов
/ 28 августа 2008

/ РЕДАКТИРОВАТЬ: я переписал всю публикацию.

Ниже приведено довольно полное решение проблемы выделения 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
2 голосов
/ 20 мая 2009

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 вокруг вашего кода, например:


 Function SomeVB() as string
   ' do stuff
   i = i + 1
 End Function

В Stackoverflow отсутствует включение lang-vb.js и возможность указать какой язык с помощью Markdown, например: class="prettyprint lang-vb", поэтому он здесь не работает.

подробности о проблеме: см. Журнал проблем Prettify

0 голосов
/ 29 сентября 2008

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

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

...