سلام
اول از همه بگم که من برنامه نویس نیستم فقط عاشق اینم که کامپیوتر رو به بردگی بکشم!
من یک کدی با بش نوشتم که می تونه (لااقل متن های ساده رو) راست چین و RTL کنه .
یک نکته رو خودم زودتر بگم که دیگران به زحمت نیفتند!! : من می دونم که کامنت گذاری ام افتضاحه! انتخاب اسم مغیر ها هم از اون بدتر! از همه ی این ها بدتر مکانیسمی که انتخاب کردم! ولی با همه ی اینها فعلا برای من کار می کنه واینه که برای من مهمه!
اگر کسی دوست داره و می تونه کدها رو تمیزکاری کنه ممنون می شم (خودم خوصله اش رو ندارم - خسته کننده است!)
من قبل از نوشتن اصلا اینترنت رو جست و جو نکردم(کسی نمی خواد بگه خودم می دونم که برخلاف اصول حرفه ای هاست!) شاید یک راه خیلی بهتر از مال من وجود داشته باشه اگر بود بگید
نکته ی آخر اینکه این برنامه بیشتر برای نشان دادن ایده و روش هست و یکمی دیگه کار داره تا کاربر نهایی بتونه استفاده کنه(todo لیست ها بعدا اضافه می کنم)
نسخه های برنامه های استفاده شده:
pacman -Q kdebase-konsole bash coreutils fribidi
kdebase-konsole 4.14.3-1
bash 4.3.027-1
coreutils 8.23-1
fribidi 0.19.6-1
--
uname -o -r -v
3.17.4-1-ARCH #1 SMP PREEMPT Fri Nov 21 21:14:42 CET 2014 GNU/Linux
مکانیسم برنامه:
ابتدا متن رو می گیره (در حال حاظر من با یک عبارت کوچیک کار می کنم) بعد قسمت های فارسی و انگلیسی رو جدا می کنه (که من به این قسمت ها می گم بلوک فارسی یا انگلیسی) بعد می یاد این بلوک ها رو برعکس حالت اوش مرتب می کنه که وقتی توی konsole که LTR هست دوباره برعکس بشه . درست نشون داده بشه تا اینکه متن RTL شده و برای راست چین کردن هم فقط تعداد کاراکتر های متن رو حساب می کنه بعد تعداد کاراکترهای عرضی konsole رو حساب می کنه و از هم کم می کنه و به همان اندازه خرف فاصله به متن اضافه می کنه در نتیجه متن راست چین می شه ! (خودمم وقتی نوشتمش کلی خندیدم روش ام مسخره است ولی کار می کنه!)
روش تست
./detect_block.sh "متن مورد نظر"
این اسکریپت یک فایل به نام blocks درست می کنه هم مواظب باشید که دسترسی داشته باشه و هم اینکه فایل مشابه نباشه (فایل مشابه رو پاک می کنه)
بعدش این رو اجرا کنید
./direct_block.sh
که دو تا خط جاپ می کنه که اولی متن RTL شده است و دومی RTL و راست چین شده است
من هم از مجوز و اینجور چیزها و هم از سایتایی که نیاز به ثبت نام دارند خوشم نمی یاد . بدون اجازه هرکاری خواستید بکنید!
فعلا همین.
سیستم پیوست مشکل داشت مجبورم توی تگ code بزارم
detect_blocks.sh
-----------------------
word_lang()
{
echo $1 | grep -c -i '[a-z]' #its return 1 if english and return 0 if persian
}
rm blocks
pre_word_lang=`word_lang $(echo $1 | cut -f1 -d " ")`
for i in $1
do
# if [ $(word_lang $i) -eq 1 ]
# then
# cur_word_lang='e'
# else
# cur_word_lang='p'
# fi
cur_word_lang=`word_lang $i`
if [ $cur_word_lang == $pre_word_lang ]
then
echo -n " $i" >> blocks
else
echo >> blocks
echo -n $i >> blocks
fi
pre_word_lang=$cur_word_lang
done
echo >> blocks
direct_blocks.sh
----------------------
direct(){
num_blocks=`cat blocks | wc -l `
for (( i=$num_blocks;i>0;i--))
{
directed="$directed `cat blocks | head -$i | tail -1`"
}
echo "$directed" # for debuging
char_count=`echo $directed | wc -m`
width_size=`stty size | cut -f2 -d ' '`
no_space=$((width_size-char_count-1)) #I dont know why I using "1" , but its work! thats enough!
for (( i=0;i<$no_space;i++))
{
directed=" ${directed}"
}
echo "$directed"
}
direct
پ.ن:
آدم اول جوونی آرتروز گردن بگیره وقتی پیر بشه چه بلایی سرش می یاد