انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: راست چین کردن و RTL کردن متن ها در ترمینال  (دفعات بازدید: 2991 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
سلام
اول از همه بگم که من برنامه نویس نیستم فقط عاشق اینم که کامپیوتر رو به بردگی بکشم! :)
من یک کدی با بش نوشتم که می تونه (لااقل متن های ساده رو) راست چین و 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
پ.ن:
آدم اول جوونی آرتروز گردن بگیره وقتی پیر بشه چه بلایی سرش می یاد :(
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره

آفلاین محمد فدوی

  • Sr. Member
  • *
  • ارسال: 485
  • جنسیت : پسر
  • آغاز آزادی از رایانهٔ شخصی
    • آغاز آزادی از رایانهٔ شخصی
خیلی خیلی خوبه. به نظرم ایده‌ی فارسی نوشتن در ترمینال عملی‌تر از این هم میشه!
اولا خسته نباشی و ممنون که وقت گذاشتی. من تست کردم خوب جواب داد...

در مورد بلوک‌هایی که توشون کاراکترهایی مثل / یا ; یا : یا ... وجود داره چی؟ تست کردی و درست کار کرده؟

پ.ن: هیچی نمیشه عزیز! تو این دوره و زمونه همین اول کاری هممون پیریم! منم به شدت با معده‌م مشکل دارم!
اگر به بهداشت و فرهنگ رفتار با حیوانات علاقه دارید، از vetMD.ir دیدن کنید.
وبلاگ شخصی من: http://fadavi.net

آفلاین سید وحید رضا برهانی

  • High Hero Member
  • *
  • ارسال: 1668
  • جنسیت : پسر
  • یک مخالف نرم افزار اوپن سورس
سلام
نه کار نمی کنه ولی راه داره .
اگر که توی فایل detect_block.sh تابع word_lang رو به کد ززیر تغییر بدیم:
word_lang()
{

if [ $1 == ':' ]
then
echo 0
exit
fi

echo $1 | grep -c -i -e '[a-z]' # -e '[:;]' #its return 1 if english and return 0 if persian

}
برای یکی از اون کاراکترهای ویژه (در اینجا روی ':' تمرکز کردم) تا قسمتی مشکل حل می شه نتیجه ی تست:
بلوک فارسی : بلوک فارسی ---> درست
بلوک فارسی : بلوک انگلیسی ----> اشتباه
بلوک انگلیسی در انتها : -----> درست
انگلیسی : فارسی ---> اشتباه
انگلسی : انگلیسی -------> اشتباه

البته ظاهرا اشتباهها بیشتره ولی بیشتر یکجور شبیه پردازش استثناء هست که زیاد سخت نیست
من تا چند روز دیگه می خوام استراحت کنم بعدش بیشتر روش کار می کنم
نرم افزاری که نشه سیخ انگولکش کرد (به هر دلیلی چه به‌خاطر قانون و چه پیچیدگی یا توسعه سریع)نرم افزار آزاد نیست حالا مهم نیست چه بنیادی یا چه افرادی اون رو نوشته باشند یا GPL باشه یانه!
نرم افزار آزاد یک جنبش هست نه یک تیکه کاغذ پاره(GPL)
حق فهمیدن از حق خوندن مهمتره