আমি 'getSelection'.anchorNode.parentNode- এর শ্রেণি বিজি-রেড রয়েছে কিনা তা সনাক্ত করার চেষ্টা করেছি এবং এটি প্রতিস্থাপন করেছি, তবে খুব বেশি পার্শ্ব প্রতিক্রিয়া উপস্থিত রয়েছে।
সুতরাং, রিজেক্সের সাথে সমাধান ...
(* 1) - আপনি বিষয়বস্তু সম্পাদনাযোগ্য উপাদানটির কোডটি পরীক্ষা করে দেখলে এর কাঠামোটি দেখতে পাবেন: প্রতিটি নতুন লাইন একটি আলাদা ডিভ is \nমাল্টি-লাইন নির্বাচনের অনুমতি দেওয়ার জন্য আপনাকে অবশ্যই প্রতিটি নতুন-লাইন প্রতীককে "লাইন ব্রেকিং" এইচটিএমএল দিয়ে প্রতিস্থাপন করতে হবে ।
(* 2) - ব্রাউজার এটি HTML এর নিজস্ব সংশোধন সন্নিবেশ করায় এবং সঠিক প্রতিস্থাপন প্রতিরোধ করে। আমাকে কোনও নন- এইচটিএমএল স্ট্রিং forcedোকাতে বাধ্য করা হয়েছিল, যা পাঠ্যে প্রদর্শিত না হওয়ার সম্ভাবনা নেই। এবং সমস্ত প্রতিস্থাপনের পরে - বৈধ এইচটিএমএল .োকান।
(* 3) - আমি এখানে নিয়মিত সমস্ত এক্সপ্রেশন বিশ্লেষণ করার পরামর্শ দিচ্ছি → https://regex101.com/r/j88wc0/1 মূল ধারণাটি <span class="bg-red"> anything instead of closing span <span class="bg-red">বা এর সমস্ত ডাবল উপস্থিতি প্রতিস্থাপন করা </span> anything instead of starting span tag </span>।
দ্রষ্টব্য, প্রতিটি বার আপনি বোতামটি চাপলে এই কোডটি সমস্ত অভ্যন্তরীণ এইচটিএমএলকে রিফ্রেশ করে। এটি কয়েক হাজার লাইনের পাঠ্য সহকারে কাজ করবে না)
let button = document.getElementById("button");
let block = document.getElementById("block");
button.addEventListener('click', function(){
let s = window.getSelection();
let str = s.toString().replace(/\n/g,'</span></div><div><span class="bg-red">'); // (*1)
document.execCommand("insertHTML", false, `bubufication`); // (*2)
block.innerHTML = block.innerHTML
.replace(/bubufication/, `<span class="bg-red">${str}</span>`)
.replace(/<span class="bg-red">(.*?)<\/span><span class="bg-red">/g,'$1<span class="bg-red">')
.replace(/<span class="bg-red">(((?!<\/span>).)*?<span class="bg-red">)/g,"$1")
.replace(/(<\/span>((?!<span class="bg-red">).)*)<\/span>/g,"$1"); // (*3)
});
.bg-red {
background-color: red;
}
<div id="block" contenteditable="true">
<div>this is testing this is testing this is testing</div>
<div>this is testing this is testing this is testing</div>
</div>
<button id="button">mark</button>