Skip to content

Commit 7de36f4

Browse files
committed
By EbraSha
1 parent b2ba3f5 commit 7de36f4

19 files changed

Lines changed: 2836 additions & 0 deletions

.editorconfig

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
insert_final_newline = true
7+
trim_trailing_whitespace = true
8+
indent_style = space
9+
indent_size = 4
10+
11+
[*.{json,yml,yaml}]
12+
indent_size = 2
13+
14+
[*.md]
15+
trim_trailing_whitespace = false
16+

.gitignore

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Composer
2+
/vendor/
3+
composer.lock
4+
5+
# PHPUnit
6+
.phpunit.cache/
7+
.phpunit.result.cache
8+
9+
# IDE
10+
.idea/
11+
.vscode/
12+
*.swp
13+
*.swo
14+
*~
15+
16+
# OS
17+
.DS_Store
18+
Thumbs.db
19+
20+
# Build
21+
/build/
22+
/dist/
23+
24+
# Logs
25+
*.log
26+

README.fa.md

Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
# 📦 Abdal Phpian Render
2+
3+
[English](README.md) | [فارسی](README.fa.md)
4+
5+
<div dir="rtl" align="right">
6+
7+
![Abdal Phpian Render](shot.png)
8+
9+
</div>
10+
11+
## 📖 درباره پروژه
12+
13+
**Abdal Phpian Render** یک پکیج جامع PHP برای اصلاح و بهبود نمایش متون فارسی و عربی در محیط‌های گرافیکی است. این پکیج مشکلات رایج نمایش متن در کتابخانه‌هایی مانند GD Library، FPDF و TCPDF را حل می‌کند و پشتیبانی کامل از راست‌به‌چپ (RTL) را فراهم می‌آورد.
14+
15+
### 🎯 چرا این نرم‌افزار ساخته شد؟
16+
17+
هنگام کار با متون فارسی و عربی در محیط‌های گرافیکی PHP، مشکلات متعددی وجود دارد:
18+
19+
- **مشکل نمایش حروف**: حروف فارسی/عربی به صورت جداگانه و بدون اتصال نمایش داده می‌شوند
20+
- **مشکل ترتیب نمایش**: در متون ترکیبی (فارسی + انگلیسی) ترتیب کلمات به درستی نمایش داده نمی‌شود
21+
- **مشکل اعداد**: اعداد انگلیسی در متن فارسی ظاهر می‌شوند
22+
- **مشکل علائم نگارشی**: پرانتز، براکت و سایر علائم در جهت اشتباه نمایش داده می‌شوند
23+
- **از دست رفتن اعراب**: اعراب عربی در فرآیند پردازش از بین می‌روند
24+
25+
این پکیج تمام این مشکلات را حل می‌کند و یک راه‌حل کامل و استاندارد برای رندر متون RTL ارائه می‌دهد.
26+
27+
## ✨ ویژگی‌ها و قابلیت‌ها
28+
29+
### 🔤 الگوریتم Reshaping
30+
31+
- ✅ تبدیل حروف به اشکال چهارگانه (isolated, final, initial, medial)
32+
- ✅ پشتیبانی کامل از حروف اختصاصی فارسی (پ، چ، گ، ژ)
33+
- ✅ پشتیبانی از ترکیبات خاص عربی (لا، لآ، لأ، لإ)
34+
- ✅ حفظ اعراب در فرآیند reshaping
35+
36+
### 🔄 الگوریتم BiDi (Bidirectional)
37+
38+
- ✅ تشخیص خودکار ترتیب نمایش در متون ترکیبی (فارسی + انگلیسی)
39+
- ✅ آینه‌سازی خودکار علائم نگارشی (پرانتز، براکت، آکولاد و...)
40+
- ✅ مدیریت هوشمند علائم خنثی بر اساس context
41+
42+
### 🔢 تبدیل اعداد (Number Converter)
43+
44+
- ✅ تبدیل اعداد انگلیسی به فارسی
45+
- ✅ تبدیل اعداد انگلیسی به عربی
46+
- ✅ تبدیل خودکار اعداد فارسی/عربی به انگلیسی (برای محاسبات)
47+
48+
### 🔣 مدیریت اعراب (Diacritics Handler)
49+
50+
- ✅ استخراج و حفظ اعراب (فَتحه، ضَمّه، کَسره، تنوین و...)
51+
- ✅ اعمال مجدد اعراب پس از reshaping
52+
- ✅ جلوگیری از از دست رفتن اعراب در فرآیند پردازش
53+
54+
### 🛠️ توابع کمکی (Helper Functions)
55+
56+
-`wordWrap()`: شکستن خط مخصوص متون RTL (جلوگیری از شکسته شدن ناقص کلمات)
57+
-`isRTL()`: تشخیص خودکار زبان متن ورودی
58+
-`reverse()`: معکوس کردن متن
59+
-`clean()`: پاکسازی از کاراکترهای نامرئی و ناخواسته
60+
61+
### 📋 استانداردهای رعایت شده
62+
63+
-**PSR-12**: رعایت کامل استانداردهای کدنویسی PHP
64+
-**Type Hinting**: استفاده کامل از type hints برای امنیت نوع داده
65+
-**PHP 8.1+**: سازگاری کامل با نسخه‌های جدید PHP
66+
-**Lightweight**: وابستگی سبک (فقط `symfony/polyfill-mbstring`)
67+
-**Unit Tests**: تست‌های کامل با PHPUnit
68+
-**Clean Code**: کد تمیز و قابل نگهداری
69+
70+
## 🚀 نصب و راه‌اندازی
71+
72+
### نصب از طریق Composer
73+
74+
```bash
75+
composer require abdal/phpian-render
76+
```
77+
78+
یا اضافه کردن به `composer.json`:
79+
80+
```json
81+
{
82+
"require": {
83+
"abdal/phpian-render": "^1.0"
84+
}
85+
}
86+
```
87+
88+
## 📚 نحوه استفاده
89+
90+
### استفاده پایه
91+
92+
```php
93+
<?php
94+
95+
require_once 'vendor/autoload.php';
96+
97+
use Abdal\PhpianRender\PhpianRender;
98+
99+
// ایجاد نمونه از کلاس اصلی
100+
$renderer = new PhpianRender();
101+
102+
// پردازش ساده متن
103+
$text = 'سلام دنیا';
104+
$processed = $renderer->process($text);
105+
echo $processed;
106+
```
107+
108+
### پردازش کامل با گزینه‌ها
109+
110+
```php
111+
<?php
112+
113+
use Abdal\PhpianRender\PhpianRender;
114+
115+
$renderer = new PhpianRender();
116+
117+
$text = 'عدد 123 در متن فارسی است';
118+
119+
// پردازش کامل با تمام ویژگی‌ها
120+
$processed = $renderer->process($text, [
121+
'reshape' => true, // فعال‌سازی reshaping
122+
'bidi' => true, // فعال‌سازی bidirectional
123+
'convertNumbers' => true, // تبدیل اعداد
124+
'numberLocale' => 'persian', // 'persian' یا 'arabic'
125+
'preserveDiacritics' => true, // حفظ اعراب
126+
'clean' => false, // پاکسازی کاراکترهای نامرئی
127+
]);
128+
129+
echo $processed; // خروجی: عدد ۱۲۳ در متن فارسی است
130+
```
131+
132+
### استفاده از Reshaping به تنهایی
133+
134+
```php
135+
<?php
136+
137+
use Abdal\PhpianRender\PhpianRender;
138+
139+
$renderer = new PhpianRender();
140+
141+
$text = 'سلام';
142+
$reshaped = $renderer->reshape($text);
143+
echo $reshaped; // حروف به صورت متصل نمایش داده می‌شوند
144+
```
145+
146+
### تبدیل اعداد
147+
148+
```php
149+
<?php
150+
151+
use Abdal\PhpianRender\PhpianRender;
152+
153+
$renderer = new PhpianRender();
154+
155+
// تبدیل به فارسی
156+
$text = 'عدد 123 است';
157+
$persian = $renderer->convertNumbers($text, 'persian');
158+
echo $persian; // خروجی: عدد ۱۲۳ است
159+
160+
// تبدیل به عربی
161+
$arabic = $renderer->convertNumbers($text, 'arabic');
162+
echo $arabic; // خروجی: عدد ١٢٣ است
163+
```
164+
165+
### پردازش BiDi برای متون ترکیبی
166+
167+
```php
168+
<?php
169+
170+
use Abdal\PhpianRender\PhpianRender;
171+
172+
$renderer = new PhpianRender();
173+
174+
$text = 'سلام Hello World';
175+
$bidi = $renderer->processBiDi($text);
176+
echo $bidi; // ترتیب نمایش به درستی اصلاح می‌شود
177+
```
178+
179+
### شکستن خط (Word Wrap) برای RTL
180+
181+
```php
182+
<?php
183+
184+
use Abdal\PhpianRender\PhpianRender;
185+
186+
$renderer = new PhpianRender();
187+
188+
$text = 'این یک متن طولانی است که باید به چند خط تقسیم شود';
189+
$wrapped = $renderer->wordWrap($text, 20); // حداکثر 20 کاراکتر در هر خط
190+
191+
echo $wrapped;
192+
// خروجی:
193+
// این یک متن طولانی است
194+
// که باید به چند خط
195+
// تقسیم شود
196+
```
197+
198+
### تشخیص RTL
199+
200+
```php
201+
<?php
202+
203+
use Abdal\PhpianRender\PhpianRender;
204+
205+
$renderer = new PhpianRender();
206+
207+
$text1 = 'سلام';
208+
$text2 = 'Hello';
209+
210+
if ($renderer->isRTL($text1)) {
211+
echo 'متن RTL است';
212+
}
213+
214+
if (!$renderer->isRTL($text2)) {
215+
echo 'متن LTR است';
216+
}
217+
```
218+
219+
### استفاده از کلاس‌های مستقل
220+
221+
```php
222+
<?php
223+
224+
use Abdal\PhpianRender\Reshaper;
225+
use Abdal\PhpianRender\BiDi;
226+
use Abdal\PhpianRender\NumberConverter;
227+
use Abdal\PhpianRender\Helper;
228+
229+
// استفاده مستقیم از Reshaper
230+
$reshaper = new Reshaper();
231+
$reshaped = $reshaper->reshape('سلام');
232+
233+
// استفاده مستقیم از BiDi
234+
$bidi = new BiDi();
235+
$processed = $bidi->process('سلام Hello');
236+
237+
// استفاده مستقیم از NumberConverter
238+
$converter = new NumberConverter();
239+
$persian = $converter->toPersian('123');
240+
241+
// استفاده مستقیم از Helper
242+
$helper = new Helper();
243+
$isRTL = $helper->isRTL('سلام');
244+
$wrapped = $helper->wordWrap('متن طولانی', 10);
245+
```
246+
247+
### استفاده در GD Library
248+
249+
```php
250+
<?php
251+
252+
use Abdal\PhpianRender\PhpianRender;
253+
254+
$renderer = new PhpianRender();
255+
256+
// پردازش متن قبل از نمایش در تصویر
257+
$text = 'سلام دنیا';
258+
$processed = $renderer->process($text, [
259+
'reshape' => true,
260+
'bidi' => true,
261+
'convertNumbers' => true,
262+
]);
263+
264+
// استفاده در GD
265+
$image = imagecreate(400, 200);
266+
$bg = imagecolorallocate($image, 255, 255, 255);
267+
$textColor = imagecolorallocate($image, 0, 0, 0);
268+
269+
// استفاده از فونت فارسی
270+
imagettftext($image, 20, 0, 10, 50, $textColor, 'font.ttf', $processed);
271+
272+
header('Content-Type: image/png');
273+
imagepng($image);
274+
imagedestroy($image);
275+
```
276+
277+
### استفاده در FPDF/TCPDF
278+
279+
```php
280+
<?php
281+
282+
use Abdal\PhpianRender\PhpianRender;
283+
require_once('fpdf.php'); // یا tcpdf.php
284+
285+
$renderer = new PhpianRender();
286+
$pdf = new FPDF();
287+
288+
$pdf->AddPage();
289+
$pdf->AddFont('DejaVu', '', 'DejaVuSans.ttf', true);
290+
291+
$text = 'سلام دنیا - عدد 123';
292+
$processed = $renderer->process($text, [
293+
'reshape' => true,
294+
'bidi' => true,
295+
'convertNumbers' => true,
296+
]);
297+
298+
$pdf->SetFont('DejaVu', '', 14);
299+
$pdf->Cell(0, 10, $processed, 0, 1);
300+
301+
$pdf->Output();
302+
```
303+
304+
## 🧪 تست‌ها
305+
306+
برای اجرای تست‌های واحد:
307+
308+
```bash
309+
composer install
310+
vendor/bin/phpunit
311+
```
312+
313+
## 📦 وابستگی‌ها
314+
315+
- PHP >= 8.1
316+
- symfony/polyfill-mbstring ^1.28
317+
318+
## 📄 مجوز
319+
320+
این پروژه تحت مجوز GPL-2.0-or-later منتشر شده است.
321+
322+
## 🐛 گزارش مشکلات
323+
324+
اگر با مشکلی مواجه شدید یا در پیکربندی مشکل دارید، لطفاً از طریق ایمیل Prof.Shafiei@Gmail.com با ما در تماس باشید. همچنین می‌توانید مشکلات را در GitLab یا GitHub گزارش دهید.
325+
326+
## ❤️ حمایت مالی
327+
328+
اگر این پروژه برای شما مفید بود و مایل به حمایت از توسعه بیشتر هستید، لطفاً در نظر داشته باشید که کمک مالی کنید:
329+
- [اینجا اهدا کنید](https://alphajet.ir/abdal-donation)
330+
331+
## 🤵 برنامه‌نویس
332+
333+
ساخته شده با عشق توسط **ابراهیم شفیعی (EbraSha)**
334+
- **ایمیل**: Prof.Shafiei@Gmail.com
335+
- **تلگرام**: [@ProfShafiei](https://t.me/ProfShafiei)
336+
- **GitHub**: [@ebrasha](https://github.com/ebrasha)
337+
- **Twitter/X**: [@ProfShafiei](https://x.com/ProfShafiei)
338+
- **LinkedIn**: [ProfShafiei](https://www.linkedin.com/in/profshafiei/)
339+
340+
## 📜 مجوز
341+
342+
این پروژه تحت مجوز GPLv2 or later منتشر شده است.
343+

0 commit comments

Comments
 (0)