چطور سوره‌های قرآن را به ترتیب حروف الفبای متن آنها مرتب کردم؟

دوستی برای یک پروژه ی تحقیقاتی روی قرآن، می خواست سوره های قرآن را به ترتیب حروف الفبا (بر اساس حروف آیات اولیه ی هر سوره) مرتب کند. از من کمک خواست و من به این ترتیب به او کمک کردم:1- ابتدا کل آیه های قرآن را در قالب یک فایل تکست از پروژه ی تنزیل دانلود کردم. در فایل دانلودشده (با حجم 1.3 مگابایت شامل 6267 خط) هر آیه در یک خط آمده است. در ابتدای خط شماره ی سوره و سپس شماره ی آیه نیز نوشته شده است. مانند:1|1|بِسْمِ اللَّهِ الرَّحْمَـٰنِ الرَّحِيمِ 1|2|الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ2- همه ی آیه ها را به یک فایل اکسل منتقل کردم. طبیعتن در ابتدای انتقال، کل موارد در یک ستون می آید. اما اگر از منوی Data گزینه ی Text to Columns را انتخاب کنیم، سپس گزینه ی Delimited را انتخاب کنیم و در مرحله ی بعد«|» را به عنوان Delimiter معرفی کنیم، می توانیم سه ستون «شماره سوره»، «شماره آیه» و «متن آیه» داشته باشیم.انتخاب «|» به عنوان جداکننده ی ستون هانتیجه ی جداشده ی ستون ها3- حالا بهتر است، داده های خود در اکسل را به حالت «جدول» (Format as Table) دربیاوریم (با انتخاب کل داده ها و انتخاب این گزینه از منوی Home). این جوری فیلترکردن و افزودن ستون های بعدی به آن راحت تر می شود.4- ما برای مرتب کردن به ترتیب حروف الفبا، فقط به آیه های اول نیاز داریم. پس ستون «شماره آیه» را Filter می کنیم و روی 1 قرار می دهیم. مشکل این جاست که آیات اولیه ی چندین سوره یکسان هستند. مثلن شش سوره با «الم» شروع می شوند (بقره، آل عمران، عنکبوت، روم، لقمان، سجده). پس لازم است که آیات دوم سوره ها را هم در تحلیل بیاوریم. برای این کار در ستون کنار «آیه»، یک ستون به نام «آیه بعدی» اضافه می کنیم و فرمول آن را جوری تنظیم می کنیم که آیه ی بعدی (ردیف بعدی) را بخواند. مثلن اگر آیه در خانه ی D2 است، در این ستون می نویسیم:=D3اگر در مرحله ی قبل فرمت داده ها را به شکل جدول درآورده باشیم، در این مرحله برای همه ی سوره ها در این ستون، آیه ی دوم را خواهیم داشت.5- باز هم یک مشکل داریم! در بعضی از سوره ها، دو آیه ی اول مشابه هستند (مانند زخرف و دخان که دو آیه ی اول هر دوی آنها این است: «بِسْمِ اللَّهِ الرَّحْمَـٰنِ الرَّحِيمِ حم وَالْكِتَابِ الْمُبِينِ» یا جاثیه و احقاف که دو آیه ی اول هر دوی آنها این است: «بِسْمِ اللَّهِ الرَّحْمَـٰنِ الرَّحِيمِ حم تَنزِيلُ الْكِتَابِ مِنَ اللَّهِ الْعَزِيزِ الْحَكِيمِ»). پس به آیه ی سوم هم نیاز داریم. از همان فرمول مرحله ی قبلی استفاده می کنیم با این تفاوت که دو خانه ی بعد را می خوانیم. مثلن اگر آیه در خانه ی D2 است در فرمول خانه ی D4 را می خوانیم.6- در ستون بعدی سه آیه را ترکیب می کنیم تا بتوانیم بر اساس آن ردیف ها را مرتب کنیم:=CONCATENATE(D2,&quot &quot,E2,&quot &quot,F2)7- چون مرتب سازی قرار بود بدون در نظر گرفتن «بسم الله الرحمن الرحیم» اول سوره ها باشد، یک ستون دیگر هم مانند ستون قبلی اضافه می کنیم که در آن این عبارت حذف شده است.8- کار تقریبن تمام است و می توانیم مرتب سازی سوره ها را بر اساس همین ستون آخر انجام دهیم. من فهرستی از سوره های قرآن را از «ویکی شیعه» گرفتم و در یک شیت دیگر اکسل قرار دادم. ستون آخری را که به دست آمده بود هم در این شیت قرار دادم. اما چون علائم «مصوت ها» (مانند فتحه، کسره و ضمه) قرار نیست در مرتب سازی بیایند، این علائم را حذف کردم (با Replace کردن این موارد با هیچ چیز).9- اگر قرار بود فقط عنوان سوره ها به ترتیب حروف الفبای متن آنها بیاید، کار در همین مرحله به پایان می رسید اما چون قرار بود خود متن قرآن هم بر همین اساس مرتب شود، یک پروژه ی کوچک لاراولی نوشتم که در آن بتوانیم چاپ متن را هم انجام دهم. برای این که سرعت مرتب سازی در این پروژه بالا برود، در اکسل، ستون آیه های اول را مرتب کردم و یک ستون به این جدول اضافه کردم که ترتیب سوره ها را به ترتیب حروف الفبا نشان می داد (alphabetical_id و alphabetical_without_bism_id). به این ترتیب، در طول چاپ متن سوره ها، چاپ بر اساس همین اعداد کافی است و نیاز نیست سه آیه‌ی اول مجدد بررسی شده و بر اساس حروف الفبا مرتب شوند.10- در پروژه ی لاراولی دو جدول ayahs و chapters ساختم که migration آنها به شکل زیر بود (همان موارد اکسل را به جداول دیتابیس منتقل کردم):Schema::create('ayahs', function (Blueprint $table) { $table->id(); $table->foreignId('chapter_id')->constrained()->onDelete('cascade'); $table->integer('ayah_in_chapter'); $table->text('text'); });Schema::create('chapters', function (Blueprint $table) { $table->id(); $table->string('title'); $table->integer('alphabetical_id'); $table->integer('alphabetical_without_bism_id'); $table->integer('wahy_id'); $table->string('wahy_location'); $table->integer('ayahs_count'); $table->text('first_three_ayahs'); $table->text('first_three_ayahs_without_bism'); });11- برای این که کار سریع پیش برود، یک route ساده ساختم که در آن صفحه ی اصلی تابع index از کلاس کنترلر «سوره» (Chapter) را می خواند:Route::get('/', [Chaptercontroller::class, 'index']);12- در نهایت در تابع index کنترلر Chapter آیه ها را چاپ کردم. در این جا، ترتیب سوره ها را از جدول «سوره‌ها» خواندم و خود آیه ها را از جدول «آیه ها» (چون می خواهیم آیه ها را با علائم نگارشی و مصوت‌ها داشته باشیم). همچنین شماره ی آیه ها را بین علامت آیه قرار دادم. این علامت‌ها در یونیکد به این شرح هستند: U+FD3E ﴾ و U+FD3F ﴿. همچنین چون در مرحله ی بعدی می خواستم متن به دست آمده را در «ورد» ببرم و فهرست سوره ها را هم داشته باشم، در ابتدای هر سوره، عنوان سوره را با تگ h1 نوشتم که در هنگام انتقال به ورد، این تگ به عنوان Heading1 تشخیص داده شود و ساخت فهرست خودکار آسان شود:public function index() { // order by alphabetical_without_bism_id or alphabetical_id $chapters = Chapter::orderBy('alphabetical_without_bism_id')->get(); foreach ($chapters as $chapter) { $print = &quot<h1>&quot.$chapter->title.&quot</h1>" foreach ($chapter->ayahs as $ayah) { // ayah id is between ﴿ and ﴾. $print .= $ayah->text.&quot ﴿&quot.$ayah->ayah_in_chapter.&quot﴾ " } echo $print . &quot<br>" } }13- در نهایت بعد از انتقال متن به دست آمده به ورد، فهرست سوره ها را ساختم (از تب References بخش Table of Contents) و فونت کل متن را هم «عثمان طه» انتخاب کردم.بخشی از نتیجه ی نهایی کارترتیب نهایی سوره ها به ترتیب حروف الفبای متن آنها (بدون در نظر گرفتن بسم الله ابتدای سوره ها) به این شرح شد:1- نحل2- انشقاق3- انفطار4- تکویر5- نصر6- منافقون7- زلزله8- واقعه9- ماعون10- انبیاء11- قمر12- علق13- حاقه14- کهف15- انعام16- سبا17- فاتحه18- فاطر19- محمد20- یونس21- یوسف22- حِجر23- هود24- ابراهیم25- الرحمن26- قارعه27- عنکبوت28- ال عمران29- فیل30- لقمان31- سجدة32- بقره33- روم34- شرح35- رعد36- اعراف37- تکاثر38- نوح39- کوثر40- قدر41- فتح42- توبه (برائت)43- مُلک44- فرقان45- مسد46- زمر47- جاثیه48- احقاف49- غافر50- فصّلت51- شوری52- دخان53- زخرف54- معارج55- اعلی56- حدید57- حشر58- صف59- اسراء60- نور61- ص62- نمل63- قصص64- شعراء65- طه66- عبس67- نبا68- ق69- مؤمنون70- مجادله71- فلق72- ناس73- جن74- اخلاص75- کافرون76- مریم77- بلد78- قیامه79- قریش80- بینه81- قلم82- غاشیه83- انسان84- تین85- ذاریات86- بروج87- طارق88- شمس89- صافات90- ضحی91- طور92- عادیات93- عصر94- فجر95- لیل96- مرسلات97- نازعات98- نجم99- همزه100- مطففین101- مائده102- ممتحنه103- حجرات104- مدثر105- مزّمّل106- نساء107- حج108- احزاب109- طلاق110- تحریم111- یس112- انفال113- جمعه114- تغابن