Saya segera berbagi kabar baik: kehidupan penulis artikel tentang PostgreSQL dan pembaca mereka menjadi sedikit lebih baik.
Seperti yang diketahui habispisters, untuk mendesain kode sumber, tag
<source>
khusus digunakan, yang menyoroti sintaksis. Bukan rahasia lagi bahwa backlighting tidak selalu sempurna, dan kemudian penulis (yang peduli tentang seperti apa artikel mereka) dipaksa untuk terlibat dalam pertunjukan amatir - untuk mewarnai kode mereka menggunakan
<font color=...>
.
Semuanya sangat menyedihkan dengan PostgreSQL, karena penyorotannya mencakup kurang lebih standar SQL dan pasti tidak memahami spesifikasi DBMS kami. Seiring waktu
berlalu ,
boomburum Alexey dengan hati-hati mengoreksi
font saya ke sumber (dan saya kembali), sampai menjadi jelas bahwa lampu latar perlu diperbaiki. Akhirnya, Daler
daleraliyorov menyarankan jalan keluar: tambahkan dukungan PostgreSQL ke perpustakaan
highlightjs yang digunakan oleh Habr. Dan sekarang - selesai, selamat datang.
pgsql: SQL, PL / pgSQL dan semuanya
Jadi, rahasia penyorotan yang benar adalah dalam bahasa
pgsql baru. Itu dapat dipilih di menu (tombol "kode sumber") atau ditentukan secara manual. Dalam html Anda perlu menulis
<source lang="pgsql">
</source>
dan dalam penurunan harga seperti ini:
```pgsql
```
Pada prinsipnya, highlightjs dapat menentukan bahasa itu sendiri, tetapi biasanya hanya berfungsi untuk fragmen kode besar; dalam potongan kecil, deteksi otomatis sering gagal. Selain itu, deteksi otomatis membutuhkan waktu, jadi jika Anda menentukan bahasa secara eksplisit, kode akan lebih cepat bersinar.
Misalnya, untuk mendapatkan
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)) );
kami sedang menulis
<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>
Bahasa pgsql yang sama juga mewarnai kode PL / pgSQL. Misalnya, untuk mendapatkan
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;
tulis
<source lang="pgsql">
CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$
...
$$ LANGUAGE plpgsql;
</source>
Sedikit kehalusan adalah bahwa string karakter yang disertakan dalam dolar
selalu disorot sebagai kode, dan string dalam apostrof tidak pernah disorot. Saya mempertimbangkan opsi yang berbeda, tetapi yang ini tampaknya paling memadai.
Kemampuan highlightjs untuk secara otomatis mendeteksi bahasa suatu fragmen memungkinkan menyoroti fungsi dalam bahasa lain. Misalnya, semuanya akan berfungsi untuk 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;
Anda tidak perlu sesuatu yang istimewa, cukup tulis
<source lang="pgsql">
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
...
$$ LANGUAGE plperl;
</source>
Tentu saja, bahasa yang dipilih hanya bergantung pada apa yang ditulis di dalam dolar, dan sama sekali tidak ditentukan oleh apa yang ditulis setelah LANGUAGE.
Secara umum, lampu latar sesuai dengan versi 11 PostgreSQL yang baru dirilis.
Ada banyak keraguan tentang fitur yang disorot. Sayangnya, untuk membedakan nama fungsi dari, misalnya, nama tabel, penguraian lengkap diperlukan, tetapi ini tidak diselesaikan dalam penyorotan sintaksis. Anda dapat membuat daftar panjang fungsi standar dan mewarnainya, tetapi bagaimana dengan fungsi dari berbagai ekstensi? Akibatnya, saya memutuskan untuk tidak mewarnai sama sekali - semua sama, semuanya bertumpu pada kata kunci, dan variegasinya berkurang.
plaintext: teks, teks biasa
Terkadang dalam artikel itu diperlukan untuk memformalkan hasil permintaan. Tentu saja, tidak ada kata kunci di sana, tidak ada yang perlu disorot, tetapi saya ingin teks terlihat "menghibur", seperti kodenya. Untuk ini, Anda sekarang dapat menggunakan bahasa
plaintext khusus. Misalnya, untuk mendapatkan
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)
tulis
<source lang="pgsql">
WITH xmldata(data) AS (VALUES ($$
...
</source>
<source lang="plaintext">
foo | bar
-----+-----
1 | 2
3 | 4
4 | 5
(3 rows)
</source>
Plaintext harus selalu ditentukan secara eksplisit, tidak terdeteksi secara otomatis.
Saya harap Anda akan menyukai inovasi dan berguna. Jika Anda menemukan kesalahan dalam bagaimana kode disorot (dan kesalahan tidak bisa dihindari, sintaks konteks-sensitif terlalu banyak untuk SQL), buat tugas di
github proyek , dan bahkan lebih baik, mengusulkan solusi.
PS Jangan lupa tentang konferensi PGConf , yang akan diadakan 4-6 Februari di Moskow. Aplikasi untuk laporan diterima hingga 5 Desember!