Улучшение подсветки синтаксиса GeSHi для T-SQL

30

Я использую WP-GeSHi в WordPress, и в значительной степени я очень доволен этим. Однако есть несколько небольших сценариев, в которых подсветка цвета слишком агрессивна, когда ключевое слово:

  • имя переменной (обозначается ведущим @)
  • часть другого слова (например, IN в INSERTED)
  • комбинация (часть имени переменной, например JOIN и IN в @JOINBING)
  • внутри квадратных скобок (например, [status])

Некоторые ключевые слова чувствительны к регистру, а другие - нет. В приведенном ниже скриншоте суммируются различные случаи, когда это происходит не так:

Изображение 206

Теперь код в GeSHi.php довольно подробный, и я отнюдь не эксперт PHP. Я не боюсь, что мои руки здесь немного грязные, но я надеюсь, что кто-то еще внесет исправления в этот код и может предоставить некоторые указатели. Я уже реализовал обходное решение, чтобы предотвратить @@ROWCOUNT от неправильного выделения, но это было легко, поскольку @@ROWCOUNT определен - я просто перетасовал массивы вокруг так, чтобы он был найден до ROWCOUNT.

Я бы хотел, чтобы GeSHi полностью игнорировал ключевые слова, которые не являются целыми словами (независимо от того, префикс ли они @ или сразу окружены другими буквами/цифрами). JOIN должен быть серым, но @JOIN и JOINS не должен. Мне также хотелось бы игнорировать ключевые слова, которые находятся внутри квадратных скобок (в конце концов, так мы говорим, что Management Studio не выделяет цвет, а также то, как мы говорим движку SQL игнорировать зарезервированные слова, ключевые слова и недопустимые идентификаторы).

Теги:
syntax-highlighting
geshi

2 ответа

29
Лучший ответ

Вы можете сделать это, добавив элемент управления PARSER_CONTROL в конец массива:

'PARSER_CONTROL' => array(
    'KEYWORDS' => array(
        1 => array( // "1" maps to the main keywords near the start of the array
            'DISALLOWED_BEFORE' => '(?![\(\w])',
            'DISALLOWED_AFTER' => '(?![\(\w])'
        ),
        5 => array( // "5" maps to the shorter keywords like "IN" that are further down
            'DISALLOWED_BEFORE' => '(?![\(\w])',
            'DISALLOWED_AFTER' => '(?![\(\w])'
        ),
    )
)

Edit

Я изменил свой смысл, чтобы переместить некоторые ключевые слова, добавленные вами в SYMBOLS, назад на KEYWORDS (хотя в их собственной группе и в вашем пользовательском стиле), и я обновил массив PARSER_CONTROL, чтобы соответствовать новые индексы ключевых слов, а также включить по умолчанию regex, который генерирует geshi. Вот ссылка:

https://gist.github.com/jamend/07e60bf0b9acdfdeee7a

  • 0
    поэтому у меня есть еще одна мелочь, которую я бы хотел исправить, и это может быть очень легко для вас. Я бы хотел, чтобы переменные (все, что начинается с @ ) были выделены определенным цветом. Это легко или сложно?
  • 8
    Genius. Еще раз большое спасибо. (И извините за то, что я не изложил все мои требования заранее - я думал, что вопрос уже был подавляющим без этих дополнительных, в значительной степени не связанных изменений.) Теперь, последний вопрос: почему ТАК не позволяет мне давать более 500 представителей в отдельности? Баунти? Ты хоть представляешь, как долго я ломал голову над этими незначительными изменениями?
Показать ещё 3 комментария
3

По моему мнению, то, что вы делаете, займет много времени. Поэтому я предлагаю вам установить другой plugin:

Он имеет лучшие функции и поддерживает больше языков и лучше. Таким образом, это устранит все эти проблемы.

EDIT:

Эй, я опробовал тот же код с последней версией и получил следующий результат -

Изображение 3433

EDIT:

Итак, если вы не хотите использовать другой плагин, я расскажу вам о кодировании:

Сначала откройте \wp-content\plugins\wp-geshi-highlight\geshi\geshi\tsql.php в текстовом редакторе.

Затем найдите массив 'KEYWORDS' или найдите его.

Добавьте 6 к последнему из них (после 5) и добавьте в него свои пользовательские ключевые слова. Например:

5 => array(
'ALL', 'AND', 'ANY', 'BETWEEN', 'CROSS', 'EXISTS', 'IN', 'JOIN', 'LIKE', 'NOT', 'NULL',
'OR', 'OUTER', 'SOME',
),

6 => array(                          //This line has been added by me
'status'                             //This line has been added by me
)                                    //This line has been added by me

Примечание. Я только что показал массив 5 (уже присутствует) и элемент массива 6 (который я сделал).

Затем, чтобы сделать его чувствительным к регистру, добавьте ниже код к последнему из массива 'CASE_SENSITIVE':

6 => true

Массив 'CASE_SENSITIVE' должен выглядеть следующим образом:

'CASE_SENSITIVE' => array(
GESHI_COMMENTS => false,
        1 => false,
        2 => false,
        3 => false,
        4 => false,
        5 => false,
        6 => true                         //This line has been added by me
        ),

Теперь вам нужно будет добавить стиль к пользовательским ключевым словам. Это может быть достигнуто путем добавления ниже строки к элементу 'KEYWORDS' массива 'STYLES'. начало массива 'STYLES' должно выглядеть следующим образом:

'STYLES' => array(
        'KEYWORDS' => array(
            1 => 'color: #0000FF;',
            2 => 'color: #FF00FF;',
            3 => 'color: #AF0000;',
            4 => 'color: #AF0000;',
            5 => 'color: #808080;',
            6 => 'color: #0000FF;'          //This line has been added by me
            ),

Вы можете решить свои проблемы по приведенным выше рекомендациям, но для той части, в которой плагин выделяет неполные слова, я нашел только одно решение, которое вы обновляете свой плагин до последней версии, потому что он решает эту проблему.

  • 4
    Спасибо, но я вложил много работы в другие изменения в GeSHi в соответствии с моими потребностями, поэтому я бы предпочел продолжать над этим работать, а не выкупать плагины оптом. Я также очень боюсь синдрома «трава зеленее» - где я просто обменял бы эти немногие оставшиеся недостатки на другие, возможно, более важные.
  • 0
    Кроме того, результаты, которые вы показываете , имеют аналогичные проблемы. Почему status не выделен синим цветом в строке 2? Почему join к части локальных переменных в AND mort IN линии выделены серым цветом? Как я и подозревал, мне пришлось бы пережить много трудностей, перенеся 150+ постов, чтобы использовать немного другой синтаксис <pre> , только чтобы обменять мои текущие неудобства форматирования на немного другие.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню