Hervorheben der PostgreSQL-Syntax

Ich beeile mich, die guten Nachrichten zu teilen: Das Leben der Autoren von Artikeln über PostgreSQL und ihrer Leser ist etwas besser geworden.

Wie alle Habispister wissen, wird zum Entwerfen des Quellcodes ein spezielles <source> -Tag verwendet, das die Syntax hervorhebt. Es ist kein Geheimnis, dass die Hintergrundbeleuchtung nicht immer perfekt ist, und dann sind Autoren (die sich darum kümmern, wie ihre Artikel aussehen) gezwungen, sich auf Amateurauftritte einzulassen - um ihren Code mit <font color=...> .

Bei PostgreSQL war alles besonders traurig, da die Hervorhebung mehr oder weniger Standard-SQL abdeckte und die Besonderheiten unseres DBMS kategorisch nicht verstand. Mit der Zeit korrigierte Alexey Boomburum meine Schriftarten sorgfältig auf die Quelle (und ich kehrte zurück), bis klar wurde, dass die Hintergrundbeleuchtung repariert werden musste. Schließlich schlug Daler daleraliyorov einen Ausweg vor: Fügen Sie der von Habr verwendeten Highlightjs- Bibliothek PostgreSQL-Unterstützung hinzu. Und jetzt - fertig, willkommen.

pgsql: SQL, PL / pgSQL und alles in allem


Das Geheimnis für die korrekte Hervorhebung liegt also in der neuen pgsql- Sprache. Sie kann im Menü (Schaltfläche "Quellcode") ausgewählt oder manuell angegeben werden. In HTML müssen Sie schreiben

<source lang="pgsql">

</source>

und in Abschlag wie folgt:

```pgsql

```

Im Prinzip können Highlights die Sprache selbst bestimmen, aber normalerweise funktioniert sie nur für große Codefragmente. In kleinen Stücken fehlt die automatische Erkennung häufig. Darüber hinaus benötigt die automatische Erkennung einige Zeit. Wenn Sie also die Sprache explizit angeben, funkelt der Code schneller.

Zum Beispiel zu bekommen

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

wir schreiben

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

Dieselbe pgsql-Sprache färbt auch den PL / pgSQL-Code. Zum Beispiel zu bekommen

 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; 

schreibe

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

Eine leichte Subtilität ist, dass in Dollar eingeschlossene Zeichenfolgen immer als Code hervorgehoben werden und Zeichenfolgen in Apostrophen niemals hervorgehoben werden. Ich dachte über verschiedene Optionen nach, aber diese schien die angemessenste zu sein.

Die Fähigkeit von Highlightjs, die Sprache eines Fragments automatisch zu erkennen, ermöglicht das Hervorheben von Funktionen in anderen Sprachen. Zum Beispiel funktioniert alles für 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; 

Sie brauchen nichts Besonderes, schreiben Sie einfach

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

Natürlich hängt die gewählte Sprache nur davon ab, was in den Dollars geschrieben ist, und in keiner Weise davon, was nach LANGUAGE geschrieben wird.

Im Allgemeinen entspricht die Hintergrundbeleuchtung der kürzlich veröffentlichten 11. Version von PostgreSQL.

Es gab viele Zweifel an den Hervorhebungsfunktionen. Leider ist zur Unterscheidung eines Funktionsnamens von beispielsweise einem Tabellennamen eine vollständige Analyse erforderlich, die jedoch innerhalb der Syntaxhervorhebung nicht gelöst wird. Sie können eine lange Liste von Standardfunktionen erstellen und diese einfärben, aber was ist mit Funktionen aus zahlreichen Erweiterungen? Infolgedessen habe ich beschlossen, überhaupt nicht zu färben - trotzdem beruht alles auf Schlüsselwörtern, und die Variation wird reduziert.

Klartext: Text, Klartext


Manchmal ist es im Artikel erforderlich, die Ergebnisse der Abfrage auszugeben. Natürlich gibt es dort keine Schlüsselwörter, nichts muss hervorgehoben werden, aber ich möchte, dass der Text wie der Code „Konsole“ aussieht. Hierfür können Sie jetzt die spezielle Klartext- Sprache verwenden. Zum Beispiel zu bekommen

 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) 

schreibe

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

Klartext sollte immer explizit angegeben werden, er wird nicht automatisch erkannt.

Ich hoffe, dass Ihnen die Innovation gefällt und Sie sich als nützlich erweisen. Wenn Sie einen Fehler bei der Hervorhebung des Codes feststellen (und Fehler unvermeidlich sind, ist die kontextsensitive Syntax für SQL zu viel), erstellen Sie eine Aufgabe auf dem Github des Projekts und schlagen Sie noch besser eine Lösung vor.

PS Vergessen Sie nicht die PGConf- Konferenz, die vom 4. bis 6. Februar in Moskau stattfinden wird. Bewerbungen für Berichte sind bis zum 5. Dezember möglich!

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


All Articles