Mejore el resaltado de sintaxis de GeSHi para T-SQL

7 minutos de lectura

avatar de usuario
Aarón Bertrand

Estoy usando WP-GesHi en WordPress, y en general 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 (indicado por un prefijo @)
  2. parte de otra palabra (ej. IN en INSERTED)
  3. la combinación (parte de un nombre de variable, por ejemplo JOIN y IN en @JOINBING)
  4. dentro de corchetes (por ejemplo [status])

Algunas palabras clave distinguen entre mayúsculas y minúsculas y otras no. La siguiente captura de pantalla resume los diversos casos en los que esto sale mal:

ingrese 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 corregido este código y pueda proporcionar algunos consejos. Ya implementé una solución alternativa para evitar @@ROWCOUNT resaltado incorrectamente, pero esto fue fácil, ya que @@ROWCOUNT está definido: simplemente mezclé las matrices para que se encontrara antes ROWCOUNT.

Lo que me gustaría es que GeSHi ignore por completo las palabras clave que no son palabras completas (ya sea que tengan el prefijo @ o inmediatamente rodeado por otras letras/números). JOIN debería ser gris, pero @JOIN y JOINS no debe. 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 con color, y también es cómo le decimos al motor SQL que ignore las palabras reservadas, las palabras clave y los identificadores no válidos ).

avatar de usuario
jonathan enmendar

Puede hacer esto agregando un PARSER_CONTROL control hasta el 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 tu esencia para mover algunas de las palabras clave que agregó a SYMBOLS de regreso KEYWORDS (aunque en su propio grupo y con su estilo personalizado), y actualicé el PARSER_CONTROL matriz para que coincida con los nuevos índices de matriz de palabras clave y también para incluir el valor predeterminado regex que geshi genera. Aqui esta el link:

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

  • así que tengo otra cosa realmente menor que me gustaría arreglar, y podría ser muy fácil de elegir para usted. Me gustaría variables (cualquier cosa que comience con @) para que se resalte un determinado color. ¿Es esto fácil o difícil?

    – Aarón Bertrand

    21 mayo 2014 a las 17:43

  • Genio. Muchas gracias de nuevo. (Y perdón por no indicar todos mis requisitos por adelantado; pensé que la pregunta ya era abrumadora sin esos cambios adicionales, en gran parte no relacionados). Ahora, una última pregunta: ¿por qué no me deja dar más de 500 repeticiones en un individuo? ¿generosidad? ¿Tienes idea de cuánto tiempo he estado rascándome la cabeza con estos cambios menores?

    – Aarón Bertrand

    21 mayo 2014 a las 21:01


  • Hola, soy el autor WP-GeSHi-Highlight. Estoy seguro de que te has dado cuenta de que solo soy usando la fabulosa biblioteca GeSHi allí. Ahora bien, ¿consideró contribuir con su aporte al proyecto GeSHi? Aquí tienes: github.com/GeSHi/geshi-1.0 — el repositorio es bastante estable, pero las solicitudes de actualización de idioma parecen fusionarse de vez en cuando. Y yo, por otro lado, fusiono las actualizaciones de GeSHi, de vez en cuando, en WP-GeSHi-Highlight. ¡Salud!

    – Dr. Jan-Philip Gehrcke

    18 de junio de 2015 a las 0:59

  • Aquí tienes, he incluido las otras mejoras de Aaron Bertrand. Mejorar el resaltado de sintaxis de T-SQL

    – Jonathan enmienda

    18 de junio de 2015 a las 1:50

avatar de usuario
prakhar19

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

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

EDITAR:

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

ingrese la descripción de la imagen aquí

EDITAR:

Entonces, si no desea usar otro complemento, le informaré sobre la codificación:

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

Luego, ubique la matriz 'KEYWORDS' o buscarlo.

Agregar 6 hasta el final (después 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 de matriz 5 (ya presente) y el elemento de matriz 6 (que he creado).

Luego, para que distinga entre mayúsculas y minúsculas, agregue el siguiente código al último de 'CASE_SENSITIVE' formación:

6 => true

los 'CASE_SENSITIVE' la matriz debería verse así:

'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, deberá agregar estilo a las palabras clave personalizadas. Esto se puede lograr agregando la siguiente línea al 'KEYWORDS' elemento de 'STYLES' formación. los comenzando de 'STYLES' la matriz debería verse así:

'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 con las pautas anteriores, pero para la parte en la que el complemento resalta palabras incompletas, solo he encontrado una solución, que actualice su complemento a la última versión, porque resuelve este problema.

  • Gracias, pero he invertido mucho trabajo en otros cambios a GeSHi para satisfacer mis necesidades, por lo que prefiero seguir trabajando en ello, en lugar de cambiar los complementos al por mayor. También tengo mucho miedo del síndrome de “la hierba es más verde”, en el que simplemente estaría cambiando estas pocas imperfecciones restantes por otras diferentes, quizás más importantes.

    – Aarón Bertrand

    15 mayo 2014 a las 13:28

  • Además, los resultados que muestra hacer tienen problemas similares. Por que es status no está resaltado en azul en la línea 2? ¿Por qué son los join porciones de las variables locales en el AND mort IN línea resaltada en gris? Como sospechaba, estaría pasando por un montón de problemas al migrar más de 150 publicaciones para usar un poco diferente <pre> sintaxis, solo para cambiar mis molestias de formato actuales por otras ligeramente diferentes.

    – Aarón Bertrand

    20 mayo 2014 a las 13:25

  • Las palabras clave de las que me quejo ya están en una matriz. Todas las matrices tienen el estilo que quiero, y todas las opciones están configuradas para distinguir entre mayúsculas y minúsculas (y las quiero de esa manera). Veo diferencias en si se ven como palabras clave porque creo que se usan diferentes expresiones regulares según la matriz. Y el verdadero problema que necesito resolver aquí es evitar que esas expresiones regulares identifiquen palabras clave contenidas en palabras más grandes (o precedidas por @ o rodeadas por [square brackets]). Estoy en la última versión del complemento GeSHi y el problema es todavía ocurriendo.

    – Aarón Bertrand

    20 mayo 2014 a las 14:14


  • Si no tiene ningún problema en hacer algunas correcciones desordenadas, entonces tal vez pueda definir una matriz más en la que pueda definir ‘@status’ y diseñarlo como ‘color: #000000;’, etc. Pero recuerde que el las matrices que contienen palabras como ‘@status’ deben definirse por encima de las matrices que contienen palabras clave como ‘status’.

    – prakhar19

    20 mayo 2014 a las 14:36

  • Bueno, sí, podría hacer eso, pero tendría que crear una matriz que contenga cada palabra clave que podría usarse como variable (y eso es prácticamente todo). Estoy totalmente seguro de que hay una manera mucho más elegante de hacer que las expresiones regulares simplemente ignoren las palabras clave que tienen el prefijo @, en lugar de definir cada palabra clave de nuevo. No quiero sonar desagradecido, y aprecio su esfuerzo aquí, pero este no es el tipo de soluciones que estoy buscando.

    – Aarón Bertrand

    20 mayo 2014 a las 14:38


¿Ha sido útil esta solución?