أسارع إلى مشاركة الأخبار السارة: أصبحت حياة مؤلفي المقالات حول PostgreSQL وقرائهم أفضل قليلاً.
كما يعلم كل habispisters ، لتصميم رمز المصدر ، يتم استخدام علامة
<source>
خاصة ، والتي تبرز بناء الجملة. ليس سراً أن الإضاءة الخلفية ليست مثالية دائمًا ، ثم يضطر المؤلفون (الذين يهتمون بمظهر مقالاتهم) للمشاركة في عروض الهواة - لتلوين التعليمات البرمجية الخاصة بهم باستخدام
<font color=...>
.
كان كل شيء حزينًا بشكل خاص مع PostgreSQL ، نظرًا لأن التظليل غطى SQL القياسي بشكل أو بآخر ولم يفهم تمامًا تفاصيل DBMS الخاصة بنا. مع
مرور الوقت ، قام أليكسي
بوم بوروم بتصحيح
الخطوط بعناية إلى المصدر (وعادت) ، حتى أصبح من الواضح أن الإضاءة الخلفية بحاجة إلى
الإصلاح . وأخيرًا ، اقترح
Daler daleraliyorov مخرجًا : أضف دعم PostgreSQL إلى مكتبة
highlightjs التي يستخدمها Habr. والآن - انتهى ، مرحبًا.
pgsql: SQL و PL / pgSQL و All-all-all
لذا ، فإن سر التمييز الصحيح هو في لغة
pgsql الجديدة. يمكن تحديده في القائمة (زر "شفرة المصدر") أو تحديده يدويًا. في أتش تي أم أل تحتاج إلى الكتابة
<source lang="pgsql">
</source>
وفي تخفيض السعر مثل هذا:
```pgsql
```
من حيث المبدأ ، يمكن لـ highlightjs تحديد اللغة نفسها ، ولكنها عادة ما تعمل فقط لأجزاء التعليمات البرمجية الكبيرة ؛ في قطع صغيرة ، غالبًا ما يخطئ الاكتشاف التلقائي. بالإضافة إلى ذلك ، يستغرق الاكتشاف التلقائي وقتًا ، لذلك إذا حددت اللغة بشكل صريح ، فسوف يتألق الرمز بشكل أسرع.
على سبيل المثال ، للحصول على
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 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>
تلوين نفس لغة pgsql أيضًا كود PL / pgSQL. على سبيل المثال ، للحصول على
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;
اكتب
<source lang="pgsql">
CREATE FUNCTION get_available_flightid(date) RETURNS SETOF integer AS $$
...
$$ LANGUAGE plpgsql;
</source>
الدقيقة الدقيقة هي أن سلاسل الأحرف المضمنة بالدولار يتم تمييزها
دائمًا كرمز ، ولا يتم تمييز السلاسل في الفواصل العليا أبدًا. فكرت في خيارات مختلفة ، ولكن يبدو أن هذا هو الخيار الأكثر ملاءمة.
تتيح قدرة highlightjs على اكتشاف لغة جزء تلقائيًا تمييز وظائف في لغات أخرى. على سبيل المثال ، كل شيء سيعمل مع 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;
لا تحتاج إلى أي شيء خاص ، فقط اكتب
<source lang="pgsql">
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
...
$$ LANGUAGE plperl;
</source>
بالطبع ، تعتمد اللغة المختارة فقط على ما هو مكتوب داخل الدولارات ، ولا يتم تحديدها بأي شكل من الأشكال بما يتم كتابته بعد اللغة.
بشكل عام ، يتوافق الضوء الخلفي مع الإصدار 11 الذي تم إصداره مؤخرًا من PostgreSQL.
كان هناك الكثير من الشك حول ميزات التمييز. لسوء الحظ ، للتمييز بين اسم وظيفة ، على سبيل المثال ، اسم جدول ، هناك حاجة إلى تحليل كامل ، ولكن لم يتم حل هذا ضمن تمييز بناء الجملة. يمكنك عمل قائمة طويلة من الوظائف القياسية ولونها ، ولكن ماذا عن الوظائف من ملحقات عديدة؟ ونتيجة لذلك ، قررت عدم التلوين على الإطلاق - على الرغم من كل شيء ، كل شيء يعتمد على الكلمات الرئيسية ، ويتم تقليل التنوع.
نص عادي: نص ، نص عادي
في بعض الأحيان ، يُطلب من المقالة إصدار نتائج الاستعلام. بالطبع ، لا توجد كلمات رئيسية هناك ، ولا حاجة إلى تسليط الضوء على أي شيء ، لكني أريد أن يبدو النص "وحدة تحكم" ، تمامًا مثل الشفرة. لهذا ، يمكنك الآن استخدام لغة
النص الخاص. على سبيل المثال ، للحصول على
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)
اكتب
<source lang="pgsql">
WITH xmldata(data) AS (VALUES ($$
...
</source>
<source lang="plaintext">
foo | bar
-----+-----
1 | 2
3 | 4
4 | 5
(3 rows)
</source>
يجب دائمًا تحديد النص العادي بشكل صريح ؛ ولا يتم اكتشافه تلقائيًا.
آمل أن يعجبك الابتكار وأن تكون في متناول يدك. إذا وجدت خطأ في كيفية تمييز الرمز (وكانت الأخطاء حتمية ، فإن البنية اللغوية الحساسة للسياق كبيرة جدًا بالنسبة لـ SQL) ، وأنشئ مهمة على
جيثوب المشروع ، والأفضل من ذلك ، اقترح حلًا.
سكرتير خاص لا تنسى مؤتمر PGConf ، الذي سيعقد في 4-6 فبراير في موسكو. يتم قبول طلبات التقارير حتى 5 ديسمبر!