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

دوستی برای یک پروژه ی تحقیقاتی روی قرآن، می خواست سوره های قرآن را به ترتیب حروف الفبا (بر اساس حروف آیات اولیه ی هر سوره) مرتب کند. از من کمک خواست و من به این ترتیب به او کمک کردم:

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- تغابن