Mejorar GeSHi resaltado de sintaxis T-SQL


Estoy usando WP-GeSHi en WordPress, y en gran medida estoy muy contento con él. Sin embargo, hay algunos escenarios menores en los que el resaltado de color es demasiado agresivo cuando una palabra clave es:

  1. un nombre de variable (denotado por un encabezado @)
  2. parte de otra palabra (por ejemplo, IN en INSERTED)
  3. la combinación (parte de un nombre de variable, por ejemplo, JOIN y IN en @JOINBING)
  4. entre corchetes (por ejemplo, [status])

Ciertas palabras clave son caso sensible, y otros no lo son. La siguiente captura de pantalla resume los diversos casos en los que esto sale mal:

introduzca la descripción de la imagen aquí

Ahora, el código en GeSHi.php es bastante detallado, y de ninguna manera soy un experto en PHP. No tengo miedo de ensuciarme un poco las manos aquí, pero espero que alguien más haya hecho correcciones a este código y pueda proporcionar algunos consejos. Ya implementé una solución alternativa para evitar que @@ROWCOUNT se resaltara incorrectamente, pero esto fue fácil, ya que @@ROWCOUNT está definido: simplemente barajó los arrays para que se encontrara antes de ROWCOUNT.

Lo que me gustaría es que Gueshi ignore completamente las palabras clave que no son palabras completas (ya sea que estén prefijadas por @ o rodeadas inmediatamente por otras letras/números). JOIN debe ser gris, pero @JOIN y JOINS no. También me gustaría que ignorara las palabras clave que están entre corchetes (después de todo, así es como le decimos a Management Studio que no lo resalte en color, y también es cómo le decimos al motor SQL que ignore palabras reservadas, palabras clave e identificadores no válidos).

Author: Aaron Bertrand, 2014-05-08

2 answers

Puede hacer esto agregando un control PARSER_CONTROL al final de la matriz:

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

Editar

He modificado su gist para mover algunas de las palabras clave que agregó a SYMBOLS de nuevo a KEYWORDS (aunque en su propio grupo y con su estilo personalizado), y actualizé el array PARSER_CONTROL para que coincida con los nuevos índices de array de palabras clave y también para incluir el predeterminado regex que genera gueshi. Aquí está el enlace:

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

 31
Author: Jonathan Amend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-01 09:41:16

Según mí, lo que estás haciendo tomaría mucho tiempo. Por lo tanto, sugiero que instale un plugin diferente:

Tiene mejores características y soporta más idiomas y de una mejor manera. Por lo tanto, eliminaría todos estos problemas.

EDITAR:

Hey, probé el mismo código con la última versión y obtuve el siguiente resultado:

introduzca la descripción de la imagen aquí

EDITAR:

Entonces, si no quieres usar otro plugin, entonces te contaré sobre el codificación:

Primero abra \wp-content\plugins\wp-geshi-highlight\geshi\geshi\tsql.php en su editor de texto.

Luego, localice el array 'KEYWORDS' o búsquelo.

Agregue 6 al último de ellos (después de 5) y agregue sus palabras clave personalizadas en él. Por ejemplo:

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

Nota: Acabo de mostrar el elemento array 5 (ya presente) y el elemento array 6 (que he creado).

Luego, para hacerlo sensible a mayúsculas y minúsculas, agregue el código siguiente al último de 'CASE_SENSITIVE' array:

6 => true

La matriz 'CASE_SENSITIVE' debería tener este aspecto:

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

Ahora, tendrá que agregar estilo a las palabras clave personalizadas. Esto se puede lograr agregando debajo de la línea al elemento 'KEYWORDS' de la matriz 'STYLES'. La matriz que comienza de 'STYLES' debería tener este aspecto:

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

Puede resolver sus problemas por las pautas anteriores, pero para la parte en la que el plugin resalta palabras incompletas, he encontrado solo una solución, que actualice su plugin a la última versión, porque resuelve este problema.

 3
Author: prakhar19,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-20 14:04:45