image icon indicating copy to clipboard operation
image copied to clipboard

Persian text results in reversed order of lines when using `wrap()`

Open hmssg opened this issue 1 year ago • 6 comments

Hello, I checked that in Farsi language, it reverses the text when warping

1807641428114306

Its correct form should be as below

من سبحان قادری نسب هستم

hmssg avatar Aug 17 '24 14:08 hmssg

Since I can't read the language, it's hard for me to debug correctly here.

I will gladly accept pull requests that address this issue.

For example, I can't tell if the following code block produces correct output. For me it seems correct.

use Intervention\Image\ImageManager;
use Intervention\Image\Typography\FontFactory;

$image = ImageManager::gd()
    ->create(400, 200)
    ->fill('ddd');

$text = 'من
سبحان قادری
نسب هستم';

$image->text($text, 350, 150, function (FontFactory $font) {
    $font->filename('./ArialUnicodeMS.ttf');
    $font->size(40);
    $font->color('ff5500');
    $font->lineHeight(1.6);
    $font->wrap(300);
    $font->align('right');
});

localhost

olivervogel avatar Aug 17 '24 14:08 olivervogel

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

$lines = explode("\n", wordwrap($text, 70));

        foreach ($lines as $i => $line) {
            $image->text(PersianRender::render($line), 540, 800 + ($i * 75), function (FontFactory $font){
                $font->filename(base_path('public/font/Peyda-Black.ttf'));
                $font->size(50);
                $font->color('fff');
                $font->align('center');
                $font->valign('middle');
                $font->lineHeight(3);
            });
        }

hmssg avatar Aug 23 '24 19:08 hmssg

A 3rd party library such as AR-PHP is needed to convert the UTF-8 characters to the correct glyphs. For example, if you look at this text

شما اهل کجا هستيد؟

and compare it with the image below you can see that a library is needed to generate the text correctly:

Persian Text Example

I have used this text because it has a question mark at the end, which in RTL text should of course be at the left of the text.

In the image, when the text is wrapped it is wrapped in the wrong direction so that each following line of text is higher than the previous line (which is not correct because Arabic and Persian are still read from top to bottom like Western languages).

In my script, if I use this code

$text = 'شما اهل کجا هستيد؟';
$text = $Arabic->utf8Glyphs($text);

$lines = explode("\n", wordwrap($text, 20));
$lines = array_reverse($lines);

foreach ($lines as $i => $line) {
    $image->text($line, 450, 360 + ($i * 34), function (FontFactory $font) {
        $font->filename('./B-Lotus/B Lotus_0.ttf');
        $font->size(44);
        $font->color('ff5500');
        $font->lineHeight(1.6);
        //$font->wrap(60);
        $font->align('right');
    });
}

then I get this image:

Persian Text Example

I am not sure if this fixes the problem, but it is something that users could add to their scripts. This assumes that the rendering of the text is still correct and reads correctly?

gammalogic avatar Nov 09 '24 22:11 gammalogic

I will gladly accept pull requests that address this issue. Since I can't read the language, it's hard for me to debug correctly here.

olivervogel avatar Dec 31 '24 12:12 olivervogel

I will gladly accept pull requests that address this issue. Since I can't read the language, it's hard for me to debug correctly here.

In order to support this, I think you would need to add a property that allows the users to specify the language direction, for example $font->rtl(true). The value would normally be set to false by default, but if the value is set to true you would then process the text using the example code I have added. This scheme should work for the most common RTL languages (Arabic, Persian, and Hebrew). If there is a demand for it then I will be happy to try and create a PR.

gammalogic avatar Dec 31 '24 13:12 gammalogic

Thanks @gammalogic

I think your solution works fine. Since an integration would introduce AR-PHP as a dependency, I prefer to leave this external.

olivervogel avatar Jan 01 '25 09:01 olivervogel