هایلایتر زبان هاشمی


مسئولین پارک علم‌و‌فناوری پردیس تصمیم دارند تا در سری رویداد بعدی المپیک‌فناوری، یک مسیر راه جدید برای زبان‌های برنامه‌نویسی بومی به ویژه زبان برنامه نویسی آقای هاشمی برگزار کنند. نیما که مسئول طراحی محتوای این مسیر راه جدید و ویژه و تولید داخلی است، به دلیل کمتر شناخته شده بودن زبان برنامه نویسی آقای هاشمی، دسترسی به یک سینتکس هایلایتر (Syntax Highlighter) مناسب برای ژینگول و خوشگل کردن کد‌های رویداد را ندارد و از شما برای پیاده سازی این کد هایلایتر کمک می‌خواهد!

خانواده آقای هاشمی

جزئیات پروژه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید.

ساختار فایل‌ها
src
├── CommonMark
│   ├── CommonMarkConverter.php
│   └── Parser.php
├── Languages
│   ├── Hashemi
│   │   ├── HashemiLanguage.php
│   │   ├── Injections
│   │   │   └── JsonInjection.php
│   │   └── Patterns
│   │       ├── HmBuiltinPattern.php
│   │       ├── HmDoubleQuoteValuePattern.php
│   │       ├── HmFunctionCallPattern.php
│   │       ├── HmKeywordPattern.php
│   │       ├── HmMultilineCommentPattern.php
│   │       ├── HmNumberPattern.php
│   │       ├── HmOperatorPattern.php
│   │       ├── HmSinglelineCommentPattern.php
│   │       └── HmTripleDoubleQuoteStringPattern.php
├── Themes
│   ├── DefaultTheme.php
│   └── ThemeManager.php
└── Tokens
    ├── GroupTokens.php
    ├── TokenAnalyzer.php
    └── TokenValidator.php
Plain text
راه‌اندازی پروژه

برای اجرای پروژه، باید php و composer را از قبل نصب کرده باشید.

  • پروژه‌ی اولیه را دانلود و از حالت فشرده خارج کنید.
  • دستور composer install را در پوشه‌ی اصلی پروژه برای نصب نیازمندی‌ها اجرا کنید.
  • دستور php -S localhost:8000 -t tests/ را در پوشه‌ی اصلی پروژه اجرا کنید. پروژه از طریق آدرس http://localhost:8000 در دسترس خواهد بود.

تست پروژه🔗

برای تست پروژه لازم است تا به مسیر /tests در مرورگر خود بروید. این صفحه یک فایل کد هاشمی را که از قبل در پروژه برای تست شما قرار داده شده هایلایت کرده و به شما نمایش می‌دهد.

  • شما می‌توانید با مقایسه کد هایلایت شده در صفحه‌ی لود شده با کد‌های هایلایت شده در تصاویر استفاده شده در سوال از درستی کارکرد کد خود اطمینان حاصل کنید.
  • تست کد با استفاده از مقایسه خروجی کد هایلایت شده توسط پروژه آپلود شده توسط شما و کد هایلایت شده توسط داوری خودکار سوال مورد ارزیابی قرار خواهد گرفت.

پروژه اصلی tempestphp/highlight🔗

در این سوال از نسخه 2.10.2 پروژه آماده کد هایلایتر tempestphp/highlight استفاده کرده و با توسعه‌ی آن، زبان برنامه نویسی آقای هاشمی را نیز به آن اضافه خواهیم کرد. شما در این سوال قرار است تا با توجه به توضیحات ساختار‌های گفته شده، با استفاده از عبارات باقاعده (Regular expressions) نواحی و اجزای مختلف یک کد را تشخیص داده و به هسته‌ی اصلی این کد هایلایتر بگویید تا با توکن تایپ (TokenType) مناسب آن را برای شما هایلایت کند.

برسی بیشتر ساختار کد هایلایتر tempestphp/highlight (مهم، حتما مطالعه شود!)

برسی بیشتر ساختار نسخه 2.10.2 کد هایلایتر tempestphp/highlight🔗

ساختار این کد هایلایتر به این شکل است که سه مفهوم اصلی به صورت languages، injections و patterns را از پیش پیاده‌سازی کرده است. در این بخش به برسی این بخش‌ها می‌پردازیم و سپس به سراغ مواردی می‌رویم که از شما انتظار داریم تا در این سوال پیاده‌سازی کنید:

  1. ساختار الگو‌ها (Patterns): یک الگو (Pattern) نمایانگر قسمتی از کد است که باید هایلایت (Highlight) شود. یک الگو می‌تواند هدفش یک کلمه کلیدی مانند return یا class باشد یا می‌تواند هر قسمتی از کد باشد، مانند یک کامنت: /* this is a comment */ یا حتی فراخوانی یک تابع. هر الگو با یک کلاس ساده نمایش داده می‌شود که یک عبارت باقاعده (Regular expression) و یک TokenType دارد. عبارت Regex برای تطبیق محتوای مرتبط با این الگوی خاص استفاده می‌شود، در حالی که TokenType یک مقدار از نوع enum است که تعیین می‌کند چگونه آن الگوی خاص هایلایت شود. برای برسی مثال‌های بیشتر از این لینک اقدام کنید.

توجه داشته باشید که در این سوال شما صرفا قرار است تا از TokenType های پیشفرض استفاده کنید و نیازی به پیاده‌سازی جدیدی برای این مورد نیست. در هر بخش TokenType مربوطه به شما داده می‌شود تا آن را در ساختار کد قرار دهید.

  1. ساختار تزریق‌ها (Injections): ساختار بعدی مربوط به بخش تزریق‌ها (Injections) می‌باشد. از تزریق‌ها برای هایلایت کردن زبان‌های مختلف در یک بلوک کد استفاده می‌شوند. برای مثال: HTML می‌تواند شامل CSS باشد که باید به شیوه درست در کنار HTML هایلایت شود. برای برسی مثال‌های بیشتر از این لینک اقدام کنید. توجه داشته باشید که در این سوال شما صرفا قرار است تا در قالب jfarzand در کد‌های زبان هاشمی خود از ساختار Json استفاده کنید.

  2. ساختار زبان‌ها (Languages): آخرین ساختار در این کد‌ هایلایتر، ساختار زبان‌ها (Languages) می‌باشد که همان نماینده زبان‌های برنامه‌نویسی است به صورت کلاس‌هایی همراه با پیاده‌سازی الگو‌ها (Patterns) و تزریق‌ها (Injections) می‌باشد. برای برسی مثال‌های بیشتر از این لینک اقدام کنید. زبانی که شما در این سوال به سراغ آن خواهید رفت زبان برنامه‌نویسی آقای هاشمی (HashemiLanguage) خواهد بود.

برسی بیشتر یک مثال مهم در پیاده سازی الگو‌ها (Patterns) (مهم، حتما مطالعه شود!)

در این بخش به برسی یک مثال مهم از شیوه تشخیص و هایلایت کردن الگو‌ها (Patterns) مشخص شده در هر کدام از بخش‌های یک زبان می‌پردازیم. به مثال زیر از پیاده‌سازی هایلایت کردن namespace ها در php دقت کنید:

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenType;

final readonly class NamespacePattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return 'namespace (?<match>[\w\\\\]+)';
    }

    public function getTokenType(): TokenType
    {
        return TokenType::TYPE;
    }
}
PHP
  • در مثال بالا یک الگوی جدید با نام NamespacePattern ایجاد شده است که مسئول هایلایت کردن namespace ها می‌باشد. همانطور که مشاهده می‌کنید در تابع getPattern یک عبارت باقاعده return شده است که نمایانگر انتخاب‌گر آن ساختار خاص (در اینجا namespace ها) در کد می‌باشد. همچنین در تابع getTokenType یک Enum از نوع TokenType برگردانده می‌شود. در هر بخش مقدار TokenType ای که باید در این ساختار return کنید به شما معرفی می‌شود.
  • این Regex‌ ها باید شامل یک گروه با نام match باشند که به این صورت نوشته می‌شود: (?<match>…). این گروه نمایانگر بخشی از کد است که در واقع هایلایت خواهد شد.

توجه داشته باشید که هر الگو باید یک گروه تطبیق (Capture Group) نام‌گذاری‌شده در Regex داشته باشد که نام آن "match" باشد. هسته هایلایتر محتوایی که درون این گروه تطبیق پیدا کرده است را هایلایت خواهد کرد.

برای مثال، این regex namespace (?<match>[\w\\\\]+) می‌گوید که هر خطی که با کلمه namespace شروع شود باید در نظر گرفته شود، اما تنها بخشی که درون گروه نام‌گذاری‌شده (?<match>…) قرار دارد هایلایت می‌شود اما خود واژه namespace چون در گروه match در نظر گرفته نشده است هایلایت نخواهد شد.

افزودن زبان برنامه نویسی جدید به tempestphp/highlight🔗

شما باید پوشه Hashemi که کد‌های مربوط به هایلایتر زبان هاشمی در آن قرار دارد را مطابق با مستندات این زبان و توضیحات گفته شده در بخش زیر کامل و در پایان این بخش آن را آپلود کنید. توجه کنید که هایلایتر شما حتما باید در ساختار زیر عمل کند تا نمره کامل را دریافت کند. همچنین شما تنها مجاز به ویرایش فایل‌های موجود هستید و نمی‌توانید فایل‌های جدیدی را به این بخش اضافه کنید.

ساختار کامنت‌های تک‌خطی در زبان هاشمی و پیاده‌سازی کلاس HmSinglelineCommentPattern

ساختار کامنت‌های تک‌خطی در زبان برنامه‌نویسی آقای هاشمی مطابق با مستندات این زبان، مانند بسیاری از زبان های دیگر به صورت زیر می‌باشد:

// yek comment
Hashem

شما باید کلاس HmSinglelineCommentPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند کامنت‌های تک خطی را با استفاده از TokenType مربوط به کامنت یعنی COMMENT رنگی کند.

extensionFromNameHmSinglelineCommentPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmSinglelineCommentPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کامنت‌های تک‌خطی را به درستی هایلایت کند.

تصویر مثال کامنت تک‌خطی

ساختار کامنت‌های چندخطی در زبان هاشمی و پیاده‌سازی کلاس HmMultilineCommentPattern

ساختار کامنت‌های چند‌خطی در زبان برنامه‌نویسی آقای هاشمی مطابق با مستندات این زبان، مانند بسیاری از زبان های دیگر به صورت زیر می‌باشد:

/*
in teke az code pardazesh nakhahad shod   
*/

/**  
 * baraye neveshtan e mostanadat  
 */
Hashem

شما باید کلاس HmMultilineCommentPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند کامنت‌های چندخطی را با استفاده از TokenType مربوط به کامنت یعنی COMMENT رنگی کند.

extensionFromNameHmMultilineCommentPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmMultilineCommentPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کامنت‌های چند‌خطی را به درستی هایلایت کند.

تصویر مثال کامنت چندخطی

ساختار کلمات کلیدی در زبان هاشمی و پیاده‌سازی کلاس HmKeywordPattern

کلمات کلیدی در هر زبان برنامه‌نویسی، کلماتی هستند که توسط این زبان‌ها برای اعمال مختلف رزرو شده‌اند. در زبان برنامه‌نویسی هاشمی، کلمات ta، bede، bebin، age، bood، na?، zirsakht جزو کلمات کلیدی به حساب می‌آیند.

شما باید کلاس HmKeywordPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند کلمات‌کلیدی را با استفاده از TokenType مربوط به آن یعنی KEYWORD رنگی کند.

extensionFromNameHmKeywordPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmKeywordPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کلمات‌کلیدی را به درستی هایلایت کند.

تصویر مثال کلمات کلیدی

ساختار توابع پیش‌ساخته در زبان هاشمی و پیاده‌سازی کلاس HmBuiltinPattern

توابع پیش‌ساخته در زبان برنامه‌نویسی آقای هاشمی مانند سایر زبان‌های برنامه‌نویسی، مسئولیت انجام برخی موارد حیاتی از جمله چاپ یا پردازش برخی رشته‌های متنی را دارند. در زبان هاشمی توابع پیش‌ساخته به صورت کلمات azinja، bechap و jfarzand می‌باشند.

شما باید کلاس HmBuiltinPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند توابع پیش‌ساخته را با استفاده از TokenType مربوط به آن یعنی TYPE رنگی کند.

extensionFromNameHmBuiltinPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmBuiltinPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به توابع پیش‌ساخته را به درستی هایلایت کند.

تصویر مثال توابع پیش‌ساخته

ساختار فراخوانی و تعریف توابع در زبان هاشمی و پیاده‌سازی کلاس HmFunctionCallPattern

فراخوانی‌ها و تعریف توابع در زبان‌برنامه نویسی هاشمی به شکل زیر می‌باشد:

bebin jam(alef, be) {
    javab = alef + be; 
    bede javab;
}

bebin azinja() {
    ye_adad = 100;
    ye_adad_dige = 200;
    natije = jam(ye_adad, ye_adad_dige);
    bechap(natije);
}
Hashem
  • منظور از هایلایت کردن تعاریف توابع در مثال بالا، هایلایت کردن عبارت jam در خط اول (هنگام تعریف تابع) و در خط هشتم (در فراخوانی تابع) می‌باشد.

شما باید کلاس HmFunctionCallPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند تعریف و فراخوانی توابع را با استفاده از TokenType مربوط به آن یعنی PROPERTY رنگی کند.

extensionFromNameHmFunctionCallPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmFunctionCallPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به فراخوانی و تعریف توابع را به درستی هایلایت کند.

تصویر مثال فراخوانی توابع

ساختار استفاده از اعداد در زبان هاشمی و پیاده‌سازی کلاس HmNumberPattern

ساختار دیگری که شما باید در این هایلایتر پیاده‌سازی کنید مربوط به بخش استفاده از اعداد در این زبان می‌باشد. اعداد می‌توانند در بخش‌های مختلف کد از جمله در شرط‌ها، در مقدار‌دهی متغیر‌ها و در فراخوانی توابع استفاده شوند. در زبان هاشمی تنها از اعداد صحیح، اعداد اعشاری و نمایش اعداد به صورت نمادگذاری علمی پشتیبانی می‌شود.

bebin factorial(n) {
   age (n < 1) bood {
      bede 1;
   }
   bede factorial(n-1) * n;
}

bebin tarkib(k, n) {
    soorat = factorial(n);
    makhraj = factorial(k) * factorial(n-k);
    javab = soorat / makhraj;
    bede javab;
}

bebin azinja() {
    f = tarkib(5, 2);
    bechap(f);
}
Hashem
  • مثالی از استفاده از اعداد در فراخوانی توابع، شرط ها و ... در زبان برنامه نویسی هاشمی

شما باید کلاس HmNumberPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند تعریف و فراخوانی توابع را با استفاده از TokenType مربوط به آن یعنی NUMBER رنگی کند.

extensionFromNameHmNumberPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmNumberPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از اعداد را به درستی هایلایت کند.

تصویر مثال اعداد در زبان هاشمی

ساختار عملگر‌ها در زبان هاشمی و پیاده‌سازی کلاس HmOperatorPattern

عملگر‌ها در زبان آقای هاشمی در سه دسته‌بندی به شکل عملگر‌های عددی -+%/*، عملگر‌های منطقی به صورت‌های ==، <=، >=، !=، <، > و عملگر‌ انتساب = باشد. توجه کنید که عملگر‌های دو کاراکتری، مثلا == باید به صورت یکجا به عنوان یک عملگر در نظر گرفته شود و نه به صورت دو عملگر = و =.

age (1==1) bood {  
    bechap("doroste");  
} na? {  
    bechap("dorost nist, ye fekri barash bokon");  
}

adadeMan = 0;  
majmoo = 0;  

ta (adadeMan<11) bood {  
    majmoo = majmoo + adadeMan;  
    adadeMan = adadeMan + 1;  
}
Hashem
  • مثالی از انواع استفاده‌ها از عملگر‌ها در بخش‌های مختلف زبان هاشمی

شما باید کلاس HmOperatorPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند عملگر‌های مختلف را با استفاده از TokenType مربوط به آن یعنی OPERATOR رنگی کند.

extensionFromNameHmOperatorPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmOperatorPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از عملگر‌ها را به درستی هایلایت کند.

تصویر مثال استفاده از عملگرها

ساختار رشته‌ها در زبان هاشمی و پیاده‌سازی کلاس‌HmDoubleQuoteValuePattern

رشته‌ها در زبان برنامه‌نویسی آقای هاشمی به صورت DoubleQuote ( " " ) مورد استفاده قرار می‌گیرند. شما باید هایلایتر این مورد را به صورتی پیاده‌سازی کنید که محتوای درون این دو علامت نقل‌قول به صورت درستی هایلایت شوند.

nam = "Mr ";
famil = "Hashemi";  
tedadeBache = 3;  
moteahel = 1==1;
mabda = "Kazeroon";  
maghsad = "Neishaboor";

bebin azinja() {
  bechap("Dorood Jahan");
}
Hashem
  • مثالی از رشته‌ها در زبان هاشمی

شما باید کلاس HmDoubleQuoteValuePattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند رشته‌های مختلف را با استفاده از TokenType مربوط به آن یعنی VALUE رنگی کند.

extensionFromNameHmDoubleQuoteValuePattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmDoubleQuoteValuePattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از رشته‌ها را به درستی هایلایت کند.

تصویر مثال رشته‌ها در زبان هاشمی

ساختار رشته‌های چندخطی در زبان هاشمی و پیاده‌سازی کلاس‌HmTripleDoubleQuoteStringPattern

رشته‌های چندخطی در زبان برنامه‌نویسی آقای هاشمی به صورت TripleDoubleQuote ( """ """ ) مورد استفاده قرار می‌گیرند. شما باید هایلایتر این مورد را به صورتی پیاده‌سازی کنید که محتوای درون این سه‌تایی‌های علامت نقل‌قول به صورت درستی هایلایت شوند.

bebin azinja() {
  matn_toolani = """شعر از مولانا
خنک آن قمار بازی که بباخت آنچه بودش
بنماند هیچش الا هوس قمار دیگر
  """;
  bechap(matn_toolani); 
}
Hashem
  • مثالی از رشته‌ها در زبان هاشمی

شما باید کلاس HmTripleDoubleQuoteStringPattern را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند رشته‌های بلند مختلف را با استفاده از TokenType مربوط به آن یعنی VALUE رنگی کند.

extensionFromNameHmTripleDoubleQuoteStringPattern.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Patterns;

use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenTypeEnum;

final readonly class HmTripleDoubleQuoteStringPattern implements Pattern
{
    use IsPattern;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function getTokenType(): TokenTypeEnum
    {
        return TokenTypeEnum::TYPE; // TODO: Implement
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از رشته‌های بلند را به درستی هایلایت کند.

تصویر مثال رشته‌ها در زبان هاشمی

ساختار تزریق Json در زبان هاشمی و پیاده‌سازی کلاس JsonInjection

همانطور که پیش‌تر در بخش برسی بیشتر کد هایلایتر به تزریق‌ها اشاره کردیم، در زبان برنامه‌نویسی آقای هاشمی می‌توان از Json در بین کد‌های هاشمی به شکل زیر و با استفاده از jfarzand پیاده‌سازی کرد:

bebin azinja() {
    object = jfarzand("""{"name":"Mr.Hashemi"}""");
    bechap(object.name);
    bechap(object.x);
}
Hashem
  • مثالی از تزریق Json در زبان هاشمی

شما باید کلاس JsonInjection را به صورت زیر در فایلی با همین نام پیاده‌سازی کنید تا کد هایلایتر بتواند تزریق‌های مختلف Json را در زبان هاشمی را هایلایت کند. در ساختار تزریق‌ها نیازی به TokenType نیست و شما باید در ساختار زیر صرفا از هایلایتر از پیش ساخته شده‌ی Json درون همین پکیج استفاده کنید.

extensionFromNameJsonInjection.php
<?php

declare(strict_types=1);

namespace Tempest\Highlight\Languages\Hashemi\Injections;

use Tempest\Highlight\Highlighter;
use Tempest\Highlight\Injection;
use Tempest\Highlight\IsInjection;

final readonly class JsonInjection implements Injection
{
    use IsInjection;

    public function getPattern(): string
    {
        return ""; // TODO: Implement
    }

    public function parseContent(string $content, Highlighter $highlighter): string
    {
        return $highlighter->parse($content, 'json');
    }
}
PHP

در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از تزریق Json را به درستی هایلایت کند.

تصویر مثال تزریق json

آن‌چه باید آپلود کنید🔗

  • توجه: مطالعه بخش "برسی بیشتر یک مثال مهم در پیاده سازی الگو‌ها (Patterns)" از اهمیت بالایی از جهت نحوه پیاده‌سازی الگو‌های مختلف دارد، لذا در خواندن آن کوشا باشید.
  • توجه: داوری این سوال در تست‌های مختلف کد‌هایی شامل ساختار‌های مختلف را به صورت ترکیبی به هایلایتر شما می‌دهد. دریافت نمره بیشتر از سوال با نسبتی از سوال که ساختار آن‌ها را کاملا پیاده‌سازی کرده‌اید رابطه مستقیم دارد.
  • توجه: تنها فایل‌هایی از پروژه هایلایتر شما در سیستم داوری مورد پذیرش قرار خواهد گرفت که در بخش "ساختار فایل‌ها" به صورت رنگی مشخص شده است. سایر تغییرات در سایر فایل‌ها بی‌تاثیر خواهند بود.
  • توجه: پس از اعمال تغییرات، کل پروژه به غیر از پوشه‌ی vendor را ZIP کرده و آپلود کنید.
  • توجه: نام فایل ZIP اهمیتی ندارد.