Resaltado de sintaxis PostgreSQL

Me apresuro a compartir las buenas noticias: la vida de los autores de artículos sobre PostgreSQL y sus lectores ha mejorado un poco.

Como todos los habispisters saben, para diseñar el código fuente, se usa una etiqueta especial <source> , que resalta la sintaxis. No es ningún secreto que la retroiluminación no siempre es perfecta, y luego los autores (que se preocupan por el aspecto de sus artículos) se ven obligados a participar en actuaciones de aficionados, para colorear su código usando <font color=...> .

Todo fue especialmente triste con PostgreSQL, ya que el resaltado cubría más o menos SQL estándar y categóricamente no entendía los detalles de nuestro DBMS. Con el paso del tiempo, Alexey boomburum corrigió cuidadosamente mis fuentes a la fuente (y regresé), hasta que se hizo evidente que la luz de fondo necesitaba ser reparada. Finalmente, Daler daleraliyorov sugirió una salida: agregar soporte PostgreSQL a la biblioteca más destacada utilizada por Habr. Y ahora, listo, bienvenido.

pgsql: SQL, PL / pgSQL y todo-todo-todo


Entonces, el secreto para el resaltado correcto está en el nuevo lenguaje pgsql . Puede seleccionarse en el menú (botón "código fuente") o especificarse manualmente. En html necesitas escribir

<source lang="pgsql">

</source>

y en rebajas como esta:

```pgsql

```

En principio, highlightjs puede determinar el lenguaje en sí, pero normalmente solo funciona para fragmentos de código grandes; en piezas pequeñas, la detección automática a menudo falla. Además, la detección automática lleva tiempo, por lo que si especifica el idioma explícitamente, el código brillará más rápido.

Por ejemplo, para obtener

 CREATE TABLE aircrafts_data ( aircraft_code character(3) NOT NULL, model jsonb NOT NULL, range integer NOT NULL, CONSTRAINT aircrafts_range_check CHECK ((range > 0)) ); 

estamos escribiendo

<source lang="pgsql">
CREATE TABLE aircrafts_data (
aircraft_code character(3) NOT NULL,
model jsonb NOT NULL,
range integer NOT NULL,
CONSTRAINT aircrafts_range_check CHECK ((range > 0))
);
</source>

El mismo lenguaje pgsql también colorea el código PL / pgSQL. Por ejemplo, para obtener

 CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$ BEGIN RETURN QUERY SELECT flightid FROM flight WHERE flightdate >= $1 AND flightdate < ($1 + 1); IF NOT FOUND THEN RAISE EXCEPTION '   : %.', $1; END IF; RETURN; END $$ LANGUAGE plpgsql; 

escribir

<source lang="pgsql">
CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$
...
$$ LANGUAGE plpgsql;
</source>

Una leve sutileza es que las cadenas de caracteres encerradas en dólares siempre se resaltan como código, y las cadenas en apóstrofes nunca se resaltan. Consideré diferentes opciones, pero esta me pareció la más adecuada.

La capacidad de highlightjs para detectar automáticamente el idioma de un fragmento permite resaltar funciones en otros idiomas. Por ejemplo, todo funcionará para PL / Perl:

 CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$ my ($x, $y) = @_; if (not defined $x) { return undef if not defined $y; return $y; } return $x if not defined $y; return $x if $x > $y; return $y; $$ LANGUAGE plperl; 

No necesitas nada especial, solo escribe

<source lang="pgsql">
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
...
$$ LANGUAGE plperl;
</source>

Por supuesto, el idioma elegido depende solo de lo que está escrito dentro de los dólares, y de ninguna manera está determinado por lo que está escrito después del IDIOMA.

En general, la luz de fondo corresponde a la undécima versión recientemente publicada de PostgreSQL.

Hubo muchas dudas sobre las características destacadas. Desafortunadamente, para distinguir un nombre de función de, por ejemplo, un nombre de tabla, se necesita un análisis completo, pero esto no se resuelve dentro del resaltado de sintaxis. Puede hacer una larga lista de funciones estándar y colorearlas, pero ¿qué pasa con las funciones de numerosas extensiones? Como resultado, decidí no colorear en absoluto; de todos modos, todo se basa en palabras clave y se reduce la variedad.

texto sin formato: texto, texto sin formato


Algunas veces en el artículo se requiere emitir los resultados de la consulta. Por supuesto, no hay palabras clave allí, no es necesario resaltar nada, pero quiero que el texto se vea como "consola", al igual que el código. Para esto, ahora puede usar el lenguaje especial de texto sin formato . Por ejemplo, para obtener

 WITH xmldata(data) AS (VALUES ($$ <example xmlns="http://example.com/myns" xmlns:B="http://example.com/b"> <item foo="1" B:bar="2"/> <item foo="3" B:bar="4"/> <item foo="4" B:bar="5"/> </example>$$::xml) ) SELECT xmltable.* FROM XMLTABLE(XMLNAMESPACES('http://example.com/myns' AS x, 'http://example.com/b' AS "B"), '/x:example/x:item' PASSING (SELECT data FROM xmldata) COLUMNS foo int PATH '@foo', bar int PATH '@B:bar'); 

  foo | bar -----+----- 1 | 2 3 | 4 4 | 5 (3 rows) 

escribir

<source lang="pgsql">
WITH xmldata(data) AS (VALUES ($$
...
</source>
<source lang="plaintext">
foo | bar
-----+-----
1 | 2
3 | 4
4 | 5
(3 rows)
</source>

El texto sin formato siempre debe especificarse explícitamente; no se detecta automáticamente.

Espero que te guste la innovación y te resulte útil. Si encuentra un error en cómo se resalta el código (y los errores son inevitables, la sintaxis sensible al contexto es demasiado para SQL), cree una tarea en el github del proyecto y, mejor aún, proponga una solución.

PD: No se olviden de la conferencia PGConf , que se realizará del 4 al 6 de febrero en Moscú. ¡Se aceptan solicitudes de informes hasta el 5 de diciembre!

Source: https://habr.com/ru/post/es430040/


All Articles