8000 Reverse lines order in Persian and Arabic text wrap · Issue #53 · stil/gd-text · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
Reverse lines order in Persian and Arabic text wrap #53
Open
@tayyebi

Description

@tayyebi

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0