علی مهدوی
4 سال پیش توسط علی مهدوی مطرح شد
17 پاسخ

ساخت texteditor مشابه راکت با livewire و جاوااسکریپت

با سلام و وقت بخیر

میخواستم از دوستان کمک بگیرم که چطور میتونم texteditor مشابه چیزی که در بخش دیدگاه ها و بحث و گفتگوی راکت هست بسازم بصورت شخصی سازی شده با امکاناتی مشابه راکت ؟

مهندس @hesammousavi عزیز لطفا راهنمایی بفرمایید . واقعا پکیج های موجود در وب به پختگی و سادگی ادیتور راکت نمی رسن.
باسپاس


ثبت پرسش جدید
میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 3 سال پیش آپدیت شد
1

در تحلیلی که من کردم، این کار دو مرحله داره.
برای پیاده سازی نیاز هستش که از خصوصیاتی نظیر selectionStart و selectionEnd و دیگر خصوصیات مرتبط با این موضوع استفاده کنید.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange

1) به کمک خصوصیات بالایی، عملکرد دکمه های ویرایشگر رو تنظیم می کنید تا متن ورودی کاربر در textarea رو مطابق با دستورالعمل نشانه گذاری maekdown تنظیم کنند (که بخش مشکل تر پروژه رو شامل میشه).
2) در نهایت هم به کمک خود markdown متن داخل textarea رو در پیشنمایش، به نمایش درمیارید.

نظر مهندس @mhyeganeh رو هم جویا بشید.


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 4 سال پیش مطرح شد
0

درود...
پیوند زیر:
https://ckeditor.com/


علی مهدوی
تخصص : طراح و توسعه دهنده وب
@mahdavi 4 سال پیش مطرح شد
0

@endworld روی سوالم رو یکم دقیق تر بخونید .
این پکیج ها کلی گیر و باگ دارن و عملا من از تمام امکاناتشون استفاده نمیکنم و شخصی سازیشون دردسره ولی چیزی که در راکت هست بسیار تمیز هست حتی میتونید inspect بگیرید و منظورم رو بفهمید


رایموند
تخصص : مختصص وردپرس - برنامه نویس لار...
@Raymond 4 سال پیش مطرح شد
1

@mahdavi
اگر می خواهید اختصاصی بنویسید می توانید آموزش ساخت آن پیگیری کنید:
https://www.thatsoftwaredude.com/content/8912/create-a-basic-text-editor-in-javascript
یا می توانید ویرایگشرهای دیگر امتحان کنید:
https://www.tiny.cloud/
https://quilljs.com/
https://trix-editor.org/
https://editorjs.io/


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 4 سال پیش مطرح شد
0

اینجا می تونید پیشنهاد و درخواست تون رو مطرح کنید، تا شاید بعدا توی راکت آموزشی براش ساخته بشه:
https://roocket.ir/series/javascript-projects/episode/3


علی مهدوی
تخصص : طراح و توسعه دهنده وب
@mahdavi 3 سال پیش مطرح شد
0

@milad مهندس میلاد عزیز میتونید راهنمایی کنید یک ادیتور اختصاصی برپایه markdown درست کنم به صورت اختصاصی چیزی مشابه راکت .

البته @endworld یک مقاله براساس قابلیت جدیدhtml هست ولی براساس markdown نیست و دکمه ها براساس المان های markdown وارد نمی شوند .


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 3 سال پیش آپدیت شد
1

در تحلیلی که من کردم، این کار دو مرحله داره.
برای پیاده سازی نیاز هستش که از خصوصیاتی نظیر selectionStart و selectionEnd و دیگر خصوصیات مرتبط با این موضوع استفاده کنید.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange

1) به کمک خصوصیات بالایی، عملکرد دکمه های ویرایشگر رو تنظیم می کنید تا متن ورودی کاربر در textarea رو مطابق با دستورالعمل نشانه گذاری maekdown تنظیم کنند (که بخش مشکل تر پروژه رو شامل میشه).
2) در نهایت هم به کمک خود markdown متن داخل textarea رو در پیشنمایش، به نمایش درمیارید.

نظر مهندس @mhyeganeh رو هم جویا بشید.


علی مهدوی
تخصص : طراح و توسعه دهنده وب
@mahdavi 3 سال پیش مطرح شد
1

@milad تشکر مهندس عزیز . جلوتر در مراحل کار باز مزاحم میشم 🌹

مهندس @mhyeganeh لطفا در صورت امکان راهنمایی بفرمایید


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 3 سال پیش مطرح شد
0

سرزنده باشید 👍
ایشالا که مقصودتون رو برآورده کنید و در پایان می تونید کدهاتون رو اینجا برای سایرین هم قرار بدین.


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 3 سال پیش مطرح شد
3

@mahdavi
درود بر شما در راهنمایی شما باید بگم ما این ویرایشگر رو به شکل اختصاصی خودمون نوشتیم تقریبا ۷۰ درصد از کدها توسط ما نوشته شده و متاسفانه امکان ارائه اون به شکل اوپن سورس برای ما وجود نداره.
اما اگر در مورد ایجاد texteditor سرچ بفرمایید مقالات خوبی برای این داستان در اختیارتون قرار میگیره. اما این کار طبق تجربه واقعا پر چالش بوده.
نکاتی که @milad هم در بالا اشاره کردن به اون می‌تونه بهتون کمک کنه متوجه داستان این جور ویرایشگر‌ها بشید.


علی مهدوی
تخصص : طراح و توسعه دهنده وب
@mahdavi 3 سال پیش مطرح شد
2

مهندس @hesammousavi ممنون بابت پیامتون
اگه امکان اوپن سورس کردن کد ها وجود نداره لااقل آموزشی در این مورد ارائه بفرمایید یا منابعی که خودتون ازشون کمک گرفتین رو بگید تا ما هم بتونیم پیش بریم چون منابع در اینترنت خیلی پراکنده هست و اگر در این مورد کمک بفرمایید ممنون میشم

@milad مهندس جان اگر شما در این روند کمک بکنید با هم میتونیم اوپن سورسش کنیم تا همه از این ویژگی استفاده کنند

چون اکثر برنامه نویس های فرانت اند دغدغشون اینه یه ادیتور رو بنویسند و هر زمان خواستند بخشهای اون رو شخصی سازی کنند اما این روند بسیار به گفته مهندس موسوی پرچالش هست و نیاز به کمک داره 🙏


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 3 سال پیش آپدیت شد
0

یکی اینکه: من قبلا یک نوبت سعی کردم این موضوع رو بررسی کنم، منتها در تحلیلی که بالا نوشتم، پیاده کردن بخش اول، اذیتم کرد. ازونجایی که در حد بررسی بودش موضوع برام، کلیات کار دستم اومدش، ولی دیگه پیاده سازی عملی رو پیش نبردم. / الان و در این مقطع هم راستیتش، همچین پروژه ای برام اولویت نداره و زمان/انگیزه کافی ندارم که وارد چالشش بشم.
دو اینکه: بعید می دونم چنین کمبودی در دنیای وب باشه، همین الان ویرایشگرهای متن رایگان گوناگونی موجود هستش، من اگر بخوام درین زمینه وقت بزارم، ترجیح میدم یک وقت اساسی بزارم و ویرایشگرهای موجود رو بررسی کنم، و ببینم کدوم مناسب تر هستش. البته اگر شما به قدر کافی وقت گذاشتید برای ویرایشگرهای موجود، بحث تون از من جداست. / من هنوز فکر می کنم ویرایشگرهای موجود پاسخگو هستند.
سه: در حد دانش و زمان خودم، بتونم کمک می کنم داخل انجمن.
سرزنده باشید


محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
5

@mahdavi
@milad

سلام و ادب؛

حقیقتش بنده تخصص زیادی در این زمینه ندارم و تا الان هم خیلی باهاش روبرو نشدم. چندباری هم که باهاش درگیر شدم از TinyMCE استفاده کردم. البته با مقدار زیادی Customization برای نیازهای خودم و اضافه کردن چند قابلیت خاص و خیلی هم خوب جواب داده و راضی بودم. ضمن اینکه معتقدم اون سبک از ادیتورها (فکر کنم اصطلاح دقیق ترش میشه ادیتورهای WYSIWYG) بهتر و مناسب تر هم باشه. مخصوصا برای کاربرهای غیرفنی و عام. چون نیازی به آشنایی و سر و کله زدن با مارک داون های بعضا عجیب و غریب ندارند و دقیقا خروجی کار جلوی چشممون هست و الباقی کارها پشت صحنه قرار می‌گیرند.

در هر صورت و در خصوص این موضوع فکر نمی‌کنم خیلی مسئله ی عجیب و غریب و یا نشدنی باشه. مقداری آشنایی با JS و طبیعتا HTML میخواد به نظرم فقط... نمی‌گم کار راحتیه و سه سوته قابل انجامه. بلکه قطعا چالش هم خواهیم داشت. مخصوصا اگر قصد پشتیبانی از زبان فارسی رو هم داشته باشید یا امکانات خاص تری هم بخواید بهش اضافه کنید.

ولی اگر کار رو بشکونیم و کمی راجع بهش فکر کنیم مشخص میشه که عمده اتفاقی که می افته این هست که کاربر روی یکی از button های تنظیمات (مثلا اعمال استایل Bold) کلیک می‌کنه.

حالا شما باید مثلا چک کنید که آیا قبلش تکه ای از متن داخل textarea به حالت select در اومده یا نه. اگر آری با استفاده از دستورات JS که بالاتر اشاره شد index شروع محل انتخاب و پایانش رو در میارید. بعد بر اساس این مقادیر و مثلا دستور substr() متن رو به سه قسمت تقسیم می‌ کنیم:

1- قبل از تکه انتخابی
2- تکه انتخابی
3- بعد از تکه انتخابی

و حالا میایم با استفاده از concatenation این سه تکه رو بعلاوه کاراکترهای لازم در قبل و بعد از تکه انتخابی مجدد با هم ادغام می‌کنیم. در مثال Bold کردن متن انتخابی و بر اساس استاندارد های مارک داون گیت هاب باید دوتا ستاره قبل و بعدش اضافه بشه. پس میشه یک همچین چیزی:

const result = text_before + '**' + text_selected + '**' + text_after;
//ES6 version:
const result = `${text_before}**${text_selected}**${text_after}`;

و در پایان کافیه این مقدار جدید رو جاگزین متن داخل textarea بکنیم:

document.getElementById("my_textarea").value = result;

در حالتی که قبل از کلیک بروی گزینه متنی هم انتخاب نشده بود بایستی محل قرارگیری cursor رو اول پیدا کنید بعد دوباره تقریبا همون مراحل بالا رو طی کنید. با این تفاوت که بجای متن انتخاب شده یک متن از خودتون میذارید. مثلا در همین ادیتور اگر آزمایش کنید از عبارت «متن تاکیدی» استفاده شده.

یک سری از دکمه ها هم هستند که مقداری کار بیشتر میبرن مثلا اضافه کردن لینک یا عکس که قبلش مثلا باید یک modal باز بشه و بعد بر حسب رفتارهایی که کاربر انجام میده اتفاق های بالا رخ بده.

این کارها که انجام شد آخر سر شما یک textarea دارید که فقط کافیه محتواش رو در دیتابیس ذخیره کنید. بقیه اتفاق ها بعدا و در زمان نمایش اون می افته که با استفاده از پکیج هایی بالاتر بهشون اشاره شد باید این متن رو یک جورایی render کنید و با تگ های مناسب html جایگزین نمایید. الباقی داستان هم که میشه جادوی CSS. 😉

پ ن ۱: کدهای بالا رو همین جوری و فقط جهت تقریب ذهن نوشتم و از کارکرد دقیقشون مطمئن نیستم.

پ ن ۲: پیشنهاد می‌کنم خودتون اول کار رو بشکونید به تکه های کوچک پازل و بعد برای پیدا کردن پاسخ همان تکه کوچیک پازل به حضرت گوگل و استک اورفلو مراجعه کنید. حتما افراد زیادی قبل از ما باهاش مواجه شدند و پاسخشون رو هم دریافت کردند. اینجوری خیلی بهتره به نظرم تا اینکه از ابتدا دنبال یک آموزش صفر تا صد و آماده شده بگردیم.

پ ن ۳: ضمن احترام به جامعه مهندسین بنده «مهندس» نیستم. محمدحسن یگانه ام :-)

موفق و پیروز باشید.


علی مهدوی
تخصص : طراح و توسعه دهنده وب
@mahdavi 3 سال پیش مطرح شد
3

ممنون از دوستان زیر که در این گفتگو بنده رو همراهی کردند.
@hesammousavi
@milad
@endworld
و به ویژه مهندس یگانه (که البته خودشون میگن مهندس نیستن 😉) @mhyeganeh بسیار دید خوبی بهم دادن و باعث شدن که دنبال ویژگی های پنهان textarea بگردم و به دو لینک جالب زیر رسیدم که واقعا شاید 80 درصد چالش ها رو برام تکمیل کرد

لینک اول
لینک دوم بخش Insert HTML tags example

همچنین قابل توجه مهندس @hesammousavi عزیز که گفتند کدهارو نمیتونن اوپن سورس کنن بنده بعد اتمام کار کدها لینک گیت هاب پروژه رو همینجا میذارم بقیه دوستان هم بتونن ازش استفاده کنند😏


سید حسین رضوی
تخصص : برنامه نویس وب و طراح رابط کار...
@hossein.r.1442 3 سال پیش آپدیت شد
1

سلام در رابطه با ادیتور متن اتفاقا منم به عنوان یه چالش چند وقتی هست که شروع کردم به نوشتن البته براساس markdown نیست وبه صورت WYSIWYG کار میکنه
https://roocket.ir/discuss/12529
توی لینک بالا یه بحث در این باره شروع کردم، البته من سعی کردم با بررسی سه ادیتور معروف ckeditor 5, tinymce 5, froala این کارو پیش ببرم و همچنین برای استایل دادن هم به صورت پیش پا افتاده میتونید از این کد استفاده کنید که البته برای یه ادیتور خوب باید خیلی دقیق تر و جزعی تر نوشته بشه

const btn = document.querySelector('button');
    btn.addEventListener('click', function(){
        let selection = document.getSelection();
        let text = selection.toString();
        let strong = document.createElement('strong');
        strong.style.color = 'red';
        strong.textContent = text;
        let range = selection.getRangeAt(0);
        range.deleteContents();
        range.insertNode(strong);

سید حسین رضوی
تخصص : برنامه نویس وب و طراح رابط کار...
@hossein.r.1442 3 سال پیش مطرح شد
0

یه موضوع دیگه که هست ادیتور ها این کار رو داخل textarea انجام نمیدن، البته در رابطه با markdown فک کنم بشه از textarea استفاده کرد


علی مهدوی
تخصص : طراح و توسعه دهنده وب
@mahdavi 3 سال پیش آپدیت شد
0

مهندس @hossein.r.1442 میشه دقیق تر توضیح بدید ؟
تا جایی که من اینترنت رو گشتم میشه با گرفتن مقادیر داخل textarea با جاوااسکریپت دقیقا بهش تگ اضافه کرد ولی در مورد افزودن عکس یا ویدیو دید کافی ندارم و در حال تحقیق هستم.

ممنون میشم راهنمایی بفرمایید🙏


سید حسین رضوی
تخصص : برنامه نویس وب و طراح رابط کار...
@hossein.r.1442 3 سال پیش مطرح شد
1

ببینید برای نوشتن ادیتور markdown مشکلی وجود نداره و میتونید از textarea استفاده کنید ولی ادیتور های WYSIWYG رو نمیشه توی textarea پیاده کرد چون خروجی رو نمیشه مستقیم دید مگه اینکه یه المنت دیگه قرار بدید تا همونطور که داره کاربر اصلاحات رو داخل textarea انجام میده توی اون المنت به صورت ریل تایم بهش نمایش بدید که فک نکنم کاربر پسند باشه.
شما باید یه المنت قرار بدید و مقدار contentEditable اش رو برابر با true قرار بدید که کاربر داخل اون المنت شروع به تایپ کنه و فقط المنت هایی که نیاز به اصلاح ندارند رو مقدار contentEditable رو false کنید
مثلا

<div class="editor-wrapper" contentEditable="true">
  <p>sample paragraph</p>
  <figure>
    <img src="./url/img.png" alt="">
    <figcaption>this is img caption</figcaption>
  </figure>
  <p>sample 2</p>
</div>

توی مثال بالا اگه کاربر تصویر رو درگ کنه و بخواد جابجا کنه فقط تگ img تنها جابجا میشه و درعمل تگ img از تگ figure خارج میشه که این درست نیست، صحیح کد بالا به صورت زیر میشه

<div class="editor-wrapper" contentEditable="true">
  <p>sample paragraph</p>
  <figure class="draggable" contentEditable="false">
    <img src="./url/img.png" alt="">
    <figcaption contentEditable="true">this is img caption</figcaption>
  </figure>
  <p>sample 2</p>
</div>

با این کار تگ img دیگه نه درگ میشه و نه جابجا میشه که برای اینکه کاربر بتونه تصاویر رو جابجا کنه باید با جاوا اسکریپت کاری کنیم که تگ figure قابلیت درگ رو داشته باشه و کاربر بتونه جابجاش کنه
یه روش ساده برای ساخت ادیتور WYSIWYG اینه که شما ظاهر رو پیاده کنید و دکمه ها رو قرار بدید و در نهایت توسط دستور زیر سایر کار رو بسپارید دست جاوا اسکریپت

document.execCommand('bold', false, null);

این دستور خودش به متن انتخابی تگ و استایل های مورد نظر رو میده، حالا جای bold شما باید مقادر دیگه رو هم قرار بدید که لیست کامل کامند هایی که دریافت میکنه توی این لینک هست، ولی خوب ادیتور های پیشرفته این کار رو انجام نمیدند و بلکه خودشون به صورت پویا تگ و استایل های لازم رو به متن اعمال میکنند.
برای ادیتور های markdown هم شما میتونید قالب های markdown رو کدنویسی کنید و درنهایت برای تبدیل کردن به کدهای HTML از انجین های آماده استفاده کنید و دردسر خودتونو کم کنید، کاری که اکثر ادیتور های markdown هم انجام میدن


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام