Подтвердить что ты не робот

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

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

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

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

enter image description here

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

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

4b9b3361

Ответ 1

Вы можете сделать это, добавив элемент управления 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

Ответ 2

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

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

EDIT:

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

enter image description here

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
            ),

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