مسئولین پارک علموفناوری پردیس تصمیم دارند تا در سری رویداد بعدی *المپیکفناوری*، یک مسیر راه جدید برای زبانهای برنامهنویسی **بومی** به ویژه زبان برنامه نویسی **آقای هاشمی** برگزار کنند. **نیما** که مسئول طراحی محتوای این مسیر راه جدید و ویژه و تولید داخلی است، به دلیل کمتر شناخته شده بودن [**زبان برنامه نویسی آقای هاشمی**](https://mr-hashemi.github.io/mr-hashemi/)، دسترسی به یک [**سینتکس هایلایتر** _(Syntax Highlighter)_](https://en.wikipedia.org/wiki/Syntax_highlighting) مناسب برای ژینگول و خوشگل کردن کدهای رویداد را ندارد و از شما برای پیاده سازی این کد هایلایتر کمک میخواهد!
![خانواده آقای هاشمی](https://quera.org/qbox/view/ma8zv0j81a/hashemi-family.jpg)
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/255957/) دانلود کنید.
<details class="yellow">
<summary>
**ساختار فایلها**
</summary>
```plaintext
src
├── CommonMark
│ ├── CommonMarkConverter.php
│ └── Parser.php
├── Languages
│ ├── Hashemi
│ │ ├── HashemiLanguage.php
│ │ ├── Injections
│ │ │ └── <mark class="orange" title="این فایل باید پیادهسازی شود">JsonInjection.php</mark>
│ │ └── Patterns
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmBuiltinPattern.php</mark>
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmDoubleQuoteValuePattern.php</mark>
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmFunctionCallPattern.php</mark>
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmKeywordPattern.php</mark>
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmMultilineCommentPattern.php</mark>
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmNumberPattern.php</mark>
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmOperatorPattern.php</mark>
│ │ ├── <mark class="orange" title="این فایل باید پیادهسازی شود">HmSinglelineCommentPattern.php</mark>
│ │ └── <mark class="orange" title="این فایل باید پیادهسازی شود">HmTripleDoubleQuoteStringPattern.php</mark>
├── Themes
│ ├── DefaultTheme.php
│ └── ThemeManager.php
└── Tokens
├── GroupTokens.php
├── TokenAnalyzer.php
└── TokenValidator.php
```
</details>
<details class="grey">
<summary>
**راهاندازی پروژه**
</summary>
**برای اجرای پروژه، باید `php` و `composer` را از قبل نصب کرده باشید.**
+ پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
+ دستور `composer install` را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
+ دستور `php -S localhost:8000 -t tests/` را در پوشهی اصلی پروژه اجرا کنید. پروژه از طریق آدرس http://localhost:8000 در دسترس خواهد بود.
#### تست پروژه
برای **تست پروژه** لازم است تا به مسیر `/tests` در مرورگر خود بروید. این صفحه یک فایل کد هاشمی را که از قبل در پروژه برای تست شما قرار داده شده **هایلایت کرده** و به شما **نمایش** میدهد.
+ شما میتوانید با **مقایسه** کد هایلایت شده در صفحهی لود شده با کدهای هایلایت شده در تصاویر استفاده شده در سوال از درستی کارکرد کد خود **اطمینان** حاصل کنید.
+ تست کد با استفاده از مقایسه خروجی کد هایلایت شده توسط پروژه آپلود شده **توسط شما** و کد هایلایت شده **توسط داوری خودکار** سوال مورد ارزیابی قرار خواهد گرفت.
</details>
# پروژه اصلی `tempestphp/highlight`
در این سوال از نسخه `2.10.2` پروژه آماده **کد هایلایتر** **[tempestphp/highlight](https://github.com/tempestphp/highlight)** استفاده کرده و با توسعهی آن، [**زبان برنامه نویسی آقای هاشمی**](https://mr-hashemi.github.io/mr-hashemi/) را نیز به آن اضافه خواهیم کرد. شما در این سوال قرار است تا با توجه به توضیحات ساختارهای گفته شده، با استفاده از [**عبارات باقاعده** *(Regular expressions)*](https://en.wikipedia.org/wiki/Regular_expression) نواحی و اجزای مختلف یک کد را **تشخیص داده** و به هستهی اصلی این کد هایلایتر بگویید تا با **توکن تایپ** *(TokenType)* مناسب آن را برای شما **هایلایت** کند.
<details class="blue">
<summary>
**برسی بیشتر ساختار کد هایلایتر** `tempestphp/highlight` *(مهم، حتما مطالعه شود!)*
</summary>
## **برسی بیشتر ساختار نسخه** `2.10.2` **کد هایلایتر** `tempestphp/highlight`
ساختار این کد هایلایتر به این شکل است که سه مفهوم اصلی به صورت *languages، injections و patterns* را از پیش پیادهسازی کرده است. در این بخش به برسی این بخشها میپردازیم و سپس به سراغ مواردی میرویم که از شما انتظار داریم تا در این سوال پیادهسازی کنید:
1. ساختار **الگوها** *(Patterns)*:
یک **الگو** *(Pattern)* نمایانگر قسمتی از کد است که باید **هایلایت** *(Highlight)* شود. یک الگو میتواند هدفش یک کلمه کلیدی مانند `return` یا `class` باشد یا میتواند هر قسمتی از کد باشد، مانند یک کامنت: `/* this is a comment */` یا حتی فراخوانی یک تابع.
هر الگو با یک کلاس ساده نمایش داده میشود که یک [**عبارت باقاعده** *(Regular expression)*](https://en.wikipedia.org/wiki/Regular_expression) و یک `TokenType` دارد. عبارت Regex برای تطبیق محتوای مرتبط با این الگوی خاص استفاده میشود، در حالی که `TokenType` یک مقدار از نوع enum است که تعیین میکند چگونه آن الگوی خاص هایلایت شود. برای برسی مثالهای بیشتر از [**این لینک**](https://tempestphp.com/docs/highlight/custom-language/#1-patterns) اقدام کنید.
**توجه داشته باشید** که در این سوال شما صرفا قرار است تا از `TokenType` های پیشفرض استفاده کنید و نیازی به پیادهسازی جدیدی برای این مورد **نیست**. در هر بخش `TokenType` مربوطه به شما داده میشود تا آن را در ساختار کد قرار دهید.
2. ساختار **تزریقها** *(Injections)*:
ساختار بعدی مربوط به بخش **تزریقها** *(Injections)* میباشد. از تزریقها برای هایلایت کردن زبانهای مختلف در یک بلوک کد استفاده میشوند. برای مثال: HTML میتواند شامل CSS باشد که باید به شیوه درست در کنار HTML هایلایت شود. برای برسی مثالهای بیشتر از [**این لینک**](https://tempestphp.com/docs/highlight/custom-language/#2-injections) اقدام کنید. توجه داشته باشید که در این سوال شما صرفا قرار است تا در قالب `jfarzand` در کدهای زبان هاشمی خود از ساختار [Json](https://en.wikipedia.org/wiki/JSON) استفاده کنید.
3. ساختار **زبانها** *(Languages)*:
آخرین ساختار در این کد هایلایتر، ساختار **زبانها** *(Languages)* میباشد که همان نماینده زبانهای برنامهنویسی است به صورت کلاسهایی همراه با پیادهسازی **الگوها** *(Patterns)* و **تزریقها** *(Injections)* میباشد. برای برسی مثالهای بیشتر از [**این لینک**](https://tempestphp.com/docs/highlight/custom-language/#3-languages) اقدام کنید. زبانی که شما در این سوال به سراغ آن خواهید رفت **زبان برنامهنویسی آقای هاشمی** (`HashemiLanguage`) خواهد بود.
</details>
<details class="yellow">
<summary>
برسی بیشتر یک مثال **مهم** در پیاده سازی **الگوها** *(Patterns)* *(مهم، حتما مطالعه شود!)*
</summary>
در این بخش به برسی یک **مثال مهم** از شیوه تشخیص و هایلایت کردن **الگوها** *(Patterns)* مشخص شده در هر کدام از بخشهای یک زبان میپردازیم. به مثال زیر از پیادهسازی هایلایت کردن `namespace` ها در `php` دقت کنید:
```php
use Tempest\Highlight\IsPattern;
use Tempest\Highlight\Pattern;
use Tempest\Highlight\Tokens\TokenType;
final readonly class NamespacePattern implements Pattern
{
use IsPattern;
public function <mark class="orange" title="تابع برگرداندن رشته حاوی عبارت باقاعده">getPattern</mark>(): string
{
return 'namespace (<mark class="blue" title="گروه match">?<match></mark>[\w\\\\]+)';
}
public function getTokenType(): TokenType
{
return TokenType::<mark class="blue" title="در این قسمت توکن تایپهای مختلف قرار میگیرند">TYPE</mark>;
}
}
```
+ در مثال بالا یک الگوی جدید با نام `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` در نظر گرفته نشده است هایلایت **نخواهد** شد.
</details>
## **افزودن زبان برنامه نویسی جدید به** `tempestphp/highlight`
شما باید پوشه `Hashemi` که کدهای مربوط به **هایلایتر زبان هاشمی** در آن قرار دارد را مطابق با [مستندات این زبان](https://mr-hashemi.github.io/mr-hashemi/) و توضیحات گفته شده در بخش زیر کامل و در پایان این بخش آن را آپلود کنید. **توجه کنید که هایلایتر شما حتما باید در ساختار زیر عمل کند تا نمره کامل را دریافت کند.** همچنین شما تنها مجاز به ویرایش فایلهای موجود هستید و نمیتوانید فایلهای جدیدی را به این بخش اضافه کنید.
<details class="green">
<summary>
**ساختار کامنتهای تکخطی در زبان هاشمی** و پیادهسازی کلاس `HmSinglelineCommentPattern`
</summary>
ساختار **کامنتهای تکخطی** در زبان برنامهنویسی آقای هاشمی مطابق با [*مستندات این زبان*](https://mr-hashemi.github.io/mr-hashemi/variables/)، مانند بسیاری از زبان های دیگر به صورت زیر میباشد:
```hashem
// yek comment
```
شما باید کلاس `HmSinglelineCommentPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند کامنتهای تک خطی را با استفاده از `TokenType` مربوط به کامنت یعنی `COMMENT` رنگی کند.
```php HmSinglelineCommentPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کامنتهای تکخطی را به درستی هایلایت کند.**
![تصویر مثال کامنت تکخطی](https://quera.org/qbox/view/Udp0wqXVnd/singlecomment-hashemi.png)
</details>
<details class="yellow">
<summary>
**ساختار کامنتهای چندخطی در زبان هاشمی** و پیادهسازی کلاس `HmMultilineCommentPattern`
</summary>
ساختار **کامنتهای چندخطی** در زبان برنامهنویسی آقای هاشمی مطابق با [*مستندات این زبان*](https://mr-hashemi.github.io/mr-hashemi/variables/)، مانند بسیاری از زبان های دیگر به صورت زیر میباشد:
```hashem
/*
in teke az code pardazesh nakhahad shod
*/
/**
* baraye neveshtan e mostanadat
*/
```
شما باید کلاس `HmMultilineCommentPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند کامنتهای چندخطی را با استفاده از `TokenType` مربوط به کامنت یعنی `COMMENT` رنگی کند.
```php HmMultilineCommentPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کامنتهای چندخطی را به درستی هایلایت کند.**
![تصویر مثال کامنت چندخطی](https://quera.org/qbox/view/ma433D0Sem/multicomment-hashemi.png)
</details>
<details class="blue">
<summary>
**ساختار کلمات کلیدی در زبان هاشمی** و پیادهسازی کلاس `HmKeywordPattern`
</summary>
کلمات کلیدی در هر زبان برنامهنویسی، کلماتی هستند که توسط این زبانها برای اعمال مختلف **رزرو** شدهاند. در زبان برنامهنویسی هاشمی، کلمات `ta`، `bede`، `bebin`، `age`، `bood`، `na?`، `zirsakht` جزو **کلمات کلیدی** به حساب میآیند.
شما باید کلاس `HmKeywordPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند **کلماتکلیدی** را با استفاده از `TokenType` مربوط به آن یعنی `KEYWORD` رنگی کند.
```php HmKeywordPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کلماتکلیدی را به درستی هایلایت کند.**
![تصویر مثال کلمات کلیدی](https://quera.org/qbox/view/MIagtjTIYg/keyword-hashemi.png)
</details>
<details class="green">
<summary>
**ساختار توابع پیشساخته در زبان هاشمی** و پیادهسازی کلاس `HmBuiltinPattern`
</summary>
توابع پیشساخته در زبان برنامهنویسی آقای هاشمی مانند سایر زبانهای برنامهنویسی، مسئولیت انجام برخی موارد حیاتی از جمله چاپ یا پردازش برخی رشتههای متنی را دارند. در زبان هاشمی توابع پیشساخته به صورت کلمات `azinja`، `bechap` و `jfarzand` میباشند.
شما باید کلاس `HmBuiltinPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند توابع پیشساخته را با استفاده از `TokenType` مربوط به آن یعنی `TYPE` رنگی کند.
```php HmBuiltinPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به توابع پیشساخته را به درستی هایلایت کند.**
![تصویر مثال توابع پیشساخته](https://quera.org/qbox/view/zYHWU52NKj/contest_hashemi-example_builtin-hashemi.png)
</details>
<details class="green">
<summary>
**ساختار فراخوانی و تعریف توابع در زبان هاشمی** و پیادهسازی کلاس `HmFunctionCallPattern`
</summary>
فراخوانیها و تعریف توابع در زبانبرنامه نویسی هاشمی به شکل زیر میباشد:
```hashem
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);
}
```
- منظور از هایلایت کردن تعاریف توابع در مثال بالا، هایلایت کردن عبارت `jam` در خط اول (هنگام تعریف تابع) و در خط هشتم (در فراخوانی تابع) میباشد.
شما باید کلاس `HmFunctionCallPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند تعریف و فراخوانی توابع را با استفاده از `TokenType` مربوط به آن یعنی `PROPERTY` رنگی کند.
```php HmFunctionCallPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به فراخوانی و تعریف توابع را به درستی هایلایت کند.**
![تصویر مثال فراخوانی توابع](https://quera.org/qbox/view/PiGLwHE6Ot/functioncall-hashemi.png)
</details>
<details class="red">
<summary>
**ساختار استفاده از اعداد در زبان هاشمی** و پیادهسازی کلاس `HmNumberPattern`
</summary>
ساختار دیگری که شما باید در این هایلایتر پیادهسازی کنید مربوط به بخش استفاده از اعداد در این زبان میباشد. اعداد میتوانند در بخشهای مختلف کد از جمله در شرطها، در مقداردهی متغیرها و در فراخوانی توابع استفاده شوند. در زبان هاشمی تنها از اعداد صحیح، اعداد اعشاری و نمایش اعداد به صورت نمادگذاری علمی پشتیبانی میشود.
```hashem
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);
}
```
- مثالی از استفاده از اعداد در فراخوانی توابع، شرط ها و ... در زبان برنامه نویسی هاشمی
شما باید کلاس `HmNumberPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند تعریف و فراخوانی توابع را با استفاده از `TokenType` مربوط به آن یعنی `NUMBER` رنگی کند.
```php HmNumberPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از اعداد را به درستی هایلایت کند.**
![تصویر مثال اعداد در زبان هاشمی](https://quera.org/qbox/view/nFT41MNQHs/addad-hashemi.png)
</details>
<details class="pink">
<summary>
**ساختار عملگرها در زبان هاشمی** و پیادهسازی کلاس `HmOperatorPattern`
</summary>
عملگرها در زبان آقای هاشمی در سه دستهبندی به شکل عملگرهای عددی `-+%/*`، عملگرهای منطقی به صورتهای `==`، `<=`، `>=`، `!=`، `<`، `>` و عملگر انتساب `=` باشد. **توجه کنید که عملگرهای دو کاراکتری، مثلا** `==` **باید به صورت یکجا به عنوان یک عملگر در نظر گرفته شود و نه به صورت دو عملگر** `=` **و** `=`**.**
```hashem
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;
}
```
- مثالی از انواع استفادهها از عملگرها در بخشهای مختلف زبان هاشمی
شما باید کلاس `HmOperatorPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند عملگرهای مختلف را با استفاده از `TokenType` مربوط به آن یعنی `OPERATOR` رنگی کند.
```php HmOperatorPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از عملگرها را به درستی هایلایت کند.**
![تصویر مثال استفاده از عملگرها](https://quera.org/qbox/view/LzpafmGl01/operator-hashemi.png)
</details>
<details class="grey">
<summary>
**ساختار رشتهها در زبان هاشمی** و پیادهسازی کلاس`HmDoubleQuoteValuePattern`
</summary>
رشتهها در زبان برنامهنویسی آقای هاشمی به صورت DoubleQuote ( `" "` ) مورد استفاده قرار میگیرند. شما باید هایلایتر این مورد را به صورتی پیادهسازی کنید که محتوای درون این دو علامت نقلقول به صورت درستی هایلایت شوند.
```hashem
nam = "Mr ";
famil = "Hashemi";
tedadeBache = 3;
moteahel = 1==1;
mabda = "Kazeroon";
maghsad = "Neishaboor";
bebin azinja() {
bechap("Dorood Jahan");
}
```
- مثالی از رشتهها در زبان هاشمی
شما باید کلاس `HmDoubleQuoteValuePattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند رشتههای مختلف را با استفاده از `TokenType` مربوط به آن یعنی `VALUE` رنگی کند.
```php HmDoubleQuoteValuePattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از رشتهها را به درستی هایلایت کند.**
![تصویر مثال رشتهها در زبان هاشمی](https://quera.org/qbox/view/EQhut3dubk/string-hashemi.png)
</details>
<details class="yellow">
<summary>
**ساختار رشتههای چندخطی در زبان هاشمی** و پیادهسازی کلاس`HmTripleDoubleQuoteStringPattern`
</summary>
رشتههای چندخطی در زبان برنامهنویسی آقای هاشمی به صورت TripleDoubleQuote ( `""" """` ) مورد استفاده قرار میگیرند. شما باید هایلایتر این مورد را به صورتی پیادهسازی کنید که محتوای درون این سهتاییهای علامت نقلقول به صورت درستی هایلایت شوند.
```hashem
bebin azinja() {
matn_toolani = """شعر از مولانا
خنک آن قمار بازی که بباخت آنچه بودش
بنماند هیچش الا هوس قمار دیگر
""";
bechap(matn_toolani);
}
```
- مثالی از رشتهها در زبان هاشمی
شما باید کلاس `HmTripleDoubleQuoteStringPattern` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند رشتههای بلند مختلف را با استفاده از `TokenType` مربوط به آن یعنی `VALUE` رنگی کند.
```php HmTripleDoubleQuoteStringPattern.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
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از رشتههای بلند را به درستی هایلایت کند.**
![تصویر مثال رشتهها در زبان هاشمی](https://quera.org/qbox/view/5E1JcmZlgi/contest_hashemi-example_long-string-hashemi.png)
</details>
<details class="pink">
<summary>
**ساختار تزریق Json در زبان هاشمی** و پیادهسازی کلاس `JsonInjection`
</summary>
همانطور که پیشتر در بخش برسی بیشتر کد هایلایتر به تزریقها اشاره کردیم، در زبان برنامهنویسی آقای هاشمی میتوان از `Json` در بین کدهای هاشمی به شکل زیر و با استفاده از `jfarzand` پیادهسازی کرد:
```hashem
bebin azinja() {
object = jfarzand("""{"name":"Mr.Hashemi"}""");
bechap(object.name);
bechap(object.x);
}
```
- مثالی از تزریق Json در زبان هاشمی
شما باید کلاس `JsonInjection` را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند تزریقهای مختلف `Json` را در زبان هاشمی را هایلایت کند. در ساختار تزریقها نیازی به `TokenType` **نیست** و شما باید در ساختار زیر صرفا از هایلایتر از پیش ساخته شدهی `Json` درون همین پکیج استفاده کنید.
```php JsonInjection.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');
}
}
```
**در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از تزریق** `Json` **را به درستی هایلایت کند.**
![تصویر مثال تزریق json](https://quera.org/qbox/view/wJTbPp54of/json-injection-hashemi.png)
</details>
# آنچه باید آپلود کنید
+ **توجه**: مطالعه بخش "برسی بیشتر یک مثال **مهم** در پیاده سازی **الگوها** _(Patterns)_" از اهمیت بالایی از جهت نحوه پیادهسازی الگوهای مختلف دارد، لذا در خواندن آن کوشا باشید.
+ **توجه**: داوری این سوال در تستهای مختلف کدهایی شامل ساختارهای مختلف را به صورت **ترکیبی** به هایلایتر شما میدهد. دریافت نمره بیشتر از سوال با نسبتی از سوال که ساختار آنها را کاملا پیادهسازی کردهاید رابطه **مستقیم** دارد.
+ **توجه**: تنها فایلهایی از پروژه هایلایتر شما در سیستم داوری مورد پذیرش قرار خواهد گرفت که در بخش "ساختار فایلها" به صورت **رنگی** مشخص شده است. سایر تغییرات در سایر فایلها **بیتاثیر** خواهند بود.
+ **توجه**: پس از اعمال تغییرات، کل پروژه به غیر از پوشهی `vendor` را _ZIP_ کرده و آپلود کنید.
+ **توجه**: نام فایل _ZIP_ اهمیتی ندارد.