Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reverse lines order in Persian and Arabic text wrap #53

Open
tayyebi opened this issue Nov 9, 2019 · 0 comments
Open

Reverse lines order in Persian and Arabic text wrap #53

tayyebi opened this issue Nov 9, 2019 · 0 comments

Comments

@tayyebi
Copy link

@tayyebi tayyebi commented Nov 9, 2019

Maybe this is not an issue but it can be a helpful answer that can save time for programmers who are speaking Persian (Farsi) or Arabic.

As you know, we cannot directly pass Persian (or Arabic) to $box->draw which $box is an instance of GDText::Box.

For example, if we have a text like:

همدان قدیمی‌ترین شهر ایران و از کهن‌ترین شهرهای جهان است. نخستین باری
که اسم این شهر برده شد، در حدود ۱۱۰۰ سال پیش از میلاد بود که نام همدان
را اَمدانه ذکر شده‌است.

and we directly pass it to the box, it will be like:

Bang

So we have to use a library like persian phpgd by @slashmili which will return an output like:

Reverse

Natives know that the output is in reverse order.

را امدانه ذکر شده است
از میلاد بود که نام همدان
در حدود ۱۱۰۰ سال پیش
که اسم این شهر برده شد،
جهان است. نخستین باری
ایران و از کهن‌ترین شهرهای
همدان قدیمی‌ترین شهر

It should be:

همدان قدیمی‌ترین شهر
ایران و از کهن‌ترین شهرهای
جهان است. نخستین باری
که اسم این شهر برده شد،
در حدود ۱۱۰۰ سال پیش
از میلاد بود که نام همدان
را امدانه ذکر شده است

Solution

So changes are required in Box.php:

+     /**
+     * @var reverse_text_lines_order
+     */
+    protected $reverse_text_lines_order = false;
+     /**
+     * @param bool $reverse_text_lines_order To Reverse Lines Order
+     */
+    public function setReverseTextLinesOrder($reverse_text_lines_order)
+    {
+        $this->reverse_text_lines_order = $reverse_text_lines_order;
+    }

Then use the new prop inside draw function:

             }
             $lines[] = $line;
         }
+        if ($this->reverse_text_lines_order == true)
+            $lines = array_reverse($lines);
         return $lines;
     }

In your main class you have to detect Persian (or Arabic) with following regex and then pass a parameter to $box:

   if (preg_match('/.*[چﺞﺤﺨﻬﻌﻐﻔﻘﺜﺼﻀﺸﺳیﺏﻼﺘﻨﻣکگﻭپﺩﺫﺭﺰﻄﻇژ].*/u', $text)){
       $text = fagd($input,'fa','vazir');
       $box->setReverseTextLinesOrder(true);
   }

So the output will correctly be:
Correct

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
1 participant
You can’t perform that action at this time.